<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0">
<channel>
<title>The Fast Country</title>
<link>http://www.corriganjc.net/weblog/</link>
<description>John Corrigan&apos;s Weblog</description>
<copyright>Copyright 2009</copyright>
<lastBuildDate>Sun, 05 Jul 2009 23:18:16 +0000</lastBuildDate>
<generator>http://www.movabletype.org/?v=3.15</generator>
<docs>http://blogs.law.harvard.edu/tech/rss</docs> 

<item>
<title>&quot;Take this REPL, brother, and may it serve you well.&quot;</title>
<description><![CDATA[<img src="http://www.corriganjc.net/weblog/Clojure_300x300.png" border="0" height="300" width="300" alt="Clojure_300x300.png" align="right" /><p>I have recently started playing with <a href="http://clojure.org/">Clojure</a>. Like <a href="http://www.antlr.org/">ANTLR</a> it also has the <a href="http://www.corriganjc.net/weblog/archives/2007/06/the_antlr_trini.html">trinity</a> of technology, documentation, and tools. On the technology side Clojure is as Lisp dialect that runs on top of the Java Virtual Machine. For me, it has three outstanding features. These are superb Java integration, its concurrency features especially software transaction memory, and the lazy sequence library.</p>
<p>Clojure has very good Java integration. Calling Java code is easy and direct. Classes in the <code>java.lang</code> package are imported automatically. Classes in other packages can be imported using the <code>(import ...)</code> form. Java objects can be created using the <code>(new <i>classname</i>...)</code> form or the <code>(<i>classname</i><b>.</b> ...)</code> macro. Calling methods is just as easy.</p>
<p>Clojure includes both an interpreter and a compiler. The compiler compiles Clojure code to Java byte code in standard Java class files, so Clojure code can be called from Java code easily. In addition Clojure provides a <code>(proxy ...)</code> macro, which creates a proxy class, of a particular type, and sets the implementation for some or all of the methods of the interface. This is useful when calling Java code that need callback classes, such as, for example a SAX <code>ContentHandler</code>. For Java code that need <code>Runnable</code> or <code>Callable objects</code>, the <code>(proxy ...)</code> macro is not even needed, as all Clojure functions automatically implement both these interfaces.</p>
<p>Clojure also includes functions to generate primitive Java types and arrays and to work with Java primitive arrays.</p>
<p>The second outstanding feature is concurrency support. In addition to all the Java concurrency features, Clojure has two extra features to enable ease development of programs which need concurrency. These features are Agents and Software Transaction Memory. By default data is immutable in Clojure: once a data binding is set, it normally cannot be changed. <b>Refs</b> are an exception to this. They can be changed but only in the context of a transaction in the Software Transactional Memory (STM). STM is the in memory reference analogue of database table transactions. Agents are another exception. Updates to agent values are done by sending asynchronous messages using the <code>(send ...)</code> or <code>(send-off ...)</code> forms. The update message consists of an update function that is applied to the agent's data. The updates are are queued and handled atomically in a separate thread.</p>
<p>The last killer feature for me is the lazy sequence library. Clojure includes a library that allows for lazily evaluated sequences to be defined. This allows for infinite sequences to be defined: the elements in the sequence are only actually generated as they are needed, so memory is not wasted. If it turns out that only a limited number of elemnts are actually used, this can save quite a bit on processing time, too. All the main sequence processing functions, such as <code>(map ...)</code>, etc., return lazy sequences, so lazy sequences end up being quite powerful.</p>
<p>Documentation is available at the REPL via the <code>(doc ..)</code> and <code>(find-doc ...)</code> forms. There is a fantastic book, published by the Pragramatic Programmers, called <a href="http://www.pragprog.com/titles/shcloj/programming-clojure">Programming Clojure</a>. In this book the author, Stuart Halloway, gives a solid introduction to all of the features of Clojure. There are chapters devoted to macros, Java integration, Clojure's concurrency features, Clojure's sequence library, and the multimethod feature. All of these are accompanied by informative examples and each chapter ends with the application of the leasons to an extended example: a build DSL called Lancet. The book also contains a chapter on funtional programming, which deals with all the features that help with programming in a functional style, such as lazy sequences, partial function evaluation using the <code>(partial ...)</code> form, and the forms to enable efficient recursion. The book ends with a chapter called "Clojure in the Wild", which deals with real world issues with using Clojure, such as connecting to database, running unit tests, and building web applications with Clojure.</p>
<p>The final member of the trinity is tools support. A Clojure mode has been developed for Emacs, and Clojure support has been added to SWANK and SLIME. The three of these provide a very nice development environment for Clojure, with syntax highlighting, indenting, and an embedded and integrated REPL, for trying stuff out. All the SLIME key-bindings seem to do what is expected, though, I haven't used a lot of them yet as I am still getting used to the environment. However, documentation look up and the different evaluation options seem to work a treat. There are even a few humorous touches: the title of this post is one of the messages SLIME gives you when you change to a buffer to SLIME mode with <code>M-x slime</code>. All in all, the whole experience has taken me one step further along the path to <del>The Dark Side</del> regular Emacs usage.</p>
<p>The whole thing was very easy to set up: I just followed the instructions at this <a href="http://riddell.us/tutorial/slime_swank/slime_swank.html">web page</a>, and was up and running in about 5 minutes. <a href="http://bc.tech.coop/blog/081023.html">A post</a> on Bill Clementson's blog was also useful, though, it would probably be more useful for an experienced Lisper.</p>
        <p><span class="technoratiTitle">Technorati Tags:</span>
            <a class="technoratiTag" href="http://technorati.com/tag/programming" rel="tag">programming</a>
            <a class="technoratiTag" href="http://technorati.com/tag/clojure" rel="tag">clojure</a>
        </p>]]></description>
