Paolo commented on comp.lang.lisp the other day that CLiki had just had its second birthday

Mon, 03 Jun 2002 01:53:12 +0100

Paolo commented on comp.lang.lisp the other day that CLiki had just had its second birthday. I believe him, but I can’t actually remember, myself. The first cut at CLiki sort of sat around being an undirected wiki-type thing; the second version was very briefly a resource list for the then-new lispweb mailing list (“Some things NOT on topic: LispOS mental masturbation”), then a couple of days later I decided that I really didn’t care very much about Scheme and that it should concentrate on the stuff I personally find interesting: Common Lisp stuff on Unix. At or around that point I posted to lispweb, so I guess I could reasonably consider that the formal opening.

My suspicion is that the focus is what’s made it successful. I don’t think it’s the only possible focus that would have been a success, but to make anything that even pretends to be a community site these days I think you have to find people with some degree of common goals. This is my rationalization for adding things like the dreaded non-free tag or my comments on the JavaScript page - it’s not because I’m violently opposed to these things, but because they’re off-topic for CLiki.

(The astute reader will already have observed that I side-stepped the question of whether I am violently opposed to these things or not. Even if Shaver’s not reading this, i know from the referer(sic) logs that many other people who read his diary are)

After some more digging around for early CLiki references, I find my old diary entries. For comparison, as of right now it’s had 36 POSTs since 26th May – so, no significant change there in two years, then. The number of GETs has gone up an awful lot, admittedly: analog gives current values, as well as a strong indication that most of them were probably search engine robots.

ILISP 5.12.0 happened, which indicates that I may be getting better at predicting software releases than I was in the bad old days of <a href= “http://lemonodor.com/archives/000114.html” >ftx13

I know I keep saying this (although, apparently, not in this diary: must be an IRC thing) but you should expect a couple of new cliki features in the very near future. According to my TODO list, all the obvious prerequisites for upgrading (it needs, among other things, a new SBCL version on my shell host, which tends to imply a pile of other stuff needing testing too) are satisfied, so now I’m just waiting for a slack time to do the actual upgrade. This would be one, except that right now I’m going to go to bed instead.

Paolo commented on comp.lang.lisp the other day that CLiki had just had its second birthday

New stuff in

Tue, 04 Jun 2002 18:14:22 +0100

New stuff in CLiki: now you can download the packages straight from the pages (or even skipping the page completely if you already know the name)

At some point I should almost certainly find a better place to explain it than `CLiki News’: I think a lot of the metacliki pages need some review.

New stuff in

At last I have found out how to turn disc autorepeat off in Grip

Wed, 05 Jun 2002 23:01:42 +0100

At last I have found out how to turn disc autorepeat off in Grip. Now, I know that nobody takes my ideas on usability seriously (I admitted that I like Emacs, which pretty much lost me all credibility with the point-click brigade), but …

  1. Click the `config’ tab, then the ‘CD’ tab of the inner tab set. Observe no option to kill the autorepeat.
  2. Check all the other tabs in case it’s somewhere stupid like ‘misc’ instead. Nope
  3. Click on the Help tab, observe that all the buttons in there do absolutely nothing at all. I don’t have the gnome help browser installed, but silent failure? The Unix Philosophy(sic) is strong in this one, master.
  4. Um. Guess there’s no such option, then. Return to using xmcd
  5. Some months later when new version of grip available, go clicking very slowly on the “buttons they’d put on a real cd player if real cd players were designed by vcr manufacturers” section at the bottom, so that we can see the tooltips
    • The button marked “123” is tooltipped “Toggle play mode options”
    • When clicked, it creates two more buttons to click on, plus an expanse of grey space.
    • The (right-hand) button tipped “Toggle loop play” switches between two fairly obvious hieroglyphs – obvious if you ever had a cassette tape player with “autoreverse”, anyway. Problem solved, but
    • The other button (“Rotate play mode” – yes! let’s listen to our cds using rotated play! eh what?) cycles between “→?”, “N” and “PL”. I’m guessing these denote any of Hyperspace Jump, Neutral (Natural numbers? Could be a Dangerous Bend sign, actually) and Poland. If anyone can tell me what a rotated Polish play mode is (in a programming context I’d guess something best implemented with an operand stack), answers on a postcard …

      In Polish mode it also changes the “random grey space we apparently didn’t have enough buttons left to fill” into “random white space we apparently didn’t have enough buttons left to fill”. Cool. Maybe it’s not Polish, then. Placard mode? Placebo mode, could be.

