<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:copyright="http://blogs.law.harvard.edu/tech/rss" xmlns:image="http://purl.org/rss/1.0/modules/image/">
    <channel>
        <title>Programming</title>
        <link>http://geekswithblogs.net/hammett/category/3803.aspx</link>
        <description>Programming</description>
        <language>en-US</language>
        <copyright>hamilton verissimo</copyright>
        <managingEditor>hammett@gmail.com</managingEditor>
        <generator>Subtext Version 0.0.0.0</generator>
        <item>
            <title>Language improvements</title>
            <link>http://geekswithblogs.net/hammett/archive/2006/02/05/68201.aspx</link>
            <description>&lt;p&gt;
So among one phase and other of &lt;a href="http://www.gamefaqs.com/console/xbox/review/919464.html"&gt;Manhunt&lt;/a&gt;, I'm improving my brain exercise. Now it's able to deal with boolean expressions. I had to review the AST nodes implementation to allow some tree rewriting.
&lt;/p&gt;

&lt;pre&gt;
a = 1 == 1 
b = 1 != 2
x = 10 
puts 3 * 90, a, b, x 
&lt;/pre&gt;

&lt;p&gt;
This produces the following initial AST
&lt;/p&gt;

&lt;pre&gt;
AssignmentExp
  NameReferenceExpression (a) 
  BinaryExp (....)

AssignmentExp
  NameReferenceExpression (b) 
  BinaryExp (....)

AssignmentExp
  NameReferenceExpression (x) 
  ConstantExp (10, int)

MethodInvocationExp
  Target NameReferenceExpression (puts)
  Arguments
    BinaryExp
    NameReferenceExpression (a) 
    NameReferenceExpression (b) 
    NameReferenceExpression (x) 
&lt;/pre&gt;

&lt;p&gt;
So I'm treating the names as some unknown entity that is rewrite as we discover more... The tree gets rewritten to
&lt;/p&gt;

&lt;pre&gt;
AssignmentExp
  VarRefExp (a) 
  BinaryExp (....)

AssignmentExp
  VarRefExp (b) 
  BinaryExp (....)

AssignmentExp
  VarRefExp (x) 
  ConstantExp (10, int)

MethodInvocationExp (puts)
  Target null
  Arguments
    BinaryExp
    VarRefExp (a) 
    VarRefExp (b) 
    VarRefExp (x) 
&lt;/pre&gt;

&lt;p&gt;
The code, once executed produces:
&lt;/p&gt;

&lt;pre&gt;
E:\dev\projects\Blah\BlahProj\bin\Debug&gt;hello
270
True
True
10
&lt;/pre&gt;

&lt;p&gt;
Kinda cool. Now I'd like to introduce the dynamics capabilities, meaning: some names should be marked as dynamic, and thus the compiler should not attempt to type it and consequentially more code will be generated in order to perform checks and casts. It's kinda fun, but demands too many types to get something running :-\
&lt;/p&gt;

&lt;p&gt;&lt;a href="http://www.pheedo.com/click.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=68201"&gt;&lt;img src="http://www.pheedo.com/img.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=68201" border="0"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;iframe src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;PageID=31016&amp;amp;SiteID=1" width=1 height=1 Marginwidth=0 Marginheight=0 Hspace=0 Vspace=0 Frameborder=0 Scrolling=No&gt;
&lt;script language='javascript1.1' src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;Browser=NETSCAPE4&amp;amp;NoCache=True&amp;PageID=31016&amp;amp;SiteID=1"&gt;&lt;/script&gt;
&lt;noscript&gt;&lt;a href="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Click&amp;amp;Mode=HTML&amp;amp;SiteID=1&amp;amp;PageID=31016" target="_blank"&gt;
&lt;img src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;Mode=HTML&amp;amp;SiteID=1&amp;amp;PageID=31016" width="1" height="1" border="0"  alt=""&gt;&lt;/a&gt;
&lt;/noscript&gt;
&lt;/iframe&gt;
&lt;img src="http://geekswithblogs.net/hammett/aggbug/68201.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>hamilton verissimo</dc:creator>
            <guid>http://geekswithblogs.net/hammett/archive/2006/02/05/68201.aspx</guid>
            <pubDate>Sun, 05 Feb 2006 06:06:00 GMT</pubDate>
            <wfw:comment>http://geekswithblogs.net/hammett/comments/68201.aspx</wfw:comment>
            <comments>http://geekswithblogs.net/hammett/archive/2006/02/05/68201.aspx#feedback</comments>
            <slash:comments>2</slash:comments>
            <wfw:commentRss>http://geekswithblogs.net/hammett/comments/commentRss/68201.aspx</wfw:commentRss>
            <trackback:ping>http://geekswithblogs.net/hammett/services/trackbacks/68201.aspx</trackback:ping>
        </item>
        <item>
            <title>Type inference and polymorphic functions</title>
            <link>http://geekswithblogs.net/hammett/archive/2006/02/03/68127.aspx</link>
            <description>&lt;p&gt;