<link>http://www.corriganjc.net/weblog/archives/2009/07/take_this_repl.html</link>
<guid>http://www.corriganjc.net/weblog/archives/2009/07/take_this_repl.html</guid>
<category>Programming</category>
<pubDate>Sun, 05 Jul 2009 23:18:16 +0000</pubDate>
</item>
<item>
<title>Dual Booting OpenSolaris and Ubuntu 8.10</title>
<description><![CDATA[            <p>Recently, I bought a new laptop. There are a number of tools and technologies that I am interested in that are included with either Ubuntu Linux or OpenSolaris. I decided that I would set up my new laptop to dual boot OpenSolaris and Ubuntu Linux 8.10. Both operating systems use the GRUB bootloader so in theory it should be easy to get them to work together. In practice it was not so easy. I am writing this post just in case other people have the same issues I had.</p>
            <p>The problem with setting up the two operating systems to dual boot is that although they both use GRUB as their bootloader, their versions of GRUB have both been modified to handle special circumstances for the OS in question. The GRUB versions are like feuding cousins: they have the same name, the same origin, and they look pretty similar, but they are different enough that the just don't get along.</p>
            <p>It turns out that the version of GRUB for each operating system doesn't understand the default filesystem that the other installs on. Linux doesn't support <code>ZFS</code>, so, plainly, its GRUB wouldn't either. The problem with OpenSolaris' GRUB was a little more obscure as, in theory it should have supported <code>ext3</code>. I found a blog posting, by <a href="http://blogs.sun.com/fifors/en_US/entry/new_beginnings">Peter Buckingham</a>, entitled <a href="http://blogs.sun.com/fifors/en_US/entry/grub_grub_why_do_you">GRUB, GRUB, why do you haunt me so?</a>, which explained the problem. In Peter's words:</p>
            <blockquote>
                <p>At this point I did some digging Google is your friend. So it turns out that the problem is a little while back the size of the inode for ext3 was increased to 256 bytes to make it more forward compatible with ext4. My old Ubuntu and OpenSolaris setup never hit this because the filesystems were set up with the older sized inodes.</p>
            </blockquote>
            <p>Peter fixed his problem by patching the OpenSolaris GRUB, so eventually Peter's fix will be committed into OpenSolaris and the issue will go away. However that was a little too involved for me. My solution to the impasse was to create an ext2 boot partition for Ubuntu and have the OpenSolaris version of GRUB chainload that. The steps I used to do that are as follows:</p>
         <ol>
             <li>
                 <p>Partition the disk into 4 partions. For me the partition <code>fdisk -lu</code> gives back the following:</p>
<pre><small>
Device Boot      Start         End      Blocks   Id  System
/dev/sda1              63      208844      104391   83  Linux
/dev/sda2          208845   461001239   230396197+  83  Linux
/dev/sda3   *   461001240   923512589   231255675   bf  Solaris
/dev/sda4       923512590   976768064    26627737+  82  Linux swap
</small>            
</pre>
                 <p>The first is for an ext2 partion to hold Linux's <code>/boot</code>. The second partition is for the rest of Ubuntu Linux, on ext3, the third for OpenSolaris, and the last one is for Linux swap.</p>
             </li>
             <li><p>Install Ubuntu Linux 8.10, with the first partition mounted as <code>/boot</code> and the second partition mounted as <code>/</code>.</p></li>
             <li><p>Install GRUB into the start of the <code>/boot</code> partition. This can be done from the GRUB command line. For my setup, I typed the following at the GRUB command line:</p>
<pre>
root (hd0,0)
setup (hdo,0)
</pre>
                 <p>Alternatively, you can get the Ubuntu installer to do this for you in the <b>Advanced Setup</b> dialog box, accessed from the partitions page in the setup wizard.</p>
             </li>
             <li><p>Install OpenSolaris.</p></li>
             <li><p>Add an entry to the OpenSolaris <code>menu.lst</code> file, located in <code>/rpool/boot/grub</code>, to chainload the Ubuntu GRUB. For me the entry looked like this:</p>
<pre>
title Ubuntu Linux 8.10
root (hd0,0)
chainloader (hd0,0)+1
</pre>
             </li>
         </ol>
         <p>That should leave you with a system that dual boots OpenSolaris and Ubuntu Linux 8.10.</p>
         <p>The following links were useful to me when I was trying to figure out GRUB:</p>
            <ul>
                <li><a href="http://users.bigpond.net.au/hermanzone/p15.htm">A GRUB reference site</a></li>
                <li><a href="http://users.bigpond.net.au/hermanzone/p15.htm#How_to_make_a_separate_boot_partition">Making a separate boot partition</a></li>
                <li><a href="http://www.dedoimedo.com/computers/grub.html">GRUB bootloader - Full tutorial </a></li>
                <li><a href="http://www.vsubhash.com/writeups/multiboot_os.asp">How To Multi-Boot Operating Systems</a></li>
            </ul>
            <p><span class="technoratiTitle">Technorati Tags:</span>
                <a class="technoratiTag" href="http://technorati.com/tag/Ubuntu" rel="tag">Ubuntu</a>
                <a class="technoratiTag" href="http://technorati.com/tag/OpenSolaris" rel="tag">OpenSolaris</a>
                <a class="technoratiTag" href="http://technorati.com/tag/GRUB" rel="tag">GRUB</a>
                <a class="technoratiTag" href="http://technorati.com/tag/multiboot" rel="tag">multiboot</a>
            </p>]]></description>
