<?xml version="1.0"?>
<!-- name="generator" content="blosxom/2.0" -->
<!DOCTYPE rss PUBLIC "-//Netscape Communications//DTD RSS 0.91//EN" "http://my.netscape.com/publish/formats/rss-0.91.dtd">

<rss version="0.91">
  <channel>
    <title>musings of a Lispnik   </title>
    <link>http://blog.danieljanus.pl</link>
    <description>musings of a Lispnik</description>
    <language>en</language>

  <item>
    <title>Keyword arguments</title>
    <link>http://blog.danieljanus.pl/2010/05/04#defnk</link>
    <description>&lt;p&gt;There&amp;#8217;s been an &lt;a href=&quot;http://stuartsierra.com/2010/01/15/keyword-arguments-in-clojure&quot;&gt;ongoing&lt;/a&gt; &lt;a href=&quot;http://www.fatvat.co.uk/2009/01/passing-parameters-in-clojure.html&quot;&gt;debate&lt;/a&gt; about how to pass optional named
arguments to Clojure functions. One way to do this is the &lt;a href=&quot;http://richhickey.github.com/clojure-contrib/def-api.html#clojure.contrib.def/defnk&quot;&gt;defnk&lt;/a&gt;
macro from &lt;code&gt;clojure.contrib.def&lt;/code&gt;; I hesitate to call it &lt;em&gt;canonical&lt;/em&gt;,
since apparently not everyone uses it, but I&amp;#8217;ve found it useful a
number of times. Here&amp;#8217;s a sample:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;user&amp;gt; (use 'clojure.contrib.def)
nil
user&amp;gt; (defnk f [:b 43] (inc b))
#'user/f
user&amp;gt; (f)
44
user&amp;gt; (f :b 100)
101
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;This is an example of &lt;em&gt;keyword arguments&lt;/em&gt; in action. Keyword arguments
are a core feature of some languages, notably &lt;a href=&quot;http://www.gigamonkeys.com/book/functions.html#keyword-parameters&quot;&gt;Common Lisp&lt;/a&gt; and
&lt;a href=&quot;http://caml.inria.fr/pub/docs/manual-ocaml/manual006.html#htoc38&quot;&gt;Objective Caml&lt;/a&gt;. Clojure doesn&amp;#8217;t have them, but it&amp;#8217;s pretty easy to
emulate their basic usage with macros, as &lt;code&gt;defnk&lt;/code&gt; does.&lt;/p&gt;

&lt;p&gt;But there&amp;#8217;s more to Common Lisp&amp;#8217;s keyword arguments than &lt;code&gt;defnk&lt;/code&gt;
provides. In CL, the default value of a keyword argument can be an
expression referring to other arguments of the same function. For
example:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;CL-USER&amp;gt; (defun f (&amp;amp;key (a 1) (b a)) 
           (+ a b))
F 
CL-USER&amp;gt; (f)
2
CL-USER&amp;gt; (f :a 45)
90 
CL-USER&amp;gt; (f :b 101)
102
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;I wish &lt;code&gt;defnk&lt;/code&gt; had this feature. Or is there some better way that I
don&amp;#8217;t know of?&lt;/p&gt;
</description>
  </item>
  <item>
    <title>Sunflower</title>
    <link>http://blog.danieljanus.pl/2010/04/18#sunflower</link>
    <description>&lt;p&gt;The program I&amp;#8217;ve been &lt;a href=&quot;http://blog.danieljanus.pl/clojure/symbol-capture.html&quot;&gt;writing about recently&lt;/a&gt; has come to
a point where I think it can be shown to the wide public.  It&amp;#8217;s called
&lt;a href=&quot;http://github.com/nathell/sunflower&quot;&gt;Sunflower&lt;/a&gt; and has its home on GitHub.  It&amp;#8217;s nowhere near being
completed, and of alpha quality right now, but even at this stage it
might be useful.&lt;/p&gt;

&lt;p&gt;Just as sunflower seed kernels come wrapped in hulls, most HTML
documents seen in the wild come wrapped in noise that is not really
part of the document itself.  Take any news site: a document from such
a site contains things such as advertisements, header, footer, and
many links.  Now suppose you have many documents grabbed from the same
site.  Is it possible to somehow automate the extraction of the
document &amp;#8220;essences&amp;#8221;?&lt;/p&gt;

&lt;p&gt;Sunflower to the rescue. It relies on the assumption that documents
coming from the same source have the same structure. It presents 
a list of strings to the user, and asks to pick those that are
contained in the text essence. Then it finds the coordinates of
the smallest HTML subtree that contains all those strings, and
uses those coordinates to extract information from all documents.
And it comes with a nice, easily understandable GUI for that.&lt;/p&gt;

&lt;p&gt;This technique works remarkably well for many collections, although
not all.  An earlier, proof-of-concept implementation (in Common Lisp)
has been used to extract many press texts for the &lt;a href=&quot;http://nkjp.pl/index.php?page=0&amp;amp;lang=1&quot;&gt;National Corpus of
Polish&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;I&amp;#8217;ve given up on the symbol-capturing approach to wizards I&amp;#8217;ve presented
in my previous posts. Inspired by the DOM tree in Web apps, with a bag
of elements with identifiers, I now have a central bag of Swing widgets
(implemented as an atom) identified by keywords. This bag contains
tidbits of the mutable state of Sunflower. This means that I can write
callback functions like this:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;#(with-components [strings-model selected-dir]
   (.removeAllElements strings-model)
   (let [p (-&amp;gt; selected-dir htmls first parse)]
     (add-component :parsed p)
     (doseq [x (strings p)]
       (.addElement strings-model x))))
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Name and conquer: having parts of state explicitly named mean that I can
reliably access them from just about anywhere. This reduces confusion
and allows for less tangled, more self-contained and understandable code.&lt;/p&gt;
</description>
  </item>
  <item>
    <title>A case for symbol capture</title>
    <link>http://blog.danieljanus.pl/2010/04/05#symbol-capture</link>
    <description>&lt;p&gt;Clojure by default protects macro authors from incidentally capturing
a local symbol.  Stuart Halloway &lt;a href=&quot;http://blog.thinkrelevance.com/2008/12/17/on-lisp-clojure-chapter-9&quot;&gt;describes this&lt;/a&gt; in more detail,
explaining why this is a Good Thing.  However, sometimes this kind of
symbol capture is called for.  I&amp;#8217;ve encountered one such case today
while hacking a Swing application.&lt;/p&gt;

&lt;p&gt;As I develop the app, I find new ways to express Swing concepts and
interact with Swing objects in a more Clojuresque way, so a library of
GUI macros and functions gets written.  One of them is a &lt;code&gt;wizard&lt;/code&gt;
macro for easy creation of installer-like wizards, where there is a
sequence of screens that can be navigated with &lt;em&gt;Back&lt;/em&gt; and &lt;em&gt;Next&lt;/em&gt;
buttons at the bottom of the window.&lt;/p&gt;

&lt;p&gt;The API (certainly not finished yet) currently looks like this:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;(wizard &amp;amp; components)
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;where each Swing &lt;code&gt;component&lt;/code&gt; corresponding to one wizard screen can be
augmented by a supplementary map, which can contain, &lt;em&gt;inter alia&lt;/em&gt;, a
function to execute upon showing the screen in question.&lt;/p&gt;

&lt;p&gt;Now, I want those functions to be able to access the &lt;em&gt;Back&lt;/em&gt; and &lt;em&gt;Next&lt;/em&gt;
buttons in case they want to disable or enable them at need.  I thus
want the API user to be able to use two symbols, &lt;code&gt;back-button&lt;/code&gt; and
&lt;code&gt;next-button&lt;/code&gt;, in the macro body, and have them bound to the
corresponding buttons.&lt;/p&gt;