I've been using my spare time to read about different languages and how they deal with types. It's amazing how good ideas are implemented in several non-mainstream languages that are not going to ever be known by most of programmers.
&lt;/p&gt;

&lt;p&gt;
Nevertheless, you can deduce that I'm working on a language. Indeed, just as a brain exercise. Fixing and improving Castle is nice and it's cool, but sometimes I need to research and try things on a different field. One of the things I wanted to make work was type inference, but the sophisticate version of type inference.
&lt;/p&gt;

&lt;p&gt;
The non-sophisticate type inference is being able to type designators based on the assignment expression, like
&lt;/p&gt;

&lt;pre&gt;
myvar = 10 + 15
&lt;/pre&gt;

&lt;p&gt;
The binary expression will be evaluated to int, and so is myvar. This does not consider others usages of myvar on the same context. For example:
&lt;/p&gt;

&lt;pre&gt;
myvar = 1

if (myvar &gt; 10L)
...
&lt;/pre&gt;

&lt;p&gt;
Here, while myvar will be typed as an int, it's being used in a comparison with a long.
&lt;/p&gt;

&lt;p&gt;
There are many paper on type inference for object oriented programming languages, quite interesting subject. Most of them care about polymorphic function as a mean to achieve efficient code and thus optimized execution. 
&lt;/p&gt;

&lt;p&gt;
The quite trivial example would be
&lt;/p&gt;

&lt;pre&gt;
def max(a, b)
  if (a &lt;= b) b else a
end

max(1, 2)
max(10L, 20L)
max(3.01, PI)
&lt;/pre&gt;

&lt;p&gt;
Type inference will be used here to create three versions of the same max function. Some papers suggest the usage of constraints inequalities to solve types and to create the versioned functions in this case. This involve creating a graph based on code flow where the nodes represent the variables and the edges represent the  constraints:
&lt;/p&gt;

&lt;pre&gt;
myvar = MyClass.new  # Constraint: myvar should be at least as subset of MyClass type
&lt;/pre&gt;

&lt;p&gt;
Anyway, a very sophisticate type inference may be found on ML. The book "Programming language pragmatics" has a great topic dedicated to it. Using its example code:
&lt;/p&gt;

&lt;pre&gt;
fun fib (n) =
    let fun fib_helper(f1, f2, i) =
        if i = n then f2
        else fib_helper(f2, f1+f2, i+1)
    in  
        fib_helper(0,1,0)
    end;
&lt;/pre&gt;

&lt;p&gt;
The syntax is quite strange, isn't it? I've never programmed in ML, neither any other functional or imperative-functional language. But the beauty here is the type inferencing working
&lt;/p&gt;

&lt;p&gt;
The parameter i should be int as it's been used in a binary expression with another int. Parameter n is compared to i, so it must be int too. When fib_helper is invoked in the body of fib function, the parameter are also int, so this is consistent with the inference so far. Any usage that is not consistent will raise an error.
&lt;/p&gt;

&lt;p&gt;
Isn't that cool or what?
&lt;/p&gt;

&lt;p&gt;
Anyway, for now I'm going to stick with a non-sophisticated version, unless I bump into a nice paper describing a very simple algorithm that fits my needs. 
&lt;/p&gt;

&lt;p&gt;
Btw &lt;a href="http://www.nemerle.org/"&gt;Nemerle&lt;/a&gt; is a language to be checked. I'd never use it to construct a system, but it's quite nice to force a shift in your brain. The virtualization of structural types that they achieved is impressive. If you don't know what that means, in most languages type equivalence is based on what a type have
&lt;/p&gt;

&lt;pre&gt;
record x
  int i,j
end

record y
  int age, favcolor
end
&lt;/pre&gt;

&lt;p&gt;
In lots of programing languages, x and y are equivalent. Java and .Net use names to determine equivalence.
&lt;/p&gt;

&lt;p&gt;
On Nemerle (copying from their tutorial) they have (and you can create your own) methods that depend on a signature
&lt;/p&gt;