<link>http://www.corriganjc.net/weblog/archives/2009/01/dual_booting_op.html</link>
<guid>http://www.corriganjc.net/weblog/archives/2009/01/dual_booting_op.html</guid>
<category>Programming</category>
<pubDate>Sun, 18 Jan 2009 21:38:23 +0000</pubDate>
</item>
<item>
<title>Hungarian Wine</title>
<description><![CDATA[        <blockquote cite="Louis XIV"><p><span>Vinum Regum, Rex Vinorum</span></p><p><cite>Louis XIV</cite></p></blockquote>
        <p>A few years ago I had the good fortune to spend a 10 days in Budapest. While there I developed a taste for Hungarian wine, especially <a href="http://en.wikipedia.org/wiki/Egri_Bikav%C3%A9r">Egri Bik&aacute;ver</a>, and <a href="http://en.wikipedia.org/wiki/Tokaji">Tokaji</a>, the wine that Louis XIV loved so much. These wines used to be very difficult to come by in Ireland. Fortunately, this is no longer the case, as a wine shop specializing in Hungarian wines has opened in Dublin. The shop is called <a href="http://www.hungarianwine.ie/">Essence of Wine</a> and is located in the Moore Street Mall. The staff there are passionate about wine, very knowledgeable and helpful. I was there a few weekends ago I spent about half an hour chatting about wine and Budapest with Laszlo, one of the guys that runs the place. Over the course of the conversation he recommended 2 wines from the Gal Tibor winery, which I bought, and which were shared with friends last night. They were superb. So if you happen to be shopping in Dublin for a good bottle of wine, I'd recommend there.</p>
<p><span class="technoratiTitle">Technorati Tags:</span>
<a class="technoratiTag" href="http://technorati.com/tag/wine" rel="tag">wine</a>
<a class="technoratiTag" href="http://technorati.com/tag/Hungary" rel="tag">Hungary</a>
</p>]]></description>
<link>http://www.corriganjc.net/weblog/archives/2007/08/hungarian_wine.html</link>
<guid>http://www.corriganjc.net/weblog/archives/2007/08/hungarian_wine.html</guid>
<category></category>
<pubDate>Sun, 26 Aug 2007 22:08:08 +0000</pubDate>
</item>
<item>
<title>Martin Fowler test-drives Parser Generators</title>
<description><![CDATA[<p>I have been catching up on my blog reading this weekend. One of the blogs I have caught up on is <a href="http://martinfowler.com/bliki/">Martin Fowler's</a>. Recently, i.e., since February, he has being trying out parser generator tools and he has written a series of posts on his experiences.</p>
        <ul>
            <li><a href="http://martinfowler.com/bliki/HelloSablecc">HelloSablecc</a></li>
            <li><a href="http://martinfowler.com/bliki/HelloAntlr">HelloAntlr</a></li>
            <li><a href="http://martinfowler.com/bliki/FlexibleAntlrGeneration.html">FlexibleAntlrGeneration</a></li>
            <li><a href="http://martinfowler.com/bliki/HelloCup">HelloCup</a></li>
            <li><a href="http://martinfowler.com/bliki/HelloRacc">HelloRacc</a></li>
        </ul>
<p><span class="technoratiTitle">Technorati Tags:</span>
<a class="technoratiTag" href="http://technorati.com/tag/programming" rel="tag">programming</a>
<a class="technoratiTag" href="http://technorati.com/tag/antlr" rel="tag">antlr</a>
<a class="technoratiTag" href="http://technorati.com/tag/sablecc" rel="tag">sablecc</a>
<a class="technoratiTag" href="http://technorati.com/tag/parsers" rel="tag">parsers</a>
<a class="technoratiTag" href="http://technorati.com/tag/racc" rel="tag">racc</a>
<a class="technoratiTag" href="http://technorati.com/tag/cup" rel="tag">cup</a>
</p>]]></description>
<link>http://www.corriganjc.net/weblog/archives/2007/07/martin_fowler_t.html</link>
<guid>http://www.corriganjc.net/weblog/archives/2007/07/martin_fowler_t.html</guid>
<category>Programming</category>
<pubDate>Sun, 08 Jul 2007 20:14:02 +0000</pubDate>
</item>
<item>
<title>The ANTLR Trinity</title>
<description><![CDATA[        <p>There are 3 components to a really useful software development technology: innovative features, clear and comprehensive documentation, and solid tools. The recent release of ANTLR v3.0 is a perfect example of this. This parser generator tool has all 3 components and each component is done superbly.</p>
        <p><a href="http://www.antlr.org">ANTLR</a> is a parser generator tool that is capable of targeting multiple output languages. Out of the box, it will generate Java, Python, C, C#, or Ruby code. Other target languages are possible if the code generators are written. Amongst its cool features are:</p>
        <ul>
        <li><p>LL(*) parsing: This is an extension to the normal, top down with lookahead, LL(k) parsing technique. It allows for more powerful parsers than those possible with LL(k). Not something I have needed yet, but I can see it being useful in the future.</p></li>
        <li><p>Semantic and syntactic predicates: These are tests that can be embedded in grammar rules to turn certain choices in rules on and off based on a boolean test. These allow parsers to be built that simulate recognizers for context dependent grammars and this makes the automated parser generation applicable to a lot more problems. Again, this is something I haven't used yet, but will be in the future.</p></li>
            <li><p>Memoized backtracking: This is a performance improving feature for grammars that use a lot of lookahead. If a parser fails at a choice near the end of the rule it has to go back to the start of the rule and start matching again. The memoization of intermediate matches for a rule speeds this up.</p></li>
            <li><p>Unicode support: parsers built with ANTLR recognize Unicode input. ANTLR grammar files themselves do not recognize Unicode characters yet, but Unicode characters can be specified as escape sequences.</p></li>
            <li><p>Hierarchical lexers: Most parser generator tools define tokens by means of a regular expression like language. For these tools lexer rules are independent of each other and cannot refer to each other. ANTLR is different: it allows lexer rules to reference other lexer sub-rules. It also allows recursive lexer rules. Now, this is a very useful feature and, for me, tidies up lexer rules a lot.</p></li>
            <li><p>Abstract Syntax Tree (AST) generation features: ANTLR has a powerful AST generation feature. When generating parsers I prefer to generate a parse tree or AST and pass that onto a second stage, rather than embedding actions/code in the grammar. This allows the a parser to be used as a module in numerous tools. ANTLR's AST building support is superb and really facilitates that type of design.</p></li>
            <li><p>Tree grammars: This is a feature of ANTLR that allows for a parser to match tree structures such as ASTs and trigger an action based on this. I used to use JavaCC and what I normally did was use it to generate a parse tree and then use the visitor pattern to process that parse tree. If the action at a particular node depended on the structure of the tree, it was up to me to track that in the Java code in the visitor class. ANTLR's tree grammars really simplify situations like that and I am really looking forward to trying that out.</p></li>
        </ul>           
        <p><a href="http://www.pragmaticprogrammer.com/titles/tpantlr/index.html">The Definitive ANTLR Guide</a>, available from the <a href="http://www.pragmaticprogrammer.com/">Pragmatic Programmer website</a>, is the main documentation for ANTLR v3.0. The book is well named. It clearly and concisely describes the features of ANTLR v3.0 and how to use them. The book is divided into 3 sections: an introduction to ANTLR and language translation, a reference section for the ANTLR syntax, and a section on how to write predicated LL(*) grammars. I have read through the first section and skimmed parts of the reference and this has enabled me to put together a basic parser/recognizer for Scheme. It really is that straight forward.</p>
        <p>In addition to The Definitive ANTLR Guide there is a really good Wiki with tutorials and FAQs at <a href="http://www.antlr.org/wiki/display/ANTLR3/ANTLR+3+Wiki+Home">http://www.antlr.org/wiki/display/ANTLR3/ANTLR+3+Wiki+Home</a>. Lastly, the distribution comes with great sample grammars. There is a Java grammar and a Python grammar in there and these put ANTLR through its paces and are worth referring to.</p>
        <p><a href="http://www.antlr.org/works/index.html">ANTLRWorks</a> is the IDE for building ANTLR grammars. It is a standalone editor, written in Java Swing, that provides the standard features that you would expect from an IDE, such as syntax highlighting and error detection. In addition it has a few handy features that you would not expect. Firstly, there is a syntax diagram pane in the GUI. Selecting a grammar rule in editor pane causes a syntax diagram for the rule to be displayed in the syntax diagram pane. The graphic below is an example.</p>
        <div class="pict"><img alt="Syntax Diagram" src="http://www.corriganjc.net/weblog/images/s-exp-rule.png" width="516" height="107" /></div>
        <p>This is very useful for documenting grammars as the diagrams can be saved as graphics (JPEG, PNG, EPS, etc.). There is also a debugger and an interpreter. The interpreter will interpret the grammar and draw a graphical representation of the parse tree for an input string based on the grammar. If the parse fails it still draws the diagram for what was recognized and puts a node in the tree, at the point were the parse failed, to represent the type of error detected. The parse tree graphics can also be saved and are a real help with visualizing how the rules fit together and what choices the parser is taking.</p>
        <p><span class="technoratiTitle">Technorati Tags:</span>
            <a class="technoratiTag" href="http://technorati.com/tag/programming" rel="tag">programming</a>
            <a class="technoratiTag" href="http://technorati.com/tag/antlr" rel="tag">antlr</a>
        </p>]]></description>
