Christophe Weblog Wiki Code Publications Music

This portion of the ikiwiki installation is for notes organized as a blog, with more permanent observations recorded statically.

azed 2184

So, a slightly different solve for me this week: away from Chambers, so with rather more reliance on the Internet for filling in gaps and for word meaning confirmation. One proud moment was looking up TRON using the power of grep through my previous solves, to find that it did indeed mean “market”.

  • 2ac: FLAMBOYANTE: Following former whim, lad gets stake for tropical tree: F + LAM + BOY + ANTE
  • 10ac: SLUMP: Depression about closing of theatrical flop: SUMP around (theatrica)L
  • 11ac: ZABIAN: Semi-Christian sectarian from South Africa, one curbed by taboo: ZA + BAN (taboo) around I
  • 13ac: SUMPIT: Tot given mine delivers devastating darts: SUM + PIT
  • 14ac: OPPO: One’s mate, very low before and after love: PP (pianissimo) before and after O (love)
  • 16ac: KIPPAS: Snooze before action requiring special headgear: KIP + PAS
  • 17ac: STYLOLITE: Sort of stone boundary to till? Yes, laboriously: *(TO TILL YES)
  • 18ac: BEZEL: Elizabeth may make a hit with this oblique stone’s face: *(ELIZABETH - A HIT)
  • 19ac: ELYTRON: Plate of worms appearing in Cambs. city market: ELY + TRON
  • 21ac: REPULSE: Check up showing relapse – reels shakily about that: *(REELS) around UP reversed(?)
  • 23ac: YEZDI: One must give the Devil his due – even features of Azed likely to appear contorted!: *(aZeDlIkElY)
  • 27ac: CASSAREEP: Ingredient of WI cuisine like it is used to stuff toad: AS (like) + SA (?) in CREEP (toad)
  • 30ac: DREDGE: Sprinkle a bit of demerara, a form of greed: D(emerara) + *(GREED)
  • 31ac: GEDS: River fish caught in ringed seines: rinGED Seines
  • 32ac: ITALIE: Palm tree situation? It has its place in Paris: not sure about the parsing, other than Place d'Italie being in Paris
  • 33ac: EGOIST: I’m not interested in what others think or say on ’eight of sail: EG (say) + OIST (HOIST = “height of sail” - H)
  • 34ac: STEER: Guide more obdurate when avoiding lie: STEELIER (more obdurate) - LIE
  • 35ac: BOG STANDARD: Dirk e.g. (not English) edging suit of armour, basic: BOGARDE (ref. Dirk Bogarde - E + STAND (?)
  • 1dn: ASSES’ BRIDGE: Rigs shifting with sea-beds? It blocks progress completely: *(RIGS SEA BEDS)
  • 2dn: FLUATE: Former compound one put into wineglass: FLUTE (wineglass) around A (one)
  • 3dn: LUMMY: Excellent Dickensian upper class, deprived of power initially: PLUMMY (upper class) - P(ower)
  • 4dn: AMPULE: Drug container from Panama secreted by a smuggler thereof?: A MULE (drug-smuggler) around P(anama)
  • 5dn: BOTTLES: Earns by busking what’ll often end in banks: Double Definition
  • 6dn: OZEKI: Heavyweight champ? Little weight put on as turning up with loss of pounds: OZ (little weight) + (LIKE - L) reversed; ref. Ōzeki
  • 7dn: YAKITY-YAK: Gossip? It’s variable with pair tended by Tibetan milkmaids around?: IT + Y (variable) inside YAK twice
  • 8dn: NIPPER: Cracked pipe splitting near wire?: NR (near) outside *(PIPE)
  • 9dn: TAPAS: Pieces of Italian staple exchanged as appetizers: PASTA (Italian staple) rearranged
  • 12dn: NOSENIPPERS: No drinkers will imbibe small measure in these glasses: NO + SIPPERS (drinkers) around EN (small measure)
  • 15dn: COLLAGIST: ‘Scrap merchant’? I irritate when going up in price: I GALL (irritate) reversed in COST (price)
  • 20dn: LESBIAN: Selina, mad about baron? Probably not: *(SELINA) around B(aron) &-sort-of-lit.
  • 22dn: PIE-DOG: Pedigree? No – wild one ne’er displays that: *(PEDIGREE NO) = NE’ER + PIE-DOG
  • 24dn: ERRATA: Slips revealing solver ratability to some extent: solvER RATAbility
  • 26dn: GREGO: More than half of calendar calls for such an overcoat? GREGO(rian) (ref. Gregorian Calendar)
  • 25dn: DEFIED: Was daring exploit interrupted by rising uncertainty?: DEED (exploit) around IF reversed
  • 28dn: SEPTA: Dividers, a pest when broken: *(A PEST)
  • 29dn: EULER: Mathematician requiring rubber in middle of numerals: ULE (rubber) in numERals; ref. Leonhard Euler
azed 2183

Oh, fun. Something a bit different: an Eightsome Reels puzzle, where each answer is eight letters, and the answers must be written around the clue number starting anywhere and going in either direction. I didn't find this too hard; once I'd got three clues which intersected in one square (in an ‘L’ shape) the rest fell fairly quickly. The clues themselves were pretty straightforward, so here's the grid, with the clue numbers indicated in the most excellent base-36 encoding with digits 1-9a-z.

YARASETAUARUM
L1G2P3T4Q5T6A
INGNINERSREST
T7B8W9LaTbKcB
AREATSIARACAL
NdHeIfLgGhEiP
LUTENGSANEDRE
AjAkIlAmTnEoC
RSPELBIRELLIO
ApAqErSsNtEuS
TECSTENAICHSI
TvOwExTyRzT.Y
EVRSLCATAVOAD

And now I have to clue ‘SANGRAIL’, and all I can think of is something to do with Skimbleshanks. How about “Reva Rice maybe did for cup final?” – probably too obscure, but hey, it's not like I'm going to actually enter...

azed 2182

I did complete Azed 2182, but cunningly knocked over a full coffee cup in my study and soggily obliterated my solution (and, more importantly for blogging, the clues). fifteensquared has the analysis: last to go in for me was either SCAFF-RAFF or FOIL; both needed confirmation from Chambers.

Meanwhile, my coffee accident was astonishingly non-damaging; despite there being the bits and pieces of four computers on my desk at the time, the only component which got even slightly soggy was my sadly unused Raspberry Pi (still no SBCL port) and the time-honoured strategy of turning it off and on again seemed to make it as functional as it ever has been.

student-run software houses

A while ago, I attended an HEA event with the title of “Student-Run Software Houses”. This is a topic which is both personally interesting and relevant to one of my departmental employability brief; it fits nicely both with the narrative that a University should be empowering its students to learn and live well, and with the positive noises about the Digital Economy that a Computing department should be supporting.

The day opened with the customary introduction by a senior academic, in this case Professor Palmer-Brown, Dean of the Faculty of Life Sciences and Computing. Typically, these introductions are hilarious because the senior academic has no idea what the event is, who the speakers are and why they should care; they might have had the introduction in the diary for ages, or it might have been sprung on them, but in either case they're almost certainly unprepared. Usually they'll therefore depend on the speaker schedule and titles to give them a sense for what they should say; in this case, the schedule was laconic, and it was mildly embarrassing to see the resulting flailing. Maybe the moral is for the local organizer of the event to write a script for their senior colleague? (Or else, skip the pointless welcome).

The morning sessions included a number of short(ish) talks from a number of practitioners: people helping to run their own take on student software development. The talks were interesting, not least because of the breadth of approaches, and how those approaches were often dictated by particular facilities or lack of them.

For example, Amit Chopra's Studios in Lancaster's Software Engineering programme was particularly distinguished, in my notes at least, by having their own dedicated studio space for their students. With 24-hour access. For the students. Space. My mind was blown, particularly when I also heard about the low enrolment numbers for the course. Liz Coulter-Smith's experience at Worcester was a litany of institutional dysfunction, fighting not to fall between the cracks (is student software development teaching? research? industrial engagement?) At the opposite extreme was Graham Roberts' experience from UCL, where the description of institutional support had some of the group drooling: having “2 to 3” full-time members of staff just to manage relationships between the CS courses and potential collaborators was my favourite data point. With all that, maybe the most painfully hilarious unintended consequence was the result of Apple's policy that there should be only one App Store developer account per insitution: bad luck to the student software team if the University marketing department has got there first...

One common thread among the presentations: they weren't about student-run software houses. In all cases, the organizational aspects where handled by academic staff, whether within the context of a credit-bearing module, running a digital agency on a consultancy basis (as our host Yanguo Jing from London Met does) or coordinating volunteer effort (as Elaine Major does at Greenwich). I can see why this happens: there's a natural assumption that continuity is essential, and managing reputational risk is important; on the other hand, it ought to be possible to expose students to more of the reality of running an organization as well as participating in it, to give them an appreciation for all the “other stuff” – and also to allow the non-developers among the students a chance to be substantially useful.

There was an interesting point about competition. One problem identified by academics in smaller towns is that setting up a consultancy or digital agency for coordinating student work runs the risk of competing with local business, and undercutting both through cross-subsidy and through the use of under-market-rate student labour. This is obviously not ideal; it's even worse if the competition is primarily made up of companies formed by the University's own graduates. The obvious answer is to aim to do things that are substantially different from local businesses; on the other hand, doing things that no-one else is doing introduces risks, because possible reasons for no-one doing things include “they're too hard” and “no-one wants them”. Still, there might be valuable lessons there for students too.

inquisitor 1326

Another fun one; I somewhat prefer the inquisitors with slightly more obscure vocabulary and slightly less messing with clues – perhaps because at least I stand a chance.

In the completed grid, one member of a family is leaving a location. One member of another family is entering the same location. Each uses the same technique to pass an obstacle, different in each case. Solvers must highlight both members. Unchecked letters of the unclued families, location, technique and obstacles could form LOCAL ACT, VIVA RACE.

  • 8ac: URAO: Beginning of unholy row over onshore deposit: U(nholy) + OAR (row) reversed
  • 9ac: GATS: Guns to follow in retreat: STAG (follow) reversed
  • 12ac: TENNOS: Recall verse titles: SONNET reversed
  • 13ac: SOREE: Rail about joining members of secret service: RE (about) inside SOE (ref. Special Operations Executive)
  • 15ac: DROMOI: Gypsy involved in swindle; the first to occur in Irish racecourses: ROM (Gypsy) in DO (swindle) + I(rish)
  • 18ac: MOA: Bird no longer starts to moult outside aviary: M(oult) O(utside) A(viary); ref. Moa
  • 21ac: RENAME: Marlene left out mobile to call again: *(MARLENE) - L
  • 26ac: FOEHN: Wind flipping over fluttering hen: F(lipping) O(ver) + *(HEN)
  • 27ac: AROUSE: Nothing in a trick generates alarm: O in A RUSE
  • 29ac: OGEE: Moulding's highest point apparently missing: APOGEE - AP(parently)
  • 30ac: DRIP: Weak person finally shed tear: (she)D + RIP (tear)
  • 1dn: AUTO: Mini drama?: Double definition
  • 2dn: RANEES: Princesses fled uprising to await further: RAN (fled) + SEE (await further) reversed
  • 3dn: ION: Play by Euripides – one currently being performed: I (one) + ON (currently being performed); ref. Ion
  • 4dn: EASE: Manoeuvre bit by bit to stop Corps leaving: CEASE (stop) - C(orps)
  • 5dn: ISOPOD: Woodlouse say, in case belonging to audio player: SO (in case) inside IPOD (audio player)
  • 6dn: DARI: Organized raid to find grass: *(RAID)
  • 7dn: ELEGIES: Support that is shown in El Salvador for songs: LEG (support) + IE (that is) in E(l) S(alvador)
  • 9dn: GOLEM: Robot to work with moon vehicle: GO (work) + LEM (Lunar Excursion Module)
  • 10dn: TSAR: Despot so far heading north in Turkey: AS (so far) reversed + TR (Turkey)
  • 11dn: VENOM: Divers move to contain nuclear poison...: *(MOVE) around N(uclear)
  • 14dn: CARAFES: ...carriage made safe in flasks: CAR (carriage) + *(SAFE)
  • 15dn: DOE: Drover regularly encountered deer: DrOvEr
  • 17dn: FATHOM: Discover money in short: FAT (money) + HOM(e) (in, shortened)
  • 19dn: AFORE: Going about Faroes almost getting lost once: *(FAROE(s))
  • 20dn: PLEURA: Dispute besieging ancient city's side-walls: PLEA (dispute) around UR (ancient city)
  • 22dn: MING: Aircraft designers engulf navy in stink: MIG (aircraft designers) around N(avy)
  • 23ac: CELL: Mobile phone's a disappointment by the sound of it: homophone with SELL (disappointment)
  • 24ac: CAEN: John goes round Eastern French city: CAN (John) around E(astern)
  • 25ac: NEPS: Dispensaries stocking up catmints in some places: diSPENsaries reversed
  • 28ac: ODD: Out-of-the-way force deserted: OD (force) + D(eserted)

It then turns out that a LEMMING, a member of the CRICETIDAE family, deals with a CLEVE by OVERLEAPING it, while a SALMON, a member of the SALMONIDAIE family, also passes FALLS by OVERLEAPING. (LEMMING appears vertically downwards through CLEVE, while SALMON goes upwards through FALLS. Nice touch.)

azed 2181
  • 1ac: SPADILLO: Solid player's half miscued ace, unbeatable?: *(SOLID PLA(yer))
  • 7ac: PIPA: Hump on a toad? It's pear-shaped: Double Definition; ref. Pipa Pipa pipa (?)
  • 10ac: AULARIAN: Member of Oxford hall – university lecturer leads song in one: U(niversity) L(ecturer) + ARIA (song) in AN (one)
  • 11ac: IN ON: Party to love, held in local: O (love) in INN (local)
  • 12ac: VENDITION: Sale: don't start it in Nov., I scribbled: END IT (don't start it) in *(NOV I)
  • 13ac: CABIN: Area for passengers (cases cooler): CA(ses) + BIN (cooler)
  • 14ac: MOWRA: It has edible flowers a worm chewed up: *(A WORM)
  • 16ac: TRADE GAP: Sort of balance that's summoned skill when going backeards: PAGED (summoned) ART (skill) all reversed
  • 18ac: MEGILLAH: Lengthy US screed badly penned by very good husband: ILL (badly) inside MEGA (very good) H(usband)
  • 21ac: MAD-APPLE: Aubergine mum marked with spots: MA (mum) + DAPPLE (mark with spots)
  • 26ac: COUNTESS: Grand lady Luxembourg picked out from very many: COUNTLESS (very many) - L(uxembourg)
  • 27ac: CONIN: Not in favour of being involved with poisonous liquid: CON (not in favour of) + IN (involved with)
  • 28ac: VERST: Silverstone laps... such a distance?: silVERSTone
  • 30ac: UNSTOPPER: Open, and spurt may result when you do it: *(OPEN + SPURT) &lit.
  • 31ac: FENT: Modern poet, not on crack: FENTON (ref. James Fenton) - ON
  • 32ac: ELEGANCE: Refinement, as in ‘cast’: EG (e.g. = “as”) in ELANCE (throw = “cast”)
  • 33ac: FRAY: Extremes of fervour always apparent in brawl: F(ervou)R + AY (always)
  • 34ac: DERANGED: Crazy, like old kitchen after modern makeover: an old kitchen would be DE-RANGED (have its range removed) in modernization
  • 1dn: SANCTUM: If old, court goes in to chief points in private room: AN (obs. if) + CT (court) in SUM (summary = chief points)
  • 2dn: PUJA: Hindu festival (NB not found in one Indian state): PUNJAB - NB
  • 3dn: A L'ABANDON: A research place soon going round Director recklessly: A LAB ANON around D(irector)
  • 4dn: DAVIDIA: Help offered up inveigles greedy Chinese native: AID (help) reversed around AVID (greedy)
  • 5dn: LINAGE: String of tinsel in a genipap tree (pretty old): tinseL IN A GEnipap
  • 6dn: LAD MAG: Mad when banged up inside, convict displays place for pin-ups?: *(MAD) inside LAG (convict)
  • 7dn: PITON: Mountaineers' peg? This gear men use, possibly: *(MOUNTAINEERS PEG) = *(GEAR MEN USE + PITON)
  • 8dn: POOR LAWS: Hands around contents of pool, right and left? They assist the needy: PAWS (hands) around pOOl + R(ight) + L(eft)
  • 9dn: ANNAM: Delicious food is served up in this former French protectorate: MANNA (delicious food) reversed
  • 15dn: WELTERING: Rolling about in the sea, very hot when topless: (s)WELTERING (very hot)
  • 17dn: REASONER: Participant in debate? it's rare one's trounced: *(RARE ONES)
  • 19dn: LATERAN: Relating to church of Rome, I'll yield to age in what's spoken therein: LATIN (spoken in Roman churches) - I + ERA (age)
  • 20dn: HUSTLED: Lutes broadcast in sharp focus, crowded together roughly: *(LUTES) in HD (high definition = “sharp focus”)
  • 22dn: POPPLE: Oar, very soft inside, getting to heave in rough water: PP (pianissimo = “very soft”) inside POLE (oar)
  • 23dn: LUMPER: Casual worker eading tax maybe, member breaking rule shockingly: MP (member) in *(RULE)
  • 24dn: SCUFF: Graze sheep initially on place for links? S(heep) + CUFF (place for (cuff)-links)
  • 25dn: BITTY: Disjointed, near to ringing communications giant: homophone of BT (ref. BT)
  • 29dn: SYCE: Chauffeur locating carbon in filter: C(arbon) in SYE (filter); interesting because SICE is the same word meaning chauffeur, and the I/Y was unchecked – it's just SYE meaning filted that disambiguates
azed 2180

