<?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-25068230</id><updated>2011-04-21T14:28:01.736-04:00</updated><category term='ruby'/><category term='video'/><category term='eclipse'/><category term='evil'/><category term='military'/><category term='testing'/><category term='java'/><category term='xp'/><category term='zune'/><category term='security'/><category term='apple'/><category term='programming'/><title type='text'>Brain Spill</title><subtitle type='html'>Where I babble on about whatever I want to.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://ttripp.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/25068230/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://ttripp.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>&lt;a href="http://toby.tripp.myopenid.com"&gt;Toby Tripp&lt;/a&gt;</name><uri>http://www.blogger.com/profile/05177254969768070178</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp0.blogger.com/_VjkjlI7xskM/R78ymnwB1jI/AAAAAAAAAAM/BIV2JIX_vmU/S220/Photo+2.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>34</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-25068230.post-1532335910900268855</id><published>2007-08-11T19:08:00.000-04:00</published><updated>2007-08-11T19:11:43.258-04:00</updated><title type='text'>I Knew It!</title><content type='html'>&lt;blockquote cite="http://god.rubyforge.org/"&gt;
  &lt;p&gt;God currently only works on Linux, BSD, and Darwin systems. No support for Windows is planned.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;As documented &lt;a href="http://god.rubyforge.org/"&gt;here&lt;/a&gt;.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/25068230-1532335910900268855?l=ttripp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ttripp.blogspot.com/feeds/1532335910900268855/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=25068230&amp;postID=1532335910900268855' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/25068230/posts/default/1532335910900268855'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/25068230/posts/default/1532335910900268855'/><link rel='alternate' type='text/html' href='http://ttripp.blogspot.com/2007/08/i-knew-it.html' title='I Knew It!'/><author><name>&lt;a href="http://toby.tripp.myopenid.com"&gt;Toby Tripp&lt;/a&gt;</name><uri>http://www.blogger.com/profile/05177254969768070178</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp0.blogger.com/_VjkjlI7xskM/R78ymnwB1jI/AAAAAAAAAAM/BIV2JIX_vmU/S220/Photo+2.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-25068230.post-9141377405935739700</id><published>2007-05-15T22:27:00.000-04:00</published><updated>2007-05-15T22:28:14.501-04:00</updated><title type='text'>Hi, I'm Ruby on Rails</title><content type='html'>&lt;object width="425" height="350"&gt;&lt;param name="movie" value="http://www.youtube.com/v/PQbuyKUaKFo"&gt;&lt;/param&gt;&lt;param name="wmode" value="transparent"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/PQbuyKUaKFo" type="application/x-shockwave-flash" wmode="transparent" width="425" height="350"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/25068230-9141377405935739700?l=ttripp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ttripp.blogspot.com/feeds/9141377405935739700/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=25068230&amp;postID=9141377405935739700' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/25068230/posts/default/9141377405935739700'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/25068230/posts/default/9141377405935739700'/><link rel='alternate' type='text/html' href='http://ttripp.blogspot.com/2007/05/hi-im-ruby-on-rails.html' title='Hi, I&apos;m Ruby on Rails'/><author><name>&lt;a href="http://toby.tripp.myopenid.com"&gt;Toby Tripp&lt;/a&gt;</name><uri>http://www.blogger.com/profile/05177254969768070178</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp0.blogger.com/_VjkjlI7xskM/R78ymnwB1jI/AAAAAAAAAAM/BIV2JIX_vmU/S220/Photo+2.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-25068230.post-7768716489435508999</id><published>2007-04-12T11:45:00.000-04:00</published><updated>2007-04-12T11:52:17.127-04:00</updated><title type='text'>My Firefox Add-ons</title><content type='html'>&lt;p&gt;I hate having to find all these again every time I move to a new machine.  So here they are.  Have any favorites of your own to share?&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://addons.mozilla.org/en-US/firefox/downloads/file/7558/adblock_plus-0.7.2.4-fx+fl+zm+tb.xpi"&gt;Adblock Plus&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://extensions.roachfiend.com/bugmenot.xpi"&gt;BugMeNot&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://addons.mozilla.org/en-US/firefox/addons/policy/0/3615/14545"&gt;del.icio.us Bookmarks&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://addons.mozilla.org/en-US/firefox/downloads/file/14570/firebug-1.04-fx+fl.xpi"&gt;Firebug&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://addons.mozilla.org/en-US/firefox/downloads/file/13931/greasemonkey-0.6.8.20070314.0-firefox.xpi"&gt;Greasemonkey&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://addons.mozilla.org/en-US/firefox/downloads/file/14419/searchbar_autosizer-1.3.6-fx.xpi"&gt;Searchbar Autosizer&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://addons.mozilla.org/en-US/firefox/downloads/file/1559/stop-or-reload_button-0.2.2-fx.xpi"&gt;Stop-or-Reload Button&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://addons.mozilla.org/en-US/firefox/downloads/file/6384/tiny_menu-1.4.2-fx+tb.xpi"&gt;Tiny Menu&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/25068230-7768716489435508999?l=ttripp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ttripp.blogspot.com/feeds/7768716489435508999/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=25068230&amp;postID=7768716489435508999' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/25068230/posts/default/7768716489435508999'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/25068230/posts/default/7768716489435508999'/><link rel='alternate' type='text/html' href='http://ttripp.blogspot.com/2007/04/my-firefox-add-ons.html' title='My Firefox Add-ons'/><author><name>&lt;a href="http://toby.tripp.myopenid.com"&gt;Toby Tripp&lt;/a&gt;</name><uri>http://www.blogger.com/profile/05177254969768070178</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp0.blogger.com/_VjkjlI7xskM/R78ymnwB1jI/AAAAAAAAAAM/BIV2JIX_vmU/S220/Photo+2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-25068230.post-3212911093468727171</id><published>2007-02-05T11:28:00.000-05:00</published><updated>2007-02-05T11:44:05.550-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><title type='text'>Don't Over-Work Your Swing Thread</title><content type='html'>&lt;p&gt;I know at least three different teams that I've worked with in the past that screw up Swing thread handling.  Frankly, they should all know better.  People, there is &lt;span style="font-style: italic;"&gt;no such thing&lt;/span&gt; as a single-threaded Java Swing application.  Fortunately, the Java 6 standard library is getting an addition that should help developers with this problem: the &lt;a href="http://java.sun.com/developer/technicalArticles/javase/swingworker/"&gt;SwingWorker API&lt;/a&gt;. 
&lt;blockquote&gt;One common mistake of desktop application programmers is misusing  the Swing event dispatch thread (EDT). They either unknowingly  access user interface (UI) components from non-UI threads or simply  disregard the consequences. The result is that applications become  unresponsive or sluggish because they perform long-running  tasks on the EDT instead of on separate worker threads. Long-running  computations or input/output (I/O) bound tasks should never run on  the Swing EDT. Finding problematic code may not  always be simple, but the &lt;a href="http://java.sun.com/javase/"&gt;Java  Platform, Standard Edition 6 (Java SE 6)&lt;/a&gt; makes it easier to fix  such code by providing the &lt;a href="http://java.sun.com/javase/6/docs/api/javax/swing/SwingWorker.html"&gt;&lt;code&gt;javax.swing.SwingWorker&lt;/code&gt;&lt;/a&gt;  class.&lt;/blockquote&gt;&lt;/p&gt;
&lt;p&gt;One of the reasons I tend to prefer SWT over Swing is that it seems to be better about throwing nasty exceptions when you try and step over the UI thread.  Neither is perfect, but I tend to get more exceptions when I do stupid stuff in SWT.  If I do something stupid in Swing, I get a grey box and a frozen UI.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/25068230-3212911093468727171?l=ttripp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ttripp.blogspot.com/feeds/3212911093468727171/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=25068230&amp;postID=3212911093468727171' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/25068230/posts/default/3212911093468727171'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/25068230/posts/default/3212911093468727171'/><link rel='alternate' type='text/html' href='http://ttripp.blogspot.com/2007/02/dont-over-work-your-swing-thread.html' title='Don&apos;t Over-Work Your Swing Thread'/><author><name>&lt;a href="http://toby.tripp.myopenid.com"&gt;Toby Tripp&lt;/a&gt;</name><uri>http://www.blogger.com/profile/05177254969768070178</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp0.blogger.com/_VjkjlI7xskM/R78ymnwB1jI/AAAAAAAAAAM/BIV2JIX_vmU/S220/Photo+2.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-25068230.post-8167571942997644584</id><published>2007-01-22T18:00:00.000-05:00</published><updated>2007-01-22T18:13:44.438-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='military'/><title type='text'>Are Soldiers not Human?</title><content type='html'>&lt;p&gt;From &lt;a href="http://www.industrialcontroldesignline.com/showArticle.jhtml?articleID=196900052"&gt;this&lt;/a&gt; article on a special RFID tattoo ink:
&lt;blockquote&gt;&lt;p&gt;The ink also could be used to track and rescue soldiers, Pydynowski said.&lt;/p&gt;
&lt;p&gt;
"It could help identify friends or foes, prevent friendly fire, and help save soldiers' lives," he said. "It's a very scary proposition when you're dealing with humans, but with military personnel, we're talking about saving soldiers' lives and it may be something worthwhile."&lt;/p&gt;&lt;/blockquote&gt;&lt;/p&gt;
&lt;p&gt;Excuse me?  Did that person just imply that soldiers aren't human?  I can't believe someone is considering tagging soldiers like livestock.&lt;/p&gt;
&lt;p&gt;Via &lt;a href="http://www.schneier.com/blog/archives/2007/01/rfid_tattoos.html"&gt;Bruce Schneier&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Elsewhere, apparently I'm not &lt;a href="http://www.stevepavlina.com/blog/2007/01/gratitude/"&gt;grateful&lt;/a&gt; enough.  I suppose that's true; I'll have to work on that.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/25068230-8167571942997644584?l=ttripp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ttripp.blogspot.com/feeds/8167571942997644584/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=25068230&amp;postID=8167571942997644584' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/25068230/posts/default/8167571942997644584'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/25068230/posts/default/8167571942997644584'/><link rel='alternate' type='text/html' href='http://ttripp.blogspot.com/2007/01/are-soldiers-not-human.html' title='Are Soldiers not Human?'/><author><name>&lt;a href="http://toby.tripp.myopenid.com"&gt;Toby Tripp&lt;/a&gt;</name><uri>http://www.blogger.com/profile/05177254969768070178</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp0.blogger.com/_VjkjlI7xskM/R78ymnwB1jI/AAAAAAAAAAM/BIV2JIX_vmU/S220/Photo+2.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-25068230.post-1100881767688872904</id><published>2007-01-12T09:19:00.000-05:00</published><updated>2007-01-12T09:27:29.251-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='video'/><title type='text'>You're Right, Pachelbel Should Sue</title><content type='html'>&lt;p&gt;When I read about &lt;a href="http://www.youtube.com/watch?v=JdxkVQy7QLM"&gt;this video&lt;/a&gt; over on the always entertaining &lt;a href="http://wondermark.blogspot.com/2007/01/265-in-which-harvey-is-hater.html"&gt;Wondermark&lt;/a&gt;, I thought it was in reference to the cellular ring-tone.  It turns out that cell phones are not the only place where Pachelbel's Canon in D has infected our lives.
&lt;/p&gt;