<link>http://www.corriganjc.net/weblog/archives/2007/06/the_antlr_trini.html</link>
<guid>http://www.corriganjc.net/weblog/archives/2007/06/the_antlr_trini.html</guid>
<category>Programming</category>
<pubDate>Tue, 12 Jun 2007 22:15:45 +0000</pubDate>
</item>
<item>
<title>Peter Seibel has started blogging...</title>
<description><![CDATA[ <p>Peter Seibel, author of <a href="http://www.gigamonkeys.com/book/">Practical Common Lisp</a>, has <a href="http://www.gigamonkeys.com/blog/">started blogging</a> [<a href="http://www.gigamonkeys.com/blog/feed.atom">atom feed</a>]. The first post was on April 10th, but already there a few thought provoking posts up there. In particular, <a href="http://www.gigamonkeys.com/blog/2007/04/26/estimation-considered-harmful.html">Software estimation considered harmful?</a>, really made me think. In summary, the article states that software development estimates are a mechanism for communicating with others about a project to enable them to co-ordinate with the development team. Using estimates for this form of communication is not optimal in many cases and the article explains why. It is well worth reading.</p>]]></description>
<link>http://www.corriganjc.net/weblog/archives/2007/05/peter_seibel_ha.html</link>
<guid>http://www.corriganjc.net/weblog/archives/2007/05/peter_seibel_ha.html</guid>
<category>Programming</category>
<pubDate>Wed, 02 May 2007 22:04:58 +0000</pubDate>
</item>
<item>
<title>James Clark is blogging</title>
<description><![CDATA[<p>XML guru, <a href="http://www.google.com/search?q=%22james%20clark%22%20xml">James Clark</a>, has <a href="http://blog.jclark.com/">started a blog</a>.</p>]]></description>
<link>http://www.corriganjc.net/weblog/archives/2007/04/james_clark_is.html</link>
<guid>http://www.corriganjc.net/weblog/archives/2007/04/james_clark_is.html</guid>
<category>Programming</category>
<pubDate>Mon, 23 Apr 2007 10:33:26 +0000</pubDate>
</item>
<item>
<title>The Viking Laws</title>
<description><![CDATA[        <p>Last year, I had a week long vacation in Iceland. While there, I picked up a t-shirt with the viking laws printed on the front. These laws were guidelines for conducting a viking expedition. The laws themselves are:</p>
        <ol>
            <li>
                <p><a href="http://headrush.typepad.com/creating_passionate_users/2006/01/death_by_riskav.html" title="Creating Passionate Users - Death by Risk Aversion">Be brave and aggressive.</a></p>
                <ul>
                    <li><a href="http://www.gapingvoid.com/Moveable_Type/archives/003388.html" title="Gaping Void">Be direct.</a></li>
                    <li>Grab all opportunities.</li>
                    <li>Using varying methods of attack.</li>
                    <li>Be <a href="http://www.xprogramming.com/" title="xprogramming.com">versatile</a> and <a href="http://www.agilealliance.org/" title="Agile Alliance">agile</a>.</li>
                    <li><a href="http://blog.jackvinson.com/archives/2007/03/12/the_pernicious_thinking_behind_multitasking.html" title="blog.jackvinson.com&mdash;the_pernicious_thinking_behind_multitasking.html ">Attack one target at a time.</a></li>
                    <li><a href="http://c2.com/xp/YouArentGonnaNeedIt.html" title="YAGNI">Don't plan everything in detail.</a></li>
                    <li><a href="http://www.paulgraham.com/avg.html" title="Paul Graham - Beating the Averages">Use top quality weapons.</a></li>
                </ul>
            </li>
            <li>
                <p>Be prepared.</p>
                <ul>
                    <li>Keep weapons in good condition.</li>
                    <li><a href="http://www.pragmaticprogrammer.com/titles/mjwti/index.html" title="My Job Went to India">Keep in shape.</a></li>
                    <li><a href="http://www.joelonsoftware.com/articles/GuerrillaInterviewing3.html" title="Joel Spolsky - Guerrilla Interviewing">Find good battle comrades.</a></li>
                    <li><a href="http://www.ietf.org" title="The IETF, a standards body whose motto is 'rough concensus and running code'">Agree on important points.</a></li>
                    <li>Choose <b>one</b> chief.</li>
                </ul>
            </li>
            <li>
                <p>Be a good merchant.</p>
                <ul>
                    <li><a href="http://headrush.typepad.com/creating_passionate_users/2006/07/avoiding_the_fe.html" title="Creating Passionate Users - Ignore the competition">Find out what the market needs.</a></li>
                    <li><a href="http://blog.guykawasaki.com/2007/03/science_daily_w_1.html" title="A link to research on the harmful effects of hype">Don't make promises that you can't keep.</a></li>
                    <li>Don't demand overpayment.</li>
                    <li>Arrange things so that you can return.</li>
                </ul>
            </li>
            <li>
                <p>Keep the camp in order.</p>
                <ul>
                    <li>Keep things <a href="http://www.refactoring.com/" title="Refactoring">tidy</a> and organized.</li>
                    <li>Arrange enjoyable activities which strengthen the group.</li>
                    <li>Make sure everyone does useful work.</li>
                    <li><a href="http://www.pragmaticprogrammer.com/titles/dlret/index.html" title="Agile Retrospectives">Consult all members of the group for advice.</a></li>
                </ul>
            </li>
        </ol>
        <p>These laws are pretty relevant to software development and the software business in general. In my experience, problems during software development projects stem from one of these guidelines not being followed. It is particularly dangerous to ignore <i>Choose one chief</i>, <i>Find good battle comrades</i>, or <i>Don't make promises that you can't keep</i>. <a href="http://www.corriganjc.net/weblog/archives/2006/02/know_the_ways_o.html">Yet again</a>, advice on software development has come from an apparently unrelated source.</p>]]></description>