&lt;pre&gt;
class Hashtable ['a, 'b] 
{
   public Iter (f : 'a * 'b -&gt; void) : void 
   { ... }
}
&lt;/pre&gt;

&lt;p&gt;
Here Iter is a function that expects a function with the signature of 'a, 'b and returning void. 
&lt;/p&gt;

&lt;p&gt;
Well, there are many programming languages around. Each has distinct features and cool and nasty stuff. So my word of advice: get out of the mainstream driveway every now and then and see what's happening around. You won't regret; :-)
&lt;/p&gt;

&lt;hr&gt;

&lt;p&gt;
Btw &lt;a href="http://www.ilude.com/"&gt;Mike&lt;/a&gt; has cast his vote towards a 100% dynamic language. I'm really not convinced about that and still leaning towards a hybrid solution.
&lt;/p&gt;

&lt;p&gt;&lt;a href="http://www.pheedo.com/click.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=68127"&gt;&lt;img src="http://www.pheedo.com/img.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=68127" border="0"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;iframe src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;PageID=31016&amp;amp;SiteID=1" width=1 height=1 Marginwidth=0 Marginheight=0 Hspace=0 Vspace=0 Frameborder=0 Scrolling=No&gt;
&lt;script language='javascript1.1' src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;Browser=NETSCAPE4&amp;amp;NoCache=True&amp;PageID=31016&amp;amp;SiteID=1"&gt;&lt;/script&gt;
&lt;noscript&gt;&lt;a href="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Click&amp;amp;Mode=HTML&amp;amp;SiteID=1&amp;amp;PageID=31016" target="_blank"&gt;
&lt;img src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;Mode=HTML&amp;amp;SiteID=1&amp;amp;PageID=31016" width="1" height="1" border="0"  alt=""&gt;&lt;/a&gt;
&lt;/noscript&gt;
&lt;/iframe&gt;
&lt;img src="http://geekswithblogs.net/hammett/aggbug/68127.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>hamilton verissimo</dc:creator>
            <guid>http://geekswithblogs.net/hammett/archive/2006/02/03/68127.aspx</guid>
            <pubDate>Sat, 04 Feb 2006 03:51:00 GMT</pubDate>
            <wfw:comment>http://geekswithblogs.net/hammett/comments/68127.aspx</wfw:comment>
            <comments>http://geekswithblogs.net/hammett/archive/2006/02/03/68127.aspx#feedback</comments>
            <slash:comments>4</slash:comments>
            <wfw:commentRss>http://geekswithblogs.net/hammett/comments/commentRss/68127.aspx</wfw:commentRss>
            <trackback:ping>http://geekswithblogs.net/hammett/services/trackbacks/68127.aspx</trackback:ping>
        </item>
        <item>
            <title>Weekend experiences</title>
            <link>http://geekswithblogs.net/hammett/archive/2006/01/28/67435.aspx</link>
            <description>&lt;p&gt;I was able to compile and run the following code&lt;/p&gt;

&lt;pre&gt;
x = 10
x = x + 1
&lt;/pre&gt;

&lt;p&gt;Yeah, stupid, innit? You may look closer and realise that &lt;/p&gt;

&lt;p&gt;
&lt;ul&gt;
&lt;li&gt; 'x' is an undeclared variable&lt;/li&gt;
&lt;li&gt; 'x' type is thus not defined&lt;/li&gt;
&lt;li&gt; 'x''s type is inferred based on operations of attribution that follows the first appearance&lt;/li&gt;
&lt;/ul&gt;
&lt;/p&gt;

&lt;p&gt;
So x goes to a SymbolTable. Every assign expression that uses it is registered as a candidate on the SymbolTable entry. During the type resolval step it's easy to resolve the type of the first assign:
&lt;/p&gt;

&lt;pre&gt;
x = 10 # this is a int32 constant, nothing to compute here
&lt;/pre&gt;

&lt;p&gt;Now the second is trickier:&lt;/p&gt;

&lt;pre&gt;
x = x + 1
&lt;/pre&gt;

&lt;p&gt;
We're now trying to infer the type of a variable based on an expression that uses it. 
&lt;/p&gt;

&lt;p&gt;
Anyway, this is something I need to research more. My naive implementation is shameful.
&lt;/p&gt;

&lt;p&gt;
The IL code generated is:
&lt;/p&gt;

&lt;pre&gt;
.method public hidebysig static void xpto() cil managed
{
      .entrypoint
      // Code Size: 15 byte(s)
      .maxstack 2
      .locals init (
            int32 num1)
      L_0000: ldc.i4 10
      L_0005: stloc.0 
      L_0006: ldloc.0 
      L_0007: ldc.i4 1
      L_000c: add 
      L_000d: stloc.0 
      L_000e: ret 
}
&lt;/pre&gt;

&lt;p&gt;
Which as you can see doesn't have even the minimum of optimization, which should produce
&lt;/p&gt;

&lt;pre&gt;
.method public hidebysig static void xpto() cil managed
{
      .entrypoint
      // Code Size: 15 byte(s)
      .maxstack 2
      .locals init (
            int32 num1)
      L_0000: ldc.i4_s 10  # within a byte range, use the short form
      L_0005: stloc.0 
      L_0006: ldloc.0 
      L_0007: ldc.i4_1     # same thing
      L_000c: add 
      L_000d: stloc.0 
      L_000e: ret 
}
&lt;/pre&gt;

&lt;p&gt;But still better than the version produced by IronPython :-P &lt;/p&gt;
 
&lt;p&gt;I'm still not convinced about construction a 100% dynamic language. A hybrid would be best, but I'd like to hear opinions.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://www.pheedo.com/click.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=67435"&gt;&lt;img src="http://www.pheedo.com/img.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=67435" border="0"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;iframe src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;PageID=31016&amp;amp;SiteID=1" width=1 height=1 Marginwidth=0 Marginheight=0 Hspace=0 Vspace=0 Frameborder=0 Scrolling=No&gt;
&lt;script language='javascript1.1' src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;Browser=NETSCAPE4&amp;amp;NoCache=True&amp;PageID=31016&amp;amp;SiteID=1"&gt;&lt;/script&gt;
&lt;noscript&gt;&lt;a href="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Click&amp;amp;Mode=HTML&amp;amp;SiteID=1&amp;amp;PageID=31016" target="_blank"&gt;
&lt;img src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;Mode=HTML&amp;amp;SiteID=1&amp;amp;PageID=31016" width="1" height="1" border="0"  alt=""&gt;&lt;/a&gt;
&lt;/noscript&gt;
&lt;/iframe&gt;
&lt;img src="http://geekswithblogs.net/hammett/aggbug/67435.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>hamilton verissimo</dc:creator>
            <guid>http://geekswithblogs.net/hammett/archive/2006/01/28/67435.aspx</guid>
            <pubDate>Sat, 28 Jan 2006 23:31:00 GMT</pubDate>
            <wfw:comment>http://geekswithblogs.net/hammett/comments/67435.aspx</wfw:comment>
            <comments>http://geekswithblogs.net/hammett/archive/2006/01/28/67435.aspx#feedback</comments>
            <slash:comments>3</slash:comments>
            <wfw:commentRss>http://geekswithblogs.net/hammett/comments/commentRss/67435.aspx</wfw:commentRss>
            <trackback:ping>http://geekswithblogs.net/hammett/services/trackbacks/67435.aspx</trackback:ping>
        </item>
        <item>
            <title>Laptop upgraded</title>
            <link>http://geekswithblogs.net/hammett/archive/2006/01/27/67322.aspx</link>
            <description>&lt;table width="100%"&gt;
  &lt;Tr&gt;
   &lt;td&gt;
    &lt;img src="http://geekswithblogs.net/images/geekswithblogs_net/hammett/3832/r_buildfailed.jpg"/&gt;
  &lt;/td&gt;
  &lt;Td valign="top"&gt;
&lt;p&gt;
  So I finally upgraded my laptop memory and have it cleaned (coolers and processor). Now 1GB + 256mb should be enough to ReSharper. Gosh, that thing is a memory eater. I wonder whether there are memory leaks on the code. It won't surprise me, though. ReSharper seems to use lots of flow analyzers which are quite complex.
&lt;/p&gt;

&lt;p&gt;
Anyway, one day and a half without any computer or internet access was surprisingly good. I had a chance to pile all the books I wanted to read and just sit and start reading them. The downsize was that half of them were technical books, so I urged to practice what I've learned. Well, experimentations are due to the next weekend. 
&lt;/p&gt;

  &lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;&lt;p&gt;&lt;a href="http://www.pheedo.com/click.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=67322"&gt;&lt;img src="http://www.pheedo.com/img.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=67322" border="0"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;iframe src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;PageID=31016&amp;amp;SiteID=1" width=1 height=1 Marginwidth=0 Marginheight=0 Hspace=0 Vspace=0 Frameborder=0 Scrolling=No&gt;