&lt;object width="425" height="350"&gt;&lt;param name="movie" value="http://www.youtube.com/v/JdxkVQy7QLM"&gt;&lt;/param&gt;&lt;param name="wmode" value="transparent"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/JdxkVQy7QLM" type="application/x-shockwave-flash" wmode="transparent" width="425" height="350"&gt;&lt;/embed&gt;&lt;/object&gt;

&lt;p&gt;This Rob Paravonian fellow reminds me of &lt;a href="http://www.wallypleasant.com/"&gt;Wally Pleasant&lt;/a&gt;.  I like him.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/25068230-1100881767688872904?l=ttripp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ttripp.blogspot.com/feeds/1100881767688872904/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=25068230&amp;postID=1100881767688872904' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/25068230/posts/default/1100881767688872904'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/25068230/posts/default/1100881767688872904'/><link rel='alternate' type='text/html' href='http://ttripp.blogspot.com/2007/01/youre-right-pachelbel-should-sue.html' title='You&apos;re Right, Pachelbel Should Sue'/><author><name>&lt;a href="http://toby.tripp.myopenid.com"&gt;Toby Tripp&lt;/a&gt;</name><uri>http://www.blogger.com/profile/05177254969768070178</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp0.blogger.com/_VjkjlI7xskM/R78ymnwB1jI/AAAAAAAAAAM/BIV2JIX_vmU/S220/Photo+2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-25068230.post-1795321638406991957</id><published>2007-01-11T14:34:00.000-05:00</published><updated>2007-01-11T19:50:37.990-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ruby'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><title type='text'>Fun with HTTP</title><content type='html'>&lt;p&gt;The HTTP protocol specification can be a bit &lt;a href="http://www.ietf.org/rfc/rfc2616.txt"&gt;daunting&lt;/a&gt; and I was curious what the data in a POST request looks like. So, just for fun, I dumped out a little Ruby &lt;a href="http://www.webrick.org/"&gt;WEBrick&lt;/a&gt; &lt;a href="http://microjet.ath.cx/webrickguide/html/html_webrick.html"&gt;servlet&lt;/a&gt; program that returns the contents of any HTTP GET or POST requests it receives.  It looks like this:&lt;/p&gt;

&lt;pre class="textmate-source pastels_on_dark"&gt;&lt;span class="source source_ruby"&gt;&lt;span class="comment comment_line comment_line_number-sign comment_line_number-sign_ruby"&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_comment punctuation_definition_comment_ruby"&gt;#&lt;/span&gt;!/usr/bin/env ruby
&lt;/span&gt;&lt;span class="comment comment_line comment_line_number-sign comment_line_number-sign_ruby"&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_comment punctuation_definition_comment_ruby"&gt;#&lt;/span&gt;
&lt;/span&gt;&lt;span class="comment comment_line comment_line_number-sign comment_line_number-sign_ruby"&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_comment punctuation_definition_comment_ruby"&gt;#&lt;/span&gt;  Created by Toby Tripp on 2007-01-11.
&lt;/span&gt;
&lt;span class="meta meta_require meta_require_ruby"&gt;&lt;span class="keyword keyword_other keyword_other_special-method keyword_other_special-method_ruby"&gt;require&lt;/span&gt; &lt;span class="string string_quoted string_quoted_single string_quoted_single_ruby"&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby"&gt;'&lt;/span&gt;webrick&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby"&gt;'&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;

&lt;span class="meta meta_class meta_class_ruby"&gt;&lt;span class="keyword keyword_control keyword_control_class keyword_control_class_ruby"&gt;class&lt;/span&gt; &lt;span class="entity entity_name entity_name_type entity_name_type_class entity_name_type_class_ruby"&gt;PostDumper&lt;/span&gt;&lt;/span&gt; &amp;lt;
  &lt;span class="variable variable_other variable_other_constant variable_other_constant_ruby"&gt;WEBrick&lt;/span&gt;::&lt;span class="variable variable_other variable_other_constant variable_other_constant_ruby"&gt;HTTPServlet&lt;/span&gt;::&lt;span class="variable variable_other variable_other_constant variable_other_constant_ruby"&gt;AbstractServlet&lt;/span&gt;
  
&lt;span class="comment comment_line comment_line_number-sign comment_line_number-sign_ruby"&gt;  &lt;span class="punctuation punctuation_definition punctuation_definition_comment punctuation_definition_comment_ruby"&gt;#&lt;/span&gt; Reload file for each request, instantly
&lt;/span&gt;&lt;span class="comment comment_line comment_line_number-sign comment_line_number-sign_ruby"&gt;  &lt;span class="punctuation punctuation_definition punctuation_definition_comment punctuation_definition_comment_ruby"&gt;#&lt;/span&gt; updating the server with code changes 
&lt;/span&gt;&lt;span class="comment comment_line comment_line_number-sign comment_line_number-sign_ruby"&gt;  &lt;span class="punctuation punctuation_definition punctuation_definition_comment punctuation_definition_comment_ruby"&gt;#&lt;/span&gt; without needing a restart.
&lt;/span&gt;&lt;span class="comment comment_line comment_line_number-sign comment_line_number-sign_ruby"&gt;  &lt;span class="punctuation punctuation_definition punctuation_definition_comment punctuation_definition_comment_ruby"&gt;#&lt;/span&gt;
&lt;/span&gt;&lt;span class="meta meta_function meta_function_method meta_function_method_with-arguments meta_function_method_with-arguments_ruby"&gt;  &lt;span class="keyword keyword_control keyword_control_def keyword_control_def_ruby"&gt;def&lt;/span&gt; &lt;span class="entity entity_name entity_name_function entity_name_function_ruby"&gt;PostDumper.get_instance&lt;/span&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_parameters punctuation_definition_parameters_ruby"&gt;(&lt;/span&gt;&lt;span class="variable variable_parameter variable_parameter_function variable_parameter_function_ruby"&gt; config, *options &lt;/span&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_parameters punctuation_definition_parameters_ruby"&gt;)&lt;/span&gt;&lt;/span&gt;
    load &lt;span class="variable variable_language variable_language_ruby"&gt;__FILE__&lt;/span&gt;
    &lt;span class="support support_class support_class_ruby"&gt;PostDumper&lt;/span&gt;.&lt;span class="keyword keyword_other keyword_other_special-method keyword_other_special-method_ruby"&gt;new&lt;/span&gt; config, *options
  &lt;span class="keyword keyword_control keyword_control_ruby"&gt;end&lt;/span&gt;
  
&lt;span class="meta meta_function meta_function_method meta_function_method_with-arguments meta_function_method_with-arguments_ruby"&gt;  &lt;span class="keyword keyword_control keyword_control_def keyword_control_def_ruby"&gt;def&lt;/span&gt; &lt;span class="entity entity_name entity_name_function entity_name_function_ruby"&gt;do_GET&lt;/span&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_parameters punctuation_definition_parameters_ruby"&gt;(&lt;/span&gt;&lt;span class="variable variable_parameter variable_parameter_function variable_parameter_function_ruby"&gt; request, response &lt;/span&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_parameters punctuation_definition_parameters_ruby"&gt;)&lt;/span&gt;&lt;/span&gt;
    response.status = &lt;span class="constant constant_numeric constant_numeric_ruby"&gt;200&lt;/span&gt;
    response[&lt;span class="string string_quoted string_quoted_single string_quoted_single_ruby"&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby"&gt;'&lt;/span&gt;Content-Type&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby"&gt;'&lt;/span&gt;&lt;/span&gt;] = &lt;span class="string string_quoted string_quoted_double string_quoted_double_ruby"&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby"&gt;"&lt;/span&gt;text/plain&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby"&gt;"&lt;/span&gt;&lt;/span&gt;
    response.body = dump_request( request )
  &lt;span class="keyword keyword_control keyword_control_ruby"&gt;end&lt;/span&gt;
  
&lt;span class="meta meta_function meta_function_method meta_function_method_with-arguments meta_function_method_with-arguments_ruby"&gt;  &lt;span class="keyword keyword_control keyword_control_def keyword_control_def_ruby"&gt;def&lt;/span&gt; &lt;span class="entity entity_name entity_name_function entity_name_function_ruby"&gt;do_POST&lt;/span&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_parameters punctuation_definition_parameters_ruby"&gt;(&lt;/span&gt;&lt;span class="variable variable_parameter variable_parameter_function variable_parameter_function_ruby"&gt; request, response &lt;/span&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_parameters punctuation_definition_parameters_ruby"&gt;)&lt;/span&gt;&lt;/span&gt;
    response.status = &lt;span class="constant constant_numeric constant_numeric_ruby"&gt;200&lt;/span&gt;
    response[&lt;span class="string string_quoted string_quoted_single string_quoted_single_ruby"&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby"&gt;'&lt;/span&gt;Content-Type&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby"&gt;'&lt;/span&gt;&lt;/span&gt;] = &lt;span class="string string_quoted string_quoted_double string_quoted_double_ruby"&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby"&gt;"&lt;/span&gt;text/plain&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby"&gt;"&lt;/span&gt;&lt;/span&gt;
    response.body = dump_request( request )
    response.body &amp;lt;&amp;lt; request.body
  &lt;span class="keyword keyword_control keyword_control_ruby"&gt;end&lt;/span&gt;
  
&lt;span class="meta meta_function meta_function_method meta_function_method_with-arguments meta_function_method_with-arguments_ruby"&gt;  &lt;span class="keyword keyword_control keyword_control_def keyword_control_def_ruby"&gt;def&lt;/span&gt; &lt;span class="entity entity_name entity_name_function entity_name_function_ruby"&gt;dump_request&lt;/span&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_parameters punctuation_definition_parameters_ruby"&gt;(&lt;/span&gt;&lt;span class="variable variable_parameter variable_parameter_function variable_parameter_function_ruby"&gt; request &lt;/span&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_parameters punctuation_definition_parameters_ruby"&gt;)&lt;/span&gt;&lt;/span&gt;
    request.request_line &amp;lt;&amp;lt; &lt;span class="string string_quoted string_quoted_double string_quoted_double_ruby"&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby"&gt;"&lt;/span&gt;&lt;span class="constant constant_character constant_character_escape constant_character_escape_ruby"&gt;\r\n&lt;/span&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby"&gt;"&lt;/span&gt;&lt;/span&gt; &amp;lt;&amp;lt;
      request.raw_header.join( &lt;span class="string string_quoted string_quoted_double string_quoted_double_ruby"&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby"&gt;"&lt;/span&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby"&gt;"&lt;/span&gt;&lt;/span&gt; ) &amp;lt;&amp;lt; &lt;span class="string string_quoted string_quoted_double string_quoted_double_ruby"&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby"&gt;"&lt;/span&gt;&lt;span class="constant constant_character constant_character_escape constant_character_escape_ruby"&gt;\r\n&lt;/span&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby"&gt;"&lt;/span&gt;&lt;/span&gt;
  &lt;span class="keyword keyword_control keyword_control_ruby"&gt;end&lt;/span&gt;
