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

<channel>
	<title>Let's You and Him Fight</title>
	<atom:link href="http://www.letsyouandhimfight.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.letsyouandhimfight.com</link>
	<description></description>
	<lastBuildDate>Sat, 30 Apr 2011 19:36:41 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>cl-bcrypt: A first attempt</title>
		<link>http://www.letsyouandhimfight.com/2010/07/14/cl-bcrypt-a-first-attempt/</link>
		<comments>http://www.letsyouandhimfight.com/2010/07/14/cl-bcrypt-a-first-attempt/#comments</comments>
		<pubDate>Wed, 14 Jul 2010 20:03:24 +0000</pubDate>
		<dc:creator>jon</dc:creator>
				<category><![CDATA[Write]]></category>

		<guid isPermaLink="false">http://www.letsyouandhimfight.com/?p=59</guid>
		<description><![CDATA[First, a disclaimer: I am new to Common Lisp; in fact, this is the first Lisp project in which I&#8217;ve completed a working prototype. My previous experience is largely in Python and Ruby. I do not represent that the code below is ready for general use. If I&#8217;m doing something wrong, please educate me. The [...]]]></description>
			<content:encoded><![CDATA[<p>First, a disclaimer: I am new to Common Lisp; in fact, this is the first Lisp project in which I&#8217;ve completed a working prototype. My previous experience is largely in Python and Ruby. I do not represent that the code below is ready for general use. If I&#8217;m doing something wrong, please educate me.</p>
<h3>The introduction: What is bcrypt?</h3>
<p>I want to write a web application in Common Lisp. Part of this task is implementing authentication. The <a href="http://codahale.com/how-to-safely-store-a-password/">accepted state of the art</a> for safely storing passwords is bcrypt.<sub><a name="fnr-2010-07-14-1" href="#fn-2010-07-14-1">[1]</a></sub> Just one little problem; if you click on that link, right at the top you will find links to implementations in many languages, but Common Lisp is not among them. However, I know that most of these implementations are wrappers around the C implementation, and I am informed that Common Lisp has excellent FFI support, so even though I&#8217;m not very experienced with C, this shouldn&#8217;t be too hard.</p>
<h3>The FFI approach</h3>
<p>And indeed it wasn&#8217;t: here&#8217;s the complete code for cl-bcrypt:<br />
<script src="https://gist.github.com/475661.js?file=gistfile1.cl"></script></p>
<p>This code may be used under the terms of the X11 license. (To summarize, do what you like, but keep my name on it, there&#8217;s no warranty, and you probably can&#8217;t use my name to advertise your wares, not that you&#8217;d want to anyway.)</p>
<p>It works on my system (Mac OS X 10.6, SBCL 1.0.39) and is compatible with the Python bcrypt library (which I used for testing). There&#8217;s just a few <span style="text-decoration: line-through;">small</span> big problems.</p>
<ul>
<li>The Common Lisp specification defines a <a href="http://www.lispworks.com/documentation/HyperSpec/Body/f_random.htm">random</a> function, but makes no guarantee that this is a <strong>cryptographically strong</strong> PRNG. In the absence of such a guarantee, I fear I must assume that it is not suitable. The predominant Lisp crypto package, <a href="http://www.cliki.net/Ironclad">Ironclad</a>, lists &#8220;random number generation&#8221; in its TODO file. So I use a crude hack: I open /dev/urandom and just read bytes straight from it. This is obviously only feasible on Unix-like systems which have a /dev/urandom. I am open to suggestions for improvements.</li>
<li>The C bcrypt implementations (yes, there are two independent implementations) are poorly packaged.<sub><a name="fnr-2010-07-14-2" href="#fn-2010-07-14-2">[2]</a></sub> Lisp&#8217;s CFFI, much like Python&#8217;s ctypes, provides a pure-Lisp method of interacting with shared libraries. The library is simply expected to be present where the system can find it. Unfortunately, both C implementations are designed primarily for integration into libc. One of them, the OpenBSD implementation, is integrated with OpenBSD&#8217;s libc. While it seems some wrappers, like <a href="http://www.mindrot.org/projects/py-bcrypt/">py-bcrypt</a> have extracted it, I didn&#8217;t feel confident in my ability to do this myself. I chose to use the <a href="http://www.openwall.com/crypt/">Openwall</a> implementation. This also provides a glibc integration, but here, the actual bcrypt implementation is already separated out. The Python wrapper targeting this implementation (yes, there are two independent Python bcrypt libraries) was useful in figuring out how to use it, since Openwall&#8217;s source lacks docs and helpful comments. Unfortunately, the provided makefile does not even build a shared library, let alone install it, so you presently have to do this yourself. In Python/Ruby, it&#8217;s relatively easy to tell the build system to build a C shared library and include it with the native library, but ASDF, the Lisp package system, appears to have no support for this (likely because Lisp so rarely needs the shim C code that Python libraries use to integrate.) For the time being, you will need to build a bcrypt shared library by hand. <strong>Some Linux distributions offer a package called &#8216;bcrypt&#8217;; this is usually a crypto utility that happens to use Blowfish. Completely different program with a coincidentally identical name.</strong></li>
</ul>
<h4>How to use it</h4>
<p>These directions worked for me on my system. I hope they will work for you.</p>
<ol>
<li>Download the <a href="http://www.openwall.com/crypt/">Openwall</a> bcrypt source, extract it in a directory of your choice, and run make.</li>
<li>Now create a shared library: <code>gcc -shared -W1,-soname,libbcrypt.so.1 -o libbcrypt.so.1.0.4 crypt_blowfish.o x86.o</code> (of course, replace 1 and 1.0.4 with the correct version numbers).</li>
<li>Place the resulting libbcrypt.so.1.0.4 somewhere where Lisp can find it. The <a href="http://common-lisp.net/project/cffi/manual/html_node/_002aforeign_002dlibrary_002ddirectories_002a.html#_002aforeign_002dlibrary_002ddirectories_002a">*foreign-library-directories*</a> variable may be useful here.</li>
<li>Compile and load the code.</li>
<li><code>(cl-bcrypt:encode "foo")</code> or, optionally, specify a strength: <code>(cl-bcrypt:encode "foo" 12)</code>. The default strength is 10. A strength of 16 takes approximately 6 seconds to process on my 2.66Ghz Intel i7 Macbook Pro. <code>encode</code> produces the hashed password in a format that includes the random salt, so you merely have to pass the hashed password and the candidate into <code>check</code> to verify: <code>(cl-bcrypt:check (cl-bcrypt:encode "foo") "foo")</code>. It returns t or nil.</li>
</ol>
<h3>What about a native approach?</h3>
<p>People in freenode&#8217;s #lisp kept suggesting that I implement bcrypt myself, perhaps using parts of the blowfish source from Ironclad. I kept trying to explain the First Law of Crypto<sub><a name="fnr-2010-07-14-3" href="#fn-2010-07-14-3">[3]</a></sub>, but they didn&#8217;t think much of this objection. Also, I actually went and looked at the blowfish source; it seems to differ substantially from the eksblowfish algorithm bcrypt uses. About the only thing I could reuse without modification would be the s-box constants. Again, as per the First Law, this would be unwise for me to attempt.</p>
<p>That said, I would gladly donate a bit of money if someone qualified wanted to implement a native version.</p>
<p><a name="fn-2010-07-14-1">[1]</a> As Thomas Ptack <a href="http://chargen.matasano.com/chargen/2007/9/7/enough-with-the-rainbow-tables-what-you-need-to-know-about-s.html?currentPage=3">puts it</a>, &#8220;To optimize Blowfish to run much faster, you’d have to contribute a major advance to cryptography. We security practioners are all &#8216;betting people&#8217;, and we usually like to place our bets on the side that &#8216;demands major advances in cryptography&#8217;.&#8221; Colin Percival has presented what may be an <a href="http://www.tarsnap.com/scrypt.html">even stronger</a> scheme, but as I am not a crypto professional, I don&#8217;t think I should adopt scrypt until it&#8217;s received more scrutiny. <a href="#fnr-2010-07-14-1">↩</a></p>
<p><a name="fn-2010-07-14-2">[2]</a> Percival&#8217;s scrypt is also poorly packaged; the only download provided is for a symmetric encryption package designed as example code for the algorithm; there is certainly no easy way for an end-user to install a scrypt library. <a href="#fnr-2010-07-14-2">↩</a></p>
<p><a name="fn-2010-07-14-3">[3]</a> The First Law of Crypto reads as follows: &#8220;Unless you are a crypto professional, you do not implement your own cryptographic primitives.&#8221; (The Second Law is the same as the first law, but with more boldface.) The hazards of violating this law are <a href="http://www.debian.org/security/2008/dsa-1571">well known</a>. <a href="#fnr-2010-07-14-3">↩</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.letsyouandhimfight.com/2010/07/14/cl-bcrypt-a-first-attempt/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Comet in Erlang with Mochiweb and a Finite State Machine</title>
		<link>http://www.letsyouandhimfight.com/2010/01/31/comet-in-erlang-with-mochiweb-and-a-finite-state-machine/</link>
		<comments>http://www.letsyouandhimfight.com/2010/01/31/comet-in-erlang-with-mochiweb-and-a-finite-state-machine/#comments</comments>
		<pubDate>Mon, 01 Feb 2010 07:33:56 +0000</pubDate>
		<dc:creator>jon</dc:creator>
				<category><![CDATA[Write]]></category>

		<guid isPermaLink="false">http://www.letsyouandhimfight.com/?p=53</guid>
		<description><![CDATA[Comet is a pretty nebulous technology, encompassing everything from really-frequent XHR requests to the cutting-edge WebSocket protocol. Sadly, WebSocket is a bit too cutting-edge for my tastes, so for my app, I&#8217;ve chosen a long-polling approach based loosely on the Bidirectional-streams Over Synchronous HTTP protocol. By loosely I mean really loosely; I&#8217;ve really only kept [...]]]></description>
			<content:encoded><![CDATA[<p>Comet is a pretty nebulous technology, encompassing everything from really-frequent XHR requests to the cutting-edge WebSocket protocol. Sadly, WebSocket is a bit too cutting-edge for my tastes, so for my app, I&#8217;ve chosen a long-polling approach based loosely on the <a href="http://xmpp.org/extensions/xep-0124.html">Bidirectional-streams Over Synchronous HTTP</a> protocol. By loosely I mean really loosely; I&#8217;ve really only kept the notion of request ids and session ids.</p>
<p>The comet connection consists of two HTTP connections, only one of which is long-polling at any one time. It&#8217;ll wait a maximum of a minute for any server-side information. Whenever the client needs to send data to the server, there&#8217;s another available connection. I&#8217;ve implemented the comet client in Cappuccino, but you can do it with any JavaScript framework.</p>
<p>Mochiweb is a lightweight HTTP toolkit for Erlang. I chose Erlang for this project because it&#8217;s rock solid with easy scaling, and the lightweight process / message passing system makes coding Comet easy.</p>
<p>Here&#8217;s the Mochiweb request handler:<br />
<script src="http://gist.github.com/291503.js?file=comet_request_handler.erl"></script> The io:format calls are unnecessary; they&#8217;re just there for me to keep an eye on things while I develop the system. The important bit is the two calls to inet:setops/2. Internet sockets in Erlang can be in either active mode, in which incoming data is sent as messages to the associated Erlang process, or passive mode, which means that process needs to manually request data when it&#8217;s ready for it. Mochiweb works in passive mode, which has one major disadvantage; you don&#8217;t get notified if the socket dies. So, before we switch into waiting for data, we set the socket into {active, once}. This means that one message will be allowed to be sent to the process before setting it right back into passive mode. We can&#8217;t get additional data from the client on this socket at this point in time; we&#8217;ve already received the entire request and have yet to send any response. So, the only message we can receive from the socket is {tcp_closed, Socket}. That way we avoid trying to send messages from the server to a socket that&#8217;s died.  <script src="http://gist.github.com/291503.js?file=connection_id_generator.erl"></script><br />
I use this gen_server (I&#8217;ve only shown the internals; the rest of the gen_server is pretty basic) to make session ids both unique and unpredictable.</p>
<p>Finally, here&#8217;s the meat of the system: the connection <abbr title="Finite State Machine">FSM</abbr>:<br />
<script src="http://gist.github.com/291503.js?file=connection_fsm.erl"></script></p>
<p>I&#8217;ll break it down function by function.</p>
<p>handle_json/1 is called by the comet request handler I showed above. It decodes the JSON request body and determines if this is a request to set up a comet connection, or a request on a connection that already exists. handle_setup/1 is pretty obvious, but handle_request/3 is a little more complex. It sends an event to the FSM that there&#8217;s a new request and sits down to wait for a message &#8212; forever. It also traps that {tcp_closed, Socket} message I mentioned earlier; if that happens it tells the FSM it went away and dies. But otherwise it returns the message back to the client.</p>
<p>Finally, handle_packet/2 will be called by the app logic, once I write it, to deliver messages to the client.</p>
<p>So much for the FSM interface. The internals of the FSM live in the same module, in the callback functions.</p>
<p>start/0 and init/1 are pretty straightforward. I want to mention the dietimer here, though. If 45 seconds elapses without a waiting request from the client, we assume the client&#8217;s gone offline and tear down the corresponding FSM. We&#8217;ll kill or reset the timer in plenty of event handlers, though.</p>
<p>The next bunch of functions handle events sent with gen_fsm:send_event/2. This is the heart of the FSM. There are three states: waiting (for both requests and packets), have_request (but no packet), and have_packet (but no request). They should also all be pretty straightforward.</p>
<p>This took a bit of time to set up, but I think it&#8217;s easy to follow, which is the important part. There&#8217;s still a bit of work to be done; I haven&#8217;t set up the actual app logic that the messages will be going to or coming from. But this is a good start.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.letsyouandhimfight.com/2010/01/31/comet-in-erlang-with-mochiweb-and-a-finite-state-machine/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Pylons Opinion: Don&#8217;t Use Authkit</title>
		<link>http://www.letsyouandhimfight.com/2009/10/28/pylons-opinion-dont-use-authkit/</link>
		<comments>http://www.letsyouandhimfight.com/2009/10/28/pylons-opinion-dont-use-authkit/#comments</comments>
		<pubDate>Wed, 28 Oct 2009 18:36:27 +0000</pubDate>
		<dc:creator>jon</dc:creator>
				<category><![CDATA[Pylons Opinions]]></category>

		<guid isPermaLink="false">http://www.letsyouandhimfight.com/?p=49</guid>
		<description><![CDATA[There are three common systems of user authentication and authorization in Pylons nowadays, Authkit, repoze.who/what, and what is affectionately termed &#8220;roll-yer-own&#8221;. Many people, upon reading James Gardner&#8217;s The Definitive Guide to Pylons, conclude that Authkit is the preferred method among Pylons users. It may be worth mentioning at this point that Authkit is also written [...]]]></description>
			<content:encoded><![CDATA[<p>There are three common systems of user authentication and authorization in Pylons nowadays, Authkit, repoze.who/what, and what is affectionately termed &#8220;roll-yer-own&#8221;. Many people, upon reading James Gardner&#8217;s <em>The Definitive Guide to Pylons</em>, conclude that Authkit is the preferred method among Pylons users. It may be worth mentioning at this point that Authkit is also written by James Gardner.</p>
<p>The actual fact of the matter is that Authkit is, at best, deprecated. My own opinion is that, if you have a good grasp of how auth <em>ought</em> to work, you can implement a roll-yer-own system in less time than it takes to integrate Authkit, and it will be more suited to your needs.</p>
<p>Let us consider the situation: You require a user model in any event — something to keep track of which user is which. (And may I take a moment to recommend the use of <a href="http://pypi.python.org/pypi/bcrypt/0.1">bcrypt</a> for secure password storage?) You require some mechanism of keeping track of which user is logged in; the Pylons session will do nicely for this. You require a login/logout controller, which technically is not needed for the most basic Authkit setup, but which you will want to have if you want your login/logout pages to look like the rest of your site. And finally, you require some function, possibly a decorator, which lets you mark certain actions as requiring a logged-in user or a particular kind of logged-in user. These are pretty simple to write; you may wish to consult the <a href="http://wiki.pylonshq.com/display/pylonscookbook/Advanced+Homegrown+Auth">Advanced Homegrown Auth</a> article at the Pylons Cookbook wiki if you run into difficulty.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.letsyouandhimfight.com/2009/10/28/pylons-opinion-dont-use-authkit/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Adding support for a new procedural language to Postgres 8.3</title>
		<link>http://www.letsyouandhimfight.com/2009/05/16/adding-support-for-a-new-procedural-language-to-postgres-83/</link>
		<comments>http://www.letsyouandhimfight.com/2009/05/16/adding-support-for-a-new-procedural-language-to-postgres-83/#comments</comments>
		<pubDate>Sun, 17 May 2009 03:44:37 +0000</pubDate>
		<dc:creator>jon</dc:creator>
				<category><![CDATA[Write]]></category>

		<guid isPermaLink="false">http://www.letsyouandhimfight.com/?p=44</guid>
		<description><![CDATA[I&#8217;m working on implementing a new procedural language for Postgres. The docs have a section on this. Too bad it turns out to cause compiler errors and generally not work. So, for the benefit of anyone else who&#8217;s interested, here&#8217;s what I did to get an utterly barebones one working. It&#8217;s hardcoded with support for [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;m working on implementing a new procedural language for Postgres. The docs have a section on this. Too bad it turns out to cause compiler errors and generally not work.</p>
<p>So, for the benefit of anyone else who&#8217;s interested, here&#8217;s what I did to get an utterly barebones one working. It&#8217;s hardcoded with support for only one function, but once you have the framework in place, you can put in your interpreter or whatever. I&#8217;ll blog about that when I get to it.</p>
<p>C source:<br />
<script src="http://gist.github.com/112906.js"></script></p>
<p>Makefile:<br />
<script src="http://gist.github.com/112907.js"></script></p>
<p>SQL setup and use:<br />
<script src="http://gist.github.com/112908.js"></script></p>
]]></content:encoded>
			<wfw:commentRss>http://www.letsyouandhimfight.com/2009/05/16/adding-support-for-a-new-procedural-language-to-postgres-83/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Comet for Cappuccino</title>
		<link>http://www.letsyouandhimfight.com/2009/05/08/comet-for-cappuccino/</link>
		<comments>http://www.letsyouandhimfight.com/2009/05/08/comet-for-cappuccino/#comments</comments>
		<pubDate>Fri, 08 May 2009 13:45:22 +0000</pubDate>
		<dc:creator>jon</dc:creator>
				<category><![CDATA[Write]]></category>

		<guid isPermaLink="false">http://www.letsyouandhimfight.com/?p=41</guid>
		<description><![CDATA[Comet is a vaguely-defined set of technologies for asynchronously sending data from the server to the client. Cappuccino is a framework for developing apps in Javascript. Once more, we at &#8220;Let&#8217;s You and Him Fight&#8221; are doing science by smushing things together: Cometuccino]]></description>
			<content:encoded><![CDATA[<p>Comet is a vaguely-defined set of technologies for asynchronously sending data from the server to the client. Cappuccino is a framework for developing apps in Javascript. Once more, we at &#8220;Let&#8217;s You and Him Fight&#8221; are doing science by smushing things together: <a href="http://github.com/inklesspen/cometuccino/tree/master">Cometuccino</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.letsyouandhimfight.com/2009/05/08/comet-for-cappuccino/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>What I&#8217;ve been working on</title>
		<link>http://www.letsyouandhimfight.com/2009/03/31/what-ive-been-working-on/</link>
		<comments>http://www.letsyouandhimfight.com/2009/03/31/what-ive-been-working-on/#comments</comments>
		<pubDate>Tue, 31 Mar 2009 17:51:17 +0000</pubDate>
		<dc:creator>jon</dc:creator>
				<category><![CDATA[Write]]></category>

		<guid isPermaLink="false">http://www.letsyouandhimfight.com/?p=38</guid>
		<description><![CDATA[Grid-o-Matic is a Javascript-based combat grid for D&#038;D 4 and other grid-intensive games. Click the image below for a short QuickTime video showing it off.]]></description>
			<content:encoded><![CDATA[<p>Grid-o-Matic is a Javascript-based combat grid for D&#038;D 4 and other grid-intensive games. Click the image below for a short QuickTime video showing it off.</p>
<p><a href="http://www.letsyouandhimfight.com/wp-content/media/2009/03/griddemo_public.mov"><img class="alignnone size-full wp-image-37" title="griddemo_thumb" src="http://www.letsyouandhimfight.com/wp-content/media/2009/03/griddemo_thumb.png" alt="griddemo_thumb" width="446" height="352" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.letsyouandhimfight.com/2009/03/31/what-ive-been-working-on/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
<enclosure url="http://www.letsyouandhimfight.com/wp-content/media/2009/03/griddemo_public.mov" length="2276033" type="video/quicktime" />
		</item>
		<item>
		<title>Birdcage goes International</title>
		<link>http://www.letsyouandhimfight.com/2008/12/06/birdcage-goes-international/</link>
		<comments>http://www.letsyouandhimfight.com/2008/12/06/birdcage-goes-international/#comments</comments>
		<pubDate>Sun, 07 Dec 2008 04:39:59 +0000</pubDate>
		<dc:creator>jon</dc:creator>
				<category><![CDATA[Write]]></category>
		<category><![CDATA[birdcage]]></category>

		<guid isPermaLink="false">http://www.letsyouandhimfight.com/?p=32</guid>
		<description><![CDATA[We have Unicode working correctly, though that&#8217;s no big surprise, because OS X has great support. I just wanted to post something. Scrolling seems a bit wonky. Will need further tests.]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.letsyouandhimfight.com/wp-content/media/2008/12/picture-1.png"><img class="alignnone size-medium wp-image-33" title="picture-1" src="http://www.letsyouandhimfight.com/wp-content/media/2008/12/picture-1-300x213.png" alt="" width="300" height="213" /></a></p>
<p>We have Unicode working correctly, though that&#8217;s no big surprise, because OS X has great support. I just wanted to post something.</p>
<p>Scrolling seems a bit wonky. Will need further tests.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.letsyouandhimfight.com/2008/12/06/birdcage-goes-international/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Birdcage Status Post 1.6</title>
		<link>http://www.letsyouandhimfight.com/2008/11/25/birdcage-status-post-16/</link>
		<comments>http://www.letsyouandhimfight.com/2008/11/25/birdcage-status-post-16/#comments</comments>
		<pubDate>Wed, 26 Nov 2008 02:04:39 +0000</pubDate>
		<dc:creator>jon</dc:creator>
				<category><![CDATA[Write]]></category>
		<category><![CDATA[birdcage]]></category>

		<guid isPermaLink="false">http://www.letsyouandhimfight.com/?p=29</guid>
		<description><![CDATA[I implemented automatically scrolling down to the new stuff. Now we are officially more usable than telnet.]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.letsyouandhimfight.com/wp-content/media/2008/11/scrolldown.png"><img class="alignnone size-medium wp-image-30" title="scrolldown" src="http://www.letsyouandhimfight.com/wp-content/media/2008/11/scrolldown-300x223.png" alt="" width="300" height="223" /></a></p>
<p>I implemented automatically scrolling down to the new stuff. Now we are officially more usable than telnet.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.letsyouandhimfight.com/2008/11/25/birdcage-status-post-16/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Birdcage Status Post 1.5</title>
		<link>http://www.letsyouandhimfight.com/2008/11/25/birdcage-status-post-15/</link>
		<comments>http://www.letsyouandhimfight.com/2008/11/25/birdcage-status-post-15/#comments</comments>
		<pubDate>Tue, 25 Nov 2008 19:58:42 +0000</pubDate>
		<dc:creator>jon</dc:creator>
				<category><![CDATA[Write]]></category>
		<category><![CDATA[birdcage]]></category>

		<guid isPermaLink="false">http://www.letsyouandhimfight.com/?p=26</guid>
		<description><![CDATA[Now, human-style talkings can ensue.]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.letsyouandhimfight.com/wp-content/media/2008/11/conversationing.png"><img class="alignnone size-medium wp-image-27" title="Conversationing" src="http://www.letsyouandhimfight.com/wp-content/media/2008/11/conversationing-300x213.png" alt="" width="300" height="213" /></a></p>
<p>Now, human-style talkings can ensue.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.letsyouandhimfight.com/2008/11/25/birdcage-status-post-15/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Birdcage Status Post 1</title>
		<link>http://www.letsyouandhimfight.com/2008/11/24/birdcage-status-post-1/</link>
		<comments>http://www.letsyouandhimfight.com/2008/11/24/birdcage-status-post-1/#comments</comments>
		<pubDate>Tue, 25 Nov 2008 07:06:35 +0000</pubDate>
		<dc:creator>jon</dc:creator>
				<category><![CDATA[Write]]></category>
		<category><![CDATA[birdcage]]></category>

		<guid isPermaLink="false">http://www.letsyouandhimfight.com/?p=20</guid>
		<description><![CDATA[I WIN AGAIN]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.letsyouandhimfight.com/wp-content/media/2008/11/horrible_ui.png"><img class="alignnone size-medium wp-image-21" title="Horrible UI" src="http://www.letsyouandhimfight.com/wp-content/media/2008/11/horrible_ui-300x205.png" alt="" width="300" height="205" /></a></p>
<p><strong>I WIN AGAIN</strong></p>
]]></content:encoded>
			<wfw:commentRss>http://www.letsyouandhimfight.com/2008/11/24/birdcage-status-post-1/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

