The title was a joke. The rest of this is not.
Cathy Raymond and I evacuated from our home this morning. We’ve never had to do that before.
Storm Nika has totally messed over the five-county area around Philadelphia. I’ve seen more downed power lines today than in my entire life until yesterday. Many roads are blocked by fallen trees. Over 600,000 people are without power; PECO has declared an all-hands emergency but says even so service may not be fully restored until the weekend.
This is much, much worse than Hurricane Sandy was. Regional rail is shut down. Most businesses are closed. So many homes are becoming uninhabitable that the county is setting up emergency shelters in schools.
The Dark Enlightenment is a group of thinkers and blogs that has aroused a fair amount of controversy in the last several years. Most people who write about them from the outside piously dismiss them as a gang of crypto- and not-so-crypto- fascists, or a sort of grunting neanderthalism dressed up in intellectual clothes. The reality, as usual, is not so simple.
I’ve been meaning to write about them for a while, and the first question I’m going to raise is whether they meaningfully present a single subject at all.
Here is a curious fact.
My wife Cathy is using Duolingo to learn German; she wants to be able to read sources on Iron Age and Viking costume in the original.
Duolingo takes her through a lot of pronunciation drills.
I’ve learned something by listening to her – which is that somehow, somewhere, I have internalized a very precise understanding of German phonology and phonotactics. As in, I not only know right pronunciation from wrong, I give her detailed advice on how to match Duolingo’s model speaker that we can both tell is correct.
What makes this weird is that I don’t speak German. At all. Nor have I ever lived where it’s spoken; I’ve visited Germany once, German-speaking Switzerland once, and that’s it.
This raises questions in my mind:
1. How the fuck? I mean, I suppose it’s related to my knack for generating names in the style of any specified language, and I could handwave about Markov-chain models, but…how the fuck?
2. What dialect of German have I templated on? Could there be any way to tell?
3. What other entire language phonologies have I swallowed … without … me … actually … noticing …
4. Does this happen to other people?
The human brain is a very odd thing.
I fell down a rabbit hole today. By reading this: An Incomplete Guide to Feminist infighting. Bemused, I chased links and read manifestos and counter-manifestos for a couple of hours until the sources just began to repeat themselves. But in some respects my confusion was just beginning.
As I was falling through all these diatribes like Alice wondering how deep the rabbit hole goes, one of the thoughts uppermost in my mind was Poe’s Law: “Without a blatant display of humor, it is impossible to create a parody of extremism or fundamentalism that someone won’t mistake for the real thing.”
There was no humor down this rabbit hole. I found myself in the land beyond parody. On this evidence, I suspect it would be nigh-impossible to write a literate spoof of modern feminism that even many of its disputants wouldn’t blithely mistake for a real ideological position. And I found myself thinking of the Sokal Hoax.
This is a pre-announcement of the
second third Friends of Armed & Dangerous party.
FOAD 2014 will be held at Penguicon 2014, in Southfield, MI, almost certainly on the evening of Saturday May 3rd (but we don’t have a confirmed party-floor booking yet).
I believe John Bell is planning to run a Geeks with Guns the Friday before, so come equipped. Yes, personal weapons are considered an article of proper attire for the FOAD party – especially firearms or swords.
More details as they become available.
This is a brief heads-up that the reason I’ve been blog silent lately is that I’m concentrating hard on a sprint with what I consider a large payoff: getting the Emacs project fully converted to git. In retrospect, choosing Bazaar as DVCS was a mistake that has presented unnecessary friction costs to a lot of contributors. RMS gets this and we’re moving.
I’m also talking with RMS about the possibility that it’s time to shoot Texinfo through the head and go with a more modern, Web-friendly master format. Oh, and time to abolish info entirely in favor of HTML. He’s not entirely convinced yet of this, but he’s listening.
In a response to my previous post, on Acausality and the Scientific Mind, a commenter said: “The computationalist position necessarily entails that subjectivity does not really exist, and what looks like subjectivity is a mere illusion without causal force.”
There are, I’m sure, many vulgar and stupid versions of computationalism that have this as a dogma. But it is not at all difficult to construct a computationalist model in which there are features that map to “subjectivity” and have causal force. Here is a sketch:
There is enough right about David Gelernter’s essay The Closing of the Scientific Mind to make it important to recognize where he has gone wrong. His willingness to call out certain kinds of widely popular modern errors is admirable, but does not preserve him from having made some rather more traditional errors of his own.
Here’s a late New Year’s gift for all you repository-editing fiends out there: the long-awaited and perhaps long-dreaded reposurgeon 3.0.
In Heads up: the reposturgeon is mutating! I described the downside of a strategy of incremental small language changes aimed at preserving compatibility: you can wind up trapped by suboptimal early decisions. Sometimes, you have to bust out and do the big redesign, which I did and why there’s a bump in the major version number (the last time that happened was when reposurgeon got the ability to read Subversion dump files directly).
The biggest change is that the command language syntax has mutated from VSO to SVO. What? You’re not up on your comparative linguistic morphology and gave no idea what I’m talking about? That’s Verb-Subject-Object to Subject-Verb-Object.
My first gift of the new year. Read it here.
Not long ago I pulled the plug on one of the two CVS export utilities I was maintaining. One consequence of this is that I decided I needed to get the other one out of beta and into a state I would be willing to ship as 1.0.
And lo, it has come to pass. I just shipped cvs-fast-export 1.0. It has been well field-tested; a couple of weeks ago I used it to rescue the history of Gnu Troff.
There are several CVS exporters out there that suck pretty badly. (To be fair, the perversity of CVS is such that doing an even half-decent job of lifting CVS histories into a modern version-control system is quite difficult.) Now that this one is shipped I know of exactly two that don’t suck. The other one is Michael Haggerty’s cvs2git, which I’m working with him on improving.
Tradeoffs: cvs2git is slow and a bit clunky to use (I’m improving the latter but can’t fix the former). cvs-fast-export is blazingly fast (like, 3.7K commits a minute) but has a hard repository-size limit – above it you run out of core and the OS reaps the process in mid-flight. (Very few projects will hit this limit.)
For each tool there are weird CVS edge cases that it gets wrong. The sets of edge cases are different. cvs2git’s may be smaller, but I’m not sure of that; we haven’t set up head-to-head testing yet. Most projects will not trip over either set of problems.
cvs-fast-export is better documented, especially around error conditions.
Help stamp out CVS in our lifetime!
I really hadn’t been planning to comment on the Duck Dynasty brouhaha. But conservative gadfly Mark Steyn (a very funny, witty man even if you disagree with his politics) has described the actual strategy of GLAAD and its allies with a pithy phrase that I think describes wider circulation – “de-normalizing dissent”.
OK, let’s get the obvious out of the way first. Judged by his remarks in Esquire, Duck Dynasty patriarch Phil Robertson is an ignorant, bigoted cracker who reifies almost every bad redneck stereotype there is. His religion is barely distinguishable from a psychotic delusional system. Nothing I am about to say should be construed as a defense of the content of his beliefs.
On the other hand, Steyn has a point when he detects something creepy and totalitarian about the attempt to hound Robertson out of his job and out of public life. True, nothing GLAAD has done rises to the level of state coercion – there is no First Amendment issue here, no violence or threat of same in play.
But what GLAAD and its allies are trying to accomplish is not mere moral suasion either; they’re trying to make beliefs they disapprove of unspeakable in polite society by making the consequences of expressing them so unpleasant that people will self-censor. In Steyn’s well-chosen phrase, they’re trying to de-normalize dissent.
There are a lot of things people writing software do in the world of bits that don’t have easy analogs in the world of atoms. Sometimes it can be tremendously clarifying when one of those things gets a name, as for example when Martin Fowler invented the term “refactoring” to describe modifying a codebase with the intent to improve its structure or aesthetics without changing its behavior.
There’s a related thing we do a lot when trying to wrap our heads around large, complicated codebases. Often the most fruitful way to explore code to modify it. Because you don’t really know you have understood a piece of code until you can modify it successfully.
Sometimes – often – this can feel like launching an expedition into the untamed jungle of code, from some base camp on the periphery deeper and deeper into trackless wilderness. It is certainly possible to lose your bearings. And large, old codebases can be very jungly, overgrown and organic – full of half-planned and semi-random modifications, dotted with occasional clearings where the light gets in and things locally make sense.
There’s an ancient Unix maxim to the effect that a tool that gets 85% of your job done now is preferable to one that gets 100% done never. Sometimes chasing corner cases is more work than the problem really justifies.
In today’s dharma lesson, I shall illustrate this principle with a real-world and useful example.
I did something unusual today. I pulled the plug on one of my own projects.
In Solving the CVS-lifting problem and Announcing cvs-fast-export I described how I accidentally ended up maintaining two different CVS-to-something-else exporters.
I finally got enough round tuits to put together two-thirds of the head-to-head comparison I’ve been meaning to do – that is, compare the import-stream output of cvs-fast-export to that of cvsps to see how they rate against each other. I wrote both git-stream output stages, so this was really a comparison of the analysis engines.
I wasn’t surprised which program did a better job; I’ve read and modified both pieces of code, after all. Keith Packard’s analysis engine, in cvs-fast-export, is noticeably more elegant and craftsmanlike than the equivalent in cvsps. (Well, duh. Yeah, that Keith Packard, the co-architect of X.)
What did surprise me was the magnitude of the quality difference once I could actually compare them head-to-head. Bletch. Turns out it’s not a case of a good job versus mildly flaky, but of good job versus suckage.
The comparison, and what I discovered when I tried to patch cvsps to behave less badly, was so damning that I did something I don’t remember ever having felt the need to do before. I shot one of my own projects through the head.
A few days ago I released reposurgeon 2.43. Since then I’ve been finishing up yet another conversion of an ancient repository – groff, this time, from CVS to git at the maintainer’s request. In the process, some ugly features and irregularities in the reposurgeon command language annoyed me enough that I began fixing them.
This, then, is a reposurgeon 3.0 release warning. If you’ve been using 2.43 or earlier versions, be aware that there are already significant non-backwards-compatible changes to the language in the repository head version and may be more before I ship. Explanation follows, embedded in more general thoughts about the art of language design.
If you’re a regular at A&D or on my G+ feed, and even possibly if you aren’t, you’ll have noticed that I ship an awful lot of code. I do get questions about this; between GPSD, reposurgeon, giflib, doclifter, and bimpty-bump other projects it is reasonable that other hackers sometimes wonder how I do it.
Here’s part of my answer: be fanatical about automating away every part of your workflow that you can. Every second you don’t spend on mechanical routines is a second you get to use as creative time.
Soon, after an 11-year alpha period, I’m going to ship version 1.0 of one of my main automation tools. This thing would be my secret weapon if I had secrets. The story of how it came to be, and why it took 11 years to mature, should be interesting to other hackers on several different levels.
Though there haven’t been any huge dramatic improvements since Subversion analysis got good enough to use even on horribly gnarly repositories, reposurgeon continues to quietly get better and faster. I shipped 2.43 a few minutes ago.
Blogging has been light recently because I’ve been working very hard on a major GPSD release, which I just shipped. This is mostly new features, not bugfixes, and it’s probably the most new code we’ve shipped in one release since about 2009.
In 30 years of C programming, I thought I’d seen everything. Well, every bizarre trick you could pull with the C preprocessor, anyway. I was wrong. Contemplate this:
#include <stdint .h>
#define IS_BIG_ENDIAN (*(uint16_t *)"\0\xff" < 0x100)
That is magnificently awful. Or awfully magnificent, I'm not sure which. And it pulls off a combination of qualities I've never seen before: