<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/css" href="/stylesheets/rss.css"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/">
  <channel>
    <title>Eitan Suez's Home: Category Programming</title>
    <link>http://u2d.com/articles/category/programming</link>
    <language>en-us</language>
    <ttl>40</ttl>
    <description></description>
    <item>
      <title>&amp;quot;On the advent of new technologies&amp;quot;..or perhaps..&amp;quot;Breaking new ground&amp;quot;</title>
      <description>&lt;p&gt;I remember around 2001 I was working on the user interface for a project (which I later open-sourced) for browsing javadocs that had been stuffed into a relational database.  The UI was very advanced for its time, employing css, javascript and "dhtml"  (as it was called in those days).  I was quite satisfied with the end result, with one exception.  The ui looked great.  Most pages (for example a page presenting information about a class) were laid out as a tabbed pane.  Most of the tabs were prepopulated with information from a single http query.  But the last tab actually required a trip back to the server.  It's a problem that bothered me, but that I didn't pursue a solution for.  Had I done precisely that, I would have come to the conclusion that I needed an AJAX call, and would have likely started using and exploiting AJAX in user interfaces perhaps as early as 2001-2002.  Instead, I just watched the phenomenon happen a few years later.&lt;/p&gt;

&lt;p&gt;Separately, I recall when speaking on the NFJS conference circuit, developing a talk on CSS.  At the time the state of things was not so rosy.  This was before the days of the javascript frameworks.  As I developed my materials, I'd created a site that I called the "CSS repertoire," (see http://u2d.com/css/ ) that exposed my thoughts and various UI design patterns that I'd collected.  Most of those lessons I'd learned as early as 2001.  In some of the essays on that site, I complained that the power of CSS selectors should be accessible from javascript, and should not be strictly the domain of styling;  that it had broader applicability, and that it was a focal issue that needed to be addressed.  I had little hope that the standards makers and browser makers would react to this need in a timely fashion (they have yet to do so), and believed that this gap should be filled by them.  Again, rather than tackle the problem, I sat back and watched how others addressed this problem directly in javascript frameworks such as jquery, which today fill that gap.&lt;/p&gt;

&lt;p&gt;What's the moral of the story, perhaps besides the fact that I'm a lazy bastard?  Well, I think I can draw a number of related points here:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;innovation comes out of tackling the problems one confronts when one comes up against an obstacle,
 something that the current technology does not address;  these may be "last-mile" problems, not essential to the success of the project at hand;&lt;/li&gt;
&lt;li&gt;one must be involved actively in projects and building the systems of today.  it is out of this work that today's problems are identified, and present a path for building the technologies of tomorrow;&lt;/li&gt;
&lt;li&gt;don't leave well-enough alone:  one must have that sort of mind that's obsessed with perfection:  "Yes, the system works well enough, but observe this flaw &lt;em&gt;here&lt;/em&gt;.  Why is this solution not satisfactory?  What's the root problem?  Why don't we have a solution for it?  What's the required solution?"  and finally.."Let's go for it!"&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;As a related example, I recall watching the now famous google wave video that came out of the google i/o conference 2009.  This innovation precisely came out of this tenet of "don't leave well-enough alone."  GMail is great.  But they realized that it could be done better.  They identified aspects of GMail such as modeling discussion threads, and asked themselves some very important questions, but mainly:  "Can it be done better?  Is there a simpler or more elegant solution?"  etc..  And what they came up with and presented at google i/o did not disappoint.&lt;/p&gt;

&lt;p&gt;I believe that there still remain many stones that have not been "turned over," so to speak;  many opportunities for improving the state of the art in business applications development.  What will I or you do differently this time to not become just a witness to the phenomenon, but to play an active role in making it happen?&lt;/p&gt;</description>
      <pubDate>Wed, 19 Aug 2009 14:05:00 -0500</pubDate>
      <guid isPermaLink="false">urn:uuid:3234338f-d7f9-46df-a3e4-0f8f4527fa07</guid>
      <author>Eitan</author>
      <link>http://u2d.com/articles/2009/08/19/on-the-advent-of-new-technologies-or-perhaps-breaking-new-ground</link>
      <category>Programming</category>
    </item>
    <item>
      <title>MVC without leaks implies generic VC</title>
      <description>&lt;p&gt;How many times have we heard or preached (or both) the important lesson of not having our business logic "leak" into the client tier.  Each time we hear it, we nod our heads and say "how true," and get serious for a moment.&lt;/p&gt;

