• 1 Post
  • 38 Comments
Joined 1 year ago
cake
Cake day: August 2nd, 2023

help-circle
  • This is interesting, but the post is very inaccurate. The first picture is Portrait of a Moor by Jan Mostaert, and there’s no indication that it’s a portrait of Reasonable Blackman:

    https://en.wikipedia.org/wiki/Portrait_of_an_African_Man

    The second picture was drawn by a modern person, and isn’t even supposed to be Blackman, that’s what the artist thinks Edward Swarthye might’ve looked like:

    https://www.historyextra.com/membership/black-faces-of-tudor-england/

    All that aside, here’s what the book Black Tudors has to say about him:

    A surname alone cannot confirm a person’s ethnicity. Although Reasonable’s surname would seem to indicate the colour of his skin, it is in fact an old English surname, derived from the Old English Blaec mann, as are ‘Black’, ‘Blackmore’, ‘Moor/More’ and ‘Morris’. It could also be spelt Blakeman, Blakman, Blackmon or Blackmun. A John Blakman was living in England in 1206 and the name was fairly common until the thirteenth century. By the Tudor period, the name was found in Eynsham, Oxfordshire, Fowey, Cornwall, and Berkhampstead, Hertfordshire. Henry VI had a chaplain named John Blacman, a fellow of Merton College, Oxford. A different John Blackeman was buried at Grey Friars Church, London, in July 1511. A third man of the same name was a benefactor of St John’s Hospital, Coventry. None of these men was African.

    ‘Blackman’ may have originated in reference to a dark complexion, but by the sixteenth century it cannot be assumed to signify African ethnicity. As William Camden noted in 1586, ‘surnames began to be taken up … in England about the time of the Conquest, or else a very little before’. Theoretically, a man called More in 1566 could have had a Moorish ancestor from five hundred years before, but it is a rather remote possibility. We cannot even assume that ‘Blackman’, or names like ‘Moor’ or ‘Niger’, were originally assigned to men of African origin. Wilfred Niger was nicknamed Niger or ‘the Black’ in around 1080, after he painted his face with charcoal to go unrecognised amongst his enemies at night. The names could also refer to dark hair (Black), or to someone who came from a place called Moore (in Cheshire), More (in Shropshire), Blackmore (Essex), Blackmoor (Hampshire, Somerset) or Blakemere (Herefordshire), or even to someone who lived on or near a moor. In Scotland, the surnames ‘Muir, Mure, Moor, Moore, More’ referred to ancient ‘residence beside a moor or heath’.

    It is only because Reasonable Blackman was also described as ‘blackmor’ and ‘a blackmore’ that we know he was African. ‘Blackamoor’ or its variants was the most popular term Englishmen used to describe Africans, appearing in some 40% of references to individuals in the archives, and in literature from at least 1525.












  • There’s at least one example you can look at, the Jenkins CI project had code like that (if (name.startsWith("windows 9")) {):

    https://issues.jenkins.io/secure/attachment/18777/PlatformDetail

    Microsoft, for all their faults, do (or at least did) take backwards compatibility very seriously, and the option of “just make devs fix it” would never fly. Here’s a story about how they added special code to Windows 95 to make SimCity’s broken code work on it:

    Windows 95? No problem. Nice new 32 bit API, but it still ran old 16 bit software perfectly. Microsoft obsessed about this, spending a big chunk of change testing every old program they could find with Windows 95. Jon Ross, who wrote the original version of SimCity for Windows 3.x, told me that he accidentally left a bug in SimCity where he read memory that he had just freed. Yep. It worked fine on Windows 3.x, because the memory never went anywhere. Here’s the amazing part: On beta versions of Windows 95, SimCity wasn’t working in testing. Microsoft tracked down the bug and added specific code to Windows 95 that looks for SimCity. If it finds SimCity running, it runs the memory allocator in a special mode that doesn’t free memory right away. That’s the kind of obsession with backward compatibility that made people willing to upgrade to Windows 95.




  • If you’re writing code that generic, why wouldn’t you want str to be passed in? For example, Counter('hello') is perfectly valid and useful. OTOH, average_length('hello') would always be 1 and not be useful. OTOOH, maybe there’s a valid reason for someone to do that. If I’ve got a list of items of various types and want to find the highest average length, I’d want to do max(map(average_length, items)) and not have that blow up just because there’s a string in there that I know will have an average length of 1.

    So this all depends on the specifics of the function you’re writing at the time. If you’re really sure that someone shouldn’t be passing in a str, I’d probably raise a ValueError or a warning, but only if you’re really sure. For the most part, I’d just use appropriate type hints and embrace the phrase “we’re all consenting adults here”.


  • The collect’s in the middle aren’t necessary, neither is splitting by ": ". Here’s a simpler version

    fn main() {
        let text = "seeds: 79 14 55 13\nwhatever";
        let seeds: Vec<_> = text
            .lines()
            .next()
            .unwrap()
            .split_whitespace()
            .skip(1)
            .map(|x| x.parse::<u32>().unwrap())
            .collect();
        println!("seeds: {:?}", seeds);
    }
    

    It is simpler to bang out a [int(num) for num in text.splitlines()[0].split(' ')[1:]] in Python, but that just shows the happy path with no error handling, and does a bunch of allocations that the Rust version doesn’t. You can also get slightly fancier in the Rust version by collecting into a Result for more succinct error handling if you’d like.

    EDIT: Here’s also a version using anyhow for error handling, and the aforementioned Result collecting:

    use anyhow::{anyhow, Result};
    
    fn main() -> Result<()> {
        let text = "seeds: 79 14 55 13\nwhatever";
        let seeds: Vec<u32> = text
            .lines()
            .next()
            .ok_or(anyhow!("No first line!"))?
            .split_whitespace()
            .skip(1)
            .map(str::parse)
            .collect::<Result<_, _>>()?;
        println!("seeds: {:?}", seeds);
        Ok(())
    }