&lt;p&gt;It is crucial that these bindings be lexical and not dynamic.  If
they were dynamic, they would be only effective during the definition
of the wizard, but not when my closures are invoked later on.  Thus,
my implementation looks like this:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;(defmacro wizard [&amp;amp; panels]
  `(let [~'back-button (button &quot;&amp;lt; Back&quot;)
         ~'next-button (button &quot;Next &amp;gt;&quot;)]
   (do-wizard ~'back-button ~'next-button ~(vec panels))))
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;where &lt;code&gt;do-wizard&lt;/code&gt; is a private function implementing the actual wizard
creation, and the &lt;code&gt;~'foo&lt;/code&gt; syntax forces symbol capture.&lt;/p&gt;

&lt;p&gt;By the way, if all goes well, this blog post should be the first one
syndicated to Planet Clojure.  Hello, Planet Clojure readers!&lt;/p&gt;
</description>
  </item>
  <item>
    <title>Hiking in the Apennines</title>
    <link>http://blog.danieljanus.pl/2010/04/04#apennines-hiking</link>
    <description>&lt;p&gt;I&amp;#8217;ve recently done a week-long hike in the Umbria-Marche region of
the Italian Apennines (the vicinity of &lt;a href=&quot;http://en.wikipedia.org/wiki/Monte_Catria&quot;&gt;Monte Catria&lt;/a&gt;, near
&lt;a href=&quot;http://en.wikipedia.org/wiki/Cantiano&quot;&gt;Cantiano&lt;/a&gt;, to be more precise), and here are some tips I&amp;#8217;d like to
share.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The Umbria-Marche Apennine doesn&amp;#8217;t seem to be frequented by a lot
of tourists, especially in mid-March.  The information offices, although 
helpful, are often closed (this is not only the case with the mountain
region: contrary to information available on the Web, the tourist
information at Forli airport was closed on Sunday morning), 
and most of the Italians we&amp;#8217;ve met didn&amp;#8217;t speak English.&lt;/li&gt;
&lt;li&gt;The tourist trails in the region are not well marked.  Direction marks
are nowhere to be found, nor are the signs visible on junctions.
We had to ask the locals when leaving Cantiano for Monte Tenetra 
(and ended up on M. Alto instead anyway).&lt;/li&gt;
&lt;li&gt;There are a lot of &lt;em&gt;rifugi&lt;/em&gt; (mountain huts), but most of them are
closed at this time of year.  We passed by six or seven, out of which
only one was available for sleep: Rifugio Fonte del Faggio (depicted), 
merely a small bothy with one worm-eaten bunk bed.  Another one, 
&lt;a href=&quot;http://www.montecatria.com/it/rifugi/rifugio_cupa_delle_cotaline.aspx&quot;&gt;Cupa delle Cotaline&lt;/a&gt;, with restaurant facilities and situated by 
a station of a local skilift, opened in the morning, but was closed 
for the night.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;img src=&quot;http://danieljanus.pl/photo/faggio.jpg&quot; title=&quot;Rifugio Fonte del Faggio&quot;/&gt;&lt;/p&gt;

&lt;p class=&quot;center&quot;&gt;Rifugio Fonte del Faggio&lt;/p&gt;
</description>
  </item>
  <item>
    <title>The pitfalls of `lein swank`</title>
    <link>http://blog.danieljanus.pl/2010/03/31#lein-swank</link>
    <description>&lt;p&gt;A couple of weeks ago I finally got around to acquainting myself with
&lt;a href=&quot;http://github.com/technomancy/leiningen&quot;&gt;Leiningen&lt;/a&gt;, one of the most popular build tools for Clojure.  The
thing that stopped me the most was that Leiningen uses &lt;a href=&quot;http://maven.apache.org/&quot;&gt;Maven&lt;/a&gt; under
the hood, which seemed a scary beast at first sight &amp;#8211; but once I&amp;#8217;ve
overcome the initial fear, it turned out to be a quite simple and
useful tool.&lt;/p&gt;

&lt;p&gt;One feature in particular is very useful for Emacs users like me:
&lt;code&gt;lein swank&lt;/code&gt;.  You define all dependencies in &lt;code&gt;project.clj&lt;/code&gt; as usual,
add a magical line to &lt;code&gt;:dev-dependencies&lt;/code&gt;, then say&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;#036; lein swank
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;and lo and behold, you can &lt;code&gt;M-x slime-connect&lt;/code&gt; from your Emacs and
have all the code at your disposal.&lt;/p&gt;

&lt;p&gt;There is, however, an issue that you must be aware of when using &lt;code&gt;lein
swank&lt;/code&gt;: Leiningen uses a custom class loader &amp;#8211; &lt;a href=&quot;http://www.docjar.com/docs/api/org/apache/tools/ant/AntClassLoader.html&quot;&gt;AntClassLoader&lt;/a&gt; to be
more precise &amp;#8211; to load the Java classes referenced by the code.
Despite being a seemingly irrelevant thing &amp;#8211; an implementation detail
&amp;#8211; this can bite you in a number of most surprising and obscure ways.
Try evaluating the following code in a Leiningen REPL:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;(str (.decode
       (java.nio.charset.Charset/forName &quot;ISO-8859-2&quot;)
       (java.nio.ByteBuffer/wrap
         (into-array Byte/TYPE (map byte [-79 -26 -22])))))
==&amp;gt; &quot;???&quot;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;The same code evaluated in a plain Clojure REPL will give you &lt;code&gt;&quot;ąćę&quot;&lt;/code&gt;,
which is a string represented in ISO-8859-2 by the three bytes from
the above snippet.&lt;/p&gt;

&lt;p&gt;Whence the difference?  Internally, each charset is represented as a
unique instance of its specific class.  These are loaded lazily as
needed by the &lt;code&gt;Charset/forName&lt;/code&gt; method.  Presumably, the system class
loader is used for that, and somewhere along the way a
SecurityException gets thrown and caught.&lt;/p&gt;

&lt;p&gt;Note also that there are parts of Java API which use the charset
lookup under the hood and are thus vulnerable to the same problem,
for example &lt;code&gt;Reader&lt;/code&gt; constructors taking charset names.  If you use
&lt;code&gt;clojure.contrib.duck-streams&lt;/code&gt;, then rebinding &lt;code&gt;*default-encoding*&lt;/code&gt;
will not work from a Leiningen REPL.  Jars and überjars produced by
Leiningen should be fine, though.&lt;/p&gt;
</description>
  </item>
  <item>
    <title>Downcasing strings</title>
    <link>http://blog.danieljanus.pl/2010/02/16#downcasing</link>
    <description>&lt;p&gt;I just needed to convert a big (around 200 MB) text file, encoded in
UTF-8 and containing Polish characters, all into lowercase.  &lt;code&gt;tr&lt;/code&gt; to
the rescue, right?  Well, not quite.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;#036; echo ŻŹŚÓŃŁĘĆĄ | tr A-ZĄĆĘŁŃÓŚŹŻ a-ząćęłńóśźż
żźśóńłęćą
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Looks reasonable (apart from the fact that I need to specify an
explicit character mapping &amp;#8212; it would be handy to just have a
&lt;code&gt;lcase&lt;/code&gt; utility or suchlike); but here&amp;#8217;s what happens on another
random string:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;#036; echo abisyński | tr A-ZĄĆĘŁŃÓŚŹŻ a-ząćęłńóśźż
abisyŅski
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;I was just about to report this as a bug, when I spotted the following
in the manual:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Currently &lt;code&gt;tr&lt;/code&gt; fully supports only single-byte characters.
  Eventually it will support multibyte characters; when it does, the
  &lt;code&gt;-C&lt;/code&gt; option will cause it to complement the set of characters,
  whereas &lt;code&gt;-c&lt;/code&gt; will cause it to complement the set of values.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Turns out some of the basic tools don&amp;#8217;t support multibyte encodings.
&lt;code&gt;dd conv=lcase&lt;/code&gt;, for instance, doesn&amp;#8217;t even pretend to touch non-ASCII
letters, and perl&amp;#8217;s &lt;code&gt;tr&lt;/code&gt; operator likewise fails miserably even when
one specifies &lt;code&gt;use utf8&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;This is a sad, sad state of affairs.  It&amp;#8217;s 2010, UTF-8 has been around
for seventeen years, and it&amp;#8217;s still not supported by one of the core
operating system components as other encodings are becoming more and
more obsolete.  I&amp;#8217;m dreaming of the day my system uses it internally
for everything.&lt;/p&gt;

&lt;p&gt;Fortunately, not everything is broken.  Gawk, for example, works:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;#036; echo koŃ i żÓłw | gawk '{ print tolower(&amp;#036;0); }'
koń i żółw
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;and so does sed.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Update 2010-04-04:&lt;/em&gt; I should have been more specific.  The above rant
applies to the GNU tools (&lt;code&gt;tr&lt;/code&gt; and &lt;code&gt;dd&lt;/code&gt;) as found in most Linux
distributions; other versions can be more featureful.  As &lt;a href=&quot;http://alexott.net/&quot;&gt;Alex Ott&lt;/a&gt;
points out in an email comment, &lt;code&gt;tr&lt;/code&gt; on OS X works as expected for
characters outside of ASCII, and also supports character classes as in
&lt;code&gt;tr '[:upper:]' '[:lower:]'&lt;/code&gt;.  This is yet another testimony to
general high quality of Apple software; in this particular case,
though, it may well be a direct effect of OS X&amp;#8217;s BSD heritage.  Does
it work on *BSD?&lt;/p&gt;
</description>
  </item>
  <item>
    <title>Clojure SET</title>
    <link>http://blog.danieljanus.pl/2010/02/10#clojure-set</link>
    <description>&lt;p&gt;I&amp;#8217;ve just taken a short breath off work to put &lt;a href=&quot;http://github.com/nathell/setgame&quot;&gt;some code&lt;/a&gt; on GitHub
that I had written over one night some two months ago.  It is an
implementation of the &lt;a href=&quot;http://en.wikipedia.org/wiki/Set_(game)&quot;&gt;Set&lt;/a&gt; game in Clojure, using Swing for GUI.&lt;/p&gt;

&lt;p&gt;I do not have time to clean up or comment the code, so I&amp;#8217;m leaving it
as is for now; however, I hope that even in its current state it can
be of interest, especially for Clojure learners.&lt;/p&gt;

&lt;p&gt;Some random notes on the code:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Clojure is concise!  The whole thing is just under 250 lines of
code, complete with game logic and the GUI.  Of these, the logic
is about 50 LOC.  Despite this it reads clearly and has been 
a pleasure to write, thanks to Clojure&amp;#8217;s supports for sets as
a data structure (in vein of the game&amp;#8217;s title and theme).&lt;/li&gt;
&lt;li&gt;There are no graphics included.  All the drawing is done in the
GUI part of code (I&amp;#8217;ve replaced the canonical squiggle shape
by a triangle and stripes by gradients, for the sake of easier 
drawing).&lt;/li&gt;
&lt;li&gt;I&amp;#8217;ve toyed around with different Swing layout managers for this
game.  Back in the days when I wrote in plain Java, I used to use
&lt;a href=&quot;https://tablelayout.dev.java.net/&quot;&gt;TableLayout&lt;/a&gt;, but it has a non-free license; &lt;a href=&quot;http://www.jgoodies.com/freeware/forms/&quot;&gt;JGoodies Forms&lt;/a&gt; is
also nice, but has a slightly more complicated API (and it&amp;#8217;s an
additional dependency, after all).  In the end I&amp;#8217;ve settled with
the standard GridBagLayout, which is similar in spirit to those
two, but requires more boilerplate to set up.  As it turned out,
simple macrology makes it quite pleasurable to use; see &lt;code&gt;add-gridbag&lt;/code&gt;
in the code for details.&lt;/li&gt;
&lt;li&gt;Other things of interest might be my function to randomly shuffle
seqs, which strikes a nice balance between simplicity/conciseness
of implementation and randomness; and a useful debugging macro. &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Comments?&lt;/p&gt;
</description>
  </item>
  <item>
    <title>Reactivation (and some ramblings on my blogging infrastructure)</title>
    <link>http://blog.danieljanus.pl/2010/01/18#reactivation</link>
    <description>&lt;p&gt;This blog has not seen content updates in more than a year.  Plenty of
things can happen in such a long period, and in fact many aspect of my
life have seen major changes over this time.  I&amp;#8217;m not, however, going
to write a lengthy post about all that right now.  Instead, I just
would like to announce the reactivation of the blog.&lt;/p&gt;

&lt;p&gt;You might have noticed that many things have changed.  First, the blog
has a new address: &lt;a href=&quot;http://blog.danieljanus.pl&quot;&gt;http://blog.danieljanus.pl&lt;/a&gt;; the address of the
RSS feed has also changed and is now
&lt;a href=&quot;http://blog.danieljanus.pl/index.rss&quot;&gt;http://blog.danieljanus.pl/index.rss&lt;/a&gt; &amp;#8212; please update your
readers!&lt;/p&gt;

&lt;p&gt;Probably the most important change is that you now may post comments
under the entries, even though this blog continues to be just a bunch
of static HTML pages.  This is possible thanks to the &lt;a href=&quot;http://disqus.com/&quot;&gt;Disqus&lt;/a&gt;
service.  I wonder whether it will encourage people to give feedback:
I have received very few email comments since I started blogging.
Also, the static calendar at the top of each page is gone, replaced by
a bunch of links to archive posts.&lt;/p&gt;

&lt;p&gt;I have long been considering changing &lt;a href=&quot;http://www.blosxom.com/&quot;&gt;Blosxom&lt;/a&gt; to something else.
The main reason for such a step is that it&amp;#8217;s written in Perl, which
makes it particularly hard to debug upon encountering an unexpected
behaviour.  The single most irritating thing was that Blosxom would
unexpectedly change the date of a post that was edited (which did not
let me fix typos and other glitches); I found a patch for this
somewhere, but lost it.&lt;/p&gt;

&lt;p&gt;On the other hand, I really liked &amp;#8212; and still like &amp;#8212; Blosxom&amp;#8217;s
minimalistic approach and the ease of adding posts.  (The very idea of
installing a monstrosity such as Wordpress, with its gazillion of
features I don&amp;#8217;t need, posts kept in a database and what not, makes me
feel dizzy.)  I fiddled for a while with the thought of reimplementing
Blosxom in Common Lisp, but that turned out to be a more
time-consuming project than it initially seemed.  So when I found &lt;a href=&quot;http://blosxom.ookee.com/&quot;&gt;The
Unofficial Blosxom User Group&lt;/a&gt; and learned that, contrary to my
belief, Blosxom is still actively maintained and has a thriving
community, I ended up staying with the original Perl version, refining
my installation so that it no longer gets in the way (&lt;a href=&quot;http://blosxom.ookee.com/blog/help/howto_update_posts_without_making_the_date_change.html&quot;&gt;this FAQ
entry&lt;/a&gt; did the trick).  I also rewrote all my source text
files to &lt;a href=&quot;http://daringfireball.net/projects/markdown/&quot;&gt;Markdown&lt;/a&gt;, which made them vastly more readable and easy to
edit, updating links and adding short followup notes where
appropriate, but otherwise leaving old entries as they were.&lt;/p&gt;

&lt;p&gt;I&amp;#8217;d like to thank &lt;a href=&quot;http://www.3ofcoins.net/2010/01/08/revive-the-blog-project-52/&quot;&gt;Maciek Pasternacki&lt;/a&gt; for inspiring me to finally
get around to this.  While my plans are not as ambitious as his &amp;#8212; I
am not courageous enough to publicly prove my perseverance, so my
blogging will likely continue to be irregular &amp;#8212; I plan to write more
(having accumulated many ideas for blog posts) and I hope the periods
of silence will be much shorter than hitherto.&lt;/p&gt;

&lt;p&gt;I would like to take this opportunity to wish my readers all the best
in the New Year!&lt;/p&gt;
</description>
  </item>
  <item>
    <title>Google Books</title>
    <link>http://blog.danieljanus.pl/2009/01/02#google-books</link>
    <description>&lt;p&gt;Yesterday, upon a midnight dreary, while I pondered, weak and weary,
over &lt;a href=&quot;http://mitpress.mit.edu/algorithms/&quot;&gt;a renowned volume of the olden lore&lt;/a&gt; (and specifically,
upon one of the problems contained in the Polish translation of the
first edition), I suddenly felt a need to consult the original
version, to check whether there are no mistranslations or unincluded
corrections for my copy.  So I headed for &lt;a href=&quot;http://books.google.com&quot;&gt;Google Book Search&lt;/a&gt;, and
apart from finding what I needed, I followed a link that sounded
interesting.  Quoth the link, &lt;a href=&quot;http://books.google.com/googlebooks/agreement/&quot;&gt;&amp;#8220;Groundbreaking Agreement&amp;#8221;&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Basically, what it all boils to is two pieces of news &amp;#8212; you guessed
it, a good one and a bad one.  The good news is that Google have come
to agreement with several major U.S. publishers that will allow them
to provide online access to digitized copies of out-of-print but still
copyrighted books.  &lt;em&gt;Lots&lt;/em&gt; of books, and even though the service is
not going to be free, that means all this richness will be at the
fingertips &amp;mdash; no more need to travel half the world to the
Library of Congress to get one of the rare copies we&amp;#8217;re after.  Sounds
cool, huh?  Well, here comes the bad news: it will only be available
to U.S. citizens.&lt;/p&gt;

&lt;p&gt;Or will it?&lt;/p&gt;

&lt;p&gt;I wonder how are they going to check for this precondition.  IP-based
geolocalization springs to mind.  And unless they blacklist some IPs
or restrict the credit cards used for payment, all I will need is some
proxy on some server physically in the U.S.  Say, a shell account
on someone&amp;#8217;s Linux box.  I remember reading a Polish blog post about
gaining access to American-exclusive content of some website (last.fm
I believe it was) in a similar way.  Hmm, hmm.  We will see.&lt;/p&gt;

&lt;p&gt;So, anyone got a shell account to spare?&lt;/p&gt;
</description>
  </item>
  <item>
    <title>anti-procrastination.el</title>
    <link>http://blog.danieljanus.pl/2008/12/18#fighting-procrastination</link>
    <description>&lt;p&gt;Fighting procratination has been my major concern these days.  I&amp;#8217;ve
devised a number of experimental tools to help me with that.  One of
them is called &lt;a href=&quot;http://bach.ipipan.waw.pl/~nathell/projects/snafu.php&quot;&gt;snafu&lt;/a&gt; and can generate reports of your activity
throughout the whole day of work.  It&amp;#8217;s in a preliminary state, but
works (at least since I&amp;#8217;ve found and fixed a long-standing bug in it
which would cause it to barf every now and then), and I already have a
number of ideas for its further expansion.&lt;/p&gt;

&lt;p&gt;Reports alone, however, do not quite muster enough motivation for
work.  I&amp;#8217;m doing most of my editing/programming work in Emacs, so
yesterday I grabbed the Emacs Lisp manual and came up with a couple
of extra lines at the end of my &lt;code&gt;.emacs&lt;/code&gt;.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;;;; Written by Daniel Janus, 2008/12/18.
;;; This snippet is placed into the public domain.  Feel free
;;; to use it in any way you wish.  I am not responsible for
;;; any damage resulting from its usage.

(defvar store-last-modification-time t)
(defvar last-modification-time nil)
(defun mark-last-modification-time (beg end len)
  (let ((b1 (substring (buffer-name (current-buffer)) 0 1)))
    (when (and store-last-modification-time 
               (not (string= b1 &quot; &quot;))
               (not (string= b1 &quot;*&quot;)))
      (setq last-modification-time (current-time)))))
(add-hook 'after-change-functions 'mark-last-modification-time)
(defun write-lmt ()
  (setq store-last-modification-time nil)
  (when last-modification-time
    (with-temp-file &quot;/tmp/emacs-lmt&quot;
      (multiple-value-bind (a b c) last-modification-time
        (princ a (current-buffer))
        (terpri (current-buffer))
        (princ b (current-buffer)))))
  (setq store-last-modification-time t))
(run-at-time nil 1 'write-lmt)
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Every second (to change that to every 10 seconds, change the &lt;code&gt;1&lt;/code&gt; to
&lt;code&gt;10&lt;/code&gt; in the last line) it creates a file named &lt;code&gt;/tmp/emacs-lmt&lt;/code&gt; which
contains the time of last modification of any non-system buffer.&lt;/p&gt;

&lt;p&gt;That&amp;#8217;s all there is to it, at least on the Emacs side.  The other part
is a simple shell script, which uses &lt;a href=&quot;http://www.mplayerhq.hu&quot;&gt;MPlayer&lt;/a&gt; to display a nag-screen for
five seconds, and then give me some time to start doing anything
useful before nagging me again:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;#!/bin/bash
TIMEOUT=300
while true; do
   cat /tmp/emacs-lmt | (
      read a; read b; 
      c=&quot;`date +%s`&quot;; 
      let x=c-65536*a-b; 
      if test &amp;#036;x -gt &amp;#036;TIMEOUT; 
          then mplayer -fs &amp;#036;HOME/p.avi; 
               sleep 15; 
      fi)
   sleep 1
done
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;The nag-screen in my case is an animation which I&amp;#8217;ve created using
MEncoder from a single frame which looks &lt;a href=&quot;http://bach.ipipan.waw.pl/~nathell/procrastination.png&quot;&gt;like this&lt;/a&gt;.  Beware
the expletives!  (This is one of the few cases I find their usage
justified, as the strong message bites the conscience more strongly.)&lt;/p&gt;

&lt;p&gt;I&amp;#8217;ve only been testing this setup for one day, but so far it&amp;#8217;s
working flawlessly: I got more done yesterday than for the two
previous days combined, and that&amp;#8217;s excluding the hour or so
that took me to write these snippets.&lt;/p&gt;

&lt;p&gt;If anyone else happens to give it a try, I&amp;#8217;d love to hear any
comments.&lt;/p&gt;
</description>
  </item>
  <item>
    <title>The immensely powerful tool</title>
    <link>http://blog.danieljanus.pl/2008/09/23#immensely-powerful-tool</link>
    <description>&lt;p&gt;A pen and a sheet of paper are simple utilities; but there lies vast
and sheer power in them that I was not aware of.  Up until now.  So
what can they be used for that one might possibly not realize?&lt;/p&gt;

&lt;p&gt;Short answer: serializing the stream of consciousness.&lt;/p&gt;

&lt;p&gt;Yes, it&amp;#8217;s simple, and you may laugh at me now.  I myself am a little
amazed why I haven&amp;#8217;t noticed this before.  But this answer lends
itself to another question: what good is this serialization, and what
exactly do I mean by it, anyway?  And the answer to &lt;em&gt;that&lt;/em&gt; is a little
longer.  So here goes.&lt;/p&gt;

&lt;p&gt;I&amp;#8217;m one of the people who tend to have problems with concentrating
when thinking, especially when thinking hard.  This is not to say that
I am not capable of thinking hard: I am, but doing so requires a level
of concentration that is tricky for me to exert for a prolonged
period.  (Unless, of course, I am in the state of absolute
fascination, where this is taken care of subconsciously.  But that&amp;#8217;s
another story.)  More often than not, a tough problem requiring a
significant amount of work just has to be dealt with.  And then things
start to distract attention.  There is an itch to scratch, thoughts
are shreds, each one pertaining to a tiny bit of the problem, but
intertwined with hundreds of other bits of other problems, forming a
dense, tangled web, hard to navigate over, and jumping fast from one
to another, it becomes more and more unclear what&amp;#8217;s next.&lt;/p&gt;

&lt;p&gt;So what can one do?  One way is to grab a writing device and just
&lt;em&gt;start writing&lt;/em&gt;.  Running text is linear in nature, so you end up
traversing the thought graph depth-first and writing down each thought
as you traverse its node.  And what&amp;#8217;s more, translating ideas to
written language &lt;em&gt;slows you down&lt;/em&gt;, which is a &lt;a href=&quot;http://www.catb.org/jargon/html/G/Good-Thing.html&quot;&gt;Good Thing&lt;/a&gt; because it
makes you see your way through the graph more consciously.  It might
take you longer to walk from point A to point B than to drive there by
car, but definitely you will see more of the landscape as you go.
Arriving at the final destination, or simply putting down the pen
because enough thoughts have been collected and serialized (there&amp;#8217;s
never really any end of the stream), makes you end up with a
half-product: an unsmithed lump of ore out of which you can forge
ingots.&lt;/p&gt;

&lt;p&gt;But why a pen and paper, as opposed to, say, a text editor?  I think
any writing utensil would work to some extent, but for me this seems
to be the best option, for several reasons.  First of all, I can type
on the keyboard much faster than I can write legibly by hand, so this
further slows down the pace (which is a Good Thing as we have observed
already).&lt;/p&gt;

&lt;p&gt;Second, there is something magical in handwriting which a text editor
will never be able to achieve: it&amp;#8217;s hard to describe.  But the net
effect is a very evident focus on Here and Now, the pen moving across
the paper, the sheet filling up with more and more lines of script.
This environment is naturally single-tasked: no Alt-Tab to press to
switch to another terminal, no blinking icon of an instant-messaging
program (unless a phone happens to ring).  This causes synergy with
the concentration caused by serializing thoughts.&lt;/p&gt;

&lt;p&gt;If you have never tried this approach, feel free to do so.  Although I
cannot guarantee it will work for you, it certainly does work for me.&lt;/p&gt;
</description>
  </item>
  <item>
    <title>Who said Common Lisp programs cannot be small?</title>
    <link>http://blog.danieljanus.pl/2008/08/09#small-lisp</link>
    <description>&lt;p&gt;So, how much disk space does your average CL image eat up?  A hundred
megs?  Fifty?  Twenty?  Five, perhaps, if you&amp;#8217;re using LispWorks with
a tree-shaker?  Well then, how about this?&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;[nathell@chamsin salza2-2.0.4]&amp;#036; ./cl-gzip closures.lisp test.gz
[nathell@chamsin salza2-2.0.4]&amp;#036; gunzip test
[nathell@chamsin salza2-2.0.4]&amp;#036; diff closures.lisp test 
[nathell@chamsin salza2-2.0.4]&amp;#036; ls -l cl-gzip 
-rwxr-xr-x 1 nathell nathell 386356 2008-08-09 11:08 cl-gzip
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;That&amp;#8217;s right.  A standalone executable of a mini-gzip, written in
Common Lisp, taking up &lt;em&gt;under 400K!&lt;/em&gt;  And it only depends on
glibc and GMP, which are available by default on pretty much every
Linux installation.  (This is on a 32-bit x86 machine, by the way).&lt;/p&gt;

&lt;p&gt;I used the most recent version of &lt;a href=&quot;http://ecls.sourceforge.net&quot;&gt;ECL&lt;/a&gt; for compiling this tiny
example.  The key to the size was configuring ECL with
&lt;code&gt;--disable-shared --enable-static CFLAGS=&quot;-Os -ffunction-sections
-fdata-sections&quot; LDFLAGS=&quot;-Wl,-gc-sections&quot;&lt;/code&gt;.  This essentially gives
you a poor man&amp;#8217;s tree shaker for free at a linker level.  And ECL in
itself produces comparatively tiny code.&lt;/p&gt;

&lt;p&gt;I build this example from &lt;a href=&quot;http://www.xach.com/lisp/salza2&quot;&gt;Salza2&lt;/a&gt;&amp;#8217;s source by loading the following
code snippet:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;(defvar salza '(&quot;package&quot; &quot;reset&quot; &quot;specials&quot; 
&quot;types&quot; &quot;checksum&quot; &quot;adler32&quot; &quot;crc32&quot; &quot;chains&quot;
&quot;bitstream&quot; &quot;matches&quot; &quot;compress&quot; &quot;huffman&quot;
&quot;closures&quot; &quot;compressor&quot; &quot;utilities&quot; &quot;zlib&quot;
&quot;gzip&quot; &quot;user&quot;))

(defvar salza2 
  (mapcar (lambda (x) (format nil &quot;~A.lisp&quot; x))
          salza))

(defvar salza3 
  (mapcar (lambda (x) (format nil &quot;~A.o&quot; x))
          salza))

(defun build-cl-gzip ()
  (dolist (x salza2)
          (load x)
          (compile-file x :system-p t))
  (c:build-program 
   &quot;cl-gzip&quot; 
   :lisp-files salza3
   :epilogue-code 
     '(progn
       (in-package :salza2)
       (gzip-file (second (si::command-args))
                  (third (si::command-args))))))

(build-cl-gzip)
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;(Sadly enough, there&amp;#8217;s no ASDF in here.  I have yet to figure out how
to leverage ASDF to build small binaries in this constrained
environment.)&lt;/p&gt;

&lt;p&gt;This gave me a standalone executable 1.2 meg in size.  I then
proceeded to compress it with &lt;a href=&quot;http://upx.sourceforge.net&quot;&gt;UPX&lt;/a&gt; (with arguments &lt;code&gt;--best
--crp-ms=999999&lt;/code&gt;) and got the final result.  How cool is that?&lt;/p&gt;

&lt;p&gt;I am actively looking for a new job.  If you happen to like my
writings and think I might be just the right man for the team you&amp;#8217;re
building up, please feel free to consult my &lt;a href=&quot;http://bach.ipipan.waw.pl/~nathell/cv-en.pdf&quot;&gt;résumé&lt;/a&gt; or pass it on.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Update 2010-Jan-17&lt;/em&gt;: the above paragraph is no longer valid.&lt;/p&gt;
</description>
  </item>
  <item>
    <title>cl-morfeusz: A ninety minutes&amp;#8217; hack</title>
    <link>http://blog.danieljanus.pl/2008/06/29#cl-morfeusz</link>
    <description>&lt;p&gt;Here&amp;#8217;s what I came up with today, after no more than 90 minutes of
coding (complete with comments and all):&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;MORFEUSZ&amp;gt; (morfeusz-analyse &quot;zażółć gęślą jaźń&quot;)
((0 1 &quot;zażółć&quot; &quot;zażółcić&quot; &quot;impt:sg:sec:perf&quot;)
 (1 2 &quot;gęślą&quot; &quot;gęśl&quot; &quot;subst:sg:inst:f&quot;)
 (2 3 &quot;jaźń&quot; &quot;jaźń&quot; &quot;subst:sg:nom.acc:f&quot;))
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;This is &lt;a href=&quot;http://danieljanus.pl/code/morfeusz.lisp&quot;&gt;cl-morfeusz&lt;/a&gt; in action, a Common Lisp interface to
&lt;a href=&quot;http://nlp.ipipan.waw.pl/~wolinski/morfeusz/&quot;&gt;Morfeusz&lt;/a&gt;, the morphological analyser for Polish.&lt;/p&gt;

&lt;p&gt;It&amp;#8217;s a single Lisp file, so there&amp;#8217;s no ASDF system definition or
asdf-installability for now.  I&amp;#8217;m not putting it under version
control, either.  Or, should I say, not yet.  When I get around to it,
I plan to write a simple parser and write a Polish-language version of
&lt;a href=&quot;http://en.wikipedia.org/wiki/Colossal_Cave_Adventure&quot;&gt;the text adventure that started it all&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Meanwhile, you may use cl-morfeusz for anything you wish (of course,
as long as you comply with Morfeusz&amp;#8217;s license).  Have fun!&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Update 2010-Jan-17:&lt;/em&gt; With the advent of UTF-8 support in CFFI, the
ugly workarounds in the code are probably no longer necessary; I don&amp;#8217;t
have time to check it right now, though.&lt;/p&gt;
</description>
  </item>
  <item>
    <title>You win some, you lose some, you talk some</title>
    <link>http://blog.danieljanus.pl/2008/06/23#you-win-some</link>
    <description>&lt;p&gt;After my &lt;a href=&quot;http://blog.danieljanus.pl/im-not-playing-this-stupid-game-anymore.html&quot;&gt;shameful performance&lt;/a&gt; in the previous tournament, this
weekend saw my greatest achievement in tournament Scrabble to date:
that of advancing to the quarterfinals of the Cup of Poland.  For the
record, &lt;a href=&quot;http://www.pfs.org.pl/turnieje/2008/w080622.txt&quot;&gt;here&lt;/a&gt; are the final standings.  In the
quarterfinal, I lost both games to Tomasz Zwoliński (the former
Champion of Poland), who went on to win the Cup.&lt;/p&gt;

&lt;p&gt;On Thursday, I will be delivering a presentation about the dark side
of programming: error handling and how to cope up with Murphy&amp;#8217;s law.
The talk will last around 30 minutes and be held within &lt;a href=&quot;http://aulapolska.pl&quot;&gt;TechAula&lt;/a&gt;, a
place to hear about exciting and revolutionary technologies in
software engineering.  Feel invited to register and show up.&lt;/p&gt;

&lt;p&gt;(Postscriptum 11 July: By public demand, the slides from my talk are
now &lt;a href=&quot;http://danieljanus.pl/2008-aula-errorhandling.pdf&quot;&gt;available for download&lt;/a&gt;.)&lt;/p&gt;
</description>
  </item>
  <item>
    <title>Another metapost</title>
    <link>http://blog.danieljanus.pl/2008/06/19#another-metapost</link>
    <description>&lt;p&gt;No, I am not going to write about &lt;a href=&quot;http://foundry.supelec.fr/projects/metapost/&quot;&gt;the programming language for
generating vector graphics&lt;/a&gt;.  This is not a real post, but
rather a note to self to write ones on certain topics once I get ready
for that.  And as for today&amp;#8217;s title, I just couldn&amp;#8217;t resist the pun.
&lt;em&gt;;-)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;I&amp;#8217;ve been rewriting the Poliqarp Java (GUI) client for the last two
weeks or so.  The point is to convert it to use &lt;a href=&quot;http://bach.ipipan.waw.pl/~nathell/blog/poliqarp-new-protocol.html&quot;&gt;the new protocol&lt;/a&gt;,
and to take the opportunity of turning a messy, kludgey and
bit-rotting pile of code into a neatly decoupled, cleanly designed,
robust and comprehensible utility.  And the further I get, the more I
see how much it&amp;#8217;s worth it.  I strongly believe that at the end of
this path, upon remergence with the mainline, Poliqarp will become
better than ever before.&lt;/p&gt;

&lt;p&gt;Thus, when I have something to show (I hope to deliver a preliminary
working version, though not yet feature-complete, within the upcoming
week or so), I will probably brag about the design solutions I&amp;#8217;ve
taken.  While I&amp;#8217;m at it, I will possibly also write the long-delayed
description of the new build system.&lt;/p&gt;

&lt;p&gt;If there is anybody out there besides me who actually cares for that,
stay tuned!&lt;/p&gt;
</description>
  </item>
  <item>
    <title>Today&amp;#8217;s lesson: Mind the symlinks</title>
    <link>http://blog.danieljanus.pl/2008/06/11#mind-the-symlinks</link>
    <description>&lt;p&gt;Probably every day I keep learning new things, without even realizing
it most of the time.  The vast majority of them are minor or even tiny
tidbits of knowledge; but even these might be worth noting down from
time to time, especially when they are tiny pitfalls I&amp;#8217;d fallen into
and spent a couple of minutes getting out.  By sharing them, I might
hopefully prevent someone else for slipping and falling in.&lt;/p&gt;

&lt;p&gt;So here&amp;#8217;s a simple Unix question: If you enter a subdirectory of the
current directory and back to &lt;code&gt;..&lt;/code&gt;, where will you end up?  The most
obvious answer is, of course, &amp;#8220;in the original directory&amp;#8221;, and is
mostly correct.  But is it always?  Let&amp;#8217;s see.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;nathell@breeze:~&amp;#036; pwd
/home/nathell
nathell@breeze:~&amp;#036; cd foobar
nathell@breeze:~/foobar&amp;#036; cd ..
nathell@breeze:~&amp;#036; pwd
/home/nathell
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;So the hypothesis seems to be right.  But let&amp;#8217;s try doing this in
Python, just for the heck of it:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;nathell@breeze:~&amp;#036; python
Python 2.5.2 (r252:60911, Apr 21 2008, 11:12:42) 
[GCC 4.2.3 (Ubuntu 4.2.3-2ubuntu7)] on linux2
Type &quot;help&quot;, &quot;copyright&quot;, &quot;credits&quot; or &quot;license&quot; for more information.
&amp;gt;&amp;gt;&amp;gt; import os
&amp;gt;&amp;gt;&amp;gt; print os.getcwd()
/home/nathell
&amp;gt;&amp;gt;&amp;gt; os.chdir(&quot;foobar&quot;)
&amp;gt;&amp;gt;&amp;gt; os.chdir(&quot;..&quot;)
&amp;gt;&amp;gt;&amp;gt; print os.getcwd()
/var
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Whoa, hang on!  What&amp;#8217;s that &lt;code&gt;/var&lt;/code&gt; doing there?  Of course the one
thing I didn&amp;#8217;t tell you is that &lt;code&gt;foobar&lt;/code&gt; is not really a directory,
but rather a symlink pointing to one (&lt;code&gt;/var/log&lt;/code&gt; in this case).&lt;/p&gt;

&lt;p&gt;The corollary is that the shell builtin &lt;code&gt;cd&lt;/code&gt; is &lt;em&gt;not the same&lt;/em&gt; as Unix
&lt;code&gt;chdir()&lt;/code&gt; (it is easily checked that both Perl and C exhibit the same
behaviour).  In fact, the shell builtin has an oft-forgotten
command-line switch, &lt;code&gt;-P&lt;/code&gt;, which causes it to follow physical instead
of logical path structure.&lt;/p&gt;

&lt;p&gt;On a closing note: I have somewhat neglected the blog throughout the
previous month, but I hope to revive it soon.  It is not unlikely that
such irregularities will recur.&lt;/p&gt;
</description>
  </item>
  <item>
    <title>Recently read #1: Akhmatova meets Bashō (Vasil Bykaŭ, &amp;#8220;The Wall&amp;#8221;)</title>
    <link>http://blog.danieljanus.pl/2008/05/19#recently-read-1</link>
    <description>&lt;p&gt;(Introductory note: This post marks the beginning of a new series on
this blog, aptly titled &amp;#8220;Recently read.&amp;#8221;  Every now and
then I will try to verbalize afterthoughts inspired by the books I
happen to read, and post them here.  I hope these recommendations or
anti-recommmendations might turn out to be useful for someone.)&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;&lt;em&gt;Give me &lt;br /&gt;
  a kiss to build a dream on, &lt;br /&gt;
  and my imagination &lt;br /&gt;
  will thrive upon that kiss; &lt;br /&gt;
  sweetheart, &lt;br /&gt;
  I ask no more than this &amp;#8212; &lt;br /&gt;
  a kiss to build a dream on.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Thusly starts the &lt;a href=&quot;http://www.youtube.com/watch?v=e3PXiV95kwA&quot;&gt;Fallout 2 intro&lt;/a&gt; &amp;#8212; a mini-movie that can be
considered a piece of art in its own right.  Louis Armstrong sings
these words in an abandoned underground cinema, wherein a movie is
displayed, touching on nostalgia for pre-War times as well as severe
dangers that lurk on the surface of the earth.  And then come these
words&amp;#8230;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://www.youtube.com/watch?v=_mcJAI6oRYY&quot;&gt;&amp;#8220;War, war never changes.&amp;#8221;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Just like throughout the entire Fallout saga, these words reverberated
in my mind as I read &amp;#8220;The Wall,&amp;#8221; a collection of short stories by
Vasil Bykaŭ, the late Belarussian writer.&lt;/p&gt;

&lt;p&gt;For the war indeed does not change.  And wherever it appears, it
carries around such an amount of destruction and utter wrongness that
it is next to unimaginable for a generation grown up in a relatively
peaceful place and time such as ours.  In fact, even the words &amp;#8220;utter
wrongness&amp;#8221; do not do justice to what was once an unescapable reality.
There is only one way to find appropriate words: to show it, show it
without overlooking anything, show it dryly and aloofly in all its
hideousness.&lt;/p&gt;

&lt;p&gt;And Bykaŭ does.  There is not a single word of moralizing in these
stories.  There are no high words, and barely even a human thought
beyond fear for life.  There is pure depiction; and yet every word in
this depiction stands firm and cannot be removed without losing the
level of detail called for.  This induces associations with Anna
Akhmatova and her famous &amp;#8220;Requiem,&amp;#8221; which begins as follows:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Это было, когда улыбался &lt;br /&gt;
  только мертвый, спокойствию рад.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&amp;#8220;Это было.&amp;#8221;  &amp;#8220;It happened.&amp;#8221;  These simple words are immensely
powerful.  And the same two words, unspoken, echo throughout the
entire book.  It happened, and it was like this.  Nothing more can, or
should, be told.&lt;/p&gt;

&lt;p&gt;I&amp;#8217;ve mentioned the level of detail; this aspect of these stories
deserves longer comment.  It is imminent that they would not be quite
as powerful were it not for the detail.  One can almost sense the
chill of a dawn rising up above some godforsaken trench somewhere on
the battlefront.  Or shudder at the cold dampness of the soil inside
it.  Or smell the stench of decay rising above a corpse shot several
days ago.  Or feel the almost palpable fear floating in the crossfire
of danger, one on the enemy side, the other shaped as one&amp;#8217;s own
commandment.  Or the gloom with which a small group of soldiers sets
out to dig their final resting place before committing suicide, lest
worse fate befall them.&lt;/p&gt;

&lt;p&gt;These stories are almost &amp;#8220;haikuistic,&amp;#8221; so to speak, in that each one
of them resembles a very thinly cut and faithfully portrayed slice of
reality from which there is no escape.  This shows most strongly in
case of the shortest ones, like &amp;#8220;The Hill,&amp;#8221; which are just several
pages long, but it arguably holds even for the longest text in the
book, the opening novella, &amp;#8220;Love Me, Soldier.&amp;#8221;  (In which, by the way,
Falloutesque associations are particularly strong: imagine a
Belarussian sergeant who finds a fellow countrygirl hiding in a
village in Austria, at the very end of the war, and falls in love with
her.  Doesn&amp;#8217;t that sound like &amp;#8220;a kiss to build a dream on?&amp;#8221;  Well, in
Bykaŭ&amp;#8217;s world, good dreams never come true.)&lt;/p&gt;

&lt;p&gt;I quoted Akhmatova&amp;#8217;s &amp;#8220;it happened.&amp;#8221; Yet, perhaps, the most striking
and saddening impression from &amp;#8220;The Wall&amp;#8221; as a whole, and one that sets
it apart from other war literature, is that this should really read
&amp;#8220;it still happens.&amp;#8221; For the war has ended, but it takes long for a
nation to recover from the scars it left; especially the Belarussian
nation, who have been held captive by various regimes for too long and
have never actually experienced freedom that we take for granted.
Once a wound has been healed, it is all too easy to reopen it.  And
fear for speaking one&amp;#8217;s own language remains the same, war or no war.&lt;/p&gt;

&lt;p&gt;No wonder Bykaŭ&amp;#8217;s writings are still censored in his homeland.  Thanks
to the Internet, though, &lt;a href=&quot;http://kamunikat.org/4108.html&quot;&gt;the full Polish text&lt;/a&gt; of all the
stories is available online.  Highly recommended.&lt;/p&gt;
</description>
  </item>
  <item>
    <title>Inward ripeness</title>
    <link>http://blog.danieljanus.pl/2008/05/05#inward-ripeness</link>
    <description>&lt;blockquote&gt;
  &lt;p&gt;How soon hath Time, the subtle thief of youth, &lt;br /&gt;
  Stol&amp;#8217;n on his wing my three and twentieth year! &lt;br /&gt;
  My hasting days fly on with full career, &lt;br /&gt;
  But my late spring no bud or blossom shew&amp;#8217;th. &lt;br /&gt;
  Perhaps my semblance might deceive the truth &lt;br /&gt;
  That I to manhood am arrived so near; &lt;br /&gt;
  And inward ripeness doth much less appear, &lt;br /&gt;
  That some more timely-happy spirits endu&amp;#8217;th. &lt;br /&gt;
  Yet be it less or more, or soon or slow, &lt;br /&gt;
  It shall be still in strictest measure ev&amp;#8217;n &lt;br /&gt;
  To that same lot, however mean or high, &lt;br /&gt;
  Toward which Time leads me, and the will of Heav&amp;#8217;n:  &lt;/p&gt;
  
  &lt;blockquote&gt;
    &lt;p&gt;All is, if I have grace to use it so, &lt;br /&gt;
    As ever in my great Task-Master&amp;#8217;s eye.  &lt;/p&gt;
  &lt;/blockquote&gt;
&lt;/blockquote&gt;

&lt;p&gt;John Milton is said to have composed this sonnet on his twenty-fourth
birthday, and his thoughts (including, but not limited to, the
criticism of the achievements so far) are very much in line with mine
on my very own 24th birthday.  One wonders what is the programming
equivalent of &amp;#8220;Paradise Lost.&amp;#8221;&lt;/p&gt;
</description>
  </item>
  <item>
    <title>cl-netstrings</title>
    <link>http://blog.danieljanus.pl/2008/04/30#cl-netstrings</link>
    <description>&lt;p&gt;I&amp;#8217;ve just packaged up the Common Lisp netstring handling code that I
&lt;a href=&quot;http://blog.danieljanus.pl/hacking-away-with-json-rpc.html&quot;&gt;wrote a week ago&lt;/a&gt; into a neat library.  Unsurprisingly
enough, it is called cl-netstrings and has its own &lt;a href=&quot;http://github.com/nathell/cl-netstrings&quot;&gt;home on the
Web&lt;/a&gt;.  It&amp;#8217;s even asdf-installable!  I wonder whether 
&lt;em&gt;this one&lt;/em&gt; turns out to be useful for anybody besides me&amp;#8230;&lt;/p&gt;

&lt;p&gt;The other thing I&amp;#8217;ve been working on is a new build system for
Poliqarp.  But that&amp;#8217;s the story for another post &amp;#8212; most probably
I will write about it when it gets out of a state of constant flux.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Update 2010-Jan-17:&lt;/em&gt; cl-netstrings is now hosted on GitHub; I&amp;#8217;ve
updated the link.&lt;/p&gt;
</description>
  </item>
  <item>
    <title>Best OS ever</title>
    <link>http://blog.danieljanus.pl/2008/04/25#best-os-ever</link>
    <description>&lt;p&gt;If you are reading this on a box that does not have an impressive
amount of RAM (say, 512 MB or less) and is running a fairly recent
Linux, then for goodness sake, drop everything you are doing right now
and follow the instructions in this entry.  I&amp;#8217;m going to show you how
to make your system use the memory in a more efficient way, &lt;em&gt;yielding
an effect almost equivalent to increasing its amount &amp;#8212; with no
expenses whatsoever!&lt;/em&gt;  Sounds good?  Read on.&lt;/p&gt;

&lt;p&gt;You see, there&amp;#8217;s this Linux kernel module for kernels 2.6.17 and up
(that&amp;#8217;s what the phrase &lt;em&gt;fairly recent&lt;/em&gt; in the previous paragraph
macroexpands to), called &lt;a href=&quot;http://code.google.com/p/compcache&quot;&gt;Compcache&lt;/a&gt;.  It works by slicing out a
contiguous chunk of your RAM (25% by default, but it&amp;#8217;s settable, of
course) and setting it up as a swap space with highmost priority.  The
trick is that pages that are swapped out to this area are compressed
using the &lt;a href=&quot;http://www.oberhumer.com/opensource/lzo/&quot;&gt;LZO&lt;/a&gt; algorithm, which provides very fast
compression/decompression while maintaining a decent compression
ratio.  In this way, more unused pages can fit in memory, and less of
them are swapped out to disk, which can considerably cut down disk
swap usage.  I&amp;#8217;ve enabled it in my system and it doesn&amp;#8217;t seem to cause
any problems, while providing a visible efficiency boost.  Here&amp;#8217;s how
I did it on a freshly-installed &lt;a href=&quot;http://www.ubuntu.com/products/whatisubuntu/804features/&quot;&gt;Ubuntu Hardy&lt;/a&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;I installed the Ubuntu package &lt;code&gt;build-essential&lt;/code&gt;, then downloaded
Compcache from its site, extracted it, entered its directory and
compiled it by saying &lt;code&gt;make&lt;/code&gt;.  So far, so easy.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Unfortunately, one cannot say &lt;code&gt;make install&lt;/code&gt; &amp;#8212; creating a flexible
cross-distro &lt;code&gt;install&lt;/code&gt; target is admittedly hard.  So I installed it
by hand, ensuring that my system enables it automatically on
boot-up.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;I created a directory
&lt;code&gt;/lib/modules/2.6.24-16-generic/ubuntu/compcache/&lt;/code&gt; and copied the
four kernel modules (&lt;code&gt;compcache.ko&lt;/code&gt;, &lt;code&gt;lzo1x_compress.ko&lt;/code&gt;,
&lt;code&gt;lzo1x_decompress.ko&lt;/code&gt;, and &lt;code&gt;tlsf.ko&lt;/code&gt;) created by the compilation to
that directory.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Next, I ran &lt;code&gt;depmod -a&lt;/code&gt; to make the modules loadable by &lt;code&gt;modprobe&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;I edited the file &lt;code&gt;/etc/modules&lt;/code&gt; and added a line at the end,
containing the single word &lt;code&gt;compcache&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;I copied the shell scripts &lt;code&gt;use_compcache.sh&lt;/code&gt; and
&lt;code&gt;unuse_compcache.sh&lt;/code&gt; that come with compcache to &lt;code&gt;/usr/local/bin&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;I created an executable script &lt;code&gt;/etc/init.d/compcache&lt;/code&gt;
with the following contents:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;#!/bin/sh
case &quot;&amp;#036;1&quot; in
  start)
    /usr/local/bin/use_compcache.sh ;;
  stop)
    /usr/local/bin/unuse_compcache.sh ;;
esac
&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The last step was to create a symlink &lt;code&gt;/etc/rc2.d/S02compcache&lt;/code&gt;
pointing to that script.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I then rebooted the system and verified that the new swapspace is in
use:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;nathell@chamsin:~&amp;#036; cat /proc/swaps
Filename        Type        Size    Used    Priority
/dev/sdb2       partition   996020  0       -1
/dev/ramzswap0  partition   128896  111396  100
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;With the final release of Hardy installed on my main box and compcache
optimizing its memory usage, I do not hesitate to call this combo the
best OS I have ever had installed.&lt;/p&gt;

&lt;p&gt;And no, I don&amp;#8217;t own a Mac.  :-/&lt;/p&gt;
</description>
  </item>
  <item>
    <title>Hacking away with JSON-RPC</title>
    <link>http://blog.danieljanus.pl/2008/04/24#hacking-away-with-json-rpc</link>
    <description>&lt;p&gt;Let&amp;#8217;s try:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;(let ((s (socket-stream 
          (socket-connect &quot;localhost&quot; 10081 
                          :element-type '(unsigned-byte 8)))))
  (write-netstring &quot;{\&quot;method\&quot;:\&quot;ping\&quot;,\&quot;params\&quot;:[],\&quot;id\&quot;:1}&quot; s)
  (finish-output s)
  (princ (read-netstring s))
  (close s))
{ &quot;result&quot;: &quot;pong&quot; }
--&amp;gt; T
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Yay!  This is Common Lisp talking to a &lt;a href=&quot;http://json-rpc.org/&quot;&gt;JSON-RPC&lt;/a&gt; server written in C.
This means that I have now the foundations for rewriting Poliqarp on
top of JSON-RPC (according to the &lt;a href=&quot;http://blog.danieljanus.pl/poliqarp-new-protocol.html&quot;&gt;protocol spec&lt;/a&gt; I
have recently posted) up and running, and all that remains is to fill
the remainder.&lt;/p&gt;

&lt;p&gt;Well, to be honest, this is not exactly JSON-RPC.  First off, as you
might have noticed, the above snippet of code sends JSON-RPC requests
as &lt;a href=&quot;http://cr.yp.to/proto/netstrings.txt&quot;&gt;netstrings&lt;/a&gt;.  This is actually intentional, and the reasons for
adopting this encoding have been described in detail in the spec (it
basically boils down to the fact that it greatly simplifies reading
from and writing to network, especially in C).  I wrote some crude
code to handle netstrings in CL &amp;#8212; now it occurred to me that it
might actually be worthwhile to polish it up a little, write some
documentation and put on &lt;a href=&quot;http://www.cliki.net&quot;&gt;CLiki&lt;/a&gt; as an asdf-installable library.  I&amp;#8217;ll
probably get on to this quite soon.&lt;/p&gt;

&lt;p&gt;Second, the resulting JSON object does not have all the necessary
stuff.  It contains the result, but not the error or id (as mandated
by the &lt;a href=&quot;http://json-rpc.org/wiki/specification&quot;&gt;JSON-RPC spec&lt;/a&gt;).  This is actually a deficiency of the
&lt;a href=&quot;http://www.big-llc.com/software.jsp&quot;&gt;JSON-RPC C library&lt;/a&gt; I&amp;#8217;m currently using.  It places the burden of
constructing objects that are proper JSON-RPC responses on the
programmer, instead of doing that itself.  This will be easy to sort
out, however, because the library is small and adheres to the &lt;a href=&quot;http://en.wikipedia.org/wiki/KISS_principle&quot;&gt;KISS
principle&lt;/a&gt;.  More of a problem is that the licensing of that library
is unclear; I emailed the maintainers to explain the status.&lt;/p&gt;
</description>
  </item>
  <item>
    <title>Forgetting</title>
    <link>http://blog.danieljanus.pl/2008/04/24#forgetting</link>
    <description>&lt;p&gt;It has just occurred to me that the best way to throwing things out of
one&amp;#8217;s mind is to let it be absorbed by something else.  I guess this
is oft-overlooked fact, even though it seems to be quite obvious.  In
particular, forcing oneself not to think about something is &lt;em&gt;not&lt;/em&gt; a
wise strategy, since it leads to mental strain and thinking more and
more, eventually yielding dejectedness that can be hard to get over.&lt;/p&gt;

&lt;p&gt;And what could be more absorbing than debugging a &lt;em&gt;SIGSEGV&lt;/em&gt; buried
deeply in the innards of some library early in the morning?  ;-)&lt;/p&gt;
</description>
  </item>
  <item>
    <title>ECLM 2008</title>
    <link>http://blog.danieljanus.pl/2008/04/22#eclm-2008</link>
    <description>&lt;blockquote&gt;
  &lt;p&gt;What is there left for me to do in this life? &lt;br /&gt;
  Did I achieve what I had set in my sights? &lt;br /&gt;
  Am I a happy man, or is this sinking sand? &lt;br /&gt;
  Was it all worth it?&amp;#8212;was it all worth it? &lt;br /&gt;
  &lt;em&gt;&amp;#8212; Queen&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Gusts of moderate wind are blowing at my face through the open window
of a train from Amsterdam to Warsaw as I write these words.  The last
buildings of Amsterdam have vanished a while ago, giving ground to the
damp, low countryside of the Netherlands &amp;#8212; not quite fascinating
sight to be watching &amp;#8212; so I decided to fire up my laptop and write
down some impressions while they are sharp and vivid &amp;#8212; impressions
from the &lt;a href=&quot;http://www.weitz.de/eclm2008/&quot;&gt;European Common Lisp Meeting&lt;/a&gt; that was held in Amsterdam
yesterday.&lt;/p&gt;

&lt;p&gt;I was there with &lt;a href=&quot;http://blog.pasternacki.net&quot;&gt;Maciek&lt;/a&gt; and &lt;a href=&quot;http://lisp.jogger.pl&quot;&gt;Richard&lt;/a&gt;.  Amsterdam did not receive us
warmly, pouring some mild yet cold rain on us, but our hosts &amp;#8212;
Lispniks from the Hague, Gabriele and Victor from &lt;a href=&quot;http://streamtech.nl&quot;&gt;Streamtech&lt;/a&gt; &amp;#8212;
turned out to be really nice guys.  I&amp;#8217;m not going to go into a very
detailed description of the social aspects of our trip, instead
focusing on the conference itself.  And that is definitely a topic
worth talking about for a long time.&lt;/p&gt;

&lt;p&gt;The first man to speak was Jeremy Jones of &lt;a href=&quot;http://www.clozure.com&quot;&gt;Clozure Associates&lt;/a&gt;,
talking about InspireData and how they did it in Lisp.  Although they
also seem to be the people behind Clozure CL the implementation of
Common Lisp, InspireData, the product their presentation was about,
seems to have been written in LispWorks.  It is a quite interesting
application for browsing datasets in many interesting ways and draw
conclusions for them.  Jeremy started off with a demonstration
presenting the key ideas of InspireData and what it can do, and this
almost instantly hooked the attention of most of the gathered Lispers;
mine, at least, definitely.  First off, it seems to be quite a nice
success story of a real-world application of Lisp, well worth learning
about and mentioning where it deserves a mention.  Second, one of its
great features shown by the demo is that one can copy HTML tables from
a Web browser and paste them as InspireData datasets.  Given that
Poliqarp now has statistical features and can export its data to HTML,
I wonder whether it is possible to couple it with InspireData to
interactively explore linguistic material in an absorbing way.  That&amp;#8217;s
certainly a topic worthy of further research.&lt;/p&gt;

&lt;p&gt;And last but not least, Jeremy outlined the points they did wrong and
those they got right.  Among those latter were two letters that now
constitute a huge part of my professional life: &lt;strong&gt;QA&lt;/strong&gt;.  He just
couldn&amp;#8217;t emphasize enough how crucial the fact that they had a serious
quality assurance process from the very beginning proved to yield the
final quality of the product.  That&amp;#8217;s the lesson I&amp;#8217;m now quickly
learning.  When I learned that InspireData was mostly tested by hand
by a skilled QA team, I felt somewhat proud of being able to automate
large parts of the process at Sentivision.  I&amp;#8217;m very curious where
this path will lead me to.  Let&amp;#8217;s hope for the best!&lt;/p&gt;

&lt;p&gt;The next speaker was Nicolas Neuss of University of Karlsruhe, talking
about &lt;a href=&quot;http://www.femlisp.org/&quot;&gt;Femlisp&lt;/a&gt;, a framework for solving partial differential
equations in Common Lisp.  I have little to say about this one, since
I lack the mathematical background needed to fully comprehend and
appreciate the topic; it&amp;#8217;s just not my kettle of fish.  Undoubtedly,
though, Femlisp seems to be filling its niche in a neat way, as the
demonstrations showed.&lt;/p&gt;

&lt;p&gt;After a coffee break, Stefan Richter came up with the one presentation
that I&amp;#8217;ve been looking forward to the most; that of using Common Lisp
for large, scalable Internet systems.  After all the talks were over,
Maciek dubbed it a &amp;#8220;very nice anti-FUD presentation&amp;#8221; and I could not
agree more.  I didn&amp;#8217;t learn many new things from it, but the author
clearly knows how to attempt to convince non-Lispers to try out Lisp.
The talk started off with outlining the typical designs of Web apps
and portals, starting with simple one-server scenarios that don&amp;#8217;t
scale well and progressing in the direction of more scalable and
extensible ones.  Stefan then pointed out that in some mainstream
languages like Java there exists a mature and proven infrastructure
for employing such designs.  And then came the key point &amp;#8212; &lt;em&gt;that
this is the case also for Common Lisp!&lt;/em&gt; All the necessary tools are
there, ready to use Right Now and free for the most part; they&amp;#8217;re just
not as mature in some cases.  This is not much of a problem, though,
given the incremental nature of Lisp development: any problem at hand
is typically fixable much faster than in case of other languages.  The
only weird thing was that the author advocated using
continuation-based Web frameworks (such as &lt;a href=&quot;http://common-lisp.net/project/cl-weblocks/&quot;&gt;Weblocks&lt;/a&gt; or &lt;a href=&quot;http://common-lisp.net/project/ucw/&quot;&gt;UnCommon
Web&lt;/a&gt;) just a couple of minutes after discouraging using sticky
sessions.&lt;/p&gt;

&lt;p&gt;Next came Killian Sprotte with a speech about &lt;a href=&quot;http://www2.siba.fi/PWGL/&quot;&gt;PWGL&lt;/a&gt;, the program for
computer-aided music composing.  I have very mixed feelings about it.
Notice that I didn&amp;#8217;t use the word &amp;#8220;presentation&amp;#8221; &amp;#8212; there was &lt;em&gt;no
presentation at all&lt;/em&gt;.  Yes, that&amp;#8217;s right.  The speaker was just
talking and showing off various things in the musical engine.  Now,
having no presentation accompanying the talk is not necessarily a bad
thing in itself; but without one, it&amp;#8217;s a little harder to draw
attention of the audience and a whole lot easier to deliver a chaotic
talk instead of a cleanly-structured and well-organized one.  Such was
the case with this speech.  Some features were shown, but with a fair
amount of obscurity and boredom thrown in, leaving me with a rather
low overall impression.&lt;/p&gt;

&lt;p&gt;As for PWGL itself, some of the ideas employed in it seem a bit
peculiar (for want of a better word) to me.  As befits a Lisp program,
it is an extensible utility that actually allows users to program
music just as one programs software.  But the way that programming is
done&amp;#8230; well, think of a graphical editor for Lisp programs.  An
editor in which to write, say, a factorial function, you right-click
an initially blank sheet, select &lt;em&gt;defun&lt;/em&gt; from a pop-up with a
complicated set of menus and submenus&amp;#8230; and kaboom! up comes a box
divided into several sub-boxes.  They correspond to &amp;#8212; what else they
could? &amp;#8212; the name of the function, list of arguments, and a body.
You can draw boxes representing computations, drag them around and
link them with arrows &amp;mdash; this is supposed to build complicated
expressions out of simpler ones.  And there is a huge library of
musical tools, all available for the convenience of a programmer.  Or,
should I say, a composer.&lt;/p&gt;

&lt;p&gt;Sounds cool?  Maybe &amp;#8212; for a newbie.  I can&amp;#8217;t really say.  As someone
who has high experience with Lisp and programming in general, I can
only speak for myself.  And for me all this click-and-drag-programming
seems to be an unnecessarily tedious, obscure and error-prone way of
doing things.  Stuff like score editors, chord editors or various
transformations is admittedly cool, but for lower-level matters the
kind of visualization PWGL offers (and it obviously has its rough
edges) seems to get in the way rather than staying out of it.  But
perhaps that&amp;#8217;s just me?&lt;/p&gt;

&lt;p&gt;By the time the fourth talk ended, most Lispers were already hungry,
so a lunch break followed.  I talked to some guy (I don&amp;#8217;t remember his
name, alas) who&amp;#8217;s working on porting Clozure CL to 64-bit Windows.
This is great news &amp;#8212; when the port&amp;#8217;s complete, it has high chances
of becoming the free Common Lisp implementation of choice for many
Windows Lisp hackers.&lt;/p&gt;

&lt;p&gt;Juan José García-Ripoll then &lt;a href=&quot;http://ecls.wiki.sourceforge.net/space/showimage/eclm2008.pdf&quot;&gt;talked&lt;/a&gt; about &lt;a href=&quot;http://ecls.sourceforge.net&quot;&gt;ECL&lt;/a&gt;, another CL
implementation that is characterized by a fairly small memory and disk
footprint, while still managing to achieve decent performance (via
compilation to C) and good standard compliance.  It was good to see
that ECL is still quite alive and getting better and better with each
release.  Just for the heck of it, I attempted in the evening to
reproduce the problem I had with ECL a while ago on a fresh CVS
checkout.  I managed to reproduce it (for the curious, it was an issue
with ECL failing to build after having been &lt;code&gt;configure&lt;/code&gt;d
with the option &lt;code&gt;--disable-shared&lt;/code&gt;).  So I reported the bug
to Juan, and he promised to look into it within the next days.  And I
must say that reporting bugs IRL to open source projects&amp;#8217; maintainers
is a very nice experience.  :-)&lt;/p&gt;

&lt;p&gt;And then came a really big surprise, and I mean a &lt;em&gt;nice&lt;/em&gt; surprise.  It
took the form of Kristofer Kvello of &lt;a href=&quot;http://www.selvaag.no&quot;&gt;Selvaag&lt;/a&gt;, a Norwegian-based
house-building company, and his presentation on &lt;a href=&quot;http://www.selvaag.no/en/Companies/Selvaagbluethink/aboutus/Sider/default.aspx&quot;&gt;House Designer&lt;/a&gt;, a
Common Lisp program for aiding in designing residences, as the name
suggests.  Yet another example of a success story in an area CL can
really excel at.  Basically, what House Designer can do is that you
give it a &lt;em&gt;sketch&lt;/em&gt;, containing a rough description of the shape of a
flat or residence and layout of rooms, and out comes a very detailed
project with all sorts of bells and whistles: the program
automatically figures out what the number of windows should be and
where they should be located, the number and location of electric
outlets, the optimal types of walls, layout of water installation and
what not.  It&amp;#8217;s transfixing when you think of the sheer amount of
tedious labour it automates, taking into account all of the
professional knowledge about designing houses accumulated over years,
some parts of which a human can easily omit.  And it&amp;#8217;s been Lisp all
the lifetime of this project, and it&amp;#8217;s Lisp all the way down (except
for the GUI in Java)!  Very, very impressive!&lt;/p&gt;

&lt;p&gt;Marc Battyani&amp;#8217;s talk about &lt;a href=&quot;http://www.hpcplatform.com&quot;&gt;programming FPGAs in Lisp&lt;/a&gt;
probably should not have been stacked so late in the venue.  I mean,
the topic seems to be quite interesting (though a bit low-level for my
interests), but there was something about Marc&amp;#8217;s way of talking and
showing things that sent me off dozing almost instantaneously.  I&amp;#8217;d
been a bit tired after the many hours of sitting and listening to
speeches, especially after having woken up at six o&amp;#8217;clock, and so I
somewhat regret missing large parts of the talk.  It&amp;#8217;s nice to know,
though, that it is possible to do such things with Lisp.  Seems to
have a high hack value, as in: &amp;#8220;Why do it this way? Because we &lt;em&gt;can!&lt;/em&gt;&amp;#8221;&lt;/p&gt;

&lt;p&gt;And what better end of a conference could one ask for than a rant by
Kenny Tilton?  If you have only encountered Kenny on the Usenet (some
of the crème de la crème of his postings is &lt;a href=&quot;http://www.pasternacki.net/en/ken-tilton-fortunes&quot;&gt;meticulously collected by
Maciek&lt;/a&gt;) and think he&amp;#8217;s one heck of a freak, you
definitely should listen to him live.  Here was another talk without
slides &amp;#8212; just talking and demonstrating stuff &amp;#8212; but this time, it
was a totally different thing.  Kenny sure knows how to attract the
attention of the audience and how not to let it loose throughout an
hour&amp;#8217;s worth of talking.  And he changes topics with mastery, using
digressions to a great effect to avoid the boredom slipping in, caused
by bragging about one thing all the time.  There was &lt;a href=&quot;http://smuglispweeny.blogspot.com/2008/02/cells-manifesto.html&quot;&gt;Cells&lt;/a&gt; in that
talk, there was &lt;a href=&quot;http://www.theoryyalgebra.com&quot;&gt;teaching of algebra&lt;/a&gt;, and there was
high-speed driving through the streets of New York.  I only hope
someone has recorded that to put it online.&lt;/p&gt;

&lt;p&gt;So, this was it.  There was much talk afterwards, there was much beer,
there was much socializing, there was much rejoicing.  I saw a real
&lt;a href=&quot;http://laptop.org/&quot;&gt;XO-1&lt;/a&gt; and played with it for a while, and boy, isn&amp;#8217;t it cute!  And
then we all came back.  And here I am, sitting at my desk in Warsaw
(it&amp;#8217;s the next day already; I really wish my laptop had a better
battery), finishing up this longish blog entry and asking myself: was
this 50 euro well spent?&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Yes, it was a worthwhile experience, hahhahahahahhaaaa! &lt;br /&gt;
  &lt;em&gt;(evil chuckle à la Kenny)&lt;/em&gt; &lt;br /&gt;
  It was worth it!  &lt;/p&gt;
&lt;/blockquote&gt;
</description>
  </item>
  <item>
    <title>Poliqarp&amp;#8217;s new protocol</title>
    <link>http://blog.danieljanus.pl/2008/04/16#poliqarp-new-protocol</link>
    <description>&lt;p&gt;The first version of the document I&amp;#8217;ve been writing about &lt;a href=&quot;http://blog.danieljanus.pl/tex-hackery.html&quot;&gt;a couple of
days ago&lt;/a&gt; is now &lt;a href=&quot;http://bach.ipipan.waw.pl/~nathell/new-protocol.pdf&quot;&gt;ready for public review&lt;/a&gt;.  I&amp;#8217;ll be
making an initial attempt at the implementation once I return from the
&lt;a href=&quot;http://weitz.de/eclm2008/&quot;&gt;European Common Lisp Meeting &amp;#8216;08&lt;/a&gt; and write a report.&lt;/p&gt;
</description>
  </item>
  <item>
    <title>I&amp;#8217;m not playing this stupid game anymore</title>
    <link>http://blog.danieljanus.pl/2008/04/14#im-not-playing-this-stupid-game-anymore</link>
    <description>&lt;p&gt;Not until the next tournament, that is.  My achievements in the
12&lt;sup&gt;th&lt;/sup&gt; Scrabble Championship of Warsaw can be described as
&amp;#8220;mediocre&amp;#8221; at best; four won, one drawn and seven lost games mean that
my general rating will drop down by two points or so.  Oh well.
Everybody knows it&amp;#8217;s a stupid game. ;-) At least I&amp;#8217;ve managed to get
a decent small score, with an average of 377 points per game.&lt;/p&gt;

&lt;p&gt;Random resolutions for the indefinite future:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Get a final draft of the C++09 standard when it&amp;#8217;s ready and
acquaint myself with it as closely as possible.  I strongly dislike
C++ (and I&amp;#8217;m not alone in this &amp;#8212; see the &lt;a href=&quot;http://yosefk.com/c++fqa/&quot;&gt;Frequently Questioned
Answers&lt;/a&gt; about C++ for very detailed criticisms); however,
I&amp;#8217;ve long wanted to learn that language better just to know all the
strengths and weaknesses of the enemy.  The ideal moment for this
will be when the new standard is out; this will give me the
advantage of not having to unlearn the things changed by the
standard, while staying on a cutting and competitive edge.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Get a copy of &lt;a href=&quot;http://en.wikipedia.org/wiki/Federico_Garc%C3%ADa_Lorca&quot;&gt;Federico García Lorca&lt;/a&gt;&amp;#8217;s poems translated into
Polish by Jerzy Ficowski.  I have only a very vague knowledge of
Lorca (just his &lt;em&gt;Romance of the Spanish Civil Guard&lt;/em&gt; (&lt;em&gt;&lt;a href=&quot;http://www.poesia-inter.net/index214.htm&quot;&gt;Romance de la
Guardia Civil Española&lt;/a&gt;&lt;/em&gt;)), but I very much like what little
I know.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
</description>
  </item>
  <item>
    <title>Recipe for a successful presentation</title>
    <link>http://blog.danieljanus.pl/2008/04/10#recipe-for-successful-presentation</link>
    <description>&lt;p&gt;&lt;a href=&quot;http://www.latex-project.org&quot;&gt;LaTeX&lt;/a&gt; + &lt;a href=&quot;http://latex-beamer.sourceforge.net&quot;&gt;Beamer&lt;/a&gt; (for typesetting the presentation in a visually
pleasant, clean, simple and consistent way) + &lt;a href=&quot;http://impressive.sourceforge.net&quot;&gt;KeyJNote&lt;/a&gt; (for
presenting it stylishly to the audience) = a recipe for success.  In
particular, KeyJNote, which I found only yesterday, seems to be a fine
and tremendously useful piece of software, despite being very young.
The only annoyance I have found in it is that it doesn&amp;#8217;t respond to
Alt-Tab when in fullscreen mode.  On the typographical side, I used
the &lt;a href=&quot;http://www.cert.fr/dcsd/THESES/sbouveret/francais/LaTeX.html&quot;&gt;progressbar&lt;/a&gt; Beamer theme and the &lt;a href=&quot;http://www.nowacki.strefa.pl/torunska-e.html&quot;&gt;Torunian Antiqua&lt;/a&gt; font,
both to great effect.&lt;/p&gt;

&lt;p&gt;While I&amp;#8217;m at this topic, &lt;a href=&quot;http://jan.rychter.com/&quot;&gt;Jan Rychter&lt;/a&gt; has recently posted &lt;a href=&quot;http://jan.rychter.com/blog/files/sztuka-prezentacji-03-2008.html&quot;&gt;a great
guide to giving presentations&lt;/a&gt;, especially short
ones. I heartily recommend it to those of you who speak Polish (is
there actually any non-Polish-speaking person reading this?)&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Update 2010-Jan-17:&lt;/em&gt; KeyJNote is now called &lt;a href=&quot;http://impressive.sourceforge.net&quot;&gt;Impressive&lt;/a&gt;.&lt;/p&gt;
</description>
  </item>
  <item>
    <title>Ubuntu post-installation tricks</title>
    <link>http://blog.danieljanus.pl/2008/04/08#ubuntu-postinstall</link>
    <description>&lt;p&gt;Yesterday, my level of frustration with my old operating system at
work exceeded a critical point, and I installed a fresh daily build of
the not-yet-released &lt;a href=&quot;https://wiki.ubuntu.com/HardyHeron&quot;&gt;Ubuntu 8.04&lt;/a&gt; in place of it. Then, in addition
to usual post-installation chores like setting up mail, hardware,
etc., I performed a couple of steps to make the system more
pleasurable to use. Here&amp;#8217;s what I did, just in case someone finds this
useful.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;First, I tweaked the font rendering. This was one area that has
long been a PITA for Linux users (at least for me, since 2000 or
so), but as far as Ubuntu is concerned, they introduced a change to
Freetype somewhere along the way between Feisty and Gutsy which,
when set up properly, makes the font rendering on LCD displays far
superior for me to that of, say, Windows XP, in particular at small
font sizes. The way to enable it is to enable sub-pixel rendering,
and set the hinting level to &amp;#8220;slight.&amp;#8221; This results in an rendering
very close to what the author of &lt;a href=&quot;http://www.antigrain.com/research/font_rasterization&quot;&gt;Texts Rasterization Exposures&lt;/a&gt;
managed to achieve.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;I installed the package &lt;code&gt;msttcorefonts&lt;/code&gt; to get Microsoft&amp;#8217;s
free-as-in-beer set of core TrueType fonts, including Times New
Roman, Arial, Georgia, etc. There are very many sites out there on
the Web that were designed with these fonts in mind, and this is
one of the few areas Microsoft doesn&amp;#8217;t completely suck at.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Next I enabled bitmap fonts. The way to do this is to become root,
cd to &lt;code&gt;/etc/fonts/conf.d&lt;/code&gt;, remove the symlink named
&lt;code&gt;70-no-bitmaps.conf&lt;/code&gt;, and make a symlink pointing to
&lt;code&gt;/etc/fonts/conf.avail/70-yes-bitmaps.conf&lt;/code&gt; instead. This would
come in handy in the next step.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Which was installing my favourite console font. Unfortunately, it
doesn&amp;#8217;t come preinstalled with the Gnome-based Ubuntu, but it was
no big deal. The font is named &lt;code&gt;console8x16&lt;/code&gt; and it comes with
Kubuntu&amp;#8217;s (and KDE&amp;#8217;s) default terminal emulator, Konsole. So I
downloaded &lt;a href=&quot;http://packages.ubuntu.com/hardy/konsole&quot;&gt;an appropriate package&lt;/a&gt; (manually,
without the help of APT, because all I wanted was the font, not the
package itself). I then installed Midnight Commander (which I use a
lot, if only for its great vfs feature, which allows to access,
&lt;em&gt;inter alia&lt;/em&gt;, Debian/Ubuntu packages as if they were
directories), grabbed the file &lt;code&gt;console8x16.pcf.gz&lt;/code&gt;, installed it
in &lt;code&gt;/usr/share/fonts/X11/misc&lt;/code&gt;, changed to that directory, ran
&lt;code&gt;mkfontdir&lt;/code&gt; and &lt;code&gt;mkfontscale&lt;/code&gt;, logged out and restarted the X
server.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The last step was to use this font for Emacs, too.  So I installed
Emacs, created the file &lt;code&gt;~/.Xdefaults&lt;/code&gt; containing the single line&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;Emacs*font: -misc-console-medium-r-normal--16-160-72-72-c-80-iso10646-1
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;and ran &lt;code&gt;xrdb ~/.Xdefaults&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Then I got round to configuring Emacs itself.  But that&amp;#8217;s a story for
another post.&lt;/p&gt;
</description>
  </item>
  <item>
    <title>YAVP</title>
    <link>http://blog.danieljanus.pl/2008/04/07#yavp</link>
    <description>&lt;blockquote&gt;
  &lt;p&gt;Jezus, the high elven wizard, saved the world with his brave efforts and
  became a great ruler while saving himself 34 times. &lt;br /&gt;
  He scored 24999532 points and advanced to level 50. &lt;br /&gt;
  He survived for 0 years, 123 days, 0 hours, 11 minutes and 39 seconds
  (176207 turns). &lt;br /&gt;
  Jezus visited 127 places. &lt;br /&gt;
  His strength score was modified by +26 during his career. &lt;br /&gt;
  His learning score was modified by +17 during his career. &lt;br /&gt;
  His willpower score was modified by +10 during his career. &lt;br /&gt;
  His dexterity score was modified by +7 during his career. &lt;br /&gt;
  His toughness score was modified by +25 during his career. &lt;br /&gt;
  His charisma score was modified by +9 during his career. &lt;br /&gt;
  His appearance score was modified by +6 during his career. &lt;br /&gt;
  His mana score was modified by +13 during his career. &lt;br /&gt;
  His perception score was modified by +15 during his career. &lt;br /&gt;
  He was unnaturally aged by 76 years. &lt;br /&gt;
  He was the champion of the arena. &lt;br /&gt;
  He was a member of the thieves guild. &lt;br /&gt;
  He made a little water dragon very happy. &lt;br /&gt;
  He defeated the arch enemy of a mighty karmic wyrm. &lt;br /&gt;
  He adhered to the principles of the Cat Lord and thus rose to great fame. &lt;br /&gt;
  He saved Khelavaster from certain death. &lt;br /&gt;
  He left the Drakalor Chain after completing his quest and became a great
  leader and famous hero.  &lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Yay! Now that I have finished &lt;a href=&quot;http://www.adom.de&quot;&gt;ADOM&lt;/a&gt; for the first time ever, after
something like six years of trying, I can finally get back to work
with peace of mind.  :-)&lt;/p&gt;
</description>
  </item>
  <item>
    <title>The TeX Hackery</title>
    <link>http://blog.danieljanus.pl/2008/04/06#tex-hackery</link>
    <description>&lt;p&gt;After a longish while of inactivity, I finally got around to finishing
the draft spec of a next-generation protocol for &lt;a href=&quot;http://poliqarp.sf.net&quot;&gt;Poliqarp&lt;/a&gt;, the
be-all-end-all corpus concordance tool that I maintain.  The spec is
being written in LaTeX, and it has a number of subsections that
describe particular methods of the protocol. Each one of those is
further divided into sub-subsections that describe the method&amp;#8217;s
signature, purpose, syntax of request, syntax of response, and an
optional example. I thought to write a couple of macros to help me
separate the document&amp;#8217;s logic from details of formatting, so that I
could say:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;\synopsis/() -&amp;gt; {version : int; extensions : string*}/
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;and have it expanded into:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;\paragraph{Synopsis}
\verb/{version : int; extensions : string*}/
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Being a casual LaTeX user who hardly ever writes his own macros, I
first thought to use LaTeX&amp;#8217;s command-defining commands, &lt;code&gt;\newcommand&lt;/code&gt;
and &lt;code&gt;\renewcommand&lt;/code&gt;. However, I quickly ran into the limitation that
the argument of commands defined in such a way can only be delimited
by curly braces, which I could not use because they might appear in
the argument itself.&lt;/p&gt;

&lt;p&gt;I googled around and found that this limitation can be overcome by
using &lt;code&gt;\def&lt;/code&gt; instead, which is not a LaTeX macro but rather an
incantation of plain TeX, and allows to use arbitrary syntax for
delimiting arguments.  Having found that, my first shot was:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;\def\synopsis/#1/{\paragraph{Synopsis}\verb/#1/}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;which, obviously enough, turned out not to work, producing errors
about &lt;code&gt;\verb&lt;/code&gt; ended by an end-of-line.&lt;/p&gt;

&lt;p&gt;&amp;#8220;What the heck?&amp;#8221; I thought, and resorted to Google again,
this time searching for &lt;em&gt;tex macros expanding to verb&lt;/em&gt;. This
yielded an entry from some TeX FAQ, which basically states that the
&lt;code&gt;\verb&lt;/code&gt; is a &amp;#8220;fragile&amp;#8221; command, and as such it
cannot appear in bodies of macros.  Ook.  So it can&amp;#8217;t be done?&lt;/p&gt;

&lt;p&gt;&amp;#8220;But,&amp;#8221; I thought, &amp;#8220;TeX is such a flexible and powerful tool, there
must be some way around this!&amp;#8221;  And, as it would turn out, there is.
Yet more googling led me to &lt;a href=&quot;http://groups.google.pl/group/comp.text.tex/browse_thread/thread/5bca05fb8865a9c2&quot;&gt;this thread&lt;/a&gt; on comp.text.tex,
where someone gives the following answer for a similar question:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;\def\term#{% 
   \afterassignment\Term \let\TErm= }% 

\edef\Term{\noexpand\verb \string}}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Now this is overkill.  Why in the world am I forced to stuff such
incomprehensible hackery into my document just to perform a seemingly
simple task?!  Easy things should be easy &amp;#8212; that&amp;#8217;s one of the
principles of good design.&lt;/p&gt;

&lt;p&gt;Reluctantly, I copied it over, and attempted to adjust it to my needs.
After a number of initial failed attempts, I thought that I might
actually attempt to understand what all these &lt;code&gt;\afterassignment&lt;/code&gt;&amp;#8217;s,
&lt;code&gt;\noexpand&lt;/code&gt;&amp;#8217;s and &lt;code&gt;\edef&lt;/code&gt;&amp;#8217;s are for, so I downloaded the &lt;a href=&quot;http://www-cs-faculty.stanford.edu/~knuth/abcde.html&quot;&gt;TeXbook&lt;/a&gt; and
dived straight in.&lt;/p&gt;

&lt;p&gt;I spent another fifteen minutes or so reading bits of it and trying to
understand tokens, macros, when they are expanded and when merely
carried over, etc.  But a sparkle of thought made me replace the whole
complicated thingy with a simple snippet that actually worked.  &lt;/p&gt;

&lt;pre&gt;&lt;code&gt;\def\synopsis{\paragraph{Synopsis}\verb}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;That&amp;#8217;s right. This superficially resembles a C preprocessor macro, and
works because I was lucky enough to have &lt;code&gt;\verb&lt;/code&gt; appear last in the
definition, thus allowing the &amp;#8220;arguments&amp;#8221; of &lt;code&gt;\synopsis&lt;/code&gt; to be
specified just like arguments to &lt;code&gt;\verb&lt;/code&gt; and fit at exactly right
place.  I&amp;#8217;m almost certain that it does not always work this way, but
for now it&amp;#8217;ll suffice.&lt;/p&gt;

&lt;p&gt;Oh well.  TeX is undoubtedly a fine piece of software that provides
splendid results if used right.  But I can&amp;#8217;t get over the impressions
that there are a great deal more idiosyncracies like this in it than
in, say, Common Lisp, even though the latter&amp;#8217;s heritage tracks back to
as early as 1958 and is a whopping twenty years longer than TeX&amp;#8217;s.
(On the side note, as it turns out, someone has already written &lt;a href=&quot;http://www3.interscience.wiley.com/cgi-bin/abstract/98518913/ABSTRACT&quot;&gt;a
Lisp-based preprocessor for TeX macros&lt;/a&gt;. Gotta check it out someday.)&lt;/p&gt;

&lt;p&gt;As for the TeXbook itself: it is a fine piece of documentation that I
will definitely have to add to my must-read list, though it admittedly
has a math-textbookish feel to it.  First, however, I want to finish 
&amp;#8220;Shaman&amp;#8217;s Crossing&amp;#8221; by Robin Hobb (which I will probably
brag about in a separate post once I&amp;#8217;m finished with it) and tackle
Christian Queinnec&amp;#8217;s &amp;#8220;Lisp in Small Pieces&amp;#8221;.&lt;/p&gt;
</description>
  </item>
  <item>
    <title>Introduction</title>
    <link>http://blog.danieljanus.pl/2008/04/04#introduction</link>
    <description>&lt;p&gt;So, there. Inspired by the newly-started blogs of some of
&lt;a href=&quot;http://www.joemonster.org/blog/pietshaq&quot;&gt;my&lt;/a&gt; &lt;a href=&quot;http://jan.rychter.com/blog/&quot;&gt;acquaintances&lt;/a&gt;, I had this thought that I might
actually have a word or two on a number of subjects, and that it might
even be worth sharing. And here I am, typing this introductory entry
in my Emacs.&lt;/p&gt;

&lt;p&gt;I guess the first thing one usually writes about in a blog is
introducing himself to the public, so for those of you who have
arrived here through some links on the Web and don&amp;#8217;t know me, here
goes. I am a 23-year-old (soon to be 24, though) programmer geek,
living in Warsaw, Poland. In 2006, I graduated from Warsaw University,
where I majored in computer science, and am now working full-time as a
senior software engineer at &lt;a href=&quot;http://www.sentivision.com&quot;&gt;Sentivision&lt;/a&gt;. I have a &lt;a href=&quot;http://danieljanus.pl&quot;&gt;homepage&lt;/a&gt;
(currently in Polish only, though I probably will translate it to
English some day). These days, I tend to use Common Lisp for most of
my programming work, though I also occassionally use Python, Ruby, C,
Perl, OCaml, Haskell, Java, and a handful of other languages.&lt;/p&gt;

&lt;p&gt;This is going to be a blog about my personal interests. This means
mostly programming, with a fair share of posts about books, poetry,
Scrabble, music, biking, cats, and a bunch of other topics thrown
in. The new entries will most likely be added irregularly, whenever I
feel like sharing a thought. My mother tongue is Polish, but I will
try to maintain this blog in English just to polish up my English
writing skills (no pun intended) and for greater worldwide
understandability.&lt;/p&gt;

&lt;p&gt;As you might have noticed, there is no possibility of leaving
comments. This is a side-effect of the fact that this blog is,
technically, just a bunch of static HTML pages (automatically
generated with &lt;a href=&quot;http://www.blosxom.com&quot;&gt;Blosxom&lt;/a&gt;), and is in line with my idea of blog
comments: I view them as a way of providing direct feedback to the
author, not as a publically available message board with discussions
having a heavy tendency to drift off topic. So, should you like to
comment on some post, feel free to drop me an email; I&amp;#8217;ll be happy to
respond to interesting mails in the blog. I can be contacted at
&lt;b&gt;dj at danieljanus dot pl&lt;/b&gt;.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Update 2010-Jan-17:&lt;/em&gt; Several things have changed &amp;#8212; in particular,
Sentivision doesn&amp;#8217;t exist anymore &amp;#8212; but I haven&amp;#8217;t done any editing
in this post other than updating the links.&lt;/p&gt;
</description>
  </item>
  </channel>
</rss>