&lt;p&gt;The idea of logic leaks applies to other aspects of development, not just the client tier.  For example, the Hibernate project is very concerned about not leaking persistence issues to other application tiers.&lt;/p&gt;

&lt;p&gt;As I was thinking about this notion of business logic leakage, a very interesting thought came to me.  Say for example that we define a business object, maybe a &lt;code&gt;Customer.&lt;/code&gt;  Furthermore, let's say we define a number of fields on this object:  name, date of birth, etc..  The minute we put down in our text editor the lines:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;lt;caption&amp;gt;Name:&amp;lt;/caption&amp;gt;
&amp;lt;input type="text" name="name" /&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;..is the minute we've crossed the line;  we have violated the DRY principle.  We have just leaked business logic into our view.  From now on, if we rename the field, we must do it in two places:  in the model and in the view.&lt;/p&gt;

&lt;p&gt;Now, imagine being in the process of developing an application consisting of a dozen business objects, each with a half dozen fields.  Model changes are going to occur.  They're going to imply making changes in more than one place.&lt;/p&gt;

&lt;p&gt;Given this, it's no wonder that resistance to change grows as a project gets larger.  Yet business change is inevitable.  People talk about the high cost of building software.  It's no wonder the cost is high if we have to manually make each change twice.  Not only is it more work but also error-prone.  The essence of DRY is eliminating that duplication.&lt;/p&gt;

&lt;p&gt;So, having provided a context, I can finally describe this small epiphany I have had in a short sentence:&lt;/p&gt;

&lt;blockquote&gt;
    &lt;p&gt;*If we're going to have a model-view-controller system 
    without business logic leaking into the view, then we 
    must construct generic views and controllers.*&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;What does that mean?  Take for example, the CRUD scaffold generators in Rails.  The code duplication is still there but at least the duplication is automated.  Admittedly not bad for a first pass.&lt;/p&gt;

&lt;p&gt;The other interesting tidbit that sort of "falls out" of this small thought exercise is:&lt;/p&gt;

&lt;blockquote&gt;
    &lt;p&gt;&lt;em&gt;GUI is plumbing&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I've been saying this for a couple of years now but it is still my hope that some day everyone will have good GUI plumbing for their software applications.&lt;/p&gt;</description>
      <pubDate>Mon, 01 May 2006 13:44:00 -0500</pubDate>
      <guid isPermaLink="false">urn:uuid:28445ce3956cfcbc83f793986d27a23b</guid>
      <author>Eitan</author>
      <link>http://u2d.com/articles/2006/05/01/mvc-without-leaks-implies-generic-vc</link>
      <category>Programming</category>
    </item>
    <item>
      <title>Stoked: Not Just for Surfers Anymore</title>
      <description>&lt;p&gt;I sometimes enjoy describing feelings a software developer might experience, at certain moments during development.   For example, a while back I blogged about &lt;a href="http://weblogs.java.net/blog/eitan/archive/2005/05/grazie_signore.html"&gt;"Grazie Signore" moments&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;This past weekend I attended the Northern Virginia Software Symposium and was fortunate to have a little time to spend with my NFJS comrades.  A most vivid comment that Justin Gehtland made during one discussion was how stoked he was about this software we were discussing.&lt;/p&gt;

&lt;p&gt;It occurred to me on the plane ride back to Austin that the term "stoked" is normally used to describe the feeling one gets when surfing.  Perhaps it's also applied in the context of extreme-sports related activity.&lt;/p&gt;