&lt;script language='javascript1.1' src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;Browser=NETSCAPE4&amp;amp;NoCache=True&amp;PageID=31016&amp;amp;SiteID=1"&gt;&lt;/script&gt;
&lt;noscript&gt;&lt;a href="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Click&amp;amp;Mode=HTML&amp;amp;SiteID=1&amp;amp;PageID=31016" target="_blank"&gt;
&lt;img src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;Mode=HTML&amp;amp;SiteID=1&amp;amp;PageID=31016" width="1" height="1" border="0"  alt=""&gt;&lt;/a&gt;
&lt;/noscript&gt;
&lt;/iframe&gt;
&lt;img src="http://geekswithblogs.net/hammett/aggbug/67322.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>hamilton verissimo</dc:creator>
            <guid>http://geekswithblogs.net/hammett/archive/2006/01/27/67322.aspx</guid>
            <pubDate>Fri, 27 Jan 2006 19:44:00 GMT</pubDate>
            <wfw:comment>http://geekswithblogs.net/hammett/comments/67322.aspx</wfw:comment>
            <comments>http://geekswithblogs.net/hammett/archive/2006/01/27/67322.aspx#feedback</comments>
            <slash:comments>2</slash:comments>
            <wfw:commentRss>http://geekswithblogs.net/hammett/comments/commentRss/67322.aspx</wfw:commentRss>
            <trackback:ping>http://geekswithblogs.net/hammett/services/trackbacks/67322.aspx</trackback:ping>
        </item>
        <item>
            <title>New blog</title>
            <link>http://geekswithblogs.net/hammett/archive/2006/01/25/67059.aspx</link>
            <description>&lt;p&gt;
This one seems nice. &lt;a href="http://jroller.com/page/hammett"&gt;My old blog&lt;/a&gt; unfortunatelly has been taken over by spammers, I had to disable comments and couldn't stop to delete all the spam (it was hundreds, maybe thousands of spam comments)
&lt;/p&gt;

&lt;p&gt;
Today I read an interesting sentence (two to be precise) from &lt;a href="http://www.stringtemplate.org/doc/doc.tml"&gt;StringTemplate documentation&lt;/a&gt;:
&lt;/p&gt;

&lt;blockquote&gt;
Many tool builders have clearly lost sight of the original problem we were all trying to solve. We programmers often get caught up in cool implementations, but we should focus on what should be built not what can be built.
&lt;/blockquote&gt;

&lt;p&gt;I couldn't agree more&lt;/p&gt;&lt;p&gt;&lt;a href="http://www.pheedo.com/click.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=67059"&gt;&lt;img src="http://www.pheedo.com/img.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=67059" border="0"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;iframe src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;PageID=31016&amp;amp;SiteID=1" width=1 height=1 Marginwidth=0 Marginheight=0 Hspace=0 Vspace=0 Frameborder=0 Scrolling=No&gt;
&lt;script language='javascript1.1' src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;Browser=NETSCAPE4&amp;amp;NoCache=True&amp;PageID=31016&amp;amp;SiteID=1"&gt;&lt;/script&gt;
&lt;noscript&gt;&lt;a href="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Click&amp;amp;Mode=HTML&amp;amp;SiteID=1&amp;amp;PageID=31016" target="_blank"&gt;
&lt;img src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;Mode=HTML&amp;amp;SiteID=1&amp;amp;PageID=31016" width="1" height="1" border="0"  alt=""&gt;&lt;/a&gt;
&lt;/noscript&gt;
&lt;/iframe&gt;
&lt;img src="http://geekswithblogs.net/hammett/aggbug/67059.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>hamilton verissimo</dc:creator>
            <guid>http://geekswithblogs.net/hammett/archive/2006/01/25/67059.aspx</guid>
            <pubDate>Wed, 25 Jan 2006 16:31:00 GMT</pubDate>
            <wfw:comment>http://geekswithblogs.net/hammett/comments/67059.aspx</wfw:comment>
            <comments>http://geekswithblogs.net/hammett/archive/2006/01/25/67059.aspx#feedback</comments>
            <slash:comments>2</slash:comments>
            <wfw:commentRss>http://geekswithblogs.net/hammett/comments/commentRss/67059.aspx</wfw:commentRss>
            <trackback:ping>http://geekswithblogs.net/hammett/services/trackbacks/67059.aspx</trackback:ping>
        </item>
    </channel>
</rss>