&lt;span class="keyword keyword_control keyword_control_ruby"&gt;end&lt;/span&gt;

&lt;span class="keyword keyword_control keyword_control_ruby"&gt;if&lt;/span&gt; &lt;span class="variable variable_language variable_language_ruby"&gt;__FILE__&lt;/span&gt; == &lt;span class="variable variable_other variable_other_readwrite variable_other_readwrite_global variable_other_readwrite_global_pre-defined variable_other_readwrite_global_pre-defined_ruby"&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_variable punctuation_definition_variable_ruby"&gt;$&lt;/span&gt;0&lt;/span&gt;
  port = (&lt;span class="variable variable_other variable_other_constant variable_other_constant_ruby"&gt;ARGV&lt;/span&gt;[&lt;span class="constant constant_numeric constant_numeric_ruby"&gt;0&lt;/span&gt;] || &lt;span class="constant constant_numeric constant_numeric_ruby"&gt;2000&lt;/span&gt;)
  server = &lt;span class="variable variable_other variable_other_constant variable_other_constant_ruby"&gt;WEBrick&lt;/span&gt;::&lt;span class="variable variable_other variable_other_constant variable_other_constant_ruby"&gt;HTTPServer&lt;/span&gt;.&lt;span class="keyword keyword_other keyword_other_special-method keyword_other_special-method_ruby"&gt;new&lt;/span&gt;(
     &lt;span class="constant constant_other constant_other_symbol constant_other_symbol_ruby"&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_constant punctuation_definition_constant_ruby"&gt;:&lt;/span&gt;Port&lt;/span&gt; =&amp;gt; port,
     &lt;span class="constant constant_other constant_other_symbol constant_other_symbol_ruby"&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_constant punctuation_definition_constant_ruby"&gt;:&lt;/span&gt;DocumentRoot&lt;/span&gt; =&amp;gt; &lt;span class="support support_class support_class_ruby"&gt;File&lt;/span&gt;.join( &lt;span class="support support_class support_class_ruby"&gt;Dir&lt;/span&gt;.pwd, &lt;span class="string string_quoted string_quoted_double string_quoted_double_ruby"&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby"&gt;"&lt;/span&gt;/html&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby"&gt;"&lt;/span&gt;&lt;/span&gt; )
   )
  server.mount &lt;span class="string string_quoted string_quoted_double string_quoted_double_ruby"&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby"&gt;"&lt;/span&gt;/dump&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby"&gt;"&lt;/span&gt;&lt;/span&gt;, &lt;span class="variable variable_other variable_other_constant variable_other_constant_ruby"&gt;PostDumper&lt;/span&gt;
  trap( &lt;span class="string string_quoted string_quoted_double string_quoted_double_ruby"&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby"&gt;"&lt;/span&gt;INT&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby"&gt;"&lt;/span&gt;&lt;/span&gt; ) {&lt;span class="meta meta_syntax meta_syntax_ruby meta_syntax_ruby_start-block"&gt; &lt;/span&gt;server.shutdown }
  server.start
&lt;span class="keyword keyword_control keyword_control_ruby"&gt;end&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;

&lt;p&gt;If I run the above and point my browser at http://localhost:2000/dump I get:&lt;/p&gt;
&lt;blockquote&gt;&lt;code&gt;&lt;pre&gt;GET /dump HTTP/1.1

Host: localhost:2000
User-Agent: Mozilla/5.0 (Macintosh; U; PPC Mac OS X Mach-O; en-US; rv:1.8.1) Gecko/20061026 BonEcho/2.0
Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive&lt;/pre&gt;&lt;/code&gt;&lt;/blockquote&gt;

&lt;p&gt;I've also got a little html form that points to the same URL for its action.  Submitting that form gives me:&lt;/p&gt;
&lt;blockquote&gt;&lt;code&gt;&lt;pre&gt;POST /dump HTTP/1.1

Host: localhost:2000
User-Agent: Mozilla/5.0 (Macintosh; U; PPC Mac OS X Mach-O; en-US; rv:1.8.1) Gecko/20061026 BonEcho/2.0
Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive
Referer: http://localhost:2000/form.html
Content-Type: application/x-www-form-urlencoded
Content-Length: 85

submit=Submit&amp;text_input=Single+line+text&amp;file_input=&amp;textarea=Multi-line+text+input.&lt;/pre&gt;&lt;/code&gt;&lt;/blockquote&gt;

&lt;p&gt;There!  It turns out that POST data is just key/value pairs that are url-encoded.  Each pair is separated by an ampersand.&lt;/p&gt;

&lt;p&gt;The response from the server can also be instructive.  If I use telnet to generate a GET request:&lt;/p&gt;
&lt;blockquote&gt;&lt;pre&gt;~$ telnet localhost 2000
Trying ::1...
Connected to localhost.
Escape character is '^]'.
GET / HTTP/1.1

HTTP/1.1 200 OK 
Last-Modified: Thu, 11 Jan 2007 16:36:39 GMT
Connection: Keep-Alive
Date: Thu, 11 Jan 2007 20:09:56 GMT
Content-Type: text/html
Etag: 2a8766-169-45a66797
Server: WEBrick/1.3.1 (Ruby/1.8.2/2004-12-25)
Content-Length: 361

[...]
&lt;/pre&gt;&lt;/blockquote&gt;
&lt;p&gt;There's the response from the server.  One thing that this program can't show you concerning the HTTP protocol: lines are terminated with the '\r\n' character sequence.  This includes the blank lines, which are important to the protocol.  A blank line separates the header (including the request line) from the content.&lt;/p&gt;

&lt;p&gt;There you have it: a WEBrick servlet in less than 50 lines of code.  Did I miss anything?&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/25068230-1795321638406991957?l=ttripp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ttripp.blogspot.com/feeds/1795321638406991957/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=25068230&amp;postID=1795321638406991957' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/25068230/posts/default/1795321638406991957'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/25068230/posts/default/1795321638406991957'/><link rel='alternate' type='text/html' href='http://ttripp.blogspot.com/2007/01/fun-with-http.html' title='Fun with HTTP'/><author><name>&lt;a href="http://toby.tripp.myopenid.com"&gt;Toby Tripp&lt;/a&gt;</name><uri>http://www.blogger.com/profile/05177254969768070178</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp0.blogger.com/_VjkjlI7xskM/R78ymnwB1jI/AAAAAAAAAAM/BIV2JIX_vmU/S220/Photo+2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-25068230.post-2980525511501177850</id><published>2007-01-11T10:48:00.000-05:00</published><updated>2007-01-11T10:54:47.747-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='video'/><title type='text'>The Power of Editing</title><content type='html'>&lt;p&gt;I found this entertaining:&lt;/p&gt;
&lt;object width="425" height="350"&gt;&lt;param name="movie" value="http://www.youtube.com/v/2T5_0AGdFic"&gt;&lt;/param&gt;&lt;param name="wmode" value="transparent"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/2T5_0AGdFic" type="application/x-shockwave-flash" wmode="transparent" width="425" height="350"&gt;&lt;/embed&gt;&lt;/object&gt;

&lt;p&gt;Someone should market these as a way to avoid having to go see certain movies.  &lt;q&gt;... but Honey, &lt;q&gt;Mary Poppins&lt;/q&gt; is a horror film.  Have you seen this trailer?&lt;/q&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/25068230-2980525511501177850?l=ttripp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ttripp.blogspot.com/feeds/2980525511501177850/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=25068230&amp;postID=2980525511501177850' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/25068230/posts/default/2980525511501177850'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/25068230/posts/default/2980525511501177850'/><link rel='alternate' type='text/html' href='http://ttripp.blogspot.com/2007/01/power-of-editing.html' title='The Power of Editing'/><author><name>&lt;a href="http://toby.tripp.myopenid.com"&gt;Toby Tripp&lt;/a&gt;</name><uri>http://www.blogger.com/profile/05177254969768070178</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp0.blogger.com/_VjkjlI7xskM/R78ymnwB1jI/AAAAAAAAAAM/BIV2JIX_vmU/S220/Photo+2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-25068230.post-1580395001858996520</id><published>2007-01-09T17:43:00.000-05:00</published><updated>2007-01-09T18:06:00.734-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='xp'/><category scheme='http://www.blogger.com/atom/ns#' term='evil'/><category scheme='http://www.blogger.com/atom/ns#' term='apple'/><title type='text'>Wow, It Started Early</title><content type='html'>&lt;p&gt;So, we're comparing apples to oranges &lt;a href="http://eclipse.pookzilla.net/2007/01/discussion-topic.php"&gt;already?&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;So, I've been passing the time at a local XP shop recently.  Finally, a group that does TDD, Continuous Integration, and the like without me having to evangelize it constantly.  It hasn't all been roses and fluffy unicorns, though.  I'll comment further on another day.&lt;/p&gt;

