<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.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" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0"><id>tag:blogger.com,1999:blog-6930361</id><updated>2012-05-03T17:14:12.996-04:00</updated><title type="text">Platte daddy</title><subtitle type="html">I'm an agile software developer specializing in Ruby. Read along as I find what works for me.</subtitle><link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml" href="http://daddy.platte.name/feeds/posts/default" /><link rel="alternate" type="text/html" href="http://daddy.platte.name/" /><link rel="next" type="application/atom+xml" href="http://www.blogger.com/feeds/6930361/posts/default?start-index=26&amp;max-results=25" /><author><name>Ryan Platte</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><generator version="7.00" uri="http://www.blogger.com">Blogger</generator><openSearch:totalResults>65</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/PlatteDaddy" /><feedburner:info uri="plattedaddy" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><entry><id>tag:blogger.com,1999:blog-6930361.post-4648396675320655785</id><published>2011-12-07T11:15:00.000-05:00</published><updated>2011-12-07T11:24:11.544-05:00</updated><title type="text">Removing hard-coded cookies from ExpressionEngine</title><content type="html">A client is using ExpressionEngine 2 as just a CMS and not using its membership features, and we're doing everything we can to improve performance, both back-end and front-end.&lt;br /&gt;&lt;br /&gt;On the front-end side, the cookie setting takes up some of the precious bytes that get transferred before the browser can start downloading assets.&lt;br /&gt;&lt;br /&gt;I have turned off everything I can turn off that adds cookies to ExpressionEngine's output, but there were still two cookies hard-coded into the output even for logged-off users: &lt;code&gt;exp_tracker&lt;/code&gt; and &lt;code&gt;exp_last_activity&lt;/code&gt;.&lt;br /&gt;&lt;br /&gt;The code that does this is in &lt;code&gt;expressionengine/libraries/Session.php&lt;/code&gt;:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;code&gt;$this-&amp;gt;EE-&amp;gt;functions-&amp;gt;set_cookie('tracker', serialize($tracker), '0'); &lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;$this-&amp;gt;EE-&amp;gt;functions-&amp;gt;set_cookie('last_activity', $this-&amp;gt;EE-&amp;gt;localize-&amp;gt;now, $expire);&lt;/code&gt;&lt;/li&gt;&lt;/ul&gt;This was a bit tricky to find, and I didn't see answers on Google, so there it is for posterity.&lt;br /&gt;&lt;br /&gt;Note that EllisLab staff says making this change&amp;nbsp;&lt;a href="http://expressionengine.com/archived_forums/viewthread/146760/#719168"&gt;"can affect your ability to upgrade, and your ability to receive support."&lt;/a&gt;&amp;nbsp;They also point out that&amp;nbsp;you would need to re-apply such changes after an upgrade.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6930361-4648396675320655785?l=daddy.platte.name' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/PlatteDaddy/~4/KWkKWOyGZjo" height="1" width="1"/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6930361/posts/default/4648396675320655785" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6930361/posts/default/4648396675320655785" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/PlatteDaddy/~3/KWkKWOyGZjo/removing-hard-coded-cookies-from.html" title="Removing hard-coded cookies from ExpressionEngine" /><author><name>Ryan Platte</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><feedburner:origLink>http://daddy.platte.name/2011/12/removing-hard-coded-cookies-from.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-6930361.post-2166048798533920676</id><published>2011-10-05T09:51:00.001-04:00</published><updated>2011-10-05T09:51:30.503-04:00</updated><title type="text">Web performance</title><content type="html">Several of my clients have asked me to do performance tuning for their websites. I find it fascinating work, and rewarding to deliver improvements that help machines serve humans rather than the other way around.&lt;br /&gt;&lt;br /&gt;I'll try to post nuggets of value as I come across them, regardless of whether they seem basic or advanced to me.&lt;br /&gt;&lt;br /&gt;A great one to start with this first day is &lt;a href="http://www.webpagetest.org/"&gt;WebPagetest&lt;/a&gt;. It loads a page with an empty cache, then a filled cache in one of many browsers and produces amazingly detailed reports.&lt;br /&gt;&lt;br /&gt;I have been doing a lot of tuning on one of my clients' sites, but mostly through my own Mac Chrome on a pretty fast connection. I had WebPagetest run the site on IE8 on a slower connection and got quite an education.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6930361-2166048798533920676?l=daddy.platte.name' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/PlatteDaddy/~4/rQtFsawBZ7U" height="1" width="1"/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6930361/posts/default/2166048798533920676" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6930361/posts/default/2166048798533920676" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/PlatteDaddy/~3/rQtFsawBZ7U/web-performance.html" title="Web performance" /><author><name>Ryan Platte</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><feedburner:origLink>http://daddy.platte.name/2011/10/web-performance.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-6930361.post-3520074348200839413</id><published>2010-04-12T08:56:00.002-04:00</published><updated>2010-04-12T08:58:50.519-04:00</updated><title type="text">OO programming in JavaScript, neatly summarized</title><content type="html">&lt;a href="http://www.crockford.com/javascript/private.html"&gt;This article from Douglas Crockford&lt;/a&gt; outlines the basics and feel of programming with objects in JavaScript very succinctly.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6930361-3520074348200839413?l=daddy.platte.name' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/PlatteDaddy/~4/5grkgoOLWnY" height="1" width="1"/&gt;</content><link rel="related" href="http://www.crockford.com/javascript/private.html" title="OO programming in JavaScript, neatly summarized" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6930361/posts/default/3520074348200839413" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6930361/posts/default/3520074348200839413" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/PlatteDaddy/~3/5grkgoOLWnY/oo-programming-in-javascript-neatly.html" title="OO programming in JavaScript, neatly summarized" /><author><name>Ryan Platte</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><feedburner:origLink>http://daddy.platte.name/2010/04/oo-programming-in-javascript-neatly.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-6930361.post-7735143317662711488</id><published>2010-04-07T10:13:00.002-04:00</published><updated>2010-04-07T10:20:31.182-04:00</updated><title type="text">On Documents vs. Streams, by Bryce Harrington</title><content type="html">&lt;div&gt;&lt;i&gt;This article was written by &lt;a href="http://www2.bryceharrington.org:8080/"&gt;Bryce Harrington&lt;/a&gt;, and gave me a fresh perspective on interfaces when it was &lt;a href="http://www2.bryceharrington.org:8080/drupal/node/55"&gt;published&lt;/a&gt; and &lt;a href="http://www.infoq.com/news/2008/07/stream-oriented-ui"&gt;discussed on InfoQ&lt;/a&gt;. It's currently available only through Google's cache, so I'm republishing it here to preserve it.&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The other day I was trying to figure out what was making my desktop computer run so slow. This was pretty unusual on Linux. Way back when I used to use Windows, I'd encounter such things due to running too many programs, so of course I looked at what was running.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;But these days I don't really run that many intensive applications. I hardly ever use spreadsheets, presentation tools, word processors, or so on like I used to. Really the only things visible in my task bar were Firefox and Terminal. Killing off Firefox made no difference. And even more oddly, rebooting had no effect - within minutes my load average was up in the 20-30's.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Of course, the culprit was that I had a bunch of automatic cron jobs scheduled to occur at the same time. Reordering the timings got the system back on track.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;But this led to an epiphany moment.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;This was my *desktop* machine. The last time I'd seen this cron job I/O blocking madness was on servers. What was I doing with so many cron jobs on a *desktop*??&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I looked at the individual cron jobs, and found that each and every one of them had something to do with my job. Disabling any one of them would reduce my work productivity. I could no longer do without one of these silly cron jobs than I could have done without Microsoft Excel a decade ago.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;And then, as I looked around my desktop at the other things running on it - internet radio, IRC chat, mutt - that I noticed that I hardly ever use traditional "document-centric" applications. Everything running had something to do with dealing with _streams_ of information.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The realization sank in at that point, that our computer UI paradigm really stinks for what we actually use our computers for.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The prevailing UI paradigm today is built around the notion of document authoring. It expects that the main thing you do is create spreadsheets, word documents, presentations, and so on. There is a task bar to remind you of what documents you're editing, there is cross-application cut and paste so you can put pieces of one document into another. You can place documents on your desktop surface itself, so you can organize your work. You can define which applications to use for which types of docs. You can set up a default printer to put your documents to hard copy. You can set up system-wide fonts to use in documents. You can put icons to apps and even documents onto your panel. And on and on.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Occasionally, some of that is actually useful to me. But most of the time, for most of the work I do, it's all irrelevant. To pick one example, I used absolutely none of that in order to write this blog post.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Really, what I mostly do today is stream management. And I suspect this is true for the vast majority of people. I don't deal with writing documents, but with changes to documents. I put comments onto things. I slap patches onto things. I tweak the states of things. Once in a rare while I may author a completely new thingee, but even there I usually end up working with it as a stream of changes that I build up over time (and usually in collaboration with a few other people who stream changes to me).&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Thinking about user interfaces this way, it occurs to me that there are a LOT of different kinds of streams. Streams of emails. Streams of spam to take *out* of my email stream. Streaming radio broadcasts. Streams of bug reports. Streams of software updates to apply. Streams of chatter on IRC. Streams of youtube video URL's from friends and family to check out. Streams of updates to my weather applet. Even my todo list is more like a stream of things coming in and going out, than like a static document I can print and save and be done with.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Each one of those silly cron jobs bogging down my computer were critically important for me, because THEY were the tools I used for helping me stay atop all these streams. They summarized my bug streams in various ways. They filtered my email streams into more organized sub-streams. They flagged tasks (and took care of certain tasks for me). They took care of updating the tools I used day to day.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;It's weird that for all the document tools at my fingertips, it's a stodgy old *server* tool that is helps my productivity the most. I wonder how non-technical people not knowledgeable about crontab and scripting deal with such things?&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;This all got me to a key question... Since the purpose of our desktop UI is to make our work easier and more efficient, then if today's knowledge workers are, like me, more stream-oriented than document-oriented, then doesn't it stand to reason that we ought to re-think our UI design to optimize it for making stream management easier and more efficient? How would such optimization be done? How would such a UI look and feel? What kinds of toolkits would be needed?&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6930361-7735143317662711488?l=daddy.platte.name' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/PlatteDaddy/~4/NiXOeGLAPCI" height="1" width="1"/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6930361/posts/default/7735143317662711488" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6930361/posts/default/7735143317662711488" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/PlatteDaddy/~3/NiXOeGLAPCI/on-documents-vs-streams-by-bryce.html" title="On Documents vs. Streams, by Bryce Harrington" /><author><name>Ryan Platte</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><feedburner:origLink>http://daddy.platte.name/2010/04/on-documents-vs-streams-by-bryce.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-6930361.post-2891956373586664388</id><published>2009-03-31T13:56:00.002-04:00</published><updated>2009-03-31T14:01:18.831-04:00</updated><title type="text">Merlin Mann's How to Succeed in Business</title><content type="html">&lt;p&gt;From John Gruber and Merlin Mann’s talk on &lt;a href="http://ratafia.info/post/90532973/transcript-of-howto-149-surprising-ways-to"&gt;making money by being authentically enthusiastic:&lt;/a&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;ol&gt;&lt;li&gt;Give away more stuff than you think you should, and make it easy for people to get.&lt;/li&gt;&lt;li&gt;Focus on diverse secondary revenue streams, and always have your eyes open for new and replacement ones.&lt;/li&gt;&lt;li&gt;Don’t do stuff that seems profitable, but potentially messes up the reason people like you.&lt;/li&gt;&lt;/ol&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6930361-2891956373586664388?l=daddy.platte.name' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/PlatteDaddy/~4/CO1hKlpNerI" height="1" width="1"/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6930361/posts/default/2891956373586664388" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6930361/posts/default/2891956373586664388" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/PlatteDaddy/~3/CO1hKlpNerI/merlin-manns-how-to-succeed-in-business.html" title="Merlin Mann's How to Succeed in Business" /><author><name>Ryan Platte</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><feedburner:origLink>http://daddy.platte.name/2009/03/merlin-manns-how-to-succeed-in-business.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-6930361.post-7857883726406038184</id><published>2009-03-20T12:15:00.002-04:00</published><updated>2009-03-20T12:18:51.017-04:00</updated><title type="text">should be || should_not be</title><content type="html">Stephen Eley has done something very clever on the rSpec list, it begins thus:&lt;br /&gt;&lt;blockquote&gt;should be || should_not be: that is the expectation:&lt;br /&gt;Whether 'tis nobler in the parser to interpret&lt;br /&gt;The outputs and side effects of outrageous duck typing,&lt;br /&gt;Or to inherit against a sea of matchers&lt;br /&gt;And by declaration extend them?&lt;/blockquote&gt;And on from there, to a satisfying conclusion.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6930361-7857883726406038184?l=daddy.platte.name' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/PlatteDaddy/~4/Gk-a09NdjzA" height="1" width="1"/&gt;</content><link rel="related" href="http://wiki.github.com/dchelimsky/rspec/should-be-should_not-be" title="should be || should_not be" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6930361/posts/default/7857883726406038184" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6930361/posts/default/7857883726406038184" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/PlatteDaddy/~3/Gk-a09NdjzA/should-be-shouldnot-be.html" title="should be || should_not be" /><author><name>Ryan Platte</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><feedburner:origLink>http://daddy.platte.name/2009/03/should-be-shouldnot-be.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-6930361.post-2859711570554810320</id><published>2009-03-20T10:18:00.002-04:00</published><updated>2009-03-20T10:20:55.662-04:00</updated><title type="text">javascript_named_routes</title><content type="html">Fred Polgardy has just released a tasty bit of code that will allow JavaScript to access Rails named routes in a very straightforward way.&lt;br /&gt;&lt;br /&gt;Check out his &lt;a href="http://sustainablecode.blogspot.com/2009/03/more-unobtrusive-javascript-with.html"&gt;javascript_named_routes Rails plugin&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6930361-2859711570554810320?l=daddy.platte.name' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/PlatteDaddy/~4/RHaUuxsu49o" height="1" width="1"/&gt;</content><link rel="related" href="http://sustainablecode.blogspot.com/2009/03/more-unobtrusive-javascript-with.html" title="javascript_named_routes" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6930361/posts/default/2859711570554810320" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6930361/posts/default/2859711570554810320" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/PlatteDaddy/~3/RHaUuxsu49o/javascriptnamedroutes.html" title="javascript_named_routes" /><author><name>Ryan Platte</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><feedburner:origLink>http://daddy.platte.name/2009/03/javascriptnamedroutes.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-6930361.post-8236848953876322735</id><published>2008-12-10T14:05:00.002-05:00</published><updated>2008-12-10T14:08:39.459-05:00</updated><title type="text">How much process, and why?</title><content type="html">The best write-up in my memory of how agile processes fit into projects hackers build.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6930361-8236848953876322735?l=daddy.platte.name' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/PlatteDaddy/~4/LRhzr8DVAgg" height="1" width="1"/&gt;</content><link rel="related" href="http://startuplessonslearned.blogspot.com/2008/12/hackers-lament.html" title="How much process, and why?" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6930361/posts/default/8236848953876322735" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6930361/posts/default/8236848953876322735" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/PlatteDaddy/~3/LRhzr8DVAgg/how-much-process-and-why.html" title="How much process, and why?" /><author><name>Ryan Platte</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><feedburner:origLink>http://daddy.platte.name/2008/12/how-much-process-and-why.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-6930361.post-7163183352661554255</id><published>2008-09-25T11:27:00.002-04:00</published><updated>2008-09-25T11:33:19.710-04:00</updated><title type="text">Don't steal from me, Senator Obama</title><content type="html">&lt;em&gt;I signed a petition asking my legislators not to approve a bailout. I got a response from Senator Obama similar to &lt;a href="http://discuss.americasrevival.com/showpost.php?s=35cae8381c5e4c542f1da5841b71decf&amp;p=15529&amp;postcount=6"&gt;the one quoted elsewhere.&lt;/a&gt;&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;Dear Senator Obama:&lt;br /&gt;&lt;br /&gt;I contacted you earlier writing against the bailout, and received your reply. &lt;br /&gt;&lt;br /&gt;Given your commitment to a bailout, I'm glad you're looking for ways to improve matters. But you are planning to remove thousands of dollars from my pocket, either as taxes or as devaluation of the dollar, to pay for mistakes made by private citizens. &lt;br /&gt;&lt;br /&gt;You do not have my consent to do this. It is stealing from me.&lt;br /&gt;&lt;br /&gt;Merely waving your hands and saying "liquidity" and "worsening downturn" is not enough explanation for why you're planning to take money from me. You owe us better than that.&lt;br /&gt;&lt;br /&gt;Furthermore, you point to a need to rescue the economy. Have you considered the effects of inflation on the economy? Talking about bailing out mortgages without any discussion of the inflation this will create makes it look like you are only interested in protecting the rich. I'm sure you don't want that.&lt;br /&gt;&lt;br /&gt;Another topic that isn't being discussed: is it the right answer to go on creating a socialist regime in the US? Buying up companies and personal loans? This isn't the America I grew up in. It sounds more like China. Are you for or against this approach?&lt;br /&gt;&lt;br /&gt;The closest you came to answering my call to vote against a bailout plan was "I agree that urgent and decisive action is necessary during this time of economic turmoil". Please come back with a better answer for your actions than that.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6930361-7163183352661554255?l=daddy.platte.name' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/PlatteDaddy/~4/x-8j1y_bNr4" height="1" width="1"/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6930361/posts/default/7163183352661554255" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6930361/posts/default/7163183352661554255" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/PlatteDaddy/~3/x-8j1y_bNr4/dont-steal-from-me-senator-obama.html" title="Don't steal from me, Senator Obama" /><author><name>Ryan Platte</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><feedburner:origLink>http://daddy.platte.name/2008/09/dont-steal-from-me-senator-obama.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-6930361.post-3378211621817531960</id><published>2008-09-16T11:40:00.003-04:00</published><updated>2008-09-16T15:27:46.463-04:00</updated><title type="text">Eating well, or, please hold the sugar</title><content type="html">Two members of our family were suffering new tooth-decay problems, and my wife Nicole had been reading about a dentist who researched the profound difference in health between people following traditional diets versus Western diets.&lt;br /&gt;&lt;br /&gt;Nicole decided to take the plunge and learn how to feed us a traditional diet. We have removed refined flour and sugar from our diet, and added lots of whole, organic, delicious vegetables, milk products (unpasteurized, like God&amp;mdash;&lt;a id="eating-well-pasteur-link" href="#eating-well-pasteur"&gt;and Louis Pasteur!&lt;/a&gt;&amp;mdash;intended), honey, and meat. There are lots of changes she's making as she learns, which I'll also share over time, but she's posting interesting articles on her &lt;a href="http://traditionalnutrition.blogspot.com/"&gt;traditional-food blog&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;This is incredible food, and our health is improving dramatically as we restore the levels of nutrition available to our bodies from the red zone to which modern Americans are accustomed, into normal ranges so our bodies have something to work with. Dental health, skin health, energy, mental function, sleep patterns, emotional health, you name it...every one of us is doing well and still improving rapidly.&lt;br /&gt;&lt;br /&gt;I was generously offered some chai at work this morning. I took a few ounces. It was delicious, but I noticed an immediate and all-too-familiar feeling of weakening. I used to regard this as normal, but now I realize that I would feel this whenever I ate or drank anything with refined flour or sugar. As long as I stay clear of sugar and flour, I don't crave it, and this kind of experience is quite the reinforcement of my desire to stay away.&lt;br /&gt;&lt;br /&gt;So my diet is very different now. This may sound inconvenient, and sometimes it is. But don't cry for me&amp;mdash;I'm eating delicious homemade butter, homemade ice cream (sweetened with dehydrated cane juice and/or honey), rich Indian dishes...&lt;br /&gt;&lt;br /&gt;&lt;ol style="font-size: smaller"&gt;&lt;li id="eating-well-pasteur"&gt;&lt;p&gt;Pasteurization was developed for wine. On hearing that pasteurization was to be used on milk, Pasteur is reported to have said, &lt;a href="http://www.realmilk.com/crime-against-raw-milk.html"&gt;"What are they doing to my wonderful food?"&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;a href="#eating-well-pasteur-link"&gt;Back to article&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6930361-3378211621817531960?l=daddy.platte.name' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/PlatteDaddy/~4/ROhGF6NSnFk" height="1" width="1"/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6930361/posts/default/3378211621817531960" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6930361/posts/default/3378211621817531960" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/PlatteDaddy/~3/ROhGF6NSnFk/eating-well-or-please-hold-sugar.html" title="Eating well, or, please hold the sugar" /><author><name>Ryan Platte</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><feedburner:origLink>http://daddy.platte.name/2008/09/eating-well-or-please-hold-sugar.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-6930361.post-2837189024356806558</id><published>2008-09-15T19:22:00.005-04:00</published><updated>2008-09-15T19:35:26.134-04:00</updated><title type="text">Images: thrashing vs. process</title><content type="html">Steve McConnell illustrated an &lt;a href="http://www.stevemcconnell.com/articles/art09.htm"&gt;article about software process&lt;/a&gt; with these images. I'm interested in this effort&amp;mdash;what is a success, and what could be improved?&lt;br /&gt;&lt;br /&gt;&lt;div style="margin: 2em; padding: 2em; background-color: #CDB;"&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.stevemcconnell.com/articles/art09.htm"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 400px;" src="http://www.stevemcconnell.com/articles/art09-3.gif" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.stevemcconnell.com/articles/art09.htm"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 400px;" src="http://www.stevemcconnell.com/articles/art09-2.gif" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.stevemcconnell.com/articles/art09.htm"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 400px;" src="http://www.stevemcconnell.com/articles/art09-6.gif" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.stevemcconnell.com/articles/art09.htm"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 400px;" src="http://www.stevemcconnell.com/articles/art09-1.gif" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&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/6930361-2837189024356806558?l=daddy.platte.name' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/PlatteDaddy/~4/y48bs-IEW-I" height="1" width="1"/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6930361/posts/default/2837189024356806558" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6930361/posts/default/2837189024356806558" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/PlatteDaddy/~3/y48bs-IEW-I/images-thrashing-vs-process.html" title="Images: thrashing vs. process" /><author><name>Ryan Platte</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><feedburner:origLink>http://daddy.platte.name/2008/09/images-thrashing-vs-process.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-6930361.post-6747481978770206948</id><published>2008-09-15T09:14:00.002-04:00</published><updated>2008-09-15T09:23:13.346-04:00</updated><title type="text">How much to spend on security</title><content type="html">&lt;p&gt;I love it when someone can give me a sound way to quantify wiggly and abstract things. Bruce Schneier wrote this about &lt;a href="http://www.csoonline.com/article/446866/Security_ROI_Fact_or_Fiction_"&gt;Security ROI&lt;/a&gt;:&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&amp;hellip;a company should implement only security countermeasures that affect its bottom line positively. It shouldn't spend more on a security problem than the problem is worth. Conversely, it shouldn't ignore problems that are costing it money when there are cheaper mitigation alternatives. A smart company needs to approach security as it would any other business decision: costs versus benefits.&lt;/p&gt;&lt;p&gt;The classic methodology is called annualized loss expectancy (ALE), and it's straightforward. Calculate the cost of a security incident in both tangibles like time and money, and intangibles like reputation and competitive advantage. Multiply that by the chance the incident will occur in a year. That tells you how much you should spend to mitigate the risk. So, for example, &lt;strong&gt;if your store has a 10 percent chance of getting robbed and the cost of being robbed is $10,000, then you should spend $1,000 a year on security.&lt;/strong&gt; Spend more than that, and you're wasting money. Spend less than that, and you're also wasting money.&lt;/p&gt;&lt;p&gt;Of course, that $1,000 has to reduce the chance of being robbed to zero in order to be cost-effective. &lt;strong&gt;If a security measure cuts the chance of robbery by 40 percent -- to 6 percent a year -- then you should spend no more than $400 on it.&lt;/strong&gt; If another security measure reduces it by 80 percent, it's worth $800. And if two security measures both reduce the chance of being robbed by 50 percent and one costs $300 and the other $700, the first one is worth it and the second isn't.&lt;/p&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6930361-6747481978770206948?l=daddy.platte.name' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/PlatteDaddy/~4/WG4q1M79BZM" height="1" width="1"/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6930361/posts/default/6747481978770206948" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6930361/posts/default/6747481978770206948" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/PlatteDaddy/~3/WG4q1M79BZM/how-much-to-spend-on-security.html" title="How much to spend on security" /><author><name>Ryan Platte</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><feedburner:origLink>http://daddy.platte.name/2008/09/how-much-to-spend-on-security.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-6930361.post-7677341637228527233</id><published>2008-09-04T20:12:00.002-04:00</published><updated>2008-09-04T20:21:42.326-04:00</updated><title type="text">Taking back my corner of the web</title><content type="html">I've decided to abandon the idea of focusing this blog on a narrow set of topics. I have very wide-ranging interests and strengths, and I don't think anybody's benefiting from the slow trickle of weak ideas that's left when I restrict this blog to agile + Ruby. I may even wind up posting more frequently on those topics.&lt;br /&gt;&lt;br /&gt;You may like this, you might not, but I wanted to give any subscribers fair warning.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6930361-7677341637228527233?l=daddy.platte.name' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/PlatteDaddy/~4/AcdHPb7TWbA" height="1" width="1"/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6930361/posts/default/7677341637228527233" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6930361/posts/default/7677341637228527233" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/PlatteDaddy/~3/AcdHPb7TWbA/taking-back-my-corner-of-web.html" title="Taking back my corner of the web" /><author><name>Ryan Platte</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><feedburner:origLink>http://daddy.platte.name/2008/09/taking-back-my-corner-of-web.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-6930361.post-6052183910757314748</id><published>2008-01-20T22:42:00.000-05:00</published><updated>2008-01-20T22:44:41.232-05:00</updated><title type="text">Quick letter about electronic voting</title><content type="html">&lt;p&gt;Electronic voting has been thoroughly shown to be unreliable and manipulatable. As a professional software developer, I can attest to the difficulty of creating systems that cannot be tampered with. I can also add that many reports I have read of defects in voting machines have suggested a lack of competence in a task that would be difficult for the very best developers.&lt;/p&gt;&lt;p&gt;On the other hand, voting techniques that leave a paper trail give us a backup plan when machines fail us. It is long past time to add laws that encourage and aid officials in implementing paper trails for our elections. Inaction makes our elections look illegitimate, even if there is indeed no manipulation at all.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6930361-6052183910757314748?l=daddy.platte.name' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/PlatteDaddy/~4/s2nVhGT2Smw" height="1" width="1"/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6930361/posts/default/6052183910757314748" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6930361/posts/default/6052183910757314748" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/PlatteDaddy/~3/s2nVhGT2Smw/quick-letter-about-electronic-voting.html" title="Quick letter about electronic voting" /><author><name>Ryan Platte</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><feedburner:origLink>http://daddy.platte.name/2008/01/quick-letter-about-electronic-voting.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-6930361.post-3379577439748617248</id><published>2008-01-17T15:19:00.000-05:00</published><updated>2008-01-17T15:19:37.095-05:00</updated><title type="text">Managing to capacity</title><content type="html">&lt;a href="http://jchyip.blogspot.com/2007/11/two-main-topics-to-learn-in-agilelean.html"&gt;Jason Yip&lt;/a&gt; says managing to capacity is a prerequisite to other work on process:&lt;blockquote&gt;&lt;p&gt;When going down the path of Agile/Lean, there are two main topics:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;Learning to manage to capacity&lt;/li&gt;&lt;li&gt;Learning how to improve process capability&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;If you can't accept the first point, the second point won't make any difference.... in fact, because of overburdening, you'll make the second point harder.&lt;/p&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6930361-3379577439748617248?l=daddy.platte.name' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/PlatteDaddy/~4/jh2_HAgdpB4" height="1" width="1"/&gt;</content><link rel="related" href="http://jchyip.blogspot.com/2007/11/two-main-topics-to-learn-in-agilelean.html" title="Managing to capacity" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6930361/posts/default/3379577439748617248" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6930361/posts/default/3379577439748617248" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/PlatteDaddy/~3/jh2_HAgdpB4/managing-to-capacity.html" title="Managing to capacity" /><author><name>Ryan Platte</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><feedburner:origLink>http://daddy.platte.name/2008/01/managing-to-capacity.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-6930361.post-8139957807100086386</id><published>2008-01-16T16:05:00.000-05:00</published><updated>2008-01-16T16:06:43.481-05:00</updated><title type="text">assert_efficient_sql</title><content type="html">&lt;p&gt;The ever-brilliant Phlip Plumlee with a way to lint SQL "pessimizations":&lt;/p&gt;&lt;p&gt;&lt;a href="http://www.oreillynet.com/ruby/blog/2008/01/assert_efficient_sql.html"&gt;assert_efficient_sql - O'Reilly Ruby&lt;/a&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;To ensure your test cases call efficient MySQL…&lt;/p&gt;&lt;p&gt;&lt;code&gt;&lt;pre&gt;def test_my_case&lt;br /&gt; assert_efficient_sql do&lt;br /&gt;&lt;br /&gt;   # just wrap them in this block!&lt;br /&gt;&lt;br /&gt; end&lt;br /&gt;end&lt;/pre&gt;&lt;/code&gt;&lt;/p&gt;&lt;p&gt;The assertion intercepts and copies out your MySQL SELECT statements, then calls EXPLAIN on each one, and inspects the results for common problems.&lt;/p&gt;&lt;p&gt;The goal is test cases that resist database pessimization, even as you change your data relations, to add new features. If you run your tests after every few changes, you can easily detect which change broke your database’s indices and relations.&lt;/p&gt;&lt;p&gt;This article is a reference for this assertion’s options.&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;Phlip is soliciting help with implementing this feature across more database engines.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6930361-8139957807100086386?l=daddy.platte.name' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/PlatteDaddy/~4/A585DhoLQiA" height="1" width="1"/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6930361/posts/default/8139957807100086386" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6930361/posts/default/8139957807100086386" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/PlatteDaddy/~3/A585DhoLQiA/assertefficientsql.html" title="assert_efficient_sql" /><author><name>Ryan Platte</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><feedburner:origLink>http://daddy.platte.name/2008/01/assertefficientsql.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-6930361.post-3372053874207399422</id><published>2008-01-10T01:26:00.000-05:00</published><updated>2008-01-10T10:23:06.719-05:00</updated><title type="text">Four busted laptops, one measly task</title><content type="html">Good friends of ours from out of state are staying with us tonight. They're fellow geeks, and he's a fellow developer.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Our task: copy 1.5 MB from a CD to his wife's MacBook.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Our challenge: his wife's MacBook does not currently read optical disks.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Tools available to solve the problem: a PC laptop with a failing hard drive, my work MacBook Pro that also has issues with optical disks, our family iBook that works but has no screen backlighting at present, and the destination MacBook, which, again, isn't reading optical disks.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Solution: I fortunately had SSH enabled on the iBook before its backlight went out. I logged into that, and inserted the CD into the iBook. Checking in /Volumes, I found that the CD wouldn't mount until I logged in to the GUI. I'm sure there are dozens of ways I could have done that from the command line, but it went along with the silly mood of the whole thing, so I went ahead and logged in blind.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Sure enough, during the GUI login process the CD appears in /Volumes. We make a tar file and my friend copies it down.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Easy peasy.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;PS: Oh, and the eject key on the iBook didn't cause ejection. Turns out a quick &lt;code&gt;drutil eject&lt;/code&gt; does fine.&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/6930361-3372053874207399422?l=daddy.platte.name' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/PlatteDaddy/~4/1y7FiUX-knY" height="1" width="1"/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6930361/posts/default/3372053874207399422" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6930361/posts/default/3372053874207399422" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/PlatteDaddy/~3/1y7FiUX-knY/four-busted-laptops-one-measly-task.html" title="Four busted laptops, one measly task" /><author><name>Ryan Platte</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><feedburner:origLink>http://daddy.platte.name/2008/01/four-busted-laptops-one-measly-task.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-6930361.post-3004494442611781253</id><published>2008-01-04T11:20:00.000-05:00</published><updated>2008-01-04T12:01:41.207-05:00</updated><title type="text">Track down warnings in Ruby test runs</title><content type="html">Got warning or other spew in your Ruby test runs? To track down the source you can have a &lt;code&gt;setup&lt;/code&gt; method output the test name:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;p name&lt;code&gt;&lt;/code&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;This makes it very easy to track down the source of the unwanted output.&lt;br /&gt;&lt;br /&gt;This works because each test run is its own instance of your TestCase subclass.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6930361-3004494442611781253?l=daddy.platte.name' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/PlatteDaddy/~4/uxCP-Udnoeg" height="1" width="1"/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6930361/posts/default/3004494442611781253" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6930361/posts/default/3004494442611781253" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/PlatteDaddy/~3/uxCP-Udnoeg/track-down-warnings-in-ruby-test-runs.html" title="Track down warnings in Ruby test runs" /><author><name>Ryan Platte</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><feedburner:origLink>http://daddy.platte.name/2008/01/track-down-warnings-in-ruby-test-runs.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-6930361.post-1249192457585373058</id><published>2007-12-03T10:11:00.000-05:00</published><updated>2007-12-03T12:00:11.386-05:00</updated><title type="text">Daniel J. Bernstein advocates for Ruby?</title><content type="html">It's not your typical advocacy piece for Ruby (in fact it's not about Ruby at all), but Daniel J. Bernstein has written a paper reflecting on the success of his qmail mail server, which has a security guarantee (in the form of a $500 bounty) that has gone unclaimed since March 1997, and which runs several prominent mail houses.&lt;br /&gt;&lt;br /&gt;He notes several aspects of his development process and architectural decisions that contributed to qmail's success. Interestingly, many of his comments relate to his use of concepts in his C code that are usually associated with higher-level languages. Here he complains about C's dangerous handling of integers:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;p&gt;Another surprise for the programmer is that y can be much smaller than x after y = x + 1. This happens if x is the largest representable integer, typically 2^&lt;super&gt;31&lt;/super&gt; − 1; y will then be the smallest representable integer, typically −2^&lt;super&gt;31&lt;/super&gt;.&lt;/p&gt;&lt;p&gt;...&lt;/p&gt;&lt;p&gt;Most programming environments are meta-engineered to make typical software easier to write. They should instead be meta-engineered to make &lt;em&gt;incorrect&lt;/em&gt; software &lt;em&gt;harder&lt;/em&gt; to write. An operation that is not exactly what I normally want should take &lt;em&gt;more&lt;/em&gt; work to express than an operation that is exactly what I normally want.&lt;/p&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Ruby does get many details like this right, and good object-oriented practices can help too. For example, I kept thinking of the &lt;a href="http://www.darrenhobbs.com/archives/2007/04/strong_typing_a.html"&gt;Tiny Types pattern&lt;/a&gt; while reading this.&lt;br /&gt;&lt;br /&gt;I'm reading this a bit at a time and still parsing what Bernstein's ideas mean to me, but the segments on spending some performance dollars to buy quality abstractions were refreshing to see from a developer who's met with measurable success.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6930361-1249192457585373058?l=daddy.platte.name' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/PlatteDaddy/~4/EzH3C_7I6Ec" height="1" width="1"/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6930361/posts/default/1249192457585373058" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6930361/posts/default/1249192457585373058" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/PlatteDaddy/~3/EzH3C_7I6Ec/daniel-j-bernstein-advocates-for-ruby.html" title="Daniel J. Bernstein advocates for Ruby?" /><author><name>Ryan Platte</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><feedburner:origLink>http://daddy.platte.name/2007/12/daniel-j-bernstein-advocates-for-ruby.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-6930361.post-1161236753183470773</id><published>2007-10-25T15:35:00.000-04:00</published><updated>2007-10-25T15:47:17.250-04:00</updated><title type="text">Spying on assert_select</title><content type="html">&lt;p&gt;When testing your views with assert_select, it's nice to get information on what response text failed to match, but it's too much to just throw @response.body into the test failure message:&lt;/p&gt;&lt;p&gt;&lt;code&gt;assert_select('div#whatever-id p.classname', 'small stuff', @response.body)&lt;/code&gt;&lt;/p&gt;&lt;p&gt;Instead you can use nested assert_selects and the elements they yield:&lt;/p&gt;&lt;p&gt;&lt;code&gt;&lt;pre&gt;assert_select('div#whatever-id') do |whateverId|&lt;br /&gt; assert_select('p.classname', 'small stuff', whateverId)&lt;br /&gt;end&lt;/pre&gt;&lt;/code&gt;&lt;/p&gt;&lt;p&gt;That will dump out just div#whatever-id and its contents into your test failure message.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6930361-1161236753183470773?l=daddy.platte.name' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/PlatteDaddy/~4/a5jxkV_lmao" height="1" width="1"/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6930361/posts/default/1161236753183470773" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6930361/posts/default/1161236753183470773" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/PlatteDaddy/~3/a5jxkV_lmao/spying-on-assertselect.html" title="Spying on assert_select" /><author><name>Ryan Platte</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><feedburner:origLink>http://daddy.platte.name/2007/10/spying-on-assertselect.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-6930361.post-846948145729784470</id><published>2007-07-12T16:01:00.000-04:00</published><updated>2007-07-14T13:05:25.213-04:00</updated><title type="text">A solution for developing remotely: Vim's netrw</title><content type="html">&lt;p&gt;I'm doing some work that has to be developed remotely, so I wanted a way to edit locally instead of doing everything in a terminal window. I tried using &lt;a href="http://code.google.com/p/macfuse/"&gt;MacFUSE&lt;/a&gt; and &lt;code&gt;sshfs&lt;/code&gt; to make the remote directory appear on my own desktop, and it worked after I figured out the options I needed, but opening files in &lt;code&gt;gvim&lt;/code&gt; was very slow.&lt;/p&gt;&lt;p&gt;So I took my friend &lt;a href="http://esm.logic.net/"&gt;Ed Marshall&lt;/a&gt;'s advice and tried Vim 7's netrw support. Bingo! It works via &lt;code&gt;scp&lt;/code&gt; (which is (almost?) always available when there's &lt;code&gt;ssh&lt;/code&gt; access) and is dreamy.&lt;/p&gt;&lt;p&gt;To edit a file &lt;code&gt;/path/to/file.rb&lt;/code&gt; owned by a user &lt;code&gt;joe&lt;/code&gt; on a machine &lt;code&gt;example.com&lt;/code&gt;:&lt;/p&gt;&lt;p&gt;&lt;code&gt;vim scp://joe@example.com/path/to/file.rb&lt;/code&gt;&lt;/p&gt;&lt;p&gt;Brief pause while the file gets retrieved, but then it's copied to your &lt;code&gt;/tmp&lt;/code&gt; directory and everything's full speed. The only downside I ran into was that inter-file navigation wasn't as good. To get a file browser for the files in &lt;code&gt;~/path/to&lt;/code&gt;, I could then do:&lt;/p&gt;&lt;p&gt;&lt;code&gt;:sp %:h&lt;/code&gt;&lt;/p&gt;&lt;p&gt;or to edit &lt;code&gt;~/path/other_file.rb&lt;/code&gt; (again from a window opened on &lt;code&gt;~/path/to/file.rb&lt;/code&gt;):&lt;/p&gt;&lt;p&gt;&lt;code&gt;:sp %:h:h/other_file.rb&lt;/code&gt;&lt;/p&gt;&lt;p&gt;&lt;code&gt;:sp&lt;/code&gt; means "split window". &lt;code&gt;%&lt;/code&gt; means "the current file". &lt;code&gt;:h&lt;/code&gt; means "the parent directory of the preceding file path", and can be repeated.&lt;/p&gt;&lt;p&gt;I'd love to hear more about navigating in Vim + netrw—I haven't even gotten my feet wet yet. I just wanted to share the nice experience I had right out of the box.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6930361-846948145729784470?l=daddy.platte.name' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/PlatteDaddy/~4/yHXzuP_H_AE" height="1" width="1"/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6930361/posts/default/846948145729784470" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6930361/posts/default/846948145729784470" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/PlatteDaddy/~3/yHXzuP_H_AE/solution-for-developing-remotely-vims.html" title="A solution for developing remotely: Vim's netrw" /><author><name>Ryan Platte</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><feedburner:origLink>http://daddy.platte.name/2007/07/solution-for-developing-remotely-vims.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-6930361.post-478871235183489498</id><published>2007-07-11T17:55:00.000-04:00</published><updated>2007-07-11T18:03:48.875-04:00</updated><title type="text">Hidden in plain sight: script/runner</title><content type="html">&lt;p&gt;I am loving the opportunity to work with my co-workers in the home office. We have "geek-out" lunches in the office once a week or so, and invariably all learn something.&lt;/p&gt;&lt;p&gt;So today I learned about &lt;code&gt;script/runner&lt;/code&gt;, a file that's in every Rails app that I never looked into for some reason. Turns out I wish I had. It's a replacement for calling the Ruby interpreter that gives your script your app's Rails environment preloaded, so you can just write Ruby code without having to monkey around with loading Rails yourself. Just call something like&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;code&gt;script/runner my_file.rb&lt;/code&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;or&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;code&gt;script/runner "puts 'My Ruby code here'; puts MyModel.count"&lt;/code&gt;.&lt;/p&gt;&lt;p&gt;What are your favorite "hidden-before-your-eyes" features of Rails?&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6930361-478871235183489498?l=daddy.platte.name' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/PlatteDaddy/~4/B6rfBKzb5vU" height="1" width="1"/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6930361/posts/default/478871235183489498" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6930361/posts/default/478871235183489498" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/PlatteDaddy/~3/B6rfBKzb5vU/hidden-in-plain-sight-scriptrunner.html" title="Hidden in plain sight: script/runner" /><author><name>Ryan Platte</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><feedburner:origLink>http://daddy.platte.name/2007/07/hidden-in-plain-sight-scriptrunner.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-6930361.post-1198621951169585204</id><published>2007-07-10T14:08:00.000-04:00</published><updated>2007-07-10T14:20:13.537-04:00</updated><title type="text">Welcome Dave Astels!</title><content type="html">&lt;p&gt;I'm excited to &lt;a href="http://daveastels.com/2007/07/10/obtiva/"&gt;welcome Dave Astels&lt;/a&gt; to the Obtiva team. Dave is a very active member of the Agile community and has shared some ideas over the years that I have found very valuable for better understanding TDD. It's an honor to have him working with us.&lt;/p&gt;&lt;p&gt;Obtiva is shaping up to be quite a strong software house with a promising future.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6930361-1198621951169585204?l=daddy.platte.name' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/PlatteDaddy/~4/3Ju05beUk2Y" height="1" width="1"/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6930361/posts/default/1198621951169585204" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6930361/posts/default/1198621951169585204" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/PlatteDaddy/~3/3Ju05beUk2Y/welcome-dave-astels.html" title="Welcome Dave Astels!" /><author><name>Ryan Platte</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><feedburner:origLink>http://daddy.platte.name/2007/07/welcome-dave-astels.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-6930361.post-8376724558307740230</id><published>2007-06-25T07:38:00.000-04:00</published><updated>2007-06-25T07:43:01.177-04:00</updated><title type="text">Land rush</title><content type="html">&lt;p&gt;I have a workplace running gag with a friend at a client wherein when we encounter a Rails misfeature (especially the ones that have been solved carefully and elegantly in Java or elsewhere), we rip on Rails mercilessly to make ourselves feel better. My friend came up with this one almost unprovoked, I thought it eminently bloggable:&lt;/p&gt;&lt;blockquote&gt;"It's like the land rush.  We are all so excited about the free land that we forgot about all the bears and Indians waiting to kill us."&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6930361-8376724558307740230?l=daddy.platte.name' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/PlatteDaddy/~4/j8MbMX1Z1Do" height="1" width="1"/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6930361/posts/default/8376724558307740230" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6930361/posts/default/8376724558307740230" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/PlatteDaddy/~3/j8MbMX1Z1Do/land-rush.html" title="Land rush" /><author><name>Ryan Platte</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><feedburner:origLink>http://daddy.platte.name/2007/06/land-rush.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-6930361.post-8140748610805108491</id><published>2007-06-18T17:31:00.000-04:00</published><updated>2007-06-18T17:46:32.944-04:00</updated><title type="text">How to stub out Rails helper methods with Mocha?</title><content type="html">&lt;p&gt;&lt;em&gt;&lt;strong&gt;UPDATE&lt;/strong&gt; The code given doesn't actually work. I'd love to hear if anyone knows of code that will do this. I hacked around the problem a very ugly way.&lt;/em&gt;&lt;/p&gt;&lt;p&gt;Rails helper methods are defined in modules and mixed into objects...of what class? Turns out it's anonymous copies of ActionView::Base. How does one mock or stub methods on such a beast? Here's a solution I found:&lt;/p&gt;&lt;p&gt;&lt;code&gt;&lt;pre&gt;&lt;br /&gt;class MyController&lt;br /&gt;  def rescue_action(e) raise e end&lt;br /&gt;  attr_reader :template&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;class MyControllerTest &lt; Test::Unit::TestCase&lt;br /&gt;  def setup&lt;br /&gt;    @controller = ...&lt;br /&gt;  end&lt;br /&gt;&lt;br /&gt;  def test_should_stub_helper_method&lt;br /&gt;    @controller.template.expects(:random_helper_method).returns('')&lt;br /&gt;    ...&lt;br /&gt;  end&lt;br /&gt;end&lt;br /&gt;&lt;/pre&gt;&lt;/code&gt;&lt;/p&gt;&lt;p&gt;Thanks to &lt;a href="http://www.theagiledeveloper.com/articles/2007/05/02/rspec-view-tests-that-use-helpers#comments"&gt;Matthew Dieter&lt;/a&gt; for posting about this. I had to add the &lt;code&gt;attr_reader&lt;/code&gt; line to get this to work.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6930361-8140748610805108491?l=daddy.platte.name' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/PlatteDaddy/~4/Vr1WZB0eINo" height="1" width="1"/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6930361/posts/default/8140748610805108491" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6930361/posts/default/8140748610805108491" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/PlatteDaddy/~3/Vr1WZB0eINo/stub-out-rails-helper-methods-with.html" title="How to stub out Rails helper methods with Mocha?" /><author><name>Ryan Platte</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><feedburner:origLink>http://daddy.platte.name/2007/06/stub-out-rails-helper-methods-with.html</feedburner:origLink></entry></feed>