&lt;p&gt;To my wonder, the term could be applied, and very aptly so, to moments that we, geek software developers, have in our work.  That feeling arises when we do something that we think is extremely cool, that perhaps hasn't really been done in that particular way.  For example, I sensed that feeling when reading a weblog I came across on java.net a while back, having to do with a very cool idea that occurred to one of the &lt;a href="http://wicket.sourceforge.net/"&gt;Wicket Framework&lt;/a&gt; developers.  See &lt;a href="http://weblogs.java.net/blog/timboudreau/archive/2006/02/wicket_swing_hm_1.html"&gt;Wicket + Swing == hmmm...interesting...&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;I believe that this feeling is the driving force behind the hordes of us out there, of any age, who spend their spare time coding, pursuing the creation of something that, to them, is so incredibly cool.  So, just like surfers can't stop surfing and continually strive to be in that most special state of being stoked, so do software developers.&lt;/p&gt;</description>
      <pubDate>Mon, 01 May 2006 13:14:00 -0500</pubDate>
      <guid isPermaLink="false">urn:uuid:5beb3b747c428ae6317211781e7526f5</guid>
      <author>Eitan</author>
      <link>http://u2d.com/articles/2006/05/01/stoked-not-just-for-surfers-anymore</link>
      <category>Programming</category>
    </item>
    <item>
      <title>Always the web..</title>
      <description>&lt;p&gt;I'm not sure where to begin on this one as too many thoughts are flooding me at the same time.&lt;/p&gt;

&lt;p&gt;I recall doing web intensely in the mid 90's and being way ahead of the curve with things such as javascript.  In the last couple of years, I have essentially dropped out of working the web, so to speak, focusing instead on the world of Java Swing.&lt;/p&gt;

&lt;p&gt;Does anyone remember Netscape's effort to create the perfect platform for developing web applications?  It was based on client-side javascript + server-side javascript.  Of course, it went nowhere and I doubt many will remember this technology.  Marketing-wise, everything they did was called live-something-or-other, as in livescript, liveconnect, and what not.&lt;/p&gt;

&lt;p&gt;In hindsight, they were sooo close!  Today javascript on the client side is more popular than mickey mouse.  And on the server side, we're seeing ruby fulfill what netscape was trying to do with server-side javascript.  In fact, when I think of it, that would have been even sweeter:  a single language for doing both client and server side stuff.  That would have made things a little less confusing.&lt;/p&gt;

&lt;p&gt;Who would have thought it would take ten years?&lt;/p&gt;

&lt;p&gt;Another 'who would have thought' moment:  consider how slowly standards development efforts in the area of css has been.  Over a year ago I was asking for the abilitiy to utilize css selectors in code, like we do in stylesheets.  We were asking for missing features such as getElementsByClassName.  Today, ajax and prototype.js give us all of that stuff, totally short-circuiting standards;  a testament to the fact that with highly dynamic languages, you don't have to wait on the language makers any longer.&lt;/p&gt;

&lt;p&gt;Focus pays off.  I have always been too curious for my own good.  Had I only stuck to the stupid javascript coding I was doing ten years ago, I could have been defining this ajax wave, instead of watching it go by.  There you have it, a public confession.&lt;/p&gt;</description>
      <pubDate>Tue, 07 Mar 2006 20:27:00 -0600</pubDate>
      <guid isPermaLink="false">urn:uuid:628e39f63027fb0bb681c185dba209d8</guid>
      <author>Eitan</author>
      <link>http://u2d.com/articles/2006/03/07/totally-shocked</link>
      <category>Programming</category>
    </item>
    <item>
      <title>QtRuby</title>
      <description>&lt;p&gt;I just read the Pragmatic Friday on QtRuby:  coding Qt client applications with Ruby.&lt;/p&gt;

&lt;p&gt;On the good side:&lt;/p&gt;

&lt;p&gt;I believe toolkits such as KDE to be much richer in terms of numbers and variety of widgets when compared to Swing.  This could save a developer a terrific amount of time.&lt;/p&gt;

&lt;p&gt;It's also terrific to see that one doesn't have to code in C++ to actually employ this library.  So, a real Kudos for QtRuby.&lt;/p&gt;

&lt;p&gt;Two observations:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;the signal/slot mechanism really does not utilize the strengths of the ruby language.&lt;/p&gt;

&lt;p&gt;in rails, you can say:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;before_filter :method_name
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;and in ruby in general, one can do all kinds of neat things with code blocks besides.&lt;/p&gt;

&lt;p&gt;in javascript, one connects a signal to a slot like this:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;button.onclick = method_name
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;then why on earth should i choose to do this instead:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;connect(button, SIGNAL("onclick()"), 
  some_other_obj_ref, SLOT("method_name()"))
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;???&lt;/p&gt;

&lt;p&gt;on the other hand, i do really like the choice of metaphor
used in qt:  the metaphor of a signal.  maybe it's because
i have some kind of background in electrical engineering,
but probably not.  anyhow, i like it.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;my initial feeling about qtruby is that the divide between
the c++ world of qt and the ruby language is not transparent;
one notices it.  i wonder to what extent this might be an 
issue when developing a full-fledged system.  &lt;/p&gt;