&lt;p&gt;Update: &lt;a href="http://www.hicksdesign.co.uk/journal/the-only-drawback-with-the-iphone"&gt;iPhone's downfall&lt;/a&gt; (bummer it's only Cingular now, too)&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/25068230-1580395001858996520?l=ttripp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ttripp.blogspot.com/feeds/1580395001858996520/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=25068230&amp;postID=1580395001858996520' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/25068230/posts/default/1580395001858996520'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/25068230/posts/default/1580395001858996520'/><link rel='alternate' type='text/html' href='http://ttripp.blogspot.com/2007/01/wow-it-started-early.html' title='Wow, It Started Early'/><author><name>&lt;a href="http://toby.tripp.myopenid.com"&gt;Toby Tripp&lt;/a&gt;</name><uri>http://www.blogger.com/profile/05177254969768070178</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp0.blogger.com/_VjkjlI7xskM/R78ymnwB1jI/AAAAAAAAAAM/BIV2JIX_vmU/S220/Photo+2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-25068230.post-7778221236365634167</id><published>2006-10-16T16:54:00.000-04:00</published><updated>2006-10-16T17:06:56.466-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='zune'/><category scheme='http://www.blogger.com/atom/ns#' term='evil'/><category scheme='http://www.blogger.com/atom/ns#' term='apple'/><title type='text'>Zune Will Drive Girls Away, says Jobs</title><content type='html'>&lt;p&gt;&lt;a href="http://www.msnbc.msn.com/id/15262121/site/newsweek/"&gt;Newsweek&lt;/a&gt; has done a three page piece on an interview with Steve Jobs.  You've probably heard about it already.  Even considering the source, it increases my skepticism concerning the Zune's prospects.&lt;/p&gt;
&lt;blockquote&gt;Look at the design of a lot of consumer products—they're really complicated surfaces. We tried make something much more holistic and simple. When you first start off trying to solve a problem, the first solutions you come up with are very complex, and most people stop there.&lt;/blockquote&gt;
&lt;p&gt;It seems like you could just ship it at this point and improve things over time with firmware updates.  That thinking might be considered to align with Agile principles, but I don't think it does.  Ship an over-complicated product and it's already to late.  I don't believe that release early and often means you get to skip user interface design.&lt;/p&gt;
&lt;p&gt;It's not all happy though:
&lt;blockquote&gt;&lt;span style="font-weight:bold;"&gt;Do you think that it's fair to the customer that the songs they buy from Apple will only work on iTunes and the iPod?&lt;/span&gt;
Well, they knew that all along.&lt;/blockquote&gt;
I find that attitude ... upsetting.  It will be interesting to see if pressure from the Zune can help encourage openness at Apple.&lt;/p&gt;
&lt;p&gt;&lt;blockquote&gt;I've seen the demonstrations on the Internet about how you can find another person using a Zune and give them a song they can play three times. It takes forever. By the time you've gone through all that, the girl's got up and left! You're much better off to take one of your earbuds out and put it in her ear. Then you're connected with about two feet of headphone cable.&lt;/blockquote&gt; Okay Zune, I'm good enough at chasing away girls all by my self, thank you.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/25068230-7778221236365634167?l=ttripp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ttripp.blogspot.com/feeds/7778221236365634167/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=25068230&amp;postID=7778221236365634167' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/25068230/posts/default/7778221236365634167'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/25068230/posts/default/7778221236365634167'/><link rel='alternate' type='text/html' href='http://ttripp.blogspot.com/2006/10/zune-will-drive-girls-away-says-jobs.html' title='Zune Will Drive Girls Away, says Jobs'/><author><name>&lt;a href="http://toby.tripp.myopenid.com"&gt;Toby Tripp&lt;/a&gt;</name><uri>http://www.blogger.com/profile/05177254969768070178</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp0.blogger.com/_VjkjlI7xskM/R78ymnwB1jI/AAAAAAAAAAM/BIV2JIX_vmU/S220/Photo+2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-25068230.post-1522729874714089988</id><published>2006-10-11T19:59:00.000-04:00</published><updated>2006-10-11T20:01:47.888-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ruby'/><category scheme='http://www.blogger.com/atom/ns#' term='testing'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><title type='text'>Tim Bray on TDD</title><content type='html'>&lt;blockquote&gt;I would say that, looking back over the 20 years I've been doing this, that the 2 biggest developments in IT, most-significant, are Object-Orientation and Test-Driven Development, and I think that TDD is more important.&lt;/blockquote&gt;

From an &lt;a href="http://www.infoq.com/interviews/tim_bray_rails_and_more"&gt;interview&lt;/a&gt; by Obie Fernandez on InfoQ.  It's a nice read, I recommend it.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/25068230-1522729874714089988?l=ttripp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ttripp.blogspot.com/feeds/1522729874714089988/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=25068230&amp;postID=1522729874714089988' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/25068230/posts/default/1522729874714089988'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/25068230/posts/default/1522729874714089988'/><link rel='alternate' type='text/html' href='http://ttripp.blogspot.com/2006/10/tim-bray-on-tdd.html' title='Tim Bray on TDD'/><author><name>&lt;a href="http://toby.tripp.myopenid.com"&gt;Toby Tripp&lt;/a&gt;</name><uri>http://www.blogger.com/profile/05177254969768070178</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp0.blogger.com/_VjkjlI7xskM/R78ymnwB1jI/AAAAAAAAAAM/BIV2JIX_vmU/S220/Photo+2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-25068230.post-1566954487943689450</id><published>2006-10-07T20:34:00.000-04:00</published><updated>2006-10-07T20:35:48.152-04:00</updated><title type='text'>The PowerPoint Crutch</title><content type='html'>“The quality of a speaker is inversly proportional to the number of slides they have”
via the &lt;a href="http://37signals.com/svn/archives2/fly_on_the_wall_eggnog_just_sounds_disgusting.php"&gt;37 Signals blog&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/25068230-1566954487943689450?l=ttripp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ttripp.blogspot.com/feeds/1566954487943689450/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=25068230&amp;postID=1566954487943689450' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/25068230/posts/default/1566954487943689450'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/25068230/posts/default/1566954487943689450'/><link rel='alternate' type='text/html' href='http://ttripp.blogspot.com/2006/10/powerpoint-crutch.html' title='The PowerPoint Crutch'/><author><name>&lt;a href="http://toby.tripp.myopenid.com"&gt;Toby Tripp&lt;/a&gt;</name><uri>http://www.blogger.com/profile/05177254969768070178</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp0.blogger.com/_VjkjlI7xskM/R78ymnwB1jI/AAAAAAAAAAM/BIV2JIX_vmU/S220/Photo+2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-25068230.post-8284939090848253961</id><published>2006-10-05T12:49:00.000-04:00</published><updated>2006-10-05T13:00:57.379-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ruby'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><title type='text'>Yegge On Ruby</title><content type='html'>&lt;p&gt;I first have to admit that I tend to find Steve Yegge's writings boorish at best.  His &lt;a href="http://steve-yegge.blogspot.com/2006/09/good-agile-bad-agile_27.html"&gt;post&lt;/a&gt; on Agile processes illustrates some of his worst.  However, he has an entertaining writing style that keeps me coming back.&lt;/p&gt;
&lt;p&gt;This brings me to an &lt;a href="http://www.oreillynet.com/ruby/blog/2006/03/transformation.html"&gt;old post&lt;/a&gt; of his on resistance to Ruby.  Specifically, the lack of automated refactoring tools in Ruby.  When &lt;em&gt;did&lt;/em&gt; refactoring become about pushing buttons in an IDE?  It certainly never started there.   Is it not interesting that the &lt;em&gt;author&lt;/em&gt; of &lt;a href="http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672/sr=8-1/qid=1160067383/ref=pd_bbs_1/002-8719036-7657650?ie=UTF8&amp;s=books"&gt;Refactoring&lt;/a&gt;, &lt;a href="http://www.martinfowler.com/bliki/"&gt;Martin Fowler&lt;/a&gt;, uses Ruby?&lt;/p&gt;
&lt;p&gt;That said, I'm feeling a bit guilty of the whole push-button programming sickness myself.  (Maybe Eclipse is a little too cool).  I think it's time for me to pick up &lt;em&gt;Refactoring&lt;/em&gt; again and give it a good re-read.&lt;/p&gt;
&lt;p&gt;In the meantime, I think &amp;lt;gasp!&amp;gt; Steve is right: &lt;a href="http://www.oreillynet.com/ruby/blog/2006/03/transformation.html"&gt;Ruby &lt;em&gt;is&lt;/em&gt; a butterfly&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;edit: &amp;nbsp;&amp;nbsp; &lt;a href="http://weblog.raganwald.com/2006/10/why-are-local-variables-bad.html"&gt;this&lt;/a&gt; article is a good companion to Yegge's article.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/25068230-8284939090848253961?l=ttripp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ttripp.blogspot.com/feeds/8284939090848253961/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=25068230&amp;postID=8284939090848253961' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/25068230/posts/default/8284939090848253961'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/25068230/posts/default/8284939090848253961'/><link rel='alternate' type='text/html' href='http://ttripp.blogspot.com/2006/10/yegge-on-ruby.html' title='Yegge On Ruby'/><author><name>&lt;a href="http://toby.tripp.myopenid.com"&gt;Toby Tripp&lt;/a&gt;</name><uri>http://www.blogger.com/profile/05177254969768070178</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp0.blogger.com/_VjkjlI7xskM/R78ymnwB1jI/AAAAAAAAAAM/BIV2JIX_vmU/S220/Photo+2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-25068230.post-4210555713676825646</id><published>2006-09-18T13:15:00.000-04:00</published><updated>2006-09-18T13:17:14.508-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='apple'/><title type='text'>New Shuffle</title><content type='html'>&lt;p&gt;Wow, the &lt;a href="http://www.apple.com/ipodshuffle/"&gt;new shuffle&lt;/a&gt; really &lt;em&gt;is&lt;/em&gt; like a "&lt;a href="http://37signals.com/svn/archives2/reactions_to_new_ipod_itunes_jobs_etc.php"&gt;paperclip that plays music&lt;/a&gt;."&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/25068230-4210555713676825646?l=ttripp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ttripp.blogspot.com/feeds/4210555713676825646/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=25068230&amp;postID=4210555713676825646' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/25068230/posts/default/4210555713676825646'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/25068230/posts/default/4210555713676825646'/><link rel='alternate' type='text/html' href='http://ttripp.blogspot.com/2006/09/new-shuffle.html' title='New Shuffle'/><author><name>&lt;a href="http://toby.tripp.myopenid.com"&gt;Toby Tripp&lt;/a&gt;</name><uri>http://www.blogger.com/profile/05177254969768070178</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp0.blogger.com/_VjkjlI7xskM/R78ymnwB1jI/AAAAAAAAAAM/BIV2JIX_vmU/S220/Photo+2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-25068230.post-6853233575210183675</id><published>2006-09-18T09:39:00.000-04:00</published><updated>2006-09-18T09:41:04.578-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='security'/><title type='text'>Renew Your Passports, People</title><content type='html'>&lt;/p&gt;They're about to put RFID chips in passports.  I guess I'd better get mine now before any fool with an antennae can read it from across the room. :-/&lt;/p&gt;

&lt;p&gt;Via &lt;a href="http://www.schneier.com/blog/archives/2006/09/renew_your_pass.html"&gt;Bruce Schneier&lt;/a&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/25068230-6853233575210183675?l=ttripp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ttripp.blogspot.com/feeds/6853233575210183675/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=25068230&amp;postID=6853233575210183675' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/25068230/posts/default/6853233575210183675'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/25068230/posts/default/6853233575210183675'/><link rel='alternate' type='text/html' href='http://ttripp.blogspot.com/2006/09/renew-your-passports-people.html' title='Renew Your Passports, People'/><author><name>&lt;a href="http://toby.tripp.myopenid.com"&gt;Toby Tripp&lt;/a&gt;</name><uri>http://www.blogger.com/profile/05177254969768070178</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp0.blogger.com/_VjkjlI7xskM/R78ymnwB1jI/AAAAAAAAAAM/BIV2JIX_vmU/S220/Photo+2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-25068230.post-6864530407491662594</id><published>2006-09-15T10:04:00.000-04:00</published><updated>2006-09-15T10:39:53.395-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='zune'/><category scheme='http://www.blogger.com/atom/ns#' term='evil'/><category scheme='http://www.blogger.com/atom/ns#' term='apple'/><title type='text'>Who "Launches" a Product That You Can't Buy Yet?</title><content type='html'>&lt;p&gt;Microsoft &lt;a href="http://news.bbc.co.uk/1/hi/technology/5348674.stm"&gt;does&lt;/a&gt;.&lt;/p&gt;  I'm sure they're not the &lt;em&gt;only&lt;/em&gt; ones, but I'm in a mood today.

