<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">

  <title><![CDATA[Jonathan Fischer]]></title>
  <link href="http://www.mohiji.org/atom.xml" rel="self"/>
  <link href="http://www.mohiji.org/"/>
  <updated>2012-04-30T22:43:25-07:00</updated>
  <id>http://www.mohiji.org/</id>
  <author>
    <name><![CDATA[Jonathan Fischer]]></name>
    
  </author>
  <generator uri="http://octopress.org/">Octopress</generator>

  
  <entry>
    <title type="html"><![CDATA[Implementing A*]]></title>
    <link href="http://www.mohiji.org/2012/04/implementing-a-star/"/>
    <updated>2012-04-27T22:31:00-07:00</updated>
    <id>http://www.mohiji.org/2012/04/implementing-a-star</id>
    <content type="html"><![CDATA[<p>I recently put together an A* implementation for the first time. I actually did it
twice: once in a naive way just to get a good grasp on how the algorithm works, and
then a second time with an eye towards making it perform better. I&#8217;ve been meaning
to write up my observations on it for a couple of months, so here they are.</p>

<!-- more -->


<p><a href="http://theory.stanford.edu/~amitp/GameProgramming/">Amit&#8217;s A* Pages</a> served as my primary reference for how the algorithm works.
That&#8217;s definitely the place to go if you want to learn about it.</p>

<p>For my first implementation of the algorithm, I did a very straightforward
implementation: I had a 2D grid of locations with movements costs, a list of
closed off locations, and a list of open locations being considered.
The data structures looked like this (with some unimportant details elided):</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
</pre></td><td class='code'><pre><code class='objc'><span class='line'><span class="c1">// This class is just an NSArray of waypoints</span>
</span><span class='line'><span class="k">@class</span> <span class="nc">Path</span>;
</span><span class='line'>
</span><span class='line'><span class="k">@interface</span> <span class="nc">PathNode</span> : <span class="nc">NSObject</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>    <span class="kt">float</span> <span class="n">fValue</span><span class="p">,</span> <span class="n">gValue</span><span class="p">,</span> <span class="n">hValue</span><span class="p">;</span>
</span><span class='line'>    <span class="n">MapCoordinate</span> <span class="n">coordinate</span><span class="p">;</span>
</span><span class='line'>    <span class="n">PathNode</span> <span class="o">*</span><span class="n">parent</span><span class="p">;</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'><span class="k">@end</span>
</span><span class='line'>
</span><span class='line'><span class="err">@</span><span class="n">interface</span> <span class="n">Pathfinder</span> <span class="o">:</span> <span class="n">NSObject</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>    <span class="n">NSMutableArray</span> <span class="o">*</span><span class="n">_openList</span><span class="p">;</span>
</span><span class='line'>    <span class="n">NSMutableArray</span> <span class="o">*</span><span class="n">_closedList</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>    <span class="c1">// CollisionMap is just a 2D grid of movement costs with some</span>
</span><span class='line'>    <span class="c1">// nice accessor functions</span>
</span><span class='line'>    <span class="n">CollisionMap</span> <span class="o">*</span><span class="n">_collisionMap</span><span class="p">;</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="p">...</span>
</span><span class='line'><span class="o">-</span> <span class="p">(</span><span class="n">Path</span><span class="o">*</span><span class="p">)</span><span class="nl">pathFromStart:</span><span class="p">(</span><span class="n">CGPoint</span><span class="p">)</span><span class="n">startPosition</span> <span class="nl">toEnd:</span><span class="p">(</span><span class="n">CGPoint</span><span class="p">)</span><span class="n">endPosition</span><span class="p">;</span>
</span><span class='line'><span class="k">@end</span>
</span></code></pre></td></tr></table></div></figure>


<p>There are three important details about this first implementation:</p>

<ul>
<li>The open and closed lists are kept in NSMutableArrays. The open list is
kept sorted at insertion time. Checking for membership in one of the lists
means scanning through the list.</li>
<li>PathNodes are dynamically allocated.</li>
<li>This implementation was dog slow.</li>
</ul>


<p>On an iPad 2 with a moderately sized map, finding a decent length path took 200ms.
Totally not acceptable. I expected the first pass to be bad; in particular I expected
maintaining the sorted open list to perform terribly. So I fired up Instruments, captured
a trace, and the results looked like this:</p>

<p><img class="center" src="http://www.mohiji.org/uploads/a-star/profiler-slow.png" title="'Slow Profiler Run'" ></p>

<p>By far the thing taking the most time was looking through the open and closed lists
for a previously allocated PathNode (<code>indexOfCoordinate:inList:</code>).  Maintaining the
open list took almost no time next to that.</p>

<p>I was breaking other rules too: in particular, allocating and deallocating those PathNodes
at runtime was a bad idea. So, armed with the profiler results, I took a second shot at the
implementation.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
</pre></td><td class='code'><pre><code class='objc'><span class='line'><span class="k">struct</span> <span class="n">PathfindingCell</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>    <span class="n">MapCoordinate</span> <span class="n">coordinate</span><span class="p">;</span>
</span><span class='line'>    <span class="kt">float</span> <span class="n">f</span><span class="p">,</span> <span class="n">g</span><span class="p">,</span> <span class="n">h</span><span class="p">;</span>
</span><span class='line'>    <span class="k">struct</span> <span class="n">PathfindingCell</span> <span class="o">*</span><span class="n">parent</span><span class="p">;</span>
</span><span class='line'>    <span class="k">struct</span> <span class="n">PathfindingCell</span> <span class="o">*</span><span class="n">openPrevious</span><span class="p">,</span> <span class="o">*</span><span class="n">openNext</span><span class="p">;</span>
</span><span class='line'>    <span class="k">struct</span> <span class="n">PathfindingCell</span> <span class="o">*</span><span class="n">closedPrevious</span><span class="p">,</span> <span class="o">*</span><span class="n">closedNext</span><span class="p">;</span>
</span><span class='line'><span class="p">};</span>
</span><span class='line'>
</span><span class='line'><span class="k">typedef</span> <span class="k">struct</span> <span class="n">PathfindingCell</span> <span class="n">PathfindingCell</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'><span class="k">@interface</span> <span class="nc">Pathfinder</span> : <span class="nc">NSObject</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>    <span class="n">CollisionMap</span> <span class="o">*</span><span class="n">_collisionMap</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>    <span class="kt">int</span> <span class="n">_cellsWide</span><span class="p">;</span>
</span><span class='line'>    <span class="kt">int</span> <span class="n">_cellsHigh</span><span class="p">;</span>
</span><span class='line'>    <span class="n">PathfindingCell</span> <span class="o">*</span><span class="n">_cells</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>    <span class="n">PathfindingCell</span> <span class="o">*</span><span class="n">_openListHead</span><span class="p">;</span>
</span><span class='line'>    <span class="n">PathfindingCell</span> <span class="o">*</span><span class="n">_closedListHead</span><span class="p">;</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'><span class="o">-</span> <span class="p">(</span><span class="kt">id</span><span class="p">)</span><span class="nl">initWithCollisionMap:</span><span class="p">(</span><span class="n">CollisionMap</span> <span class="o">*</span><span class="p">)</span><span class="n">collisionMap</span><span class="p">;</span>
</span><span class='line'><span class="o">-</span> <span class="p">(</span><span class="n">Path</span><span class="o">*</span><span class="p">)</span><span class="nl">pathFromStart:</span><span class="p">(</span><span class="n">CGPoint</span><span class="p">)</span><span class="n">startPosition</span> <span class="nl">toEnd:</span><span class="p">(</span><span class="n">CGPoint</span><span class="p">)</span><span class="n">endPosition</span><span class="p">;</span>
</span></code></pre></td></tr></table></div></figure>


<p>This time:</p>

<ul>
<li>I keep a 2D array of PathfindingCells with the same dimensions as the input
CollisionMap.  This is allocated once when the Pathfinder object is created,
and never again.</li>
<li>Instead of using NSMutableArrays, I now keep list links directly in the
PathfindingCell structs.</li>
<li>As a result of those two properties, I can now:

<ul>
<li>Directly look up any cell given an x,y location.</li>
<li>Determine whether a cell is in the open or closed list without traversing
the list.</li>
</ul>
</li>
<li>Only one allocation is made for each run, and that&#8217;s for the Path object
that gets returned from the <code>pathFromStart:toEnd:</code> method.</li>
</ul>


<p>Importantly, the algorithm didn&#8217;t change, but the data layout did. With these
changes, a profiler run for the same map and path now looks like this:</p>

<p><img class="center" src="http://www.mohiji.org/uploads/a-star/profiler-fast.png" title="'Fast Profiler Run'" ></p>

<p>That&#8217;s better. I could probably make it faster; maybe a priority queue would
work better than the insertion-sorted list I&#8217;m using now, and I could pre-allocate
a fixed length Path object or something else, but it&#8217;s fast enough for me now,
so I stopped at this point.</p>

<p>I posted the source code for the implementation as a <a href="https://gist.github.com/2409091">Github Gist</a>. It&#8217;s
just the A* implementation without any drawing code or anything, but hopefully
it&#8217;ll still be useful to learn from.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Tracking touches in an MKMapView]]></title>
    <link href="http://www.mohiji.org/2011/12/tracking-touches-in-an-mkmapview/"/>
    <updated>2011-12-15T21:33:00-08:00</updated>
    <id>http://www.mohiji.org/2011/12/tracking-touches-in-an-mkmapview</id>
    <content type="html"><![CDATA[<p>This post is the result of me playing around with <a href="http://developer.apple.com/library/ios/#documentation/MapKit/Reference/MKMapView_Class/MKMapView/MKMapView.html">MKMapView</a> to
figure out what I can and can&#8217;t do with it, so it may ramble a bit.</p>

<p>Here&#8217;s the idea: I want to be able to tap on a map view and drop a pin.
I don&#8217;t want to try and subclass the map view,
and the <a href="http://developer.apple.com/library/ios/#documentation/MapKit/Reference/MKMapViewDelegate_Protocol/MKMapViewDelegate/MKMapViewDelegate.html">MKMapViewDelegate</a> protocol doesn&#8217;t give you access
to taps.</p>

<p>However, it is still a normal view, and that means I can attach
<a href="http://developer.apple.com/library/IOs/#documentation/UIKit/Reference/UIGestureRecognizer_Class/Reference/Reference.html">UIGestureRecognizers</a> to it.</p>

<!-- more -->


<p>For a first, straightforward attempt, let&#8217;s just create a basic Window based
iOS application.  (I hear this is gone in iOS 5.0; you can get one back from
Big Nerd Ranch here: <a href="http://forums.bignerdranch.com/viewtopic.php?f=73&amp;t=3336">Window-Based Application</a>.)  Drop an MKMapView
on your window and hook it up to your App Delegate.  If you want, tell it to
show the user location and zoom in on whatever region.</p>

<p>If you have Big Nerd Ranch&#8217;s <a href="http://www.amazon.com/gp/product/0321773772/ref=as_li_qf_sp_asin_il_tl?ie=UTF8&amp;tag=jonatfisch-20&amp;linkCode=as2&amp;camp=1789&amp;creative=9325&amp;creativeASIN=0321773772">iOS Programming</a>, the Whereami
application in Chapter 5 is pretty much the starting point I&#8217;m using.  There&#8217;s
a link at the bottom of the post for a demo project as well.</p>

<p>Now, let&#8217;s add a <a href="http://developer.apple.com/library/IOs/#documentation/UIKit/Reference/UITapGestureRecognizer_Class/Reference/Reference.html#//apple_ref/occ/cl/UITapGestureRecognizer">UITapGestureRecognizer</a> to catch taps on
the map:</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
</pre></td><td class='code'><pre><code class='objc'><span class='line'><span class="o">-</span> <span class="p">(</span><span class="kt">BOOL</span><span class="p">)</span><span class="nl">application:</span><span class="p">(</span><span class="n">UIApplication</span> <span class="o">*</span><span class="p">)</span><span class="n">app</span> <span class="nl">didFinishLaunchingWithOptions:</span><span class="p">(</span><span class="n">NSDictionary</span> <span class="o">*</span><span class="p">)</span><span class="n">options</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>    <span class="p">...</span>
</span><span class='line'>    <span class="n">UITapGestureRecognizer</span> <span class="o">*</span><span class="n">tapGesture</span> <span class="o">=</span> <span class="p">[[</span><span class="n">UITapGestureRecognizer</span> <span class="n">alloc</span><span class="p">]</span> <span class="nl">initWithTarget:</span><span class="n">self</span> <span class="nl">action:</span><span class="k">@selector</span><span class="p">(</span><span class="nl">handleTap:</span><span class="p">)];</span>
</span><span class='line'>    <span class="p">[</span><span class="n">mapView</span> <span class="nl">addGestureRecognizer:</span><span class="n">tapGesture</span><span class="p">];</span>
</span><span class='line'>    <span class="p">[</span><span class="n">tapGesture</span> <span class="n">release</span><span class="p">];</span>
</span><span class='line'>    <span class="p">...</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>And the method that&#8217;ll be called when the taps are caught.  We only want single
taps, so let&#8217;s try and filter that out:</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
</pre></td><td class='code'><pre><code class='objc'><span class='line'><span class="o">-</span> <span class="p">(</span><span class="kt">void</span><span class="p">)</span><span class="nl">handleTap:</span><span class="p">(</span><span class="kt">id</span><span class="p">)</span><span class="n">sender</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>    <span class="n">UITapGestureRecognizer</span> <span class="o">*</span><span class="n">tapGesture</span> <span class="o">=</span> <span class="p">(</span><span class="n">UITapGestureRecognizer</span><span class="o">*</span><span class="p">)</span><span class="n">sender</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>    <span class="n">CGPoint</span> <span class="n">tapPoint</span> <span class="o">=</span> <span class="p">[</span><span class="n">tapGesture</span> <span class="nl">locationInView:</span><span class="n">mapView</span><span class="p">];</span>
</span><span class='line'>    <span class="n">CLLocationCoordinate2D</span> <span class="n">coord</span> <span class="o">=</span> <span class="p">[</span><span class="n">mapView</span> <span class="nl">convertPoint:</span><span class="n">tapPoint</span> <span class="nl">toCoordinateFromView:</span><span class="n">mapView</span><span class="p">];</span>
</span><span class='line'>
</span><span class='line'>    <span class="n">NSUInteger</span> <span class="n">numberOfTouches</span> <span class="o">=</span> <span class="p">[</span><span class="n">tapGesture</span> <span class="n">numberOfTouches</span><span class="p">];</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">if</span> <span class="p">(</span><span class="n">numberOfTouches</span> <span class="o">==</span> <span class="mi">1</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="n">NSLog</span><span class="p">(</span><span class="s">@&quot;Tap location was %.0f, %.0f&quot;</span><span class="p">,</span> <span class="n">tapPoint</span><span class="p">.</span><span class="n">x</span><span class="p">,</span> <span class="n">tapPoint</span><span class="p">.</span><span class="n">y</span><span class="p">);</span>
</span><span class='line'>        <span class="n">NSLog</span><span class="p">(</span><span class="s">@&quot;World coordinate was longitude %f, latitude %f&quot;</span><span class="p">,</span> <span class="n">coord</span><span class="p">.</span><span class="n">longitude</span><span class="p">,</span> <span class="n">coord</span><span class="p">.</span><span class="n">latitude</span><span class="p">);</span>
</span><span class='line'>    <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
</span><span class='line'>        <span class="n">NSLog</span><span class="p">(</span><span class="s">@&quot;Number of touches was %d, ignoring&quot;</span><span class="p">,</span> <span class="n">numberOfTouches</span><span class="p">);</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>Build and run, and at first glance, this works just fine.  Tap and watch the logs
and it&#8217;ll tell you both the window location and world location that your finger
dropped.  You can still tap and drag to move the view around and pinch to zoom,
so we haven&#8217;t broken anything.</p>

<p>However, try double tapping.  The map will still zoom properly, but it&#8217;s still
going to call <code>handleTap:</code>, even with the check for number of touches.  Bummer.</p>

<p>UIGestureRecognizers can be set up to require one or more other recognizers to
fail, so let&#8217;s give that a try.  We&#8217;ll add another UITapGestureRecognizer
and set its minimum number of taps to 2, and then require that it fail before
the original recognizer will work.</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
</pre></td><td class='code'><pre><code class='objc'><span class='line'><span class="p">...</span>
</span><span class='line'><span class="n">UITapGestureRecognizer</span> <span class="o">*</span><span class="n">doubleTap</span> <span class="o">=</span> <span class="p">[[</span><span class="n">UITapGestureRecognizer</span> <span class="n">alloc</span><span class="p">]</span> <span class="n">init</span><span class="p">];</span>
</span><span class='line'><span class="p">[</span><span class="n">doubleTap</span> <span class="nl">setNumberOfTapsRequired:</span><span class="mi">2</span><span class="p">];</span>
</span><span class='line'><span class="p">[</span><span class="n">doubleTap</span> <span class="nl">setCancelsTouchesInView:</span><span class="n">NO</span><span class="p">];</span>
</span><span class='line'><span class="p">[</span><span class="n">mapView</span> <span class="nl">addGestureRecognizer:</span><span class="n">doubleTap</span><span class="p">];</span>
</span><span class='line'>
</span><span class='line'><span class="n">UITapGestureRecognizer</span> <span class="o">*</span><span class="n">tapGesture</span> <span class="o">=</span> <span class="p">[[</span><span class="n">UITapGestureRecognizer</span> <span class="n">alloc</span><span class="p">]</span> <span class="nl">initWithTarget:</span><span class="n">self</span> <span class="nl">action:</span><span class="k">@selector</span><span class="p">(</span><span class="nl">handleTap:</span><span class="p">)];</span>
</span><span class='line'><span class="p">[</span><span class="n">tapGesture</span> <span class="nl">requireGestureRecognizerToFail:</span><span class="n">doubleTap</span><span class="p">];</span>
</span><span class='line'><span class="p">[</span><span class="n">mapView</span> <span class="nl">addGestureRecognizer:</span><span class="n">tapGesture</span><span class="p">];</span>
</span><span class='line'><span class="p">[</span><span class="n">tapGesture</span> <span class="n">release</span><span class="p">];</span>
</span><span class='line'><span class="p">[</span><span class="n">doubleTap</span> <span class="n">release</span><span class="p">];</span>
</span><span class='line'><span class="p">...</span>
</span></code></pre></td></tr></table></div></figure>


<p>Build and run, and sweet!  Now we&#8217;re only catching single taps in <code>handleMap:</code>!</p>

<p>However, now double tapping to zoom is broken.  It looks like we&#8217;re interfering
with MKMapView&#8217;s internal gesture recognizers now.  Let&#8217;s take a look at those.</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
</pre></td><td class='code'><pre><code class='objc'><span class='line'><span class="p">...</span>
</span><span class='line'><span class="n">NSArray</span> <span class="o">*</span><span class="n">gestureRecognizers</span> <span class="o">=</span> <span class="p">[</span><span class="n">mapView</span> <span class="n">gestureRecognizers</span><span class="p">];</span>
</span><span class='line'><span class="k">for</span> <span class="p">(</span><span class="n">UIGestureRecognizer</span> <span class="o">*</span><span class="n">recognizer</span> <span class="k">in</span> <span class="n">gestureRecognizers</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="n">NSLog</span><span class="p">(</span><span class="s">@&quot;%@&quot;</span><span class="p">,</span> <span class="n">recognizer</span><span class="p">);</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'><span class="p">...</span>
</span></code></pre></td></tr></table></div></figure>


<p>Running that will show us something like this:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>2011-12-15 21:20:51.844 TouchTheMap[1207:207] &lt;UILongPressGestureRecognizer: 0x5a199c0; state = Possible; cancelsTouchesInView = NO; view = &lt;MKMapView 0x5847a40&gt;; target= &lt;(action=handleLongPress:, target=&lt;MKMapView 0x5847a40&gt;)&gt;&gt;
</span><span class='line'>2011-12-15 21:20:51.846 TouchTheMap[1207:207] &lt;UITapGestureRecognizer: 0x5a19200; state = Possible; view = &lt;MKMapView 0x5847a40&gt;; target= &lt;(action=handleTap:, target=&lt;MKMapView 0x5847a40&gt;)&gt;; must-fail = {
</span><span class='line'>        &lt;UITapGestureRecognizer: 0x5a19b90; state = Possible; view = &lt;MKMapView 0x5847a40&gt;; target= &lt;(action=handleDoubleTap:, target=&lt;MKMapView 0x5847a40&gt;)&gt;; numberOfTapsRequired = 2&gt;
</span><span class='line'>    }&gt;
</span><span class='line'>2011-12-15 21:20:51.846 TouchTheMap[1207:207] &lt;UITapGestureRecognizer: 0x5a19b90; state = Possible; view = &lt;MKMapView 0x5847a40&gt;; target= &lt;(action=handleDoubleTap:, target=&lt;MKMapView 0x5847a40&gt;)&gt;; numberOfTapsRequired = 2; must-fail-for = {
</span><span class='line'>        &lt;UITapGestureRecognizer: 0x5a19200; state = Possible; view = &lt;MKMapView 0x5847a40&gt;; target= &lt;(action=handleTap:, target=&lt;MKMapView 0x5847a40&gt;)&gt;&gt;
</span><span class='line'>    }&gt;
</span><span class='line'>2011-12-15 21:20:51.846 TouchTheMap[1207:207] &lt;UITapGestureRecognizer: 0x5a19db0; state = Possible; view = &lt;MKMapView 0x5847a40&gt;; target= &lt;(action=handleTwoFingerTap:, target=&lt;MKMapView 0x5847a40&gt;)&gt;; numberOfTouchesRequired = 2&gt;</span></code></pre></td></tr></table></div></figure>


<p>So there are already UITapGestureRecognizers in there for both single and double taps.
I have no idea what the single tap one does, but the double tap one probably handles
zooming.  Maybe we can just hijack that one.</p>

<p>So rip out the double tap recognizer we added, and dig through the built-in recognizers
to find the double tap one and rely on that one instead.</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
</pre></td><td class='code'><pre><code class='objc'><span class='line'><span class="p">...</span>
</span><span class='line'><span class="n">UIGestureRecognizer</span> <span class="o">*</span><span class="n">builtInDoubleTap</span> <span class="o">=</span> <span class="nb">nil</span><span class="p">;</span>
</span><span class='line'><span class="n">NSArray</span> <span class="o">*</span><span class="n">gestureRecognizers</span> <span class="o">=</span> <span class="p">[</span><span class="n">mapView</span> <span class="n">gestureRecognizers</span><span class="p">];</span>
</span><span class='line'><span class="k">for</span> <span class="p">(</span><span class="n">UIGestureRecognizer</span> <span class="o">*</span><span class="n">recognizer</span> <span class="k">in</span> <span class="n">gestureRecognizers</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">if</span> <span class="p">([</span><span class="n">recognizer</span> <span class="n">class</span><span class="p">]</span> <span class="o">==</span> <span class="p">[</span><span class="n">UITapGestureRecognizer</span> <span class="n">class</span><span class="p">])</span> <span class="p">{</span>
</span><span class='line'>        <span class="k">if</span> <span class="p">([(</span><span class="n">UITapGestureRecognizer</span> <span class="o">*</span><span class="p">)</span><span class="n">recognizer</span> <span class="n">numberOfTapsRequired</span><span class="p">]</span> <span class="o">==</span> <span class="mi">2</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>            <span class="n">NSLog</span><span class="p">(</span><span class="s">@&quot;Found double tap recognizer: %@&quot;</span><span class="p">,</span> <span class="n">recognizer</span><span class="p">);</span>
</span><span class='line'>            <span class="n">builtInDoubleTap</span> <span class="o">=</span> <span class="n">recognizer</span><span class="p">;</span>
</span><span class='line'>            <span class="k">break</span><span class="p">;</span>
</span><span class='line'>        <span class="p">}</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="n">UITapGestureRecognizer</span> <span class="o">*</span><span class="n">tapGesture</span> <span class="o">=</span> <span class="p">[[</span><span class="n">UITapGestureRecognizer</span> <span class="n">alloc</span><span class="p">]</span> <span class="nl">initWithTarget:</span><span class="n">self</span> <span class="nl">action:</span><span class="k">@selector</span><span class="p">(</span><span class="nl">handleTap:</span><span class="p">)];</span>
</span><span class='line'><span class="p">[</span><span class="n">tapGesture</span> <span class="nl">requireGestureRecognizerToFail:</span><span class="n">builtInDoubleTap</span><span class="p">];</span>
</span><span class='line'><span class="p">[</span><span class="n">mapView</span> <span class="nl">addGestureRecognizer:</span><span class="n">tapGesture</span><span class="p">];</span>
</span><span class='line'><span class="p">[</span><span class="n">tapGesture</span> <span class="n">release</span><span class="p">];</span>
</span><span class='line'><span class="p">...</span>
</span></code></pre></td></tr></table></div></figure>


<p>Build and run, and bingo.  A single tap on the map will report the tap
location in the Debug console, and a double tap will still zoom properly.</p>

<p>I have only tested this in the simulator so far, as I&#8217;m cheap and
haven&#8217;t ponied up the cash for a developer license yet.  So this
might not work in the wild.</p>

<p>A sample project is up on <a href="http://github.com/">GitHub</a> named <a href="https://github.com/mohiji/TouchTheMap">TouchTheMap</a>.  I&#8217;ll be adding to
that project in later posts, so if you want the version of the code as of this
posting, grab the <a href="https://github.com/mohiji/TouchTheMap/tags">2011-12-15_touch_tracking</a> tag.</p>

<h3>Update</h3>

<blockquote><p>I figured out what that single tap gesture recognizer is in there for.
MKMapView uses it to catch when you tap on <a href="http://developer.apple.com/library/ios/#documentation/MapKit/Reference/MKAnnotation_Protocol/Reference/Reference.html">annotations</a>.
Unfortunately, adding your own single tap recognizer causes the built
in one to no longer get called, breaking that functionality.  So if you
need annotations, this is probably not a good idea.</p></blockquote>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Lunchtime Hike]]></title>
    <link href="http://www.mohiji.org/2011/11/lunchtime-hike/"/>
    <updated>2011-11-30T12:45:00-08:00</updated>
    <id>http://www.mohiji.org/2011/11/lunchtime-hike</id>
    <content type="html"><![CDATA[<p>Went on a short hike at the (future site of the) Veteran&#8217;s Memorial Park in Carlsbad.</p>

<blockquote><p>I managed to scratch the camera lens on my phone, so there&#8217;s a blurry corner
in these pictures.  Need to replace that.</p></blockquote>

<p><a href="http://www.mohiji.org/uploads/lunchtime-hike/IMG_2121.JPG"><img class="center" src="http://www.mohiji.org/uploads/lunchtime-hike/IMG_2121_thumbnail.jpg"></a>
<a href="http://www.mohiji.org/uploads/lunchtime-hike/IMG_2123.JPG"><img class="center" src="http://www.mohiji.org/uploads/lunchtime-hike/IMG_2123_thumbnail.jpg"></a>
<a href="http://www.mohiji.org/uploads/lunchtime-hike/IMG_2127.JPG"><img class="center" src="http://www.mohiji.org/uploads/lunchtime-hike/IMG_2127_thumbnail.jpg"></a></p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[IT Career Advice]]></title>
    <link href="http://www.mohiji.org/2011/11/it-career-advice/"/>
    <updated>2011-11-29T09:08:00-08:00</updated>
    <id>http://www.mohiji.org/2011/11/it-career-advice</id>
    <content type="html"><![CDATA[<p>Someone asked me for advice on getting started in IT, and I thought I&#8217;d post it up here as well.  He&#8217;s just getting started and doesn&#8217;t really have any experience at all yet, so this is geared towards finding out if you really even want to do this for a living.</p>

<p>I&#8217;m going to preface this with two caveats: I am a college dropout, and I have no certifications whatsoever.  I attended a University for 5 years before deciding to drop out; it got to the point where I&#8217;d taken all of the Computer Science classes I cared to and all that was left was a bunch of general education stuff that I didn&#8217;t want to spend any more time and money on.  I&#8217;m not really sure whether the lack of that degree has hurt me.  I still manage to get in to job interviews, and of the 6 or 7 positions I&#8217;ve interviewed for in the last 5 years, I&#8217;ve gotten offers at all but 2 of them.</p>

<p>If you don&#8217;t have any experience at all in IT, the most important thing I can suggest is getting that experience.  Ever set up a website before?  That&#8217;s a good place to start:</p>

<ul>
<li>Register a domain name (e.g. yourname.com or something)</li>
<li>Find hosting</li>
<li>Make a basic, static website.  (HTML + images only)</li>
<li>Got the hang of that?  Now go further: set up a dynamic website; Wordpress is an excellent starting point</li>
<li>Find out what a database is, what PHP is, what Javascript is, etc.</li>
</ul>


<p>That all sounds more like web developer stuff than straight IT, but a good IT person ends up needing to be able to handle a little bit of everything, and you need to know if you enjoy this stuff at all.  If you hate it, you want a different career.</p>

<p>Learn <a href="http://en.wikipedia.org/wiki/Unix">Unix</a>.  Windows is ubiquitous on desktop computers, but Unix provides the backbone of the Internet.  Not knowing it will hurt an IT person.  It&#8217;s easy to get started in: download <a href="http://www.ubuntu.com/">Ubuntu</a>, install it alongside Windows (assuming you have a Windows computer), and start playing.</p>

<p>Before you do that, back up everything.  Backups are not something you want to learn about the hard way.</p>

<p>Have a <a href="http://www.apple.com/mac/">Mac</a>?  Congrats, you&#8217;re already using a Unix machine.  Launch Terminal and start playing.</p>

<p>Really, the single most important skill you can have going into the IT field is the ability to learn.  Constantly.  Things never stop changing, new things pop up every day, and you&#8217;ll never get to the point where you can stop learning new things. You have to be ok with that, and even enjoy it if you&#8217;re going to make it in IT.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Simple Jambalaya]]></title>
    <link href="http://www.mohiji.org/2011/11/simple-jambalaya/"/>
    <updated>2011-11-22T13:04:00-08:00</updated>
    <id>http://www.mohiji.org/2011/11/simple-jambalaya</id>
    <content type="html"><![CDATA[<p><img src="http://www.mohiji.org/uploads/jambalaya/jambalaya.jpg" title="Jambalaya in progress" ></p>

<h3>Ingredients</h3>

<ul>
<li>1 pound smoked sausage (I use beef, but pork is good too)</li>
<li>1 green bell pepper</li>
<li>1 white onion</li>
<li>(optional) a few stalks of celery</li>
<li>2 cloves of garlic, minced (I use the pre-minced stuff in a jar, because I am lazy)</li>
<li>3/4 cup white rice</li>
<li>14 oz. tomato sauce</li>
<li>11 oz. chicken broth</li>
<li>1/2 tsp. ground thyme</li>
<li>1/4 tsp. cayenne pepper</li>
<li>1/4 tsp. white pepper</li>
<li>1 bay leaf</li>
<li>Dash of Worcestershire sauce</li>
</ul>


<h3>Instructions</h3>

<ol>
<li><p>Dice the bell pepper, chop up the onion and celery, slice up the sausage.
Start cooking the sausage over medium-high heat in a largish skillet until
it begins to render its fat, then add the bell pepper, onion and celery.</p></li>
<li><p>Cook the above until the onion turns clear, stirring occasionally.</p></li>
<li><p>Add the garlic, cook for another minute.</p></li>
<li><p>Turn the heat down to medium low and drain the fat, if you wish.
(I usually don&#8217;t bother when cooking with beef sausage.) Stir in the rice,
coating the sausage and veggies with it.</p></li>
<li><p>Add the rest of the ingredients, stir well, and simmer covered for 20
or sominutes, or until the rice has cooked fully. Stir it every few minutes;
the bottom layer likes to stick to the pan.</p></li>
<li><p>Fish out the bay leaf (you don&#8217;t want to bite into it by mistake), and serve!</p></li>
</ol>


<p>When I make this for myself, I usually pig out on it for dinner and have
enough left over for two lunches afterward.  It still tastes great after
reheating in a microwave.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Kettle Corn]]></title>
    <link href="http://www.mohiji.org/2011/11/kettle-corn/"/>
    <updated>2011-11-22T12:34:00-08:00</updated>
    <id>http://www.mohiji.org/2011/11/kettle-corn</id>
    <content type="html"><![CDATA[<p>I&#8217;m digging through some old stuff I posted on Facebook and I thought I&#8217;d make it
more discoverable.  So, here&#8217;s how I make Kettle Corn.</p>

<p>This isn&#8217;t as good as the real stuff at fairs, but it&#8217;ll do in a pinch.
It also costs maybe 20 - 30 cents per batch, rather than a buck or more for
prepackaged microwave kettle corn.</p>

<ul>
<li>1/4 cup of popping kernels</li>
<li>1/8 cup sugar</li>
<li>1/8 cup vegetable or canola oil</li>
</ul>


<p>Toss all of that in a medium-large sauce pan WITH A LID (very important). Heat it
on medium high, and once it starts popping shake it like you would Jiffy Pop.
The sugar will melt while you&#8217;re cooking and should coat everything evenly.</p>

<p>If you try this without a lid, you will pay the ultimate price. Seriously,
like hot cooking oil all over you. Bad times.</p>

<p>Toss it in a bowl and salt to taste when the kernels stop popping.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Migrating away from Wordpress]]></title>
    <link href="http://www.mohiji.org/2011/11/migrating-away-from-wordpress/"/>
    <updated>2011-11-17T13:13:00-08:00</updated>
    <id>http://www.mohiji.org/2011/11/migrating-away-from-wordpress</id>
    <content type="html"><![CDATA[<p>I&#8217;ve moved the blog away from <a href="http://wordpress.org">Wordpress</a> to
<a href="http://octopress.org">Octopress</a>. I like the idea of running without
a database; keeping an eye on Wordpress for security updates has
always bugged me. Plus, it&#8217;s never been terribly fast on my host, even
with my tiny blog.</p>

<p>I really dig that Octopress lets me keep all of my entries in simple
<a href="http://daringfireball.net/projects/markdown/">Markdown</a> formatted
text files. I can stick them in a VCS repository and always have
easily backed up and readable versions of the articles; no mucking
around with a database, and they don&#8217;t need to be HTML formatted.</p>

<p>There was a 4 year gap in my blogging from 2007-2011; most of that
content was pretty ancient and I doubt it&#8217;s of much use to anyone, so
I haven&#8217;t gotten around to importing the old stuff into the new
software yet. I&#8217;ll probably bring stuff in slowly over time.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Getting going with modern Common Lisp on Linux]]></title>
    <link href="http://www.mohiji.org/2011/01/modern-common-lisp-on-linux/"/>
    <updated>2011-01-31T15:38:15-08:00</updated>
    <id>http://www.mohiji.org/2011/01/modern-common-lisp-on-linux</id>
    <content type="html"><![CDATA[<p>High-level overview:</p>

<ul>
<li><p>Download and install SBCL (<a href="http://www.sbcl.org/">http://www.sbcl.org/</a>)</p></li>
<li><p>Download and install Emacs (<a href="http://www.gnu.org/software/emacs/">http://www.gnu.org/software/emacs/</a>)</p></li>
<li><p>Download and install Quicklisp (<a href="http://www.quicklisp.org/">http://www.quicklisp.org/</a>)</p></li>
<li><p>Configure everything so that it plays nice together.</p></li>
</ul>


<!-- more -->


<p>I&#8217;m doing this under Ubuntu 10.04, but I&#8217;m only using the package manager for
Emacs so this should translate well across multiple distributions.</p>

<h2>Download and install SBCL</h2>

<p><a href="http://www.sbcl.org/">SBCL</a> is probably the most popular Common Lisp implementation available
for Linux. There are other great ones out there (<a href="http://ccl.clozure.com/">Clozure CL</a> and
<a href="http://clisp.cons.org/">CLISP</a> come to mind), but SBCL&#8217;s the one I usually use.</p>

<p>Go to SBCL&#8217;s <a href="http://www.sbcl.org/platform-table.html">download page</a> and download the latest release for Linux.
(Both 32-bit and 64-bit work great).</p>

<p>Now fire up a terminal, switch to where you downloaded SBCL, unpack and
install it:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>user@localhost:~$ cd Downloads/
</span><span class='line'>user@localhost:~/Downloads$ tar xjf sbcl-1.0.45-x86-linux-binary.tar.bz2
</span><span class='line'>user@localhost:~/Downloads$ cd sbcl-1.0.45-x86-linux
</span><span class='line'>user@localhost:~/sbcl-1.0.45-x86-linux$ sudo sh install.sh</span></code></pre></td></tr></table></div></figure>


<p>That&#8217;ll install SBCL into /usr/local/bin. At this point you should be able to
run &#8216;sbcl&#8217; and get a Lisp prompt:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>user@localhost:~/sbcl-1.0.45-x86-linux$ sbcl
</span><span class='line'>This is SBCL 1.0.45, an implementation of ANSI Common Lisp.
</span><span class='line'>More information about SBCL is available at &lt;http://www.sbcl.org/&gt;.
</span><span class='line'>SBCL is free software, provided as is, with absolutely no warranty.
</span><span class='line'>It is mostly in the public domain; some portions are provided under
</span><span class='line'>BSD-style licenses.  See the CREDITS and COPYING files in the
</span><span class='line'>distribution for more information.
</span><span class='line'>*</span></code></pre></td></tr></table></div></figure>


<p>Hit Control-D or type <code>(quit)</code> to exit.</p>

<h2>Install Emacs</h2>

<p>Use your package manager for this. On Ubuntu:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>user@localhost:$ apt-get update
</span><span class='line'>user@localhost:$ apt-get install emacs</span></code></pre></td></tr></table></div></figure>


<h2>Download and install Quicklisp</h2>

<p>Download Quicklisp from <a href="http://www.quicklisp.org/">http://www.quicklisp.org/</a>. (It&#8217;s in beta at the
time this was written, but it&#8217;s fully functional and awesome). Download the
install file (<a href="http://beta.quicklisp.org/quicklisp.lisp">http://beta.quicklisp.org/quicklisp.lisp</a> at the time of
writing) and save it to disk somewhere easy to find.</p>

<p>Next, run sbcl and type in the following:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='common-lisp'><span class='line'><span class="p">(</span><span class="nb">load</span> <span class="s">&quot;/path/to/quicklisp.lisp&quot;</span><span class="p">)</span>
</span></code></pre></td></tr></table></div></figure>


<p>After it loads, run:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='common-lisp'><span class='line'><span class="p">(</span><span class="nv">quicklisp-quickstart:install</span><span class="p">)</span>
</span></code></pre></td></tr></table></div></figure>


<p>That&#8217;ll download the rest of the system and get it set up for you. Quicklisp
will install by default in <code>~/quicklisp</code>; you can change that by passing <code>:path
"/target/path/"</code> to the install function.</p>

<p>Finally, run:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='common-lisp'><span class='line'><span class="p">(</span><span class="nv">ql:add-to-init-file</span><span class="p">)</span>
</span></code></pre></td></tr></table></div></figure>


<p>That&#8217;ll add Quicklisp to your init file so that anytime you run SBCL Quicklisp
will be loaded and ready to go.</p>

<p>Now go ahead and read on <a href="http://www.quicklisp.org/">http://www.quicklisp.org/</a> about how to use it.
It&#8217;s very easy to search for and install Common Lisp libraries. For example,
to get ahold of &#8220;ieee-floats&#8221; for the <a href="http://www.mohiji.org/2011/01/s-expressions/">previous entry</a>, just run:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='common-lisp'><span class='line'><span class="p">(</span><span class="nv">ql:quickload</span> <span class="s">&quot;ieee-floats&quot;</span><span class="p">)</span>
</span></code></pre></td></tr></table></div></figure>


<p>That will download the library if it hasn&#8217;t already and load it into your CL
environment for you.</p>

<h2>Configure everything so that it plays nice together</h2>

<p>SBCL and Quicklisp are already playing nicely together at this point; you just
need to let Emacs know about them.</p>

<p>First in SBCL run:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='common-lisp'><span class='line'><span class="p">(</span><span class="nv">ql:quickload</span> <span class="s">&quot;quicklisp-slime-helper&quot;</span><span class="p">)</span>
</span></code></pre></td></tr></table></div></figure>


<p>This&#8217;ll install SLIME (<a href="http://common-lisp.net/project/slime/">http://common-lisp.net/project/slime/</a>) for you, an
awesome Common Lisp development environment. It should give you a line to add
to your <code>.emacs</code> configuration file:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class='common-lisp'><span class='line'><span class="nv">slime-helper.el</span> <span class="nv">installed</span> <span class="nv">in</span> <span class="s">&quot;/Users/jfischer/quicklisp/slime-helper.el&quot;</span>
</span><span class='line'>
</span><span class='line'><span class="nv">To</span> <span class="nv">use,</span> <span class="nv">add</span> <span class="nv">this</span> <span class="nv">to</span> <span class="nv">your</span> <span class="nv">~/.emacs:</span>
</span><span class='line'>
</span><span class='line'>    <span class="p">(</span><span class="nb">load</span> <span class="p">(</span><span class="nv">expand-file-name</span> <span class="s">&quot;~/quicklisp/slime-helper.el&quot;</span><span class="p">))</span>
</span></code></pre></td></tr></table></div></figure>


<p>You&#8217;ll need to both add that line and tell Emacs how to launch your Lisp
environment. To do that, add the following to <code>~/.emacs</code>:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class='common-lisp'><span class='line'><span class="p">(</span><span class="k">setq</span> <span class="nv">inferior-lisp-program</span> <span class="s">&quot;sbcl&quot;</span><span class="p">)</span>
</span><span class='line'><span class="p">(</span><span class="nb">load</span> <span class="p">(</span><span class="nv">expand-file-name</span> <span class="s">&quot;~/quicklisp/slime-helper.el&quot;</span><span class="p">))</span>
</span></code></pre></td></tr></table></div></figure>


<p>At this point, you should be ready to go. To try it all out, launch Emacs,
type Alt-x (Meta-x, technically), and type in &#8220;slime&#8221;. Hit enter and you
should find yourself at a CL-USER prompt within Emacs.</p>

<p>Now, actually learning to use SLIME is well beyond the scope of this entry.
For that, I recommend Peter Seibel&#8217;s <a href="http://www.gigamonkeys.com/book">Practical Common Lisp</a>. <a href="http://www.gigamonkeys.com/book/lather-rinse-repeat-a-tour-of-the-repl.html">Chapter
2</a> covers getting around both in Emacs and SLIME.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Getting going with modern Common Lisp on Mac OS X]]></title>
    <link href="http://www.mohiji.org/2011/01/modern-common-lisp-on-osx/"/>
    <updated>2011-01-31T15:04:08-08:00</updated>
    <id>http://www.mohiji.org/2011/01/modern-common-lisp-on-osx</id>
    <content type="html"><![CDATA[<p>Setting up for Common Lisp development on Mac OS X</p>

<p>High-level overview:</p>

<ul>
<li><p>Download and install SBCL (<a href="http://www.sbcl.org/">http://www.sbcl.org/</a>)</p></li>
<li><p>Download and install Aquamacs (<a href="http://aquamacs.org/">http://aquamacs.org/</a>)</p></li>
<li><p>Download and install Quicklisp (<a href="http://www.quicklisp.org/">http://www.quicklisp.org/</a>)i></p></li>
<li><p>Configure everything so that it plays nice together.</p></li>
</ul>


<!-- more -->


<h2>Download and install SBCL</h2>

<p>There are several good Common Lisp implementations on Mac OS X. I happen to
use SBCL because it worked better with <a href="http://code.google.com/p/lispbuilder/wiki/LispbuilderSDL">lispbuilder-sdl</a> last time I tried
it, so that&#8217;s the one I cover here. Clozure CL (<a href="http://ccl.clozure.com/">http://ccl.clozure.com/</a>)
is also very good.</p>

<p>Unfortunately, the SBCL maintainers don&#8217;t keep the pre-built Mac version up to
date, so getting the latest SBCL is a two-step process on Mac OS X. First, hit
SBCL&#8217;s <a href="http://www.sbcl.org/platform-table.html">download page</a> and download both the latest source (1.0.45 at the
time of writing) and the latest Mac binary (1.0.29). I&#8217;m using a 64-bit SBCL,
but 32-bit should work fine as well.</p>

<blockquote><p>Update: This has changed recently; the last several releases of SBCL have been
pre-built for Mac OS X, so you can just grab one of those.</p></blockquote>

<p>Now fire up Terminal, switch to where you downloaded SBCL, unpack and install
it:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>Solace:~ jfischer$ cd Downloads/
</span><span class='line'>Solace:Downloads jfischer$ tar xjf sbcl-1.0.29-x86-darwin-binary-r2.tar.bz2
</span><span class='line'>Solace:Downloads jfischer$ cd sbcl-1.0.29-x86-darwin
</span><span class='line'>Solace:sbcl-1.0.29-x86-darwin jfischer$ sudo sh install.sh</span></code></pre></td></tr></table></div></figure>


<p>That&#8217;ll install SBCL into <code>/usr/local/bin</code>. At this point you should be able to
run <code>sbcl</code> and get a Lisp prompt:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>Solace:sbcl-1.0.29-x86-darwin jfischer$ sbcl
</span><span class='line'>This is SBCL 1.0.29, an implementation of ANSI Common Lisp.
</span><span class='line'>More information about SBCL is available at &lt;http://www.sbcl.org/&gt;.
</span><span class='line'>SBCL is free software, provided as is, with absolutely no warranty.
</span><span class='line'>It is mostly in the public domain; some portions are provided under
</span><span class='line'>BSD-style licenses.  See the CREDITS and COPYING files in the
</span><span class='line'>distribution for more information.
</span><span class='line'>*</span></code></pre></td></tr></table></div></figure>


<p>Hit Control-D or type <code>(quit)</code> to exit.</p>

<p>Now you can run w/ that version, or if you want the latest/greatest you may
need to build it. (Note: you may need Apple&#8217;s developer tools installed for
this; I can&#8217;t remember.) Go back to your downloads directory and unpack the
source distribution:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>Solace:Downloads jfischer$ tar xjf sbcl-1.0.45-source.tar.bz2
</span><span class='line'>Solace:Downloads jfischer$ cd sbcl-1.0.45
</span><span class='line'>Solace:Downloads jfischer$ sh make.sh
</span><span class='line'>Solace:Downloads jfischer$ sudo sh install.sh</span></code></pre></td></tr></table></div></figure>


<p>Now you&#8217;ll have the latest and greatest SBCL installed.</p>

<h2>Download and install Aquamacs</h2>

<p>Aquamacs (<a href="http://aquamacs.org/">http://aquamacs.org/</a>) is an Emacs distribution customized to
run nicely on Mac OS X. It obeys all the normal Mac shortcut keys, prints
well, that sort of thing. <a href="http://aquamacs.org/download.shtml">Download it</a>, open it up and drag the
application to your Application directory as you would any other Mac app.</p>

<h2>Download and install Quicklisp</h2>

<p>Download Quicklisp from <a href="http://www.quicklisp.org/">http://www.quicklisp.org/</a>. (It&#8217;s in beta at the
time this was written, but it&#8217;s fully functional and awesome). Download the
install file (<a href="http://beta.quicklisp.org/quicklisp.lisp">http://beta.quicklisp.org/quicklisp.lisp</a> at the time of
writing) and save it to disk somewhere easy to find.</p>

<p>Next, run sbcl and type in the following:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='common-lisp'><span class='line'><span class="p">(</span><span class="nb">load</span> <span class="s">&quot;/path/to/quicklisp.lisp&quot;</span><span class="p">)</span>
</span></code></pre></td></tr></table></div></figure>


<p>After it loads, run:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='common-lisp'><span class='line'><span class="p">(</span><span class="nv">quicklisp-quickstart:install</span><span class="p">)</span>
</span></code></pre></td></tr></table></div></figure>


<p>That&#8217;ll download the rest of the system and get it set up for you. Quicklisp
will install by default in <code>~/quicklisp</code>; you can change that by passing <code>:path
"/target/path/"</code> to the install function.</p>

<p>Finally, run:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='common-lisp'><span class='line'><span class="p">(</span><span class="nv">ql:add-to-init-file</span><span class="p">)</span>
</span></code></pre></td></tr></table></div></figure>


<p>That&#8217;ll add Quicklisp to your init file so that anytime you run SBCL Quicklisp
will be loaded and ready to go.</p>

<p>Now go ahead and read on <a href="http://www.quicklisp.org/">http://www.quicklisp.org/</a> about how to use it.
It&#8217;s very easy to search for and install Common Lisp libraries. For example,
to get ahold of &#8220;ieee-floats&#8221; for the <a href="http://www.mohiji.org/2011/01/s-expressions/">previous entry</a>, just run:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='common-lisp'><span class='line'><span class="p">(</span><span class="nv">ql:quickload</span> <span class="s">&quot;ieee-floats&quot;</span><span class="p">)</span>
</span></code></pre></td></tr></table></div></figure>


<p>That will download the library if it hasn&#8217;t already and load it into your CL
environment for you.</p>

<h2>Configure everything so that it plays nice together</h2>

<p>SBCL and Quicklisp are already playing nicely together at this point; you just
need to let Aquamacs know about them.</p>

<p>First in SBCL run:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='common-lisp'><span class='line'><span class="p">(</span><span class="nv">ql:quickload</span> <span class="s">&quot;quicklisp-slime-helper&quot;</span><span class="p">)</span>
</span></code></pre></td></tr></table></div></figure>


<p>This&#8217;ll install SLIME (<a href="http://common-lisp.net/project/slime/">http://common-lisp.net/project/slime/</a>) for you,
an awesome Common Lisp development environment. It should give you a line to
add to your <code>.emacs</code> configuration file:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class='common-lisp'><span class='line'><span class="nv">slime-helper.el</span> <span class="nv">installed</span> <span class="nv">in</span> <span class="s">&quot;/Users/jfischer/quicklisp/slime-helper.el&quot;</span>
</span><span class='line'>
</span><span class='line'><span class="nv">To</span> <span class="nv">use,</span> <span class="nv">add</span> <span class="nv">this</span> <span class="nv">to</span> <span class="nv">your</span> <span class="nv">~/.emacs:</span>
</span><span class='line'>
</span><span class='line'>    <span class="p">(</span><span class="nb">load</span> <span class="p">(</span><span class="nv">expand-file-name</span> <span class="s">&quot;~/quicklisp/slime-helper.el&quot;</span><span class="p">))</span>
</span></code></pre></td></tr></table></div></figure>


<p>Aquamacs will use <code>.emacs</code>, but they recommend keeping your configuration in
<code>~/Library/Preferences/Aquamacs Emacs/Preferences.el</code>. Either will work. You&#8217;ll
need to both tell Aquamacs how to start your Lisp environment and add the
above line to tell it how to find SLIME. To do that, add the following to your
<code>Preferences.el</code>:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class='common-lisp'><span class='line'><span class="p">(</span><span class="k">setq</span> <span class="nv">inferior-lisp-program</span> <span class="s">&quot;sbcl&quot;</span><span class="p">)</span>
</span><span class='line'><span class="p">(</span><span class="nb">load</span> <span class="p">(</span><span class="nv">expand-file-name</span> <span class="s">&quot;~/quicklisp/slime-helper.el&quot;</span><span class="p">))</span>
</span></code></pre></td></tr></table></div></figure>


<p>At this point, you should be ready to go. To try it all out, launch Emacs,
type Alt-x (Meta-x, technically), and type in &#8220;slime&#8221;. Hit enter and you
should find yourself at a CL-USER prompt within Emacs.</p>

<p>Now, actually learning to use SLIME is well beyond the scope of this entry.
For that, I recommend Peter Seibel&#8217;s <a href="http://www.gigamonkeys.com/book">Practical Common Lisp</a>. <a href="http://www.gigamonkeys.com/book/lather-rinse-repeat-a-tour-of-the-repl.html">Chapter
2</a> covers getting around both in Emacs and SLIME.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Getting going with modern Common Lisp on Windows]]></title>
    <link href="http://www.mohiji.org/2011/01/modern-common-lisp-on-windows/"/>
    <updated>2011-01-31T14:13:16-08:00</updated>
    <id>http://www.mohiji.org/2011/01/modern-common-lisp-on-windows</id>
    <content type="html"><![CDATA[<p>The high-level outline for this is:</p>

<ul>
<li><p>Download and install CLISP (<a href="http://clisp.cons.org/">http://clisp.cons.org/</a>)</p></li>
<li><p>Download and install Emacs (<a href="http://www.gnu.org/software/emacs/">http://www.gnu.org/software/emacs/</a>)</p></li>
<li><p>Download and install Quicklisp (<a href="http://www.quicklisp.org/">http://www.quicklisp.org/</a>)</p></li>
<li><p>Configure everything so that it plays nice together.</p></li>
</ul>


<!-- more -->


<h2>Download and install CLISP</h2>

<p>Download <a href="http://clisp.cons/org/">CLISP</a> from Sourceforge here:
<a href="http://sourceforge.net/projects/clisp/files/clisp/2.48/">http://sourceforge.net/projects/clisp/files/clisp/2.48/</a>.</p>

<blockquote><p>Note: the latest version (at the time of writing) is 2.49, but it reportedly has problems with
Windows paths and I&#8217;m having trouble getting it to load SLIME properly, so for
now I&#8217;m recommending 2.48.</p></blockquote>

<p>You want <code>clisp-2.48-win32-mingw-big.exe</code>. (The &#8220;big&#8221; download is only 1.1 MiB
larger and includes a larger pre-built library). Run the installer, and feel
free to choose the defaults. CLISP will end up being installed at <code>C:\Program
Files\clisp-2.48</code>, and it will add that directory to your PATH (which is
important later).</p>

<p>Unfortunately, there&#8217;s a bug in the 2.48 installer. You&#8217;ll need to copy a file
into the right place to launch 2.48 successfully. Open up Explorer and browse
to <code>C:\Program Files\clisp-2.48</code> (or wherever you installed it.)</p>

<p>In the <code>clisp-2.48</code> directory there&#8217;ll be another directory named <code>libsvm</code>; copy
<code>svm.dll</code> out of that directory and place it in <code>clisp-2.48\full</code>.</p>

<p>Once that&#8217;s done there&#8217;s a CLISP link in your Start Menu; you should be able
to run it and see the following:</p>

<p><a href="http://www.mohiji.org/uploads/lisp-windows/clisp-win32.png"><img class="center" src="http://www.mohiji.org/uploads/lisp-windows/clisp-win32.png" title="'CLISP running on Windows 7'" ></a></p>

<p>To quit just hit Control-D or type in <code>(quit)</code> and hit enter.</p>

<h2>Download and install Emacs</h2>

<p>Pre-built binaries for the latest Emacs are available at
<a href="http://ntemacs.sourceforge.net/">http://ntemacs.sourceforge.net/</a>. You can download the latest CVS binary,
or you can go back to the last stable release. The latest CVS is probably fine
though.</p>

<p>Unforunately they&#8217;re only offering .7z files at the moment, so you&#8217;ll probably
need to grab 7zip (<a href="http://www.7zip.org/">http://www.7zip.org/</a>) as well if you don&#8217;t have it
already.</p>

<p>Extract the ntemacs file wherever you&#8217;d like it installed (<code>C:\Program Files</code>
works fine). In <code>ntemacs24/bin</code> you&#8217;ll see a file named <code>runemacs.exe</code>; make a
shortcut to that someplace handy (Desktop, Start Menu, etc.). Go ahead and run
it to make sure it loads; you&#8217;ll need it in a moment.</p>

<h2>Download and install Quicklisp</h2>

<p>Download Quicklisp from <a href="http://www.quicklisp.org/">http://www.quicklisp.org/</a>. (It&#8217;s in beta at the
time this was written, but it&#8217;s fully functional and awesome). Download the
install file (<a href="http://beta.quicklisp.org/quicklisp.lisp">http://beta.quicklisp.org/quicklisp.lisp</a> at the time of
writing) and save it to disk somewhere easy to find.</p>

<p>Next, run CLISP and type in the following:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='common-lisp'><span class='line'><span class="p">(</span><span class="nb">load</span> <span class="s">&quot;C:/path/to/quicklisp.lisp&quot;</span><span class="p">)</span>
</span></code></pre></td></tr></table></div></figure>


<p>Notice that you&#8217;ll need to use forward slashes instead of Windows normal
backslashes. (Or if you want you can use <code>\\</code>).</p>

<p>After it loads, run:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='common-lisp'><span class='line'><span class="p">(</span><span class="nv">quicklisp-quickstart:install</span> <span class="ss">:path</span> <span class="s">&quot;C:\\quicklisp\\&quot;</span><span class="p">)</span>
</span></code></pre></td></tr></table></div></figure>


<blockquote><p>Note: By default Quicklisp tries to install in <code>$HOME/quicklisp</code>. It tries to
figure out where that is by running <code>(user-homedir-pathname)</code>, which as far as I
can tell relies on $HOME being set properly. Unfortunately, Windows (version 7
at least) sets up $HOME differently depending on how you ran the program. If
you run CLISP on the command line, $HOME won&#8217;t be set at all so it&#8217;ll use
$USERPROFILE instead. If you run it from Emacs (as we will be later), $HOME
<em>will</em> be set and you&#8217;ll get a different directory ($APPDATA). All in all,
it&#8217;s arg-inspiring.</p>

<p>Long story short, we&#8217;re installing it in a known location. (<code>C:\quicklisp</code>).
That&#8217;s why we&#8217;re passing a path above. The trailing \ is important; don&#8217;t
leave that off.</p></blockquote>

<p>That&#8217;ll download the rest of the system and get it set up for you.</p>

<p>Now go ahead and read on <a href="http://www.quicklisp.org/">http://www.quicklisp.org/</a> about how to use it.
It&#8217;s very easy to search for and install Common Lisp libraries. For example,
to get ahold of &#8220;ieee-floats&#8221; for the <a href="http://www.mohiji.org/2011/01/s-expressions/">previous entry</a>, just run:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='common-lisp'><span class='line'><span class="p">(</span><span class="nv">ql:quickload</span> <span class="s">&quot;ieee-floats&quot;</span><span class="p">)</span>
</span></code></pre></td></tr></table></div></figure>


<p>That will download the library if it hasn&#8217;t already and load it into your CL
environment for you.</p>

<h2>Configure everything so that it plays nice together</h2>

<p>First, CLISP is going to need some configuration to find temporary directories
properly. Not sure why, but SLIME (the IDE we&#8217;ll be setting up in Emacs) will
barf complainining about the temporary directory if we don&#8217;t do this.</p>

<p>Open up <code>$HOME\.clisprc.lisp</code> (e.g.
<code>C:\Users\username\AppData\Roaming\.clisprc.lisp</code>. Ain&#8217;t Windows grand?) in a
text editor. (Emacs, for example:)). Add the following:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
</pre></td><td class='code'><pre><code class='common-lisp'><span class='line'><span class="c1">;;; Load Quicklisp when CLISP launches</span>
</span><span class='line'><span class="o">#-</span><span class="nv">quicklisp</span>
</span><span class='line'><span class="p">(</span><span class="k">let</span> <span class="p">((</span><span class="nv">quicklisp-init</span> <span class="s">&quot;C:\\quicklisp\\setup.lisp&quot;</span><span class="p">))</span>
</span><span class='line'>  <span class="p">(</span><span class="nb">when</span> <span class="p">(</span><span class="nb">probe-file</span> <span class="nv">quicklisp-init</span><span class="p">)</span>
</span><span class='line'>    <span class="p">(</span><span class="nb">load</span> <span class="nv">quicklisp-init</span><span class="p">)))</span>
</span><span class='line'>
</span><span class='line'><span class="c1">;;; Fix for CLISP on Windows.</span>
</span><span class='line'><span class="p">(</span><span class="nb">setf</span> <span class="nv">temporary-file-directory</span> <span class="s">&quot;C:\\&lt;home-directory&gt;\\AppData\\Local\\Temp&quot;</span><span class="p">)</span>
</span><span class='line'><span class="p">(</span><span class="nb">setf</span> <span class="p">(</span><span class="nv">ext:getenv</span> <span class="s">&quot;temp&quot;</span><span class="p">)</span> <span class="nv">temporary-file-directory</span><span class="p">)</span>
</span><span class='line'><span class="p">(</span><span class="nb">setf</span> <span class="p">(</span><span class="nv">ext:getenv</span> <span class="s">&quot;tmp&quot;</span><span class="p">)</span> <span class="nv">temporary-file-directory</span><span class="p">)</span>
</span></code></pre></td></tr></table></div></figure>


<p>Replacing <code>&lt;home-directory&gt;</code> with your home directory. (e.g. <code>C:/Users/whomever</code>).
This should work for Windows Vista and 7, on Windows XP use <code>C:\&lt;home-directory&gt;\AppData\Temp</code>. Go ahead and save that file; you should be done
with it now.</p>

<p>Next, run CLISP again and enter the following:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='common-lisp'><span class='line'><span class="p">(</span><span class="nv">ql:quickload</span> <span class="s">&quot;quicklisp-slime-helper&quot;</span><span class="p">)</span>
</span></code></pre></td></tr></table></div></figure>


<p>This&#8217;ll install SLIME (<a href="http://common-lisp.net/project/slime/">http://common-lisp.net/project/slime/</a>) for you,
an awesome Common Lisp development environment.</p>

<p>Last, open up your Emacs configuration file. The easiest way to find this is
to just launch Emacs and type in Ctrl-x, Ctrl-f and enter <code>~/.emacs</code> in the
prompt at the bottom of the window.</p>

<p>In that file, add the following lines:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class='common-lisp'><span class='line'><span class="p">(</span><span class="k">setq</span> <span class="nv">inferior-lisp-program</span> <span class="s">&quot;clisp.exe&quot;</span><span class="p">)</span>
</span><span class='line'><span class="p">(</span><span class="nb">load</span> <span class="s">&quot;C:\\quicklisp\\slime-helper.el&quot;</span><span class="p">)</span>
</span></code></pre></td></tr></table></div></figure>


<p>At this point, you should be ready to go. To try it all out, launch Emacs,
type Alt-x (Meta-x, technically), and type in &#8220;slime&#8221;. Hit enter and you
should find yourself at a CL-USER prompt within Emacs.</p>

<p>Now, actually learning to use SLIME is well beyond the scope of this entry.
For that, I recommend Peter Seibel&#8217;s Practical Common Lisp
(<a href="http://www.gigamonkeys.com/book">http://www.gigamonkeys.com/book</a>). <a href="http://www.gigamonkeys.com/book/lather-rinse-repeat-a-tour-of-the-repl.html">Chapter 2</a> covers getting around
both in Emacs and SLIME. (It talks about Lisp in a Box, which is sadly
unmaintained at this point, hence this blog post).</p>

<p>Really, if you&#8217;re at all interested in learning Common Lisp then PCL is an
excellent resource, and I suggest you buy a copy. I&#8217;ve just about worn mine
out. :)</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[S-expressions for fun and profit.]]></title>
    <link href="http://www.mohiji.org/2011/01/s-expressions/"/>
    <updated>2011-01-26T23:14:54-08:00</updated>
    <id>http://www.mohiji.org/2011/01/s-expressions</id>
    <content type="html"><![CDATA[<p>So I&#8217;m making a turn-based tactics game (think Tactics Ogre, Final Fantasy
Tactics, Disgaea, etc.). I need a way to build levels, but I have neither the
artistic talent to work in a modelling program or the time to really build
myself a level editor.</p>

<p>Since I&#8217;m still in the prototyping/flesh out stage, my level needs are pretty
simple. The goal I&#8217;m shooting for is easier to show than to tell, so take a
look:</p>

<p><a href="http://www.mohiji.org/uploads/s-expressions/example.png"><img class="center" src="http://www.mohiji.org/uploads/s-expressions/example.png" title="'Map Example'" ></a></p>

<p>That&#8217;s the basic level I&#8217;m shooting for at this point. Basically a chessboard
with differing heights. It&#8217;s inspired by <a href="http://www.lostgarden.com/2007/05/dancs-miraculously-flexible-game.html">Danc&#8217;s Miraculously Flexible
Prototyping Tiles</a>. So think Legos, or Minecraft.</p>

<p>I want an easy way to specify this, in just a text file. So what pieces of
information do I need at this point?</p>

<ul>
<li><p>Dimensions of the board (width/height in squares)</p></li>
<li><p>Heights at any given place</p></li>
<li><p>And because I&#8217;m incapable of running with just blank squares, what sort of
texture to use on each block</p></li>
</ul>


<!-- more -->


<p>And because I want to make things pretty:</p>

<ul>
<li><p>Background texture</p></li>
<li><p>Light color/direction</p></li>
</ul>


<p>I&#8217;ll need to add more in the future (object placement, unit starting
locations, etc), but that&#8217;s enough to get going. Let&#8217;s take a first pass at a
text format for this:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>dimensions 12 12
</span><span class='line'>num-layers 2
</span><span class='line'>background "cloudy-sky.png"
</span><span class='line'>light-color #D1AE4D
</span><span class='line'>light-direction -0.1212 -0.4848 0.4848
</span><span class='line'>
</span><span class='line'>layer 2 2 2 2 2 2 2 2 2 2
</span><span class='line'>      2 2 2 2 2 2 2 2 2 2
</span><span class='line'>      2 2 2 6 6 2 2 2 2 2
</span><span class='line'>      2 2 2 6 6 2 2 2 2 2
</span><span class='line'>      2 2 2 6 6 6 2 2 2 2
</span><span class='line'>      2 2 2 2 6 6 2 2 2 2
</span><span class='line'>      2 2 2 2 2 2 2 2 2 2
</span><span class='line'>      2 2 2 2 2 2 2 2 2 2
</span><span class='line'>      2 2 2 2 2 2 2 2 2 2
</span><span class='line'>      2 2 2 2 2 2 2 2 2 2
</span><span class='line'>
</span><span class='line'>layer 3 5 5 3 3 3 3 3 3 3
</span><span class='line'>      3 5 5 3 3 3 3 3 3 3
</span><span class='line'>      3 5 5 0 0 3 3 3 3 3
</span><span class='line'>      3 5 5 0 0 3 3 3 3 3 
</span><span class='line'>      3 5 5 0 0 0 3 3 3 3
</span><span class='line'>      3 5 5 3 0 0 3 3 3 3
</span><span class='line'>      3 5 5 3 3 3 3 3 3 3
</span><span class='line'>      3 5 5 3 3 3 3 3 3 3
</span><span class='line'>      3 5 5 3 3 3 3 3 3 3
</span><span class='line'>      3 5 5 3 3 3 3 3 3 3</span></code></pre></td></tr></table></div></figure>


<p>Most of those fields are self explanatory. Dimensions are just width and
height, light-color is a HTML/CSS style color specifier, the direction is a 3
component vector.</p>

<p>Remember, the level is structured like a collection of legos that all happen
to be a uniform size, so we can consider it as a set of flat layers. There are
2 layers in this map, hence num-layers.</p>

<p>Finally, the layer fields give you the actual block layouts. Each number
corresponds to a block type in the game code, with 0 representing an empty
space. (If you&#8217;re curious, 2 is dirt, 3 is grass, 5 is stone and 6 is water).
There will be (width * height) numbers following each layer command.</p>

<p>It&#8217;s simple and relatively easy to type in by hand. But damn, that means I
have to write a parser. I hate writing text parsers. But I have an idea! Let&#8217;s
try massaging that text format into something a little more structured:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
</pre></td><td class='code'><pre><code class='common-lisp'><span class='line'><span class="p">(</span><span class="nv">define-map</span>
</span><span class='line'> <span class="p">(</span><span class="nv">name</span> <span class="s">&quot;The Blocky River&quot;</span><span class="p">)</span>
</span><span class='line'> <span class="p">(</span><span class="nv">background</span> <span class="s">&quot;cloudy-sky.png&quot;</span><span class="p">)</span>
</span><span class='line'> <span class="p">(</span><span class="nv">light-color</span> <span class="mi">209</span> <span class="mi">174</span> <span class="mi">77</span><span class="p">)</span>
</span><span class='line'> <span class="p">(</span><span class="nv">light-direction</span> <span class="mf">-0.1212</span> <span class="mf">-0.4848</span> <span class="mf">0.4848</span><span class="p">)</span>
</span><span class='line'>
</span><span class='line'> <span class="p">(</span><span class="nv">dimensions</span> <span class="mi">10</span> <span class="mi">10</span><span class="p">)</span>
</span><span class='line'> <span class="p">(</span><span class="nv">layer</span> <span class="mi">2</span> <span class="mi">2</span> <span class="mi">2</span> <span class="mi">2</span> <span class="mi">2</span> <span class="mi">2</span> <span class="mi">2</span> <span class="mi">2</span> <span class="mi">2</span> <span class="mi">2</span>
</span><span class='line'>        <span class="mi">2</span> <span class="mi">2</span> <span class="mi">2</span> <span class="mi">2</span> <span class="mi">2</span> <span class="mi">2</span> <span class="mi">2</span> <span class="mi">2</span> <span class="mi">2</span> <span class="mi">2</span>
</span><span class='line'>        <span class="mi">2</span> <span class="mi">2</span> <span class="mi">2</span> <span class="mi">6</span> <span class="mi">6</span> <span class="mi">2</span> <span class="mi">2</span> <span class="mi">2</span> <span class="mi">2</span> <span class="mi">2</span>
</span><span class='line'>        <span class="mi">2</span> <span class="mi">2</span> <span class="mi">2</span> <span class="mi">6</span> <span class="mi">6</span> <span class="mi">2</span> <span class="mi">2</span> <span class="mi">2</span> <span class="mi">2</span> <span class="mi">2</span>
</span><span class='line'>        <span class="mi">2</span> <span class="mi">2</span> <span class="mi">2</span> <span class="mi">6</span> <span class="mi">6</span> <span class="mi">6</span> <span class="mi">2</span> <span class="mi">2</span> <span class="mi">2</span> <span class="mi">2</span>
</span><span class='line'>        <span class="mi">2</span> <span class="mi">2</span> <span class="mi">2</span> <span class="mi">2</span> <span class="mi">6</span> <span class="mi">6</span> <span class="mi">2</span> <span class="mi">2</span> <span class="mi">2</span> <span class="mi">2</span>
</span><span class='line'>        <span class="mi">2</span> <span class="mi">2</span> <span class="mi">2</span> <span class="mi">2</span> <span class="mi">2</span> <span class="mi">2</span> <span class="mi">2</span> <span class="mi">2</span> <span class="mi">2</span> <span class="mi">2</span>
</span><span class='line'>        <span class="mi">2</span> <span class="mi">2</span> <span class="mi">2</span> <span class="mi">2</span> <span class="mi">2</span> <span class="mi">2</span> <span class="mi">2</span> <span class="mi">2</span> <span class="mi">2</span> <span class="mi">2</span>
</span><span class='line'>        <span class="mi">2</span> <span class="mi">2</span> <span class="mi">2</span> <span class="mi">2</span> <span class="mi">2</span> <span class="mi">2</span> <span class="mi">2</span> <span class="mi">2</span> <span class="mi">2</span> <span class="mi">2</span>
</span><span class='line'>        <span class="mi">2</span> <span class="mi">2</span> <span class="mi">2</span> <span class="mi">2</span> <span class="mi">2</span> <span class="mi">2</span> <span class="mi">2</span> <span class="mi">2</span> <span class="mi">2</span> <span class="mi">2</span><span class="p">)</span>
</span><span class='line'>
</span><span class='line'> <span class="p">(</span><span class="nv">layer</span> <span class="mi">3</span> <span class="mi">5</span> <span class="mi">5</span> <span class="mi">3</span> <span class="mi">3</span> <span class="mi">3</span> <span class="mi">3</span> <span class="mi">3</span> <span class="mi">3</span> <span class="mi">3</span>
</span><span class='line'>        <span class="mi">3</span> <span class="mi">5</span> <span class="mi">5</span> <span class="mi">3</span> <span class="mi">3</span> <span class="mi">3</span> <span class="mi">3</span> <span class="mi">3</span> <span class="mi">3</span> <span class="mi">3</span>
</span><span class='line'>        <span class="mi">3</span> <span class="mi">5</span> <span class="mi">5</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">3</span> <span class="mi">3</span> <span class="mi">3</span> <span class="mi">3</span> <span class="mi">3</span>
</span><span class='line'>        <span class="mi">3</span> <span class="mi">5</span> <span class="mi">5</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">3</span> <span class="mi">3</span> <span class="mi">3</span> <span class="mi">3</span> <span class="mi">3</span>
</span><span class='line'>        <span class="mi">3</span> <span class="mi">5</span> <span class="mi">5</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">3</span> <span class="mi">3</span> <span class="mi">3</span> <span class="mi">3</span>
</span><span class='line'>        <span class="mi">3</span> <span class="mi">5</span> <span class="mi">5</span> <span class="mi">3</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">3</span> <span class="mi">3</span> <span class="mi">3</span> <span class="mi">3</span>
</span><span class='line'>        <span class="mi">3</span> <span class="mi">5</span> <span class="mi">5</span> <span class="mi">3</span> <span class="mi">3</span> <span class="mi">3</span> <span class="mi">3</span> <span class="mi">3</span> <span class="mi">3</span> <span class="mi">3</span>
</span><span class='line'>        <span class="mi">3</span> <span class="mi">5</span> <span class="mi">5</span> <span class="mi">3</span> <span class="mi">3</span> <span class="mi">3</span> <span class="mi">3</span> <span class="mi">3</span> <span class="mi">3</span> <span class="mi">3</span>
</span><span class='line'>        <span class="mi">3</span> <span class="mi">5</span> <span class="mi">5</span> <span class="mi">3</span> <span class="mi">3</span> <span class="mi">3</span> <span class="mi">3</span> <span class="mi">3</span> <span class="mi">3</span> <span class="mi">3</span>
</span><span class='line'>        <span class="mi">3</span> <span class="mi">5</span> <span class="mi">5</span> <span class="mi">3</span> <span class="mi">3</span> <span class="mi">3</span> <span class="mi">3</span> <span class="mi">3</span> <span class="mi">3</span> <span class="mi">3</span><span class="p">))</span>
</span></code></pre></td></tr></table></div></figure>


<p>That is an s-expression (<a href="http://en.wikipedia.org/wiki/S-expression">http://en.wikipedia.org/wiki/S-expression</a>). They
happen to be super easy to parse and are probably best known as the syntax of
the Lisp family of languages. But I still don&#8217;t want to write a parser.</p>

<p>Instead, I&#8217;m going to fire up a Common Lisp environment and let that handle
parsing it:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
</pre></td><td class='code'><pre><code class='common-lisp'><span class='line'><span class="nv">CL-USER&gt;</span> <span class="p">(</span><span class="nb">with-open-file</span> <span class="p">(</span><span class="nv">f</span> <span class="s">&quot;/Users/jfischer/Desktop/map-sexp.txt&quot;</span><span class="p">)</span>
</span><span class='line'>           <span class="p">(</span><span class="nb">read</span> <span class="nv">f</span><span class="p">))</span>
</span><span class='line'><span class="p">(</span><span class="nv">MAP</span> <span class="p">(</span><span class="nv">NAME</span> <span class="s">&quot;The Blocky River&quot;</span><span class="p">)</span> <span class="p">(</span><span class="nv">BACKGROUND</span> <span class="s">&quot;cloudy-sky.png&quot;</span><span class="p">)</span>
</span><span class='line'>     <span class="p">(</span><span class="nv">LIGHT-COLOR</span> <span class="s">&quot;#d1ae4d&quot;</span><span class="p">)</span> <span class="p">(</span><span class="nv">LIGHT-DIRECTION</span> <span class="mf">-0.1212</span> <span class="mf">-0.4848</span> <span class="mf">0.4848</span><span class="p">)</span>
</span><span class='line'>     <span class="p">(</span><span class="nv">LAYER</span> <span class="mi">2</span> <span class="mi">2</span> <span class="mi">2</span> <span class="mi">2</span> <span class="mi">2</span> <span class="mi">2</span> <span class="mi">2</span> <span class="mi">2</span> <span class="mi">2</span> <span class="mi">2</span> <span class="mi">2</span> <span class="mi">2</span> <span class="mi">2</span> <span class="mi">2</span> <span class="mi">2</span> <span class="mi">2</span> <span class="mi">2</span> <span class="mi">2</span> <span class="mi">2</span> <span class="mi">2</span> <span class="mi">2</span> <span class="mi">2</span> <span class="mi">2</span> <span class="mi">6</span> <span class="mi">6</span> <span class="mi">2</span> <span class="mi">2</span> <span class="mi">2</span> <span class="mi">2</span> <span class="mi">2</span> <span class="mi">2</span> <span class="mi">2</span> <span class="mi">2</span> <span class="mi">6</span>
</span><span class='line'>      <span class="mi">6</span> <span class="mi">2</span> <span class="mi">2</span> <span class="mi">2</span> <span class="mi">2</span> <span class="mi">2</span> <span class="mi">2</span> <span class="mi">2</span> <span class="mi">2</span> <span class="mi">6</span> <span class="mi">6</span> <span class="mi">6</span> <span class="mi">2</span> <span class="mi">2</span> <span class="mi">2</span> <span class="mi">2</span> <span class="mi">2</span> <span class="mi">2</span> <span class="mi">2</span> <span class="mi">2</span> <span class="mi">6</span> <span class="mi">6</span> <span class="mi">2</span> <span class="mi">2</span> <span class="mi">2</span> <span class="mi">2</span> <span class="mi">2</span> <span class="mi">2</span> <span class="mi">2</span> <span class="mi">2</span> <span class="mi">2</span> <span class="mi">2</span> <span class="mi">2</span> <span class="mi">2</span> <span class="mi">2</span> <span class="mi">2</span> <span class="mi">2</span>
</span><span class='line'>      <span class="mi">2</span> <span class="mi">2</span> <span class="mi">2</span> <span class="mi">2</span> <span class="mi">2</span> <span class="mi">2</span> <span class="mi">2</span> <span class="mi">2</span> <span class="mi">2</span> <span class="mi">2</span> <span class="mi">2</span> <span class="mi">2</span> <span class="mi">2</span> <span class="mi">2</span> <span class="mi">2</span> <span class="mi">2</span> <span class="mi">2</span> <span class="mi">2</span> <span class="mi">2</span> <span class="mi">2</span> <span class="mi">2</span> <span class="mi">2</span> <span class="mi">2</span> <span class="mi">2</span> <span class="mi">2</span> <span class="mi">2</span> <span class="mi">2</span> <span class="mi">2</span> <span class="mi">2</span><span class="p">)</span>
</span><span class='line'>     <span class="p">(</span><span class="nv">LAYER</span> <span class="mi">3</span> <span class="mi">5</span> <span class="mi">5</span> <span class="mi">3</span> <span class="mi">3</span> <span class="mi">3</span> <span class="mi">3</span> <span class="mi">3</span> <span class="mi">3</span> <span class="mi">3</span> <span class="mi">3</span> <span class="mi">5</span> <span class="mi">5</span> <span class="mi">3</span> <span class="mi">3</span> <span class="mi">3</span> <span class="mi">3</span> <span class="mi">3</span> <span class="mi">3</span> <span class="mi">3</span> <span class="mi">3</span> <span class="mi">5</span> <span class="mi">5</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">3</span> <span class="mi">3</span> <span class="mi">3</span> <span class="mi">3</span> <span class="mi">3</span> <span class="mi">3</span> <span class="mi">5</span> <span class="mi">5</span> <span class="mi">0</span>
</span><span class='line'>      <span class="mi">0</span> <span class="mi">3</span> <span class="mi">3</span> <span class="mi">3</span> <span class="mi">3</span> <span class="mi">3</span> <span class="mi">3</span> <span class="mi">5</span> <span class="mi">5</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">3</span> <span class="mi">3</span> <span class="mi">3</span> <span class="mi">3</span> <span class="mi">3</span> <span class="mi">5</span> <span class="mi">5</span> <span class="mi">3</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">3</span> <span class="mi">3</span> <span class="mi">3</span> <span class="mi">3</span> <span class="mi">3</span> <span class="mi">5</span> <span class="mi">5</span> <span class="mi">3</span> <span class="mi">3</span> <span class="mi">3</span> <span class="mi">3</span> <span class="mi">3</span> <span class="mi">3</span> <span class="mi">3</span> <span class="mi">3</span>
</span><span class='line'>      <span class="mi">5</span> <span class="mi">5</span> <span class="mi">3</span> <span class="mi">3</span> <span class="mi">3</span> <span class="mi">3</span> <span class="mi">3</span> <span class="mi">3</span> <span class="mi">3</span> <span class="mi">3</span> <span class="mi">5</span> <span class="mi">5</span> <span class="mi">3</span> <span class="mi">3</span> <span class="mi">3</span> <span class="mi">3</span> <span class="mi">3</span> <span class="mi">3</span> <span class="mi">3</span> <span class="mi">3</span> <span class="mi">5</span> <span class="mi">5</span> <span class="mi">3</span> <span class="mi">3</span> <span class="mi">3</span> <span class="mi">3</span> <span class="mi">3</span> <span class="mi">3</span> <span class="mi">3</span><span class="p">))</span>
</span></code></pre></td></tr></table></div></figure>


<p>Now easy as that, instead of a text file I have a data structure that I can
pull apart and use to define the level.</p>

<p>First, let&#8217;s make a basic container class to hold the information, and a quick
function to take the list (s-expression) above and turn it into an instance of
that container class.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
</pre></td><td class='code'><pre><code class='common-lisp'><span class='line'><span class="c1">;; Helper structure to hold the data.  Not really necessary, but it makes</span>
</span><span class='line'><span class="c1">;; the rest of the code cleaner</span>
</span><span class='line'><span class="p">(</span><span class="nb">defclass</span> <span class="nv">blockmap</span> <span class="p">()</span>
</span><span class='line'>  <span class="p">((</span><span class="nv">name</span>        <span class="ss">:accessor</span> <span class="nv">map-name</span><span class="p">)</span>
</span><span class='line'>   <span class="p">(</span><span class="nv">background</span>  <span class="ss">:accessor</span> <span class="nv">map-background</span><span class="p">)</span>
</span><span class='line'>   <span class="p">(</span><span class="nv">light-color</span> <span class="ss">:accessor</span> <span class="nv">map-light-color</span><span class="p">)</span>
</span><span class='line'>   <span class="p">(</span><span class="nv">light-dir</span>   <span class="ss">:accessor</span> <span class="nv">map-light-dir</span><span class="p">)</span>
</span><span class='line'>   <span class="p">(</span><span class="nv">width</span>       <span class="ss">:accessor</span> <span class="nv">map-width</span><span class="p">)</span>
</span><span class='line'>   <span class="p">(</span><span class="nv">height</span>      <span class="ss">:accessor</span> <span class="nv">map-height</span><span class="p">)</span>
</span><span class='line'>   <span class="p">(</span><span class="nv">layers</span>      <span class="ss">:accessor</span> <span class="nv">map-layers</span> <span class="ss">:initform</span> <span class="p">(</span><span class="nb">list</span><span class="p">))))</span>
</span><span class='line'>
</span><span class='line'><span class="c1">;; Parse a list of the above form out into a blockmap class</span>
</span><span class='line'><span class="p">(</span><span class="nb">defun</span> <span class="nv">parse-blockmap-list</span> <span class="p">(</span><span class="nv">l</span><span class="p">)</span>
</span><span class='line'>  <span class="p">(</span><span class="k">let</span> <span class="p">((</span><span class="nb">map</span>    <span class="p">(</span><span class="nb">make-instance</span> <span class="ss">&#39;blockmap</span><span class="p">))</span>
</span><span class='line'>        <span class="p">(</span><span class="nv">fields</span> <span class="p">(</span><span class="nb">cdr</span> <span class="nv">l</span><span class="p">)))</span>
</span><span class='line'>    <span class="p">(</span><span class="nb">loop</span> <span class="nv">for</span> <span class="nv">item</span> <span class="nv">in</span> <span class="nv">fields</span> <span class="nb">do</span>
</span><span class='line'>         <span class="p">(</span><span class="k">let</span> <span class="p">((</span><span class="nv">key</span> <span class="p">(</span><span class="nb">first</span> <span class="nv">item</span><span class="p">))</span>
</span><span class='line'>               <span class="p">(</span><span class="nv">value</span> <span class="p">(</span><span class="nb">second</span> <span class="nv">item</span><span class="p">)))</span>
</span><span class='line'>           <span class="c1">;; This is pretty much just a switch statement.  The format</span>
</span><span class='line'>           <span class="c1">;; has each field as a list with the first value being the</span>
</span><span class='line'>           <span class="c1">;; field name/type.</span>
</span><span class='line'>           <span class="p">(</span><span class="nb">cond</span> <span class="p">((</span><span class="nb">eq</span> <span class="nv">key</span> <span class="ss">&#39;name</span><span class="p">)</span>
</span><span class='line'>                  <span class="p">(</span><span class="nb">setf</span> <span class="p">(</span><span class="nv">map-name</span> <span class="nb">map</span><span class="p">)</span> <span class="nv">value</span><span class="p">))</span>
</span><span class='line'>                 <span class="p">((</span><span class="nb">eq</span> <span class="nv">key</span> <span class="ss">&#39;background</span><span class="p">)</span>
</span><span class='line'>                  <span class="p">(</span><span class="nb">setf</span> <span class="p">(</span><span class="nv">map-background</span> <span class="nb">map</span><span class="p">)</span> <span class="nv">value</span><span class="p">))</span>
</span><span class='line'>                 <span class="p">((</span><span class="nb">eq</span> <span class="nv">key</span> <span class="ss">&#39;light-color</span><span class="p">)</span>
</span><span class='line'>                  <span class="p">(</span><span class="nb">setf</span> <span class="p">(</span><span class="nv">map-light-color</span> <span class="nb">map</span><span class="p">)</span> <span class="p">(</span><span class="nb">cdr</span> <span class="nv">item</span><span class="p">)))</span>
</span><span class='line'>                 <span class="p">((</span><span class="nb">eq</span> <span class="nv">key</span> <span class="ss">&#39;light-direction</span><span class="p">)</span>
</span><span class='line'>                  <span class="p">(</span><span class="nb">setf</span> <span class="p">(</span><span class="nv">map-light-dir</span> <span class="nb">map</span><span class="p">)</span> <span class="p">(</span><span class="nb">cdr</span> <span class="nv">item</span><span class="p">)))</span>
</span><span class='line'>                 <span class="p">((</span><span class="nb">eq</span> <span class="nv">key</span> <span class="ss">&#39;dimensions</span><span class="p">)</span>
</span><span class='line'>                  <span class="p">(</span><span class="nb">setf</span> <span class="p">(</span><span class="nv">map-width</span> <span class="nb">map</span><span class="p">)</span> <span class="p">(</span><span class="nb">first</span> <span class="p">(</span><span class="nb">cdr</span> <span class="nv">item</span><span class="p">)))</span>
</span><span class='line'>                  <span class="p">(</span><span class="nb">setf</span> <span class="p">(</span><span class="nv">map-height</span> <span class="nb">map</span><span class="p">)</span> <span class="p">(</span><span class="nb">second</span> <span class="p">(</span><span class="nb">cdr</span> <span class="nv">item</span><span class="p">))))</span>
</span><span class='line'>                 <span class="p">((</span><span class="nb">eq</span> <span class="nv">key</span> <span class="ss">&#39;layer</span><span class="p">)</span>
</span><span class='line'>                  <span class="p">(</span><span class="nb">push</span> <span class="p">(</span><span class="nb">cdr</span> <span class="nv">item</span><span class="p">)</span> <span class="p">(</span><span class="nv">map-layers</span> <span class="nb">map</span><span class="p">)))</span>
</span><span class='line'>                 <span class="p">(</span><span class="no">t</span>
</span><span class='line'>                  <span class="p">(</span><span class="nb">format</span> <span class="no">t</span> <span class="s">&quot;Unknown key ~a~%&quot;</span> <span class="nv">key</span><span class="p">)))))</span>
</span><span class='line'>    <span class="nb">map</span><span class="p">))</span>
</span></code></pre></td></tr></table></div></figure>


<p>Now to load a file and turn it into a blockmap object we do:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
</pre></td><td class='code'><pre><code class='common-lisp'><span class='line'><span class="nv">CL-USER&gt;</span> <span class="p">(</span><span class="nb">defvar</span> <span class="nv">my-blockmap</span> <span class="p">(</span><span class="nb">with-open-file</span> <span class="p">(</span><span class="nv">f</span> <span class="s">&quot;/Users/jfischer/Desktop/map-sexp.txt&quot;</span><span class="p">)</span>
</span><span class='line'>                             <span class="p">(</span><span class="nv">parse-blockmap-list</span> <span class="p">(</span><span class="nb">read</span> <span class="nv">f</span><span class="p">))))</span>
</span><span class='line'><span class="err">#</span><span class="nv">&lt;BLOCKMAP</span> <span class="nv">{1003290E21}&gt;</span>
</span><span class='line'><span class="nv">CL-USER&gt;</span> <span class="p">(</span><span class="nv">map-name</span> <span class="nv">my-blockmap</span><span class="p">)</span>
</span><span class='line'><span class="s">&quot;The Blocky River&quot;</span>
</span><span class='line'><span class="nv">CL-USER&gt;</span> <span class="p">(</span><span class="nb">length</span> <span class="p">(</span><span class="nv">map-layers</span> <span class="nv">my-blockmap</span><span class="p">))</span>
</span><span class='line'><span class="mi">2</span>
</span><span class='line'><span class="nv">CL-USER&gt;</span> <span class="p">(</span><span class="nv">map-layers</span> <span class="nv">my-blockmap</span><span class="p">)</span>
</span><span class='line'><span class="p">((</span><span class="mi">3</span> <span class="mi">5</span> <span class="mi">5</span> <span class="mi">3</span> <span class="mi">3</span> <span class="mi">3</span> <span class="mi">3</span> <span class="mi">3</span> <span class="mi">3</span> <span class="mi">3</span> <span class="mi">3</span> <span class="mi">5</span> <span class="mi">5</span> <span class="mi">3</span> <span class="mi">3</span> <span class="mi">3</span> <span class="mi">3</span> <span class="mi">3</span> <span class="mi">3</span> <span class="mi">3</span> <span class="mi">3</span> <span class="mi">5</span> <span class="mi">5</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">3</span> <span class="mi">3</span> <span class="mi">3</span> <span class="mi">3</span> <span class="mi">3</span> <span class="mi">3</span> <span class="mi">5</span> <span class="mi">5</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">3</span> <span class="mi">3</span> <span class="mi">3</span> <span class="mi">3</span>
</span><span class='line'>  <span class="mi">3</span> <span class="mi">3</span> <span class="mi">5</span> <span class="mi">5</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">3</span> <span class="mi">3</span> <span class="mi">3</span> <span class="mi">3</span> <span class="mi">3</span> <span class="mi">5</span> <span class="mi">5</span> <span class="mi">3</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">3</span> <span class="mi">3</span> <span class="mi">3</span> <span class="mi">3</span> <span class="mi">3</span> <span class="mi">5</span> <span class="mi">5</span> <span class="mi">3</span> <span class="mi">3</span> <span class="mi">3</span> <span class="mi">3</span> <span class="mi">3</span> <span class="mi">3</span> <span class="mi">3</span> <span class="mi">3</span> <span class="mi">5</span> <span class="mi">5</span> <span class="mi">3</span> <span class="mi">3</span> <span class="mi">3</span> <span class="mi">3</span> <span class="mi">3</span>
</span><span class='line'>  <span class="mi">3</span> <span class="mi">3</span> <span class="mi">3</span> <span class="mi">5</span> <span class="mi">5</span> <span class="mi">3</span> <span class="mi">3</span> <span class="mi">3</span> <span class="mi">3</span> <span class="mi">3</span> <span class="mi">3</span> <span class="mi">3</span> <span class="mi">3</span> <span class="mi">5</span> <span class="mi">5</span> <span class="mi">3</span> <span class="mi">3</span> <span class="mi">3</span> <span class="mi">3</span> <span class="mi">3</span> <span class="mi">3</span> <span class="mi">3</span><span class="p">)</span>
</span><span class='line'> <span class="p">(</span><span class="mi">2</span> <span class="mi">2</span> <span class="mi">2</span> <span class="mi">2</span> <span class="mi">2</span> <span class="mi">2</span> <span class="mi">2</span> <span class="mi">2</span> <span class="mi">2</span> <span class="mi">2</span> <span class="mi">2</span> <span class="mi">2</span> <span class="mi">2</span> <span class="mi">2</span> <span class="mi">2</span> <span class="mi">2</span> <span class="mi">2</span> <span class="mi">2</span> <span class="mi">2</span> <span class="mi">2</span> <span class="mi">2</span> <span class="mi">2</span> <span class="mi">2</span> <span class="mi">6</span> <span class="mi">6</span> <span class="mi">2</span> <span class="mi">2</span> <span class="mi">2</span> <span class="mi">2</span> <span class="mi">2</span> <span class="mi">2</span> <span class="mi">2</span> <span class="mi">2</span> <span class="mi">6</span> <span class="mi">6</span> <span class="mi">2</span> <span class="mi">2</span> <span class="mi">2</span> <span class="mi">2</span>
</span><span class='line'>  <span class="mi">2</span> <span class="mi">2</span> <span class="mi">2</span> <span class="mi">2</span> <span class="mi">6</span> <span class="mi">6</span> <span class="mi">6</span> <span class="mi">2</span> <span class="mi">2</span> <span class="mi">2</span> <span class="mi">2</span> <span class="mi">2</span> <span class="mi">2</span> <span class="mi">2</span> <span class="mi">2</span> <span class="mi">6</span> <span class="mi">6</span> <span class="mi">2</span> <span class="mi">2</span> <span class="mi">2</span> <span class="mi">2</span> <span class="mi">2</span> <span class="mi">2</span> <span class="mi">2</span> <span class="mi">2</span> <span class="mi">2</span> <span class="mi">2</span> <span class="mi">2</span> <span class="mi">2</span> <span class="mi">2</span> <span class="mi">2</span> <span class="mi">2</span> <span class="mi">2</span> <span class="mi">2</span> <span class="mi">2</span> <span class="mi">2</span> <span class="mi">2</span> <span class="mi">2</span> <span class="mi">2</span>
</span><span class='line'>  <span class="mi">2</span> <span class="mi">2</span> <span class="mi">2</span> <span class="mi">2</span> <span class="mi">2</span> <span class="mi">2</span> <span class="mi">2</span> <span class="mi">2</span> <span class="mi">2</span> <span class="mi">2</span> <span class="mi">2</span> <span class="mi">2</span> <span class="mi">2</span> <span class="mi">2</span> <span class="mi">2</span> <span class="mi">2</span> <span class="mi">2</span> <span class="mi">2</span> <span class="mi">2</span> <span class="mi">2</span> <span class="mi">2</span> <span class="mi">2</span><span class="p">))</span>
</span></code></pre></td></tr></table></div></figure>


<p>Sweet, now all that&#8217;s left is to make it easily available to C. We could
probably just write out .c files, but generating the proper syntax for that
sounds tedious, so I&#8217;m just going to write out a binary format that we can
load easily. Something like:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
</pre></td><td class='code'><pre><code class='c'><span class='line'><span class="k">struct</span> <span class="n">BlockMapFile</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>    <span class="kt">uint8_t</span>  <span class="n">magic</span><span class="p">;</span>              <span class="c1">// Identify the file type</span>
</span><span class='line'>    <span class="kt">uint8_t</span>  <span class="n">version</span><span class="p">;</span>            <span class="c1">// Cause you know you&#39;ll need it</span>
</span><span class='line'>    <span class="kt">char</span>     <span class="n">title</span><span class="p">[</span><span class="mi">256</span><span class="p">];</span>         <span class="c1">// Fixed length strings make life happy</span>
</span><span class='line'>    <span class="kt">char</span>     <span class="n">background</span><span class="p">[</span><span class="mi">256</span><span class="p">];</span>
</span><span class='line'>    <span class="kt">uint32_t</span> <span class="n">light_color</span><span class="p">;</span>        <span class="c1">// ARGB light color ready to drop into OpenGL</span>
</span><span class='line'>    <span class="kt">float</span>    <span class="n">light_direction</span><span class="p">[</span><span class="mi">3</span><span class="p">];</span> <span class="c1">// 32-bit floats written out as uint32s;</span>
</span><span class='line'>    <span class="kt">uint8_t</span>  <span class="n">num_layers</span><span class="p">;</span>         <span class="c1">// Dimensions of the layers</span>
</span><span class='line'>    <span class="kt">uint8_t</span>  <span class="n">width</span><span class="p">;</span>
</span><span class='line'>    <span class="kt">uint8_t</span>  <span class="n">height</span><span class="p">;</span>
</span><span class='line'>    <span class="kt">uint8_t</span>  <span class="n">layers</span><span class="p">[</span><span class="mi">1</span><span class="p">];</span>          <span class="c1">// num_layers * width * height entries</span>
</span><span class='line'><span class="p">};</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// NOTE: Depending on the compiler you may need to worry about structure</span>
</span><span class='line'><span class="c1">// field alignment.  For GCC, add __attribute__((packed)) to the end</span>
</span><span class='line'><span class="c1">// of the above structure definition.</span>
</span></code></pre></td></tr></table></div></figure>


<p>That can be loaded in one shot with a simple <code>fread()</code> or <code>[NSData
dataWithContentsOfFile:];</code>. From there, just verify that the magic/version is
good and you&#8217;re good to go.</p>

<p>To write that out from Common Lisp, we&#8217;ll need to pull in an extra library to
deal with encoding floating point values. I use <a href="http://marijnhaverbeke.nl/">Marijn Haverbeke&#8217;s</a> <a href="http://common-lisp.net/project/ieee-floats/">ieee-
floats</a>. With that, the code to write out a binary block map file looks
like this:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
</pre></td><td class='code'><pre><code class='common-lisp'><span class='line'><span class="p">(</span><span class="nb">defparameter</span> <span class="vg">*blockmap-magic*</span> <span class="mi">123</span><span class="p">)</span>
</span><span class='line'><span class="p">(</span><span class="nb">defparameter</span> <span class="vg">*blockmap-version*</span> <span class="mi">1</span><span class="p">)</span>
</span><span class='line'>
</span><span class='line'><span class="c1">;; Take a blockmap object and write it out to a file.</span>
</span><span class='line'><span class="p">(</span><span class="nb">defun</span> <span class="nv">write-blockmap</span> <span class="p">(</span><span class="nb">map</span> <span class="nv">filename</span><span class="p">)</span>
</span><span class='line'>  <span class="p">(</span><span class="nb">with-open-file</span> <span class="p">(</span><span class="nv">f</span> <span class="nv">filename</span>
</span><span class='line'>                     <span class="ss">:direction</span> <span class="ss">:output</span>
</span><span class='line'>                     <span class="ss">:element-type</span> <span class="o">&#39;</span><span class="p">(</span><span class="kt">unsigned-byte</span> <span class="mi">8</span><span class="p">)</span>
</span><span class='line'>                     <span class="ss">:if-exists</span> <span class="ss">:supersede</span><span class="p">)</span>
</span><span class='line'>    <span class="c1">;; Write out the header</span>
</span><span class='line'>    <span class="p">(</span><span class="nb">write-byte</span> <span class="vg">*blockmap-magic*</span> <span class="nv">f</span><span class="p">)</span>
</span><span class='line'>    <span class="p">(</span><span class="nb">write-byte</span> <span class="vg">*blockmap-version*</span> <span class="nv">f</span><span class="p">)</span>
</span><span class='line'>
</span><span class='line'>    <span class="c1">;; Then the title and background strings</span>
</span><span class='line'>    <span class="p">(</span><span class="nb">write-sequence</span> <span class="p">(</span><span class="nv">make-c-string</span> <span class="p">(</span><span class="nv">map-name</span> <span class="nb">map</span><span class="p">))</span> <span class="nv">f</span><span class="p">)</span>
</span><span class='line'>    <span class="p">(</span><span class="nb">write-sequence</span> <span class="p">(</span><span class="nv">make-c-string</span> <span class="p">(</span><span class="nv">map-background</span> <span class="nb">map</span><span class="p">))</span> <span class="nv">f</span><span class="p">)</span>
</span><span class='line'>
</span><span class='line'>    <span class="c1">;; Light color</span>
</span><span class='line'>    <span class="p">(</span><span class="nv">write-int32</span> <span class="p">(</span><span class="nv">make-argb</span> <span class="p">(</span><span class="nv">map-light-color</span> <span class="nb">map</span><span class="p">))</span> <span class="nv">f</span><span class="p">)</span>
</span><span class='line'>
</span><span class='line'>    <span class="c1">;; Light direction</span>
</span><span class='line'>    <span class="p">(</span><span class="nv">write-int32</span> <span class="p">(</span><span class="nv">ieee-floats:encode-float32</span> <span class="p">(</span><span class="nb">first</span> <span class="p">(</span><span class="nv">map-light-dir</span> <span class="nb">map</span><span class="p">)))</span> <span class="nv">f</span><span class="p">)</span>
</span><span class='line'>    <span class="p">(</span><span class="nv">write-int32</span> <span class="p">(</span><span class="nv">ieee-floats:encode-float32</span> <span class="p">(</span><span class="nb">second</span> <span class="p">(</span><span class="nv">map-light-dir</span> <span class="nb">map</span><span class="p">)))</span> <span class="nv">f</span><span class="p">)</span>
</span><span class='line'>    <span class="p">(</span><span class="nv">write-int32</span> <span class="p">(</span><span class="nv">ieee-floats:encode-float32</span> <span class="p">(</span><span class="nb">third</span> <span class="p">(</span><span class="nv">map-light-dir</span> <span class="nb">map</span><span class="p">)))</span> <span class="nv">f</span><span class="p">)</span>
</span><span class='line'>
</span><span class='line'>    <span class="c1">;; Layer information</span>
</span><span class='line'>    <span class="p">(</span><span class="nb">write-byte</span> <span class="p">(</span><span class="nb">length</span> <span class="p">(</span><span class="nv">map-layers</span> <span class="nb">map</span><span class="p">))</span> <span class="nv">f</span><span class="p">)</span>
</span><span class='line'>    <span class="p">(</span><span class="nb">write-byte</span> <span class="p">(</span><span class="nv">map-width</span> <span class="nb">map</span><span class="p">)</span> <span class="nv">f</span><span class="p">)</span>
</span><span class='line'>    <span class="p">(</span><span class="nb">write-byte</span> <span class="p">(</span><span class="nv">map-height</span> <span class="nb">map</span><span class="p">)</span> <span class="nv">f</span><span class="p">)</span>
</span><span class='line'>
</span><span class='line'>    <span class="c1">;; And the layers themselves</span>
</span><span class='line'>    <span class="p">(</span><span class="nb">loop</span> <span class="nv">for</span> <span class="nv">layer</span> <span class="nv">in</span> <span class="p">(</span><span class="nv">map-layers</span> <span class="nb">map</span><span class="p">)</span> <span class="nb">do</span>
</span><span class='line'>         <span class="p">(</span><span class="k">let</span> <span class="p">((</span><span class="nv">data</span> <span class="p">(</span><span class="nb">make-array</span> <span class="p">(</span><span class="nb">*</span> <span class="p">(</span><span class="nv">map-width</span> <span class="nb">map</span><span class="p">)</span> <span class="p">(</span><span class="nv">map-height</span> <span class="nb">map</span><span class="p">))</span>
</span><span class='line'>                                 <span class="ss">:element-type</span> <span class="o">&#39;</span><span class="p">(</span><span class="kt">unsigned-byte</span> <span class="mi">8</span><span class="p">)</span>
</span><span class='line'>                                 <span class="ss">:initial-contents</span>
</span></code></pre></td></tr></table></div></figure>


<p>I&#8217;ve left out some helper functions (<code>make-c-string</code>, <code>write-int32</code> and <code>make-argb</code>); they&#8217;re in the source package linked below. But really, that&#8217;s all
there is to it.</p>

<p>So technically yes, I wrote a parser. But the language did all the hard work
for me; I just took the data it provided and chucked it into a binary file.
And importantly, it&#8217;s extremely easy to add/remove fields from this.</p>

<hr />

<p>Source Code: <a href="http://www.mohiji.org/uploads/s-expressions/s-expressions.zip">s-expressions.zip</a></p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[New Model Viewer]]></title>
    <link href="http://www.mohiji.org/2007/03/new-model-viewer/"/>
    <updated>2007-03-23T14:35:00-07:00</updated>
    <id>http://www.mohiji.org/2007/03/new-model-viewer</id>
    <content type="html"><![CDATA[<p>New version of the silly-little Egoboo Model Viewer. Now animating the models,
allowing you to rotate them with the mouse, and sporting a readable font.</p>

<p><a href="http://www.mohiji.org/files/ModelViewer.zip">ModelViewer.zip</a></p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Egoboo 2.3.6 for Mac OS X]]></title>
    <link href="http://www.mohiji.org/2007/03/egoboo-2-3-6-for-mac-os-x/"/>
    <updated>2007-03-19T14:59:00-07:00</updated>
    <id>http://www.mohiji.org/2007/03/egoboo-2-3-6-for-mac-os-x</id>
    <content type="html"><![CDATA[<p>I don&#8217;t know if there&#8217;s anyone out there besides me who wants to play Egoboo
on Mac OS X, but who cares? I want it, so I&#8217;m building it, and here it is. :)</p>

<p>If you have an existing Egoboo installation, you&#8217;re going to want this file:
<a href="http://www.mohiji.org/files/egoboo-osx-r68.dmg">egoboo-osx-r68.dmg</a>. Just follow the directions in the included readme
file.</p>

<p>If you want the new Egoboo 2.3.6 and you haven&#8217;t already downloaded it yet,
grab the full thing here: <a href="http://www.mohiji.org/files/egoboo-osx-2.3.6.dmg">egoboo-osx-2.3.6.dmg</a>. Just open up that
package, copy the folder inside it onto your hard drive somewhere (it can&#8217;t
run within the package), and run Egoboo!</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Egoboo 2.3.6]]></title>
    <link href="http://www.mohiji.org/2007/03/egoboo-2-3-6/"/>
    <updated>2007-03-19T09:36:00-07:00</updated>
    <id>http://www.mohiji.org/2007/03/egoboo-2-3-6</id>
    <content type="html"><![CDATA[<p>Egoboo 2.3.6 has been released! I don&#8217;t say it enough, but Zefz and the guys
on the Egoboo Resurrection project are doing some great work. For the first
time in years, there&#8217;s honest new content to play. That&#8217;s one of the big
things that was missing in Zippy.</p>

<p>I&#8217;m also stoked as this release is using my Egoboo 2.x codebase. Brings a tear
to my eye. :)</p>

<p>To get your copy, go here: <a href="http://home.no.net/egoboo">http://home.no.net/egoboo</a></p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Java]]></title>
    <link href="http://www.mohiji.org/2007/01/java/"/>
    <updated>2007-01-18T12:00:00-08:00</updated>
    <id>http://www.mohiji.org/2007/01/java</id>
    <content type="html"><![CDATA[<p>I&#8217;m playing around with Java a bit, mostly because I&#8217;ve been in a rut coding-
wise and want to shake things up a bit. I&#8217;ll probably be posting about it more
in the future, but I just wanted to stick a few brief thoughts up.</p>

<ul>
<li><p>Garbage Collection Good. It&#8217;s nice to not have to worry about things like
ownership and null pointers. Combined with weak references, caching resources
becomes clean and easy.</p></li>
<li><p><a href="http://lwjgl.org/">LWJGL</a> is pretty cool.</p></li>
<li><p>From what I&#8217;ve been able to determine, performance is fine for a hobby
game. It&#8217;s not like I&#8217;m going to try and keep up with mainstream graphics.</p></li>
<li><p>Having things like java.util.Properties built-in is just a huge time-
saver.</p></li>
<li><p>If you&#8217;re interested in doing the Java game thing, <a href="http://cokeandcode.com/">cokeandcode.com</a> is
a great resource.</p></li>
</ul>


<p>More later.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Two To Go]]></title>
    <link href="http://www.mohiji.org/2006/10/two-to-go/"/>
    <updated>2006-10-11T20:23:00-07:00</updated>
    <id>http://www.mohiji.org/2006/10/two-to-go</id>
    <content type="html"><![CDATA[<p>Two full days yet till the wedding, and I&#8217;m quite excited.</p>

<!--more-->


<p>On a superficial and selfish level, it means an end to all the planning (which
Jackie&#8217;s been doing most of), the errands, the worrying about budgets, all the
build-up, all the questions, hopefully all of the useless and unfunny advice.
It means a vacation, which I&#8217;m in sore need of. It means we can finally clear
our apartment of all the decorations and pictures and floor mats and other
things that we need for the day of the wedding. It means a night in an awesome
hotel in Coronado, and 8 nights in awesome hotels in Hawaii. It means a day of
ATV-ing on the big island, a luau, kayaking &amp; snorkeling with the dolphins.</p>

<p>It means a release, and a hell of a lot of fun.</p>

<p>It means a lot more than that though. I first met Jackie at Danielle&#8217;s
father&#8217;s funeral; just in passing, no real interaction. I remember her looking
elegant in black, and having to trade off babysitting a puppy that&#8217;d been
brought for some odd reason. After that, I full well forgot about her, and met
her again six months later at my sister&#8217;s place. She&#8217;d moved in with Danielle,
and Becky invited them and I to her place to hang out, have dinner, go
swimming. I mostly remember being distracted by her posterior that evening;
her shorts were just a smidge too short.</p>

<p>I saw Jackie a few times over the next several months, and on a whim one night
Rob, Jocelyn and I decided to grab a bunch of people to go ice skating, and
called Jackie and Danielle to join us. Ice skating became a regular thing,
then hanging out at Rob&#8217;s place, having a few drinks, meeting up for dinner,
the normal stuff friends do. We were always proper; Jackie and I never saw
each other outside of that group of people, but I think everyone saw where it
was heading.</p>

<p>Yes Karen, Jackie had a good bit to do with our breakup, but she wasn&#8217;t the
only reason. A relationship over e-mail and IM wasn&#8217;t fair to either of us,
and though I regret being such a coward about breaking it off with you, I&#8217;m
completely convinced it was the right choice.</p>

<p>Jackie and I have been together since April 23rd, 2001. I can&#8217;t remember our
first date, really, because by the time we were officially together we were
completely comfortable with each other. I remember going to Ruth&#8217;s Chris
steakhouse for my birthday, I remember Rob hitting a possum on the way home
(the poor thing). I remember double dates with Rob and Jocelyn (Sammy&#8217;s!). I
remember meeting her best friends for the first time in Mission Valley. (Was
it at Chevy&#8217;s?)</p>

<p>I remember her sitting with me when dad passed away, holding me while I bawled
like a baby. I don&#8217;t know how I would&#8217;ve made it through those months without
her.</p>

<p>Jackie and I have been together for five and a half years now, and while I
won&#8217;t presume to speak for her; I&#8217;ve never felt as.. complete, or content as I
have in these years. I love her with all of my heart; with everything I have
inside me. I will love her for as long as I live.</p>

<p>Not everything is all rosy and perfect, of course. We both have our bad days,
and bad moods to go with. I&#8217;m given to laziness, so she has to nag me on
occasion. We fight, but we&#8217;re so close in temperament that the fights have
never been out of control. And for all that people tell us marriage is hard,
that things change: so what? If it were easy, we wouldn&#8217;t cherish it, wouldn&#8217;t
value it.</p>

<blockquote><p>Really, the difficulties involved - the missteps we make along the way - are<br/>what make it interesting.</p><footer><strong>Neal Stephenson</strong><cite>The Diamond Age</cite></footer></blockquote>


<p>I love her, and she loves me, and whatever else may come; whatever trials,
setbacks, failures, successes, windfalls, jaguar attacks, earthquakes,
apocalypses, floods, surprises, babies, kittens, etc., we&#8217;ll make it. We&#8217;ll be
together for the rest of our lives.</p>

<p>And Saturday, we&#8217;ll pledge it formally in front of all the people we love.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Computer Science Books, or the Lack Thereof]]></title>
    <link href="http://www.mohiji.org/2006/06/computer-science-books-or-the-lack-thereof/"/>
    <updated>2006-06-06T20:25:00-07:00</updated>
    <id>http://www.mohiji.org/2006/06/computer-science-books-or-the-lack-thereof</id>
    <content type="html"><![CDATA[<p>Why is it that you can&#8217;t walk into a computer store like Fry&#8217;s, or a big
bookstore like Barnes and Noble or Borders and find a decent collection of
Computer Science books? I browse through these stores, and I see dozens of
books on &#8220;Learning Java&#8221; or &#8220;C++ by example&#8221; or &#8220;XML is the new God&#8221; or other
such things, but these are all languages and APIs. MySQL, PHP, Python, these
are all worthy subjects, but these aren&#8217;t Computer Science books; they&#8217;re
coding books.</p>

<p>I want to see books on Data Structures. I want discussions of the various
algorithms for implementing a self-balancing binary tree. I know every modern
language out there has a library that will do it for you, but that&#8217;s not what
I want. I want to learn, to grow. When I&#8217;m writing an app for something sure,
I&#8217;ll use the built-in, but when I&#8217;m programming for myself I want to try the
complicated stuff. The Design Pattern books are part of the way there, but
they don&#8217;t cover the meaty stuff.</p>

<p>Specifically, I&#8217;m currently looking for a good book on the design and
implementation of compilers (e.g. the Dragon Book). I could just order one
online, but I like being able to go flip through a book before I drop money on
it. Call me old-fashioned.</p>

<p>Maybe I should just try a library. (The brick and mortar kind.)</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[C++ Abuse]]></title>
    <link href="http://www.mohiji.org/2006/05/c-abuse/"/>
    <updated>2006-05-08T06:50:00-07:00</updated>
    <id>http://www.mohiji.org/2006/05/c-abuse</id>
    <content type="html"><![CDATA[<p>I&#8217;m reading through <a href="http://www.amazon.com/gp/product/1592000908/">MUD Game Programming</a> by Ron Penton. I found it at
Fry&#8217;s for $16.99, so I&#8217;m hoping it will be worth it at least for the
discussions on network code (he only covers Telnet, as it&#8217;s for MUDs, but
adapting to other protocols isn&#8217;t hard) and the fact that this book actually
goes into management of the actual game, rather than just backend stuff.</p>

<p>Most of the books I&#8217;ve bought cover all kinds of info about how to write the
various bits of a game engine, but they leave you with bits and not all that
clear of an idea how they all get put together. Couple that with me being
unable to ignore perfectionist tendencies and you&#8217;ll have a good idea of why I
take awhile to get very far in my personal projects. :) This book is cool
because it focuses on something so simple: your average MUD is text based; the
most complicated part is handling the bits that go over the network. That
leaves Mr. Penton plenty of time to discuss how it all works together.</p>

<p>He has enough room that he writes two full MUD engines; the first very simple
and similiar to older-style game. It&#8217;s mostly hard-coded so any real changes
require access to the codebase. His second engine is a great deal more
flexible, and includes Python bindings and all that jazz.</p>

<p>So for $16.99, I&#8217;m stoked. It&#8217;s a good book. However, I would ask anyone who
might be interested in reading it to have a firm grasp of how C++ works and
what you can, can&#8217;t, should, or should not do in it, because Mr. Penton abuses
the language in a number of ways.</p>

<p>First up, can anyone explain why you would do this:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
</pre></td><td class='code'><pre><code class='c++'><span class='line'><span class="k">class</span> <span class="nc">MyClass</span> <span class="p">{</span>
</span><span class='line'><span class="k">public</span><span class="o">:</span>
</span><span class='line'>    <span class="kt">int</span><span class="o">&amp;</span> <span class="n">MyVariable</span><span class="p">()</span> <span class="p">{</span> <span class="k">return</span> <span class="n">m_myVariable</span><span class="p">;</span> <span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="k">private</span><span class="o">:</span>
</span><span class='line'>    <span class="kt">int</span> <span class="n">m_myVariable</span><span class="p">;</span>
</span><span class='line'><span class="p">};</span>
</span></code></pre></td></tr></table></div></figure>


<p>Rather than just:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
</pre></td><td class='code'><pre><code class='c++'><span class='line'><span class="k">class</span> <span class="nc">MyClass</span> <span class="p">{</span>
</span><span class='line'><span class="k">public</span><span class="o">:</span>
</span><span class='line'>  <span class="kt">int</span> <span class="n">m_myVariable</span><span class="p">;</span> 
</span><span class='line'><span class="p">};</span>
</span></code></pre></td></tr></table></div></figure>


<p>With the first variant, you have to call MyClass::MyVariable() to get access
to the variable, but it returns a reference, so you can do things like:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class='c++'><span class='line'><span class="n">MyClass</span> <span class="n">m</span><span class="p">;</span>
</span><span class='line'><span class="n">m</span><span class="p">.</span><span class="n">MyVariable</span><span class="p">()</span> <span class="o">=</span> <span class="mi">14</span><span class="p">;</span>
</span></code></pre></td></tr></table></div></figure>


<p>What is the point in having the variable private in the first place?
It is no longer protected from getting modified in bad ways, and you&#8217;re still
exposing that implementation detail to the world. If you want a variable to be
accessible to everyone, just make the darn thing public. If you don&#8217;t want it
to be, use get/set functions. It&#8217;s much clearer what you&#8217;re trying to do, and
you have more flexibility down the line to evolve the interface further.</p>

<p>Along the lines of accessor functions, Jonathan Blow makes some very good
points in his &#8220;Implicit vs Explicit Software Engineering Costs&#8221; rant here:
<a href="http://number-none.com/blow/rants.html">http://number-none.com/blow/rants.html</a>. I personally tend to use accessor
functions when I want to either 1) validate things before I set them, or 2)
allow read-only access to variables. If it doesn&#8217;t fit in either category, it
goes public.</p>

<p>Second nitpick on MUD Game Programming is C pre-processor abuse. Mr. Penton
defines a couple macros that look like this:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
</pre></td><td class='code'><pre><code class='c++'><span class='line'><span class="cp">#ifdef WIN32</span>
</span><span class='line'><span class="n">WSADATA</span> <span class="n">g_wsadata</span><span class="p">;</span>
</span><span class='line'><span class="cp">#define StartSocketLib WSAStartup( MAKEWORD(2, 2), &amp;g_wsadata);</span>
</span><span class='line'><span class="cp">#define CloseSocketLib WSACleanup();</span>
</span><span class='line'><span class="cp">#else</span>
</span><span class='line'><span class="cp">#define StartSocketLib {}</span>
</span><span class='line'><span class="cp">#define CloseSocketLib {}</span>
</span><span class='line'><span class="cp">#endif</span>
</span></code></pre></td></tr></table></div></figure>


<p>And then uses them in the code lookin&#8217; something like this:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class='c++'><span class='line'><span class="kt">void</span> <span class="n">main</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>  <span class="n">StartSocketLib</span><span class="p">;</span>
</span><span class='line'>  <span class="c1">// do networky stuff</span>
</span><span class='line'>  <span class="n">CloseSocketLib</span><span class="p">;</span>   
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>I&#8217;m reading through the example code and see something like &#8220;StartSocketLib;&#8221;
on it&#8217;s own in a line of C++ and my brain halts. It&#8217;s not immediately obvious
what that statement does: it should do absolutely nothing. Any variable or
function placed like that evaluates to a NOP. I understand completely hiding
OS-dependant details behind some pre-processor magic, but if you&#8217;re going to
do that at least make the macro look like valid code.</p>

<p>Anyway, I bought the book for the ideas within it, and they&#8217;re worth what I
spent on it, but the code drives me nuts, so it&#8217;s been slower going than I&#8217;d
like it to be.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[C++ Annoyances]]></title>
    <link href="http://www.mohiji.org/2006/05/c-annoyances/"/>
    <updated>2006-05-03T07:29:00-07:00</updated>
    <id>http://www.mohiji.org/2006/05/c-annoyances</id>
    <content type="html"><![CDATA[<p>Just one C++ annoyance actually. Having the ability to create an object on the
stack complicates memory management a bit. I&#8217;ve got all my objects derived
from this base class that provides reference counting for memory management.
So I&#8217;ve got this decision now: should an initially created object have 0 or 1
references? I&#8217;m of the opinion that it should have one, because something
obviously created it, so it&#8217;s holding a reference to it.</p>

<p>For debugging and safety&#8217;s sake, I throw an assert in the base class&#8217;
destructor that will fire if the object is freed with any references left.
Nice for debugging, but it doesn&#8217;t work if I create a base-derived object on
the stack. If I do, it&#8217;ll be created with one reference and be automatically
destroyed as soon as the function ends, firing off the assert. I can&#8217;t just
call release() on the object, &#8216;cause release() will try and free the object
because its ref-count will drop to 0, but it can&#8217;t do that for an object
created on the stack.</p>

<p>I like Objective-C and Java&#8217;s approach here better: you can&#8217;t create an object
on the stack. You have to explicity allocate the thing, no magic.</p>

<p>I prefer Objective-C over C++ in general, but the lack of good tools outside
of OS X have been keeping me from using it. I&#8217;m addicted to Visual Studio. :)</p>

<p>As an aside, I do understand that being able to create objects on the stack in
C++ is what makes Resource Acquisition As Initialization (did I get that
right?) work, but that&#8217;s really just a workaround for not having garbage
collection anyway. Not that Objective-C has garbage collection (natively), but
the omnipresent reference counting and autorelease pools do a good job of
hiding it.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Happy Birthday Dad]]></title>
    <link href="http://www.mohiji.org/2006/04/happy-birthday-dad-2/"/>
    <updated>2006-04-24T10:59:00-07:00</updated>
    <id>http://www.mohiji.org/2006/04/happy-birthday-dad-2</id>
    <content type="html"><![CDATA[<p>You should&#8217;ve been 54 years old today. Not really that old, life being the way
it is nowadays. You&#8217;d probably have spent the day working on your truck, or
your store, as you had the last 30+ years. It&#8217;s Monday, so we would&#8217;ve
celebrated last night; a small family barbeque, grilling up some steaks, maybe
corn and potatoes to go with. You&#8217;d have had a few beers; Becky and Daniel and
maybe Shawn too. Dakota and I would&#8217;ve stuck with soda; beer isn&#8217;t really our
thing.</p>

<p>No TV; the stereo would be blaring Journey, or maybe some old U2; Santa
Esmerelda would definitely have made an appearance. That&#8217;d be the night; good
family, good music, good talk. Stories of all the silly, sometimes stupid,
things we&#8217;d done as kids. A little bit of talk of the future; but probably not
much. Just hanging out; enjoying each other&#8217;s company.</p>

<p>God, I miss those nights. Last night should have been just one of many more to
come, but you&#8217;ve been gone a year and a half now. That loss feels nearly as
raw now as it did when you passed away, and so I&#8217;m sitting crying at a car
wash, writing you this letter.</p>

<p>All those stories of us as children, but to this day I don&#8217;t know much about
your life before Becky was born. I know you worked from an early age, and that
you were in the Marines, and I think you and Mom were married in Puerto Rico,
but that&#8217;s it. I wish I&#8217;d asked when I had the chance. I wish I&#8217;d spent more
of those nights hanging out with you, listening to your music. I wish I&#8217;d
spent more days helping you at your store, or smeared with grease helping you
out with your truck. I wish I&#8217;d not skipped family trips as I got older; I
wish I&#8217;d gone to the family reunion. I wish I&#8217;d spent more time with you.</p>

<p>I&#8217;m sorry I went off and did my own thing so many times. I&#8217;m so very sorry I
wasn&#8217;t there for you more while you were sick.</p>

<p>I&#8217;m getting married soon; I finally proposed to Jackie on her birthday last
year. The date&#8217;s set for October 14th; there&#8217;s nothing special about the date
(yet), it&#8217;s just a good time for it. We&#8217;ll have been together for 5 and a half
years at that point. I know you liked her a lot, and it&#8217;s comforting to know
that you&#8217;d approve of this.</p>

<p>Becky&#8217;s doing well too; she and Eric moved to a small town in Northern
California that they love, at least when it stops raining. You have a new
grand-daughter; Emma Rose Moses was born on April 1st last year. I haven&#8217;t
gotten to spend enough time with her to know her yet, but just listening over
the phone she sounds great. A bit better behaved than her sister, and so eager
to catch up with your namesake. Kenna sounds like a cute little snot nowadays,
but isn&#8217;t that what little girls are supposed to be like? They&#8217;re both slated
to be flower-girls in my and Jackie&#8217;s wedding, and Becky a bridesmaid.</p>

<p>Daniel and Shawn are groomsmen, along with Dakota. I worry a bit about Daniel
and Shawn; they could use having you around more than Becky and I. Daniel&#8217;s a
bit self-destructive lately (well, more than usual), and Shawn&#8217;s still trying
to find himself. They&#8217;ll both get along fine, and get to where they belong,
I&#8217;m just afraid the trip will be harder than it has to be.</p>

<p>Daniel has 3 &#8216;79 Ford Trucks now, he&#8217;s nuts. One day he&#8217;s planning on making
them into one perfect truck. I applaud the effort, and wish him luck in it,
but it won&#8217;t be your truck. It&#8217;ll be his, and that&#8217;s cool. I&#8217;ll miss your
truck, but it&#8217;s better than letting it fade away.</p>

<p>Shawn thrashed his Ranger, but that&#8217;s what we&#8217;ve all done. Daniel thrashed his
Honda, I thrashed my Mazda, and Becky thrashed her Mustang. Shawn went and
bought himself a brand-new F-150, and that fits the pattern too. He&#8217;s just
working on an accelerated schedule. I&#8217;ll bet Dakota will get Daniel&#8217;s Ranger
when he&#8217;s old enough, and I&#8217;m sure he&#8217;ll thrash it too.</p>

<p>I worry about Dakota most of all. He&#8217;s 11 now, living with his mom. That&#8217;s a
good thing; he and Frida should be together. I know you wanted it that way.
Daniel and Danielle shouldn&#8217;t have been responsible for him so early; a child
is a difficult burden. They should be able to live their lives. That said, if
he ever wants to live with me; I&#8217;ll take him in a heartbeat. Jackie and I will
find some way to make things work if that ever happens.</p>

<p>But he needs you, Dad. He still has so much growing up to do, and there just
isn&#8217;t anyone else out there as well qualified to show him how. There&#8217;s no role
model good enough, certainly not me. I learned a lot from you, but I&#8217;m not
ready yet.</p>

<p>Thank you Dad, for teaching me what it is to be a good person, and for being
an incredible father. I hope to measure up to that standard one day, but I
don&#8217;t yet. I&#8217;m too selfish.</p>

<p>I love you Dad, I don&#8217;t think I realized how much until you were gone. A year
and a half now, and I miss you as much today as I did back then.</p>

<p>Jon</p>

<p>P.S. - I bought a motorcycle. Sorry.</p>
]]></content>
  </entry>
  
</feed>

