<?xml version="1.0" encoding="utf-8"?>
<!-- If you are running a bot please visit this policy page outlining rules you must respect. http://www.livejournal.com/bots/ -->
<feed xmlns="http://www.w3.org/2005/Atom" xmlns:lj="http://www.livejournal.com">
  <id>urn:lj:livejournal.com:atom1:kpreid</id>
  <title>Kevin Reid's blog</title>
  <subtitle>Kevin Reid</subtitle>
  <author>
    <email>kpreid@mac.com</email>
    <name>Kevin Reid</name>
  </author>
  <link rel="alternate" type="text/html" href="http://kpreid.livejournal.com/"/>
  <link rel="self" type="text/xml" href="http://kpreid.livejournal.com/data/atom"/>
  <updated>2009-12-21T02:02:45Z</updated>
  <lj:journal userid="3537103" username="kpreid" type="personal"/>
  <link rel="service.feed" type="application/x.atom+xml" href="http://kpreid.livejournal.com/data/atom" title="Kevin Reid's blog"/>
  <link rel="hub" href="http://pubsubhubbub.appspot.com/"/>
  <entry>
    <id>urn:lj:livejournal.com:atom1:kpreid:20149</id>
    <link rel="alternate" type="text/html" href="http://kpreid.livejournal.com/20149.html"/>
    <link rel="self" type="text/xml" href="http://kpreid.livejournal.com/data/atom/?itemid=20149"/>
    <title>Improving my web presence, out of necessity. Also, Apache configuration and LJ OpenID</title>
    <published>2009-12-21T01:58:18Z</published>
    <updated>2009-12-21T02:02:45Z</updated>
    <category term="programming"/>
    <category term="tahoe"/>
    <category term="apache"/>
    <category term="web site"/>
    <category term="e-on-cl"/>
    <category term="e"/>
    <category term="questions"/>
    <category term="svn"/>
    <category term="life"/>
    <category term="openid"/>
    <content type="html">&lt;p&gt;A machine I used to use to host some web services, bots, and repositories became no longer accessible from the Internet, as a result of which I've had to move what I was serving from it; some to &lt;a href="http://switchb.org/"&gt;switchb.org&lt;/a&gt;, some to personal machines.&lt;/p&gt;

&lt;p&gt;I took the opportunity to clean things up a bit, as a result of which I now have better backups, more polished services, and know a little bit more about configuring Apache — though not as much as I perhaps should.&lt;/p&gt;

&lt;ul&gt;

&lt;li&gt;&lt;p&gt;My &lt;a href="http://subversion.tigris.org/"&gt;Subversion&lt;/a&gt; repositories are now served over HTTP, and therefore browsable; and they are now backed up daily (using svnsync triggered by a cron job) to my laptop, and thence to all &lt;em&gt;its&lt;/em&gt; backups.&lt;/p&gt;