I can only assume they’re aspiring to the xmms user interface.

(“Initiate/abort DiscDB lookup”? What’s wrong with “Look up disc/track titles”? If there’s a lookup in progress, change the tooltip to “Cancel title lookup”. The icon for that one appears to be a picture of two petrol pumps having sex.)

I’m tempted also to rail about the track skip buttons (click five times on “next track” and it click click clicks five tracks forward, then suddenly skips back again four of them), the skip-forward-in-track button which when held down for five seconds goes click click click with no other audio output, then resumes play fifty seconds further on when released, and the not-always-notice-when-disc-ejected behaviour which causes the new cd, if longer, to stop playing before it actually gets to the end. Some or all of these may be bugs in my cd player hardware, though, so it may not be fair to blame grip.

At last I have found out how to turn disc autorepeat off in Grip

Try the GNU Project's Free Software

Thu, 06 Jun 2002 01:01:43 +0100

Try the GNU Project’s Free Software licensing quiz. For what it’s worth, I got two wrong: question 6: offer-of-sources-for-binary-distribution (which I should have known) and the reverse-engineering question, about which I don’t really care.

It suits people to claim that the GNU Licenses are overly restrictive and this will encourage users of proprietary software to carry on using that instead. So, I’d like to offer the “typical proprietary software EULA licensing quiz”, with approximately the same questions

  1. Joan writes a web browser and releases the source code under a typical-proprietary-EULA on her web site. Fred gives a CD with binaries of Joan’s browser to his friend for her birthday. What happens

    1. Joan sues Fred
  2. Now Fred makes modifications to Joan’s web browser, and distributes binaries on his web site. What happens?

    • I. Joan sues Fred (again)


    1. I, and nothing else.
    2. I, and nothing else.
    3. I, but nothing else
    4. Any or all of I, I, I, or I
  3. Fred wishes to distribute Joan’s browser linked to a third-party module. The third party module has the following license:

    This code may be freely modified, copied and distributed, so long as no fee is charged for it.

    Would this violate the typical proprietary EULA?

    1. Yes
  4. Peter creates a library called LibIdo licensed under a typical proprietary EULA. FooCorp distributes a modified version LibIdo library linked to their proprietary program Frobber. Which of the following is not an obligation of FooCorp?

    1. To lose in court
    2. To settle out of court
  5. Joan wants to distribute copies of her browser statically linked to Postfix (a mail server), which is released under the IBM Public License, a GPL-incompatible Free Software license. Other than Postfix, the browser includes only code on which Joan holds the copyright. Should she grant an exception to her typical proprietary EULA for this?

    1. No, what would be the point? People can’t copy it anyway
  6. FooCorp distributes binaries of Joan’s web browser on CD without source code. They include an offer to provide source code. Which of the following offers fulfills their obligations?

    • I. “You can download the source code from our web site at http://foocorp.example.com/download.html"
    • II. “Everyone who buys a binary CD may order up to one source CD per binary CD for $5000."
    • III. “Everyone may order a source CD for $5000.”
    • IV. “Everyone who buys a binary CD may order up to one source CD per binary CD for the cost of distribution."
    • V. “Everyone may order a source CD for the cost of distribution.”
    • VI. “Everyone who buys a binary CD may order up to one source CD for free."
    • VII. “Everyone may order a source CD for free.”
    1. None of the above. Redistributing Joan’s program is Piracy. Piracy is Theft. Theft is Love. Cleanliness is next to Godliness. Uh, wait …
  7. Patty creates a library, and releases it under a typical proprietary EULA. Many people make improvements to this library, and submit them back to Patty, who incorporates them into newer versions of the library. Now Patty wants to make a proprietary version of this library. She makes two claims:

    • I. Because the original version was under a proprietary EULA, everyone who made improvements was acting in breach of the licence
    • II. Because she is the copyright holder, she can relicense the code, so nobody can distribute old versions anymore.

    Are these claims true?

    1. Both claims are true. II is a bit meaningless though, as nobody could have legally distributed the old versions anyway.
  8. FooCorp distributes Frobber linked against an unmodified version of LibIdo. Does the licence of LibIdo require FooCorp to allow users to reverse engineer Frobber for their own use?

    1. Yes.
    2. No, but it prevents FooCorp from doing this anyway
  9. Now FooCorp modifies Joan’s browser to include a technology they have patented. They distribute this modified browser on CD. Are there any requirements in Joan’s licence on how they may license their applicable patent?

    1. No, but it doesn’t matter: they can’t do this anyway

