An odd and persistent year old phish spammer

We have a number of more or less internal mailing lists for thingslike mailing all of the technical staff. They have at least somewhatunusual names and don't appear in things like email directories ormost users' address books. Back almost a year ago (21st April 2016),one of them got a phish spam:

From codewizard@approject.com [...]
Received: from [177.47.160.250] (


ARM servers had better just work if vendors want to sell very many

A few years ago I wrote about the cost challenge facing hypotheticalfuture ARM servers here ; to attract our interest,they'd have to be cheaper or better than x86 servers in some waythat we cared about. At the time I made what turns out to be a bigassumption: I assumed that ARM servers would be like x86 serversin that they would all just work with Linux. Courtesy of PeteZaitcev's Standards for ARM computers and Linaro and the follow-on Standards for ARM


Setting the root login's 'full name' to identify the machine that sent email

Yesterday I wrote about making sure you can identify what machinesent you a status email , and thecomments Sotiris Tsimbonis shared abrilliant yet simple solution to this problem:

We change the gecos info for this purpose.

chfn -f "$HOSTNAME root" root

Take it from me; this is beautiful genius (so much so that both weand another group here immediately adopted it). It's so simple yetstill extremely effective, because almost everything that sendsemail does so using programs like mail that will fill


Making sure you can identify what machine sent you a status email

I wrote before about making sure that system email works , so that machines can do important thingslike tell you that their RAID array has lost redundancy and youshould do something about that. In a comment on that entry, -dsr- brought up an important point,which is you want to be able to easily tell which machine sentyou email .

In an ideal world, everything on every machine that sends out emailreports would put the machine's hostname in, say, the Subject: header. This would


Modern Linux kernel memory allocation rules for higher-order page requests

Back in 2012 I wrote an entry on why our Ubuntu 10.04 server hada page allocation failure , despite apparentlyhaving a bunch of memory free. The answer boiled down to the theNFS code wanting to allocate a higher-order request of 64 Kb of (physically contiguous)memory and the kernel having some rather complicated and confusingrules for when this was permitted when memory was reasonablyfragmented and low(-ish).

That was four and a half years ago, back in


My theory on why Go's gofmt has wound up being accepted

In Three Months of Go (from a Haskeller's perspective) ( via ),Michael Walker makes the following observation in passing:

I do find it a little strange that gofmt has been completely accepted,whereas Python’s significant whitespace (which is there forexactly the same reason: enforcing readable code) has been much morecontentious across the programming community.

As it happens, I have a theory about this: I think it's importantthat gofmt only has social force . By this I mean that you


Using Firefox's userContent.css for website-specific fixes

In a comment on my entry on using pup to fix a Twitter issue , Chris Povirk suggested using Firefox'suserContent.css feature to fix Twitter by forcing the relevant bit of Twitter's HTML toactually display. This is actually a pretty good idea, except forone problem; if you write normal CSS there, it will apply to all sites. Anywhere there is some bit of HTML that matches your CSSselector, Firefox will apply your userContent.css CSS fixup. In thecase of this Twitter issue


Part of why Python 3.5's await and async have some odd usage restrictions

Python 3.5 added a new system for coroutines and asynchronousprogramming, based around new async and await keywords (whichhave the technical details written up at length in PEP 492 ). Roughly speaking, interms of coroutines implemented with yield from , await replaces ' yield from ' (and ismore powerful). So what's async for? Well, it marks a functionthat can use await . If you use await outside an async function,you'll get a syntax error. Functions marked


Overcommitting virtual memory is perfectly sensible

Every so often people get quite grumpy about the fact that somesystems allow you to allocate more virtual memory than the systemcan possibly provide if you actually try to use it all. Some ofthese people go so far as to say that this overcommitting is onlybeing allowed because of all of those sloppy, lazy programmers whocan't be bothered to properly manage memory, and so ask for (far)more memory than they'll actually use.

I'm afraid that these people are living in a dream


How we can use yield from to implement coroutines

Give my new understanding of generator functions and yield from , we can now see how to use yieldfrom to implement coroutines and an event loop. Consider a threelevel stack of functions, where on the top layer you have an eventloop, in the middle you have the processing code you write, and onthe bottom are event functions like wait_read() or sleep() .

Let's start with an example processing function or two:

def countdown(n):   while n:      print("