&lt;p&gt;so what i'm trying to say is that i'm not certain if 
qt and ruby are exactly a *marriage made in heaven).
i'm not sure what the "best" solution is.&lt;/p&gt;

&lt;p&gt;I qualify these comments with 'initial feelings,' and what I mean to imply is that I could [very well indeed] be completely wrong about this.&lt;/p&gt;

&lt;p&gt;full-featured, cross platform widget libraries are not
exactly a dime a dozen, i understand.  so yes, there's gtk
and there's qt, and there's swing, and there's swt.  but
one can't magically say tomorrow, there'll be a ruby-native
widget library.  i know some swing, and now just a little
tiny bit of qt.  i don't know swt or gtk/glade at the moment.&lt;/p&gt;

&lt;p&gt;so far, my scale gives more weight to java + swing over
ruby + qt, even if ruby holds a few language gems that are
absent in the java language.  it's also nice to see that
java has been narrowing the gap with its language improvements
in v5;  specifically:  annotations and enumerations.  i still
believe that java needs:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;a stronger, richer, cleaner, simpler metamodel (reflection),
and&lt;/li&gt;
&lt;li&gt;facilities in its syntax for making the use of that metamodel
completely transparent, like it is in smalltalk&lt;/li&gt;
&lt;/ol&gt;&lt;/li&gt;
&lt;/ol&gt;</description>
      <pubDate>Wed, 15 Feb 2006 09:57:00 -0600</pubDate>
      <guid isPermaLink="false">urn:uuid:7894685e6ab1e415219d593148a27c20</guid>
      <author>Eitan</author>
      <link>http://u2d.com/articles/2006/02/15/qtruby</link>
      <category>Programming</category>
    </item>
    <item>
      <title>The Java+XML Conundrum</title>
      <description>&lt;p&gt;One must applaud Bob Lee for saying what many of us never dared to:  &lt;a href="http://crazybob.org/2006/01/i-dont-get-spring.html"&gt;I don't get Spring&lt;/a&gt;.  I think many of us for a long time did not grok Spring either but were afraid to say it.  Everything has a reason to exist and Spring is no exception.&lt;/p&gt;

&lt;p&gt;I believe today I grok Spring a little better than before, but I'm not sure.  Below is a snapshot of my continously morphing hypothesis, as it stands today, on January 31 2006.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Spring solves a number of issues that derive from a not-as-natively-implemented feature of the Java language:  closures.  In smalltalk, ruby, and JavaScript, treating a method as an object is a much more common thing.  And thus using a method as an object is much more commonplace.  So things such as Spring's *Template classes are altogether unnecessary unless you're working in Java.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;One of the end results of applying Spring to a project is a combination of Java and XML.  You inevitably end up with two languages instead of one.  Interestingly, this aspect of Spring is directly related to a blog I wrote recently (two weeks ago, to be exact): &lt;a href="http://weblogs.java.net/blog/eitan/archive/2006/01/skip_the_compil.html"&gt;Skip the Compile&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;There are concerns in Java that don't exist in other languages.  One of them is the compile step.  Removing that issue leads to Internal Domain Specific Languages, the very solution to the Java+XML conundrum.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;So by attempting to grok Spring, I am coming to the conclusion that Spring is an artifact that attempts to make some of the pain of working with Java go away.  It does a pretty good job in some respects (I consider the fact that we still have a bunch of XML a down-side).  But when we look at other languages, specifically at Smalltalk, we see a much more elegant solution:  these problems simply don't exist.  Everything is written in-band.  I advocate that it should be.&lt;/p&gt;</description>
      <pubDate>Tue, 31 Jan 2006 07:43:00 -0600</pubDate>
      <guid isPermaLink="false">urn:uuid:720ce26131d1e7383c7c8054df10134c</guid>
      <author>Eitan</author>
      <link>http://u2d.com/articles/2006/01/31/the-java-xml-conundrum</link>
      <category>Programming</category>
      <category>Java</category>
    </item>
    <item>
      <title>I like IntelliJ IDEA</title>
      <description>&lt;p&gt;As I was coding today, I started thinking to myself "I like IntelliJ IDEA."&lt;/p&gt;