Hope this helps

grip update: having turned off autorepeat, I find now that clicking “play” after it’s already played the disc once causes it to start on the last track

Try the GNU Project's Free Software

I think I'd forgotten how to make vn-cclan packages:

Thu, 06 Jun 2002 03:04:09 +0100

I think I’d forgotten how to make vn-cclan packages:

* (asdf:operate ’asdf:load-op ’cclan)
* (dolist (s ’(araneida cliki)) (cclan::cvs-tag s) (cclan::make-tar-file s))

New araneida and cliki packages in your nearest vn-cclan mirror as soon as they propagate, then

In other news, SBCL for Tru64 appears not to have bitrotted, so I should be checking that in tomorrow. Just want to build it with itself again first.

I think I'd forgotten how to make vn-cclan packages:

We have another vn-cclan mirror: ftp://www.aarg.net/pub/cclan/

Fri, 07 Jun 2002 01:06:05 +0100

We have another vn-cclan mirror: ftp://www.aarg.net/pub/cclan/. Prompted by this encouraging result and the hope that it presages more to come, I hacked at telent.net’s CCLAN redirector so that now you can get rid of your earlier choice and select another without having to fiddle around with cookies.txt or something

I found something that I’m reasonably convinced is an actual SBCL bug while rebuilding on OSF/1. interrupt_maybe_gc establishes that the gc trigger has been hit. It clears the trigger, calls the Lisp function MAYBE-GC. MAYBE-GC calls SUB-GC, which if GC-INHIBIT is set, returns immediately without resetting the trigger – which it would have done had it actually GCed. So, after that we cons until we run straight off the end of dynamic space. I fixed it by making interrupt_maybe_gc check whether a GC had happened, and resetting the trigger itself if it hadn’t, but I think that’s probably more of a kludge than a fix.

We have another vn-cclan mirror: ftp://www.aarg.net/pub/cclan/

So, after all the blogging discussion at XCOM 2002, and prodded by the fact that

Tue, 11 Jun 2002 02:17:45 +0100

So, after all the blogging discussion at XCOM 2002, and prodded by the fact that someone had actually asked for it, I decided it was time to investigate all that RDF/RSS/news feeds/syndication business. Not (yet, anyway) for this diary, but for CLiki’s Recent Changes.

Can you tell how impressed I am by this? An RDF probably-RSS feed of CLiki is now available from http://ww.telent.net/cliki/recent-changes.rdf anyway. Let me know if you find anything useful to do with it.

More CCLAN mirrors. Now we need some more content, really.

So, after all the blogging discussion at XCOM 2002, and prodded by the fact that

Look Ma, a brand new diary system

Tue, 11 Jun 2002 06:38:01 +0100

Look Ma, a brand new diary system. One-file-per-entry, lashings of Common Lisp, and moderate amounts of emacs glue. The only real gap (so far) is a way of telling emacs that these files are fragments of HTML BODY content so I can use psgml for element competion and suchlike.

Look Ma, a brand new diary system

Welcome to the brand new diary system

Tue, 11 Jun 2002 06:42:55 +0100

Welcome to the brand new diary system. With luck you should barely notice the difference, but I do. One-file-per-entry, lashings of Common Lisp, and small amounts of emacs glue. The only real gap (so far) is a way of telling emacs that these files are fragments of HTML BODY content so I can use psgml for element competion and suchlike.

Welcome to the brand new diary system

More Emacs magic

Tue, 11 Jun 2002 17:08:54 +0100

More Emacs magic. The documentation for PSGML is a bit iffy in places, but it does profess to cope with split documents, and I’ve managed to imbue it with at least enough smarts to close tags when I press C-c /, and to not beep at the end of each line. Which is refreshing