<link>http://www.corriganjc.net/weblog/archives/2007/04/the_viking_laws.html</link>
<guid>http://www.corriganjc.net/weblog/archives/2007/04/the_viking_laws.html</guid>
<category>Programming</category>
<pubDate>Mon, 23 Apr 2007 10:33:10 +0000</pubDate>
</item>
<item>
<title>Quick bits of programming language news...</title>
<description><![CDATA[        <p><a href="http://blogs.sun.com/brendan/entry/dtrace_meets_javascript">Dtrace for Javascript</a>: There are details of how to set up Dtrace to trace Javascript code at Brendan Gregg's blog on <i>blogs.sun.com</i>. The bare bones is that he is providing a modified version of the Spider Monkey Javascript engine with Dtrace probes coded in. Installing the shared library into the appropriate location on a machine running Solaris will give Dtrace visibility into Javascript code running in Firefox. AJAX bugs have nowhere to hide now.</p>
        <p><a href="http://www.r6rs.org/">A new draft of the R6RS for Scheme</a>: Revision 5.92 Recommended Specification for Scheme is up on site, www.r6rs.org. It has been split into two PDFs, one for the core language and one for the libraries. The total page count for the two files is about 150 pages.</p>]]></description>
<link>http://www.corriganjc.net/weblog/archives/2007/01/quick_bits_of_p.html</link>
<guid>http://www.corriganjc.net/weblog/archives/2007/01/quick_bits_of_p.html</guid>
<category>Programming</category>
<pubDate>Wed, 24 Jan 2007 23:14:37 +0000</pubDate>
</item>
<item>
<title>Fortress</title>
<description><![CDATA[        <p>The researchers at SUN Labs have recently released a beta version of their new
            programming language, Fortress. It is available <a href="http://fortress.sunsource.net/">here</a>
            under a BSD license. It is designed to tackle problems in the high performance computing
            arena and looks rather interesting.</p>
        <p>The positives are:</p>
        <ul>
            <li><p>The language is terse. There is very little boiler plate code needed to get up and running in Fortress. Hello world is:</p> 
<pre>export Executable
run(args:String...) = print "Hello, World!\n"</pre></li>
            <li>
                <p>Fortress is designed to have a syntax that resembles mathematical notation. For example, the absolute value function appears like this in Fortress: <code>|someVar|</code>. This makes the code really brief and also partly familiar to mathematically inclined readers. Fortress is a good way along to achieving Fortran's original goal of <b>for</b>mula <b>tran</b>slation.</p>
            </li>
            <li><p>Operators are functions and can be defined for classes, overloaded, etc. In addition to normal operators, it is possible to define bracket operators, e.g., the absolute value operator shown above.</p></li>
            <li><p>Multi-paradigm programming is supported, particularly for OO and functional styles.</p></li>
            <li><p>There is strong support for parallel/multi-processor computing. I have not played with this, but the demos include a parallel matrix multiplication example that demonstrates this.</p></li>
            <li><p>Fortress has support for comprehensions, similar to those in Python.</p></li>
        </ul>
        <p>The negatives are:</p>
        <ul>
            <li><p>The language is not fully implemented yet, so some features are not working, e.g., atomic modification of multiple variables is not fully implemented yet.</p></li>
            <li><p>Libraries are extremely sparse at the moment. There isn't even a maths library yet.</p></li>
        </ul>
        <p>Other interesting things:</p>
        <ul>
            <li><p>Fortress targets the JVM initially. This means that there is a possibility of calling Fortress programs from Java programs via the <a href="">interfaces defined by JSR 223</a>.</p></li>
            <li><p>Fortress makes extensive use of Unicode and this use isn't superficial: many of the mathematical operators and functions can be specified by the Unicode characters used to display them in mathematical papers. For example, the floor function on a variable x can be written as <code>&#9123;x&#9126;</code> . In fact the Fortress compiler and interpreter deal exclusively with Unicode. While Fortress programs can be written completely in ASCII there is a conversion stage that translates ASCII longhand into equivalent Unicode characters before the lexer and parser get at the code.</p></li>
        </ul>
]]></description>
<link>http://www.corriganjc.net/weblog/archives/2007/01/fortress.html</link>
<guid>http://www.corriganjc.net/weblog/archives/2007/01/fortress.html</guid>
<category>Programming</category>
<pubDate>Wed, 24 Jan 2007 00:54:11 +0000</pubDate>
</item>
<item>
<title>Standard Deviation</title>
<description><![CDATA[<p>If you find yourself needing to migrate an application from one of the major RDBMS packages to another, as I have recently, then <a href="http://troels.arvin.dk/db/rdbms/">this webpage</a> is invaluable. It compares how MySQL, MS SQL, DB2, Oracle, and PostgreSQL compare to the SQL92 standard. The page links to relevant documentation for each RDBMS, for each feature compared, which is really handy.</p>]]></description>
<link>http://www.corriganjc.net/weblog/archives/2007/01/standard_deviat.html</link>
<guid>http://www.corriganjc.net/weblog/archives/2007/01/standard_deviat.html</guid>
<category>Programming</category>
<pubDate>Sun, 14 Jan 2007 21:21:09 +0000</pubDate>
</item>
<item>
<title>I have a new job at Propylon</title>
<description><![CDATA[        <p>I have a new job. For the past 4 weeks I have been working for <a href="http://www.propylon.com/">Propylon</a>, a small Irish software company. Propylon develops publishing systems for governments: systems designed to help with the legislative drafting process or for publishing citizen information websites, for example. The company is small, young (I am one of the oldest developers there), and very busy. However, it is a lot of fun. They have me working on a Java EE based project and mucking about with databases. I have also been doing a little python programming. </p>
        <p>The staff there are pretty cool and know their stuff, so I am learning lots. A few of them have blogs, notably (in alphabetical order), <a href="http://www.dehora.net/journal/">Bill de h&Oacute;ra</a>, <a href="http://kaykays.com/personal/">Vicky Lee</a>, and <a href="http://seanmcgrath.blogspot.com/">Sean McGrath</a>. Anyhow, so far so good. I need to check with people here what is considered proprietary information, but hopefully I will be able to blog about some of the things I have learned over the past few week.</p>]]></description>