Perhaps fewer obscurities and references this week? One fun thing to do with copious free time would be to examine the crossword data for patterns. Some day.

  • 1ac: CHLORACNE: Skin condition left over after hospital in dispersal of cancer: L(eft) O(ver) after H(ospital) in *(CANCER)
  • 10ac: ROUX: Right page in book wife follows for thickening in recipe: RO (recto) + UX (wife)
  • 11ac: GOA BEAN: Tropical African plant Gabon developed at edges of river: *(GABON) around EA (river)
  • 12ac: OREADES: Nymphs are dancing in e.g. Horatian verses: *(ARE) inside ODES (ref. Horace's Odes)
  • 13ac: MARSH: It may suggest Romney is disfiguring horse's head: MARS (is disfiguring) + H(orse)
  • 14ac: WINTERISE: Astute about earth, prepare for colder times: WISE (astute) around INTER (earth)
  • 15ac: BEIN: Scots well-to-do, not the last in essence: BEIN(g) (essense)
  • 16ac: PEAR: E.g. conference held in deep earnest: deeP EARnest; ref.
  • 17ac: HUCKSTERESS: Suckers she's bamboozled about a bit of tat?: *(SUCKERS SHES) about T(at) &lit.
  • 19ac: MONTICOLOUS: Sign of Japanese family, lacking heart (does one hear?), living the high life: MON (sign) + TI (?) + COLOUS (sounds like “callous” = heartless)
  • 23ac: ISMS: Lissomest will regularly display such practices: lIsSoMeSt
  • 26ac: SPRY: One disembarks from jet with a spring in one's step: SPR(a)Y (= jet)
  • 28ac: RHEOTROPE: It switches current or the flow in e.g. cable: *(OR THE) in ROPE
  • 29ac: GARNI: Trimmed turns in college entertainment: IN RAG (college ent.) reversed
  • 30ac: UNITION: Making one fortification metre short at front: (m)UNITION (fortification)
  • 31ac: ENTROPY: Field of medicine not good? This may measure system disorder: ENT (Ear Nose and Throat) + ROPY (not good)
  • 32ac: IMAC: Range of modern computers (mica chips): *(MICA)
  • 33ac: INTEGRATE: Fashionable neck/breast of lamb turning on end of rotisserie, whole: IN + TARGET (neck/breast of lamb) reversed + (rotisseri)E
  • 1dn: CROMB: Crook with card concealing queen: COMB (card) around R (Regina = queen)
  • 2dn: HORDEUM: Grain crop giving many people starters for usual meals: HORDE (many people) + U(sual) M(eals)
  • 3dn: LUETIC: Clue – it's contrived, pestilential (and unjustifiable): *(CLUE IT)
  • 4dn: RADIO STATION: Broadcaster delivering farewell, on time, within quota: ADIOS + T(ime) inside RATION (quota)
  • 5dn: COSTAE: Company grub served up: bones: CO + EATS reversed
  • 6dn: NAMEDROPPING: Attempt to impress in garden pomp laid out: *(IN GARDEN POMP)
  • 7dn: SERIES: Sequence I'll appear in is drying up: I inside SERES (is drying up)
  • 8dn: LASSA: Source of fever, most serious drugs, first to be avoided: (c)LASS A (most serious drugs)
  • 9dn: INHERES: Section of cabin he restored is natural: cabIN HE REStored
  • 11dn: GENS: Clan left out of highland ghylls: GLENS (ghylls) - L(eft)
  • 17dn: HAIRGEL: A girl he's taken out displaying superior dressing: *(A GIRL HE)
  • 18dn: SURCOAT: Jock's undershirt made by company in coarse cotton: CO(mpany) in SURAT (cotton)
  • 20dn: OMERTA: It stops one informing on crooked mate that's run in: O (on) + *(MATE) around R(un)
  • 21dn: IRRUPT: Italian holding roller aloft to force entry: IT(alian) around PURR (roller) reversed
  • 22dn: OPTIMA: Work period cut short, accepted most favourable conditions: OP (work) + TIM(e) + A(ccepted)
  • 24dn: SHANK: Bad shot was degrading (about fifth from rough): SANK (was degrading) around (roug)H
  • 25dn: TONY: Wally getting award from fine play?: Double definition (ref. Tonys)
  • 27dn: YINCE: St Mirren's formerly given run around by playin' Celtic: plaYIN CEltic
finally a use for my wiki

I've been wondering what to do with the wiki associated with this blog; being able to draft blog entries on the train using ikiwiki is a clear win, but I have too many choices for tools to organize information: my exploding todo list is kept in org-mode, for example.

This week, though, an opportunity presented itself: I was reminded that I'd agreed to present some undergraduate project ideas to our students on the Science without Borders scheme, and of course had totally failed to prepare anything (which, come to think of it, is perhaps not the best advertisement for org-mode – but I think it's my current use of it that's wrong). Luckily, because of SBCL's participation in Google Summer of Code, I already had a useful template, so it was a matter of a few tens of minutes of work to construct a page with a list of student projects that I'd be interested in supervising. (I didn't actually have tens of minutes to spare before I had to give the talk, unfortunately; on the other hand it's quite nice to present without being bound by a fixed agenda of slideware and bullet-points).

I'm resisting (fairly easily, for now) the temptation to use advanced ikiwiki features, having one page per project, each individually tagged and then inlining them in some complicated way – but this might come, as and when students (or anyone else on the lazyweb!) take up these projects and make progress. On the more general point of which tool contains which information, I think it's fairly clear that project ideas which don't have to be kept confidential for whatever reason could usefully be public by default; there's probably no immediate benefit – it's not as if I expect my readership to obsessively check for idea updates – but it might make for a slightly less panicky project pitch presentation.

digital-music-metadata-and-archiving

Many people have their own ways of managing their digital music collection. This is my way.

I am a relatively late convert to medium-less music. I think I might have been a relatively early adopter of digital music – or at least I was actively making purchasing decisions at a time when CDs were generally available and not too much more expensive than cassette tapes. But I've written before about my reluctance to embrace the shiny; I've been resisting digital audio files for longer than mobile phones have been able to play music (not counting Annoying Things).

And yet, there are obvious and clear advantages to having a digital and easily portable collection of music – brought home to me when I was regularly commuting 90 minutes on trains in each direction for work, and my “mp3 player” was a 1TB external hard drive weighing upwards of 1kg. Over a few years I used grip, and then sound-juicer, to convert my physical music collection of CDs to audio files; at the moment, because of something (I don't know what) in the sound-juicer chain causing the generation of broken FLACs, I use gstreamer directly:

for track in $(seq 1 $(cd-discid | cut -d\  -f 2))
do
  gst-launch-0.10 cdparanoiasrc track=$track paranoia-mode=255 ! \
    flacenc ! filesink location=track$track.flac
done

One of the nice things that sound-juicer did automatically was to import curated metadata from MusicBrainz; gstreamer doesn't do that itself, so I have had to learn how to use the MusicBrainz tagger picard to add decent-quality metadata to the audio files automatically – at least when it's available at MusicBrainz; perhaps more commonly, given my long-tail predilections, I use picard to use the CD Table of Contents as an initial seed for providing that metadata for the community. (There's a reason why most of my CD recordings of opera are unshifted as yet: the metadata standards for opera on MusicBrainz are fiddly, tedious and error-prone).

Now I have losslessly-compressed CD-quality audio files with high-quality metadata, and all is well. But if there's one thing that working with computers teaches us, it's that if the data is not backed up, it's already lost: you just don't know it yet. Not only that, but it would be good to have access to the music collection wherever I am, ideally without having to carry a “portable” hard drive along with everything else. The good news is that there's a tool for this: git-annex. (I suspect it is not coincidental that I use multiple tools by the same author: git-annex is written by Joey Hess, who is also responsible for ikiwiki). I have git annex repositories on computers an external hard drives both at work and at home, and any additions – or modifications, for example from retagging – can be synchronised across the checkouts. As long as I remember to get the content as well as git-annex's symbolic links, distribution and offsite backup requirements are automatically satisfied, and git annex even stores old copies in case of human error, which is definitely liberating: I have a safety net, so I'm free to try to fly. (Maybe that's over the top for a digital audio tagging workflow...).

Once the audio files are updated everywhere and checked out, the only thing remaining for digital audio utopia is to ask the various media servers to reindex the content. On my GNOME-based desktop, I'm a little bit out of luck at the moment; the bright new hope for music playing is gnome-music, which uses tracker for its indexing, and tracker doesn't currently follow symlinks – and the workaround of checking out an annex in direct mode is like cutting holes in my safety net. For my home music system, I use Logitech Media Server, and there it's as simple as M-x squeeze RET resc TAB RET (and I'd like it to be simpler! Hacking welcome).

To summarize:

  • Workflow:
    1. format-shift from CD audio to FLAC using gstreamer
    2. retag using picard
    3. import into git-annex
    4. sync git-annex repositories
    5. perform git-annex get on
      • the external hard drive (the same one!) which acts as the music source for my Slim Squeezebox Logitech Media Server;
      • the checkout in ~/Music/ on my workstation in the office.
    6. cause various servers to rescan or reindex their Music databases.
  • Current bugs:

All this was brought to mind because I recently made my first purchase of recordings in digital audio file form: I was listening idly to Radio 3, and heard this after the end of the evening concert. My ears tuned in gradually, and then my brain started sending contradictory messages: “it's by Pergolesi” “it's not by Pergolesi” “it's by Stravinksy” “wait what?”. I missed the announcer's statement of what the piece was, and spent a frustrating evening trying to google things like “piano arrangement "se tu m'ami"” and totally failing to find it.

The next day, I belatedly realised why they had played what they did: the following evening's concert was Marc-André Hamelin playing Katchaturian, and again I was listening idly and not really paying attention. But I paid attention to the encore, announced as: “the Minute Waltz... played in seconds!” and again, I thought “wait, what?”. Have a listen....

And, convinced that I wanted to have easy access to more of Hamelin's recorded material, I was pleased to discover that he has recorded for hyperion – which company offers digital downloads in losslessly-encoded DRM-free CD-quality FLAC format. Hooray! I feel like I have joined the 21st century.

inquisitor 1324

An enjoyable puzzle. I didn't know the Gone With the Wind quote, but I had enough letters to guess “childbirth”, and it happened to be the top Google hit for me for “childbirth quote”. As for the other... more on that a bit later.

The three unclued rows contain two part-quotations. A superfluous letter is yielded by the wordplay in each clue. Read in order, these letters complete the first quotation. The surname of the author of the second one should be highlighted in the grid.

  • T 10ac: ACCESSORY: Additional trial involving difficult company cases: not entirely sure about the wordplay here; maybe TRY around *(CO CASES)?
  • H 13ac: ORCA: Tolkein's ogre finally got away from old enclosed fruit garden: ORCHA(t); I think the definition is wrong, sadly.
  • E 14ac: SPOOM: US elks retreating gathering power, scud before the wind: MOOSE (US elks) reversed around P(ower)
  • R 15ac: SENNA: Nurse slipped back laxative drug: SEN (ref. State Enrolled Nurse) + RAN (= slipped)
  • E 17ac: LAPSANG: Variety of tea, unlimited range after falling away: LAPSE (= falling away) + (r)ANG(e); ref. Lapsang souchong
  • S 19ac: LIER: More secretive one who is incumbent: Double Definition (SLIER = more secretive; LIER = one who lies down)
  • N 20ac: LOOK YOU: Welsh observe liberal sex with African fellow: L(iberal) + NOOKY + OU (South African slang for man)
  • E 21ac: EATING: Consumption surprisingly negative, lacking value initially: *(NEGATIVE - V(alue))
  • V 27ac: CACOON: Decrepit van with rotten coco seed: *(VAN COCO)
  • E 29ac: PLAYERS: Actors' appeal not accepted in very long time: PLEA + YEARS - A(ccepted)
  • R 32ac: TRON: Bishop among people who are in Lanark market place: RR (bishop) in TON (dial. people)
  • A 35ac: BUFFOON: Wrongly making fun of Abo comic: *(FUN OF ABO)
  • N 36ac: ALIST: Stalin perversely belonging to top star group: *(STALIN)
  • Y 37ac: ROTOR: Revolving constituent operations research returned Conservative: O(perations) R(esearch) reversed + TORY
  • C 38ac: GAEA: Fixed cage about divinity: *(CAGE) + A(bout)
  • O 39ac: SEPTUPLET: Group of notes curiously spelt out en passant: *(SPELT OUT E(n) P(assant))
  • N 1dn: DAMSEL: Old unmarried woman to censure Scots individual: DAMN (censure) + SEL (Scot. self)
  • V 2dn: ECHELON: Mostly authentic half-speed (loosely) pursued by new ranked arrangement of troops: ECH(t) (authentic) + VELO(city) (speed, loosely) + N(ew)
  • E 3dn: TERNE: Unchangeable old alloy: Double Definition (ETERNE = unchangeable)
  • N 4dn: AS ALSO: Concerning nose bone turned round too: NASAL (concerning nose) + OS (bone) reversed
  • I 5dn: NOGAKU: Drama organised in August briefly OK: *(IN AUG OK)
  • E 6dn: DRIPFED: Supplied food through tube, irregularly predefined, flustered nurse away: *(PREDEFINED - E(nrolled) N(urse)); isn't it great that there are so many kinds of nurse?
  • N 7dn: APPALTI: Italian turns up supporting mate chasing cloth contracts in Rome: NAP (cloth) + PAL (mate) on IT (Italian) reversed
  • T 8dn: EXOGEN: Old plant export not originally convincing: EX(port) + (c)OGENT (convincing)
  • T 9dn: SIMURGH: Rising fog by old city with bodiless ghoulish monstrous bird: MIST reversed + UR (old city) + G(houlis)H; ref. Simurgh. Has everyone read Worm yet? Budget some spare time, then go read it.
  • I 11dn: CON-ROD: Short linking device working within raised type of Greek pillar: ON (working) in DORIC (Greek pillar) reversed
  • M 12dn: NONI: Plant found in overblown omnipresence: overblowN OMNIpresence
  • E 16dn: ANYHOW: Maltreated husband one way at least: *(H ONE WAY)
  • F 18dn: KABAYA: Indeed getting into spirit securing excellent short tunic: AY (indeed) inside KA (spirit) outside FAB (excellent)
  • O 22dn: ACT DROP: Advanced mode of cutting including one's own curtain: A(dvanced) + CROP (cutting) around TOD (own)
  • R 23dn: CONFORM: Adapt grain species: CORN (grain) + FORM (species)
  • A 24dn: INWOVEN: Complicated hotel, hosting without formal greeting: INN (hotel) around WO (without) + AVE (formal greeting)
  • N 25dn: RETIAL: Of a network of nerves connected with light sensitive tissue: Double Definition (RETINAL = regarding the retina)
  • Y 26dn: TRESSEL: Very French cunning accepting English support: TRES (Fr. very) + SLY (cunning) around E(nglish)
  • O 28dn: ARBOUR: Furiously roar about cropped bower of trees: *(ROA(r) ABOU(t))
  • F 29dn: PROMPT: Don associated with politician to primarily help with words: PROF (university don) + MP (politician) + T(o)
  • T 30dn: LENGTH: Stretch temporarily provided great height: LENT (temporarily provided) + GT (great) + H(eight)
  • H 31dn: SHTETL: Jewish village hotel regularly supporting troubled Esth: H(o)T(e)L under *(ESTH)
  • E 33dn: OUTS: Excels, abandoning party, reveals sexual orientation: OUTDOES (excels) - DO (party)
  • M 34dn: ALEPH: Heartless paragraph at end of masculine letter: P(aragrap)H after MALE (masculine)

So the extra words complete the quotation in 1ac and 22ac, which read (after filling in the blanks) “Death and taxes and childbirth”. The bottom line read PR?M?NTH?H?LL, and after a little bit of meandering – “prom on the hill”? – the obvious “pram in the hall” came to mind, and indeed Connolly is visible down the main diagonal.

That gives me an opportunity to mention (relatively safely, since surely no-one reads these crossword blogs) another aspect of my productivity. Like some, I don't think that a pram in the hall is necessarily the ultimate “sombre enemy of good art”, but I think it is true that having children can change priorities: in BC days, it was perfectly possible and reasonably common for me to stay at work late, or work in the evenings or weekends in addition to a more-than-full working week. This is not to say that this doesn't happen at all any more, but it's certainly much less routine, and to an extent the evening and weekend work is now necessary to get my working time up to a full working week, given the need to do school runs or hospital appointments. And one thing that successful work in academia might share with art is its vulnerability to distraction: in academia, prestige and progression come from high-profile research, which both needs focus and tends to be what is achieved after all the other things have been dealt with: teaching, certainly, and any substantial administrative responsibilities. It's perfectly possible to do useful amounts of administration in the 20-minute block of time when a child is entertaining themselves; deep thought, as with programming “flow”, takes time to achieve.

And maybe the moral is that it comes back: in retrospect, it might not have been sensible to move house, start a company and have a child within the space of one year. I suspect there's no good time to do any of those things, let alone all three, and some of the lack of motivation and energy was down to, well, tiredness: but it feels like I am substantially more productive than I was two years ago, and that is a good feeling.

smile and mysociety

It was a pleasure to welcome Matt Green back to Goldsmiths; I had the pleasure of teaching him in his Foundation year way back in 2007, and also for Creative Computing 2 (as was). Matt went off to work in the digital agency world, first with Euan Millar at disturb media, and now at Smile Machine. In retrospect it was perhaps wrong to spend the 5 minutes or so of warm-up act ranting about mobile world congress and mobile phones in general, given how much of a digital agency's time is taken up by making sure that the latest and greatest brand campaign is directly beamed to everyone's brain; this in no way resembles satire from the 1950s, no, not at all.

Still, Matt managed to shrug off the awkwardness, and talked through some of his recent projects – the spirit level was cute – and perhaps more importantly some of the working issues. It was good to hear him talk about the hours: I paraphrase, but something like “sure, some people are there when I get in, and are still there when I leave... but I have a kid at home” is an important message. I think it's possible that since he is a recent(ish) graduate, the current students felt that they had enough of a shared background with Matt to ask him more detailed and personal questions than they have tended to in this series.

The second speaker for the session was Mark Longair of mySociety – in one of those “small world” or possibly “shared background” events, I wrote to mySociety's generic contact address asking whether anyone would be interested in talking to our undergraduates about development and technology work in the third sector, and Mark replied. I don't think we'd actually met before, but we certainly had mutual friends from our undergraduate days (not least Chris Lightfoot), and just as personally, my final undergraduate project was done under the supervision of Malcolm Longair. Small world – how many people with a surname of “Longair” have a CRSid for their Twitter handle?

I liked the slightly subversive slant Mark gave to mySociety's work – or at least the emphasis on speaking truth to power. The Freedom of Information platform WhatDoTheyKnow was perhaps the most obvious of those: by making it really easy to make FoI requests through a platform which stores the requests and responses, and makes them public, it provides an audit trail for later inspection. Also, deploying the WDTK platform in countries with no FoI legislation is a pretty cool hack.

And of course it's not just one site; FixMyStreet is a highly useful way of logging issues, and Mark described the fact that it's effectively a public bugtracker for local councils as having for a side effect increasing the visibility of mundane problems to those in power. I'm not sure that that is the best possible way of relating citizens to local authorities, but I suppose the status quo is already a long way away from the best of all possible worlds, and the FixMyStreet site at least doesn't go out of its way to give Outraged of Anywhere a direct way of venting noisily.

And then over lunch, my student Justin Gagen got to talk to Mark about repurposing sayIt for displaying the librettos for Wagner operas, to help visualise and link results from our research into leitmotif. In an ideal world, this blog entry would announce the successful import and display of the libretto as Akoma Ntoso, but sometimes the real world doesn't work out quite as neatly as it should. Another time.

azed 2179

Pff. Quite a lot of obscurities (to me, at least), and I have to confess to outside assistance for 28dn. Finished in the nick of time to preserve my 100% record (since mid-January, so not really much of a 100% record, but it's important to me).

  • 1ac: CLUMP: Book lost by club member – clot: CLUB - B(ook) + MP (member of parliament)
  • 8ac: SUBER: Cork it's hell getting back, leaving aside opening: (e)REBUS (hell) reversed
  • 12ac: HORA: Dance music, the limit for harmonica: H OR A (limits of harmonic); ref. Hora, which is not in my Chambers (1993)
  • 13ac: INAURATE: A ruin, battered and corroded, rarely gilded: *(A RUIN) + ATE (corroded)
  • 14ac: URNED: Like tea or coffee made for an audience?: sounds like “earned” (made)
  • 16ac: PANTAGRUELION: Magic herb adding puff to a thin liquor, one gracing menu?: PANT (puff) + A GRUEL (thin liquor) + I (one) + ON (on the menu)
  • 17ac: REIF: Pillage of Scots creating touching condition: RE (creating?) + IF (condition)
  • 19ac: MARSALA: Strong sweet wine sadly beak sent back: ALAS (sadly) + RAM (beak)
  • 20ac: CROSSFISH: Rather angry about following asteroid: CROSSISH (rather angry) around F(ollowing); ref. Sea star
  • 23ac: STEALTH: Whisked lattes, hot – secret process: *(LATTES H(ot))
  • 26ac: JANN: You'll find Trojan never imbibing such weakish spirits: troJAN Never
  • 27ac: SELF-ASSURANCE: Fuss as cleaner is sacked? Confidence required: *(FUSS AS CLEANER)
  • 31ac: ALLEY: It's certainly bordered by lines? Yes, or the other way round: YEA (yes) around LL (lines) reversed; double use of “the other way round”
  • 32ac: EPIDURAL: Dial up re being feverish, wanting relief from labour: *(EPIDURAL); this was for a long time this week the only entry I had in the grid, bringing amusement to the veterans of childbirth in the house.
  • 33ac: ZATI: Monkey from South Africa with reverse of appeal: ZA (South Africa) + IT (appeal) reversed
  • 34ac: LENOS: Thin fabrics – love coming into contact?: LENS (as in “contact lens”) around O (love)
  • 35ac: SAROS: Rails over very long time cycle: SORAS (rails) reversed.
  • 1dn: CHAPRASSI: Fellow accompanying prince is brought up as an orderly: CHAP (fellow) + RAS (prince) + IS reversed
  • 2dn: LOMA: Sort of fringe an old pro cut from below: A MOL(l) (old “pro” as in prostitute) reversed
  • 3dn: URANIC: Once celestial queen is found in the heart of such: RANI (queen) in (s)UC(h)
  • 4dn: PARABOLANUS: Church layman tending the sick of old (as S. Paul on being upset about urchin): *(S PAUL ON) around ARAB (urchin)
  • 5dn: DINGUS: Beat with American doodad: DING (beat) + US (American)
  • 6dn: ONER: Bouncer from Jonson, erratic: jonsON ERratic; though ONER is “lie” and bouncer is a “liar”, so, hm.
  • 7dn: PADUA: Where Anthony lived and died, going into shell: PAUA (shell) around D(ied); ref. Anthony of Padua
  • 8dn: SUPERIORESS: Is she unsettling to pure sisters if not TT? *(TO PURE SISTERS - TT) &lit.
  • 9dn: URAL: River suggesting the country separated from its source: (r)URAL (country)
  • 10dn: BANIA: Climbing a hilltop, I planted a fig tree: A NAB (hilltop) reversed around I
  • 11dn: ETIOLIN: Plants denied light display it: see one riverain's holding up: NILOTE (riverain) around I (one) reversed
  • 15dn: ANAMNESIS: One muddled names and lives in recollection of Proust: AN (one) + *(NAMES) + IS (lives)
  • 18dn: EUTERPE: Energy required in scrambling up tree, palm genus: *(UP TREE) around E(nergy)
  • 21dn: FOULLY: Disgustingly posh, boused in e.g. mock ruin: U (posh) in FOLLY (mock ruin)
  • 22dn: HANGAR: Surrogate mother keeping son, so abandoned, in large shed: HAGAR (surrogate mother; ref. Hagar) around SON - SO
  • 24dn: ELSIN: Sort of Scottish punch – single drunk, not good: *(SINGLE - G)
  • 25dn: TSARS: Official adjudicators giving ‘special’ in ratings?: S(pecial) in TARS (ratings, as in “sailors”)
  • 28dn: FADO: Following difficulty striking new driver, golfer displays dejected air: F(ollowing) + ADO (difficulty) / FALDO (ref. Nick Faldo) - L; ref. Fado
  • 29dn: SLAB: Substantial piece of cake, second, shortened party: S(econd) + LAB (ref. Labour Party)
  • 30dn: CITO: Heads for courier in treating order with despatch: C(ourier) I(n) T(reating) O(rder)
http-content-negotiation-and-generalized-specializers

I promised a non-trivial example of a use for generalized specializers a while ago. Here it is: automatic handling of HTTP (RFC 2616) Content-Type negotiation in computed responses.

In RESTful services and things of that ilk, a client indicates that it wants to apply a verb (GET, for example) to a particular resource (named by a URN, or possibly identified by a URI). This resource is a conceptual object; it will have zero or more concrete manifestations, and content negotiation provides a way for the client to indicate which of those manifestations it would prefer to receive.

That's all a bit abstract. To take a concrete example, consider the woefully incomplete list of books in my living room at openlibrary. A user operating a graphical web browser to access that resource is presumed to want to retrieve HTML and associated resources, in order to view a shiny representation of the information associated with that resource (a “web page”, if you will). But the human-oriented representation of the information is not the only possible one, and it is common practice in some circles to provide machine-readable representations as well as human-oriented ones, at the same URL; for example, try:

curl -H 'Accept: application/json' https://openlibrary.org/people/csrhodes/lists

and observe the difference between that and visiting the same URL in a graphical browser.

How does the web server know which representation to send? Well, the example has given away the punchline (if the links above to RFC sections haven't already). The graphical web browser will send an Accept header indicating that it prefers to receive objects with presentational content types – text/html, image/* and so on; the browser I have to hand sends text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 as its Accept header, meaning “please give me text/html or application/xhtml+xml, or failing that application/xml, or failing that anything else”. If the server has more than one representation for a given resource, it can use this client-supplied information to provide the best possible content; if the client has particular requirements – for example, attempting to find machine-readable content for further processing – it can declare this by specifying particular acceptable content-types in its Accept header.

For a resource for which more than one representation exists, then, the server must dispatch between them based on the client Accept header. And this is exactly a non-standard dispatch of the kind I've been discussing. Consider a resource http://foo.example/ which is implemented by sending the return value of the generic function foo back to the client:

(defgeneric foo (request)
  (:generic-function-class accept-generic-function))

The default behaviour is somewhat a matter of taste, but one reasonable choice is that if no content-type matches we should use the defined HTTP status code to indicate that the responses we could generate are not acceptable to the client:

(defmethod foo ((request t))
  (http:406 request))

Maybe we have a couple of presentational representations for the resource:

(defmethod foo ((request (accept "text/plain")))
  "Foo")

(defmethod foo ((request (accept "text/html")))
  "<!DOCTYPE html>
<html>
 <head><title>Foo</title></head>
 <body><p>Foo</p></body>
</html>")

And we might have some machine-readable representations:

(defmethod foo ((request (accept "text/turtle")))
  "@prefix foo: <http://example.org/ns#> .
@prefix : <http://other.example.org/ns#> .
foo:bar foo: : .")

(defmethod foo ((request (accept "application/rdf+xml")))
  "<?xml version=\"1.0\"?>
<rdf:RDF xmlns:rdf=\"http://www.w3.org/1999/02/22-rdf-syntax-ns#\"
         xmlns:foo=\"http://example.org/ns#\">
  <rdf:Description about=\"http://example.org/ns#bar\">
    <foo:>
      <rdf:Description about=\"http://other.example.org/ns#\"/>
    </foo:>
  </rdf:Description>
</rdf:RDF>")

(I apologize to any fans of XML/RDF if I have mangled that).

Now a graphical web browser sending an accept header of text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 as above will cause the server to send the HTML version, as that is the most specific applicable method to that accept string. Given this, it is perfectly possible to construct specialized clients with alternative preferences expressed in the accept header. A terminal-based client might prioritize text/plain over text/html (though in fact neither w3m nor lynx does that, at least in the versions I have installed). A client for the Semantic Web might instead accept data in serialized RDF, preferring more modern serializations, by sending an accept string of text/turtle,application/rdf+xml;q=0.9. All these clients could each be served the resource in their preferred format.

The case of serving one of a set of alternative files hosted on the filesystem in response to a request with an arbitrary accept string is different; in this case, it doesn't make sense to do the dispatch through methods. If we were to try to do so, it would look something like

(defmethod filesystem-handler (url (content-type (accept "text/html")))
  (let ((prospect (pathname-for-url url "html")))
    (if (probe-file prospect)
        (serve-file prospect "text/html")
        (call-next-method))))

but we would need to define one such method per possible mime-type we might want to serve: doable, but unnecessary compared with the alternative strategy of finding all content-types servable for a given url, then choosing the one with the highest score:

(defun filesystem-handler (url accept)
  (do* ((prospects (files-for url) (cdr prospects))
        (mime-types (mapcar #'mime-type prospects) (cdr mime-types))
        result mime-type (q 0))
       ((null prospects) (serve-file result mime-type))
     (when (> (q (car mime-types) accept) q)
       (setf result (car prospects) 
             mime-type (car mime-types) 
             q (q (car mime-types))))))

(the set of files on the filesystem effectively already define a set of methods for a given url; it doesn't make sense to try to mirror that as a set of reified methods on a generic function. Also, I've written this out using do* largely to keep the do*-is-not-that-bad society alive.)

Anyway. There's an interesting detail I've elided so far; not only do response-generating functions have to generate the content they wish to send in the response; they also have to indicate what content-type they are actually sending. Our accept-generic-function already handles dispatching on content-type; can it also take responsibility for setting the content-type of the response?

Why yes! The way to do this is using a method combination; it might look something like this:

(defvar *actual-content-type*)

(defgeneric handle-content-type (request))

(define-method-combination content-negotiation/or ()
  ((around (:around))
   (primary () :required t))
  (:arguments request)
  (labels ((transform/1 (method)
             `(make-method
               (progn
                 (let ((s (car (sb-mop:method-specializers ,method))))
                   (when (typep s 'accept-specializer)
                     (setf *actual-content-type* (media-type s))))
                 (call-method ,method))))
           (transform (primaries)
             (mapcar #'(lambda (x) `(call-method ,(transform/1 x)))
                     primaries))
           (wrap (form)
             `(let ((*actual-content-type*))
                (multiple-value-prog1
                    ,form
                  (handle-content-type ,request)))))
    (let ((form (if (rest primary)
                    `(or ,@(transform primary))
                    `(call-method ,(transform/1 (car primary))))))
      (if around
          (wrap `(call-method ,(first around)
                              (,@(rest around) (make-method ,form))))
          (wrap form)))))

This behaves just like the or built-in method-combination, except that when calling a primary method whose specializer for the first argument is one of our accept-specializers, the content-type of the specializer is stored in a special variable; the last thing the effective method does is to call the new handle-content-type generic function, passing it the original generic function's first argument.

Now let's redefine our foo generic function to have the new method combination, and a method on handle-content-type:

(defgeneric foo (request)
  (:generic-function-class accept-generic-function)
  (:method-combination content-negotiation/or))

(defmethod handle-content-type ((x string))
  (format t "Content-Type: ~A~%" *actual-content-type*))

and now, finally, we can try it all out:

SPECIALIZABLE> (foo "text/plain,text/html;q=0.9,*/*;q=0.8")
Content-Type: text/plain
"Foo"

SPECIALIZABLE> (foo "text/turtle,application/rdf+xml;q=0.9")
Content-Type: text/turtle
"@prefix foo: <http://example.org/ns#> .
@prefix : <http://other.example.org/ns#> .
foo:bar foo: : ."

SPECIALIZABLE> (foo "audio/mp3")
406

OK, but by what magic do these accept-specializer objects exist and function? I wrote a paper about that, with Jan Moringen and David Lichteblau: as part of my ongoing open access experimentation, the version we submitted to the European Lisp Symposium is viewable at Goldsmiths' e-prints repository or on arXiv. The ELS Chairs have just announced a deadline extension, so there's still time (until March 23) for anyone to submit technical papers or abstracts for tutorials and demonstration sessions: please do, and I hope to see many of my readers there.

postgraduate study and digital art

For the first session after half-term reading week, I invited our postgraduate course leaders to present their postgraduate programmes, in the context of a general discussion about further study as an option. As it happens, most of them were unable to make it; Andy Thomason, from the MSc in Computer Games and Entertainment, was able to come, and he brought along some of the current students. The message that he was delivering was clear (to me at least): if you want to be hired as a games developer, it's the C++ and maths skills that are in greatest demand.

The students have had plenty of chances to hear the message that they should have a portfolio of work to be able to demonstrate to employers what they can do. Andy's comments might have made it a bit clearer that the portfolio isn't just a collection of work: it's a product in itself, and it can be optimized for particular purposes just as any other product. As a showcase to gain employment, it should put the product of the in-demand skills front and centre: in particular, if the skills in demand are technical, such as C++ and maths, then construct examples that demonstrate those skills. Procedurally-generated terrain and realistic fog trump pretty terrain and artistic fog.

And of course I was there, wearing my MSc programme leader hat for our MSc in Computing, and very neatly suffering from a conflict of interest. In the sessions so far, I have been the voice of cynicism, trying to make the students think critically about what they were hearing; now, I was selling further study – worse, “more of the same” study – to the same audience. The good news is that I could claim any outcome as a victory; for the record, the number admitting to considering further study decreased after the talks, though I hesitate to draw a causal link from anything in particular anyone said.

To counterbalance the cynicism, and the sales pitch, I asked Becky Stewart from Codasign and Anti-Alias Labs to talk about some of the things she's been up to recently. She started by adding one possible motivation for postgraduate study: as she put it, it is way easier to go to a foreign country on a student visa than to be allowed to stay for any length of time for work – and she spoke with the voice of bitter experience. Although we in the UK have (at least for the moment) the privilege of being allowed to move about freely within the EU, it's not something that we can necessarily take for granted for very long. Following its recent referendum on immigration, Switzerland is finding that it is no longer benefiting from all the privileges previously afforded to it, and the possibility that either the anti-immigration crowd or the broader anti-EU campaigners get their way in the UK and take us out of associations is unfortunately non-negligible – and travel elsewhere is tricky and can involve significant paperwork.

Becky then showed some of her portfolio: projects she's worked on, complete with well-produced videos; for example, the GPS Shoe. This was particularly apposite, given Andy's talk about portfolios: the video is high-quality, clearly documents the project – and some distance from the “truth” of the matter, because the video was made before the electronics were complete, adding extra meaning to “fixing it in post-production”.

And, analogously, after presenting her other work, participating in art projects and leading workshops in creative electronics (including sewing workshops at technology conferences) Becky calmly told the students that although the art projects are what she talks about, and they're how she markets herself at least some of the time, they're not the projects that pay the bills: she earns money from freelancing in the creative undustries, so that she can work on high-profile art. And so we come full circle: portfolios as showcases. I don't know if Becky will thank me or not to draw attention to the hyperbolic trousers she made for my daughter some years back; maybe the next version needs more LEDs?

azed 2178

A prize puzzle this week, with PARISON the word to clue, meaning a lump of glass, ready to be moulded. Inspiration did not strike. There were a number of errors in the printed version of the crossword, which made some of it more interesting until twitter pointed me at the discussion about it. Clues below are the corrected versions.

  • 1ac: ASTROCOMPASS: Pilot's direction-finder or mascot adjusted before transfer: *(OR MASCOT) + PASS (transfer); I didn't find astrocompass under either astro- or compass in my Chambers, but Wikipedia has it.
  • 10ac: PARISON: A lump of glass for moulding
  • 11ac: OATHS: Curses pipes around start of Hogmanay: OATS (= pipes) around H(ogmanay)
  • 13ac: QUAPAWS: Their womenfolk will appear leaderless, burying father: (s)QUAWS around PA; &lit (ref. Quapaw)
  • 14ac: COOT: Bill's other half cut it – silly: COO (ref. bill and coo) + (i)T
  • 16ac: APOPHYGE: Work extremes of hilarity into edited page – part at top or foot of column: OP (work) + H(ilarit)Y inside *(PAGE)
  • 17ac: GIRNS: Ugly expressions from sailors captured by foreign troops: RN (sailors; ref. Royal Navy) inside GIS (foreign troops; ref. G.I.)
  • 18ac: PILUM: Part of old soldier's kit – this set gets miles put out: *(MILES PUT - SET) = PILUM
  • 20ac: GEOPHAGY: Wildly eggy about a hop going wrong – sign of mania?: *(EGGY) around *(AHOP); ref. Geophagy
  • 23ac: CHARISMA: Personality one follows is weathed in allure: CHARM (= allure) around IS + A
  • 27ac: LAKIN: Little old lady is havin' a work break up north: LAKIN(g) (= dial. play)
  • 28ac: ACTOR: Player in Milan team, rubbish back: AC (ref. A.C. Milan) + ROT reversed
  • 30ac: ANTABUSE: One pill to take as treatment for alcoholism: AN (one) + TAB (pill) + USE (take)
  • 32ac: STAP: Portion of ripest apples and stuff that's gone: ripeST APples
  • 33ac: STINGOS: Tossing off strong drinks: *(TOSSING)
  • 34ac: SITUS: Positions befit me (as editor might put it): SIT (befit) + US (editorial me)
  • 35ac: EERIEST: Extremely weird lake in east of France: ERIE (ref. Lake Erie in EST (= fr. East); this clue in the printed had “Germany” instead of “France”, which was mildly confusing
  • 36ac: CROSSDRESSER: Perry maybe balancing on sideboard: CROSS (= balancing) + DRESSER (= sideboard); ref. Grayson Perry
  • 2dn: SAULIE: What'll make Scots keener? That is following old king? SAUL (ref. Saul) + IE (that is)
  • 3dn: TRAPROCK: E.g. basalt for filling course: PRO (for) inside TRACK (= course)
  • 4dn: RIPEN: Port wine's bottled? Stow to mature thus: ?
  • 5dn: COWPEA: Poet giving away recipe for a legume: COWPER (ref. William Cowper - R(ecipe) + A
  • 6dn: ON SONG: Performing well, Ben maybe loses his first grand: (j)ONSON (ref. Ben Jonson) + G(rand)
  • 7dn: MOOP: The Scots speak indistinctly, low and soft: MOO (lowing sound) + P (piano)
  • 8dn: PACHISI: Brewed cha coming in I drink up – while playing this? *(CHA) in I SIP (= drink) reversed; ref. Pachisi
  • 9dn: SHOGUN: Military governor has shortened broad cannon?: S (has shortened) + HO (slang for sexually loose woman) + GUN (cannon).
  • 12dn: STEMWARE: Mats we're given in arrangement for wine glasses, etc: *(MATS WERE)
  • 15dn: EGG GLASS: Timer with which girl follows say gee-gee: EG (say, as e.g.) + GG (gee-gee) + LASS (= girl)
  • 19dn: LASTAGES: Some duties go on for a long time: Double Definition
  • 21dn: PRIAPUS: Guardian of gardens? Matter holding partner up: SUP (matter) around PAIR (partner) reversed
  • 22dn: SANTIR: Its music is hammered out, a lilting strain: *(STRAIN)
  • 24dn: HOUSED: Put up sort of trough, to employ inside: HOD (= trough) around USE (= employ)
  • 25dn: AUSTER: Visitor to Italy blowing in from the south, e.g. Paul: Double definition; ref. Paul Auster
  • 26dn: MOROSE: Like the Carpenter, or his mate, swallowing first of oysters? MORSE (= Walrus) around O(ysters); ref. The Walrus and the Carpenter
  • 29dn: CANIS: It includes Obaman's ‘Bo’, among Americanisms: ameriCANISms; ref. Bo
  • 31dn: BUSS: Fishing vessel, or smack: Double Definition (smack = kiss)
inquisitor 1322

I like Inquisitors; solving them usually teaches me something. This one was no exception; I did not know that the Brownies were known as the Rosebuds until 1915. In this one, the rubric did not look too scary:

Clashes in a small number of cells must be resolved, and the central square filled, to display a prominent 25 associated a century ago with the name at 6ac. The revised name, adopted the following year, must be entered in the blank space at 40, forming new words downwards. One answer is an acronym.

Not only did it not look too scary, but 25dn was clued, and CITIZEN came out fairly quickly, and when I saw WELLES down the main diagonal, and the final D in 6 across from DOTS, that gave ROSEBUD, and the clashes in the grid could be resolved to give ORSON to precede Welles, and all looks well. But! Citizen Kane was from 1941: by no stretch of the imagination was that a century ago. So, what were the other letters from the clashes? DENP. Hm. Oh, look, the first two letters on the main diagonal are BA – and BADEN-POWELL would indeed fit the preamble. And 6ac clues for ROSEBUD in both contexts. Very nice indeed. (See fifteensquared for more analysis.)

  • 6ac: ROSEBUD: Potential peace maker?: Cryptic Definition; see above

  • 40ac: BROWNIE (unclued)

azed 2177

Not too hard this week; in contrast to last week, this didn't keep me up at night. I enjoyed discovering that “beeswing” was an upper crust (on port, what else?), and that “earlierise” is a verb meaning to make earlier.

  • 1ac: BEESWING: Upper crust gathering accompanied by big-band jazz: BEE (gathering) + SWING (big-band jazz); Beeswing
  • 7ac: OSSA: Bones when in this condition must be retrorse: AS (when) SO (in this condition) reversed
  • 10ac: OPHIOLATER: E.g. moccasins I adore – I loathe going out in old pair: O(ld) P(ai)R around *(I LOATHE)
  • 11ac: FREE-ARM: Weapon without charge, with no support for member: sort-of Double Definition I suppose
  • 13ac: FLOR Pro bottling left in what adds to sherry's flavour: FOR around L(eft); Flor
  • 14ac: MISHNAH: I'm backing king about new legal code: I'M reversed + SHAH (king) around N(ew)
  • 15ac: CISTERN: Rains etc will be wasted without a water storage device: *(RAINS ETC) - A; nice surface reading
  • 16ac: SCENA: Part of opera: you'll see I hum its — haltingly for the musicians: *(SCENA + I HUM ITS) = *(THE MUSICIANS)
  • 17ac: LECHWE: Antelope, female ruminant devouring bits of coarse hay beside lake: L(ake) + EWE (female ruminant) around bits of C(oarse) H(ay); Lechwe
  • 22ac: FRANCS: Foreign money from Norway wrapped in folded sash?: N(orway) inside SCARF reversed
  • 23ac: DIPSO: Compulsive boozer ducks round: DIPS (ducks) + O (round)
  • 24ac: HUMMAUM: Sweaty place, creating pong, one gone round by mother: HUM (creating pong, smelly) + MUM (mother) around A (one)
  • 26ac: PSYLLID: More than half tipsy, Aussie fool, backward sucker?: (ti)PSY + DILL (Aus. fool) reversed; Psyllid
  • 28ac: BARP: Scottish cairn you'll get to from top thus: to = top BAR P
  • 30ac: GONIDIA: Lichen cells active after application of indigo: *(INDIGO) + A(ctive); Gonidium (at time of writing, "This Alga-related article is a stub. You can help Wikipedia by expanding it". So if you're an expert on algae, or lichen, go ahead!)
  • 31ac: LEADARMING: Queer male in drag? It helps to ascertain bed's contours!: *(MALE IN DRAG)
  • 32ac: LITE: Advertising's not so bad fo you, one's learned rate free: LITERATE - RATE
  • 33ac: TEOSINTE: Casse Noisette? It's devoured by herds in e.g. Mexico: *(NOISETTE); Teosinte
  • 1dn: BAFF: Mishit once, reverse of t-triff: F-FAB reversed
  • 2dn: EARLIERISE: Bring forward noble flowers mostly round end of June: EARL (noble) + IRISE(s) (flowers) around (Jun)E
  • 3dn: SPERTHE: Old battle-axe? The woman's saucy inside: SHE around PERT (saucy)
  • 4dn: WHARE: House for Maoris won over race: W(on) over HARE (= race); Whare
  • 5dn: NOMINA: Clan names? One I'm assigned to is coming up: AN (one) + IM + ON (assigned to) reversed
  • 6dn: GLOSSER: Commentator covering bad result in Germany: LOSS (bad result) in GER(many)
  • 7dn: OATH: Part of credo, a theological appeal to heaven: credO A THeological
  • 8dn: STONERN: Rocky's skin lotion kept in tin: TONER (skin lotion) in SN (tin)
  • 9dn: ARCHAISM: Tea's limited in power, what you'd expect from a real oldie: CHAI'S (or CHA IS) in ARM (power)
  • 12dn: MANICURIST: One caring for e.g. nails, crazy over more than half of rustiness dealt with: MANIC (crazy) + *(RUSTI)ness
  • 15dn: CLODPOLL: Dolt? Class rejecting one's messy dollop: CLASS - ASS (dolt) + *(DOLLOP)
  • 18dn: COPYCAT: Pacy wriggling in bed – purr maybe imitated?: *(PACY) inside COT (bed)
  • 19dn: WOOLFAT: Virginia perhaps aiming for something in the ointment: WOOLF + AT (aiming for something); ref. Virginia Woolf
  • 20dn: BAMBINI: Children admitted being bitten by favourite deer? IN inside BAMBI; ref. Bambi
  • 21dn: CHIGRE: Hosted by such, I greet parasite getting under one's skin: suCH I GREet
  • 25dn: MANIS: Sort of cuckoo found in Mississippi: it eats ants: ANI (cuckoo) in MS (Mississippi)
  • 27dn: LODE: Bottom of thick overcoat disappearing in open ditch: LODE(n); ref. Loden cape
  • 29dn: PANE: Quarry group of workmen approach from below: workmEN APproach reversed; ref. Leadlight
eye crossword 515

More in-jokes, smut and topical references than in the last issue; 1ac is particularly self-referential, and should we worry about “try in vain” and “all is lost”? (This issue of Private Eye is also notable for publishing correspondence from a friend of mine – at least, how many Julian Thomases can possibly live in Tonbridge, Kent?)

  • 1ac: UGANDA: Roger somebody or other to discuss this country?: Cryptic Definition; ref. Ugandan relations
  • 5ac: CATCALL: To cry after pisspoor act is a bad thing for luvvies: *(ACT) + CALL (cry)
  • 9ac: OUTCOME: Having revealed your sexual inclination, climax – result!: OUT (revealed sexual inclination) + COME (climax)
  • 10ac: POLITE: Refined sex needs protective support: IT (sex) inside (protected by) POLE (support)
  • 11ac/25ac: ONLY JUST: “Barely lust!” Joy snapped grabbing penis at its centre: *(LUST JOY) around (pe)N(is)
  • 12ac: DOPE PUSHER: One who puts pressure on idiot dealer: Double definition, sort of
  • 13ac: WHITE FLAG: Light a few twists as sign that you've had enough: *(LIGHT A FEW)
  • 16ac/18ac: GOOD GUYS: Slush fund finally takes the piss out of the police: GOO (slush) + (fun)D + GUYS (mocks)
  • 19ac: EDUCATION: Miliband abandoned caution in Gove's unreliable hands?: ED (ref. Ed Miliband) + *(CAUTION); ref. Michael Gove, Secretary of State for Education
  • 21ac: FRONT BENCH: Support beneath ministerial arses: Cryptic Definition
  • 26ac: SPRAWL: Clasp raw legs, centrally spread: claSP RAW Legs
  • 27ac: SUBSIDY: Lunatic busy roping in Tony's old sidekick for public financial support: *(BUSY) around SID (ref. Sid James, or possibly Sid Jenkins)
  • 28ac: DYNASTY: Maybe House of Windsor's extremely dreary, repulsive...: D(rear)Y + NASTY (repulsive)
  • 29ac: TATERS: ...crap Queen Elizabeths and King Edwards?: TAT (crap) + ERS; ref. King Edward.
  • 2dn: GROUNDHOG: Rodent Gordon – ugh! – going ballistic: *(GROUNDHOG)
  • 3dn: NUTTY: Balls-like crackpot: Double Definition
  • 4dn/23dn: A LOAD OF BALLS: Answer: Ed's commitment is claptrap?: A(nswer) + LOAD (commitment) OF BALLS (Ed's; ref. Ed Balls)
  • 5dn/15dn/24dn: CHEAP AND NASTY: Offensively worthless Andy's penis is out – a chat is out: *(ANDYS PEN(is) A CHAT)
  • 6dn: TIP UP: “Turn over” hint on having a stiffy: TIP (hint) + UP (erect)
  • 7dn: ALL IS LOST: Sun is back in one line agenda – prepare for the worst: SOL reversed in A (one) + L(ine) + LIST (agenda)
  • 8dn: LATTE: Recoil at terrorists stocking drink: recoiL AT TErrorists
  • 14dn: TRY IN VAIN: Scoring is futile: fail to reach satisfactory climax: TRY (scoring) IN VAIN (futile)
  • 17dn: DOOMSAYER: Mayor does broadcast: his forecasts are dire: *(MAYOR DOES)
  • 20dn: COHABIT: Live with your partner cook's 50% drug dependency: CO(ok) + HABIT (drug addiction)
  • 22dn: RAPID: End of banker – paid off, pdq: (banke)R + *(PAID)
  • 25dn: JOINT: Common carve-up?: Double Definition
guardian 26190

A fun diversion from Paul, with some nice surfaces (e.g. 12ac, 27ac, 3dn). Not too hard.

  • 9ac: LAGER LOUT: Fancy rogue and tall yob: *(ROGUE TALL)
  • 10ac: HATER: One despising another mad character half-heartedly: HAT(t)ER
  • 11ac: CHICORY: Herb that's trendy with duck wings on rosemary: CHIC (trendy) + O (duck) + R(osemar)Y
  • 12ac: GOOD-BYE: Word used in separation – “a snip”, say?: sounds like “good buy”
  • 13ac: ROOK: Con man: Double Definition
  • 14ac: DETACHMENT: Unit chatted about outstanding soldiers: *(CHATTED) around MEN (soldiers)
  • 15ac: COARSEN: Make roughly a hundred rowers minus a thousand: C + OARSMEN - M
  • 17ac: SARDINE: Fish to eat by river while lying back: R(iver) AS reversed + DINE (eat)
  • 19ac: LIP-READING: University on the border studying speech: LIP (border) + READING (University?)
  • 22ac: SEMI: Half of house missed: houSE MIssed
  • 23ac: NEW YORK: A city doubled in number?: ?
  • 24ac: TEASING: Carol, after a drink, flirting: TEA (drink) + SING (carol)
  • 26ac: E COLI: Company crushed by priest, a sickener: CO(mpany) inside ELI (priest)
  • 27ac: IDRIS ELBA: A risible dickhead floundering as Mandela interpreter: *(A RISIBLE D(ickhead))
  • 1dn: ELECTRIC BLANKET: Exciting total one's charged for heating: ELECTRIC (exciting) BLANKET (total)
  • 2dn: AGRICOLA: Rowling character shaving head and bottom, sparkling stuff in general: hAGRId (ref. Hagrid) + COLA (sparkling stuff); ref. Agricola
  • 3dn: ARVO: A propotion of popular vote for Australian PM: populAR VOte; meaning “afternoon” (p.m.)
  • 4dn: TONY BENN: Popular political veteran an insubstantial figure, according to Spooner: BONY TEN, spoonerized
  • 5dn: STIGMA: Mark, Athenian character shackling Turkish leader: SIGMA around T(urkish)
  • 6dn: THE OTHER: Sex neither this nor that?: Double Definition
  • 7dn: STABLE: Secure horses: Double Definition
  • 8dn: ERNEST HEMINGWAY: Author writing about men – his weren't gay: *(MEN HIS WERENT GAY)
  • 16dn: STEP ON IT: Crush something underfoot – hurry up!: Double Definition
  • 17dn: SANITARY: Hygienic topless bar – madness?: this is tricky: we have (b)AR (topless bar) (in)SANITY (madness)
  • 18dn: INEDIBLE: Poisonous jerks lie in bed: *(LIE IN BED)
  • 20dn: POWWOW: Work having arisen, duck into internet meeting: OP (work) reversed and O (duck) inside WWW; life is probably too short to complain about the conflation of the Web and the Internet in crosswords...
  • 21dn: DIK-DIK: Antelope bringing up a couple of children: KID twice reversed
  • 25dn: ALSO: A capital's musicians on top: A + LSO (ref. LSO)
sbcl release management in the air

Just because I'm attending mobile world congress doesn't mean that everything else stops. It's the end of the month, so it must be time to release sbcl. This month's is a little unsatisfying, because we've only achieved one of the two things I'd hoped for: we've been cautious and conservative after last month's landing of the new register allocator, but we haven't sorted out what's going on to cause the less active architectures to fail to build. There are some workarounds that have been mooted; for one reason and another no-one has had the time to check whether they actually work, and while there's partial progress on identifying the root cause of the build failure on sparc it is only partial.

Nevertheless, minor architectures have been broken before, and no-one particularly benefits from not releasing, so 1.1.16 it is. Actually making the release is a little more challenging than usual: I aim to release by the end of the month, and in practice that means it must be done today, 28th February. However, this is the day that I am returning from Barcelona, so I am less in control of laptop power and connectivity than usual for a release day. And to add to the challenge, I am trying this time to address the valid complaints that the binaries built on my laptop don't actually run on released versions of Linux, thanks to the change in the semantics of memcpy (glibc changed the implementation in its version 2.14 to exploit the freedom given to return undefined results if the source and destination overlap) and the behaviour of the linker and versioned symbols.

So over breakfast I dusted off my squeeze chroot (that doesn't sound dodgy at all), and tried to work out how to get a runnable version of SBCL in there at all (answer: build using clisp and link to the chroot's libc). At lunchtime, I used the café's wireless to check for any last-minute changes, and in the airport I found a power socket, so I started the release build. Of course it didn't finish before the gate opened, and in any case I wasn't going to chance uploading sbcl binaries over the free airport wifi (15 minutes, woo!)

I've performed some release stunts before. SBCL 0.9 was released by William Harold Newman and simultaneously announced by me at the first European Common Lisp Meeting in Amsterdam in 2005. Last year, I released SBCL 1.1.8 “live” as part of a lightning talk at the European Lisp Symposium in Madrid. But I think this is the first time that an SBCL release was even partially effected from the air. Next stop, space?

mobile world congress

I'm in a restaurant! I would obviously prefer blogging from the train, but I was crossing London during the rush hour, so the idea that there would be a seat, or even floor space, was obviously fanciful.

So here I am, in the lovely surroundings of Gatwick North Terminal. Actually, at this time in the evening it's not so bad; there are only nine more flights on the departure board for this evening (I am choosing not to say “nine more flights leaving this evening”, as I have counted chickens before), so my natural misanthropy is not exercised into overdrive: the music is only borderline intolerably loud, and my fellow travellers are not overwhelming.

I'm on my way to Barcelona, for the tail-end of Mobile World Congress. From previous experience, and news reports, the sharp end of the event is the first couple of days; certainly, when I've been before with my company, the majority of the contacts made and business-cards collected have been from meetings on the first couple of days. On the other hand, when I've been before with my company, I have emerged from the week with a skin tone the colour of my suit, a hacking cough that took months to subside, and a deep desire to hide away from everything in a darkened room.

There are a number of things that make MWC unsuited to the introvert, particularly the introvert exhibitor (not that there are any punters at all, I'd expect). The noise, the harsh lighting, the constant need to intercept and interrupt people in order to deliver the 5-second pitch. (The experience for me improved vastly when we hit upon the trick, for a change finding an advantage in our Swiss corporate identity, of offering chocolate to our interlocutors: then if they were totally uninterested in our product, they were up at least one chocolate in the transaction.)

MWC was described in the weekend newspapers as “less glamorous”. Mind you, in the freesheet I read on the way to Gatwick Mark Zuckerberg was described as a “baby-faced bearer of evil”, so clearly you can believe some things you read in the papers. I haven't attended any of the presumably more “glamorous” trade shows (I suppose they mean the likes of CeBIT and CES; certainly mass-media coverage of MWC concentrates on handset announcements and other consumer electronics rather than infrastructure). I wonder though if the “glamour” is one of those dog-whistle words; the first two MWCs I attended certainly had their share of blatant objectification of women: and while I haven't personally experienced it as much in the last two years I suspect that's because I only attend for the last day, and mostly stay within the confines of our stand, and not because the ethos has miraculously changed.

And, of course, I feel odd going to MWC, as I remain stubbornly resistant to the mobile revolution. I don't own a smartphone; I routinely forget to charge my dumbphone; I recognize that if I have an addictive personality, my productivity will not improve if I have an instant dopamine dispenser in my pocket. So along with the the general misanthropy and introversion that goes with exhibiting at a trade show with 80,000 attendees, there's the overall antipathy to the whole show in the first place: why are all these people wasting so much time and effort on shiny? I have made my peace with my segment of the market: communications infrastructure may be “unglamorous” but it is on balance probably a good thing; the rest of the industry, including practically everything consumer-facing, leaves me not just cold, but actively wondering how as a community we have got to this position: prioritizing the matching of coloured jewels over anything meaningful. (I recognize the irony, but at least my addictions generally don't involve the upload of my contacts database to the NSA's command-and-control centre.)

The experience of the show itself was tolerable; my colleagues were jealous of my freshness at the start of the day, and by the end of the day I'd more or less turned the same shade of pale grey as everyone else. I don't do well in loud, fluorescent-lit sensory-overload environments. But I participated in some potential partner and customer meetings, and of course helped in the post-show debriefing session, and of course there's plenty of time at Barcelona airport to finish this blog entry.

workload and industrial relations

On Monday a fortnight ago, I was more than usually embarrassed by the current state of industrial relations in academia: as I was wondering out loud why the lecture room was not in use beforehand, the students present reminded me that there was a two-hour stoppage as part of the UCU and Unison Fair Pay in Education campaign. Given the current lull in the dispute – at present, no further action is scheduled, though a date has been set for a marking boycott – it's perhaps time to take stock.

I am not a union member, and I have not participated in the strikes in this campaign so far; I have had strong (but polite) discussions at picket lines about this. But since it has become an issue, and since I would like to believe that I support the principle of collective action, I think it's important to explain why I am not currently participating, and to identify the things which would need to change in either direction for me to participate.

The first point I'd like to make regards a fundamental disagreement about the premise of the campaign: although the industrial action is ostensibly about both pay and working conditions, in practice all the attention, and the campaign literature's focus, is on money. That would be no bad thing if pay were the strongest part of the unions' (workers') case, but I'm not sure it is: in general, I would say that pay for academics is good, and while it is not so good for support staff in general the related benefits (pension scheme, annual leave) are decent.

The headline case made by the unions is that pay in Higher Education has gone down by 13% in real terms (i.e. after adjusting for inflation) over the last five years. For what it's worth, I believe this figure to be approximately accurate, within the terms that are used to justify it: however, I also think that it is a misleading figure given existing practice in Higher Education institutions. The other main point made by the unions is that the HE sector as a whole made a surplus of £1bn in the 2011-12 financial year; this figure, on which more below, is also accurate as far as I know.

Why do I say that the figure of 13% decrease in pay in real terms is misleading? Well, what has actually happened is that the national pay scales have suffered a 13% decrease over four years, relative to purchasing power. This means that a staff member on spine point 37, say, would be earning 13% less in today's currency today than they would have been in 2009-10. However, that does not mean that a typical staff member who was on spine point 37 in 2009-10 is earning 13% less today than they were in 2009-10, because there are mechanisms for spine point progression, and it's fairly likely that a typical staff member on spine point 37 in 2009-10 is at spine point 40 or 41 now, based on incrementing the spine point yearly, and their pay has therefore stayed approximately constant in inflation-adjusted terms.

In some institutions, including my own, spine point progression is pretty much automatic within a particular grade; the jobs we do (“roles”) are assessed for responsibility and after turning a handle on the magic role-o-tron they are placed within a certain band of spine points, which are then those available to those who do that particular job. A newcomer to the job, absent particular experience, is likely to be offered near the lower end of the spine points for that grade, and will therefore receive automatic spine point increases for a period of five or six years. At institutions where incremental pay rises are not automatic, they are typically dependent on an annual appraisal or review process; in practice, I wonder whether the primary effect of this is to distort personal development, as there are then potential direct financial consequences to a frank discussion about personal and career progression.

Under the current system, there is a problem related to those who have reached the top of their pay grade. The typical hard-nosed capitalist might say that if people have grown as far as they can in a particular role, they should move on, but that is the kind of attitude that leads to engineers being made to manage people because that's the only way their career can “progress”. Universities, like many organizations, can benefit from people who are expert at their job, whether that's as a research assistant or a quality assurance officer, and building pay scale obsolescence into the system for these roles seems counterproductive.

(There are other problems related to pay in the sector: the overuse of hourly-paid teaching from graduate students, and other casual labour; the shameful lack of consideration to maintenance and cleaning staff; the spectacular political own-goal of pay awards to upper management that vastly outweigh personal risk taken. While these are not the focus of the current campaign, the unions deserve credit for drawing attention to them.)

The second plank in the #fairpayinHE campaign is sector surplus; viewed collectively, it does appear to be true that Higher Education as a whole currently makes a £1bn yearly surplus, as presented in HESA reports. £1bn per year sounds like a lot of money. It is a lot of money. But if it were entirely and evenly divided among all the staff in the Higher Education sector, it would allow a one-off pay rise of £2600 (total employer cost: before taxes, NI contributions, pension contributions etc.) – and then that's it; if that £1bn surplus was entirely structural, the pay rise would turn it into £0bn surplus, and there'd be no surplus for next year's pay rise. In practice, an evenly-distributed pay rise (and such a progressive distribution is hilariously unlikely) would cause a number of institutions to start shedding staff (or make other significant decreases in cost or increases in income) – since the surplus is not uniformly distributed over the sector, but national pay scales are, the effect of a uniform pay rise is to turn marginally-viable institutions into unviable ones.

With all that said, the union position does have its merits, particularly in its opposition to the continual erosion of working conditions. The transfer of inflation risk from pension scheme to individuals; the growth of zero-hour contracts in the sector; a particular bugbear for academic staff is the constant expansion of administrative responsibilities. Collective action here could be an obvious win: if career progression depends on indicators associated with unproductive work (what is “unproductive”? related, related), non-cooperation is a reasonable signal (if management's ears are not receptive to merely being informed) – but non-cooperation only works if there's widespread agreement.

This isn't straightforward; the fight against administrative oversight would be a long one, and while unions can contribute to the debate there is legitimate cause for disagreement: one academic's intrusive paperwork burden is one administrator's due process, which is one politician's accountability. But the unions could aim for immediate positive impact on the typical working conditions by campaigning for the use of institutional surpluses to hire people to share the burden. Of course, this is almost diametrically opposed to the use of surpluses for pay rises, but as far as immediate return on investment goes, I suspect it would do much more to improve the typical university worker's quality of working life.

So, a pledge. I will support (legal) industrial action if either: the campaign focuses on using some of the higher-education sector surplus to hire more staff rather than pay rises; or the campaign trades off increments (automatic or PDR-related) for automatic cost-of-living pay increases, along with a lightweight process for increments.

(At present, my own institution's Human Resources pages state that non-unionized staff members are not allowed to take strike action alongside their unionized colleagues. This seems in direct contradiction to the Government's own information on industrial action; I have asked for clarification in this respect from HR.)

sbcl summer of code 2014 participation

I received notification yesterday that SBCL was accepted as a “mentoring organization” to Google's Summer of Code 2014 programme. What this means is that eligible students can think about applying to be mentored by members of the SBCL team to work on a development project – and to be paid a stipend for that work.

The next steps for students are:

  • get involved with the community: join #lisp and #sbcl on the freenode IRC network; read the sbcl-devel mailing list (e.g. at gmane.lisp.steel-bank.devel; have a go at some of the bugs marked as ‘easy’
  • look at the existing list of project ideas, and see if any of those ideas would form a good basis for a project that would sustain your interest for three months or so.
  • read Paul Khuong's essay on getting started with SBCL from last year: it is still absolutely applicable to this year's programme, or indeed getting into SBCL hacking independently.

The period for student applications to be mentored as part of SBCL's participation is from 10th March until 21st March 2014; for best results, get engaged with the community and potential mentors well before the cutoff point.

Last year two projects were funded, and both completed successfully, even if merging them into the mainline is/was slower than one might like. I'm looking forward to seeing what this year brings!

azed 2176

This one took me somewhat longer than last week's – and there's clearly a danger of starting late in the evening when the variability of solving time is still somewhat large; the morning after is substantially worse. Also, this time there were a couple of clues that must be what they are, and yet I really can't see why: 3dn and 5dn were both highly resistant to my analysis. On the other hand I was glad that this time I used the inclusive anagram (in 21ac) to solve the clue, rather than the usual “OK, it must be this, now why?”. (On which note, I'm enjoying @anagramatron – finally a good use of social media. (Related: haiku robot)

Also, I'm out of time to do a full writeup. Interesting clues only, then.

  • 11ac: AMIENS: Shakespearean character (when getting look in): AS (= when) around MIEN (look in); ref. Amiens
  • 20ac: SHIA: Ismailian, he: ‘I am involved with — line’ maybe: *(I AM LINE + SHIA) = *(ISMAILIAN HE)
  • 31ac: TEIL TREE: Support required with litre drunk inside? Better go for lime!: TEE (support) around *(LITRE); not sure about the definition part of this – it's clearly a reference to Linden, but what's the “better go” about?
  • 3dn: SCABIES: Grub dropping of fir trees – it causes severe itching?: ?
  • 5dn: TINGLY: Run off for a moment? It's thrilling: ?
  • 10dn: JACOBETHAN: A round object in black stone, Chinese, showing blend of styles: A + COB (round object) in JET (black stone) + HAN; this one made me laugh when I got it.

[ update: ah, the two I couldn't get were similar in construction! FLEETINGLY - FLEE and SCOFF - OFF + ABIES. I can feel the learning happening right now. ]

reading week and taking stock

Reading week – a chance to breathe? For me, a chance to visit Reading, or rather Winnersh Triangle. But before that: five undergraduate project supervision meetings, two research student supervision meetings, one postgraduate programmes meeting (including imminent deadlines for Annual Programme Reviews and new programme submissions to Programme Scrutiny Subcommittee); one journal launch event; three research group meetings and one visit to a major outsourcing company. Not actually bad – I don't have to run an employability seminar session this week, and some other things are in abeyance too – but not really the breathing space that would be ideal.

What would I use the space for? Well, I'm preparing a submission for the European Lisp Symposium; I would like to write a paper for the Joint Conference on Digital Libraries; I intend to write an abstract for the European Conference on Data Analysis, all with deadlines in the next few weeks. The ECDL submission is in the most danger: most of the work is done for the ELS submission (though there's still plenty of polishing to go), and while it's not ideal, the ECDA abstract can be written in the academic “past-future” tense: by the time the conference comes round, the work will have been done.

But more than these short-term projects, there's also the issue of longer-term projects that are effectively on hold. Some of the point of this blog was to try to find out more about myself and my interests, and that's slightly gone by the wayside: this has been a valuable exercise in documenting day to day activities (and crosswords), but the potential for longer, deeper reflection is as-yet untapped – as evidence, compare the quantity of material on the blog to the equivalent on the wiki. Partly, I think that this is a question of workflow: I haven't got the workflow right yet (and now I have N+1 things to check as part of my routine), but of course sorting out the workflow is also something that needs time to reflect, take stock, and act.

Another longer-term project is developing a comfortable workflow for a more open research process. Some of that is successful; teaser blogs on work around generalized specializers and on audio search got conversations of sorts going (and collaborators to work with!) – I'm not sure whether I would have done better to enable comments, as Athene Donald suggests; the fear there is that all my time would become occupied with comment moderation. In this area, what definitely hasn't worked (yet) is opening up the paper-writing process itself; the link to the gitweb above notwithstanding, I definitely feel uncomfortable sharing the work-in-progress, even with potential co-authors. It might have been easier if I had better tooling around the paper writing process; as it is, while I like org-mode for drafting, I haven't yet got it all connected and working with slime, let alone imagining being able to share that setup with co-authors, and that's a brake on the process – as is a submission style which mandates a different (I can't in fairness say “non-standard”) set of LaTeX headers.

One of the clear wins of this blogging exercise, on the other hand, has been the repurposing of commuting time: the 10-minute slots on trains, if I can get a seat, tend to get used to write, or sometimes minor hacks, rather than wasted reading the advertising- or oligarch-supported freesheets. Maybe the next step is to deal with my current belief that more substantial blocks of time are necessary to make progress on the bigger or trickier questions? At the moment, I feel that it's pointless to try doing something fundamentally novel in those 10 minute slots, because remembering where my thoughts had got to would tend to take up most of that time, leaving little for productive work – it could be that this belief is just wrong, and a period of bootstrapping would get over that.

So, I'll be carrying on, and trying to improve particularly the quality of interaction. At the moment that is still going to be centred on e-mail and physical meetings, but hopefully the future will benefit from the affordances of more immediate interaction styles.

eye crossword 514

A couple of mildly amusing topical clues in this one, but nothing that really made me laugh. Best (though a bit too obvious) was perhaps the reference to the Russian persecution of homosexuals in conjunction with the start of the Sochi Winter Olympic Games in 15ac/24ac.

  • 8ac: ON THE HOUSE: As regards a big part of Westminster, it's much to freebie-seekers’ liking: Double Definition
  • 9ac: EVA: Moon-walking mate of the Führer?: sort-of Double Definition; ref. Eva Braun
  • 10ac: STEP ON IT: Potential nepotist? Don't crawl: *(NEPOTIST)
  • 11ac: IF ONLY: Ffion, abandoned, foot out, extremely lusty? I wish!: *(FFION) - F(oot) + L(ust)Y
  • 12ac: CYPRUS: Miley claims power for the land: CYRUS around P(ower); ref. Miley Cyrus
  • 14ac: RUN SHORT: Come to the end of Trots, Roth's novel: RUNS + *(ROTH)
  • 15ac/24ac: WINTER OLYMPICS: At which village Putin will tolerate no minor encampment (you might say): Cryptic Definition; ref. 2014 Winter Olympics
  • 16ac: FLABBY: Limp old pop group dropping its last member in hurry: ABB(a) in FLY; ref. ABBA
  • 19ac: IN CLOVER: Nick endlessly rattled by sex partner having an easy life: (p)INC(h) + LOVER
  • 21ac: BICEPS: Arm-raisers wanting head from Baby Spice maybe?: B(aby) + *(SPICE)
  • 23ac: STRAIN: Tax only 10% of Stagecoach's rolling stock?: S(tagecoach) + TRAIN (= rolling stock)
  • 27ac: CLEAN SWEEP: Is a scrubber possibly putting on blubber for a complete change: CLEANS (is a scrubber) + WEEP (blubber)
  • 1dn: SNOTTY: Arrogantly stand-offish and rather drippy: Double Definition
  • 3dn: THANKS BE: The banks reforming? Glory to God!: *(THE BANKS)
  • 4dn/26ac: CUSTARD PIE: Silent in-yer-face style of humour?: Cryptic Definition
  • 5dn: RESIGN: Brenda's taken up hint to make way for Brian?: ER (Brenda) reversed + SIGN (= hint)
  • 6dn: XENOPHOBIC: UKIP-like phone box's dodgy electronic component?: *(PHONE BOX) + I(ntegrated) C(ircuit)
  • 7dn: EARL GREY: Peer who liked his drink, eagerly disposed to accommodate Right: *(EAGERLY) around R(ight)
  • 13dn: RINGLEADER: Call Cameron the head of an unprincipled bunch: RING (call) + LEADER (Cameron); ref. David Cameron
  • 15dn: WINGTIPS: Robin's Left and Right extremes?: Cryptic Definition
  • 17dn: LOBBYING: Producing a whopper, holding Bob roughly and applying pressure to member: LYING around *(BOB)
  • 18dn: Bent copper's chief taken to the cleaners: C(opper) + ROOKED (swindled)
  • 20dn: VENICE: City corruption: hoarding English money centrally: VICE around E(nglish) (mo)N(ey)
  • 22dn: PICKET: Take action against a scab? Sounds like it, too!: Double Definition
  • 25dn/2dn: PAWN SHOP: Board members bound for establishment with balls?: PAWNS (chess pieces) + HOP (bound); ref. Medici

Not quite solved at boiled-egg speed, but definitely a breakfast puzzle.

google zoo

For the last session in the employability series in this half term, we welcomed Leon Bayliss and Richard Hale from Google's Zoo, one of two ‘creative agency’ (my words, not theirs) groups within the organization. It was nice to see that the pre-session publicity had worked, and that some of the students from the MA in Computational Arts and the MSc in Computing had chosen to come. This might have slightly discombobulated Richard, whose first question about whether there were “creatives in the audience” met with a surprisingly positive response.

Framing the career narratives as journeys (Richard's and Leon's, and Google's) can give a powerful message; I particularly liked that they included each time where the journey started, in real space as well as with technology. It made for a well-rounded presentation, finishing off with the “moonshot thinking” video video from solveforx, which uses as an example the Polynesian canoeist just setting off into the wide ocean: the students' own view of themselves being about to step out into a new world might not be so different. Of course the students have plenty of examples to learn from – that's the whole point of this workshop series, after all – but that doesn't negate the view that they are about to undergo a transition, a change in their state from pre-career to career. And one of the messages related to that was in big numbers: Richard freely admitted that he'd had a restless career, moving from one place to the other: he said that he seemed settled now at Google, albeit only six months in, but it had taken him 6209 days of his working life to get there.

Some of the projects that were presented were new to me: I hadn't come across the Cadbury's giant party popper, nor #grannysamsung, nor videos displayed, synchronized, across four adjacent phones (“so that you can only see it when you've got your friends round”). The grandmother avatar responsive to tweets reminded me about the #lookup campaign for BA, also displayed on the Picadilly Circus screens, where the digital screen points at BA aeroplanes; I suppose if even I can be affected by campaigns like that, they must work, though it's a bit depressing that this clever advertising is aimed towards brand awareness, as opposed to a more socially useful kind of advertising with the aim of market development – making people aware of products or opportunities that they wouldn't otherwise have heard of.

Nevertheless, the main message from the presentation was clear and worth reiterating: aim high, and as well as the immediate and medium term, it's worth having the idea of a 10- or 20-year project that would achieve something enduring. I'm beginning to try to absorb this lesson myself; if the students get a chance to hear it early, that can only be good.

I was pleased that in the Q&A session, students took the time to ask some questions about other ethical issues. In particular, it was interesting to hear about the philosophy behind Reader, Fiber, and GMail: that actually it was reasonable for Google to shut Reader down, because it was so entrenched that it was inhibiting innovation in that space – and that this was consistent with starting GMail and Google Fibre, where the point was and is to disrupt stagnant, entrenched ecosystems. I'm not sure I buy the story that Glass is merely an innocent attempt to force legislatures to confront technological reality; it seems too easily targeted at a particular demographic, which could be caricatured as one that would have few compunctions over using Glass-like artifacts in exactly the ways which many would find objectionable. ObSF: The Dead Past; I also found Alex Kozinski's perspective on privacy fascinating, and not just because we share an enduring memory of the last line in the Asimov story.

After lunch, Leon and Richard were kind enough to visit the Creative Project labs, where the second-year undergraduates were working on their projects. A good number of the students volunteered to do demos on their works-in-various-progress, and I think the feedback they got was valuable – it definitely sounded enthusiastic. At one point in the conversation, I defended the Americans against accusations of parochialism, saying that the World Series was named because of a newspaper sponsorship deal. Snopes suggests that my generosity of spirit was misplaced; that'll teach me.

azed 2175

Another weekend, another Azed. It's nice that I seem to have got the hang of them; it's a bit of a shame that it's not an augmentation to my weekend's solving: I made absolutely no progress on the inquisitor. Still, there's hope: although solving this one was absolutely not in the boiled-egg ballpark, it was a two-hour wall-clock-time exercise, so as long as I can start my solving earlier than 9:30 on Sunday evening I should be able to do more than one crossword a week.

Analysis below is reconstructed while on an unexpectedly long train journey: away from books, and increasingly tired. I don't understand the cryptic half of 12ac at all. [ update: fifteensquared on this one suggests UR inside AMOS. (ref Amos Oz) ]

  • 2ac: PRIMP: Tidy pages grasping skirt: PP (pages) outside RIM (skirt)
  • 6ac: APANAGE: Dependent territory, hence absorbing one: APAGE around AN
  • 11ac: AIOLI: Dressing; odd bits rejected by Jamie Oliver, half cut: jAmIe + OLI(ver)
  • 12ac: AMOURS: Old-style sex yielding hesitant utterance in Oz?: ?
  • 14ac: CROSSLET: Pendant perhaps left trapped in tight corsets: *(CORSETS) around L(eft)
  • 15ac: KAPELLMEISTER: E.g. Bach, confusedly losing lines, buried in task, i.e. right frantic: *(IN TASK IE R) around PELL-MELL - LL (lines)
  • 17ac: ACTUATE: Tiptop, reverse of tense inside? So get going: ACE around TAUT reversed
  • 19ac: JUBA: Jacket on the short side? You may see me sell this in jumble sale: *(JUMBLE SALE) - ME SELL
  • 20ac: DAMAR: Artist crazy about a type of resin: RA (artist) + MAD all reversed
  • 22ac: COXA: Bone from farm animal, roughly round: OX (farm animal) inside CA (circa)
  • 24ac: OKIMONO: Oriental figurine, fine one, early reproduction: OK (fine) + I + MONO (early reproduction)
  • 28ac: NUMEROLOGICAL: Silly me, uncool with a girl, making prediction from figures: *(ME UNCOOL A GIRL)
  • 31ac: BIRIYANI: Spicy dish from Iran brought in by exotic bird: IRI (Islamic Republic of Iran) in BY + ANI (exotic bird)
  • 32ac: STOLID: Dull time in firm: T(ime) in SOLID
  • 33ac: MELON: Fruit pieces placed round centre of charlottes: MEN around charLOttes
  • 34ac: VANESSA: Virginia bags a Bill perhaps in this novel: VA (Virginia) around A + NESS (bill)
  • 35ac: LEMAN: Celebrity left back, a darling of yore: NAME + L(eft) all reversed
  • 1dn: RACKABONES: Barack O. upset rising senator, scraggy American?: *(BARACK O) + SEN(ator) reversed
  • 2dn: PYRANA: Fish tucking into tropical plant, voracious one
  • 3dn: ROUPY: A bit off colour, consuming nothing, like Scot with a bad throat: ROPY (a bit off colour) around O (nothing)
  • 4dn: MISLED: Major road vehicle with runners taken for a ride: MI (M1 motorway) + SLED (vehicle with runners)
  • 5dn: PULLMAN: Plush saloon diverted up Mall, last in procession: *(UPMALL) + (processio)N
  • 6dn: AHEM: Attention-seeker, one on fringe: A + HEM
  • 7dn: AMRIT: Baptismal ceremony, part in Malayam ritually: malayAM RITually
  • 8dn: NONSUCH: Wayward nun's admitting love – church reveals this once unique thing: *(NUNS) around O (love) + CH(urch)
  • 9dn: AUNT: Decapitating cow, one provides practical advice: dAUNT (cow)
  • 10dn: GREET: Hail ends in spring weather we like best: sprinG weatheR wE likE besT
  • 13dn: STREAMLING: See activated mangle stir a mere trickle: *(MANGLE STIR)
  • 16dn: JUMELLE: Sweet drink (not soft) with honey in – might it to make you see double?: JULEP (sweet drink) - P(iano) outside MEL (honey)
  • 18dn: CAPORAL: Dad looking up and in the pink – strong stuff drawn on?: PA reversed inside CORAL
  • 21dn: REGIME: Administration that's put settler up exchangine final pair: EMIGRÉ with last two letters swapped and all reversed
  • 23dn: XOANON: Primitive statue? Rising pollutant envelops a number: NOX reversed around A NO (number)
  • 25dn: KURTA: Dressed in clean one? Keralan tunic possibly: *(KERALAN TUNIC) = *(IN CLEAN + KURTA)
  • 26dn: ORRIS: Upholsterer's trim – it smells of violets : Double Definition
  • 27dn: SCALA: Ear part: coiled canals may reveal one, note: *(CANALS) - N(ote)
  • 29dn: MOON: Satellite? Computer device shows use with this: MOUSE (computer device) ON (shows?) - USE
  • 30dn: LIPA: Some Croatian money a twit laid up but without lock: A PILLOCK - LOCK reversed.
tmus mini-projects workshop

I'm on a train!

Not the logical train that I was booked on, thanks to the excitement caused by high winds and speed restrictions. But ticket restrictions having been lifted, it seemed prudent to get on to the first arriving train out of Lancaster, coincidentally delayed by just the right amount of time for it to leave at my train's scheduled time, rather than waiting for the West Coast Main Line to close due to the “extremely severe” weather.

I did in the end finish my talk (previously previously), and delivered it if not to rapturous applause, then at least applause. I think I pitched it about right, in that even the music informaticians will have most likely seen something new in there, but it was a talk with sufficient illustrations (less charitably, short on detail) that the non-technologists in the audience will have absorbed a certain amount of the flavour of possibility.

Slides are here for posterity; they'll also go up on the transforming musicology website, as will a video of my burblings to accompany the visuals. In case it's not clear from the slides: the survey is inevitably partial (in both senses); I was perhaps most disappointed in not being able to give a vast list of resources for subsequent investigation, so if any reader feels slighted by the lack of publicity given to their (available) music informatics tool, let me know. It was slightly disconcerting to be viewed as an authority in this context; what with my various startup and child-rearing activities, it's been a while since I've been fully engaged in the the music informatics world. I suppose that is something that having a part-share in a £200,000 funding budget brings – I must be an expert, I'm tangentially involved in the distribution of money!

Meanwhile, having agonized over the talk so comprehensively (I think the version I ended up giving was my third attempt at a coherent story, the others having foundered on the rocks of unavailability or sunk into the whirlpool of incomprehensibility) I had forgotten that I was also chairing a discussion session on tools for audio analysis. Fortunately, there were some interesting and knowledgable parties in the room, and we had a lively discussion, covering source separation, features for emotion classification (we discussed the problem of interpretability, and the Netflix prize), and the failure of music informatics tools to deal with singing in almost all contexts.

I hope that there is some work done on improving the situation for singing in general, and for non-autotuned music in general – I'm not sure that Transforming Musicology is the place for that work, given that it's not a project for technology development, though one of the things I hope to do myself is to discover how far a straightforward application of the state-of-the-art can get you. It was a pleasure to be able to discuss Polina Proutskova's work on establishing a foundation for inference of aspects of vocal production from audio recordings, and I may have committed myself to listening to an unbounded number of Chinese opera fragments...

[ update: the train manager has just announced “overhead line damage at Crewe, a tree on the line at Stafford – we'll do our best to get you to London... today...” ]

[ update update: the train is stationary. Quite stationary. In Warrington Bank Quay station. (The clue is in the name.) ]

[ update³: the train will be moving towards Crewe, as the tree is on the other line. “What happens at Crewe, I have no idea” says the train manager. Answers on a postcard. ]

[ update⁴: currently stopped not quite at Crewe. Still have no idea what happens if we get to Crewe. (Nor what happens if we don't.) ]

[ update⁵: we still don't know what happens once we get to Crewe, beyond that we are moving down the track. It's quite exciting; a voyage into the unknown! ]

[ update⁶: we have just stopped outside one of our extra bonus stops (5 between Crewe and London). Apparently we are delayed because of a fire caused by a lightning strike. ]

[ update⁷: apparently the fire and the lightning strike were separate events. Lightning caused signal failures outside Stafford; Rugby station was closed due to fire. Exciting. ]

[ update⁸: we are now delayed just outside Watford Junction, because the fast train lines have closed for engineering works. Engineering works. Yes. Sorely needed. ]

[ update⁹: it would be tempting fate to claim that all is well, but we are now within the tube network. The roundel has never seemed so welcoming. ]

[ update¹⁰: awesome final stop announcement.
“In a few moments, we will probably be arriving at London Euston, where this train terminates. We apologize for the late arrival of this service, which is due to... where do we start? There were speed restrictions on the line from Glasgow; two fires, one at Crewe, one at Rugby; several trees on the line, we hit one of them; signal failures caused by lightning in the Stafford area; and engineering works between Milton Keynes and Euston. We will shortly arrive at Euston, with just over five hours' delay. Thank you for travelling on Virgin Trains” ]

still writing mini-projects workshop talk

I'm on a train!

Specifically, I'm on a train, still writing my talk on Tools for Music Informatics (previously). It's to be delivered to a mixed audience, including technologists already embedded in the Music Informatics area, and musicologists who have no idea what it is but have heard that there might be some money attached if they can spin an idea the right way. This mixed audience has led to the talk having something of an identity crisis, anthropomorphically speaking: should it be focussed on tools that have been used to perform musicological tasks? Should it be focussed on workflows that are simple to relate to? In the end, constrained by the fact that my slot is 25 minutes long at most, I have gone for surveying tools that are commonly used in the Music Informatics world, and biasing my survey towards those which provide visuals that can be used in a talk.

It turns out that the constraint on having example pictures is quite a strong one. I appreciate that academic researchers are not necessarily oriented towards powerpoint-style marketing; for many, and generally I include myself in this category, the ideas and results stand on their own merits. But in this area of software as output, where there's the possibility of scaling one's impact, moving beyond the set of people one can talk to, to anyone who can discover and use the software, why is the user-facing documentation so poor.

Well, one reason is that creating good documentation is hard, and not necessarily a skill that goes hand in hand with academic research or software development, so in the lone wolf model of academia the chances of finding someone who can do all three are low. But the fact that there are several software packages in Music Informatics, all doing approximately the same thing and all lamentably documented, suggests that there might other reasons, and one of the benefits of being on a train and needing to procrastinate away from finishing the talk is that I get to discuss reasons for this with my captive colleagues.

So, here's a cynical view. There are two sets of competing incentives that, together, might explain why there are a fair number of underdocumented PhD-level software frameworks, and why there aren't substantial communities formed around the further development of such software. The first relates to the principal developer of the software, assuming that they are still in academia – if they're not, then there's probably no incentive to do anything more with the software at all. In the academic case, the career ladder and prestige indicators are constructed such that the credit for new things is vastly greater than the credit for improving already-existing things. In particular, once a permanent academic position has come along, a potentially demanding userbase is actively detrimental, taking time away from the real business of academics, which is to write funding applications to be able to hire researchers to do research and write papers on which you gain author credit. At that point, the software might still be a help to generate the research results, but the most valuable users are likely to be in close physical proximity with the lead developer, and so they can learn directly from the horse's mouth.

The second incentive applies to the principal source of uncommitted labour in the system: the graduate student. A graduate student, in theory, could be doing anything with their time; in practice, they are guided in their activities by a supervisor, who suggests ideas and projects and has as a goal the successful construction of a dissertation showing substantial work at PhD level. As with the previous case, the student gains more credit from new things than improving existing things, and the contribution of the student to independent work will be clearer for the supervisors and the doctoral examiners than the contribution to a collaboration, particularly a dynamic collaboration such as in software development and maintenance. So an otherwise uncommitted supervisor will likely recommend to a student interested in software development for music informatics to develop their own software rather than invest time and effort in one of the existing ones: the outcome for the student's dissertation is likely to be better, as an independent implementation can make up a chapter or more, while participating in a development community is most likely not to be usable in a dissertation at all.

After all the cynicism, what's the solution? Changing the academic prestige system is clearly a long-term prospect, and likely to run into game theory buffers; while it's nice to imagine a world where community contribution is as valued as independent “discovery”, I wouldn't hold my breath. But this, it seems to me, is where agitating for more reproducible research is important; not only does it lower the barrier to participating in the scientific process, it also provides built-in tutorial material in a real research context for any and all software that is used in the research itself. Initiatives such as conferences awarding prizes for reproducible research, or journals mandating that reproducibility materials be deposited alongside the manuscripts, has the potential to lead to an improvement in reuse of software as well as in proving the research results themselves.

200 unread music-ir messages

I have to give a talk on Wednesday about tools for music informatics, with a particular slant towards things that might be useful for and usable by musicologists.

Conveniently, I've been burying my head in the sand allowing a backlog of unread messages on the music-ir (Information Retrieval) mailing list to accumulate, naggingly, in my *Group* buffer. So this evening I went through 200 or so of them to see whether there are any announcements of software, publications of data sets, discussion of tools, or similar.

Firstly, a high-level categorization of messages by topic: some of course fit in multiple categories. I have made no attempt to be rigorous about this; it is the fruit of a Sunday evening's scan.

  • research discussion (including surveys): 51
  • research meetings (calls for papers / participation): 52
  • open positions: 52
    • MSc: 4
    • PhD: 24
    • Post-doctoral Researcher: 21
    • Fellowship: 2
    • Intern: 3
    • real job: 2
  • community housekeeping: 20
  • datasets: 36
  • software announcements / discussion: 14

Much of the discussion about datasets was about the relative lack of them, or issues about their accessibility. However, four datasets were announced (or re-announced); they were:

Meanwhile, a number of feature extractors or feature extractor frameworks were mentioned; I picked up on big beasts such as Marsyas, jMIR and aubio, along with announcements for individual feature extractors such as segmenter-vamp-plugin, beatroot-vamp and pyin. In the discussion of the lack of data, Sonic Annotator Web Application was mentioned as a way of bringing analysis tools to audio data rather than the reverse; there was also a genuinely new announcement, about the open-sourcing of Essentia, a multi-extractor toolbox developed at the Music Technology Group at UPF Barcelona.

The other software in the period included two audio source separation projects: FASST, a toolbox, and ISSE, an interactive editor; possibly related (I haven't really tried it). There was also: a melody annotator and editor, tony, which looks interesting (and the project is doing open development of code and publications); a score follower, antescofo, which is entirely behind an IRCAM paywall, so I can't say anything more about it; a library for computing melodic similarity, and three mobile apps: a game, a game with a purpose, and a smart microphone widget.

All this is worth knowing, and it was a good exercise: if nothing else, my *Group* buffer looks less intimidating now. Whether it gets me much closer to a talk about music informatics tools for musicologists is another matter..

winkball and ig

This was the first of the proper sessions in the employability workshop series. I can pontificate about careers; the Careers service can inform about careers; but there's nothing quite like having people who actually have careers talk about their careers, or ventures, or just relate their experience of the Outside World.

It was a pleasure to welcome James Ohene-Djan back, to talk about the history of and latest news from Winkball. I think I could take or leave the Winkball story itself, though several students commented to me afterwards that they were particularly glad that they got to hear a story of failure – or maybe success at the wrong thing? After all, Winkball did scale; it got big, at least for the right metric – it just never got to the point where investors believed that it would be big enough to justify funding that growth.

James did offer some important insights from his experience of growing Winkball, which might have been lost on the students: one point was on finding out when and how to pass on things for someone else (or some other company) to do; another was the mistake of not taking people's names for the later “Google yourself” automatic marketing factor. But I think there were some really inspiring messages, too: firstly, the fact that they're pivoting to a business-to-business product with a subscription model, providing a targetted video advertising and marketing platform; not that I am particularly fascinated by video advertising, but the real drive to build something that works is something to behold.

But secondly, and this was something that I really didn't know beforehand: when asked by a student what he really thought Winkball had achieved, James revealed that the technology, which had originally been motivated to provide a platform for the deaf and hard-of-hearing, did survive in that realm: he pointed to viewtalk.org, a Winkball analogue tailored for the deaf, and the commercial arm aiming to be a business producing marketing materials. Good luck to them.

The second presentation of the session, given by Sion Elias and Ed Worthy of IG, was perhaps a more conventional undergraduate career presentation. The serendipitous advertising of IG's graduate scheme, with a particular focus on front-end developer skills, gave me the opportunity to invite them over – which neatly ticked the “larger employer” and “financial services” boxes. Sion's career trajectory was interesting, and superposing his timeline on a graph showing the FTSE 100 share index between 1997 and the present couldn't help but be entertaining.

Among Sion's points was that not all graduate training schemes are the same: I think he was at pains to contrast IG with more hidebound competitors for talent, in particular the merchant banks, where the divison of work areas into front-/middle-/back-office silos is very established. The emphasis in the presentation on development methodology (agile, XP and pair-programming) was interesting; are the details of the corporate development methodology still so distinctive that they differentiate in the competition for talent? I can believe, as Sion said, that they save at least some money by using these processes to have fewer bugs in production (and hence less downtime, lower churn, and so on); as a signal in a graduate recruitment pitch, though, I'm less convinced. But maybe I'm underestimating student discrimination of development practices?

I was a little surprised at the relative lack of questions from the students; maybe the two-hour session is a little intense? There were some good ones, and the rump of students who stayed at the end to discuss pivoting and lean startup methodology had a good conversation, but to me it felt a bit like a missed opportunity – or maybe the financial services industry still has too many negative associations for the students among the hotbed of idealism that is Goldsmiths?

The two presentations, along with their respective Q&A sessions, ran exactly to time: that was good, but that meant that I didn't really have any time to wrap up or go more deeply into some of the issues raised – unlike last year, where I had an explicit recap session built-in after lunch. Given the chance, what I might have pointed out was that both talks, from substantially different perspectives, really highlighted how little of a viable business, even a viable technology business, was the technology itself; yes, it's important that the technology is there, and works, and is cutting-edge, but that alone does not a viable business make. The other theme in common between the talks was the constant need for learning, about technology, about business and about everything else.

nnir vs gnus-bonus-el

I read my mail through Gnus, an emacs-based news (Usenet, remember that?) and mail reader. (The main reason I do so is documented at Dan Barlow's diary, from an era when I routinely sent out patches by e-mail, and frequently sent out messages saying "please see the attached" while failing to attach anything to the message. Thmutt.)

In the intervening years, I've been accumulating mail accounts, responsibilities, and I've often been frustrated by my inability to search through non-local mail archives. It turns out that the reason I've been unable to do so is largely my own fault: Kai Großjohann wrote nnir.el as an extension to Gnus, and Debian packagers helpfully included that in the emacs-goodies / gnus-bonus-el packages. In the meantime, the Gnus developers quite rightly integrated nnir.el into their distribution, augmenting and extending it over the years, and in particular giving it functionality to swap out search backends depending on the mail server's capabilities.

Unfortunately, the 2003-era version of nnir.el installed by gnus-bonus-el was loaded in preference to that provided by Gnus itself, in an otherwise fairly standard Debian installation of emacs. It was only when I was looking at the source to see how much work it would be to make multiple search backends possible (not too much but more than an afternoon; it's lucky I don't charge by the hour) that I noticed the date in the copyright header, and then that I had three copies of nnir.el installed... come to think of it, this is possibly a sound argument for keeping the dates in the copyright headers of source files up to date.

So, now, I can actually search (separately) my various personal and professional mail accounts. I don't think I can do terribly intelligent combined searches, and of course I still have to contend with Office365's dubious implementation of IMAP. But still, not a bad result.

Ironically, when I went to report all this upstream, I discovered that just last week gnus-bonus-el had been removed from Debian, with this particular issue having been reported three years ago.

azed 2174

On looking at this on Sunday, I almost gave up without trying. “Printer's Devilry”?! Where do you even start?

Well, after thinking about the basic approach to clues (find the bit in them that looks even weirder than the rest), and doing my level best not to think of any of the clue as a definition... I started with

As soon as the teacher's goon is finished (9)

The weirdest bit in that is definitely “goon”. As soon as the teacher's go, as soon as the teacher's goNE aha. As soon as the teacher's goNE, THE LESSon is finished. Well that makes sense. And Chambers (1993) is happy that NETHELESS is a word, so off we go. Last to fall was 24dn (DALILA), which was the only word in the dictionary; only after its entry did I find ameDAL I LAnded.

  • 1ac: Anyone who's awASTER IS Making too little of his life
  • 6ac: Some early Huguenot insurgents were known as cAMISards; ref. Camisard
  • 10ac: In such, a new developMENT A LISTed building cannot be modified
  • 11ac: Did guilt-ridden Paris cry, ‘Pleas forgive, heLEN I ENTreat’?
  • 13ac: I always enjoy my mEAL Eating heartily
  • 14ac: CHARET: Archaic horse-drawn vehicle
  • 15ac: As soon as the teacher's goNE THE LESSon is finished
  • 16ac: Devoted to the cap he wears? His beRET IN All weathers
  • 18ac: A well-known liAR TAking? Few for a ride
  • 20ac: He likes to think he is a good saxophonist but he isnO BECHE't
  • 22ac: After a rouch voyage there's many a boSUN DRInking in the quayside inn!
  • 25ac: There are many for whoM A NEAT INGle fireplace – really sets off a cosy room
  • 28ac: A skilful drover's soon coaxed into rUN A BLEating flock
  • 29ac: Increased taxation, waS LIMiting for businesses eager to grow
  • 30ac: ‘I really fancy a soldier,’ she said, ‘It's NO TAR I NEed!’
  • 31ac: TriBAL LAD IS Teste don? His ability to survive alone in the jungle!
  • 32ac: Single scroungers are perhaps forced to bEG ALone
  • 33ac: Venues like this: PLACE RAN Top shows for months on end
  • 1dn: The new mini model is too small to give my lanky PAL LEGROom
  • 2dn: We should make lots in renT ON LETting our second property
  • 3dn: Bare hillsides are not tREED ENough to prevent soil erosion
  • 4dn: Mums will take drastic action if their kids gaIN NITs at school
  • 5dn: The main character in the filM AS HERe portrayed differs a lot from the book
  • 6dn: Cruise passengers often like towALK A LINer's deck
  • 7dn: Was your entry perMIT REceived in time to ensure access
  • 8dn: Not many points were scored – juST A Try unconverted
  • 9dn: Police announcing new anti-crime drive – won't pLEASE BANDits?
  • 12dn: In the foREST RAIN Tre, espied wagtails (rarely spotted); “trees” used as verb
  • 17dn: Pearl fishers may be fine for some but I prefer a nICE BALLet; ref. Pearl Fishers
  • 19dn: Will the efforts of ACAS prevent the rALIMEN Taking action?; ref. ACAS
  • 21dn: He's the man, she swears – she sHALL ALways love
  • 23dn: Over AdUNE A SEa, Holly grows wild; ref. sea holly
  • 24dn: Despite commendation for my race performance, it wasn't ameDAL I LAnded
  • 26dn: Noble bearing ensures AmaN A BLAzon
  • 27dn: BasIC TICket prices won't get you into the favoured spots
  • 28dn: Park rangers tagging wildlife only aim to stUN BEars

I think I'd previously been reluctant to engage with Printer's Devilry crosswords before, because they felt qualitatively different from regular cryptic crosswords, and in particular the lack of a definition put me off. But on mature reflection I can see the analogy, and it seems to me that going about solving a PD puzzle depends on the same kinds of ability to handle words as sequences of letters and words as meaningful entities. Let's say I'm open-minded towards them.

My attempt at a clue for 14ac: I come top – I turn to greatness / I come to pitCH A RETurn to greatness. Which is not great, but it at least follows the rules.

Three in a row!

eye crossword 513

More straightforward than usual, perhaps? Certainly I started it on the plane from Zürich (after finishing my reading of a draft International Programmes subject guide on Advanced Graphics and Animation), and finished it on the bus between City and Plaistow, which speaks either to the level of the crossword or to the relative lack of distractions in those environments.

  • 7ac: WASHED UP: Took part in after-dinner activity – knackered: Double Definition
  • 9ac/10ac: PARTY ANIMAL: Good-time Johnny, Labour's ‘Beast of Bolsover’?: Double Definition
  • 11ac: NARCOSIS: In a cross-dressed sort of stupor: *(INACROSS)
  • 12ac: GREENFLY: Rose's downfall, inexpert trouser opening: GREEN (= inexpert) + FLY (trouser opening)
  • 14ac: LIB-LAB: “Past alliance – Balls at the centre!” Cyclops squeals: (ba)L(ls) + I BLAB (Cyclops squeals)
  • 16ac/27ac: POLITICAL CLOUT: What Clegg hopes the coalition will give him? Iodine-impregnated fancy lilac top and sock combination: *(I LILAC TOP) + CLOUT (= sock)
  • 20ac: SPOT ON: As Page 3 girls would have to make a comeback? Exactly: NO TOPS reversed
  • 22ac: SCRUBBER: Boris's ultimate carbon johnny cleaner: (bori)S + C(arbon) + RUBBER (= johnny)
  • 23ac: IN A PADDY: Rice to be seen here throwing a wobbly: Double Definition
  • 26ac: ON SALE: Noel's pissed about uprising of his band's nos. 2 and 3 – yours for a fee: *(NOEL) around (o)AS(is) reversed (ref. Noel Gallagher, Oasis))
  • 28ac: RUNNER UP: Not the top choice, ‘Bean Out of Bed’: RUNNER (= bean) + UP (= out of bed)
  • 1dn: LAUNDRY: Steamy place, Los Angeles, not banning alcohol?: L(os) A(ngeles) + UN-DRY
  • 2dn: CHAMBER POT: Where parliamentarians may be seen with drug dumping receptacle: CHAMBER (ref. Chambers of parliament) + POT (marijuana)
  • 3dn: SPUN: Proprietor primarily involved in tabloid cover-up is put in a good light: P(roprietor) in SUN
  • 4dn: SPIRAL: Is lap dancing about right to screw?: *(ISLAP) around R(ight)
  • 5dn: BRIO: Eye rather grandly on the up, absorbs Independent – dash!: ORB reversed around I(ndependent)
  • 6dn: CYNICAL: Disenchanted Clegg not quite squeezing into lacy creation: NIC(k) (ref. Nick Clegg) inside *(LACY)
  • 8dn: DOLEFUL: Wretched as an unemployed person's existence?: Double Definition (ref. Dole)
  • 13dn: YETIS: Old rock band keeping it up – hairy beasts: YES (ref. Yes) around IT reversed
  • 15dn: BALL BUSTER: Bullet bra's elastic is a real demoraliser of a bloke: *(BULLET BRAS)
  • 17dn: CARTOON: Strip, possibly showing oxygen-inflated ‘package’: O(xygen) inside CARTON (= package)
  • 18dn: SPINACH: Sailor man's muscle builder: orgasming in chaps: *(IN CHAPS) (ref. Popeye)
  • 19dn: BELLY UP: Bishop deployed pulley to achieve female missionary position: B + *(PULLEY)
  • 21dn: NUDITY: No cover-up with this state: Complete Definition
  • 24dn: PLOT: Plan to apply pressure to lashings: P(ressure) + LOT (?= lashings)
  • 25dn: YARN: Strand: any cruising to include river: *(ANY) outside R(iver)
generic function precompilation

Once upon a time, I wrote two blog entries about precompiling the dispatch for generic functions in order to improve the responsiveness at application startup, and obviously planned a third but didn't get around to writing it. Some time later, I asked the lazyweb about it, and unfortunately this time didn't get anything much back. On further reflection, I think I was going to discuss a couple of additional technical points.

First of all, there's the question about having this kind of precompilation on all the time; wouldn't it be nice if generic functions were always at their most efficient, ready to be called? Well, yes, but what we actually want is for functions to be at their most efficient when we want to call them, and we don't particularly care at other times. Why draw that distinction? Well, when we write code that uses generic functions, it is usually of the form:

(defgeneric foo (x y))
(defmethod foo ((x t) (y t)) ...)
(defmethod foo ((x integer) (y integer)) ...)
(defmethod foo ((x rational) (y float)) ...)

a sequence of method definitions; sometimes contiguous, as above; often distributed among various files. loading such code will execute the defmethod forms in series. And each of those executions will call add-method, changing the generic function's methods, so any aggressive dispatch precompilation scheme will kick in at every defmethod. That would be bad enough, being O(N) in the number of methods, but it's actually worse than that: the amount of work involved in precompilation will tend to be O(N) in the number of methods, or in the number of concrete classes applicable to those methods, so there's O(N2) or worse behaviour from having precompilation active all the time. SBCL is routinely mocked for having slow-loading FASL files (originally, FASL probably stood for FASt Load; we don't advertise that much); expensive and poorly-scaling computations at load-time probably won't win us any extra friends. (Though having written that, I now wonder if recording changed generic functions using the dependent-update protocol, and hooking load or asdf:load-system to precompile after loading a whole file or system, might be a tasteful compromise).

Secondly, there's the detail of exactly how to pre-fill the cache for a given generic function (given that its specializers are mostly or entirely classes). The simplest strategy, of filling the cache with exactly those classes used as specializers, fails as soon as abstract or protocol classes are used to organize the implementation of the generic function. The next simplest, which is to fill the cache with all possible subclasses of specializers at all argument positions, well, just reading that should set alarm bells ringing – it might not be too problematic for generic functions with one argument, but the cross-product effect of multiple arguments will probably cause the implementation to collapse under its own weight into a virtual black hole. It might be that the best approach is to allow the user to specify an exact set of classes: and to allow the user to introspect a running system to find out which class combinations have actually been seen and hence cached in a given session.

In fact, SBCL itself depends on a particular, specific version of this. The generic function print-object is used for printing almost everything; even without user specialization, it is called whenever a structure-object or standard-object needs to be output to any stream. Users can write methods on it, though, and that then invalidates any previous precomputed dispatch information. But there are times when it's really important that print-object just work, without any kind of extra computation to go on: in particular, when the debugger needs to inform the user that the Lisp is running out of storage space (heap or stack), it's pretty important that that reporting can happen without using more heap or stack than necessary. So for print-object, we never reset the cache state to empty; it is always prefilled with entries for control-stack-exhausted, binding-stack-exhausted, alien-stack-exhausted, heap-exhausted-error and restart for its first argument. (This strategy only works if there are no specializations of the second argument to print-object anywhere in the system; there's no good reason for a user to try to specialize the second argument in any case, so we emit a warning if they do that and hope that they read and learn from it.)

azed 2173

OK, when I said “that never happens”, I clearly didn't expect this.

  • 2ac: GLASNOSTIC: Signal cost ‘varied’ in the spirit of openness: *(SIGNALCOST); ref. Glasnost
  • 10ac: GOOROO: Schmaltz on jumper spelling ‘revered old teacher’: GOO (= schmaltz) + ROO (= kangaroo); variant of “guru”
  • 11ac: CORNEA: Cereal crop alongside river – it's regularly grafted: CORN + EA (= river); ref. Corneal grafting
  • 13ac: GORGON: What abstainers drink, reverting? It's appallingly ugly: NO GROG reversed
  • 14ac: QUAINT: Stop holding ‘amateur’ as meaning ‘lovably odd’: QUINT (organ stop) around A(mateur)
  • 15ac: SPIE: Not the actor? That is what Marlowe doubled as possibly: THESP (= actor) - THE + IE; ref. Christophe Marlowe
  • 16ac: PURPOSE: Turned up poser solved, the desired goal: UP reversed + *(POSER)
  • 20ac: EITHER: Solvent? I admitted it may introduce an alternative: ETHER (solvent) around I
  • 21ac: RINSES: Light bathes north in upward slopes: N(orth) in RISES
  • 22ac: NATANT: Swimming in Mediterranean at Antibes: mediterraneaN AT ANTibes
  • 24ac: ENTRAP: Snare with associate (all but red) made to backtrack: PARTNERED - RED
  • 28ac: DIAPASE: Old melody to fade with a dance coming in: DIE (= fade) around PAS (dance)
  • 30ac: GLEN: Depression, often extended, a feature of singleness: sinGLENess
  • 31ac: IMPARL: I unfolded map with both hands to hold a confab: I + *(MAP) + RL (both hands)
  • 32ac: SHALLI: Look at these delicate fibres – do you think I should?: Double definition
  • 33ac: CAPRID: E.g. angora bonnet, free?: CAP (= bonnet) + RID (= free); ref. Angora
  • 34ac: SAPELE: Fine wood from Peru got in auction: PE(ru) in SALE (= auction)
  • 35ac: METACENTRE: Mozart's first entr'acte composed containing English: a point of intersection: M(ozart) + *(ENTRACTE) around E(nglish): ref. Metacentre
  • 1dn: EGGS BENEDICT: Binges with ged etc cooked in tasty snack: *(BINGES GED ETC)
  • 2dn: GOOPY: Energy starting work with bit of yolk, glutinous: GO (= energy) + OP(us) + Y(olk)
  • 3dn: LORIOT: Pretty bird, one yet to pass test with love and loose living: L (ref. L-plate) + O (love) + RIOT; var. oriole
  • 4dn: SOOK: Aussie wimp, and accordingly not particularly good: SO (accordingly) + OK (not particularly good)
  • 5dn: NONPARTY: Parton active in New York, unattached politically: N(ew) Y(ork) outside *(PARTON)
  • 6dn: SOURCING: Finding origin of crab-apple? It includes Cuba: SOURING outside C(uba)
  • 7dn: TRAPUNTO: Type of quilting made of horsecloth until obsolete: TRAP (horsecloth) + UNTO (obs. until)
  • 8dn: INION: Lackey has head clipped causing lump thereon: (m)INION
  • 9dn: WATER SPANIEL: Gundog that's reliant with paws galloping round heart of fen?: *(RELIANT PAWS) around fEn
  • 12dn: ENSUE: To succeed it must be removed fom a bathroom: EN-SUITE - IT
  • 17dn: CHAMPART: Amateur page in carriage, what feudal lord was entitled to: HAM (amateur) + P(age) in CART (carriage)
  • 18dn: DENTARIA: Parasitic plant strangely radiant about end of tree: *(RADIANT) around treE
  • 19dn: BRETESSE: Gallery helping the beseiged – network's replacing one in foundation: BASSE (= foundation) with A (one) replaced by RETE (= network)
  • 23dn: ANIMA: A good mimic uplifted the feminine in a man: A MINA (var. myna, starling capable of imitations) reversed.
  • 25dn: ROLLER: Canary, one singing, about to fly off: CAROLLER - CA (= circa, about)
  • 26dn: NAPPE: Chump losing last sheet of sums: NAPPER (= head) - R
  • 27dn: SELLE: E.g. palfrey's saddle, partly tasselled: tasSELLEd
  • 29dn: KHAN: Dirk (Persian) pulling jar in eastern inn: KHANJAR (Persian dagger) - JAR

So there we go: two in a row.

guardian 21666

A cute puzzle by Otterden; the rubric reads:

Each of the four sides of the completed grid contains three proper nouns of a kind, not further defined

which added to the frisson when I started attacking it.

  • 9ac: KID GLOVES: Soft digital covers Boy George adores: KID + G(eorge) + LOVES
  • 10ac: TOTEM: Emblem of a form of betting – the first of many: TOTE (ref. The Tote) + M(any)
  • 11ac: SCANNER: Comes across critic after opening of show: CANNER (= critic) after S(how)
  • 12ac: RECLAIM: Recall miracle play: *(MIRACLE)
  • 13ac: SOU: Resources show very little money: reSOUrces
  • 14ac: FORESEE: Anticipate front view: FORE (= front) + SEE (= view)
  • 17ac: MISSION: Avoid one on delegation: MISS + I + ON
  • 19ac: ARTICLE: Credential unfortunately leaving out end item: *(CREDENTIAL - END)
  • 22ac: HENPECK: Continually criticise bird weight: HEN (bird) + PECK (? imperial unit of volume)
  • 24ac: NEY: Say no to old marshal: ref. Michel Ney
  • 25ac: ANISEED: A need is to provide liquid flavouring: *(ANEEDIS)
  • 26ac: PICKAXE: Choose to dispense with tool: PICK (= choose) + AXE (= dispense with)
  • 28ac: RAVEN: Hungrily devour bird: Double Definition
  • 29ac: SWEETENER: Come on in – coffee perhaps?: another Double Definition, and a good one; “Come on” and “in coffee perhaps”
  • 2dn: INDIA: Country favoured aid redistribution: IN (= favoured) + *(AID)
  • 3dn: UPLANDS: Good periods getting to secure higher areas: UPS (= good periods) around LAND (= secure)
  • 4dn: OBVERSE: Heads face up to old boy's poetry: O(ld) B(oy) + VERSE
  • 5dn: LUSTRUM: Crave spirit after five years: LUST + RUM
  • 6dn: SHTICKS: Supports include hospital attention-seeking devices: STICKS around H(ospital)
  • 7dn: OSTRACISE: Review riot cases ban: *(RIOTCASES)
  • 15dn: RETRIEVER: Trier somehow always one to get things back: *(TRIER) + EVER (= always)
  • 16dn: EEL: Devious one up to be a general: LEE reversed
  • 18dn: ICE: Reserve kitchen regularly: kItChEn
  • 20dn: CLEAN UP: Reduce mess list in vessel: LEAN (= list) in CUP (vessel)
  • 21dn: END USER: Final recipient endures being out of order: *(ENDURES)
  • 22dn: HYPHENS: They join up with egg producers who are after detailed promotional material: HENS (egg producers) after HYP(e); it took me a long time to work out that detailed was the indicator for de-tailing “hype”
  • 23dn: NECKTIE: Cheek to marry in formal wear: NECK (cheek) + TIE (marry)
  • 27dn: ANNUL: Cancel annual outing away: ANNUAL - A(way)

I guessed the perimeter theme fairly early on, but for some reason was working on LONDON/LISBON rather than BERLIN/TEHRAN for the bottom right-hand corner for rather too long.

  • 1ac: BEIRUT OSLO SEOUL
  • 30ac: BERN PARIS BERLIN
  • 1dn: BAKU SOFIA ZAGREB
  • 8dn: LIMA MINSK TEHRAN
inquisitor 1317

My word. I buy the Independent newspaper on Saturdays, largely out of the habit formed having discovered as a student that the crossword (then in the magazine supplement, not at that point called the Inquisitor) was achievable. I had a pretty good hit rate at the time; my (partial) recollection is that two weeks in three I would have a decent stab at it, often in Saturday morning maths lectures. (To any of my then lecturers I offer an apology, at the very least for my lack of discretion; any of my students coming across this should not use my behaviour then as an example now.)

One of my prouder moments was not only completing a crossword, but getting round to sending it in and receiving a dictionary through the post a couple of weeks later – not without some puzzlement, since at the time the prize advertised was a bottle of champagne or olive oil. Sadly the online archives of the crossword don't go back far enough for me to link to any evidence, but some of the puzzlement went away when I saw my name under lights; specifically, listed as a winner under crossword number 100 (which would make the one I won crossword number 97, though beware the renumberings in Inquisitor space – maybe it was really number 346).

In the (many) intervening years, I have continued to enjoy attempting crosswords; I eventually ‘discovered’ Araucaria), occasionally have a crack at Azed (never with success, I hasten to add), and generally enjoy my fortnightly dose of smut in Eye Crossword. I retain a particular soft spot for the themed crosswords; there's something satisfying about solving a puzzle which has taken considerable, conspicuous artistry to construct; what I generally lack is the time to do justice to an attempt at them (attack some clues, sit down with reference books, regret that the dictionary I won – Chambers 1993 – is no longer up to the minute).

I was therefore surprised to find that Inquisitor 1317 (Who's the Daddy by Ecologue, published Saturday 18th January 2014) yielded to a mildly sustained attempt over just one day: I think I was lucky to have solved as some of my early clues the ones interesecting with the theme light to give W.....MB.... as the first author: leaping to William Blake wasn't too hard, and since the corrected letters from clues towards the end fit with “symmetry”, I was fairly confident I had a match. The rest of the clues fell fairly straightforwardly; they're a lot easier to solve when you're not trying to guess the misprint, though even then I spent a fair amount of time trying to justify “orisons” (16ac) and “joe” (8dn) rather than “posions” and “jet”. I hadn't actually come across John Steinbeck's Burning Bright; The Tyger is apparently a sufficiently common source of title fodder for there to be a list of F&SF works with titles derived from it, but some more careful searching eventually turned up the Steinbeck.

Clue analysis:

  • 1ac: BEFRIENDED: Made buddlies with fine red drunk during sex: *(FINERED) in BED (sex);
  • 10ac: APEPSY: It may cause wilnd primate mind to be half abstracted: APE + PSY(che)
  • 12ac: POILU: In Paris soldant's two Hawaiian dishes chucked to the French: POI + LU(au)
  • 13ac: TATI: His Gallic thumour was evident from agitation: agiTATIon (Jacques Tati)
  • 14ac: LIMN: Initially lietter intricately majestic notation (initials; & lit.)
  • 15ac: ARGOT: Low-linfe language to work in deception: GO in ART
  • 16ac: GASES: Perhaps proisons have all sections behind government letter: A (all) SES (sections) behind G (government letter)?
  • 18ac: MORPHEW: Possibly wrash hack after easy romp: *(ROMP) + HEW (hack) = spots
  • 19ac: TAFT: Army on foot in former prieses according to Jock: TA (Territorial Army) + FT (foot) = William Howard Taft (preses = Scot. president)
  • 20ac: BOER: Neighbour around East farming wsort: BOR around E(ast).
  • 21ac: RETRO: Dazted before casualty comes round – about time!: OR (before) + ER (Emergency Room = casualty department) around T(ime)
  • 24ac: AFRAID: Fellow taking part in an attack. WShy?: F(ellow) in A RAID
  • 28ac: STATUE: It's cut from ruock, say, in astute turnover: *(ASTUTE)
  • 31ac: ETENS: Large bfellows set about round nut: *(SET) around EN = nut (printing)
  • 32ac: Martch for his queen ensconced with Home Secretary: H(ome) S(ecretary) around ER = queen
  • 33ac: NORN: In the early hours measure is halved for one of Tihree: ? = Norse analogue of Greek Fate
  • 34ac: POTSHOT: Bags stolen in random firme: POTS (= bags) + HOT (= stolen)
  • 37ac: EDGES: Thank God in butcher's returning fridnges: DG (Deo Gratias = thanks be to God) in SEE (= butcher's hook: look)
  • 40ac: EVITA: Raice lyrically wrote this part of The Return of the Native: in nATIVE reversed; Tim Rice wrote the book for the musical Evita.
  • 41ac: TRUE: HGood's time to regret: T(ime) + RUE
  • 42ac: ETAS: JHumble folk to stuff round: SATE reversed (lower-class Japanese menial workers)
  • 43ac: RENEW: Flying wren with energy to exptend: *(WREN + E(nergy))
  • 44ac: ERRANT: Engaged in pcrime tirade following hesitation: ER + RANT
  • 45ac: POPLINETTE: Daddy's clear of position being outside caorded stuff: POP + NETT (clear of) in LIE (position)
  • 1dn: BATATA: Tiuber essence cheers: BA (soul in ancient Egypt) + TATA (bye-bye)
  • 2dn: FETA: Product of minlk loudly chewed up: F + ATE reversed (= Feta cheese)
  • 3dn: ISLE: Lantd in water lives – headless eel rises: IS (= lives) + EL reversed
  • 4dn: NIMMER: Check up French gentlemen within litfter: MM (fr. Messieurs) + REIN (check) reversed (= thief)
  • 5dn: DONOR: A fellow has gold givenr: DON (university Fellow) + OR (gold)
  • 6dn: DORP: Poke e.g. with stick up isolated aldera: PROD reversed (= isolated village; aldea = Sp. village/hamlet)
  • 7dn: NIGHTMAN: BMinder of bricks, say, close to Mother and Nature at first: NIGH (= close) + MA + N(ature)
  • 8dn: SLOE: Perhaps joet seven down it's said: S (mediaeval Roman numeral 7) + LOE (homonym for low = down)
  • 9dn: OUTWORE: Dissolute roue has a couple lashted longer: *(ROUE) outside TWO
  • 11dn: PISTOL: Schooter on track mostly over line: PIST(e) + O(ver) + L(ine)
  • 16dn: GALIOT: Galledy by riot girl first without right: GAL + (r)IOT (var. galliot = small galley)
  • 17dn: SOFA: Might it provide basic compfort from the South of America: S(outh) + OF + A(merica)
  • 20dn: BAITS: Lurkes a bit suspiciously at top of shop: *(A BIT) + S(hop)
  • 21dn: RIBES: Curreants found in Carib estuary: caRIB EStuary (= saxifrage currant)
  • 22dn: RAKERS: They cleanr lawns, say, right old pain to scientists: R(ight) + AKE (obs. = ache) + RS (Royal Society)
  • 23dn: SLEETING: Having wintry pfall settling unsteadily over the east with temperature dropping: *(SETTLING + E(ast)) - T(emperature)
  • 25dn: WEEPERS: Those who blaubber: footballer's moving south: SWEEPER (= footballing position) with S(outh) moved
  • 26dn: MURE: Will's to walkl up with energy after a rise in spirit: RUM reversed + E(energy)
  • 27dn: LINGER: Palss in tedium in sector of Berlin, Germany: berLIN GERmany
  • 29dn: TETRYL: BYellow explosive let off during test? On the contrary: TRY in *(LET)
  • 30dn: SNASTE: RMiddle of candle that's burnt tin brewing teas: SN (tin) + *(TEAS) (= wick)
  • 32dn: HOT UP: Get wardmer excited on horseback
  • 35dn: OVER: Donae Trevor holds up: tREVOr reversed
  • 36dn: STEP: DTread note in special case: TE (leading note) in SP (special case?)
  • 38dn: DERN: Antiquarian danrk, perhaps, underneath clothes: unDERNeath (= archaic secret)
  • 39dn: ETAT: Loyon's rank is revoked in statement: sTATEment reversed (= Fr. rank)

and once all that's in, replacing WILLIAM BLAKE with JOHN STEINBECK allows highlighting of JOE SAUL and MORDEEN as well as FRIEND ED, leaving VICTOR as the Daddy of the title.

And what is it about synchronicity of obscure words? I had a go at the Sunday 19th January Azed, and what is 21dn? “Old cargo boat: flap about slick when it's capsized?” – OIL in TAG reversed, or GALIOT.

extended specializer responses

I got a few responses to my call for use cases for generalized specializers; I'll try to summarize them in this post. Before I do, it's perhaps worth noting that the work on generalized specializers that Jim Newton and I did was written up at about the same time as Charlotte Herzeel, Jorge Vallejos, Theo D'Hondt and Pascal Costanza's work on filtered dispatch, and so our Custom Specializers in Object-Oriented Lisp paper doesn't refer to it. I'll talk more about filtered dispatch in a later post, when I tie all these threads together, but for those who aren't aware of it it's worth looking at, along with ContextL for dispatch that varies based on dynamic program state.

Meanwhile, some other ideas for extended specializers: James Anderson suggested duck typing, and I think working along similar lines Patrick Stein thought of specializers that could dispatch on the dimensions of array arguments (or length of sequence arguments). That feels to me as though there should be a fairly compelling use case, but the toy example of

(defmethod cross-product ((x (length 3)) (y (length 3)))
  ...)

doesn't generalize. I suppose there might be an example of selecting particular numerical algorithms based on overall matrix dimensions or properties, something like

(defmethod invert ((x (total-size> 1000000000)))
  ... invert big matrix ...)
(defmethod invert ((x (total-size<= 1000000000)))
  ... invert small matrix ...)

but it doesn't feel concrete yet.

On the other hand, just about everyone's first response to the question (Jan Moringen, and the crowded wisdom of #lisp IRC) was pattern specializers, usually through regular expressions or optima in particular; one example concrete use case given was to dispatch among handlers for urls. This is a very interesting case; I first considered this in the early days of extended specializers, and indeed mop-27.impure.lisp from the SBCL test suite captures one other use case, in a (toy) simplifier for arithmetic expressions, redolent of implementations of symbolic differentiation from a bygone age. At the time, I took that example no further, both because I didn't have a real use case, and also because I didn't fancy writing a full-strength pattern matching engine; now that optima exists, it's probably worth revisiting the example.

In particular, it's worth considering how to handle capturing of pattern variables. To continue with the toy simplifier, the existing dispatch and specializer implementation would allow one to write

(defmethod simplify1 ((p (pattern (+ x 0))))
  (cadr p))

but what would be really neat and convenient would be to be able to write

(defmethod simplify1 ((p (pattern (+ x 0))))
  x)

and in order to do that, we need to intercede in the generation of the actual method function in order to add bindings for pattern variables (which, helpfully, optima can tell us about).

The awkwardness in terms of the protocol – beyond the problems with metaprogramming at compile-time in the first place – is that make-method-lambda operates in ignorance of the specializers that will be applied to the method. In fact, this was the root cause of a recently-reported SBCL bug: SBCL itself needs to communicate the name and method lambda list from defmethod to make-method-lambda, and has no other way of doing that than special variables, which weren't being cleared to defend against nested calls to make-method-lambda through code-walking and macroexpansion.

But make-method-lambda is the function which generates the method body; it is exactly the function that we need to extend or override in order to do the desired automatic matching. So how can we expose this to the metaprogrammer? We can't change the signature of make-method-lambda; it might seem obvious to extend it by adding &optional arguments, but that changes the signature of the generic function and would break backwards compatibility, as methods must accept the same number of optional arguments as their generic function does; similarly, adding keyword arguments to the generic function doesn't work.

We could export and document the special variables that we ourselves use to propagate the information; in some ways that's cleanest, and has the virtue of at least having been tested in the wild. On the other hand, it feels unusual, at least in the context of the metaobject protocol; usually, everything of interest is an argument to a protocol function. So, we could define a new protocol function, and have make-method-lambda default to trampolining to it (say, make-method-lambda-with-specializer-specifiers; the basic idea, though not the horrible name, is due to Jan Moringen). But we'd need to be careful in doing that; there is some implementation-specific logic deep in PCL that performs extra optimizations to methods (the fast-method calling convention) if the system detects that only the standardized methods on make-method-lambda are applicable to a particular call; if we add any extra metaobject protocol functions in this area, we'll need to make sure that we correctly update any internal logic based on detecting the absence of metaprogrammer overrides or extensions...

career planning and networking

Helen Kempster from the Goldsmiths careers service came to talk about Career Planning and Networking – a full two-hour session, or maybe two one-hour sessions joined on to each other. The starting point for the Career Planning was the theoretical framework by Bill Law, a cycle of Self-awareness, Opportunity Awareness, Decision Making and Transition Learning. It was not too surprising to me to discover that very few students self-identified as still being at the self-awareness stage; in some ways it's natural for students doing their final projects and with one eye on the next thing being more interested in opportunities or decision-making, but given my own current issues around career Angst and (not) knowing what I want to do with my life, I felt the irony. But then, maybe that justifies the model in some small way: it is a cycle.

It was predictably difficult also to convince some of the students that the skills in biggest demand, even for Computing-related jobs, were generic (“transferrable”) skills; communication skills, team-working, time-management and so on. Yes, understanding of algorithmic analysis can be a competitive advantage, but just running the numbers (on workers in Computing-related fields vs graduates of Computer Science programmes) suggests that if specialist knowledge is required in a given role, there's at least a chance that it can be acquired on the job. This does raise the question of why we're even bothering teaching “industry-friendly” languages; there's probably some kind of economic argument around information asymmetry (to do with attractiveness to students, rather than good outcomes for employers) but this is probably not the place to analyse it; every time I get a bit disheartened about our syllabus, I remind myself that one possible Mission of the University is to help people to live well.

The exercise for people to self-rate their level of transferrable skills was interesting, in particular the difficulty that they had with providing evidence for their ratings. There's general lack of experience, but there's also the lack of experience of thinking of their whole life as a source for evidence of skills – paid work is not the only source of evidence for CV bullet points. I also amused myself (after the students had provided ratings) by telling them about the Dunning-Kruger effect.

The networking session was perhaps a bit more abbreviated, and we went into less depth: though we did talk a bit about whether Computing practitioners are particularly vulnerable to the lone wolf fallacy, because of their general ability to go from idea to prototype on their own. There was a nice moment when Helen mentioned Robert Kiyosaki's Rich Dad, Poor Dad, and one of the students volunteered that he'd gone bankrupt again.

azed 2172

I just finished an Azed.

That never happens. Ever. Generally I don't have the time, but even when I do have the time I don't have the vocabulary. But this time I mostly did. (Too late to send it in, sadly). I've noticed in the past some clue or answer synchronicity, where relatively obscure vocabulary shows up in several weekend crosswords at once; maybe this blog will help me understand whether it's down to coincidence or conspiracy; as well as sharing GALIOT, this and inquisitor 1317 both refer to ETAT meaning rank (in 8dn here).

  • 1ac: GARIBALDI: Blouse revealing girl's front, a loose one: G(irl) + A + RIBALD (= loose) + I
  • 12ac: COUPE: What it contains I disposed of – nothing amiss therein!: tricky, and the last clue I solved (just filling in the P). A coupe is a short-stemmed shallow glass dish, usually containing ice cream. So ICE (= what it contains) - I with O (nothing) + UP (amiss) inside
  • 13ac: AUTOCUE: A worked out before Q? It's a help for public speaker: A + *(OUT) + CUE
  • 14ac: AD MANUM: Chap embraced by Maud, excited and ready: MAN inside *(MAUD)
  • 15ac: ANURA: Amphibians inhabiting Caspian (Uralian): caspiAN URAlian (= order of amphibians including frogs and toads)
  • 17ac: TEAMSTER: The pet husband twice got rid of – he'll move animals along: THE HAMSTER (pet) - HH
  • 18ac: PILOW: Spicy dish, mixed type, of little value: PI (ramdomized printer's type) + LOW; variant of pilaf
  • 19ac: PETAR: Device for making explosive entrance is scrapped in Pirates misguidedly: *(PIRATES) - IS
  • 20ac: OPEN MARRIAGES: Male included, unconventional pairs agree on ... such?: *(PAIRS AGREE ON) outside M(ale); & lit.
  • 22ac: CREEL: Soak to soften line – it's used to catch lobsters: CREE (= soak to soften) + L(ine)
  • 24ac: STADE: Sports venue given support by the sound of it: homonym for “stayed”
  • 26ac: AROMATIC: Do a basmati rice? A bed is so fragrant, curried: *(DO A BASMATI RICE) = *(A BED IS AROMATIC)
  • 29ac: NAVEW: Root vegetable not available, and one not in prospect: N(ot) A(vailable) + VIEW (= prospect) - I; I so wanted this to be “navet” for old-time's sake
  • 30ac: NAUTICS: Anicut's adapted for water sports: *(ANICUTS)
  • 31ac: TREAGUE: Turbulent age contained by genuine cessation of war once: *(AGE) inside TRUE
  • 32ac: ATOKE: Return of ancient character accepting satisfactory part with no sex: OK inside ETA reversed
  • 33ac: INDAGATOR: One of yore searching out form of gradation: *(GRADATION)
  • 2dn: AO DAI: Women's tunic, excellent as wrap for concubine's pad: AI (A1 = excellent) outside ODA (room in harem)
  • 3dn: RUBMBLE: Grass on twig?: Double Definition
  • 4dn: BENT: Grass leaning: Double Definition
  • 5dn: ABUTTAL: An objection over pillar going up, one of two on which arch rests?: A + BUT + LAT (= pillar) reversed
  • 6dn: LAMEBRAINED: The crazed in bedlam are?: *(IN BEDLAM ARE) & lit.
  • 7dn: DUMA: Elected council identically trimmed boring shopping area: DU(ll) (= boring) + MA(ll) (identically trimmed)
  • 8dn: CONSTATE: Study ranks from below (pronounce in imitation of the French): CON + ETATS reversed
  • 9dn: SCUTA: Did they make a tortoise run away in South America: CUT (= run away) in S(outh) A(merica)
  • 10dn: CURER: Physician putting practice as of old in credit: URE (= [obs.] practice) in CR(edit)
  • 11dn: HEARTSEASE: Flower transformed seat in vehicle...: *(SEAT) in HEARSE
  • 12dn: CAMPO SANTO: ... Going to this, morning certain to be enveloped in melody: AM (= morning) + POS (= certain) in CANTO (= melody); it took me for ever to work out that the definition depended on the HEARSE from 11dn to indicate cemetery
  • 16dn: BONEMEAL: Fertilizer that has been mixed with loam: *(BEEN + LOAM)
  • 19dn: PRECAVA: Superior vessel in summary is missing narcotic drink: PREC(is) (summary) + AVA (drink from pepper plants); the answer brings back memories of Fantastic Voyage, which expanded my eight-year-old vocabulary considerably
  • 21dn: GALIOT: Old cargo boat: flap about slick when it's capsized: TAG (= flap) around OIL (= slick) reversed
  • 22dn: CRARE: Trader responsible for oversight, run in: CARE around R(un); another kind of ship
  • 23dn: ROVER: End of career past, he's ready to peg out!: careeR + OVER (= past); ref Croquet
  • 25dn: DECKO: Garland ring, look: DECK (= garland) + O (= ring)
  • 27dn: TOUN: Barrel with nothing in? You'll find Scotch aplenty here!: TUN (= barrel) around O (nothing)
  • 28dn: QUAG: Bog that shifts as ground on all sides falling away: QUA (= as) + GROUND - ROUND

The Fifteensquared analysis is pleasingly similar. I must be on the right track.

more prototypes with multiple dispatch

I received a couple of points in feedback regarding protoypes with multiple dispatch. Firstly, from Pascal Costanza, the observation that there's already a prototype-based dispatch system present in the quasi-standard CL MOP; the key is to view all the prototype objects as singletons, and to use introspection to manage delegation and the class-prototype as the actual object. Thus (any mistakes are mine, not Pascal's):

(defun clone (o)
  (let* ((scs (sb-mop:class-direct-superclasses (class-of o)))
         (new (make-instance 'standard-class :direct-superclasses scs)))
    (sb-mop:finalize-inheritance new)
    (sb-mop:class-prototype new)))

(defun add-delegation (o d)
  (let ((scs (sb-mop:class-direct-superclasses (class-of o))))
    (reinitialize-instance (class-of o) 
                           :direct-superclasses (list* (class-of d) scs))))

I don't think that this works in quite the same way as a traditional prototype-based system, mind you: here, a cloned object inherits all the behaviours provided by delegation, but not the behaviours from the cloned object itself. It's pretty close, though, and might help those to whom all this is new (but who are intimately familiar with the CLOS MOP – hm, actually, the intersection of those two sets might be a little small) get a bit of a handle on this.

Secondly, Lee Salzman was kind enough to get in touch, and we had a conversation about his thesis and his reflections on that work. I'll paraphrase, so again any misrepresentation is mine, but regarding the question at the end of my previous post about the semantics of redefinition, Lee was quite clear that the expectation was that previously-cloned objects should retain their previous behaviour, even if the original object is later updated (in prototypes and multiple dispatch terms, even if the original method is redefined). In other words, the ??? is indeed expected by prototype-oriented programmers to be (FOO[1] /B/).

Lee also said that, in his subsequent experience, he has come to believe that class-based systems are a necessity – particularly in image-based systems (where there is a persistent world). He's happy with prototypes as a mechanism in a world with static programme descriptions, where you can just edit the source code, then compile and run the programme, but believes that directly modifying running programmes makes classes or some equivalent abstraction necessary. I'm not sure I completely understand this point (though I'm fairly convinced by now that I don't much like the semantics of method redefinition in a world with long-lived objects), but I'm still waiting for a good example to highlight the advantages of prototype-oriented programmes.

Meanwhile, what does this imply for the implementation of prototypes with multiple dispatch within the extended CLOS metaobject protocol? Defining a new method specialized on an must override any existing behaviour for that object, but must leave unchanged the previous behaviour for any clones; that therefore implies that the generic function cannot discard the old method, as it must remain applicable to any clones. The consequences of this include: two prototype specializers, specialized on the same object, must not be considered to be the same specializers (otherwise the standard semantics of method definition would replace the old method with the new); and that the specializers must be annotated with the method that they belong to (so that it is possible to compute for a given specializer and argument whether that argument is acceptable to the specializer, remembering that the acceptability of an object to a prototype specializer in this world is primarily a function of the object itself). One piece of good news: the CLOS MOP already provides a mechanism for associating specializers with methods, through the specializer-direct-methods generic function, so that's at least some of the battle.

All of this merits a fuller description, a reference implementation, and some example code using it. I'm working on the first two, aiming to top up my all-important publications list by presenting at some conferences (and also helping to justifying my attendance); I'd love to hear about ideas for the third...

good student projects

For the first of my project and employability workshops this year, I aim to cover two principal discussion points. Firstly, the attributes of a good student project; we can do that in structured discussion form, which will almost certainly also highlight the need for a conscious effort in name recognition for networking:

  • pairs: introduce yourself and your project to your peer, and explain why you've chosen to do your particular project;
  • fours: introduce your peer and summarize their project to the other pair, and consider what makes a good student project.

Secondly, and taking as input the results of the previous discussion (and also comments from the project module leader, who can intervene at this stage), how can students best produce projects meeting the goals identified in the first discussion. I think this might be best delivered more from the front; there will be all sorts of practical advice that I can give (but I must make sure to ask the room for other experience).

So, before the session, what are the aspects of a good student project that I would highlight?

  • ambition: is the project hard? Does it carry an element of risk?
  • outcome: does the project work? How robust is it?
  • learning: has the student demonstrably learnt something while carrying out the project?
  • communication: is it clear to the assessors what the student has done?
  • demonstrability: can the project be used as an example in the student's future career?

I would expect the students as a group to come up with all of these, except perhaps ambition: I don't know if my expectations are wrong – I hope so, in fact – because if it doesn't show up I would wonder slightly whether we don't give enough emphasis through the programme to going beyond what is expected.

As for practical suggestions for them:

  • time-management and concentration: GTD, Remember the Milk; working habits and keeping logs; supervisor as project manager
  • learning and communication: communication to you now - what is interesting? What have you learnt?
  • demonstrability and outcome: minimum viable product
  • ambition: what would you like to do that you don't know how to do? What about things that no-one knows how to?
  • force multipliers: tools. Good compilers, good debuggers, good change management systems.

What am I forgetting? I hope I'll find out.

[ In the session, as it happened:

  • the standard “introduce your partner” bombshell when moving from pairs to fours had the expected effect, with many of the students unable to remember the name of their partner. I made the explicit link to networking.
  • “ambition” was in fact given by one group (but another group was contemplating “not too ambitious” as one of their criteria as I was walking around and listening, so there's still something to look at).
  • I didn't get on to anything technical; I spent more time on Minimal Viable Product, since the students claimed not to have heard the phrase before.

]

prototypes with multiple dispatch

On New Year's Day (did I have nothing better to do?) I asked the wider world real life uses of non-standard method selection, and I hinted that I had an real-life example of my own. This post does not discuss that example.

Instead, I'm going to discuss my limited understanding of another non-standard (at least, non-CLOS-standard) method selection system, and demonstrate what its use looks like in my current development world. I'm talking about a prototype-based object system: specifically, a mostly-faithful reimplementation of the Prototypes with Multiple Dispatch [1,2] system found in Slate and described by Lee Salzman and Jonathan Aldrich. I'll try to introduce the semantics as I understand them to an audience used to class-based multiple dispatch, but I'm left with some questions that I don't know how to answer, not being used to programming in this way myself.

So, first, what's going on? Well, the proper answer might be to read the linked papers, which have a relatively formal specification of the semantics, but the high-level idea could perhaps be summarised as finding what happens when you try to support prototype-based object systems (where the normal way to instantiate an object is to copy another one; where objects implement some of their functionality by delegating to other objects; and where single-dispatch methods are stored in the object itself) and multiple dispatch systems (where methods do not have a privileged receiver but dispatch on all of their arguments) simultaneously. The authors found that they could implement some reasonable semantics, and perform dispatch reasonably efficiently, by storing some dispatch metainformation within the objects themselves. The example code, involving the interactions between fish, healthy sharks and dying sharks, can be translated into my extended-specializer CL as:

(defpvar /root/ (make-instance 'prototype-object :delegations nil))
(defpvar /animal/ (clone /root/))
(defpvar /fish/ (clone /root/))
(defpvar /shark/ (clone /root/))
(defpvar /healthy-shark/ (clone /root/))
(defpvar /dying-shark/ (clone /root/))
(add-delegation /fish/ /animal/)
(add-delegation /shark/ /animal/)
(add-delegation /shark/ /healthy-shark/)
(defgeneric encounter (x y)
  (:generic-function-class prototype-generic-function))
(defmethod encounter ((x /fish/) (y /healthy-shark/))
  (format t "~&~A swims away~%" x))
(defmethod encounter ((x /fish/) (y /animal/))
  x)
(defgeneric fight (x y)
  (:generic-function-class prototype-generic-function))
(defmethod fight ((x /healthy-shark/) (y /shark/))
  (remove-delegation x)
  (add-delegation x /dying-shark/)
  x)
(defmethod encounter ((x /healthy-shark/) (y /fish/))
  (format t "~&~A swallows ~A~%" x y))
(defmethod encounter ((x /healthy-shark/) (y /shark/))
  (format t "~&~A fights ~A~%" x y)
  (fight x y))

(compare figures 4 and 7 of [1]; defpvar is secretly just defvar with some extra debugging information so I don't go crazy trying to understand what a particular #<PROTOTYPE-OBJECT ...> actually is.)

Running some of the above code with

(encounter (clone /shark/) (clone /shark/))

prints

#<PROTOTYPE-OBJECT [/HEALTHY-SHARK/, /ANIMAL/] {10079A8713}> fights
#<PROTOTYPE-OBJECT [/HEALTHY-SHARK/, /ANIMAL/] {10079A8903}>

and returns

#<PROTOTYPE-OBJECT [/DYING-SHARK/, /ANIMAL/] {10079A8713}>

(and I'm confident that that's what is meant to happen, though I don't really understand why in this model sharks aren't fish).

The first question I have, then, is another lazyweb question: are there larger programs written in this style that demonstrate the advantages of prototypes with multiple dispatch (specifically over classes with multiple dispatch; i.e. over regular CLOS). I know of Sheeple, another lisp implementation of prototype dispatch, probably different in subtle or not-so-subtle ways from this one; what I'm after, though, probably doesn't exist: if there's no easy way of using prototype dispatch in Lisp, it won't be used to solve problems, and some other way will be used instead (let's call that the computer programmer's weak version of the Sapir-Whorf hypothesis). What's the canonical example of a problem where prototype-based object systems shine?

The second question I have is more technical, and more directly related to the expected semantics. In particular, I don't know what would be expected in the presence of method redefinition, or even if method redefinition is a concept that can make sense in this world. Consider

(defpvar /a/ (clone /root/))
(defgeneric foo (x)
  (:generic-function-class prototype-generic-function))
(defmethod foo ((x /a/)) `(foo[1] ,x))
(defpvar /b/ (clone /a/))
(foo /a/) ; => (FOO[1] /A/)
(foo /b/) ; => (FOO[1] /B/)
(defmethod foo ((x /a/)) `(foo[2] ,x))
(foo /a/) ; => (FOO[2] /A/)
(foo /b/) ; => ???

What should that last form return? Arguments from the prototype-oriented world would, I suspect, lead to the desired return value being (FOO[1] /B/), as the redefinition of the method on foo specialized to /a/ is completely irrelevant to /b/. This is my reading of the semantics described in [1], for what it's worth. Arguments from the world of generic functions and expected behaviour would probably argue for (FOO[2] /B/), because redefining a method is an action on a generic function, not an action on a set of application objects. And the argument of my implementation in practice (at present, subject to change) is to signal no-applicable-method, because method redefinition is the successive removal of the old method and addition of the new one, and removal of the old method of the generic function affects dispatch on all the objects, whereas adding the new one affects dispatch on just /a/.

why investigate databases of audio?

At the launch meeting for Transforming Musicology (I should perhaps say that technically this was in the pub after the launch meeting), Laurence Dreyfus asked me why I was experimenting with a collection of recordings when planning my Josquin/Gombert case study, as opposed to the perhaps more natural approach of investigating the motivic or thematic similarity of music starting with the notated works (manuscripts, contemporary or modern editions).

By this stage in the evening, I was not feeling at my best – a fact unrelated to the venue of the conversation, I hasten to add – and I wouldn't be surprised if my answer was not a model of clarity. Here's another go, then, beginning with an anecdote.

When I was a PhD student, a long, long time ago in a discipline far, far, away, the research group I was in had a weekly paper-reading club, where students and postdocs, and the occasional permanent member of staff, would gather together over lunch and try to work and think through an article in the field. Usually, the paper selected was roughly contemporary, maybe published in the last few years, and therefore (because of the publishing norms in Applied Mathematics and Theoretical Physics) the paper would be available on the arXiv, and so could be acquired, and printed, without leaving one's desk. (Picking up the printed copy could double up as one's daily exercise quota.) One week, however, some imp put down a paper that predated the arXiv's rise to prominence. I have two clear memories, which should nevertheless be treated as unreliable: one of myself, spending about an hour of elapsed time in the mathematical library, registering, finding the journal, finding the volume and photocopying the article; the other of the lunch meeting, discovering that those of us having seen copies of the article (let's not go as far as having read the article) being definitively in the minority.

There are several lessons to be drawn from this, beyond further evidence of the laziness and hubris of the typical PhD student. The availability of information, in whatever form, makes it more likely to be useful and more likely to be used. It's timely to reflect on the case of Aaron Swartz, who confronted this issue and faced disproportionate consequences; I'm pleased to say that I am involved in my institution's working group on Open Access, as we try to find a way of simultaneously satisfying all the requirements imposed on us as well as extending our ability to offer a transformative experience.

How does this affect musicology, and our particular attempt to give it the transformative experience? Well, one issue with music in general is its lack of availability.

That is of course a ridiculous statement, designed to be provocative: in this era of downloadable music, streaming music, ripped music, music in your pocket and on your phone, music has never been more available. But the music available in all those forms is audio; the story for other forms of musical data (manuscript notation, chord sequences, performing editions, even lyrics) is far less good. Sometimes that is for copyright reasons, as rights-holders attempt to limit the distribution of their artifacts; sometimes that is for economic reasons, as the resources to digitize and encode public-domain sources of notation are unavailable. But the net effect is that while musical audio is limited and expensive, it is often not possible to purchase large amounts of musical data in other forms at any price.

So, in my still-hypothetical case study of Josquin/Gombert attribution, I could use notation as my primary source of data if I had encodings of sources or editions of the pieces I'm interested in – the needles, if you will; if I had those, I could verify that some computational algorithm could identify the association between sections of the chansons, Lugebat and Credo. That encoding task would be tedious, but achievable in – let's say – a week or so for the three pieces. The problem with that is that that is only half the battle; it is the construction of the needle, but for a method like this to be properly tested it's not fair just to let it loose on the needle; a search system has to be given the chance to fail by hiding the needle in a suitable haystack. And constructing a haystack – encoding a few hundreds of other Renaissance vocal works – is the thing that makes it less than practical to work on search within databases of notation, at least for this long-tail repertoire.

And that's why at the moment I investigate databases of musical audio: I can get the data, and in principle at least so can other people. If you can do it better, or just differently, why not consider applying for one of the Transforming Musicology mini-projects? There will be a one-day exploratory event at Lancaster University on the 12th February to explore possible project ideas and collaborations, and having as wide a pool of interested parties as possible is crucial for the production and execution of interesting ideas. Please come!

slime has moved to github

This is probably not news to anyone reading this, but: SLIME has moved its primary source repository to github.

One of my projects, swankr (essentially, a SLIME for R, reusing most of the existing communication protocol and implementing a SWANK backend in R, hence the name), obviously depends on SLIME: if nothing else, the existing instructions for getting swankr up and running included a suggestion to get the SLIME sources from common-lisp.net CVS, which as Zach says is a problem that it's nice no longer to have. (Incidentally, Zach is running a surveydirect link – to assess possible effects of changes on the SLIME userbase.)

So, time to update the instructions, and in the process also

  • hoover up any obvious patches from my inbox;
  • improve the startup configuration so that the user need do no explicit configuration beyond a suitable entry in slime-lisp-implementations;
  • update the BUGS.org and TODO.org files for the current reality.

That's all safely checked in and pushed to the many various locations which people might think of as the primary swankr repository. But those org-mode files are exported to HTML to produce the minimal swankr web presence, and the script that does that was last run with org-mode version 7.x, while now, in the future, org-mode is up to version 8 (and this time the change in major version number is definitely indicative of non-backwards-compatible API changes).

This has already bitten me. The principles of reproducible research are good, and org-mode offers many of the features that help: easily-edited source format, integration with a polyglossia of programming languages, high-quality PDF output (and adequate-quality HTML output, from the same sources) – I've written some technical reports in this style, and been generally happy with it. But, with the changes from org-mode 7 to org-mode 8, in order to reproduce my existing documents I needed to make not only (minor) source document changes, but also (quite major) changes to the bits of elisp to generate exported documents in house style. Reproducible research is difficult; I suppose it's obvious that exact reproduction depends on exact software versions, platform configurations and so on – see this paper, for example – but how many authors of supposedly reproducible research are actually listing all the programs, up to exact versions of dynamically-linked libraries they link to, used in the preparation and treatment of the data and document?

In any case, the changes needed for swankr are pretty minor, though I was briefly confused when I tried org-html-export-as-html first (and no output was produced, because that's the new name for exporting to an HTML buffer rather than an HTML file. The swankr website should now reflect the current state of affairs.

the dangers of writing less

A year or so ago, I wrote a couple of blog entries on precompiling discriminating functions for generic functions, both given mostly class-based dispatch and also when most of the methods were specialized on individual objects (i.e. methods with specializers of class eql-specializer).

I signed off the second entry with

Next up, unless I've made further oversights which need correction: automating this process, and some incidental thoughts.

and of course never got back to this topic. Now it's over a year later, and I can no longer remember either my incidental thoughts, which I'm sure were fascinating, nor my strategy for automating this (because this was an attempt to address an actual user need, in – if I remember correctly – a CL implementation of protobuf). Suggestions for what I might have been thinking at the time gratefully received.

Write more: you know it makes sense.

transforming musicology launch meeting

Our AHRC-funded project, Transforming Musicology, has its first all-hands meeting today.

While it may seem odd that we are three months into the funded period of the project and we haven’t all met yet – and it is a bit odd, really – it was also pretty much unavoidable: the confirmation of funding only came through in August, at which point it is difficult to get things up and running in a University in time to advertise a PhD studentship, deal with application enquiries, shortlist, interview, appoint a good candidate and deal with all the associated paperwork in time for September enrolment. The timing meant that there was an inevitable built-in three-month lag before some key project personnel were available (the next PhD enrolment date is now, in January) so it made sense to delay the launch meeting until this point, too. Not to mention that many of the project partners are high-powered professors with many diary commitments; getting them all in one place on one day is a triumph of organization in itself, for which Richard deserves much credit.

I spent some time yesterday trying to cook up a demo of audioDB, an old, unlamented (but a bit lamentable in its current state) tool from an earlier project. I’m at the stage of identifying the low-hanging fruit in audioDB that would need picking to make it a tool useful to musicologists; as well as the UI issues – it is definitely a tool currently optimized towards use on the command-line – there is the existential question of whether what it does could be useful in any way to musicologists in the first place. I think so, but at the moment it’s more handwaving and faith than firm knowledge.

The case study I’m working on is based on a question of attribution of some chansons and motets. The issue in question has largely been settled; I think everyone these days accepts that the eight-part Lugebat David Absalon is by Nicolas Gombert, not Josquin Des Prez, and that some other works (Tulerunt Dominum, Je prens congies and J’ay mis mon cueur) are also likely to be of the same musical hand: Martin Picker wrote on this in 2001, but recordings that I have of these works which predate that also agree on the attribution. (The works were originally attributed to Josquin based partly on their high quality; it has been said that for a while Josquin composed more and better works after he was dead than while he was alive...)

A nice demonstration, then, would be to reproduce the similarity relationships between recordings of the works discussed in Picker’s article, and show that those similarities are stronger than acoustic similarities that arise by chance. This isn’t going to change anyone’s mind either way on the Lugebat question, of course, but if it works it can give some confidence to musicologists that audioDB could be used to investigate collections of recordings for acoustically similar material without already knowing the answer.

Does it work? Sort-of-not-quite-yet; the chansons and the Credo do bubble up near the top of the search results, but without the clear delineation between them and other, less related hits. Yesterday’s investigations revealed the need for a couple of improvements: firstly, some finer-grained filtering of “interesting” regions, as otherwise the strongest matches between audio of this era tends to be strong final G-minor chords; secondly, there needs to be some work done on audio feature design, to improve the machine listener’s ear, because at the moment the feature I'm using does not capture pitch perception reliably enough. The good news is that addressing these things are in scope for the Transforming Musicology project, so there's some chance that they'll get done.

more efficient hyperlinked blogging

How meta. To maintain my progress on my new year's resolution, I have written some code (*gasp!*) – yes, that counts as writing. And what does that code do? Why, it makes me more efficient at highly hyperlinked blogging: it is a certain amount of fairly trivial and mildly tedious elisp, which allows the easy insertion of markdown markup to create links to various authoritative sources of information about Lisp. Well, OK, to the Hyperspec and the MOP dictionary, but as an implementor that's all I really need, right? So, now I can talk about compute-effective-method or make-method-lambda and my eager readers can be taken to the relevant documentation at the speed of thought.

Questions that arose during the process:

  • why are all the fake packages in hyperspec.el created with (make-vector 67 0)?
  • has anyone in the 23 years since AMOP was published ever been glad that the MOP standardizes the extract-lambda-list and extract-specializer-names functions? (Fun fact: SBCL also has extract-parameters and extract-required-parameters functions, unexported and unused.)
bugs all the way down

There are times when being in control of the whole software stack is a mixed blessing.

While doing investigations related to my previous post, I found myself wondering what the arguments and return values of make-method-lambda were in practice, in SBCL. So I did what any self-respecting Lisp programmer would do, and instead of following that link and decoding the description, I simply ran (trace sb-mop:make-method-lambda), and then ran my defmethod as normal. I was half-expecting it to break instantly, because the implementation of trace encapsulates named functions in a way that changes the class of the function object (essentially, it wraps the existing function in a new anonymous function; fine for ordinary functions, not so good for generic-function objects), and I was half-right: an odd error occurred, but after trace printed the information I wanted.

What was the odd error? Well, after successfully calling and returning from make-method-lambda, I got a no-applicable-method error while trying to compute the applicable methods for... make-method-lambda. Wait, what?

SBCL's CLOS has various optimizations in it; some of them have been documented in the SBCL Internals Manual, such as the clever things done to make slot-value fast, and specialized discriminating functions. There are plenty more that are more opaque to the modern user, one of which is the “fast method call” optimization. In that optimization, the normal calling convention for methods within method combination, which involves calling the method's method-function with two arguments – a list of the arguments passed to the generic function, and a list of next methods – is bypassed, with the fast-method-function instead being supplied with a permutation vector (for fast slot access) and next method call (for fast call-next-method) as the first two arguments and the generic function's original arguments as the remainder, unrolled.

In order for this optimization to be valid, the call-method calling convention must be the standard one – if the user is extending or overriding the method invocation protocol, all the optimizations based on assuming that the method invocation protocol might be invalid. We have to be conservative, so we need to turn this optimization off if we can't prove that it's valid – and the only case where we can prove that it's valid is if only the system-provided method on make-method-lambda has been called. But we can't communicate that after the fact; although make-method-lambda returns initargs as well as the lambda, an extending method could arbitrarily mess with the lambda while returning the initargs the system-provided method returns. So in order to find out whether the optimization is safe, we have to check whether exactly our system-provided method on make-method-lambda was the applicable one, so there's an explicit call to compute-applicable-methods of make-method-lambda after the method object has been created. And make-method-lambda being traced and hence not a generic-function any more, it's normal that there's an error. Hooray! Now we understand what is going on.

As for how to fix it, well, how about adding an encapsulations slot to generic-function objects, and handling the encapsulations in sb-mop:compute-discriminating-function? The encapsulation implementation as it currently stands is fairly horrible, abusing as it does special variables and chains of closures; there's a fair chance that encapsulating generic functions in this way will turn out a bit less horrible. So, modify sb-debug::encapsulate, C-c C-c, and package locks strike. In theory we are meant to be able to unlock and continue; in practice, that seems to be true for some package locks but not others. Specifically, the package lock from setting the fdefinition from a non-approved package gives a continuable error, but the ones from compiling special declarations of locked symbols have already taken effect and converted themselves to run-time errors. Curses. So, (mapcar #'unlock-package (list-all-packages)) and try again; then, it all goes well until adding the slot to the generic-function class (and I note in passing that many of the attributes that CL specifies are generic-function SBCL only gives to standard-generic-function objects), at which point my SLIME repl tells me that something has gone wrong, but not what, because no generic function works any more, including print-object. (This happens depressingly often while working on CLOS).

That means it's time for an SBCL rebuild, which is fine because it gives me time to write up this blog entry up to this point. Great, that finishes, and now we go onwards: implementing the functionality we need in compute-discriminating-function is a bit horrible, but this is only a proof-of-concept so we wrap it all up in a labels and stop worrying about 80-column conventions. Then we hit C-c C-c and belatedly remember that redefining methods involves removing them from their generic function and adding them again, and doing that to compute-discriminating-function is likely to have bad consequences. Sure enough:

There is no applicable method for the generic function 
  #<STANDARD-GENERIC-FUNCTION COMPUTE-DISCRIMINATING-FUNCTION (1)>
when called with arguments
  (#<STANDARD-GENERIC-FUNCTION NO-APPLICABLE-METHOD (1)>).

Yes, well. One (shorter) rebuild of just CLOS later, and then a few more edit/build/test cycles, and we can trace generic functions without changing the identity of the fdefinition. Hooray! Wait, what was I intending to do with my evening?

seeking real life uses for generalized specializers

Some time ago (call it half a decade or so), Jim Newton of Cadence and I did some work on extensible specializers: essentially coming up with a proof-of-concept protocol to allow users to define their own specializers with their own applicability and ordering semantics. That's a little bit vague; the concrete example we used in the writeup was a code walker which could warn about the use of unbound variables (and the non-use of bindings), and which implemented its handling of special forms with code of the form:

(defmethod walk ((expr (cons (eql 'quote))) env call-stack)
  nil)
(defmethod walk ((var symbol) env call-stack)
  (let ((binding (find-binding env var)))
    (if binding
        (setf (used binding) t)
        (format t "~&unbound: ~A: ~A~%" var call-stack))))
(defmethod walk ((form (cons (eql 'lambda))) env call-stack)
  (destructuring-bind (lambda lambda-list &rest body) form
    (let* ((bindings (derive-bindings-from-ll lambda-list))
           (env* (make-env bindings env)))
      (dolist (form body)
        (walk form env* (cons form call-stack)))
      (dolist (binding bindings)
        (unless (used (cdr binding))
          (format t "~&unused: ~A: ~A~%" (car binding) call-stack))))))

The idea here is that it's possible to implement support in the walker for extra special forms in a modular way; while this doesn't matter very much in Common Lisp (which, famously, is not dead, just smells funny), in other languages which have made other tradeoffs in the volatility/extensibility space. And when I say “very much” I mean it: even SBCL allows extra special forms to be loaded at runtime; the sb-cltl2 module includes an implementation of compiler-let, which requires its own special handling in the codewalker which is used in the implementation of CLOS.

So modularity and extensibility is required in a code walker, even in Common Lisp implementations; in Cadence Skill++ it might even be generally useful (I don't know). In SBCL, the extensibility is provided using an explicit definer form; sb-cltl2 does

(defun walk-compiler-let (form context env)
  #1=#<implementation elided>)
(sb-walker::define-walker-template compiler-let walk-compiler-let)

and that's not substantially different from

(defmethod sb-walker:walk ((form (cons (eql 'compiler-let))) context env)
  #1#)

So far, so unexpected, for Lisp language extensions at least: of course the obvious test for a language extension is how many lines of code it can save when implementing another language extension. Where this might become interesting (and this, dear lazyweb, is where you come in) is if this kind of extension is relevant in application domains. Ideally, then, I'm looking for real-life examples of patterns of selecting ‘methods’ (they don't have to be expressed as Lisp methods, just distinct functions) based on attributes of objects, not just the objects' classes. The walker above satisfies these criteria: the objects under consideration are all of type symbol or cons, but the dispatch partly happens based on the car of the cons – but are there examples with less of the meta nature about them?

(I do have at least one example, which I will keep to myself for a little while: I will return to this in a future post, but for now I am interested in whether there's a variety of such things, and whether the generalization of specializer metaobjects is capable of handling cases I haven't thought of yet. Bonus points if the application requires multiple dispatch and/or non-standard method combination.)

new year's resolution

So here we are: 31st December. Sitting here, with a film of dubious plot playing on the television, waiting for a sufficient approximation to the New Year to arrive, and thinking about the year just gone and the year that is yet to come, and making resolutions. And on looking back at 2013, one thing that I'm not happy about (while counting my many, many blessings) is the level of output: somewhat limited code, very limited publications – honestly, thanks to my PhD students Ray and Polina for any publications at all: they did the vast majority of the work on papers with my name listed as co-author. There are of course reasons for that, stemming both from personal and professional life, but it doesn't change my dissatisfaction with the end result: there's more that I can do, and more that I should be doing. And doing, as Yoda never said, leads to writing: if the act is sufficiently interesting, it should be natural to talk to people about it, to be enthusiastic about it, and to write about it.

I certainly feel that it's in my nature not to be enthusiastic. Friends, if I have any left, are likely to put my typical disposition somewhere near the cynical extreme – I like to think not without some provocation, but I can also acknowledge that an excess of cynicism can obscure those things that are in fact worth celebrating. I'm certainly not promising to be less cynical about those things which deserve it – many an academic will point at a number of things wrong with the current state of the profession, and I think we're not all harking back to a mislaid golden age when academics were free and academia was purely communitarian – but I think I need to act in positive ways as well as grind my teeth and bang my head against the wall when the negatives arise.

Baby steps first, though. The commitment: I will write more. I will write more about my ideas, my processes, my interactions and my achievements, and I'll do it publically where possible, as it's part of my self-image as an academic to educate by example. (And maybe at some point I will also make this website look pretty. If you're reading this through syndication, count yourself lucky.)

some sbcl wiki entries

One of the potential advantages of this new wiki/blog setup is that I should be able to refer easily to my notes in my blog. It's true that the wiki-like content will change, whereas a mostly-static blog entry will naturally refer to the content of the wiki as it is at the point of blogging; in theory I should be able to find the content at the time that the link was made through a sufficiently advanced use of the version control system backing the ikiwiki installation, and in practice the readers of the blog (if any) are likely to follow (or not) any links within a short time-window of the initial publication of any given entry. So that shouldn't prove too confusing.

In order to test this, and to provide some slightly-relevant content for anyone still reading this on planet lisp: I've transferred my non-actionable notes from my sbcl org-mode file to an sbcl wiki section. This new setup gets heaps of bonus points if someone out there implements the development projects listed there as a result of reading this post, but even if not, it's a useful decluttering...

new year new gpg key

I've been putting this off for long enough. My current PGP key was generated in a different age, with somewhat different threat models and substantially different computational power (let alone social and political power) available to those who might be interested in subverting the general ability of individuals to identify themselves and communicate in private. It's true that not much of what I do is likely to be of vast interest to security agents worldwide, but as SBCL release manager (on holiday for a month!) I do publish documents that purport to assure that the source code and binary that users can obtain are unmodified from my personal copies.

Therefore, I've created a new key, with 2013-era configuration settings: 2048-bit RSA encryption and signing, and SHA-1 hashes undesired (though still accepted, given the protocol requirement). I've created a transition document, signed with both keys, to help interested parties with the transition; while my older key will remain valid for a while (I have a stack of business cards with its fingerprint on to get through...) the new key should be preferred in all situations where that makes sense.

Observations:

  1. This is all quite fiddly and complicated. There's a reason (well, several reasons: all those business cards!) I have been putting this off for a while. I understand why at least some of the knobs and levers are there; I've taught Computer Security at undergraduate level – but I'm still not confident that I have got everything right, and that's worrying both personally and systemically.
  2. epa-sign-region appears to malfunction for me when given a prefix argument: what it's meant to do is give a UI for selecting keys to use for signing, and the option of which kind of signature to generate. What it actually seems to do is generate an undecryptable PGP Message block. [edit: this was caused by epa/epg version skew, from an old installation of the Debian easypg package. ]
  3. I stumbled over the --escape-from-lines GnuPG configuration option while reading the documentation. It's on by default.
  4. GnuPG is crowdfunding a new website and some infrastructure.
new year's resolution more preparations

This new blogging setup, with the new domain, new feeds, and ideally new workflow, suggest the analysis of what was problematic with the old one.

Back when I was a PhD student, doing everything I could to avoid work on my thesis, I stumbled upon a culture of Lisp and Free Software developers – which may only come across as half ridiculous now but in 2001 seemed doubly counter-cultural. And so I joined a blogging platform for Free Software types that also happened to double as a testbed for trust metric research. And at the time, this offered neat features not easily available elsewhere: the word “blog” itself was only about two years old, and pertelote maintained a blog by hand for years, so having somewhere which would host my writing, and which moreover had some of the Social Network about it (the advogato userbase was responsible for certification of individuals' contribution to Free Software, and several of my then collaborators were on advogato before me) was ideal.

The principal downside for me, then as now, is the use of web browsers as the interface for text entry; a <textarea> just isn't rich enough in functionality. The situation is better now than it was – (mostly) gone are the days when an incautious C-q would instantly close all browser windows, including the one in which your meticulously-crafted draft was waiting for final polish before being submitted as a diary entry – but it's still a long way from using my text editor, moderately customized to my way of working, with all the comfort that that brings.

Meanwhile, for work, I've successfully used ikiwiki to document the processes and data around some of my academic administrative responsibilities over the years: postgraduate tutor, employability coordinator, director of postgraduate studies (the reality is even less glamorous than these titles); it's been really nice to be able to update documents while not at my desk, or while commuting, and even if I have never grown to love mercurial (ikiwiki's at-one-time default DVCS backend) it is at least worth knowing.

So when contemplating how to set up systems less likely to impede my productivity, it's perhaps natural that I should return to a recent success, and set up an ikiwiki instance. This time, though, I'm (obviously) explicitly using ikiwiki's support for blogging as well as its natural wiki nature; the idea is that the weblog is for timely, pertinent comments, while the wiki is for incrementally-refined notes on all subjects – probably replacing my org-mode note-taking habit, which while lovely relies too much on having a single emacs instance available at all times for when inspiration strikes. I fully expect to keep the org-mode setup I have for Getting (Some) Things Done, but will likely migrate the non-actionable notes I have to this wiki as and when.

Speaking of new feeds, the advogato tag will be punned into denoting content that should be syndicated to my diary on advogato. It's perhaps inevitable that something will go wrong, and including html tags in the text of the first syndicated entry is an excellent way to ensure that that happens, so if there's an editable textarea, escaped less-than and greater-than signs, or a sentence that seems to be missing something, then the Unix-Haters among the readers can reminisce about seeing >From in their e-mails oh wait that still happens...

new year's resolution preparations

One of the benefits of a robust process of evaluation is to be able to confront things that are not going as well as desired, as well as to identify strengths that can be exploited further. Universities don't necessarily have a robust performance evaluation process – it seems largely to depend on whether your Head of Department is a believer, or else on the individual to insist – but this year I did have the opportunity to have a Personal Development Review, and something that hit home as I was reviewing my own achievements was how little I've written recently. This is not ideal, either from the point of view of my academic career (where publish-or-perish might not be strictly true but it's at least a good first approximation) nor from the angle of my own self-esteem as a creative and productive individual.

So, steps must be taken, and it so happens that this is the time of year for turning over new leaves, cleaning up acts, and otherwise resolving to change behaviour. It's obviously not quite as simple as saying that I will write more; while there are some obstacles to creativity that can be straightforwardly addressed, I think the main thing necessary is to find that set of things such that when a spare fifteen minutes presents itself, the most enjoyable and least stressful thing to do with them is to write (or draft, or otherwise be productive).

Some of the things to arrange for this to happen are negative: to remove the temptation, or at least make it harder, to do unproductive things. So, apt-get purge crawl, for example, might be the single most effective productivity enhancer from my current state; I might have successfully avoided the trap of Candy Crush (and Angry Birds), but roguelikes are terribly easy to get sucked into, and anecdotally have the same addictive properties on me at least as the latest mobile game has on everyone else. But some steps are positive; I have used this as an excuse to set up a new computing environment for myself: a VPS running nginx, serving (among other things) a blog and a wiki using ikiwiki, which should make it easier to draft and publish than previously.