&lt;p&gt;Now, I've shared my &lt;a href="http://ttripp.blogspot.com/2006/06/can-microsoft-kill-ipod.html"&gt;opinion&lt;/a&gt; on the &lt;em&gt;Zune&lt;/em&gt;'s chances already.  The iPod is a tough nut to crack.  &lt;a href="http://daringfireball.net"&gt;John Gruber&lt;/a&gt; recently &lt;a href="http://daringfireball.net/2006/09/showtime_big_picture"&gt;reported&lt;/a&gt; on Apple's "&lt;a href="http://events.apple.com.edgesuite.net/sep_2006/event/index.html"&gt;Showtime&lt;/a&gt;" event on Tuesday.  From that entry:
&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;Apple claims 88 percent of non-bootleg music downloads in the U.S.&lt;/li&gt;
&lt;li&gt;70 percent of 2007 model year cars sold in the U.S. have iPod connectivity built-in. Not “MP3-player” connectivity. &lt;em&gt;iPod&lt;/em&gt; connectivity. Note to Jobs: Send nice Christmas presents to the engineers who came up with the proprietary iPod dock connector port.&lt;/li&gt;
&lt;li&gt;450,000 Nike + iPod Sport Kits have been sold in fewer than 90 days. Not Nike + MP3 Player Sport Kits. Nike + iPod.&lt;/li&gt;
&lt;li&gt;The iTunes Store is the fifth-largest music reseller in the U.S., and expects to pass Amazon early next year, at which point they’ll trail only Wal-Mart, Best Buy, and Target.&lt;/li&gt;
&lt;li&gt;Apple has sold 1.5 billion total songs to date.&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;&lt;/p&gt;
&lt;p&gt;So, probably the only company that is afraid of the &lt;em&gt;Zune&lt;/em&gt; is &lt;a href="http://www.creative.com/products/product.asp?category=213&amp;subcategory=214&amp;product=10795"&gt;Creative&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;To be fair, the &lt;em&gt;Zune&lt;/em&gt; (somehow they've managed to come up with a name even sillier than &lt;em&gt;iPod&lt;/em&gt;) -- the &lt;em&gt;Zune&lt;/em&gt; will come to the table with a couple of nice new &lt;a href="http://blog.wired.com/music/index.blog?entry_id=1556657"&gt;features&lt;/a&gt;.  The wi-fi song sharing sounds nice and the bigger screen is certainly a plus.  I find it interesting that these are two features that Apple is reluctant to add because of battery life concerns.  It should be no suprise, therefore, that we've heard no mention of the battery life of the &lt;em&gt;Zune&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;I should be nicer to the &lt;em&gt;Zune&lt;/em&gt;, I know.  Competition for the iPod can only result in good things.  It's just that ... well, Microsoft's actions tend to speak much louder than their words.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/25068230-6864530407491662594?l=ttripp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ttripp.blogspot.com/feeds/6864530407491662594/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=25068230&amp;postID=6864530407491662594' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/25068230/posts/default/6864530407491662594'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/25068230/posts/default/6864530407491662594'/><link rel='alternate' type='text/html' href='http://ttripp.blogspot.com/2006/09/who-launches-product-that-you-cant-buy.html' title='Who &quot;Launches&quot; a Product That You Can&apos;t Buy Yet?'/><author><name>&lt;a href="http://toby.tripp.myopenid.com"&gt;Toby Tripp&lt;/a&gt;</name><uri>http://www.blogger.com/profile/05177254969768070178</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp0.blogger.com/_VjkjlI7xskM/R78ymnwB1jI/AAAAAAAAAAM/BIV2JIX_vmU/S220/Photo+2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-25068230.post-1136262423359571838</id><published>2006-08-23T10:05:00.000-04:00</published><updated>2006-08-23T10:15:35.454-04:00</updated><title type='text'>The Sci-Fi Character Quiz</title><content type='html'>&lt;p style="float: left; padding: .5em"&gt;&lt;a href="http://www.tk421.net/character/"&gt;&lt;img src="http://www.tk421.net/character/picard.jpg" width="164" height="225" style="border-color:#f8f8ff;" border="2" alt="Which Fantasy/SciFi Character Are You?" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Another Geek Quiz!  Via &lt;a href="http://bilz.livejournal.com/31167.html"&gt;Bilz&lt;/a&gt;.  Apparently I'm a formally schooled Shakespearean actor.  Who knew?&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/25068230-1136262423359571838?l=ttripp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ttripp.blogspot.com/feeds/1136262423359571838/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=25068230&amp;postID=1136262423359571838' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/25068230/posts/default/1136262423359571838'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/25068230/posts/default/1136262423359571838'/><link rel='alternate' type='text/html' href='http://ttripp.blogspot.com/2006/08/sci-fi-character-quiz.html' title='The Sci-Fi Character Quiz'/><author><name>&lt;a href="http://toby.tripp.myopenid.com"&gt;Toby Tripp&lt;/a&gt;</name><uri>http://www.blogger.com/profile/05177254969768070178</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp0.blogger.com/_VjkjlI7xskM/R78ymnwB1jI/AAAAAAAAAAM/BIV2JIX_vmU/S220/Photo+2.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-25068230.post-8870823503322824316</id><published>2006-08-22T15:46:00.000-04:00</published><updated>2006-08-22T15:48:20.778-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='eclipse'/><category scheme='http://www.blogger.com/atom/ns#' term='testing'/><title type='text'>Working with the Workspace in Eclipse Plug-in Tests</title><content type='html'>&lt;p&gt;Okay, I've had to figure out how to do this a number of different times that exceeds two; so now I'm writing it down.&lt;/p&gt;
&lt;h3&gt;The Situation&lt;/h3&gt;
&lt;p&gt;I want to create a file in the test runtime workspace that I can run tests against.&lt;/p&gt;
&lt;h3&gt;The Solution, v0.1 ... (beta)&lt;/h3&gt;
&lt;pre style="background-color: #313031; color: #FFF"&gt;
@Before
&lt;font color="#bdb66b"&gt;&lt;b&gt;protected&lt;/b&gt;&lt;/font&gt; &lt;font color="#bdb66b"&gt;&lt;b&gt;void&lt;/b&gt;&lt;/font&gt; setUp() &lt;font color="#bdb66b"&gt;&lt;b&gt;throws&lt;/b&gt;&lt;/font&gt; Exception {
   IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();

   &lt;font color="#84cfef"&gt;// Create a project in the runtime workspace&lt;/font&gt;
   IProject project = root.getProject( &lt;font color="#ffa2a5"&gt;&amp;quot;My-Test-Project&amp;quot;&lt;/font&gt; );
   project.create( &lt;font color="#ffa2a5"&gt;null&lt;/font&gt; );
   project.open( &lt;font color="#ffa2a5"&gt;null&lt;/font&gt; );

   &lt;font color="#84cfef"&gt;// Get a file from the test plug-in's bundle path&lt;/font&gt;
   URL url = MyTestPlugin.getDefault().getBundle().getEntry( &lt;font color="#ffa2a5"&gt;&amp;quot;/&amp;quot;&lt;/font&gt; );
   URL fileUrl = &lt;font color="#f7e78c"&gt;&lt;b&gt;new&lt;/b&gt;&lt;/font&gt; URL( url, &lt;font color="#ffa2a5"&gt;&amp;quot;resources/my-source-file.txt&amp;quot;&lt;/font&gt; );
   String filePath = FileLocator.toFileURL( fileUrl ).getFile();
   File sourceFile = &lt;font color="#f7e78c"&gt;&lt;b&gt;new&lt;/b&gt;&lt;/font&gt; File( filePath );

   &lt;font color="#84cfef"&gt;// Create a folder and file in the test workspace&lt;/font&gt;
   IFolder folder = project.getFolder( &lt;font color="#ffa2a5"&gt;&amp;quot;src&amp;quot;&lt;/font&gt; );
   folder.create( &lt;font color="#ffa2a5"&gt;false&lt;/font&gt;, &lt;font color="#ffa2a5"&gt;true&lt;/font&gt;, &lt;font color="#ffa2a5"&gt;null&lt;/font&gt; );
   IFile file = folder.getFile( &lt;font color="#ffa2a5"&gt;&amp;quot;testfile.txt&amp;quot;&lt;/font&gt; );

   &lt;font color="#84cfef"&gt;// and set its contents to the file from the plug-in&lt;/font&gt;
   file.create( &lt;font color="#f7e78c"&gt;&lt;b&gt;new&lt;/b&gt;&lt;/font&gt; FileInputStream( sourceFile ), &lt;font color="#ffa2a5"&gt;false&lt;/font&gt;, &lt;font color="#ffa2a5"&gt;null&lt;/font&gt; );
}
&lt;/pre&gt;

&lt;p&gt;You will have to delete the project in &lt;code&gt;tearDown&lt;/code&gt;.  Otherwise, the next time
&lt;code&gt;setUp&lt;/code&gt; gets called, you'll get a &lt;code&gt;ResourceException&lt;/code&gt;.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/25068230-8870823503322824316?l=ttripp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ttripp.blogspot.com/feeds/8870823503322824316/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=25068230&amp;postID=8870823503322824316' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/25068230/posts/default/8870823503322824316'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/25068230/posts/default/8870823503322824316'/><link rel='alternate' type='text/html' href='http://ttripp.blogspot.com/2006/08/working-with-workspace-in-eclipse-plug.html' title='Working with the Workspace in Eclipse Plug-in Tests'/><author><name>&lt;a href="http://toby.tripp.myopenid.com"&gt;Toby Tripp&lt;/a&gt;</name><uri>http://www.blogger.com/profile/05177254969768070178</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp0.blogger.com/_VjkjlI7xskM/R78ymnwB1jI/AAAAAAAAAAM/BIV2JIX_vmU/S220/Photo+2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-25068230.post-115488525846532517</id><published>2006-08-06T13:22:00.000-04:00</published><updated>2006-08-06T13:30:40.863-04:00</updated><title type='text'>More Eclipse Monkey</title><content type='html'>&lt;p&gt;Today's Eclipse Monkey offering is entirely selfish in its utility.  It updates the version number of any locally modified plug-ins in my workspace.&lt;/p&gt;

&lt;p&gt;I've reformatted it a bit to make it fit a &lt;em&gt;little&lt;/em&gt; better on this page.&lt;/p&gt;

&lt;pre&gt;
--- Came wiffling through the eclipsey wood ---
/*
 * Menu: Versions &gt; Update Versions of Modified Plug Ins
 * Kudos: Toby Tripp
 * License: EPL 1.0
 *
 * The Update Site URL and Feature ID of the "DOM"
 * for this script:
 * DOM: http://tripp.no-ip.org/eclipse/updates/com.ttripp.eclipsemonkey.doms
 *
 * The above DOM provides the following objects:
 *  * svn - com.ttripp.eclipsemonkey.doms.subversion.SubversionResources
 *  * pluginVersion - com.ttripp.eclipsemonkey.doms.plugins.PluginsFacade
 *
 * Note that this DOM depends on the Subclipse plug-in:
 *   http://subclipse.tigris.org/update_1.2.x
 */
 function main() {
  
    var verIndex =
       Packages.com.ttripp.eclipsemonkey.doms.plugins.PluginsFacade.UPDATE_VERSION
  
    // dirtyProjects returns an array of 
    // Subversion resources (ISVNLocalResource)
    var dirtyProjects = svn.dirtyProjects();
  
    for each( project in dirtyProjects ) {
   
       // This call will increment, by one, the third (update)
       // index of the plug-ins version number.
       pluginVersion.incrementPluginVersion( project.getResource(),
                                             verIndex );
    }
 }
--- And burbled as it ran! ---
&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/25068230-115488525846532517?l=ttripp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ttripp.blogspot.com/feeds/115488525846532517/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=25068230&amp;postID=115488525846532517' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/25068230/posts/default/115488525846532517'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/25068230/posts/default/115488525846532517'/><link rel='alternate' type='text/html' href='http://ttripp.blogspot.com/2006/08/more-eclipse-monkey.html' title='More Eclipse Monkey'/><author><name>&lt;a href="http://toby.tripp.myopenid.com"&gt;Toby Tripp&lt;/a&gt;</name><uri>http://www.blogger.com/profile/05177254969768070178</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp0.blogger.com/_VjkjlI7xskM/R78ymnwB1jI/AAAAAAAAAAM/BIV2JIX_vmU/S220/Photo+2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-25068230.post-115488464930476921</id><published>2006-08-06T13:05:00.000-04:00</published><updated>2006-08-06T13:21:56.216-04:00</updated><title type='text'>My First Eclipse Monkey Script</title><content type='html'>&lt;p&gt;My mother must be so proud...&lt;/p&gt;
&lt;p&gt;
The following bit of javascript will search the current workspace for projects that are locally modified subversion resources.  In other words, they're checked in to subversion, but need committing.  It doesn't do much with the results except to 
present a dialog box.  I'll show you later what you can do with that list.&lt;/p&gt;
&lt;p&gt;
To install the script, first you have to have &lt;a href="http://www.eclipse.org/dash/monkey-help.php?key=installing"&gt;Eclipse Monkey&lt;/a&gt; installed.  Once you've got that set up: copy the javascript below, including the jabberwocky quote surrounding it, into the clipboard.  Then, in eclipse, select the menu item "Monkey-&gt;Paste New Script" and away you go.  The script will appear in the Monkey menu.  Enjoy!&lt;/p&gt;

&lt;pre&gt;
--- Came wiffling through the eclipsey wood ---
/*
 * Menu: Versions &gt; Find Modified Projects
 * Kudos: Toby Tripp
 * License: EPL 1.0
 *
 * The Update Site URL and Feature ID of the "DOM" for this script:
 * DOM: http://tripp.no-ip.org/eclipse/updates/com.ttripp.eclipsemonkey.doms
 *
 * Note that this DOM depends on the Subclipse plug-in:
 *   http://subclipse.tigris.org/update_1.2.x
 */
 
 
 function main() {
  
  var dirtyProjects = svn.dirtyProjects();
  text = "\"Dirty\" Projects: (" + dirtyProjects.length + ")\n";
  
  for each( project in dirtyProjects ) {
   
   text += project.getIResource().getName() + "\n";
  }
  
  Packages.org.eclipse.jface.dialogs.MessageDialog.openInformation(  
        window.getShell(),  
        "Monkey Dialog", 
        text
     )
 }
 
--- And burbled as it ran! ---
&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/25068230-115488464930476921?l=ttripp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ttripp.blogspot.com/feeds/115488464930476921/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=25068230&amp;postID=115488464930476921' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/25068230/posts/default/115488464930476921'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/25068230/posts/default/115488464930476921'/><link rel='alternate' type='text/html' href='http://ttripp.blogspot.com/2006/08/my-first-eclipse-monkey-script.html' title='My First Eclipse Monkey Script'/><author><name>&lt;a href="http://toby.tripp.myopenid.com"&gt;Toby Tripp&lt;/a&gt;</name><uri>http://www.blogger.com/profile/05177254969768070178</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp0.blogger.com/_VjkjlI7xskM/R78ymnwB1jI/AAAAAAAAAAM/BIV2JIX_vmU/S220/Photo+2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-25068230.post-115132872364870257</id><published>2006-06-26T09:27:00.000-04:00</published><updated>2006-06-26T09:32:03.660-04:00</updated><title type='text'>Cell Phone Etiquette</title><content type='html'>When you first open your shiny new cell phone, it should force you to read these rules:  &lt;a href="http://waiterrant.net/?p=328"&gt;How to Use a Cellphone Without Looking Like an Asshole&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/25068230-115132872364870257?l=ttripp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ttripp.blogspot.com/feeds/115132872364870257/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=25068230&amp;postID=115132872364870257' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/25068230/posts/default/115132872364870257'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/25068230/posts/default/115132872364870257'/><link rel='alternate' type='text/html' href='http://ttripp.blogspot.com/2006/06/cell-phone-etiquette.html' title='Cell Phone Etiquette'/><author><name>&lt;a href="http://toby.tripp.myopenid.com"&gt;Toby Tripp&lt;/a&gt;</name><uri>http://www.blogger.com/profile/05177254969768070178</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp0.blogger.com/_VjkjlI7xskM/R78ymnwB1jI/AAAAAAAAAAM/BIV2JIX_vmU/S220/Photo+2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-25068230.post-115081165689205336</id><published>2006-06-20T09:54:00.000-04:00</published><updated>2006-06-20T09:54:16.943-04:00</updated><title type='text'>Editor list in 3.2</title><content type='html'>&lt;a href="http://www.eclipsezone.com/eclipse/forums/t74618.rhtml"&gt;Editor list in 3.2&lt;/a&gt;: "Open editors switching is the one thing that I really missed in Eclipse 3.1. But finally it is in 3.2. 80 words. Read More at EclipseZone"

This was a short, sweet, and -sorry- somewhat dull piece on EclipseZone until: "And remember ctrl+shift+L is your friend…"&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/25068230-115081165689205336?l=ttripp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ttripp.blogspot.com/feeds/115081165689205336/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=25068230&amp;postID=115081165689205336' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/25068230/posts/default/115081165689205336'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/25068230/posts/default/115081165689205336'/><link rel='alternate' type='text/html' href='http://ttripp.blogspot.com/2006/06/editor-list-in-32.html' title='Editor list in 3.2'/><author><name>&lt;a href="http://toby.tripp.myopenid.com"&gt;Toby Tripp&lt;/a&gt;</name><uri>http://www.blogger.com/profile/05177254969768070178</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp0.blogger.com/_VjkjlI7xskM/R78ymnwB1jI/AAAAAAAAAAM/BIV2JIX_vmU/S220/Photo+2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-25068230.post-115055760605981016</id><published>2006-06-17T10:32:00.000-04:00</published><updated>2006-08-06T13:38:20.370-04:00</updated><title type='text'>Can Microsoft Kill the iPod?</title><content type='html'>&lt;p&gt;So, iTWire -citing Reuters- is &lt;a href="http://www.itwire.com.au/content/view/4660/53/"&gt;claiming&lt;/a&gt; that &lt;a href="http://www.microsoft.com"&gt;Microsoft&lt;/a&gt; is developing an MP3 player and online music service to compete with &lt;a href="http://www.apple.com"&gt;Apple&lt;/a&gt;'s &lt;a href="http://www.apple.com/ipod/"&gt;iPod&lt;/a&gt; and &lt;a href="http://www.apple.com/itunes/"&gt;iTunes&lt;/a&gt;.  While I don't doubt that they'll try, I don't think Microsoft has it in them anymore to defeat Apple at this game.&lt;/p&gt;

&lt;p&gt;I'm sure there was a day when the modern software giant had the capability and willpower to muscle their way into the digital music market.  Joel Spolsky &lt;a href="http://joelonsoftware.com/items/2006/06/16.html"&gt;remembers&lt;/a&gt; a less bloated Microsoft:&lt;/p&gt;

&lt;blockquote&gt;June 30, 1992.

In those days, Microsoft was a lot less bureaucratic. Instead of the 11 or 12 layers of management they have today, I reported to Mike Conte who reported to Chris Graham who reported to Pete Higgins, who reported to Mike Maples, who reported to Bill. About 6 layers from top to bottom. We made fun of companies like General Motors with their eight layers of management or whatever it was.&lt;/blockquote&gt;

&lt;p&gt;That day has long passed, however.  On top of that, this week we hear that the hero of Microsoft, Bill Gates himself, is &lt;a href="
http://www.microsoft.com/presspass/press/2006/jun06/06-15CorpNewsPR.mspx"&gt;stepping down&lt;/a&gt;.  Given the company's current size and management bloat, it's easy to overestimate Gates' impact on  day-to-day operations.  His leaving at this point in time may have as much effect as the Democrats in Congress.  Even so, his leaving says a lot about the current direction of the company.  Mr. Spolsky again:&lt;/p&gt;

&lt;blockquote&gt;Bill Gates was amazingly technical. He understood Variants, and COM objects, and IDispatch and why Automation is different than vtables and why this might lead to dual interfaces. He worried about date functions. He didn't meddle in software if he trusted the people who were working on it, but you couldn't bullshit him for a minute because he was a programmer. A real, actual, programmer.

Watching non-programmers trying to run software companies is like watching someone who doesn't know how to surf trying to surf.

"It's ok! I have great advisors standing on the shore telling me what to do!" they say, and then fall off the board, again and again. The standard cry of the MBA who believes that management is a generic function. Is Ballmer going to be another John Sculley, who nearly drove Apple into extinction because the board of directors thought that selling Pepsi was good preparation for running a computer company? The cult of the MBA likes to believe that you can run organizations that do things that you don't understand.&lt;/blockquote&gt;

&lt;p&gt;I have to suspect that Mr. Gates' leaving has something to do with the modern culture in Microsoft.  You don't have to look &lt;a href="http://scobleizer.wordpress.com/"&gt;far&lt;/a&gt; for &lt;a href="http://blogs.msdn.com/philipsu/archive/2006/06/14/631438.aspx"&gt;stories&lt;/a&gt; on the internal strife and &lt;a href="http://minimsft.blogspot.com"&gt;mismanagement&lt;/a&gt; happening in Redmond.  From a &lt;a href="http://blogs.msdn.com/philipsu/archive/2006/06/14/631438.aspx"&gt;post&lt;/a&gt; by Mr. Philip Su:&lt;/p&gt;
&lt;blockquote&gt;Imagine each little email you send asking someone else to fill out a spreadsheet, comment on a report, sign off on a decision -- is a little neutron shooting about in space.  Your innocent-seeming little neutron now causes your heretofore mostly-harmless neighbors to release neutrons of their own.  Now imagine there are 9000 of you, all jammed into a tight little space called Redmond.  It's Windows Gone Thermonuclear, a phenomenon by which process engenders further process, eventually becoming a self-sustaining buzz of fervent destructive activity.&lt;/blockquote&gt;

&lt;p&gt;This is the culture of the modern Microsoft.  This is the giant, tripping over its own feet, that plans to take on what is perhaps the most successful personal music player in history.  Apple succeeds with the iPod largely because of their focus on form and elegance.  Apple thinks hard about the user experience.  Microsoft thinks only of the bottom line.  Blake Ross laments the Microsoft attitude toward users in this &lt;a href="http://blakeross.com/2006/06/06/how-to-hear-without-listening/"&gt;plea&lt;/a&gt; to Microsoft employees:&lt;/p&gt;
&lt;blockquote&gt;Then I see the IE7 homepage proclaiming that “we heard you” and I just get furious. I get furious because I know that “you” isn’t really you, grandpa, Meredith, Jamie, Fletcher, Matt, Mike, Phil, it can’t be, because you complained for years and nobody heard you. It’s not you; it’s us. It’s Firefox, Safari, Opera, Flock, Maxthon. Only the drip drip of leaky marketshare echoes in Redmond.

I know this is just the game, know that the IE marketing team wrote that sales pitch. The pitch I’m writing now isn’t to them but to the developers. You are working at a company that finds positive impact a mere side effect of competitive destruction.  In thirty years, do you want to look back and think “I did that” or “I stopped that company from doing that”?

I urge you to find a company that truly listens to them, not us. It is much more rewarding.&lt;/blockquote&gt;

&lt;p&gt;"Positive impact a mere side effect of competitive destruction."  This is the face of Microsoft.  At least, this is how they're perceived.  Given this face, you'd expect the Redmond campus to be staffed by legions of gremlins, goblins, and parodies of Dr. Evil.  I think we all know that's not the case, but the emergent behavior of all those kind, well meaning, intelligent people is what we see and react to.&lt;/p&gt;

&lt;p&gt;Sure, Microsoft has nearly endless supplies of capital to throw at Apple.  They're massive enough to fight simply by throwing their mass around.  I imagine soon we'll see a media marketing blitz like none we've seen since the release of Windows 95.  I simply ask the question: is it enough this time?&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/25068230-115055760605981016?l=ttripp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ttripp.blogspot.com/feeds/115055760605981016/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=25068230&amp;postID=115055760605981016' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/25068230/posts/default/115055760605981016'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/25068230/posts/default/115055760605981016'/><link rel='alternate' type='text/html' href='http://ttripp.blogspot.com/2006/06/can-microsoft-kill-ipod.html' title='Can Microsoft Kill the iPod?'/><author><name>&lt;a href="http://toby.tripp.myopenid.com"&gt;Toby Tripp&lt;/a&gt;</name><uri>http://www.blogger.com/profile/05177254969768070178</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp0.blogger.com/_VjkjlI7xskM/R78ymnwB1jI/AAAAAAAAAAM/BIV2JIX_vmU/S220/Photo+2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-25068230.post-114900872130054769</id><published>2006-05-30T13:02:00.000-04:00</published><updated>2006-05-30T13:05:21.310-04:00</updated><title type='text'>Maven 2: I Need to Try This</title><content type='html'>Feel this pain much?

&lt;blockquote&gt;Dependency management has a long tradition of being a complicated mess for anything but the most trivial of projects. "Jarmageddon" quickly ensues as the dependency tree becomes huge, complicated, and embarrassing to architects who are scorned by new graduates who "totally could have done it better." "Jar Hell" follows, where versions of dependencies on one system are not quite the same versions as those used for development; they have either the wrong version or conflicting versions between similarly named JARs. Hence, things begin breaking and pinpointing why proves difficult. Maven solves both of these problems by having a common local repository from which to link to the correct projects, versions and all.&lt;/blockquote&gt;  From an &lt;a href="http://www.javaworld.com/javaworld/jw-05-2006/jw-0529-maven.html"&gt;article&lt;/a&gt; by Eric Redmond.

Yet another tool I need to try ... sigh.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/25068230-114900872130054769?l=ttripp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ttripp.blogspot.com/feeds/114900872130054769/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=25068230&amp;postID=114900872130054769' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/25068230/posts/default/114900872130054769'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/25068230/posts/default/114900872130054769'/><link rel='alternate' type='text/html' href='http://ttripp.blogspot.com/2006/05/maven-2-i-need-to-try-this.html' title='Maven 2: I Need to Try This'/><author><name>&lt;a href="http://toby.tripp.myopenid.com"&gt;Toby Tripp&lt;/a&gt;</name><uri>http://www.blogger.com/profile/05177254969768070178</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp0.blogger.com/_VjkjlI7xskM/R78ymnwB1jI/AAAAAAAAAAM/BIV2JIX_vmU/S220/Photo+2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-25068230.post-114848153581066357</id><published>2006-05-24T10:29:00.000-04:00</published><updated>2006-05-24T10:38:55.823-04:00</updated><title type='text'>A History Lesson</title><content type='html'>&lt;p&gt;By wandering around the &lt;a href="http://c2.com/cgi/wiki"&gt;original wiki&lt;/a&gt;, you can read many conversations that have informed modern software development.  Try reading &lt;a href="http://c2.com/cgi/wiki?CodeSmell"&gt;Code Smell&lt;/a&gt;, or &lt;a href="http://c2.com/cgi/wiki?OneResponsibilityRule"&gt;One Responsibility Rule&lt;/a&gt;, or even take a look at the birth of &lt;a href="http://c2.com/cgi/wiki?ExtremeProgrammingRoadmap"&gt;Extreme Programming&lt;/a&gt;. If you're at all interested in the ideas that formed and support these principles of object-oriented programming, it's a very interesting place to roam and read.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/25068230-114848153581066357?l=ttripp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ttripp.blogspot.com/feeds/114848153581066357/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=25068230&amp;postID=114848153581066357' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/25068230/posts/default/114848153581066357'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/25068230/posts/default/114848153581066357'/><link rel='alternate' type='text/html' href='http://ttripp.blogspot.com/2006/05/history-lesson.html' title='A History Lesson'/><author><name>&lt;a href="http://toby.tripp.myopenid.com"&gt;Toby Tripp&lt;/a&gt;</name><uri>http://www.blogger.com/profile/05177254969768070178</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp0.blogger.com/_VjkjlI7xskM/R78ymnwB1jI/AAAAAAAAAAM/BIV2JIX_vmU/S220/Photo+2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-25068230.post-114747687625783218</id><published>2006-05-12T19:24:00.000-04:00</published><updated>2006-05-12T19:34:36.273-04:00</updated><title type='text'>A Project to Manage Eclipse Workspaces</title><content type='html'>I found this from reading the &lt;a href="http://eclipse-projects.blogspot.com/2006/05/buckminster-for-monkey.html"&gt;Open Source at Eclipse Blog&lt;/a&gt; (generally an excellent read, by the way).  There is an eclipse project for bundling projects together, possibly from various sources, into a single eclipse workspace.  The project is called &lt;a href="http://www.eclipse.org/buckminster/"&gt;Buckminster&lt;/a&gt; and certainly looks worth a try.  See the project's home page and the referenced blog post for more details.

(Hmm, I just discovered that Camino won't spell-check my form ... hm.  Perhaps it's time to once again consider Safari. :-/ )&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/25068230-114747687625783218?l=ttripp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ttripp.blogspot.com/feeds/114747687625783218/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=25068230&amp;postID=114747687625783218' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/25068230/posts/default/114747687625783218'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/25068230/posts/default/114747687625783218'/><link rel='alternate' type='text/html' href='http://ttripp.blogspot.com/2006/05/project-to-manage-eclipse-workspaces.html' title='A Project to Manage Eclipse Workspaces'/><author><name>&lt;a href="http://toby.tripp.myopenid.com"&gt;Toby Tripp&lt;/a&gt;</name><uri>http://www.blogger.com/profile/05177254969768070178</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp0.blogger.com/_VjkjlI7xskM/R78ymnwB1jI/AAAAAAAAAAM/BIV2JIX_vmU/S220/Photo+2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-25068230.post-114675101286906526</id><published>2006-05-04T09:50:00.000-04:00</published><updated>2006-05-04T10:00:03.830-04:00</updated><title type='text'>Eclipse Plugins</title><content type='html'>Some must-have plugins for &lt;a href="http://www.eclipse.org/downloads"&gt;Eclipse&lt;/a&gt;, including their update sites:
&lt;h2&gt;Mylar&lt;/h2&gt;I'll let them describe themselves.
&lt;blockquote&gt;&lt;a href="http://www.eclipse.org/mylar/index.php"&gt;Mylar&lt;/a&gt; is a task focused UI for Eclipse that makes working with very large workspaces as easy as working with small ones. It supports task management and monitors your work activity to identify information relevant to the task-at-hand. Mylar uses this task context to focus the Eclipse UI on the interesting information, hide the uninteresting, and automatically find what's related. This puts the information you need to get work done at your fingertips and improves productivity by reducing searching, scrolling, and navigation. By making task context explicit Mylar also facilitates multitasking, planning, reusing past efforts, and sharing expertise.&lt;/blockquote&gt;
Eclipse 3.2RC2: http://download.eclipse.org/technology/mylar/update-site/e3.2
Eclipse 3.1.x: http://download.eclipse.org/technology/mylar/update-site/e3.1
&lt;h2&gt;Subclipse&lt;/h2&gt;Subversion plugin.

Eclipse 3.x: http://subclipse.tigris.org/update_1.0.x&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/25068230-114675101286906526?l=ttripp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ttripp.blogspot.com/feeds/114675101286906526/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=25068230&amp;postID=114675101286906526' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/25068230/posts/default/114675101286906526'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/25068230/posts/default/114675101286906526'/><link rel='alternate' type='text/html' href='http://ttripp.blogspot.com/2006/05/eclipse-plugins.html' title='Eclipse Plugins'/><author><name>&lt;a href="http://toby.tripp.myopenid.com"&gt;Toby Tripp&lt;/a&gt;</name><uri>http://www.blogger.com/profile/05177254969768070178</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp0.blogger.com/_VjkjlI7xskM/R78ymnwB1jI/AAAAAAAAAAM/BIV2JIX_vmU/S220/Photo+2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-25068230.post-114618503317331585</id><published>2006-04-27T20:37:00.000-04:00</published><updated>2006-04-27T20:49:16.623-04:00</updated><title type='text'>There It Is...</title><content type='html'>&lt;p&gt;
&lt;a href="http://www.relevancellc.com/blogs/?p=83"&gt;There's&lt;/a&gt; the idea, the meme  (via &lt;a href="http://redsquirrel.com/cgi-bin/dave/2005/12/22#i.prefer"&gt;Dave Hoover's Blog&lt;/a&gt;).  If only I could have articulated it so effectively.  Oh well, I suppose I need more practice.  I used to write so much better before the Army.  I did it once, I'm somewhat confident I can do it again ... unless I'm too old.  Anyway, my mind wanders again (is that age?).  Mr. Hoover references the following quote: (I believe from Justin Gehtland)
&lt;/p&gt;
&lt;blockquote&gt;
The "safe language" argument appeals to fear, while the "flexible language" argument appeals to a sense of opportunity and adventure. Both are powerful motivations, so for a long time this argument has been a stalemate. Happily, that period is coming to an end. Two new factors have come into play: automated testing and transparency. Over the next five years they will turn the balance totally in the favor of more flexible languages.
&lt;/blockquote&gt;
&lt;p&gt;
I have a bit more to say about this, but I think I'll mull it over a bit more first.  It's a loaded subject.
&lt;/p&gt;
&lt;p&gt;
On the subject of dynamic languages: the new apartment is mostly unpacked, so I hope to find some more time to play with Ruby and Ruby on Rails.  Between RoR and Eclipse Monkey, I'm like a kid with way too many toys.  I have to apologize to all the gracious folks from CitCon that I promised to contact, it's been a bit hectic.
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/25068230-114618503317331585?l=ttripp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ttripp.blogspot.com/feeds/114618503317331585/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=25068230&amp;postID=114618503317331585' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/25068230/posts/default/114618503317331585'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/25068230/posts/default/114618503317331585'/><link rel='alternate' type='text/html' href='http://ttripp.blogspot.com/2006/04/there-it-is.html' title='There It Is...'/><author><name>&lt;a href="http://toby.tripp.myopenid.com"&gt;Toby Tripp&lt;/a&gt;</name><uri>http://www.blogger.com/profile/05177254969768070178</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp0.blogger.com/_VjkjlI7xskM/R78ymnwB1jI/AAAAAAAAAAM/BIV2JIX_vmU/S220/Photo+2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-25068230.post-114485327168540175</id><published>2006-04-12T10:37:00.000-04:00</published><updated>2006-04-12T11:27:25.703-04:00</updated><title type='text'>Agile ROI</title><content type='html'>Via &lt;a href="http://exceptionz.blogspot.com/2006/04/return-on-investment-for-agile.html"&gt;Maruis Marais:&lt;/a&gt;