(define-key global-map [f11] 
  '(lambda () (interactive nil)
    (let ((s (shell-command-to-string "echo `date +%s` + 2208988800 | bc ")))
      (find-file (format "~/doc/telent/htdocs/diary/data/%s.html"
			 (subseq s 0 (1- (length s)))))
      (setf sgml-parent-document '("HEADER.inc" "HTML" "BODY" "BODY" ())))))

If you’re curious, the magic constant in the bc calculation is the number of seconds between 1900 and 1970

Reclaimed my cellphone from the phone repair people. This time they’ve mamaged to repair it (they “reflowed the pa’s and filters”, whatever that involved) without deleting all the numbers, which is nice as I forgot to back it up before taking it in.

More Emacs magic

Well, that'd explain it

Tue, 11 Jun 2002 18:59:12 +0100

Well, that’d explain it. Mail from the Userland people to say that the aggregator is no longer running. A note to that effect on the web site would have been nice, but never mind.

I was pointed to Meerket at O’Reilly, but it doesn’t actually have any “submit your rss url here” option of its own, it relies on grovelling the userland and xmltree.com databases. Given that one of these no longer exists and the other is some lameass hierarchical thing … Enough. If/when the RSS advocates get their collective act together, I’ll have another look. Until then, back it goes in the box with SET, Java applets, “wallets”, and VRML. Sorry.

Well, that'd explain it

Once upon a time I bought a copy of the Unix-Haters Handbook

Wed, 12 Jun 2002 17:41:45 +0100

Once upon a time I bought a copy of the Unix-Haters Handbook. At the time I was the biggest Linux bigot I knew, and intended mostly to laugh at it – in fact, I mostly did. This Linux Gazette review gives you the flavour of my opinions.

As time went by and when I started thinking a little more rationally about operating systems (this change can be explained by one of more of (a) finding the alt.sysadmin.recovery newsgroup, or (b) finishing university and getting a real job) I grew to actually quite like my Unix-Haters handbook, even using it as a reference for that funky shell trick where you thought you needed $* but should have been using ${1+"$@"} or something instead. I retained my initial opinion that the funny bits were almost always the reprinted mailing list messages: Garfinkel’s filler between them was, well, filler.

``${1+"$@"} or something ‘’? Yes, well. Somebody borrowed my copy from the office and didn’t return it, and unhappily now it’s out of print, I can’t easily get another. But after recent conversations on IRC suggesting that they were still available, I found the actual list archives on the web: http://www.mindspring.com/~blackhart/

Date: Fri, 14 Dec 1990 18:25-0500
From: GP
Subject: Re: MC:HUMOR;JARGON >

    Date: Fri, 14 Dec 1990 13:54 EST
    From: DH

    The JARGON file is being updated.  The guy doing so has
    changed the nasty references to Unix to refer to MS-DOS
    because “all the ITS partisans have now become Unix
    partisans, since the Unix philosophy is the same as the
    ITS philosophy.” as he says.

Amazing!  A valid argument against gun control …

“The guy doing so” presumably being Eric Raymond, I find this especially funny…

Once upon a time I bought a copy of the Unix-Haters Handbook

This entry exists for two reasons:

Wed, 12 Jun 2002 18:37:56 +0100

This entry exists for two reasons:

  1. To counter Neil’s claim that my use of an external process to generate seconds-since-1900 was an attempt to bait him. In fact, it was simply a lack of success with emacs apropos facility.
  2. To remind me that my permalink format sucks when there are multiple entries on any given day. That needs fixing.

This entry exists for two reasons:

The ulterior motive for this recent spate of CLiki hacking can now be

Fri, 14 Jun 2002 03:08:46 +0100

The ulterior motive for this recent spate of CLiki hacking can now be (has now been) revealed: I have to talk about it in a couple of months time. Of all the projects they might have asked about (SBCL porting, asdf, cCLan, etc), they had to choose the one guaranteed to send me into apologetic fits about the quality of the code. It was a weekend hack. It shows.

“Plan” is possibly too strong a word, but we have intentions to create a shared bug database for SBCL and CMUCL, using CLiki. This involves a fair bit more structured data going into the page, so that we can perform searches for things like “give me all the bugs more than a year old that have not been fixed in sbcl” or “give me all the bugs reported in cmucl that haven’t been tested in sbcl”.

So presently I’m practising slash-and-burn refactoring to remove some of the worst of the hardcoded markup rules and allow people to add arbitrary indices. Who knows, maybe in the process we’ll even fix it to pick up the page links and do the full-text indexing in the same pass, thereby avoiding having to reread the page twice after every edit. And fix the current-page-appears-in-own-list-of-links bug. And this also gives us an opportunity to introduce a syntax for “download” links other than the ill-conceived >(foo-bar.tar.gz) - i.e. that doesn’t do bad things when people write <code>(funcall (compile nil (lambda () (* 2 3))))</code>

The ulterior motive for this recent spate of CLiki hacking can now be

See if that helps

Fri, 14 Jun 2002 04:05:31 +0100

See if that helps. Permalink format is now /diary/year/month/#date.nnn where nnn is the number of seconds since midnight. Numbers are not zero-padded; it’ll only cause trouble if people want to do arithmetic on them in javascript.

Yes, this is not a backward-compatible change. I could have (did, briefly) special-cased the links for old entries, but then I realised that the only external link that I knew of was not going to the right place anyway, so really we’ll all be happier in the long run with a Fresh Start.

See if that helps

I have to tell the world about this

Fri, 14 Jun 2002 23:37:45 +0100

I have to tell the world about this rec.music.makers.guitar thread.

I have to tell the world about this

You probably won't read this until the Internet comes back

Tue, 18 Jun 2002 04:29:43 +0100

You probably won’t read this until the Internet comes back …

I’d like to recommend the NTL web site as a great demonstration of so many ways to get the design of a web site wrong. Primarily at this present time

Eventually I thought to check Robin Walker’s (amazing, frankly) Cable Modem Troubleshooting Tips and found the numbers I wanted in the Tech Support section there. For the benefit of future Google users who experience similar problems and may end up at this page, 0800 052 4315 for the status recording, 0845 650 0121 for the helpline.

For the record, the NTL telephone voicemaze jail is almost as well-planned. I dialled the status recording, which is information-rich in much the same way as 10 Angstroms is a long way: for each outage it tells you who it affects, that it is due to “a technical fault”, that engineers are aware of it (in fairness, given NTL’s usual standards of internal communication, it’s entirely possible that they would announce a fault on the answering machine and forget to tell the engineers, so perhaps there is actually some value in knowing that they havent screwed up in this particular way) and that they apologise for any inconvenience. No estimated time to repair, and no fault description which would let a caller make a reasoned guess at time to fix either. But anyway, it didn’t mention Oxford.

So, try the other number. It says “for cable modem faults, replace the handset and dial 0800 052 4315” which number sounds vaguely familiar: not surprising, it’s the recorded status line I just called to be apologised to by a machine. So instead I retain the handset, I select a plausible-sounding option from the next menu and then it tells me that they’re rewiring the entire HFC network for expansion and Oxford is one of the exchanges that will be off from 1am. Why don’t they put that on the service status report? Call me a non-technical person, but by any dictionary definition of service status, I’d have said that “no service” is relevant.

Could have been worse, anyway. At least they didn’t play their hold music at me.

You probably won't read this until the Internet comes back

I think we're nearly there

Wed, 19 Jun 2002 05:38:31 +0100

I think we’re nearly there. Just need to touch up the search handling a bit, and then I’m ready to release a new cliki onto the world. New Improved CLiki with Almost No User-Visible Changes. Rock.

I’m going to go to bed first, mind.

I think we're nearly there

I don't know why, but it appears that spamassassin has no

Wed, 19 Jun 2002 17:48:26 +0100

I don’t know why, but it appears that spamassassin has no blacklist_to command. I’d find this very useful as I have old addresses which I still need to check because they’re published in various places, but which I haven’t used otherwise in the last four years, and still get a steady stream of spam.

If you’re using spamassassin through your .forward file, though* - or presumably also procmail – it’s easy to fake

header SENT_TO_DETACHED To =~ /dan\@detached.demon.co.uk/
score SENT_TO_DETACHED 3.5
That should tip the balance a little.

* apparently this doesn’t work if you use spamd/spamc because it won’t pick up new rules from the user_prefs file in that case. This is a shame if so, because I really do need to convert to a daemon-based approach – currently I get massive thrashing and load averages exceeding 15 when I reintroduce my laptop to the net after having been away. A fix would be nice.

I don't know why, but it appears that spamassassin has no

mpt's "archives are broken, as per Blogger usual" quote should probably

Fri, 21 Jun 2002 03:38:20 +0100

mpt’s “”http://mpt.phrasewise.com/discuss/msgReader$253" >archives are broken, as per Blogger usual" quote should probably enter some kind of stock-blogger-phrases list if its not on one already. I wanted to link to Juri talking about multipart/form-data in Araneida. Guess what, his archives are broken, so you get to read about xchat usability first. Or scroll down.

Anyway, I finally got as far as reading his patch. Then I thought I should go and look at the spec (for a change), so I stopped along of RFCs 2616 and then 2388. (Yes, links to archives on different sites. I can never remember an rfc mirror site, so I tend just to google for `RFC number’ and choose the result my eye is most immediately drawn to. Anyway.)

I’ve not really looked at XML-RPC, so my primary motivation for multipart/form-data encoding is to handle those forms with file upload fields – you remember, they were all the rage back in the days of Netscape 2. Basically it’s a MIME multipart encoding, or pretty similar. So …

   For example, a form with a text field in which a user typed ‘Joe owes
   <eu>100’ where <eu> is the Euro symbol might have form data returned
   as:

    —AaB03x
    content-disposition: form-data; name=“field1”
    content-type: text/plain;charset=windows-1250
    content-transfer-encoding: quoted-printable

    Joe owes =80100.
    —AaB03x
- let’s call it about 150 bytes to represent 21 characters? That this is followed a page later by
   The multipart/form-data encoding has a high overhead and performance
   impact if there are many fields with short values. However, in
   practice, for the forms in use, for example, in HTML, the average
   overhead is not significant.
leads me to suspect that someone somewhere can’t count. (In a real-life example it’s more likely that the user would only be entering the digits 100 and the currency would be displayed read-only or in a separate field, so no need for the charset declaration. Still over 100 bytes of data and now for 3 characters. Nice one)

Anyway, that’s just me grousing about anything I can find to grouse about (I’ve had this problem for about a week, since spending most of Wednesday reading the Unix-Haters list archives) rather than an actual practical objection. We have bigger pipes and faster CPUs these days than we need for processing HTML form uploads (so quick, introduce a slower encoding scheme before people get bored and find something useful to do with all those spare cycles)

The more relevant issue is about uploading big files, and even more so, about uploading big files that perhaps the user didn’t mean to upload, or that we didn’t want the user to upload. Right now, Araneida just reads Content-Length characters into memory, ambles through it finding separators and conses up a bunch of strings and keywords and stuff with all the relevant header values. And right now, the only way anyone normal would get data into Araneida would be by typing it in or by cut and paste, so it’s not really a problem. Yet. But watch that RAM usage rocket when one of those form elements is multimegabytesized.

I think half of the answer is to make REQUEST-BODY `lazy’, so that it only reads the body the first time someone asks, and then to add something like REQUEST-FLUSH-BODY to be called on error or by a handler that knows it won’t need the body parameters at all (e.g one that says “you aren’t authorized to upload. pfooey”). We have to read the body sometime before we actually start writing to the stream, as otherwise the peer gets upset, but we could do this in REQUEST-SEND-HEADERS and pretend that (format stream “HTTP/1.0 200 OK~%Content-type: text/html~%~%”) (which has hitherto always worked) was undocumented and unsupported. As there is no useful documentation and no support for Araneida, this is almost a defensible position. Kind of. Alternative is to use Gray streams, but that always makes me want to say “yay, cool! another layer of pointless buffering”.

A stream interface to the request body would also, I think, be useful. After all, if you really did want to let the user upload a 25Mb file, chances are you’re only going to write it out somewhere anyway and only need look at one block at a time.

mpt's "archives are broken, as per Blogger usual" quote should probably

* (let ((report '(:os :alpha :tree t)) (term '(:tree :sbcl))) (every (lambda (x) (let ((tx (getf term x t)) (rx (getf report x t))) (or (eq tx rx) (eq tx t) (eq rx t)))) '(:os :tree :arch)))

Sat, 22 Jun 2002 04:39:10 +0100

* (let ((report '(:os :alpha :tree t)) (term '(:tree :sbcl))) (every (lambda (x) (let ((tx (getf term x t)) (rx (getf report x t))) (or (eq tx rx) (eq tx t) (eq rx t))))  '(:os :tree :arch)))
T
* (let ((report '(:os :alpha :tree :sbcl)) (term '(:tree :sbcl))) (every (lambda (x) (let ((tx (getf term x t)) (rx (getf report x t))) (or (eq tx rx) (eq tx t) (eq rx t))))  '(:os :tree :arch)))
T
* (let ((report '(:os :alpha :tree :cmucl)) (term '(:tree :sbcl))) (every (lambda (x) (let ((tx (getf term x t)) (rx (getf report x t))) (or (eq tx rx) (eq tx t) (eq rx t))))  '(:os :tree :arch)))
NIL

It’s not exactly what you’d call a comprehensive test, but it seems to work. Omitted components in either the criterion we’re searching on (term) or the report we’re looking at (report) default to “any”. For each attribute that we’re looking at ’(:os :tree :arch), a search for “any” yields results for “any” or for any other value, and a search for a specific value also matches reports that apply to “any”. All clear?

There is admittedly no way in this scheme at present to say “all reports except the ones that apply to :os :linux”, for example. I think I had some reason for this omission along the lines of “why on earth would you want to know that”; it remains to be seen whether this is convincing.

* (let ((report '(:os :alpha :tree t)) (term '(:tree :sbcl))) (every (lambda (x) (let ((tx (getf term x t)) (rx (getf report x t))) (or (eq tx rx) (eq tx t) (eq rx t)))) '(:os :tree :arch)))

Cool URL of the Day: In Pursuit of Simplicity: the manuscripts of Edsger W

Mon, 01 Jul 2002 15:05:56 +0100

Cool URL of the Day: In Pursuit of Simplicity: the manuscripts of Edsger W. Dijkstra

They’re scanned PDFs, of a somewhat ropey quality: readable at 1.4 magnification, though

Cool URL of the Day: In Pursuit of Simplicity: the manuscripts of Edsger W

Today is random asides day

Tue, 02 Jul 2002 00:47:22 +0100

Today is random asides day

On Living with Packages

  1. don’t ever use common-lisp-user for anything bigger than a noddy two-line test function. Anything important enough to get saved in a source file is important enough to set up a package for.
  2. define your package(s) using defpackage forms. I usually put these in their own source files, too.
  3. every file starts with an (in-package :package-name) form - except the file with the defpackage form, anyway
  4. make sure you load the files containing the defpackage forms before any of the other files
  5. use-package, import or any of the other “imperative” package stuff is, like the use of eval, generally an indication that you’re doing something wrong. Not always, no. Usually
  6. a defsystem utility (e.g. mk-defsystem or – my preference – asdf) will automate the loading-stuff-in-the-right-order aspect

On being ill

Well, slightly under the weather at least. This weekend I had a wedding (not my own, no), a barbecue, a party and a nose full of microwaved cotton wool. Last Friday I had an all-afternoon wish to lie down and sleep unobtrusively in the middle of the carpet, which I now realise was probably early cold symptoms, plus a bunch of scary disk error messages from my colo box (Rackspace fitted a new disk, upgrading the OS version while they were at it, then I just had to reinstall all the locally-changed stuff), plus an evening in the pub. This is all in the nature of an excuse for not having done much hacking lately.

On naming

What really wasn’t helping too much is that I’d originally set out at the start of the week to add some form of access control to the CLiki application (the CLiki site will stay as it is, but there are lots of other applications I’m imagining for which it would be better to know who the users are and whether they’re Allowed), realised that the handler system for Araneida is suckier than it really wants to be for these kinds of application, and ended up redesigning large parts of it. And now I’ve created a new class called handler, I find that I want to introduce lots of new GFs whose names clash with existing Araneida functions. So perhaps this is time for a name change. Nobody appears to have produced http serving software called Boris yet, which is a pretty compelling reason in itself.

Anyway, we’ve got to a state where it basically runs again, so maybe we can get this wrapped up in time for Thursday

Today is random asides day

We have working CLiki again

Wed, 03 Jul 2002 04:13:51 +0100

We have working CLiki again! Well, at least, all the bits I’ve checked so far are working again: it’s not exactly been tested exhaustively yet.

I got sidetracked halfway through the afternoon staring at my four or five new GFs and thinking “hmm, why don’t I use define-method-combination” until I realised that “because it provides no advantage that I can reasonably easily envisage and I do want to actually get this finished one day” was in fact the Correct Answer.

(For the avoidance of doubt, GF in this context stands for Generic Function. If I had four or five new girlfriends I’d … well, for a start I’d remember whether I had four or five)

We have working CLiki again

Whitespace sensitivity is cool

Wed, 03 Jul 2002 15:13:47 +0100

Whitespace sensitivity is cool

For some reason I’ve started reading and contributing to Ward’s Wiki a lot more lately. When I was first doing Wiki I was mostly using Netscape 4, which gives you some idea of how long ago it was, because I can’t actually remember when was the last time I used Netscape 4. Mozilla rocks.

But, anyway, well. Except for this bit. “This bit” is that wiki has Text Formatting Rules which demand a variety of keyboard gymnastics, not least among them that various formatting (UL lists, BLOCKQUOTE, PRE etc) demands the insertion of a literal TAB (ASCII 007) character. Pressing TAB in a Mozilla text field, though, makes it go to the next text field instead of inserting anything, ^V doesn’t seem to do the conventional readline “insert next character as literal” thing, and the conventional Emacs “insert next key as literal character” thing - don’t press that! You just quit Mozilla!. Without prompting to do anything with the four paragraphs you just typed, either …

So, I cut and paste from my scratch buffer, which is silly but just about livable. But, this is wrong. This is Free Software. Even if I will probably never ever myself actually write code for a project in which the majority of a 45 minute “how to hack on $project” talk is given over to a description of getting reference counting right, I can at least file a bug report. Or at least, read the bug report that someone must already have opened on this subject and see if there’s some way to do it already that I’m missing. Well, they did, and there isn’t. Bug 29086, has been open for more than two years, and attracted so much argument that it’s over 100k long as viewed by lynx -dump

Lessons we can learn:

(Yes, I know there’s a workaround in Wiki, but it’s heuristic and doesn’t seem to do too great a job)

Whitespace sensitivity is cool

Of course, the Wiki markup rules started life as simple things,

Wed, 03 Jul 2002 16:08:59 +0100

Of course, the Wiki markup rules started life as simple things, and it wasn’t until later that people realised they could do things like typing indented-but-not-preformatted text by typing TAB : SPACE TAB at the start of the line (and possibly also typing the entire paragraph on one line; I forget whether it makes a difference in that specific instance. it does for italics, though)

This reminds me of some other software I’ve been using recently that starts out with a simple set of rules which combine in dizzyingly unpredictable ways to do things you would never have dreamed sensible. I’m talking about spamassassin here, of course.

I’ve never been entirely clear, it must be admitted, on how best to use all the weird gnus options to keep copies of outgoing mail, and eventually came to the conclusion that the simplest answer would be to Bcc it all to myself. This has the neat advantage that I can then use gnus splitting to filter incoming mail to some regular correspondent into the same folder as mail from said correspondent, and then I have both sides of the conversation in the same place. It has the (fairly innocuous) side-effect, though, that my outgoing mail loops through spamassassin before coming back to me, so I get to see how spammy my mail looks. Well, look at this

X-Spam-Status: No, hits=-98.4 required=5.0
        tests=SIGNATURE_DELIM,FOR_FREE,USER_IN_WHITELIST
        version=2.31
body     Standard signature delimiter present     SIGNATURE_DELIM    0.488  

A positive score for a signature delimiter? “- – SPACE \n”, so rarely correctly implemented that it became favoured all over Usenet as the choice “get a real news reader” stick with which to beat Outlook users (and another great example of why whitespace sensitivity is a dumb idea, fwiw) is now suddenly an indication that the mail was sent from some bulk mailing program that injects fake unparseable received headers, has the wrong system date, and probably still thinks X-UIDL is a header that should be provided by the sending host? I find this not entirely plausible.

From conversations on IRC, I understand that the actual scores for each rule are computed by feeding a large pile of known-spam and another large pile of known-nonspam into a genetic algorithm and letting it work them out. This sounds like really great news for the stability of weights on each rule …

I wish I could find my neural networks book. It was possibly the most boring book ever written about what should be an interesting subject, but I desperately want to be able to liken spamassassin to a neural network with only one neuron after the kind of particularly vicious overtraining that should have the owner in court on animal cruelty grounds, and I really could do with a reliable source to tell me whether it’s a remotely fair comparison.

Of course, the Wiki markup rules started life as simple things,