<?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"
	>

<channel>
	<title>Clowns In My Coffee &#187; nerdination</title>
	<atom:link href="http://clownsinmycoffee.net/category/nerdination/feed/" rel="self" type="application/rss+xml" />
	<link>http://clownsinmycoffee.net</link>
	<description>Inanity of the most cogent sort you can find.</description>
	<pubDate>Thu, 02 Oct 2008 11:41:56 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.6.2</generator>
	<language>en</language>
			<item>
		<title>Straight Outta Victoria</title>
		<link>http://clownsinmycoffee.net/2008/10/02/straight-outta-victoria/</link>
		<comments>http://clownsinmycoffee.net/2008/10/02/straight-outta-victoria/#comments</comments>
		<pubDate>Thu, 02 Oct 2008 01:55:51 +0000</pubDate>
		<dc:creator>adam</dc:creator>
		
		<category><![CDATA[nerdination]]></category>

		<category><![CDATA[whodathunk]]></category>

		<guid isPermaLink="false">http://clownsinmycoffee.net/?p=49</guid>
		<description><![CDATA[UVic&#8217;s Electronic Textual Cultures Lab encodes a song by some music guy in the Text Encoding Initiative XML format. There is, of course, a video.
What I want to know is, does this mean XML is cool or hopelessly pass&#38;eacute;?  Discuss.
]]></description>
			<content:encoded><![CDATA[<p>UVic&#8217;s <a href="http://etcl.uvic.ca/">Electronic Textual Cultures Lab</a> encodes a <a title="&amp;quot;Subterranean Homesick Blues&amp;quot; in TEI" href="http://etcl.uvic.ca/tei/?p=14">song by some music guy</a> in the <a href="http://www.tei-c.org/index.xml">Text Encoding Initiative</a> XML format. There is, of course, a <a title="Youtube video: TEI + Dylan" href="http://www.youtube.com/watch?v=4sHYDfITjHY">video</a>.</p>
<p>What I want to know is, does this mean XML is cool or hopelessly pass&amp;eacute;?  Discuss.</p>
]]></content:encoded>
			<wfw:commentRss>http://clownsinmycoffee.net/2008/10/02/straight-outta-victoria/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Goings On About Town</title>
		<link>http://clownsinmycoffee.net/2008/10/02/goings-on-about-town/</link>
		<comments>http://clownsinmycoffee.net/2008/10/02/goings-on-about-town/#comments</comments>
		<pubDate>Thu, 02 Oct 2008 01:46:55 +0000</pubDate>
		<dc:creator>adam</dc:creator>
		
		<category><![CDATA[nerdination]]></category>

		<category><![CDATA[mobile]]></category>

		<guid isPermaLink="false">http://clownsinmycoffee.net/?p=47</guid>
		<description><![CDATA[So, there&#8217;s this small office in downtown Chapel Hill that used to have a paper &#8220;Google&#8221; banner in the window.  Today, on a trip past the Cosmic Cantina, I noticed that the window now has a more permanent logo for Android. I&#8217;ll admit that the basic idea behind Android &#8211; a generally open cellphone platform [...]]]></description>
			<content:encoded><![CDATA[<p>So, there&#8217;s this small office in downtown Chapel Hill that used to have a paper &#8220;Google&#8221; banner in the window.  Today, on a trip past the Cosmic Cantina, I noticed that the window now has a more permanent logo for <a href="http://code.google.com/android/">Android</a>. I&#8217;ll admit that the basic <a title="Open Handset Alliance" href="http://www.openhandsetalliance.com/">idea behind Android</a><a title="Android overview" href="http://www.openhandsetalliance.com/android_overview.html"> </a>&#8211; a generally open cellphone platform mostly developed by the &#8216;net&#8217;s largest advertising distribution network &#8212; is really appealing, given how disappointing the current situation in the US is (e.g. I can take a picture on my current phone, but I can&#8217;t transfer it off the phone without emailing it, which means I&#8217;d have to pay a fee; and, equally important is the fact that the applications installed on the phone &#8230; well, they <em>suck</em>).  If it takes off, it could open up a range of possibilities for &#8220;mobile computing,&#8221; and I seriously hope it pulls the rest of the industry along with it.  We have these pocket communicators and the dominant business model for them is oriented around <em>ringtones</em>, fer gosh sakes.  Hm, on second thought, I don&#8217;t see how a modular, extensible platform&#8217;s going to change that, but maybe it will let me ignore it somewhat, which is good enough.</p>
<p>But why&#8217;s there an &#8220;Android&#8221; office in downtown Chapel Hill?  One <a title="iphone developer university program" href="http://developer.apple.com/iphone/program/university.html">related development</a> suggests itself &#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://clownsinmycoffee.net/2008/10/02/goings-on-about-town/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Fun With Copyright Renewal Records</title>
		<link>http://clownsinmycoffee.net/2008/07/01/fun-with-copyright-renewal-records/</link>
		<comments>http://clownsinmycoffee.net/2008/07/01/fun-with-copyright-renewal-records/#comments</comments>
		<pubDate>Tue, 01 Jul 2008 03:32:08 +0000</pubDate>
		<dc:creator>adam</dc:creator>
		
		<category><![CDATA[RDF]]></category>

		<category><![CDATA[Tools]]></category>

		<category><![CDATA[conferences]]></category>

		<category><![CDATA[nerdination]]></category>

		<guid isPermaLink="false">http://clownsinmycoffee.net/?p=46</guid>
		<description><![CDATA[Based on an enormous amount of work by contributors to Project Gutenberg and the Distributed Proofreaders, combined with healthy sourcing of the US copyright office&#8217;s records, Google has compiled a a list of works originally copyrighted between 1923 and 1963 which have been renewed at some point, the upshot being that if a given work [...]]]></description>
			<content:encoded><![CDATA[<p>Based on an enormous amount of work by contributors to <a href="http://www.gutenberg.org/wiki/Main_Page">Project Gutenberg</a> and the <a href="http://www.pgdp.net/c/">Distributed Proofreaders</a>, combined with healthy sourcing of the US <a href="http://www.copyright.gov/records/">copyright office&#8217;s records</a>, Google has compiled a <a href="http://booksearch.blogspot.com/2008/06/us-copyright-renewal-records-available.html">a list of works originally copyrighted between 1923 and 1963</a> which have been renewed at some point, the upshot being that if a given work published in that time span is <em>not</em> on the list, it&#8217;s likely in the public domain.
</p>
<p>
One problem with the list that the database is a 370+ megabyte XML file, which is hard to load up in an XML-aware editor and even caused <a title="eXist open source XML database" href="http://exist.sourceforge.net">eXist</a> to choke.  So I broke it up into chunks with a shortish Groovy script, for neat ingestion into an XML database.  The heart of the script is a SAX handler that basically churns each record in the XML file into a Groovy object, and a closure (there&#8217;s that word again!) that handles each record as it is constructed.  As written, the script simply breaks the big file into a bunch of files, one for each year (you will of course have to edit the paths).  By supplying a different closure, you could do all sorts of different things with the records, e.g. stuff them into a relational database.
</p>
<p>
In the spirit of the thing, the script is in the public domain &#8212; but I make no representations as to the quality, idiomaticity or overall efficiency of the script; despite being SAX-based, it still manages to chew up quite a bit of memory, so watch out.  Note that you will need <a href="http://commons.apache.org/lang">Apache Commons Lang</a> (say, version 2.4) on the classpath (e.g. in <code>$HOME/.groovy/lib</code>) for this script to work.  Developed with Groovy 1.5.6.
</p>
<p style="color: red">I&#8217;ve tried to stop wordpress from &#8216;prettyfying&#8217; the output, which appears to mangle quotes.  I hope to have that fixed soon &#8230;</p>
<pre style="border: 1px solid #000; padding: 1em; background-color: #ccc;">import org.xml.sax.helpers.DefaultHandler
import org.xml.sax.Attributes
import org.xml.sax.helpers.XMLReaderFactory
import org.xml.sax.InputSource

import org.apache.commons.lang.StringEscapeUtils
import org.xml.sax.Locator

/**
 * Represents an individual &lt;Record&gt; element
 * in the document.
 **/
class Record {
    def file

    def lines

    def recno

    def title

   def copyrightYear

    def copyrights = []

    def renewalYear

    def renewals = [] 

    // where it was published
    def published

    // rare!
    def note

    // source of the copyright info
    def source
    def snippet
    def md5sum

    // contributors, holders, and pseudonyms
    def people = []

    /**
     * Get the XML representing this element.  Note
     * that proper functioning here depends on how the
     * handler builds the elements.
     * @return a string containing this record's XML.
     */
    def xml() {
        def buf = new StringBuffer()
        buf &lt;&lt; """
&lt;Record&gt;
    &lt;Title&gt;${title}&lt;/Title&gt;
    &lt;File&gt;${file}&lt;/File&gt;
    &lt;Lines&gt;${lines}&lt;/Lines&gt;
    &lt;MD5Sum&gt;${md5sum}&lt;/MD5Sum&gt;
"""
        if (snippet) {
            buf &lt;&lt; "\t&lt;Snippet&gt;${snippet}&lt;/Snippet&gt;\n"
        }
        if (note) {
            buf &lt;&lt;"\t&lt;Note&gt;${note}&lt;/Note&gt;\n"
        }
        buf &lt;&lt;
"""
    &lt;Source&gt;${source}&lt;/Source&gt;
    &lt;CopyrightYear&gt;${copyrightYear}&lt;/CopyrightYear&gt;
    &lt;RenewalYear&gt;${renewalYear}&lt;/RenewalYear&gt;
"""
        copyrights.each() {
            buf &lt;&lt; it.xml()
        }
        renewals.each() {
            buf &lt;&lt; it.xml()
        }
        people.each() {
                buf &lt;&lt; it.xml()
        }
        buf &lt;&lt; "&lt;/Record&gt;\n"
        return buf.toString()
    }
}

/**
 * An inelegant class representing the elements that denote
 * people (copyright holders, contributors, aliases, etc.)
 **/
class Person {

    static ELEMENTS = ["Holder" :   [ "Name", "Type" ],
                        "Contrib" : [ "Name", "Role" ],
                        "Pseudonym" : [ "Pseudo", "Real" ],
                        "Neenym" : [ "Nee", "Now" ],
                        "Aka" : [ "Alias", "Real" ] ]

    static ROLES = ELEMENTS.keySet()

    def role

    def name

    def honorific

    def type

    def xml() {
        def firstElement = ELEMENTS[role][0]
        def secondElement = ELEMENTS[role][1]
        def buf = new StringBuffer()

        buf &lt;&lt; """
&lt;${role}&gt;
    &lt;${firstElement}&gt;${name}&lt;/${firstElement}&gt;
    &lt;${secondElement}&gt;$type&lt;/${secondElement}&gt;"""
    if ( honorific ) {
        buf &lt;&lt; "\t&lt;Hon&gt;${honorific}&lt;/Hon&gt;\n"
        }
    buf &lt;&lt; "&lt;/${role}&gt;\n"
    return buf.toString()
    }
}

/**
 * Represents copyright and renewal date elements.
 */
class RecordDate {

	static ELEMENTS = ["Copyright", "Renewal"]

    def role
    def date
    def id
    def xml() {
        return """&lt;${role}&gt;
    &lt;Date&gt;${date}&lt;/Date&gt;
    &lt;Id&gt;${id}&lt;/Id&gt;
&lt;/${role}&gt;"""
    }
}

/**
 * SAX handler that turns each &lt;code&gt;Record&lt;/code&gt; element
 * into a &lt;code&gt;Record&lt;/code&gt; domain object.
 **/
class RecordHandler extends DefaultHandler {

    /**
     * Stack of strings that represents the current
     * element context.
     **/
    Stack context = new Stack()

    /**
     * the current record being built.
     **/
    Record currentRec

    /**
     * the current Person element being built.
     **/
    Person currentPerson

    /**
     * The current date information being collected.
     **/
    RecordDate currentRecDate

    /**
     * A closure which will be called as each record is
     * read in.
     **/
    def recordListener

    /**
     * a buffer to collect the current text, since SAX might
     * not report all contiguous chunks of text at once.
     **/
    StringBuilder currentText = new StringBuilder()

    def locator

    @Override
    public void setDocumentLocator(Locator locator)
    {    println "Got a locator: ${locator}"
        this.locator = locator
    }

    @Override
    public void startElement(String uri, String localName, String qName, Attributes atts)
    {
        context &lt;&lt; localName
        switch( localName ) {
            case "Record":
                currentRec = new Record()
                break
            case Person.ROLES:
                currentPerson = new Person()
                currentPerson.role = localName
                break
            case RecordDate.ELEMENTS:
                currentRecDate = new RecordDate()
                currentRecDate.role = localName
                break
        }
    }

    @Override
    public void characters(char [] ch, int start, int len)
    {
        currentText.append(ch,start,len)
    }

    @Override
    public void endElement(String uri, String localName, String qName)
    {
        String txt = StringEscapeUtils.escapeXml(currentText.toString().trim())
        switch(localName) {
            case Person.ROLES:
                currentRec.people &lt;&lt; currentPerson
                break
            case ["Type", "Role", "Real", "Now"]:
                currentPerson.type = txt
                break
            case ["Name", "Pseudo", "Nee", "Alias"]:
                currentPerson.name = txt
                break
            case "Hon":
                currentPerson.honorific = txt
               break;
            case "CopyrightYear":
                currentRec.copyrightYear = Integer.parseInt(txt)
                break
            case "Date":
                currentRecDate.date = txt
                break
            case "Id":
                currentRecDate.id = txt
                break
            case "Copyright":
                currentRec.copyrights &lt;&lt;currentRecDate
                break
            case "RenewalYear":
                currentRec.renewalYear = Integer.parseInt(txt)
                break
            case "Renewal":
                currentRec.renewals &lt;&lt; currentRecDate
                break
            case "Recno":
                currentRec.recno = txt
                break
            case "Source":
                currentRec.source = txt
                break
            case "Lines":
                currentRec.lines = txt
                break
            case "MD5Sum":
                currentRec.md5sum = txt
                break
            case "File":
                currentRec.file = txt
                break
            case "Snippet":
                currentRec.snippet = txt
                break
            case "Title":
                currentRec.title = txt
                break
            case "Published":
                currentRec.published = txt
                break
            case "Record":
                recordListener(currentRec)
                break
            case "Note":
                currentRec.note = txt
                break
            case "CopyrightRenewalRecords":
                break
            default:
                println "Unrecognized element '${localName}' at line ${locator.lineNumber}"
                System.exit(1)
            }
        currentText.length = 0
    }

}

def file = new File("input-dir/google-renewals-20080624/google-renewals-20080624.xml")

/**
 * A listener that will output each record into a different stream depending
 * on the CopyrightYear of the record.
 **/
def listenerBase = { Map streams, Record it -&gt;
    if ( !streams.containsKey(it.copyrightYear) ) {
        def f = new File("/output/dir/copyright-${it.copyrightYear}.xml")
        println "creating ${f.absolutePath}"
        def stream = f.newWriter()
        streams[it.copyrightYear] = stream
        stream.append("&lt;CopyrightRenewalRecords&gt;")
    }
    Writer s = (Writer)streams[it.copyrightYear]
    s.append(it.xml())
    s.flush()
}

def reader = XMLReaderFactory.createXMLReader()
def handler = new RecordHandler()
def outputStreams = [:]
handler.recordListener = listenerBase.curry(outputStreams)
reader.setContentHandler( handler )

try {
    reader.parse( new InputSource( file.newInputStream() ) )
} catch (Exception x) {
    x.printStackTrace()
    println "Error at line ${handler.locator.lineNumber}"
}

outputStreams.each() {
    k, BufferedOutputStream v -&gt;
        println "Closing ${k}"
        v.append("&lt;/CopyrightRenewalRecords&gt;")
        v.flush()
        v.close()
}</pre>
]]></content:encoded>
			<wfw:commentRss>http://clownsinmycoffee.net/2008/07/01/fun-with-copyright-renewal-records/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Adding Shift-select with jQuery</title>
		<link>http://clownsinmycoffee.net/2008/04/18/add-shift-select-with-jquery/</link>
		<comments>http://clownsinmycoffee.net/2008/04/18/add-shift-select-with-jquery/#comments</comments>
		<pubDate>Fri, 18 Apr 2008 17:48:07 +0000</pubDate>
		<dc:creator>adam</dc:creator>
		
		<category><![CDATA[Tools]]></category>

		<category><![CDATA[Uncategorized]]></category>

		<category><![CDATA[nerdination]]></category>

		<category><![CDATA[closure]]></category>

		<category><![CDATA[code]]></category>

		<category><![CDATA[jquery]]></category>

		<guid isPermaLink="false">http://clownsinmycoffee.net/?p=45</guid>
		<description><![CDATA[
 I&#8217;ve been using jQuery a bit here and there to add some (I hope) usability enhancements and for light AJAJ work.  Today I encountered a situation where I thought adding the &#8220;shift-select&#8221; feature on a longish list of checkboxes would be a good thing. This sort of feature pops up in webmail interfaces, [...]]]></description>
			<content:encoded><![CDATA[<p>
 I&#8217;ve been using <a href="http://jquery.com">jQuery</a> a bit here and there to add some (I hope) usability enhancements and for light AJAJ work.  Today I encountered a situation where I thought adding the &#8220;shift-select&#8221; feature on a longish list of checkboxes would be a good thing. This sort of feature pops up in webmail interfaces, where you tick off one box, scroll down through 750 spam messages, and then, while holding down shift on the 751st piece of spam in a row, click its checkbox to select all of the rows in between.  It turns out that adding this with jQuery is pretty elegant, so here&#8217;s the code.  I don&#8217;t for a moment think this is the best implementation of this idea, but I was struck by how concise the result was, while supporting &#8212; via a straightforward use of a <a href="http://en.wikipedia.org/wiki/Closure_(computer_science)">closure</a>, multiple instances on the same page.  For giggles, I added a feature that allows you to de-select a range, although I&#8217;m not convinced it works in an intuitive way.
</p>
<p>To use this, you&#8217;ll need jQuery (tested against 1.2.3) in your page, and a CSS selector that matches the checkboxes you want to enable shift-select on. Then call <code>$(selector).shiftSelect();</code> and you&#8217;re done.
</p>
<pre>
 jQuery.fn.shiftSelect = function() {
    var checkboxes = this;
    var lastSelected;
    jQuery(this).click( function(event) {

        if ( !lastSelected ) {
            lastSelected = this;
            return;
        }

        if ( event.shiftKey ) {
            var selIndex = checkboxes.index(this);
            var lastIndex = checkboxes.index(lastSelected);
            /*
             * if you find the "select/unselect" behavior unseemly,
             * remove this assignment and replace 'checkValue'
             * with 'true' below.
             */
            var checkValue = lastSelected.checked;
            if ( selIndex == lastIndex ) {
                return true;
            }

            var end = Math.max(selIndex,lastIndex);
            var start = Math.min(selIndex,lastIndex);
            for(i=start;i&lt;=end;i++) {
                checkboxes[i].checked = checkValue;
            }
        }
        lastSelected = this;
    });
}
</pre>
]]></content:encoded>
			<wfw:commentRss>http://clownsinmycoffee.net/2008/04/18/add-shift-select-with-jquery/feed/</wfw:commentRss>
		</item>
		<item>
		<title>D2&#8242;d</title>
		<link>http://clownsinmycoffee.net/2008/01/16/d2d/</link>
		<comments>http://clownsinmycoffee.net/2008/01/16/d2d/#comments</comments>
		<pubDate>Wed, 16 Jan 2008 14:48:37 +0000</pubDate>
		<dc:creator>adam</dc:creator>
		
		<category><![CDATA[nerdination]]></category>

		<category><![CDATA[music cowon !ipod]]></category>

		<guid isPermaLink="false">http://clownsinmycoffee.net/2008/01/16/d2d/</guid>
		<description><![CDATA[  Not that I want to generate the impression here that all I do is buy electronic gadgets and software, but I just got an 8GB Cowon D2 [pronounced "coe-on", btw], which costs about the same as an 8GB version of a somewhat more popular digital music player, except that it has a touch [...]]]></description>
			<content:encoded><![CDATA[<p>  Not that I want to generate the impression here that all I do is buy electronic gadgets and software, but I just got an 8GB <a href="http://www.anythingbutipod.com/archives/2007/04/cowon-iaudio-d2-review.php" title="Cowon D2 review">Cowon D2</a> [pronounced "coe-on", btw], which costs about the same as an 8GB version of a somewhat more popular digital music player, except that it has a touch screen, accepts SD cards for extra storage, and, oh, yes, plays OGG Vorbis and FLAC files (and it has an FM tuner and can also act as a sound recorder).</p>
<p>One also, get this, does not generally interface with a D2 via a proprietary piece of software (although you have that option if you want it)&#8211; one attaches the player via a USB cable and accesses it like any other USB storage.  OTOH, it&#8217;s a little bit bigger, has a somewhat clunkier interface, and it appears to be extremely sensitive to being disconnected before it&#8217;s ready, to the extent that it becomes unresponsive if you don&#8217;t &#8220;stop&#8221; (windows) or &#8220;unmount&#8221; (*nix) it; as a matter of fact, mine doesn&#8217;t cotton to being connected to OS X at all.  That&#8217;s fine, though, because for some funny reason I don&#8217;t have much in the way of .ogg and .flac files on my OS X machine &#8230;</p>
<p>Plus: a scientific calculator!</p>
]]></content:encoded>
			<wfw:commentRss>http://clownsinmycoffee.net/2008/01/16/d2d/feed/</wfw:commentRss>
		</item>
		<item>
		<title>XO&#8217;d</title>
		<link>http://clownsinmycoffee.net/2007/12/19/xod/</link>
		<comments>http://clownsinmycoffee.net/2007/12/19/xod/#comments</comments>
		<pubDate>Wed, 19 Dec 2007 20:20:12 +0000</pubDate>
		<dc:creator>adam</dc:creator>
		
		<category><![CDATA[nerdination]]></category>

		<category><![CDATA[olpc laptop]]></category>

		<guid isPermaLink="false">http://clownsinmycoffee.net/2007/12/19/xod/</guid>
		<description><![CDATA[
Shh, don&#8217;t tell the nephew, but he&#8217;s getting an XO laptop.  It&#8217;s here, but I haven&#8217;t taken it out yet &#8212; I am personfully resisting the temptation until I have a good excuse in a few days.


If you haven&#8217;t already plumped for one, there&#8217;s still 12 days left!
Just sayin&#8217; &#8230;
]]></description>
			<content:encoded><![CDATA[<p>
Shh, don&#8217;t tell the nephew, but he&#8217;s getting an <a href="http://www.laptop.org/en/laptop/">XO laptop</a>.  It&#8217;s here, but I haven&#8217;t taken it out yet &#8212; I am personfully resisting the temptation until I have a good excuse in a few days.
</p>
<p>
If you haven&#8217;t already plumped for one, there&#8217;s still <a href="http://www.laptopgiving.org/" title="OLPC Give One, Get One Program">12 days left</a>!<br />
Just sayin&#8217; &#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://clownsinmycoffee.net/2007/12/19/xod/feed/</wfw:commentRss>
		</item>
		<item>
		<title>The Messagening</title>
		<link>http://clownsinmycoffee.net/2007/10/30/the-messagening/</link>
		<comments>http://clownsinmycoffee.net/2007/10/30/the-messagening/#comments</comments>
		<pubDate>Tue, 30 Oct 2007 12:02:07 +0000</pubDate>
		<dc:creator>adam</dc:creator>
		
		<category><![CDATA[nerdination]]></category>

		<guid isPermaLink="false">http://clownsinmycoffee.net/2007/10/30/the-messagening/</guid>
		<description><![CDATA[ Now that the day job is looking like it&#8217;s going to be more and more SOA oriented, in the WS-* sense, my interest in less complex things that can play in that space is getting piqued. It&#8217;s been clear for a while that XMPP is going to be one of those things &#8212; there [...]]]></description>
			<content:encoded><![CDATA[<p> Now that the day job is looking like it&#8217;s going to be more and more<acronym title="Service Oriented Architecture"> SOA</acronym> oriented, in the WS-* sense, my interest in less complex things that can play in that space is getting piqued. It&#8217;s been clear for a while that <a href="http://www.xmpp.org">XMPP</a> is going to be one of those things &#8212; there are a lot of things you can do on a foundation of durable messaging and presence.</p>
<p>There&#8217;s an extension to the protocol to <a href="http://www.xmpp.org/extensions/xep-0060.html">support the Pub/Sub model</a> which allows, among other things, pushing updates out to an XMPP server instead of requiring clients to poll a feed &#8212; with built in support for authentication and SSL. More experimental work concerns &#8220;shared editing&#8221; of documents.</p>
<p>Set up a private server, and run clients on the systems you administer. You can query, monitor,and even run commands on the them; support for presence lets you see which of them are currently online. Take a look at the list of <a href="http://www.xmpp.org/extensions/">Extensions to XMPP</a> already available, or in progress.</p>
]]></content:encoded>
			<wfw:commentRss>http://clownsinmycoffee.net/2007/10/30/the-messagening/feed/</wfw:commentRss>
		</item>
		<item>
		<title>So, I Broke Down</title>
		<link>http://clownsinmycoffee.net/2007/10/16/so-i-broke-down/</link>
		<comments>http://clownsinmycoffee.net/2007/10/16/so-i-broke-down/#comments</comments>
		<pubDate>Tue, 16 Oct 2007 03:02:35 +0000</pubDate>
		<dc:creator>adam</dc:creator>
		
		<category><![CDATA[Tools]]></category>

		<category><![CDATA[nerdination]]></category>

		<guid isPermaLink="false">http://clownsinmycoffee.net/2007/10/16/so-i-broke-down/</guid>
		<description><![CDATA[Just a little bit; I tried out the prerelease of IntelliJ IDEA 7.0, and I liked it enough after some rough handling in casual use to actually pony up for a license now that it&#8217;s officially released.  Like Netbeans, a default install does a whole lot more things I&#8217;d like an IDE to do [...]]]></description>
			<content:encoded><![CDATA[<p>Just a little bit; I tried out the prerelease of <a href="http://www.jetbrains.com/idea/">IntelliJ IDEA 7.0</a>, and I liked it enough after some rough handling in casual use to actually pony up for a license now that it&#8217;s officially released.  Like Netbeans, a default install does a whole lot more things I&#8217;d like an IDE to do than Eclipse does, and like Netbeans and unlike Eclipse, it&#8217;s failed to crash randomly on me.  Yep, the prerelease was pretty smooth.  Now that I&#8217;ve actually fallen for that old trick, although I tried the release (build 7361) on three different operating systems with a total of five different JVMs, I can&#8217;t get it to run.  If I were to run a guessing game, I would not award points for guessing which platform provides the least help in figuring out what might be the problem.  Essentially, the startup sequence seems to be going into an infinite loop looking for an error handler that isn&#8217;t there.</p>
<p>Now, of course, this thing had better ought to be <em>really</em> good.</p>
<p><strong>update</strong>: what appears to have solved my problem is changing the options for the JVM that IntelliJ runs in; namely, make sure to add <tt>-Doldlicenseserver</tt> to them (which file to edit depends on the platform).</p>
]]></content:encoded>
			<wfw:commentRss>http://clownsinmycoffee.net/2007/10/16/so-i-broke-down/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Coincidence?</title>
		<link>http://clownsinmycoffee.net/2007/09/06/coincidence/</link>
		<comments>http://clownsinmycoffee.net/2007/09/06/coincidence/#comments</comments>
		<pubDate>Thu, 06 Sep 2007 18:29:44 +0000</pubDate>
		<dc:creator>adam</dc:creator>
		
		<category><![CDATA[nerdination]]></category>

		<guid isPermaLink="false">http://clownsinmycoffee.net/2007/09/06/coincidence/</guid>
		<description><![CDATA[You decide.  Last week, for reasons related specifically to xorg driver issues (read: I couldn&#8217;t get it to drive my 1680&#215;1050 panel),  I went out and replaced the latest in a long line of ATI-based video cards with an NVidia-based card.  Then, I find out that AMD/ATI are shipping a reworked X [...]]]></description>
			<content:encoded><![CDATA[<p>You decide.  Last week, for reasons related specifically to <a href="http://xorg.freedesktop.org/wiki/" title="xorg wiki">xorg</a> driver issues (read: I couldn&#8217;t get it to drive my 1680&#215;1050 panel),  I went out and replaced the latest in a long line of ATI-based video cards with an NVidia-based card.  Then, I find out that AMD/ATI are shipping a reworked X driver, followed by the announcement that <a href="http://lwn.net/Articles/248227/" title="ATI opening specs: Linux Weekly News ">AMD are opening the specifications up</a> (meaning, for those of you not steeped in such issues, that it should be possible for the wide world out there to produce excellent open source drivers without having to guess).  <a href="http://www.0xdeadbeef.com/weblog/?p=302">Christopher Blizzard provides more context</a>.</p>
<p>I will comfort myself by reflecting on the fact that the card I replaced is too old to be affected by the opening of the specs, and that I still got the near-instant gratification of more screen real estate.  I mean, it&#8217;s not like I <a href="http://publicrealm.com/">bought an iPhone at launch</a> or anything &#8230;</p>
<p><strong>update </strong>apparently sad-sack iPhone early adopters are getting a hundred bucks credit (to be spent on Apple products,such as discontinued ipod lines, no doubt &#8230;)</p>
]]></content:encoded>
			<wfw:commentRss>http://clownsinmycoffee.net/2007/09/06/coincidence/feed/</wfw:commentRss>
		</item>
		<item>
		<title>On Discipline</title>
		<link>http://clownsinmycoffee.net/2007/08/15/on-discipline/</link>
		<comments>http://clownsinmycoffee.net/2007/08/15/on-discipline/#comments</comments>
		<pubDate>Wed, 15 Aug 2007 14:12:03 +0000</pubDate>
		<dc:creator>adam</dc:creator>
		
		<category><![CDATA[Tools]]></category>

		<category><![CDATA[nerdination]]></category>

		<guid isPermaLink="false">http://clownsinmycoffee.net/2007/08/15/on-discipline/</guid>
		<description><![CDATA[I&#8217;ve been brewing a post about the eternal need for discipline by developers, and then Jeff Atwood posts Discipline Makes Strong Developers.  Mine was going to be really good, too, full of all sorts of insights, phrased in a manner an effete critic might have labeled &#8220;delectable&#8221; or, not to puff myself up too [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve been brewing a post about the eternal need for discipline by developers, and then Jeff Atwood posts <a href="http://www.codinghorror.com/blog/archives/000931.html">Discipline Makes Strong Developers</a>.  Mine was going to be really good, too, full of all sorts of insights, phrased in a manner an effete critic might have labeled &#8220;delectable&#8221; or, not to puff myself up too much, &#8220;sapid.&#8221;  I&#8217;ll console myself with the thought that someone with a much larger readership said it really well, because it&#8217;s important.  </p>
<p>I feel like I should add <em>some</em> value over whatever weak link-fu I can contribute.  It&#8217;s not just &#8220;developers&#8221; construed in some narrow sense that need to hear the call, either (see the crazy desktop Atwood uses as an illustration).  A companion lesson is that the type of faith many people place in tools is not well-placed: &#8220;if we just add the <em>Gzmotronk</em> into the mix, it will solve all of our problems with ____!&#8221;  That trick <em>never</em> works.  In my experience, if there&#8217;s a serious problem in getting information from one place to where it needs to be (a vague description that covers a lot of development tasks), the thing that&#8217;s most broken is the human part of the process.  Tools can automate away some of the more mechanical tasks (as the enabling technologies improve and new techniques are developed, the realm of the &#8220;mechanical&#8221; expands), but it takes discipline to make proper use of the things that aren&#8217;t mechanized.</p>
]]></content:encoded>
			<wfw:commentRss>http://clownsinmycoffee.net/2007/08/15/on-discipline/feed/</wfw:commentRss>
		</item>
	</channel>
</rss>