&lt;a href="http://www.thoughtworks.com"&gt;Thoughtworks&lt;/a&gt; (one of the gracious sponsors of &lt;a href="http://www.citconf.com/"&gt;CitCon&lt;/a&gt;) commissioned Forrester Research to study the return on investment of their &lt;a href="http://agilemanifesto.org/"&gt;Agile&lt;/a&gt; practices.  They've published their results &lt;a href="http://www.thoughtworks.com/TEI-report.html"&gt;here&lt;/a&gt;.

The results are &lt;em&gt;very&lt;/em&gt; encouraging.  For example:
&lt;blockquote&gt;Client: Four Fortune 500 Companies
&lt;p&gt;Results:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Improved time to benefit by 69%
&lt;/li&gt;&lt;li&gt;Reduced cost by 57%
&lt;/li&gt;&lt;li&gt;Reduced effort by 62%
&lt;/li&gt;&lt;li&gt;Reduced critical defects by nearly 80%
&lt;/li&gt;&lt;li&gt;Reduced overall defects by more than 60%&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Participants in the study indicated they realized or expected to realize 29    to 66 percent risk-adjusted return on investment over three years using ThoughtWorks'    agile development approach.&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;This is not surprising to those of us who've already had a taste of the Agile kool-aide, but hard numbers may help swing some skeptics.&lt;/p&gt;&lt;p&gt;These numbers show why we should do Agile.  More value per unit investment.  Moreover, the value is returned earlier in the development cycle.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/25068230-114485327168540175?l=ttripp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ttripp.blogspot.com/feeds/114485327168540175/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=25068230&amp;postID=114485327168540175' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/25068230/posts/default/114485327168540175'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/25068230/posts/default/114485327168540175'/><link rel='alternate' type='text/html' href='http://ttripp.blogspot.com/2006/04/agile-roi.html' title='Agile ROI'/><author><name>&lt;a href="http://toby.tripp.myopenid.com"&gt;Toby Tripp&lt;/a&gt;</name><uri>http://www.blogger.com/profile/05177254969768070178</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp0.blogger.com/_VjkjlI7xskM/R78ymnwB1jI/AAAAAAAAAAM/BIV2JIX_vmU/S220/Photo+2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-25068230.post-114478844972572224</id><published>2006-04-11T16:37:00.000-04:00</published><updated>2006-04-11T16:47:29.740-04:00</updated><title type='text'>Need</title><content type='html'>This  made me smile.  It's apparently a portion of a conversation held on the ruby-lang IRC channel.  I saw it on zenspider's &lt;a href="http://blog.zenspider.com/archives/2006/03/rubylang.html"&gt;blog&lt;/a&gt;.
&lt;blockquote&gt;&amp;lt;zenspider&amp;gt; singletons are almost always a sign of bad design.
&amp;lt;suryam&amp;gt; but i need it in my design... [...]
&amp;lt;zenspider&amp;gt; "need" is almost always a sign of bad thought.&lt;/blockquote&gt;Classic.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/25068230-114478844972572224?l=ttripp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ttripp.blogspot.com/feeds/114478844972572224/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=25068230&amp;postID=114478844972572224' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/25068230/posts/default/114478844972572224'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/25068230/posts/default/114478844972572224'/><link rel='alternate' type='text/html' href='http://ttripp.blogspot.com/2006/04/need.html' title='Need'/><author><name>&lt;a href="http://toby.tripp.myopenid.com"&gt;Toby Tripp&lt;/a&gt;</name><uri>http://www.blogger.com/profile/05177254969768070178</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp0.blogger.com/_VjkjlI7xskM/R78ymnwB1jI/AAAAAAAAAAM/BIV2JIX_vmU/S220/Photo+2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-25068230.post-114435259133092883</id><published>2006-04-06T15:40:00.000-04:00</published><updated>2006-04-06T15:43:11.330-04:00</updated><title type='text'>CitCon</title><content type='html'>Heading off to Chicago tonight to attend CITCon ( &lt;a href="http://www.citconf.com/"&gt;http://www.citconf.com&lt;/a&gt; ).  Should be fun.  If not, Lydia and I really enjoy visiting Chicago.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/25068230-114435259133092883?l=ttripp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ttripp.blogspot.com/feeds/114435259133092883/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=25068230&amp;postID=114435259133092883' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/25068230/posts/default/114435259133092883'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/25068230/posts/default/114435259133092883'/><link rel='alternate' type='text/html' href='http://ttripp.blogspot.com/2006/04/citcon.html' title='CitCon'/><author><name>&lt;a href="http://toby.tripp.myopenid.com"&gt;Toby Tripp&lt;/a&gt;</name><uri>http://www.blogger.com/profile/05177254969768070178</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp0.blogger.com/_VjkjlI7xskM/R78ymnwB1jI/AAAAAAAAAAM/BIV2JIX_vmU/S220/Photo+2.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-25068230.post-114428000350556109</id><published>2006-04-05T19:32:00.000-04:00</published><updated>2006-04-05T19:33:23.513-04:00</updated><title type='text'>You Must Be So Proud...</title><content type='html'>Saw this bumper sticker on my long drive home:
&lt;blockquote&gt;My gamer fragged your honor student&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/25068230-114428000350556109?l=ttripp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ttripp.blogspot.com/feeds/114428000350556109/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=25068230&amp;postID=114428000350556109' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/25068230/posts/default/114428000350556109'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/25068230/posts/default/114428000350556109'/><link rel='alternate' type='text/html' href='http://ttripp.blogspot.com/2006/04/you-must-be-so-proud.html' title='You Must Be So Proud...'/><author><name>&lt;a href="http://toby.tripp.myopenid.com"&gt;Toby Tripp&lt;/a&gt;</name><uri>http://www.blogger.com/profile/05177254969768070178</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp0.blogger.com/_VjkjlI7xskM/R78ymnwB1jI/AAAAAAAAAAM/BIV2JIX_vmU/S220/Photo+2.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-25068230.post-114424321787553165</id><published>2006-04-05T09:18:00.000-04:00</published><updated>2006-04-05T12:54:35.423-04:00</updated><title type='text'></title><content type='html'>This popped up on the XP mailing list last week.  I don't think I could agree more.