&lt;p&gt;(I wasted several minutes on remembering that cron will ignore the last line of a crontab file if it doesn't end with a newline; after listening to me grumbling about this, someone made a suggestion to end the file with a &lt;em&gt;comment&lt;/em&gt;, so that the last line is harmless whether ignored or not, and also reminds one of the issue.)&lt;/p&gt;

&lt;p&gt;If you have a working copy of one of my repositories (E-on-CL, E-on-JavaScript, MudWalker, Den, etc.), here's &lt;a href="http://www.eros-os.org/pipermail/e-lang/2009-December/013358.html"&gt;a guide to the changed URLs&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;

&lt;li&gt;&lt;p&gt;My other &lt;a href="http://allmydata.org/"&gt;Tahoe-LAFS&lt;/a&gt; &lt;a href="http://allmydata.org/trac/tahoe/wiki/VolunteerGrid" title=""&gt;volunteer grid&lt;/a&gt; storage node is now residing on a machine on my home LAN.&lt;/p&gt;
&lt;/li&gt;

&lt;li&gt;&lt;p&gt;Finally, some simple data-querying web services I wrote for &lt;a href="http://waterpoint.moo.mud.org/"&gt;Waterpoint&lt;/a&gt;'s word games have now been moved to switchb.org; I also took the time to prettify their URLs (no cgi-bin or .cgi) and write documentation.&lt;/p&gt;
&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;I haven't yet gotten to working on the bots, &lt;a href="http://darcs.net/"&gt;darcs&lt;/a&gt; repositories, or miscellaneous other stuff I had there.&lt;/p&gt;

&lt;p&gt;(Pondering moving my blog over to switchb.org as well so as to not have ads, especially now that I found I can still have LJ-friends by way of OpenID. (Hm, but reading friends-locked posts over RSS might not work since there's no username+password for LJ to accept. Anyone have experience with that situation?))&lt;/p&gt;

&lt;p&gt;Apache configuration questions:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;If I have multiple variants of a document (e.g. foo.html foo.pdf foo.txt) handled by MultiViews, so the canonical URL of the document is extensionless (“foo”), how do I properly control the default variant to serve in the event that the client does not express a preference via the Accept header? (Without doing so, I found that it would serve the .txt version, whereas I would prefer the HTML.) All that I found that worked was to create a &lt;a href="http://httpd.apache.org/docs/2.2/mod/mod_negotiation.html#typemaps" title="Type maps - mod_negotiation - Apache HTTP Server"&gt;type map file&lt;/a&gt; named “foo” with quality values, and force it to be interpreted as a type map using &amp;lt;FilesMatch&amp;gt;. This seems kludgy to me.&lt;/li&gt;

&lt;li&gt;What is the right way to serve CGIs, not in a designated cgi-bin directory, and without any .cgi extension in the URL? I initially tried to apply mod_rewrite, but I couldn't get it to work such that /foo internally contacted foo.cgi whereas /foo.cgi redirected to /foo. I resorted to another &amp;lt;FilesMatch&amp;gt; explicitly listing the name of each CGI and doing &lt;code&gt;SetHandler cgi-script&lt;/code&gt;.&lt;/li&gt;

&lt;li&gt;What is the right way to handle “testing” vs. “deployment” configurations, where the relevant Directory, Location, etc may be different depending on which server or subdirectory the site is set up on? I &lt;a href="http://httpd.apache.org/docs/2.2/configuring.html#syntax" title="Syntax of the Configuration Files - Apache HTTP Server"&gt;see that&lt;/a&gt; one may use environment variables — should I just set up variables containing the path prefixes for the particular host before including the generic configuration file?&lt;/li&gt;

&lt;/ol&gt;</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:kpreid:19829</id>
    <link rel="alternate" type="text/html" href="http://kpreid.livejournal.com/19829.html"/>
    <link rel="self" type="text/xml" href="http://kpreid.livejournal.com/data/atom/?itemid=19829"/>
    <title>And now for something utterly internet-pop-culturish</title>
    <published>2009-12-15T02:56:15Z</published>
    <updated>2009-12-15T02:56:15Z</updated>
    <category term="short"/>
    <category term="thoughts"/>
    <category term="irrelevant"/>
    <category term="lisp"/>
    <content type="html">&lt;p style="text-align: center;"&gt;&lt;img src="http://switchb.org/kpreid/2009/i-tape" style="width: 90%; max-width: 600px; height: auto; border: none; box-shadow: 0px 1px 3px #888; -webkit-box-shadow: 0px 1px 3px #888; -moz-box-shadow: 0px 1px 3px #888;"&gt;&lt;/p&gt;

&lt;p style="text-align: center; font-size: 80%; width: 80%; margin: 1em auto;"&gt;Photo taken by me in a Staples store. Text added with Zach Beane's &lt;a href="http://wigflip.com/roflbot/"&gt;roflbot&lt;/a&gt;.&lt;/p&gt;</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:kpreid:19669</id>
    <link rel="alternate" type="text/html" href="http://kpreid.livejournal.com/19669.html"/>
    <link rel="self" type="text/xml" href="http://kpreid.livejournal.com/data/atom/?itemid=19669"/>
    <title>Unifying status messages?</title>
    <published>2009-12-14T16:12:03Z</published>
    <updated>2009-12-14T17:45:32Z</updated>
    <category term="questions"/>
    <category term="desktop"/>
    <category term="programming"/>
    <category term="mac os x"/>
    <content type="html">&lt;p&gt;Has anyone invented a common protocol for, in a desktop environment, updating status (available/away/do-not-disturb and “what I'm doing” and so on) in social applications? I have 5 different such applications (iChat, Colloquy, Skype, MudWalker, Steam), and I usually don't bother to update all of them since it's too much trouble to do regularly. Is there some protocol that, say, the Linux-on-the-desktop folks have invented for having just one widget to inform everything?&lt;/p&gt;

&lt;p&gt;[edit] Clarification: I mention Linux-on-the-desktop just because I don't know much aboutit and there seems to be some innovation from that direction in this kind of area. The desktop in question is Mac OS X; I'm expecting to have to write the software myself; I just want to not reinvent the wheel with regard to &lt;em&gt;protocol&lt;/em&gt;.&lt;/p&gt;</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:kpreid:19243</id>
    <link rel="alternate" type="text/html" href="http://kpreid.livejournal.com/19243.html"/>
    <link rel="self" type="text/xml" href="http://kpreid.livejournal.com/data/atom/?itemid=19243"/>
    <title>ASDF PSA: defpackage in .asd is not obligatory</title>
    <published>2009-11-25T22:06:21Z</published>
    <updated>2009-11-27T00:54:46Z</updated>
    <category term="programming"/>
    <category term="lisp"/>
    <content type="html">&lt;p&gt;There seems to be a recurring misconception about writing &lt;code&gt;.asd&lt;/code&gt; files. It is &lt;strong&gt;not necessary&lt;/strong&gt; to start your asd with &lt;code&gt;(defpackage :foo.system ...) (in-package :foo.system)&lt;/code&gt; to “avoid polluting the package asdf loads your system in”.&lt;/p&gt;

&lt;p&gt;Every time an .asd file is loaded, ASDF &lt;em&gt;creates a fresh package&lt;/em&gt; to load it in. The relevant code from ASDF is:&lt;/p&gt;

&lt;blockquote&gt;&lt;pre&gt;(defun make-temporary-package ()
  (flet ((try (counter)
           (ignore-errors
                   (make-package (format nil &amp;quot;ASDF~D&amp;quot; counter)
                                 :use &amp;#x27;(:cl :asdf)))))
    (do* ((counter 0 (+ counter 1))
          (package (try counter) (try counter)))
         (package package))))

(defun find-system (...)
  ...
      (let ((package (make-temporary-package)))
        (unwind-protect
             (let ((*package* package))
               ...
               (load on-disk))
          (delete-package package)))
  ...)&lt;/pre&gt;&lt;/blockquote&gt;

&lt;p&gt;So, whenever you load an asd file, the package is fresh and &lt;code&gt;:use&lt;/code&gt;s CL and ASDF.&lt;/p&gt;

&lt;p&gt;There &lt;em&gt;are&lt;/em&gt; reasons to define a package for your asdf system definition.&lt;/p&gt;
&lt;ul&gt;
  
  &lt;li&gt;If you are creating any &lt;em&gt;classes&lt;/em&gt;, such as custom ASDF component types, then, since classes are not garbage collected (MOP specifies that the list of a class's subclasses can be retrieved, and no implementation I know of uses weak references for the purpose), naming them with symbols in a consistent package (rather than the asdf temporary package) ensures that reloading the system definition does not create useless additional copies of the classes.&lt;/li&gt;
  
  &lt;li&gt;If you are defining functions or other named entities in your system definition (which should of course only be done if they are also necessary to load the system) and want to be able to refer to them, such as for debugging, with nice interned symbol names.&lt;/li&gt;
  &lt;li&gt;If you want to be able to &lt;code&gt;(load "foo.asd")&lt;/code&gt; rather than going through asdf:find-system.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The disadvantages I can think of for defining a package for your system definitions are that the package list becomes more cluttered (only noticeably if for some strange reason you're loading many system definitions and not loading the defined systems), you're using more of the global package namespace (probably not a significant concern if you use a naming scheme like &lt;code&gt;foo&lt;/code&gt; and &lt;code&gt;foo.system&lt;/code&gt;), and your code is marginally more complex.&lt;/p&gt;

&lt;p&gt;So there are good reasons for (and maybe some against) &lt;code&gt;defpackage&lt;/code&gt; in your asd, but package hygiene is &lt;em&gt;not&lt;/em&gt; one of them.&lt;/p&gt;

&lt;p&gt;&lt;small&gt;[Edited 2009-11-26 to be less worded against defpackage after consideration and feedback.]&lt;/small&gt;&lt;/p&gt;</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:kpreid:19104</id>
    <link rel="alternate" type="text/html" href="http://kpreid.livejournal.com/19104.html"/>
    <link rel="self" type="text/xml" href="http://kpreid.livejournal.com/data/atom/?itemid=19104"/>
    <title>91% off sale at SparkFun Electronics</title>
    <published>2009-11-24T23:55:01Z</published>
    <updated>2009-11-24T23:55:01Z</updated>
    <category term="electronics"/>
    <category term="news"/>
    <content type="html">&lt;p&gt;You probably already know about this if you're interested, but &lt;a href="http://www.sparkfun.com/"&gt;SparkFun Electronics&lt;/a&gt; will be having, on January 7, a “&lt;a href="http://www.sparkfun.com/commerce/news.php?id=305"&gt;Free Day&lt;/a&gt;” on which you can order up to $100 and pay only shipping (plus any amount over $100). Shipping, to my location by the cheap options, was shown as ~$10 (thus “91% off”, not considering tax).&lt;/p&gt;

&lt;p&gt;(I have no affiliation with, and have not ordered anything from, SparkFun Electronics; this is just some info that showed up in my feed reader. As far as I’ve heard they’re good folks.)&lt;/p&gt;

&lt;p&gt;SparkFun’s product line is somewhat oriented towards the hip electronics hobbyist, the sort of stuff that &lt;i&gt;&lt;a href="http://blog.makezine.com/archive/electronics/"&gt;Make&lt;/a&gt;&lt;/i&gt; talks about: Arduino, text and graphic LCDs, blinky light kits, wireless stuff (serial links, GPS, Bluetooth), robots, sensors, breakout boards/modules for surface mount components. Many of these items are high priced, but they have notable cheap stuff too; when I heard about this sale yesterday my first-cut list of 11 interesting items only totaled $62.&lt;/p&gt;</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:kpreid:18923</id>
    <link rel="alternate" type="text/html" href="http://kpreid.livejournal.com/18923.html"/>
    <link rel="self" type="text/xml" href="http://kpreid.livejournal.com/data/atom/?itemid=18923"/>
    <title>Avoiding repeating myself (on the command line)</title>
    <published>2009-10-28T01:53:09Z</published>
    <updated>2009-11-18T02:14:31Z</updated>
    <category term="programming"/>
    <category term="programs"/>
    <category term="haskell"/>
    <category term="shell"/>
    <content type="html">&lt;p&gt;I was working on some automated document generation, building the process, revising the input document, and checking the results, and got tired enough of typing "make output/foo.txt &amp;&amp; open output/foo.txt" and then going back and editing that line when I wanted to check the PDF version etc. that I wrote a tool which I hope will have more general application as well. I called it “maken”:&lt;/p&gt;

&lt;blockquote&gt;&lt;pre&gt;#!/bin/sh
# Make files and view the results.
make "$@" &amp;&amp; open "$@"&lt;/pre&gt;&lt;/blockquote&gt;

&lt;p&gt;Or it could be generalized into being a combinator, running any two commands, rather than just &lt;code&gt;make&lt;/code&gt; and &lt;code&gt;open&lt;/code&gt;, specified as the first two arguments:&lt;/p&gt;

&lt;blockquote&gt;&lt;pre&gt;#!/bin/sh
ca="$1"
shift
cb="$1"
shift
"$ca" "$@" &amp;&amp; "$cb" "$@"&lt;/pre&gt;&lt;/blockquote&gt;

&lt;p&gt;(Which, for the Haskell folks, should be called &lt;code&gt;&amp;&amp;&amp;&lt;/code&gt;, except that that would be annoying to enter in the shell.)&lt;/p&gt;</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:kpreid:18499</id>
    <link rel="alternate" type="text/html" href="http://kpreid.livejournal.com/18499.html"/>
    <link rel="self" type="text/xml" href="http://kpreid.livejournal.com/data/atom/?itemid=18499"/>
    <title>Google Wave: Tell me what it's good for</title>
    <published>2009-10-24T01:58:52Z</published>
    <updated>2009-12-14T16:13:17Z</updated>
    <category term="questions"/>
    <category term="gsoc"/>
    <category term="gsoc2009"/>
    <content type="html">&lt;p&gt;I'm on &lt;a href="http://wave.google.com/"&gt;Google Wave&lt;/a&gt; (by way of my participation in GSoC 2009). Tell me what's worth my time to do with it.&lt;/p&gt;

&lt;p&gt;My ID is apparently &lt;kbd&gt;kpreid.switchb.org@googlewave.com&lt;/kbd&gt;. (&lt;code&gt;kpreid&lt;/code&gt; was taken, hmph.)&lt;/p&gt;</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:kpreid:18189</id>
    <link rel="alternate" type="text/html" href="http://kpreid.livejournal.com/18189.html"/>
    <link rel="self" type="text/xml" href="http://kpreid.livejournal.com/data/atom/?itemid=18189"/>
    <title>Irony, exhibit 1</title>
    <published>2009-10-17T14:22:22Z</published>
    <updated>2009-10-17T14:22:22Z</updated>
    <category term="college"/>
    <category term="short"/>
    <content type="html">&lt;p&gt;I blame a certain English teacher last year for introducing “FAIL” into my vocabulary.&lt;/p&gt;</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:kpreid:18109</id>
    <link rel="alternate" type="text/html" href="http://kpreid.livejournal.com/18109.html"/>
    <link rel="self" type="text/xml" href="http://kpreid.livejournal.com/data/atom/?itemid=18109"/>
    <title>kpreid @ 2009-09-21T23:18:00</title>
    <published>2009-09-22T03:20:08Z</published>
    <updated>2009-09-22T03:20:08Z</updated>
    <category term="short"/>
    <category term="thoughts"/>
    <category term="programming"/>
    <category term="shell"/>
    <content type="html">&lt;p&gt;Every time you write “&lt;code&gt; | &lt;/code&gt;” in shell, that's concurrent programming.&lt;/p&gt;</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:kpreid:17741</id>
    <link rel="alternate" type="text/html" href="http://kpreid.livejournal.com/17741.html"/>
    <link rel="self" type="text/xml" href="http://kpreid.livejournal.com/data/atom/?itemid=17741"/>
    <title>This is not a LaTeX quine</title>
    <published>2009-09-22T01:45:09Z</published>
    <updated>2009-09-22T01:45:09Z</updated>
    <category term="short"/>
    <category term="programming"/>
    <category term="programs"/>
    <category term="latex"/>
    <content type="html">&lt;pre&gt;\documentclass{article}
\usepackage{verbatim}
\begin{document}
  \verbatiminput{\jobname.tex}
\end{document}&lt;/pre&gt;</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:kpreid:17564</id>
    <link rel="alternate" type="text/html" href="http://kpreid.livejournal.com/17564.html"/>
    <link rel="self" type="text/xml" href="http://kpreid.livejournal.com/data/atom/?itemid=17564"/>
    <title>What do you call a method, er, header in Java?</title>
    <published>2009-09-18T03:54:36Z</published>
    <updated>2009-09-18T03:54:36Z</updated>
    <category term="questions"/>
    <category term="programming"/>
    <category term="java"/>
    <content type="html">&lt;p&gt;What do practicing Java programmers call the part of a method definition that isn't the { body }?&lt;/p&gt;

&lt;pre&gt;__________/ this bit here \___________
public static void main(String[] args) {
  // not this part
}&lt;/pre&gt;

&lt;p&gt;A quick search turned up the &lt;a href="http://java.sun.com/docs/books/jls/second_edition/html/classes.doc.html#40420"&gt;Java Language Specification, Second Edition&lt;/a&gt; calling it a MethodHeader in the grammar, but it doesn't use that term in the text and I want to know what term(s) are used in practice, not solely by language lawyers.&lt;/p&gt;

&lt;p&gt;(“Signature” is not correct, as that includes only the method name and parameter types, not modifiers and result type.)&lt;/p&gt;</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:kpreid:17317</id>
    <link rel="alternate" type="text/html" href="http://kpreid.livejournal.com/17317.html"/>
    <link rel="self" type="text/xml" href="http://kpreid.livejournal.com/data/atom/?itemid=17317"/>
    <title>It's that time of day again...</title>
    <published>2009-09-18T03:29:24Z</published>
    <updated>2009-09-18T03:29:24Z</updated>
    <category term="college"/>
    <category term="short"/>
    <category term="programming"/>
    <category term="life"/>
    <content type="html">&lt;p&gt;Both of the non-internet-based computer-related classes I'm taking this semester are (only offered as) once-per-week night classes, &lt;em&gt;nominally&lt;/em&gt; ending at 9:30. So I'm talking with someone after class — — gee, it's bedtime already.&lt;/p&gt;</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:kpreid:16930</id>
    <link rel="alternate" type="text/html" href="http://kpreid.livejournal.com/16930.html"/>
    <link rel="self" type="text/xml" href="http://kpreid.livejournal.com/data/atom/?itemid=16930"/>
    <title>GSoC conclusion.</title>
    <published>2009-09-11T01:09:27Z</published>
    <updated>2009-09-11T01:09:27Z</updated>
    <category term="programming"/>
    <category term="javascript"/>
    <category term="caps"/>
    <category term="e"/>
    <category term="college"/>
    <category term="captp"/>
    <category term="life"/>
    <category term="gsoc"/>
    <category term="gsoc2009"/>
    <content type="html">&lt;p&gt;Late update on &lt;a href="http://code.google.com/p/caja-captp/"&gt;Caja-CapTP&lt;/a&gt;:&lt;/p&gt;

&lt;p&gt;Google Summer of Code is over. I passed based on revised goals, but I'm not happy with the state of the code and I did not complete any significant part of the original plan.&lt;/p&gt;

&lt;p&gt;Regarding the items mentioned in &lt;a href="http://kpreid.livejournal.com/16079.html"&gt;my last update&lt;/a&gt;:&lt;/p&gt;

&lt;blockquote cite="http://kpreid.livejournal.com/16079.html"&gt;&lt;ul&gt;
&lt;li&gt;Write more documentation/comments.
&lt;li&gt;Commit as much of the work-in-progress as I can.
&lt;ul&gt;&lt;li&gt;...including the incomplete CapTPConnection, even though its tests don't pass yet, so that the partial work can be counted.&lt;/ul&gt;
&lt;/ul&gt;&lt;/blockquote&gt;

&lt;p&gt;I committed CapTPConnection, and found and fixed enough infrastructure (whenResolved, CommTable, SwissTable, deSubgraphKit, etc.) bugs that it starts up and can do a basic operation or two. It's not useful for anything, but it's a lot closer to running than it was at the time of my last update.&lt;/p&gt;

&lt;p&gt;Also, I removed dependencies on 'window' so in principle it will operate on a non-browser (server) JavaScript implementation. This has not been exercised because there is no browserless driver for the test scripts yet.&lt;/p&gt;

&lt;p&gt;I stated that I would continue working on Caja-CapTP past the GSoC work period; however, with the time occupied by schoolwork, I have not had time or brain space to do so &lt;em&gt;yet&lt;/em&gt;. I am not going to abandon the project.&lt;/p&gt;</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:kpreid:16804</id>
    <link rel="alternate" type="text/html" href="http://kpreid.livejournal.com/16804.html"/>
    <link rel="self" type="text/xml" href="http://kpreid.livejournal.com/data/atom/?itemid=16804"/>
    <title>an approximation, the usefulness of which depends on the application</title>
    <published>2009-09-11T00:54:48Z</published>
    <updated>2009-09-11T00:56:34Z</updated>
    <category term="unicode"/>
    <category term="short"/>
    <category term="programming"/>
    <category term="irrelevant"/>
    <category term="math"/>
    <category term="java"/>
    <content type="html">&lt;p&gt;Java programming class (yes, I know Java already) today, introducing loops. Task: write a factorial program. I wrote mine to use &lt;code&gt;int&lt;/code&gt; arithmetic if possible, floating-point if not. Test the edge cases, of course. It says:&lt;/p&gt;

&lt;blockquote&gt;500! ≈ Infinity&lt;/blockquote&gt;

&lt;p&gt;I'm glad I used the “approximately equals” sign.&lt;/p&gt;</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:kpreid:16420</id>
    <link rel="alternate" type="text/html" href="http://kpreid.livejournal.com/16420.html"/>
    <link rel="self" type="text/xml" href="http://kpreid.livejournal.com/data/atom/?itemid=16420"/>
    <title>Tell me what college to transfer to. (Or, Decloaking, part 2)</title>
    <published>2009-09-08T14:32:22Z</published>
    <updated>2009-09-08T14:33:00Z</updated>
    <category term="questions"/>
    <category term="college"/>
    <category term="life"/>
    <content type="html">&lt;p&gt;As &lt;a href="http://kpreid.livejournal.com/12194.html"&gt;I wrote before&lt;/a&gt;, I am currently attending &lt;a href="http://www.mvcc.edu/"&gt;MVCC&lt;/a&gt;, a two-year college, and need to choose a college to transfer to (for a bachelor’s in computer science).&lt;/p&gt;

&lt;p&gt;So, &lt;strong&gt;tell me what college(s) I ought to consider.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;(I have of course also heard the advice that &lt;a href="http://scienceblogs.com/principles/2009/08/how_to_choose_a_college.php"&gt;it doesn’t matter that much&lt;/a&gt;, but I've got to choose from &lt;em&gt;some&lt;/em&gt; short-list...)&lt;/p&gt;

&lt;p&gt;I am willing to consider any location in the contiguous US, but have been looking mostly at New York choices as a way to make the research list manageably short.&lt;/p&gt;

&lt;p&gt;I am &lt;em&gt;not&lt;/em&gt; looking for vocational training; I can learn this year’s or last year’s hot technologies just fine by myself, thank you. I’m looking for general education (“well-rounding”, shall we say), useful theory, and practice in &lt;em&gt;thinking&lt;/em&gt;. I wish to avoid a high-pressure or competitive academic environment. Also, at MVCC, I have greatly appreciated the instructors’ approachability, availability, and even willingness to acknowledge mistakes.&lt;/p&gt;

&lt;p&gt;Outside of education, I am particularly interested in there being social opportunities for the socially awkward; chances to talk to like-minded people (i.e. total geeks), and opportunities to talk to unlike-minded people (for the practice!).&lt;/p&gt;

&lt;p&gt;Please give me your recommendations. Just a name, your personal experience, comments on others’ recommendations, whatever info you’d like to share.&lt;/p&gt;

&lt;br&gt;
&lt;p&gt;(On the other hand entirely, I’d also consider going directly from MVCC to a full-time job given the right opportunity. This will be the topic of an upcoming post.)&lt;/p&gt;</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:kpreid:16348</id>
    <link rel="alternate" type="text/html" href="http://kpreid.livejournal.com/16348.html"/>
    <link rel="self" type="text/xml" href="http://kpreid.livejournal.com/data/atom/?itemid=16348"/>
    <title>Input wanted: posting short stuff</title>
    <published>2009-09-01T19:53:55Z</published>
    <updated>2009-09-01T19:53:55Z</updated>
    <category term="questions"/>
    <category term="thoughts"/>
    <category term="meta"/>
    <category term="lisp"/>
    <category term="web site"/>
    <content type="html">&lt;p&gt;I've been having a lot of thoughts lately I'd like to publish, but seem a little bit too short for A Blog Post. Some options&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Considered signing up for Twitter. Pro: short stuff is expected there; participating in the hot new thing; people interested in short-form will be on twitter and using the follow feature. Con: Reliability problems; &lt;abbr title="yet another"&gt;YA&lt;/abbr&gt; thing to manage credentials and backup for; no hyperlinks; my favorite username is &lt;a href="https://twitter.com/kpreid" rel="nofollow"&gt;taken&lt;/a&gt;.
&lt;li&gt;I could post stuff here. Particularly, LJ supports titleless posts.
&lt;li&gt;I could use some other site, or build my own publishing system. [er, why?]
&lt;/ol&gt;

&lt;p&gt;On reflection, I'm thinking to just post the stuff here and not have yet-another-distinct-place/site.&lt;/p&gt;

&lt;p&gt;Readers, what would you prefer?&lt;/p&gt;

&lt;p&gt;&lt;br&gt;&lt;small&gt;(This post is tagged “lisp” solely so that Planet Lisp will pick it up.)&lt;/small&gt;&lt;/p&gt;</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:kpreid:16079</id>
    <link rel="alternate" type="text/html" href="http://kpreid.livejournal.com/16079.html"/>
    <link rel="self" type="text/xml" href="http://kpreid.livejournal.com/data/atom/?itemid=16079"/>
    <title>GSoC update: Stuff done, more to do.</title>
    <published>2009-08-12T15:58:02Z</published>
    <updated>2009-08-12T15:58:02Z</updated>
    <category term="captp"/>
    <category term="e"/>
    <category term="programming"/>
    <category term="javascript"/>
    <category term="gsoc"/>
    <category term="gsoc2009"/>
    <category term="caps"/>
    <content type="html">&lt;p&gt;Stuff done:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Implemented &lt;a href="http://www.eros-os.org/pipermail/e-lang/2009-June/013157.html"&gt;generic literals&lt;/a&gt;. 
&lt;li&gt;Implemented cyclic references in Data-E.
&lt;li&gt;Various cleanup, debugging support, and committing of stuff previously written.
&lt;li&gt;Wrote a wiki page &lt;a href="http://code.google.com/p/caja-captp/wiki/Architecture"&gt;documenting Caja-CapTP's major components and files.&lt;/a&gt;
&lt;/ul&gt;

&lt;p&gt;Stuff to do:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Write more documentation/comments.
&lt;li&gt;Commit as much of the work-in-progress as I can.
&lt;ul&gt;&lt;li&gt;...including the incomplete CapTPConnection, even though its tests don't pass yet, so that the partial work can be counted.&lt;/ul&gt;
&lt;/ul&gt;</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:kpreid:15815</id>
    <link rel="alternate" type="text/html" href="http://kpreid.livejournal.com/15815.html"/>
    <link rel="self" type="text/xml" href="http://kpreid.livejournal.com/data/atom/?itemid=15815"/>
    <title>Brain-dump for the beginning JavaScript programmer</title>
    <published>2009-08-12T15:48:29Z</published>
    <updated>2009-08-12T15:50:17Z</updated>
    <category term="programming"/>
    <category term="javascript"/>
    <category term="gsoc"/>
    <category term="gsoc2009"/>
    <content type="html">&lt;p&gt;A while ago I got the idea to write a “my experiences with JavaScript” post; unfortunately, I’ve forgotten what I was going to put in it. However, yesterday someone said approximately “I need to learn JavaScript in 3 hours, what should I know?”, and I thought of quite a few not-immediately-obvious things to point out.&lt;/p&gt;

&lt;a name="cutid1"&gt;&lt;/a&gt;
&lt;h3&gt;General&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Beware the bad tutorials.
&lt;li&gt;As far as I know, Mozilla’s &lt;a href="https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference"&gt;Core JavaScript 1.5 Reference&lt;/a&gt; and &lt;a href="https://developer.mozilla.org/en/Core_JavaScript_1.5_Guide"&gt;Core JavaScript 1.5 Guide&lt;/a&gt; are not bad. (I start with the former for library/standard objects info, and the latter for language syntax.)
&lt;li&gt;Anything &lt;a href="http://www.crockford.com/" title="He invented JSON."&gt;Crockford&lt;/a&gt; &lt;a href="http://www.youtube.com/watch?v=hQVTIJBZook"&gt;says&lt;/a&gt; goes.
&lt;li&gt;It’s probably a good idea to use &lt;a href="http://www.jslint.com/"&gt;JSLint&lt;/a&gt; but I haven’t myself.
&lt;li&gt;If you use Firefox with &lt;a href="http://getfirebug.com/"&gt;Firebug&lt;/a&gt;, or Safari, write your code to use &lt;a href="http://getfirebug.com/console.html"&gt;the console object&lt;/a&gt;, &lt;strong&gt;if present&lt;/strong&gt;; it is a very nice tool for your inevitable print-debugging, and Firebug’s version even lets you click on objects shown to inspect them.
&lt;/ul&gt;

&lt;h3&gt;Miscellaneous practice&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Don’t &lt;em&gt;ever&lt;/em&gt; write a busy-wait/polling/delay loop. It won’t work and it'll waste your users' time. JavaScript in the browser is an event-driven system; use &lt;code&gt;setTimeout&lt;/code&gt; (callback once) and/or &lt;code&gt;setInterval&lt;/code&gt; (callback repeated with specified period) as appropriate. You can write a background loop with setTimeout: &lt;code&gt;function loop() { if (&lt;var&gt;termination condition&lt;/var&gt;) { return; } else { &lt;var&gt;...do something...&lt;/var&gt;; setTimeout(loop, 0); } }; loop();&lt;/code&gt;
&lt;li&gt;Don’t &lt;code&gt;throw "foo";&lt;/code&gt; but &lt;code&gt;throw new Error("foo");&lt;/code&gt; because that gives Firefox, at least, an opportunity to insert call stack information.
&lt;li&gt;JavaScript has two "nothing" values: &lt;code&gt;undefined&lt;/code&gt;, of type "undefined", and &lt;code&gt;null&lt;/code&gt;, of type "object". &lt;code&gt;undefined&lt;/code&gt; is returned by failed property lookups and the default return value of functions. &lt;code&gt;null&lt;/code&gt; doesn’t show up much unless you use it, and is useful in your code for distinguishing deliberate absence from an accidental missing value (bug).
&lt;/ul&gt;

&lt;h3&gt;Scope&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Local variables are declared with "&lt;code&gt;var&lt;/code&gt;", &lt;em&gt;but&lt;/em&gt; they are scoped to the nearest enclosing &lt;em&gt;function&lt;/em&gt;, not the nearest &lt;code&gt;{&lt;/code&gt; block &lt;code&gt;}&lt;/code&gt;!
&lt;li&gt;Functions can be closures. Use this when it’s useful.
&lt;li&gt;Don’t write &lt;code&gt;setTimeout('foo()', delay)&lt;/code&gt; (because string-eval is a bad habit), write &lt;code&gt;setTimeout(foo, delay)&lt;/code&gt; or &lt;code&gt;setTimeout(function () { foo() /* for more complicated things */ }, delay)&lt;/code&gt;.
&lt;/ul&gt;

&lt;h3&gt;&lt;code&gt;this&lt;/code&gt;&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Don’t call a user-defined constructor (say, Foo), as &lt;code&gt;Foo()&lt;/code&gt;, only &lt;code&gt;new Foo()&lt;/code&gt;, or it will overwrite global variables instead of creating an object. (&lt;code&gt;new&lt;/code&gt; binds &lt;code&gt;this&lt;/code&gt; to a new object inside the function; a regular call leaves it as the global object.)
&lt;li&gt;&lt;code&gt;foo.bar()&lt;/code&gt; is the same as &lt;code&gt;(foo.bar)()&lt;/code&gt;, and &lt;strong&gt;is not&lt;/strong&gt; the same as &lt;code&gt;var x = foo.bar; x()&lt;/code&gt;. The former binds &lt;code&gt;this&lt;/code&gt; inside the function to the &lt;code&gt;foo&lt;/code&gt; object; the latter &lt;strong&gt;does not&lt;/strong&gt;.
&lt;/ul&gt;

&lt;h3&gt;Properties and variables&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;for (x in y) ...&lt;/code&gt; does not do what you might first expect; it iterates over all properties of the object, &lt;em&gt;even inherited ones&lt;/em&gt;.
&lt;li&gt;If you see &lt;code&gt;$('foo')&lt;/code&gt;: That is not some magic new operator. &lt;code&gt;$&lt;/code&gt; &lt;em&gt;is an identifier character.&lt;/em&gt; That expression &lt;em&gt;is a function call&lt;/em&gt;. From what I hear, both &lt;a href="http://www.prototypejs.org/"&gt;Prototype&lt;/a&gt; and &lt;a href="http://jquery.com/"&gt;jQuery&lt;/a&gt; define functions named &lt;code&gt;$&lt;/code&gt;.
&lt;li&gt;&lt;code&gt;foo.bar&lt;/code&gt; is exactly equivalent to &lt;code&gt;foo["bar"]&lt;/code&gt;.
&lt;li&gt;&lt;code&gt;foo.bar&lt;/code&gt; returns &lt;code&gt;undefined&lt;/code&gt; if &lt;code&gt;bar&lt;/code&gt; is not a property of &lt;code&gt;foo&lt;/code&gt;; &lt;code&gt;bar&lt;/code&gt; &lt;em&gt;throws an error&lt;/em&gt; if &lt;code&gt;bar&lt;/code&gt; is not a property of whatever the environment is. So if you’re doing browser feature detection, you write code like &lt;code&gt;if (window.console)&lt;/code&gt;, not &lt;code&gt;if (console)&lt;/code&gt;, even though &lt;code&gt;window&lt;/code&gt; is the global object and its properties are variables.
&lt;/ul&gt;

&lt;h3&gt;Numbers&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;All numbers are double-floats, &lt;strong&gt;not integers&lt;/strong&gt;. They can exactly represent integers up to &lt;a href="http://groups.google.com/group/google-caja-discuss/browse_thread/thread/b88716e1bd39d10f/79f535f80f87661d?lnk=gst&amp;amp;q=enforceNat#79f535f80f87661d"&gt;about 2&lt;sup&gt;53&lt;/sup&gt;&lt;/a&gt;, but you should still &lt;a href="http://docs.sun.com/source/806-3568/ncg_goldberg.html" title="What Every Computer Scientist Should Know About Floating-Point Arithmetic"&gt;keep the nature of floating-point arithmetic in mind&lt;/a&gt;.
&lt;li&gt;The &lt;code&gt;==&lt;/code&gt; operator does a scary number of implicit conversions; use &lt;code&gt;===&lt;/code&gt; unless you know &lt;code&gt;==&lt;/code&gt; does what you want.
&lt;ul&gt;&lt;li&gt;Even &lt;code&gt;===&lt;/code&gt; compares floats according to IEEE floating point numeric comparison; this means that &lt;code&gt;NaN !== NaN&lt;/code&gt;.&lt;/ul&gt;
&lt;/ul&gt;
</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:kpreid:15607</id>
    <link rel="alternate" type="text/html" href="http://kpreid.livejournal.com/15607.html"/>
    <link rel="self" type="text/xml" href="http://kpreid.livejournal.com/data/atom/?itemid=15607"/>
    <title>GSoC update: Yes, you may change it.</title>
    <published>2009-08-08T19:56:04Z</published>
    <updated>2009-08-08T19:56:04Z</updated>
    <category term="captp"/>
    <category term="e"/>
    <category term="programming"/>
    <category term="javascript"/>
    <category term="gsoc"/>
    <category term="gsoc2009"/>
    <category term="caps"/>
    <content type="html">&lt;p&gt;Had a bit of a breakthrough in debugging facilities: realizing that there's no reason I shouldn't modify my local copy of the &lt;a href="http://code.google.com/p/google-caja/wiki/CajaLexicon"&gt;Cajita&lt;/a&gt; runtime to provide more debug information (and it doesn't matter if it subtly breaks security, even, as long as &lt;a href="http://code.google.com/p/caja-captp/"&gt;Caja-CapTP&lt;/a&gt; is still compatible with the proper version).&lt;/p&gt;

&lt;p&gt;Only a week or so left. I've discussed the matter with MarkM, and he pointed out (again) that I should work toward having useful-to-other-people components even if I haven't finished the one I intended to do.&lt;/p&gt;

&lt;p&gt;Toward this end, I am going to work on Data-E (which is already part of the Caja-CapTP project) as a standalone serialization utility (for network and disk) as I understand it will be useful for &lt;a href="http://groups.google.com/group/google-caja-discuss/browse_thread/thread/e77039c248ee561/85db73be431b725c"&gt;Shakhar&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Todo items:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Implement generic literals (&lt;a href="http://www.eros-os.org/pipermail/e-lang/2009-June/013157.html"&gt;description&lt;/a&gt;) to make it more JavaScript-natural.
&lt;li&gt;Implement cyclic object graph handling using Ref promise implementation already done.
&lt;li&gt;Commit all in-progress work as reasonable changesets (even the tests that don't yet pass).
&lt;li&gt;Document what works, design decisions, etc.
&lt;li&gt;Continue to work on CapTP itself as time permits.
&lt;/ul&gt;

&lt;p&gt;I intend to continue working on the Caja-CapTP project beyond GSoC; both simply because it is a project of mine, and to mitigate my failure to complete the planned work on schedule. However, for the next few months it will have to compete with my college work rather than my procrastination.&lt;/p&gt;</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:kpreid:15296</id>
    <link rel="alternate" type="text/html" href="http://kpreid.livejournal.com/15296.html"/>
    <link rel="self" type="text/xml" href="http://kpreid.livejournal.com/data/atom/?itemid=15296"/>
    <title>Want to write some miscellanous Common Lisp code?</title>
    <published>2009-08-02T18:10:35Z</published>
    <updated>2009-08-02T18:10:35Z</updated>
    <category term="programming"/>
    <category term="rosettacode"/>
    <category term="lisp"/>
    <content type="html">&lt;p&gt;&lt;a href="http://rosettacode.org/wiki/"&gt;Rosetta Code&lt;/a&gt; is a wiki where a variety of programming problems and language features are demonstrated in many languages, allowing language learning and comparison of features and paradigms.&lt;/p&gt;

&lt;p&gt;If you'd like to contribute Common Lisp code to the project, I've just completed a &lt;a href="http://rosettacode.org/wiki/User:Kevin_Reid/Common_Lisp_tasks"&gt;classification of tasks&lt;/a&gt; in CL (like &lt;a href="http://rosettacode.org/wiki/User:Kevin_Reid/E_tasks"&gt;my prior one for E&lt;/a&gt;), so that it's easy to find the kind of problem one wants to work on at the moment.&lt;/p&gt;

&lt;p&gt;One thing I find interesting about working on Rosetta Code is that many tasks bring with them some particular perspective — someone's notion of how programming necessarily works — and it can be a challenge to figure out the analogous way, or best way, to do it in &lt;em&gt;your&lt;/em&gt; language is, and then explain it.&lt;/p&gt;</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:kpreid:14890</id>
    <link rel="alternate" type="text/html" href="http://kpreid.livejournal.com/14890.html"/>
    <link rel="self" type="text/xml" href="http://kpreid.livejournal.com/data/atom/?itemid=14890"/>
    <title>GSoC update: Hurry up and procrastinate.</title>
    <published>2009-07-13T13:33:56Z</published>
    <updated>2009-07-13T13:33:56Z</updated>
    <category term="captp"/>
    <category term="e"/>
    <category term="programming"/>
    <category term="javascript"/>
    <category term="gsoc"/>
    <category term="gsoc2009"/>
    <category term="caps"/>
    <content type="html">&lt;p&gt;I'm having severe getting-around-to-actually-doing-the-work problems; I am far behind schedule. I think the problem is framing this as “work” rather than just another of the projects that I've found interesting and tinkered with. (I also blame &lt;a href="http://store.steampowered.com/app/440/"&gt;Team Fortress 2&lt;/a&gt; and &lt;a href="http://rosettacode.org/"&gt;Rosetta Code&lt;/a&gt; for providing attractive distractions...)&lt;/p&gt;

&lt;p&gt;I've ported the “&lt;a href="http://wiki.erights.org/wiki/Ref"&gt;Ref&lt;/a&gt;” facility from E; this is necessary as CapTP is built on Ref semantics (promises, proxies, broken refs). I hope to very soon get the actual CapTP connection module up, then (as I wrote before) “define, document and implement a CapTP-over-HTTP protocol”.&lt;/p&gt;

&lt;p&gt;(I previously mentioned implementing the Surgeon (serialization tool) but I then remembered that that's actually irrelevant to CapTP.)&lt;/p&gt;

&lt;p&gt;Also: working without Internet access removes a whole lot of potential distractions — and one’s access to online documentation. Luckily I had some source code around which provided examples.&lt;/p&gt;</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:kpreid:14713</id>
    <link rel="alternate" type="text/html" href="http://kpreid.livejournal.com/14713.html"/>
    <link rel="self" type="text/xml" href="http://kpreid.livejournal.com/data/atom/?itemid=14713"/>
    <title>Common Lisp hackery: writing fasls from non-file input</title>
    <published>2009-07-13T13:09:44Z</published>
    <updated>2009-07-13T13:09:44Z</updated>
    <category term="e"/>
    <category term="programming"/>
    <category term="lisp"/>
    <category term="e-on-cl"/>
    <content type="html">

&lt;p&gt;Common Lisp provides &lt;a href="http://www.lispworks.com/documentation/HyperSpec/Body/f_cmp_fi.htm" title="CLHS: Function COMPILE-FILE"&gt;compile-file&lt;/a&gt; whose purposes is to convert a CL source file into an (implementation-defined) format which usually has precompiled code and is designed for faster loading into a lisp system.&lt;/p&gt;

&lt;p&gt;compile-file takes the pathname of a textual lisp source file. But what if you want to compile some Lisp code that's not in a file already, perhaps because you translated/compiled it from some not-amenable-to-the-Lisp-reader input syntax, or because it contains un&lt;a href="http://www.lispworks.com/documentation/HyperSpec/Body/f_rd_rd.htm" title="CLHS: Function READ, READ-PRESERVING-WHITESPACE"&gt;READ&lt;/a&gt;able literals? You can use a "universal Lisp file", which I know two ways to create (use whichever you find cleaner):&lt;/p&gt;

&lt;blockquote&gt;&lt;pre&gt;(cl:in-package :mypackage)
#.mypackage::*program*&lt;/pre&gt;&lt;/blockquote&gt;

or

&lt;blockquote&gt;&lt;pre&gt;(cl:in-package :mypackage)
(macrolet ((it () *program*))
  (it))&lt;/pre&gt;&lt;/blockquote&gt;

&lt;p&gt;Suppose this is in "universal.lisp". Then to use it:&lt;/p&gt;

&lt;blockquote&gt;&lt;pre&gt;(defvar *program*)

(defun compile-to-file (form output-file)
  (let ((*program* form))
    (compile-file #p"universal.lisp"
                  :output-file output-file)))&lt;/pre&gt;&lt;/blockquote&gt;

&lt;p&gt;This is just a minimal example; you'll also want to appropriately handle the return value from compile-file, provide an appropriate pathname to the universal file, etc. For example, here's an excerpt of the relevant code from &lt;a href="http://wiki.erights.org/wiki/E-on-CL" title="E on Common Lisp"&gt;E-on-CL&lt;/a&gt;, where I have used this technique to compile non-CL sources (emakers) into fasls:&lt;/p&gt;

&lt;blockquote&gt;&lt;pre&gt;
(defparameter +the-asdf-system+ (asdf:find-system :e-on-cl))
(defvar *efasl-program*)
(defvar *efasl-result*)
...
(defun compile-e-to-file (expr output-file fqn-prefix opt-scope)
  ...
  (let* (...
         (*efasl-program*
           `(setf *efasl-result*
                  (lambda (...) ...))))
    (multiple-value-bind (truename warnings-p failure-p)
        (compile-file (merge-pathnames
                        #p"lisp/universal.lisp"
                        (asdf:component-pathname +the-asdf-system+))
                      :output-file output-file
                      :verbose nil
                      :print nil)
      (declare (ignore truename warnings-p))
      (assert (not failure-p) () "Compilation for ~A failed." output-file))))

(defun load-compiled-e (file env)
  (let ((*efasl-result* nil)
        ...)
    (load file :verbose nil :print nil)
    (funcall *efasl-result* env)))
&lt;/pre&gt;&lt;/blockquote&gt;

&lt;p&gt;Note that the pathname is computed relative to the &lt;a href="http://www.cliki.net/asdf" title="CLiki : asdf"&gt;ASDF&lt;/a&gt; system containing the universal file; also note the use of a variable *efasl-result* to simulate a "return value" from the compiled file, and the use of a lambda to provide a nonempty lexical environment, both of which are features not directly provided by the CL compiled file facility.&lt;/p&gt;</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:kpreid:14573</id>
    <link rel="alternate" type="text/html" href="http://kpreid.livejournal.com/14573.html"/>
    <link rel="self" type="text/xml" href="http://kpreid.livejournal.com/data/atom/?itemid=14573"/>
    <title>Web site moved; feedback wanted</title>
    <published>2009-06-14T04:37:10Z</published>
    <updated>2009-06-14T13:03:41Z</updated>
    <category term="life"/>
    <category term="web site"/>
    <content type="html">&lt;p&gt;I have moved my web site to a new location: &lt;a href="http://switchb.org/kpreid/"&gt;http://switchb.org/kpreid/&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;I have done this because Apple has announced they are shutting down homepage.mac.com. While they offer a replacement, I do not want to have to change my URLs ever again, so I bought a domain name.&lt;/p&gt;

&lt;p&gt;As well as moving the files I have updated my picture, changed some of the URL layout, updated some miscellaneous information, added an “About me” section for the front page, and fixed broken external links. Please let me know if I missed anything...&lt;/p&gt;

&lt;p&gt;or even just critique it without respect to what's new.&lt;/p&gt;</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:kpreid:14259</id>
    <link rel="alternate" type="text/html" href="http://kpreid.livejournal.com/14259.html"/>
    <link rel="self" type="text/xml" href="http://kpreid.livejournal.com/data/atom/?itemid=14259"/>
    <title>GSoC update: Going both ways.</title>
    <published>2009-06-02T18:52:11Z</published>
    <updated>2009-06-02T18:52:11Z</updated>
    <category term="captp"/>
    <category term="e"/>
    <category term="programming"/>
    <category term="javascript"/>
    <category term="gsoc"/>
    <category term="gsoc2009"/>
    <category term="caps"/>
    <content type="html">&lt;p&gt;I'm not making progress as fast as I would like; mostly due to assorted distractions rather than Doing The Work.&lt;/p&gt;

&lt;p&gt;That said, I've gotten both ends of serialization implemented, at least for non-circular cases: the deJSONTreeKit and deSubgraphKit have both builder and recognizer implementations. (For a terminology introduction, see &lt;a href="http://www.erights.org/data/serial/jhu-paper/deconstructing.html"&gt;the serialization paper&lt;/a&gt;.)&lt;/p&gt;

&lt;p&gt;Next up is the surgeon (high-level serialization interface), and designing uncallers suitable for JavaScript. I definitely need to increase my rate of progress to get this done on schedule.&lt;/p&gt;</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:kpreid:13956</id>
    <link rel="alternate" type="text/html" href="http://kpreid.livejournal.com/13956.html"/>
    <link rel="self" type="text/xml" href="http://kpreid.livejournal.com/data/atom/?itemid=13956"/>
    <title>GSoC update: It runs!</title>
    <published>2009-05-30T03:58:06Z</published>
    <updated>2009-05-30T03:58:06Z</updated>
    <category term="captp"/>
    <category term="e"/>
    <category term="programming"/>
    <category term="javascript"/>
    <category term="gsoc"/>
    <category term="gsoc2009"/>
    <category term="caps"/>
    <content type="html">&lt;p&gt;I completed enough of &lt;a href="http://kpreid.livejournal.com/13814.html"&gt;the E-on-JavaScript improvements&lt;/a&gt;, and wrote the beginnings of one Data-E kit in Cajita, together with the Updoc tests for it, and a Makefile to &lt;a href="http://code.google.com/p/google-caja/wiki/CajaCajole"&gt;cajole&lt;/a&gt; the JavaScript and "animate" the Updoc - convert it into a HTML page that actually runs the tests.&lt;/p&gt;

&lt;p&gt;I also improved various readme files and pages, hopefully such that someone else can get it all installed on their own system starting from &lt;a href="http://code.google.com/p/caja-captp/"&gt;my project page&lt;/a&gt; without too much prior knowledge.&lt;/p&gt;

&lt;p&gt;Near-term plan: Put aside the EoJS, and get the Data-E kits working; then the surgeon; then the CapTPConnection; then define, document and implement a CapTP-over-HTTP protocol.&lt;/p&gt;</content>
  </entry>
</feed>