<link>http://www.corriganjc.net/weblog/archives/2006/12/i_have_a_new_jo.html</link>
<guid>http://www.corriganjc.net/weblog/archives/2006/12/i_have_a_new_jo.html</guid>
<category></category>
<pubDate>Sun, 17 Dec 2006 00:56:51 +0000</pubDate>
</item>
<item>
<title>Photographs of Iceland</title>
<description><![CDATA[<p>I have just started to write up the visit to Iceland I made in October. Some of the photographs I took are <a href="http://www.flickr.com/photos/corriganjcc/sets/72157594376184320/">up on Flickr</a> now. There are some brief comments attached to some of them to put them in context. Enjoy!</p>]]></description>
<link>http://www.corriganjc.net/weblog/archives/2006/11/photographs_of.html</link>
<guid>http://www.corriganjc.net/weblog/archives/2006/11/photographs_of.html</guid>
<category></category>
<pubDate>Tue, 14 Nov 2006 16:56:28 +0000</pubDate>
</item>
<item>
<title>Object Oriented Design Principles</title>
<description><![CDATA[<p>I came across a good set of <a href="http://butunclebob.com/ArticleS.UncleBob.PrinciplesOfOod">design principles</a> for object oriented software. The details are in PDF files linked off the page and each of these are well worth the read. I found the package cohesion paper, opened by the second bunch of links, especially informative.</p>
]]></description>
<link>http://www.corriganjc.net/weblog/archives/2006/11/object_oriented.html</link>
<guid>http://www.corriganjc.net/weblog/archives/2006/11/object_oriented.html</guid>
<category>Programming</category>
<pubDate>Tue, 14 Nov 2006 13:31:18 +0000</pubDate>
</item>
<item>
<title>Humour - xkcd</title>
<description><![CDATA[<p>Douglas Hofstadter would enjoy this <a href="http://xkcd.com/c45.html">comic</a>.</p>]]></description>
<link>http://www.corriganjc.net/weblog/archives/2006/11/humour_xkcd.html</link>
<guid>http://www.corriganjc.net/weblog/archives/2006/11/humour_xkcd.html</guid>
<category></category>
<pubDate>Mon, 13 Nov 2006 12:59:07 +0000</pubDate>
</item>


</channel>
</rss>