&lt;blockquote&gt;My experience is that the single greatest risk in a software development project is building the wrong software.  The money saved by reducing costs is miniscule compared to how much you are risking by building the wrong system (or even building a few features nobody needs).  No matter how many SMEs and proxy customers you involve, and no matter how many prototypes and models you build, there is no better way to determine if you are building the right software for your market than the earliest possible release of working software to real end users.
&lt;br/&gt;&lt;br/&gt;
Steven Gordon&lt;/blockquote&gt;

Too often is seems that software teams introduce tools and extra processes to try and make sure they're building the right software before they start.  How long will it be until we learn that this strategy doesn't work cost effectively?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/25068230-114424321787553165?l=ttripp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ttripp.blogspot.com/feeds/114424321787553165/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=25068230&amp;postID=114424321787553165' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/25068230/posts/default/114424321787553165'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/25068230/posts/default/114424321787553165'/><link rel='alternate' type='text/html' href='http://ttripp.blogspot.com/2006/04/this-popped-up-on-xp-mailing-list-last.html' title=''/><author><name>&lt;a href="http://toby.tripp.myopenid.com"&gt;Toby Tripp&lt;/a&gt;</name><uri>http://www.blogger.com/profile/05177254969768070178</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp0.blogger.com/_VjkjlI7xskM/R78ymnwB1jI/AAAAAAAAAAM/BIV2JIX_vmU/S220/Photo+2.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-25068230.post-114418002301297540</id><published>2006-04-04T15:33:00.000-04:00</published><updated>2006-04-05T19:45:38.513-04:00</updated><title type='text'>File search and replace with Perl</title><content type='html'>So, I want to search a bunch of files and do some text substitution.  This is a fairly common task, but I can never remember how to do it.  Here's how:

In Perl:
&lt;pre&gt;&lt;code&gt;perl -pi.bak -e 's/FindThis/AndReplaceItWithThis/g' *.fileExtension&lt;/code&gt;&lt;/pre&gt;

This will do the substitution "in place," backing up the original file with a copy having the .bak extension.  If you're brave, you can leave off the .bak extension and no backup will be made.

I don't remember just now how to do the equivalent in Ruby, I'll come back and update this when I get a chance.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/25068230-114418002301297540?l=ttripp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ttripp.blogspot.com/feeds/114418002301297540/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=25068230&amp;postID=114418002301297540' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/25068230/posts/default/114418002301297540'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/25068230/posts/default/114418002301297540'/><link rel='alternate' type='text/html' href='http://ttripp.blogspot.com/2006/04/file-search-and-replace-with-perl.html' title='File search and replace with Perl'/><author><name>&lt;a href="http://toby.tripp.myopenid.com"&gt;Toby Tripp&lt;/a&gt;</name><uri>http://www.blogger.com/profile/05177254969768070178</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp0.blogger.com/_VjkjlI7xskM/R78ymnwB1jI/AAAAAAAAAAM/BIV2JIX_vmU/S220/Photo+2.jpg'/></author><thr:total>0</thr:total></entry></feed>
