<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	xmlns:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>Jeff Pace's Blog</title>
	<atom:link href="http://jpace.wordpress.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://jpace.wordpress.com</link>
	<description>Cut, copy, pace.</description>
	<lastBuildDate>Sat, 28 Jan 2012 19:03:39 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.com/</generator>
<cloud domain='jpace.wordpress.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://s2.wp.com/i/buttonw-com.png</url>
		<title>Jeff Pace's Blog</title>
		<link>http://jpace.wordpress.com</link>
	</image>
	<atom:link rel="search" type="application/opensearchdescription+xml" href="http://jpace.wordpress.com/osd.xml" title="Jeff Pace&#039;s Blog" />
	<atom:link rel='hub' href='http://jpace.wordpress.com/?pushpress=hub'/>
		<item>
		<title>Negative Decrease from LinkedIn Not Misunderstood Incorrectly</title>
		<link>http://jpace.wordpress.com/2012/01/28/negative-decrease-from-linkedin-not-misunderstood-incorrectly/</link>
		<comments>http://jpace.wordpress.com/2012/01/28/negative-decrease-from-linkedin-not-misunderstood-incorrectly/#comments</comments>
		<pubDate>Sat, 28 Jan 2012 19:03:31 +0000</pubDate>
		<dc:creator>Jeff Pace</dc:creator>
				<category><![CDATA[programming]]></category>
		<category><![CDATA[linkedin]]></category>
		<category><![CDATA[messages]]></category>

		<guid isPermaLink="false">http://jpace.wordpress.com/?p=473</guid>
		<description><![CDATA[This is more of a rant, but there is a point regarding cognitive friction in interfaces, in this case a simple email message. The other day I received this email message, and yes, I&#8217;m pedantic enough to insist that they &#8230; <a href="http://jpace.wordpress.com/2012/01/28/negative-decrease-from-linkedin-not-misunderstood-incorrectly/">Continue reading <span class="meta-nav">&#8594;</span></a><img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=jpace.wordpress.com&amp;blog=3530591&amp;post=473&amp;subd=jpace&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>This is more of a rant, but there is a point regarding cognitive friction in interfaces, in this case a simple email message.</p>
<p>The other day I received this email message, and yes, I&#8217;m pedantic enough to insist that they are &#8220;email messages&#8221;, not &#8220;emails&#8221;, or heaven forfend, &#8220;e-mails&#8221;. Oh, and on behalf of the C programmer community, thank <em>you</em>, gcc, for teaching us the word &#8220;pedantic&#8221;. I&#8217;m also pedantic enough to have written <a href="http://www.incava.org/projects/doctorj">an application</a> for spell-checking Javadoc and strings in Java doc.</p>
<p>Back to my rant, here is the message:</p>
<p><a href="http://jpace.files.wordpress.com/2012/01/swing_decrease3.png"><img src="http://jpace.files.wordpress.com/2012/01/swing_decrease3.png?w=800" alt="" title="swing_decrease"   class="aligncenter size-full wp-image-481" /></a></p>
<p>So &#8230; what is a &#8220;-11% decrease&#8221;? Isn&#8217;t a negative decrease an increase? But that down arrow before the minus sign is bothersome as well. So, is it a down -11% decrease?</p>
<p>The subject of the email message was</p>
<blockquote><p>Add skills like &#8220;Swing&#8221; to make your profile easier to find</p></blockquote>
<p>Just very quickly: &#8220;like&#8221; doesn&#8217;t mean &#8220;such as&#8221;: like means &#8220;similar to but not x&#8221;, whereas &#8220;such as&#8221; means &#8220;x or similar&#8221;. Second point: &#8220;Swing&#8221; should be in quotation marks if it&#8217;s a quote. Quotation marks are not for emphasizing words. (Yeah, and it&#8217;s ironic that this them (Reddle) precedes block quotes with an open quote, leading to me wondering whether posting this would fail with the message &#8220;error: missing unterminated &#8221; character&#8221;.)</p>
<p>Oh, and if you&#8217;re curious about my LinkedIn profile, <a href="http://www.linkedin.com/pub/jeff-pace/0/573/17b">here</a> it is, but if you don&#8217;t like it, please decrease your negative feedback to me, such as &#8220;you are &#8220;pathetic&#8221;.&#8221;</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/jpace.wordpress.com/473/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/jpace.wordpress.com/473/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/jpace.wordpress.com/473/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/jpace.wordpress.com/473/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/jpace.wordpress.com/473/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/jpace.wordpress.com/473/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/jpace.wordpress.com/473/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/jpace.wordpress.com/473/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/jpace.wordpress.com/473/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/jpace.wordpress.com/473/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/jpace.wordpress.com/473/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/jpace.wordpress.com/473/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/jpace.wordpress.com/473/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/jpace.wordpress.com/473/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=jpace.wordpress.com&amp;blog=3530591&amp;post=473&amp;subd=jpace&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://jpace.wordpress.com/2012/01/28/negative-decrease-from-linkedin-not-misunderstood-incorrectly/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/08c544b6ad73dfc0e5a1a0d640c28d03?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Jeff Pace</media:title>
		</media:content>

		<media:content url="http://jpace.files.wordpress.com/2012/01/swing_decrease3.png" medium="image">
			<media:title type="html">swing_decrease</media:title>
		</media:content>
	</item>
		<item>
		<title>Efficient Way to Improve Console Productivity</title>
		<link>http://jpace.wordpress.com/2012/01/21/efficient-way-to-improve-console-productivity/</link>
		<comments>http://jpace.wordpress.com/2012/01/21/efficient-way-to-improve-console-productivity/#comments</comments>
		<pubDate>Sat, 21 Jan 2012 15:15:49 +0000</pubDate>
		<dc:creator>Jeff Pace</dc:creator>
				<category><![CDATA[programming]]></category>
		<category><![CDATA[github]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[z shell]]></category>
		<category><![CDATA[zsh]]></category>

		<guid isPermaLink="false">http://jpace.wordpress.com/?p=448</guid>
		<description><![CDATA[One of the principles of efficiency when programming is to avoid unnecessary repetition (DRY), be it in code, or in physical and mental tasks. My goal is to write at least one tweak per day to my environment, whether a &#8230; <a href="http://jpace.wordpress.com/2012/01/21/efficient-way-to-improve-console-productivity/">Continue reading <span class="meta-nav">&#8594;</span></a><img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=jpace.wordpress.com&amp;blog=3530591&amp;post=448&amp;subd=jpace&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>One of the principles of efficiency when programming is to avoid unnecessary repetition (DRY), be it in code, or in physical and mental tasks. My goal is to write at least one tweak per day to my environment, whether a macro in my editor (Emacs), or a shell script or alias in my console environment, which is Z shell. (Note that this applies to other shells also.)</p>
<p>Reading Matthew Might&#8217;s article on <a href="http://matt.might.net/articles/console-hacks-exploiting-frequency/">console hacks</a> inspired me to use that to quickly and easily find candidates for aliases and functions in Z shell.</p>
<p>The following command sorts the history by frequency of use:</p>
<p><pre class="brush: bash; light: true;">
% history -1000000 | cut -c8- | sort | uniq -c | sort -n | tail -15
</pre></p>
<p>The output from my recent work with DoctorJ is:</p>
<p><pre class="brush: plain; light: true;">
     11 cd ~ijdkproj
     12 gitpullall
     12 myprod.rb
     12 rake
     13 ..
     14 gitdfs
     15 c
     15 la
     20 sd
     24 scrub
     27 git status
     28 git push -u origin master
     37 git diff
     39 ls
     51 gct
     52 gitdelta.rb
</pre></p>
<p>(If you&#8217;re wondering what the &#8220;..&#8221; command is, that&#8217;s an alias for &#8220;cd ..&#8221;.)</p>
<p>In the frequency list the salient command in terms of length is &#8220;git push -u origin master&#8221;, executed 28 times. So we can consider an alias for it, such as &#8220;gpom&#8221;, and see whether it already exists as a function, alias, or program:</p>
<p><pre class="brush: bash; light: true;">
% which gpom
gpom not found
</pre></p>
<p>Since it doesn&#8217;t already exist, we can add it to the list of aliases (mine are in ~/System/Zsh/aliases.zsh):</p>
<p>alias gpom=&#8217;git push -u origin master&#8217;</p>
<p>On Github I&#8217;ve posted <a href="http://github.com/jeugenepace/zsh">my Z shell configuration</a>, with the updated aliases file <a href="https://github.com/jeugenepace/zsh/blob/master/aliases.zsh">here</a>.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/jpace.wordpress.com/448/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/jpace.wordpress.com/448/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/jpace.wordpress.com/448/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/jpace.wordpress.com/448/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/jpace.wordpress.com/448/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/jpace.wordpress.com/448/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/jpace.wordpress.com/448/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/jpace.wordpress.com/448/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/jpace.wordpress.com/448/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/jpace.wordpress.com/448/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/jpace.wordpress.com/448/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/jpace.wordpress.com/448/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/jpace.wordpress.com/448/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/jpace.wordpress.com/448/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=jpace.wordpress.com&amp;blog=3530591&amp;post=448&amp;subd=jpace&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://jpace.wordpress.com/2012/01/21/efficient-way-to-improve-console-productivity/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/08c544b6ad73dfc0e5a1a0d640c28d03?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Jeff Pace</media:title>
		</media:content>
	</item>
		<item>
		<title>Unit Testing Principles</title>
		<link>http://jpace.wordpress.com/2012/01/09/unit-testing-principles/</link>
		<comments>http://jpace.wordpress.com/2012/01/09/unit-testing-principles/#comments</comments>
		<pubDate>Mon, 09 Jan 2012 01:32:53 +0000</pubDate>
		<dc:creator>Jeff Pace</dc:creator>
				<category><![CDATA[programming]]></category>
		<category><![CDATA[junit]]></category>
		<category><![CDATA[unit tests]]></category>

		<guid isPermaLink="false">http://jpace.wordpress.com/?p=316</guid>
		<description><![CDATA[Unit testing is highly emphasized for writing the initial version of code, the test-driven design approach. But I think that unit tests are even more important in what I consider to be the most difficult phase of a project: maintenance. &#8230; <a href="http://jpace.wordpress.com/2012/01/09/unit-testing-principles/">Continue reading <span class="meta-nav">&#8594;</span></a><img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=jpace.wordpress.com&amp;blog=3530591&amp;post=316&amp;subd=jpace&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Unit testing is highly emphasized for writing the initial version of code, the test-driven design approach. But I think that unit tests are even more important in what I consider to be the most difficult phase of a project: maintenance. As a project ages, its code base grows in size and complexity, and it is absolutely necessary to go back into a project and refactor it, eliminating obsolete code and merging common code.</p>
<p>That is where unit tests are their most valuable, in keeping the project stable. The tests provide something that is often no longer on the project: the original concept. That is, the programmer who wrote the first version years before may now not even be at the same organization/company, so only the unit tests he wrote can &#8220;speak&#8221; for his intent.</p>
<p>Having rewritten DoctorJ and DiffJ lately, I was very thankful to have a full set of tests, which allowed me to refactor the projects with more confidence.</p>
<p>Unit tests should be written starting by testing the most basic functionality first, with the assumption that even the simplest code does not work. I thought it was overkill when I was writing tests like:</p>
<p><pre class="brush: java; light: true;">
    Foo f = new Foo(x, y);
    assertEquals(y, f.getY());
</pre></p>
<p>until the first time I saw something more or less like:</p>
<p><pre class="brush: java; light: true;">
    public int getX() {
        return x;
    }

    public int getY() {
        return x;
    }
</pre></p>
<p>That is one reason to avoid copying and pasting.</p>
<p>A guideline that I like is to try to have a test case per main (meaning non-test) classes, and to have the overall test code exceed the size of the code being tested, in number of lines. That makes writing tests a goal in themselves, as opposed to just being a means.</p>
<p>One of the problems with some unit test frameworks &#8211; notably, in my experience, Ruby&#8217;s Test::Unit and Java&#8217;s JUnit &#8211; is that assertions tend to be so low level that one has to read the original code to understand the context. For example, this output from JUnit doesn&#8217;t provide enough information:</p>
<p><pre class="brush: plain; light: true;">
junit.framework.AssertionFailedError: expected:&lt;8&gt; but was:&lt;null&gt;
	at junit.framework.Assert.fail(Assert.java:50)
	at junit.framework.Assert.failNotEquals(Assert.java:287)
	at junit.framework.Assert.assertEquals(Assert.java:67)
	at junit.framework.Assert.assertEquals(Assert.java:74)
	at org.incava.ijdk.util.TestListExt.testGet(TestListExt.java:30)
</pre></p>
<p>All that is known from that output is that the <code>ListExt.get()</code> method was being tested, and that the null was returned instead of 8. Looking at the source provides some more information: </p>
<p><pre class="brush: java; light: true;">
        assertEquals(new Integer(8), ListExt.get(NUMS, -1));
</pre></p>
<p>Sort of. We have yet another step now, to look at the declaration of <code>NUMS</code>:</p>
<p><pre class="brush: java; light: true;">
    public static final List&lt;Integer&gt; NUMS = java.util.Arrays.asList(new Integer[] { 2, 4, 6, 8 });
</pre></p>
<p>Thus it took three (or four) steps to get from the JUnit to what the failure actually meant, that &#8220;using the list &#8217;2, 4, 6, 8&#8242;, <code>ListExt.get(-1)</code> returned null instead of the expected 8&#8243;.</p>
<p>The test case can be significantly improved by following the guidelines for tests, that their output consist of:</p>
<ul>
<li>the input</li>
<li>the expected result</li>
<li>the actual result</li>
</ul>
<p>(Actually, that goes for bug reporting as well, or any kind of testing.)</p>
<p>One problem with unit tests is that they tend to consist of repeated code, such as:</p>
<p><pre class="brush: java; light: true;">
        assertEquals(new Integer(2), ListExt.get(NUMS, 0));
        assertEquals(new Integer(4), ListExt.get(NUMS, 1));
        assertEquals(new Integer(6), ListExt.get(NUMS, 2));
        assertEquals(new Integer(8), ListExt.get(NUMS, 3));
</pre></p>
<p>Custom assertions &#8211; an assertion for testing a single method &#8211; reduces the repeated code:</p>
<p><pre class="brush: java; light: true;">
    public &lt;T&gt; void assertListExtGet(T exp, List&lt;T&gt; list, int idx) {
        assertEquals(exp, ListExt.get(list, idx));
    }
</pre></p>
<p><pre class="brush: java; light: true;">
        assertListExtGet(2, NUMS, 0);
        assertListExtGet(4, NUMS, 1);
        assertListExtGet(6, NUMS, 2);
        assertListExtGet(8, NUMS, 3);
</pre></p>
<p>Also note that autoboxing with JUnit 3.x and Java 1.5+ means that we have to resolve the ambiguity between whether assertEquals(Object, Object) or assertEquals(int, int) should be called, leading to the &#8220;new Integer(x)&#8221; calls in the first case, whereas with the refactored code, autoboxing is done with the call to assertListExtGet.</p>
<p>With that, we can refine the custom assertion to produce a more informative error message:</p>
<p><pre class="brush: java; light: true;">
    public &lt;T&gt; void assertListExtGet(T exp, List&lt;T&gt; list, int idx) {
        String msg = &quot;ListExt.get of '&quot; + idx + &quot;' in list: '&quot; + list + &quot;'&quot;;
        assertEquals(msg, exp, ListExt.get(list, idx));
    }
</pre></p>
<p>And the resulting output is very much like what we earlier had to discern by going through the code:</p>
<p><pre class="brush: plain; light: true;">
junit.framework.AssertionFailedError: ListExt.get of '-1' in list: '[2, 4, 6, 8]' expected:&lt;8&gt; but was:&lt;null&gt;
	at junit.framework.Assert.fail(Assert.java:50)
	at junit.framework.Assert.failNotEquals(Assert.java:287)
	at junit.framework.Assert.assertEquals(Assert.java:67)
	at org.incava.ijdk.util.TestListExt.assertListExtGet(TestListExt.java:21)
	at org.incava.ijdk.util.TestListExt.testGet(TestListExt.java:40)
</pre></p>
<p>The output is much more informative, and allows the debugging to start by bypassing the unit test code and going to the source.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/jpace.wordpress.com/316/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/jpace.wordpress.com/316/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/jpace.wordpress.com/316/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/jpace.wordpress.com/316/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/jpace.wordpress.com/316/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/jpace.wordpress.com/316/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/jpace.wordpress.com/316/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/jpace.wordpress.com/316/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/jpace.wordpress.com/316/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/jpace.wordpress.com/316/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/jpace.wordpress.com/316/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/jpace.wordpress.com/316/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/jpace.wordpress.com/316/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/jpace.wordpress.com/316/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=jpace.wordpress.com&amp;blog=3530591&amp;post=316&amp;subd=jpace&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://jpace.wordpress.com/2012/01/09/unit-testing-principles/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/08c544b6ad73dfc0e5a1a0d640c28d03?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Jeff Pace</media:title>
		</media:content>
	</item>
		<item>
		<title>Error Messages</title>
		<link>http://jpace.wordpress.com/2012/01/08/error-messages/</link>
		<comments>http://jpace.wordpress.com/2012/01/08/error-messages/#comments</comments>
		<pubDate>Sun, 08 Jan 2012 14:22:00 +0000</pubDate>
		<dc:creator>Jeff Pace</dc:creator>
				<category><![CDATA[programming]]></category>
		<category><![CDATA[errors]]></category>

		<guid isPermaLink="false">http://jpace.wordpress.com/?p=375</guid>
		<description><![CDATA[Error messages should consist of both the input being handled, and what the actual problem was, as precisely as possible. Many (most?) error messages are just of the generic form &#8220;an error occurred&#8221; (and even that exact message), without any &#8230; <a href="http://jpace.wordpress.com/2012/01/08/error-messages/">Continue reading <span class="meta-nav">&#8594;</span></a><img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=jpace.wordpress.com&amp;blog=3530591&amp;post=375&amp;subd=jpace&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Error messages should consist of both the input being handled, and what the actual problem was, as precisely as possible. Many (most?) error messages are just of the generic form &#8220;an error occurred&#8221; (and even that exact message), without any further information.</p>
<p>To illustrate the difference, some examples, from least to most informative:</p>
<p><pre class="brush: plain; light: true;">
	invalid account data
	Email invalid
	Email address invalid
	Email address in invalid format
	Email address not in the correct format
	Email address not in the correct format: foo.bar@baz
	Email address &quot;foo.bar@baz&quot; not in the correct format
	Email address &quot;foo.bar@baz&quot; not in the correct format: invalid domain name
	Email address &quot;foo.bar@baz&quot; not in the correct format: &quot;baz&quot; is not a valid domain name.
</pre></p>
<p><pre class="brush: plain; light: true;">
	User name invalid
	User name invalid: john gallagher
	User name &quot;john gallagher&quot; not valid: invalid character.
	User name &quot;john gallagher&quot; not valid: invalid character: &quot; &quot;.
</pre></p>
<p>Quoting the arguments is valuable, especially when they are strings and on the end of a message. For example, the second message below makes it clear that the cause of the error is that there are trailing spaces in the URL:</p>
<p><pre class="brush: plain; light: true;">
	Invalid URL: http://www.foo.com   
	Invalid URL: &quot;http://www.foo.com   &quot;
</pre></p>
<p>The principle of being precise means that error messages should not be of the format &#8220;x or y occurred&#8221;, for example, &#8220;The database could not be connected to or there was an error during initialization.&#8221;</p>
<p>As a programmer, I can clairvoyantly read that code:</p>
<p><pre class="brush: java;">
    try {
        db.connect();
        db.initialize();
    }
    catch (Exception e) {
        throw new DBException(&quot;The database could not be connected to or there was an error during initialization.&quot;);
    }
</pre></p>
<p>That&#8217;s just irrational laziness, leading to user frustration (and calls to support). The basic principle is: give the user the information to solve their own problem.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/jpace.wordpress.com/375/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/jpace.wordpress.com/375/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/jpace.wordpress.com/375/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/jpace.wordpress.com/375/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/jpace.wordpress.com/375/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/jpace.wordpress.com/375/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/jpace.wordpress.com/375/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/jpace.wordpress.com/375/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/jpace.wordpress.com/375/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/jpace.wordpress.com/375/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/jpace.wordpress.com/375/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/jpace.wordpress.com/375/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/jpace.wordpress.com/375/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/jpace.wordpress.com/375/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=jpace.wordpress.com&amp;blog=3530591&amp;post=375&amp;subd=jpace&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://jpace.wordpress.com/2012/01/08/error-messages/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/08c544b6ad73dfc0e5a1a0d640c28d03?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Jeff Pace</media:title>
		</media:content>
	</item>
		<item>
		<title>Ergonomic Emacs Keybindings</title>
		<link>http://jpace.wordpress.com/2011/12/30/ergonomic-emacs-keybindings/</link>
		<comments>http://jpace.wordpress.com/2011/12/30/ergonomic-emacs-keybindings/#comments</comments>
		<pubDate>Fri, 30 Dec 2011 19:48:22 +0000</pubDate>
		<dc:creator>Jeff Pace</dc:creator>
				<category><![CDATA[emacs]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[ergoemacs]]></category>
		<category><![CDATA[lisp]]></category>

		<guid isPermaLink="false">http://jpace.wordpress.com/?p=340</guid>
		<description><![CDATA[I just spent three days trying out Xah Lee&#8217;s ErgoEmacs &#8211; ergonomic Emacs keybindings &#8211; and I&#8217;ve been impressed. Easier in terms of typing, given that the most frequent commands are defined as Alt-. (where &#8220;.&#8221; is a single key) &#8230; <a href="http://jpace.wordpress.com/2011/12/30/ergonomic-emacs-keybindings/">Continue reading <span class="meta-nav">&#8594;</span></a><img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=jpace.wordpress.com&amp;blog=3530591&amp;post=340&amp;subd=jpace&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>I just spent three days trying out Xah Lee&#8217;s <a href="http://ergoemacs.org">ErgoEmacs</a> &#8211; ergonomic Emacs keybindings &#8211; and I&#8217;ve been impressed. Easier in terms of typing, given that the most frequent commands are defined as Alt-. (where &#8220;.&#8221; is a single key) instead of as Ctrl- (or worse, Ctrl-C Ctrl-.). Thus &#8220;Emacs pinkie&#8221; is less likely, since the thumbs are more heavily used on the the Alt keys instead of the pinkies working the Ctrl keys.</p>
<p>Setup is trivial. Just grab the zip file, unzip it into ~/.emacs.d, and add the following to your ~/.emacs file:</p>
<p><pre class="brush: plain;">
(setenv &quot;ERGOEMACS_KEYBOARD_LAYOUT&quot; &quot;us&quot;) ; US

;; load ErgoEmacs keybinding
(load &quot;~/.emacs.d/ergoemacs-keybindings-5.3.9/ergoemacs-mode&quot;)

;; turn on minor mode ergoemacs-mode
(ergoemacs-mode 1)
</pre></p>
<p>Among the first things to do is, at least if you&#8217;re running with the default Gnome keyboard shortcuts, is to disable alt-space from raising the menu within terminals (at least, this is the case for gnome-terminal). To do this, change or disable the shortcut via Preferences &gt; Keyboard Shortcuts &gt; Desktop &gt; Show the panel&#8217;s main menu. Select that, hit backspace, and it should now read &#8220;Disabled&#8221;.</p>
<p>ErgoEmacs is actually two modules in one: it first is, as its name says, a more ergonomically friendly version of Emacs, where commonly-used commands have easy-to-type shortcuts, that is, with the use of Alt instead of Ctrl, and by favoring the keys in the center of the keyboard, as opposed to [, ], \, ~, etc.</p>
<p>The second module is that it uses the now-standard (for lack of a better word) editor shortcuts for operations such as opening files, copy, cut, and paste, which is much more intuitive and consistent with other editors.</p>
<p>I like much of it, but have some issues. I agree that the default Emacs keybindings and behavior are difficult, overwhelming and inconsistent with other editors, and should be updated. However, as with the Qwerty keyboard, we&#8217;re essentially stuck, by &#8220;we&#8221; I mean Unix-based programmers using Emacs, especially the most experienced ones. ErgoEmacs seems designed best for people experienced with mainstream editors such as Notepad and TextMate.</p>
<p>Emacs is so second-nature to me that I don&#8217;t consciously know some (most?) of the key shortcuts. If you&#8217;re like that, chances are that ErgoEmacs will force you to think about the shortcuts, causing cognitive friction that will interrupt your flow. If you have RSI issues, then you&#8217;re more likely to benefit, although as a programmer, I&#8217;m typing the oddball keys ([], {}, ()) so much that it is not significant to me to have the less frequently used commands a bit easier to type. (I&#8217;d never thought of that before, but it&#8217;s another reason to like Ruby: fewer special characters, since for example blocks are delimited with &#8220;begin&#8221; and &#8220;end&#8221; instead of &#8220;{&#8221; and &#8220;}&#8221;.)</p>
<p>The tipping point for me against ErgoEmacs is that my shell, Z shell, does not have the equivalent shortcuts, so I would essentially have to remember two separate (and conflicting) sets of commands.</p>
<p>That brings me to my final point: I dislike that ErgoEmacs provides no bridge or transition period for going from standard Emacs to ErgoEmacs. I&#8217;ve read that one can provide hints (in the same way that vanilla Emacs suggests shortcuts after you&#8217;ve executed a command via the traditional (M-x whatever). Having this with out-of-the-box ErgoEmacs would have been nice.</p>
<p>That said, I like the principle behind ErgoEmacs, and I&#8217;ll certainly be taking some ideas from it. On that note, I&#8217;ve finally posted my Emacs environment, 16 years of cruft and all, on GitHub <a href="//github.com/jeugenepace/emacs">here</a>. I&#8217;ll be actively refining it over the next few weeks, and intend to have it up to date and stable by the end of January.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/jpace.wordpress.com/340/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/jpace.wordpress.com/340/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/jpace.wordpress.com/340/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/jpace.wordpress.com/340/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/jpace.wordpress.com/340/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/jpace.wordpress.com/340/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/jpace.wordpress.com/340/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/jpace.wordpress.com/340/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/jpace.wordpress.com/340/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/jpace.wordpress.com/340/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/jpace.wordpress.com/340/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/jpace.wordpress.com/340/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/jpace.wordpress.com/340/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/jpace.wordpress.com/340/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=jpace.wordpress.com&amp;blog=3530591&amp;post=340&amp;subd=jpace&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://jpace.wordpress.com/2011/12/30/ergonomic-emacs-keybindings/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/08c544b6ad73dfc0e5a1a0d640c28d03?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Jeff Pace</media:title>
		</media:content>
	</item>
		<item>
		<title>Timelessness of Quality</title>
		<link>http://jpace.wordpress.com/2011/12/25/timelessness-of-quality/</link>
		<comments>http://jpace.wordpress.com/2011/12/25/timelessness-of-quality/#comments</comments>
		<pubDate>Sun, 25 Dec 2011 20:27:31 +0000</pubDate>
		<dc:creator>Jeff Pace</dc:creator>
				<category><![CDATA[programming]]></category>
		<category><![CDATA[emacs]]></category>
		<category><![CDATA[lisp]]></category>
		<category><![CDATA[ruby]]></category>

		<guid isPermaLink="false">http://jpace.wordpress.com/?p=335</guid>
		<description><![CDATA[I&#8217;ve been rereading Hackers and Painters, by Paul Graham, and his chapter on Lisp was especially interesting, given that I&#8217;ve been working on expanding my Emacs knowledge and further refining my environment. The connection between Lisp and Emacs? In this &#8230; <a href="http://jpace.wordpress.com/2011/12/25/timelessness-of-quality/">Continue reading <span class="meta-nav">&#8594;</span></a><img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=jpace.wordpress.com&amp;blog=3530591&amp;post=335&amp;subd=jpace&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve been rereading Hackers and Painters, by Paul Graham, and his chapter on Lisp was especially interesting, given that I&#8217;ve been working on expanding my Emacs knowledge and further refining my environment.</p>
<p>The connection between Lisp and Emacs? In this sense, they both became the standard-bearer for their field (programming languages, text editors), and reached that point very soon after the inception of the field. Each of them was so far ahead of the others that even decades later, one could argue that neither Lisp nor Emacs has been matched. If anything, progress in the fields has just been that the mainstream (meaning, widely accepted) products are more and more like Lisp and Emacs.</p>
<p>This doesn&#8217;t seem atypical, that there is this quantum leap early in the field. Among guitarists the Gibson Les Paul and Fender Stratocaster are probably the two most popular electric guitars, even a half century after their initial release in the late 1950s, when the electric guitar originated. In my non-expert vantage point I don&#8217;t perceive a fundamental difference (as in performance and function, not appearance) between the newest guitars now and the original Strat and Les Paul.</p>
<p>As Graham does, the same argument could be made for Ruby and Lisp, that of &#8220;modern&#8221; programming languages, Ruby is one of the closest to Lisp in terms of functionality (although its form is somewhat different). About Emacs, I don&#8217;t know what other text editor could be considered close, but it seems that Emacs is the most imitated &#8211; for example, it seems that the Eclipse editor is much closer to Emacs in behavior than it is to, say, vi. (On that note: is <i>any</i> other text editor similar to vi?)</p>
<p>It seems that the cycle is somewhat like this: the field originates, there are a few competing lead products, one dominates clearly, then there are relatively few imitators for the next decade or two (or more). After a while, the imitators become better and more like the original, to the point that they are essentially just re-badging it.</p>
<p>I&#8217;ve tried several times to really learn Lisp in the past, but had difficulty hurdling the syntax, probably in part because of my background in C, Perl, C++ and Java. But having now read of the similarities between Lisp and Ruby, I&#8217;m eager to see the difference in my perspective as I go through the excellent Emacs and Emacs Lisp tutorials at <a href="http://xahlee.org/emacs/blog.html">Xah Lee&#8217;s Emacs Blog</a>).</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/jpace.wordpress.com/335/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/jpace.wordpress.com/335/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/jpace.wordpress.com/335/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/jpace.wordpress.com/335/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/jpace.wordpress.com/335/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/jpace.wordpress.com/335/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/jpace.wordpress.com/335/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/jpace.wordpress.com/335/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/jpace.wordpress.com/335/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/jpace.wordpress.com/335/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/jpace.wordpress.com/335/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/jpace.wordpress.com/335/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/jpace.wordpress.com/335/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/jpace.wordpress.com/335/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=jpace.wordpress.com&amp;blog=3530591&amp;post=335&amp;subd=jpace&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://jpace.wordpress.com/2011/12/25/timelessness-of-quality/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/08c544b6ad73dfc0e5a1a0d640c28d03?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Jeff Pace</media:title>
		</media:content>
	</item>
		<item>
		<title>Project pvn</title>
		<link>http://jpace.wordpress.com/2011/12/07/project-pvn/</link>
		<comments>http://jpace.wordpress.com/2011/12/07/project-pvn/#comments</comments>
		<pubDate>Wed, 07 Dec 2011 16:05:49 +0000</pubDate>
		<dc:creator>Jeff Pace</dc:creator>
				<category><![CDATA[programming]]></category>
		<category><![CDATA[ruby]]></category>
		<category><![CDATA[pvn]]></category>
		<category><![CDATA[svn]]></category>

		<guid isPermaLink="false">http://jpace.wordpress.com/?p=321</guid>
		<description><![CDATA[pvn, here on GitHub, is my newest project, a front-end to the Subversion command-line program &#8220;svn&#8221;. This program will unite my various svn programs, such as svndelta, and my various scripts. I&#8217;ve been building it from scratch, with a core &#8230; <a href="http://jpace.wordpress.com/2011/12/07/project-pvn/">Continue reading <span class="meta-nav">&#8594;</span></a><img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=jpace.wordpress.com&amp;blog=3530591&amp;post=321&amp;subd=jpace&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>pvn, <a href="https://github.com/jeugenepace/pvn">here</a> on GitHub, is my newest project, a front-end to the Subversion command-line program &#8220;svn&#8221;. This program will unite my various svn programs, such as svndelta, and my various scripts.</p>
<p>I&#8217;ve been building it from scratch, with a core of commands wrapping those in svn, and new commands. At this point the only more-or-less fully working subcommand is log, which extends svn log to use &#8220;relative revisions&#8221; (explained below), and displays colorized output. I plan to add the functionality so that a user can set the format and colors for log output.</p>
<p>What is probably the most innovative functionality in pvn is that revisions may be &#8220;relative&#8221;, meaning that +N is the Nth revision, and -N is the Nth revision before the most recent one. In a large project, revision numbers can get into the six and seven digits, and it&#8217;s much easier to think of &#8220;the latest checkin I did&#8221;, as opposed to &#8220;my checkin with revision 317127&#8243;.</p>
<p>I don&#8217;t have a timeline, but my goal is to have the functionality of the log and diff subcommands implemented by the end of the year.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/jpace.wordpress.com/321/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/jpace.wordpress.com/321/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/jpace.wordpress.com/321/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/jpace.wordpress.com/321/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/jpace.wordpress.com/321/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/jpace.wordpress.com/321/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/jpace.wordpress.com/321/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/jpace.wordpress.com/321/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/jpace.wordpress.com/321/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/jpace.wordpress.com/321/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/jpace.wordpress.com/321/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/jpace.wordpress.com/321/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/jpace.wordpress.com/321/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/jpace.wordpress.com/321/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=jpace.wordpress.com&amp;blog=3530591&amp;post=321&amp;subd=jpace&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://jpace.wordpress.com/2011/12/07/project-pvn/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/08c544b6ad73dfc0e5a1a0d640c28d03?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Jeff Pace</media:title>
		</media:content>
	</item>
		<item>
		<title>Whence System.exit()?</title>
		<link>http://jpace.wordpress.com/2011/11/16/whence-system-exit/</link>
		<comments>http://jpace.wordpress.com/2011/11/16/whence-system-exit/#comments</comments>
		<pubDate>Wed, 16 Nov 2011 00:12:32 +0000</pubDate>
		<dc:creator>Jeff Pace</dc:creator>
				<category><![CDATA[java]]></category>
		<category><![CDATA[programming]]></category>

		<guid isPermaLink="false">http://jpace.wordpress.com/?p=310</guid>
		<description><![CDATA[A few days ago I was asked how to determine where in a Java program the call System.exit() is made. I came up with the following: The output is as follows:<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=jpace.wordpress.com&amp;blog=3530591&amp;post=310&amp;subd=jpace&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>A few days ago I was asked how to determine where in a Java program the call System.exit() is made. I came up with the following:</p>
<p><pre class="brush: java;">
import java.util.Map;

public class TestSystemExit {
    public void methodOne() {
        methodTwo();
    }

    public void methodTwo() {
        methodThree();
    }

    public void methodThree() {
        methodFour();
    }
    
    public void methodFour() {
        System.exit(0);
    }

    public static void printStackTrace(Thread thread, StackTraceElement[] stElmts) {
        System.err.println(&quot;thread: &quot; + thread);
        for (StackTraceElement stElmt : stElmts) {
            System.err.println(&quot;\tat &quot; + stElmt);
        }
    }

    public static void main(String[] args) {
        Runtime.getRuntime().addShutdownHook(new Thread() {
            public void run() {
                Map stMap = Thread.getAllStackTraces();
                
                // only dump the stack trace with the method &quot;exit&quot;:                
                for (Map.Entry stElmt : stMap.entrySet()) {
                    for (StackTraceElement st : stElmt.getValue()) {
                        if ((st.getClassName() + &quot;.&quot; + st.getMethodName()).equals(&quot;java.lang.System.exit&quot;)) {
                            printStackTrace(stElmt.getKey(), stElmt.getValue());
                            break;
                        }
                    }
                }
            }
        });
        
        TestSystemExit tse = new TestSystemExit();
        tse.methodOne();
    }
}
</pre></p>
<p>The output is as follows:</p>
<p><pre class="brush: plain; light: true;">
thread: Thread[main,5,main]
	at java.lang.Object.wait(Native Method)
	at java.lang.Thread.join(Thread.java:1203)
	at java.lang.Thread.join(Thread.java:1256)
	at java.lang.ApplicationShutdownHooks.run(ApplicationShutdownHooks.java:97)
	at java.lang.Shutdown.runHooks(Shutdown.java:106)
	at java.lang.Shutdown.sequence(Shutdown.java:150)
	at java.lang.Shutdown.exit(Shutdown.java:195)
	at java.lang.Runtime.exit(Runtime.java:107)
	at java.lang.System.exit(System.java:923)
	at TestSystemExit.methodFour(TestSystemExit.java:17)
	at TestSystemExit.methodThree(TestSystemExit.java:13)
	at TestSystemExit.methodTwo(TestSystemExit.java:9)
	at TestSystemExit.methodOne(TestSystemExit.java:5)
	at TestSystemExit.main(TestSystemExit.java:46)
</pre></p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/jpace.wordpress.com/310/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/jpace.wordpress.com/310/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/jpace.wordpress.com/310/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/jpace.wordpress.com/310/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/jpace.wordpress.com/310/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/jpace.wordpress.com/310/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/jpace.wordpress.com/310/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/jpace.wordpress.com/310/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/jpace.wordpress.com/310/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/jpace.wordpress.com/310/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/jpace.wordpress.com/310/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/jpace.wordpress.com/310/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/jpace.wordpress.com/310/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/jpace.wordpress.com/310/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=jpace.wordpress.com&amp;blog=3530591&amp;post=310&amp;subd=jpace&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://jpace.wordpress.com/2011/11/16/whence-system-exit/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/08c544b6ad73dfc0e5a1a0d640c28d03?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Jeff Pace</media:title>
		</media:content>
	</item>
		<item>
		<title>DoctorJ 5.2.0 and DiffJ 1.2.0 Released</title>
		<link>http://jpace.wordpress.com/2011/11/13/doctorj-5-2-0-and-diffj-1-2-0-released/</link>
		<comments>http://jpace.wordpress.com/2011/11/13/doctorj-5-2-0-and-diffj-1-2-0-released/#comments</comments>
		<pubDate>Sun, 13 Nov 2011 18:18:47 +0000</pubDate>
		<dc:creator>Jeff Pace</dc:creator>
				<category><![CDATA[java]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[diffj]]></category>
		<category><![CDATA[doctorj]]></category>

		<guid isPermaLink="false">http://jpace.wordpress.com/?p=303</guid>
		<description><![CDATA[DoctorJ 5.2.0 is an extensive rewrite of the code, with unit tests expanded and refined. It uses the latest version of PMD as the parsing and AST code, and is the first version of DoctorJ to use the IJDK module, &#8230; <a href="http://jpace.wordpress.com/2011/11/13/doctorj-5-2-0-and-diffj-1-2-0-released/">Continue reading <span class="meta-nav">&#8594;</span></a><img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=jpace.wordpress.com&amp;blog=3530591&amp;post=303&amp;subd=jpace&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>DoctorJ 5.2.0 is an extensive rewrite of the code, with unit tests expanded and refined. It uses the latest version of PMD as the parsing and AST code, and is the first version of DoctorJ to use the IJDK module, leading to much more elegant code. In terms of functionality this version add spell-checking for strings of a minimal length (which defaults to 2). The project now builds with Gradle.</p>
<p>DiffJ 1.2.0 also has significantly rewritten code, and also uses the IJDK module. This version adds (on terminals that support it) colorization of differences. It too uses Gradle for its build.</p>
<p>Both projects are now distributed only in zip format, and I welcome offers to repackage them for various package managers.</p>
<p>The distributes are available for download:</p>
<ul>
<li><a href="http://www.incava.org/files/diffj-1.2.0.zip" title="DiffJ download" target="_blank">DiffJ 1.2.0</a></li>
<li><a href="http://www.incava.org/files/doctorj-5.2.0.zip" title="DoctorJ download" target="_blank">DoctorJ 5.2.0</a></li>
</ul>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/jpace.wordpress.com/303/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/jpace.wordpress.com/303/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/jpace.wordpress.com/303/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/jpace.wordpress.com/303/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/jpace.wordpress.com/303/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/jpace.wordpress.com/303/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/jpace.wordpress.com/303/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/jpace.wordpress.com/303/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/jpace.wordpress.com/303/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/jpace.wordpress.com/303/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/jpace.wordpress.com/303/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/jpace.wordpress.com/303/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/jpace.wordpress.com/303/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/jpace.wordpress.com/303/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=jpace.wordpress.com&amp;blog=3530591&amp;post=303&amp;subd=jpace&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://jpace.wordpress.com/2011/11/13/doctorj-5-2-0-and-diffj-1-2-0-released/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/08c544b6ad73dfc0e5a1a0d640c28d03?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Jeff Pace</media:title>
		</media:content>
	</item>
		<item>
		<title>Replacing Asus K50IJ Keyboard</title>
		<link>http://jpace.wordpress.com/2011/10/29/replacing-asus-k50ij-keyboard/</link>
		<comments>http://jpace.wordpress.com/2011/10/29/replacing-asus-k50ij-keyboard/#comments</comments>
		<pubDate>Sat, 29 Oct 2011 16:12:28 +0000</pubDate>
		<dc:creator>Jeff Pace</dc:creator>
				<category><![CDATA[hardware]]></category>
		<category><![CDATA[asus]]></category>
		<category><![CDATA[k50ij]]></category>
		<category><![CDATA[keyboard]]></category>
		<category><![CDATA[laptop]]></category>

		<guid isPermaLink="false">http://jpace.wordpress.com/?p=293</guid>
		<description><![CDATA[Other than replacing and upgrading memory, I&#8217;ve never done any hardware work on laptops, but today I finally replaced a laptop whose keyboard had been molting for a while, losing four of its keys. Buy.com had a replacement keyboard here &#8230; <a href="http://jpace.wordpress.com/2011/10/29/replacing-asus-k50ij-keyboard/">Continue reading <span class="meta-nav">&#8594;</span></a><img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=jpace.wordpress.com&amp;blog=3530591&amp;post=293&amp;subd=jpace&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Other than replacing and upgrading memory, I&#8217;ve never done any hardware work on laptops, but today I finally replaced a laptop whose keyboard had been molting for a while, losing four of its keys.</p>
<p>Buy.com had a replacement keyboard <a href="http://www.buy.com/prod/asus-k50-series-keyboard-black-us/221494957.html" title="buy.com" target="_blank">here</a> for $20.</p>
<p>So with keyboard in hand, it was time to replace the old one. It was easy enough to find instructions online, but several links returned by Google for &#8220;replacing laptop keyboard asus k50ij&#8221; had misleading and incorrect directions, or seemed to be simply generic templates for laptop keyboard replacement, but not specific to the Asus K50IJ.</p>
<p><a href="http://www.insidemylaptop.com/disassemble-asus-k-series-notebook/" title="Asus laptop keyboard replacement" target="_blank">This site</a> had the most accurate and thorough information, including annotated photos, making it (literally and figurative) a snap to install the new keyboard, in just a few minutes.</p>
<p>Now, back to coding, and to wondering why Gradle does not seem to apply exclude patterns during compilation, and thus complains about Emacs temporary files being unreadable files.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/jpace.wordpress.com/293/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/jpace.wordpress.com/293/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/jpace.wordpress.com/293/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/jpace.wordpress.com/293/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/jpace.wordpress.com/293/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/jpace.wordpress.com/293/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/jpace.wordpress.com/293/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/jpace.wordpress.com/293/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/jpace.wordpress.com/293/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/jpace.wordpress.com/293/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/jpace.wordpress.com/293/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/jpace.wordpress.com/293/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/jpace.wordpress.com/293/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/jpace.wordpress.com/293/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=jpace.wordpress.com&amp;blog=3530591&amp;post=293&amp;subd=jpace&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://jpace.wordpress.com/2011/10/29/replacing-asus-k50ij-keyboard/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/08c544b6ad73dfc0e5a1a0d640c28d03?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Jeff Pace</media:title>
		</media:content>
	</item>
	</channel>
</rss>