&lt;p&gt;I've been using this IDE for almost a year now.  I recall what forced me to finally seriously use IDEA:  I had been using Eclipse on MacOSX (don't!) when it finally died after Apple introduced Tiger.  Man that feels like a long time ago.  I am sooo at home on Ubuntu these days it's not even funny.  Anyhow, Eclipse really rocks on Ubuntu.  Netbeans does too.  Still, IDEA is my preferred tool.  I'm still not using it to the max but I really like the performance of IDEA on Java 5 on Ubuntu on my Medion laptop (Pentium M 730 I believe), the feel of things.&lt;/p&gt;

&lt;p&gt;Anyone know of a good way to integrate XDoclet with IDEA?  The question may be premature.&lt;/p&gt;

&lt;p&gt;I just checked out &lt;a href="http://www.jetbrains.com/"&gt;JetBrains' web site&lt;/a&gt; and noticed they received the "Best IDE" award from the JDJ for 2005.  Congratulations guys!  Keep it up.&lt;/p&gt;</description>
      <pubDate>Fri, 20 Jan 2006 17:05:26 -0600</pubDate>
      <guid isPermaLink="false">urn:uuid:3c9d689416eaa677790007b6a6854d89</guid>
      <author>eitan</author>
      <link>http://u2d.com/articles/2006/01/20/i-like-intellij-idea</link>
      <category>Programming</category>
      <category>Java</category>
    </item>
    <item>
      <title>Code Blocks</title>
      <description>&lt;p&gt;I'm about to check out TestNG for the first time.  I have the documentation printed in front of me and hope to take it for a spin shortly.  So I read the TestNG web site's front page.  I followed the three links from the front page to three blog entries by Cedric Beust that essentially describe issues he has with JUnit.  Cedric's arguments are not convincing.&lt;/p&gt;

&lt;p&gt;Here's is my understanding, let me know if I'm wrong:&lt;/p&gt;

&lt;p&gt;One of the principal ideas in JUnit is to use the Method as as an analog to a generic block of code: in this case, a test.  A method is a test.  Don't think of a method as a method.  Think of it as a test.  Cedric is confused, and rightly so:  JUnit test classes are not really classes in the way they were meant to be used by the language designers.  He is confused that the class constructor is invoked once &lt;em&gt;for every test&lt;/em&gt; that is run.  That is, once per method.  This is contrary to everything we've ever been taught about OO.  Why is this so?  Well, it's very simple.  Imagine having to write a new class for every single test we wanted to run.  It's tedious.  It's overkill.  The 1-1 mapping of method to test is much nicer.  Furthermore, related tests can easily be grouped together in a class.  JUnit does its magic behind the scenes, it uses reflection to introspect matching test methods and, in a sense, instruments them for testing.  It invokes each in a specific context that ensures isolation from other tests, etc..&lt;/p&gt;

&lt;p&gt;What I'm interested in though is in a generalization of JUnit.  Grasping the essence of the pattern that JUnit employs is most important.  The idea that one could, in general write a class with a bunch of methods and, separately, write a harness that does something else with each method, in a similar way, but where one can customize the context in which the block of code is run.&lt;/p&gt;

&lt;p&gt;Take for example, the simple desire or need for someone to learn Hibernate.  There's a lot of setup and tearndown that goes along with running all kinds of "tests" to learn the Hibernate API:  obtaining a session, beginning a transaction, running the "test", commiting the transaction and "closing" the session.  With a generalization of JUnit I would write tests that could be run in a slightly different context where each test method is called in a context that repeatedly does the mundane:  opens the session, begins the transaction, calls the block of code, commits the transaction, closes the session, and on to the next test.&lt;/p&gt;

&lt;p&gt;Then you can use some kind of flexible runner application to pick which tests you'd like to run.  Actually, that's one of the features of IntelliJ IDEA that I really love:  the ability to run a single test directly from the IDE, without having to fuss with ant or setting anything up.&lt;/p&gt;

&lt;p&gt;What I'm wondering at the moment is whether that "Generalization of JUnit" I'm seeking (though it might be actually trivial to write) is not called "The Spring Framework."  Spring employs this pattern over and over again in all kinds of circumstances.  What I don't know at the moment is whether one can customize it.  This pattern actually is native to smalltalk and ruby (and requires no "framework" to enable).  That explains why Kent Beck used it when he wrote JUnit.&lt;/p&gt;</description>
      <pubDate>Tue, 17 Jan 2006 17:28:33 -0600</pubDate>
      <guid isPermaLink="false">urn:uuid:53e5e182392fd5a851ace94f4027942b</guid>
      <author>eitan</author>
      <link>http://u2d.com/articles/2006/01/17/code-blocks</link>
      <category>Programming</category>
      <category>Java</category>
    </item>
    <item>
      <title>Open Sesame</title>
      <description>&lt;p&gt;One of the small little but valuable features I used to like on macosx (before switching to Ubuntu last Summer) was the command-line &lt;code&gt;open&lt;/code&gt; command.  You could just type &lt;code&gt;open index.html&lt;/code&gt; and the file would pop up in the a web browser.  I used it all the time.&lt;/p&gt;

&lt;p&gt;I'm not "guru of the universe" and surely something like this exists for linux but for some reason thirty minutes searching the synaptic package manager did not yield anything.&lt;/p&gt;

&lt;p&gt;So one day I finally decided to turn on my brain for a change and in five minutes hacked this:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;  #!/usr/bin/ruby -w

  def suffix(file_name)
    file_name.split(".").last()
  end

  map = {
           "pdf" =&amp;gt; "kpdf",
           "directory" =&amp;gt; "nautilus",
           "html" =&amp;gt; "epiphany",
           "htm" =&amp;gt; "epiphany",
           "xls" =&amp;gt; "gnumeric",
           "csv" =&amp;gt; "gnumeric",
           "txt" =&amp;gt; "kate",
           "gif" =&amp;gt; "eog",
           "jpg" =&amp;gt; "eog",
           "png" =&amp;gt; "eog",
           "xml" =&amp;gt; "gedit"
         }

  file_name = ARGV[0]
  key = (File.directory?(file_name)) ? "directory" : suffix(file_name)
  app_name = map[key]

  fork do
    puts "invoking #{app_name}..\n"
    exec "#{app_name} #{file_name}"
  end
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;I've been using it daily for a while now and I like it.  Over time I've built myself a few other little utilities.  A recent one is merge for merging data with an erb template.  I use 'show' a lot.  It breaks down a path-like structure into multiple line entries so one can actually read the foresaken string.  I use it like this:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;  eitan@ubuntu:~/bin$ show path
  PATH:
  /usr/local/bin
  /usr/local/sbin
  /sbin
  /usr/sbin
  /bin
  /usr/bin
  ...
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;.. or &lt;code&gt;show classpath&lt;/code&gt; etc..&lt;/p&gt;

&lt;p&gt;Another one that is a real time saver when the time comes to import a new project into subversion is &lt;code&gt;svnize&lt;/code&gt; which will automatically restructure your project in the trunk/tags/branches hierarchy suitable for doing the import. &lt;/p&gt;</description>
      <pubDate>Tue, 17 Jan 2006 16:38:59 -0600</pubDate>
      <guid isPermaLink="false">urn:uuid:b1eef7a2b667d4ab90ca99ab442fcf58</guid>
      <author>eitan</author>
      <link>http://u2d.com/articles/2006/01/17/open-sesame</link>
      <category>Programming</category>
      <category>Linux</category>
    </item>
    <item>
      <title>Smalltalk</title>
      <description>&lt;p&gt;What I love about smalltalk is that nothing is out of band.  The number of concepts is so brilliantly minimal.  By simply treating a block of code as an object, you can implement control structures and exception handling &lt;em&gt;in the language&lt;/em&gt;.  Code such as:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;[#(1 2 4) at: 5] ifError: [:msg :obj | nil].
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;..is pure beauty (taken from pg 202, &lt;em&gt;Squeak, A Quick Trip to ObjectLand&lt;/em&gt;).&lt;/p&gt;

&lt;p&gt;It also makes me wonder why ruby is getting so much attention when in fact the things that make ruby great are essentially borrowed smalltalk features.&lt;/p&gt;</description>
      <pubDate>Thu, 22 Dec 2005 09:11:58 -0600</pubDate>
      <guid isPermaLink="false">urn:uuid:62ed01e0bd83fce94e546f31f09053ee</guid>
      <author>eitan</author>
      <link>http://u2d.com/articles/2005/12/22/smalltalk</link>
      <category>Programming</category>
    </item>
  </channel>
</rss>
