2020-05-31

Chinese lives matter

This is not about what you might think it's about. Hong Kong, and indeed the PRC, do not feature.

Yik Oi Huang

Let me tell you about Yik Oi Huang. A grandmother, she was 88 years old on Tuesday 8th January 2019. Early that morning she left her house in Visitacion Avenue, San Francisco, and went for her morning walk - a staple activity of Chinese senior citizens which we could usefully imitate. It would be the last time she walked anywhere.

In the park someone attacked her, beat her brutally, and left her for dead before apparently entering her home and then fleeing the area. She was hospitalized with head injuries, a broken spine, hand and ribs. Allow me to repeat: she was 88 years old. Any level of violence towards someone that old would be shocking, but the injuries inflicted on this old lady went several steps beyond that term.

SFPD arrested a suspect 11 days later. He was 18 years old, and black. The suspected motive was robbery. At this point he is still awaiting trial, though I would imagine that he stands a very good chance of his charges being upgraded to murder.

Yik Oi Huang did not die immediately. She suffered in hospital for the next 360 days before finally - mercifully - passing away on 3rd January this year.

You remember the protests filling the streets of San Francisco, New York, Los Angeles and other places with large Chinese communities? You remember Chinese youths breaking shop windows and setting light to businesses across San Francisco? No, of course you don't - it never happened. This event barely registered outside San Francisco. Try searching "Yik Oi Huang site:cnn.com" on Google. Now try doing the same with "Michael Brown site:cnn.com", "George Floyd site:cnn.com" by contrast - hundreds of thousands of results.

Shuo Zeng

Shuo Zeng was 34 years old on New Years Eve 2019, but would not live to see 2020. With friends at the Starbucks in Montclair District, Oakland to celebrate the New Year and his birthday. He was a research scientist at Aspera, having graduated from Kansas State.

Oakland is notorious for laptop thefts, and today would see another one. Shuo Zeng had his laptop with him, not unusual behaviour for a techie. A teenager ran in to the Starbucks and grabbed the laptop, ducked out through the door being held by an accomplice, and jumped into a car driven by a third man.

Unwilling to lose his laptop, Shuo Zeng bravely - but unwisely - pursued them. He reached them as they got into the car. The car took off and Shuo Zeng was knocked against a parked car. He suffered head injuries and died in hospital.

The police found the suspects and charged them all with special circumstance murder and second-degree robbery. All three men were black, at least two of them from San Francisco.

CNN at least have one article about Shuo Zeng on their site. They do not, of course, mention the race of his assailants. One wonders if they would have done the same had he been black and his assailants white.

Wenjian Liu and the Can Man

There have been other, more famous incidents. Wenjian Liu was one of the two NYPD officers executed by Ismaaiyl Abdullah Brinsley on December 20 2014. An elderly Chinese man collecting cans in San Francisco was abused by two black men in a video that went viral in February this year. Chinese residents in areas with a significant black presence know who they need to be wary about, and it's not the police.

My point

Over 99% of the US population, myself included, felt that the death of George Floyd in Minneapolis on 25th May was appalling, and that the action taken against the officers involved was entirely justified. Police brutality is unfortunately not that rare in the USA. However, I'm baffled as to why anyone thinks there's an obvious racial component to this. Floyd was nicked for passing a counterfeit bill - the actions of the arrest seem heavy-handed, but not the arrest itself. Do they claim that the officers were particularly brutal because he was black? Where's the evidence?

It is instructive to compare the criminally negligent behaviour of Derek Chauvin holding Floyd's head down for far too long, with the criminally negligent behaviour of Shuo Zeng's laptop thieves in driving away with no regard for his safety. In neither case did there seem to be intent to kill, but both cases resulted in death. Chauvin had country-wide protests screaming for accountability - which they already had in part, since he had been fired from the force and charged with murder-3 in record time. Shuo Zeng had a quietly grieving family and local community, but that was it. No protests, no riots. Barely a headline.

The black community might claim - unjustifiably, in my view - that Black Lives don't matter enough to the USA in general. But it seems to me that there's a stronger case that Chinese Lives don't matter as much as Black Lives do.

2020-05-30

The Rule of Dogs - riot edition

I believe it was traveller and raconteur P J O'Rourke who commented (in the 80s) that revolutions were only generally successful when they attracted the beautiful people. When you look at a parade of protesters and see tall handsome men, gorgeous women, and cute chicks, you know that they've got a good chance of succeeding in their aims.

Watching the "protesters" in Brooklyn this afternoon, that rule still appears to hold. The "ladies" in the crowd agitating were a revolting mix of harridans, seriously overweight semi-male lesbians, terrifying poor transvestites, and even the younger elements had faces which would make even the horniest Alsatian hound think "nah, I'll have to wait until it's a lot darker". Their time has clearly not yet come.

March peacefully against excessive police violence to people of all colours and creeds? My Pre-Raphaelite face will be right there with you. Looting Foot Locker and throwing bottles at police? You're on your own, sunshine. Enjoy The Tombs.

2020-05-12

Testing for determinism

Apropos of nothing[1], here's a view on testing a complicated system for deterministic behaviour. The late, great John Conway proposed the rules for "Game of Life", an environment on an arbitrary-sized "chess board" where each square could be either alive or dead, and potentially change at every "tick" of a clock according to the following rules.

  1. Any live cell with two or three live neighbours survives.
  2. Any dead cell with three live neighbours becomes a live cell.
  3. All other live cells die in the next generation. Similarly, all other dead cells stay dead.
You'd think that this would be a very boring game, given such simple rules - but it in fact generates some very interesting behaviour. You find eternally iterating structures ("oscillators"), evolving structures that travel steadily across the board ("spaceships"), and even "glider guns" that fire a repeated sequence of spaceships.

Building a simulation of Conway's Game of Life is something of a rite of passage for programmers - doing it in a coding language new to the programmer generally shows that they have figured out the language enough to do interesting things. But how do they know that they have got it right? This is where "unit testing" comes into play.

Unit testing is a practice where you take one function F in your code, figure out what it should be doing, and write a test function that repeatedly calls F with specific inputs, and checks in each case that the output is what's expected. Simple, no? If F computes multiplication, you check that F(4,5)=20, F(0,10)=0, F(45,1)=45 etc.

Here's a unit test script. It's written in Go, for nerds, [2] but should be understandable based on function names to most people with some exposure to programming. First, you need to check the function that you've written to see whether two Life boards are equivalent, so you create empty 4x4, 4x5, 5x4 boards and see if your comparison function thinks they're the same.
(In Go, read "!" as "not", and "//" marks a comment which the computer will ignore but programmers can, and should, read)

  b1 := life.NewBoard(4,4)
  b2 := life.NewBoard(4,4)
  // These should be equivalent
  if ! life.AreEqual(b1,b2) {
     t.Error("blank 4x4 boards aren't the same")
  }
  b3 := life.NewBoard(5,4)
  b4 := life.NewBoard(4,5)
  if life.AreEqual(b1,b3) {
    t.Error("different size boards are the same")
  }
That's easy, but you also need to check that adding a live cell to a board makes it materially different:
  // Add in a block to b1 and compare with b2
  life.AddBlock(0,0,b1)
  if life.AreEqual(b1,b2) {
    t.Error("one board has a block, blank board is equivalent")
  }
  // Add the same block to b2 in same place, they should be equal
  life.AddBlock(0,0,b2)
  if ! life.AreEqual(b1,b2) {
    t.Error("2 boards, same block, unequal")
  }
This is helpful, but we still don't know whether that "block" (live cell) was added in the right place. What if a new block is always added at (2,3) rather than the coordinates specified? Our test above would still pass. How do we check for this failure case?

One of the spaceships in Life, termed a glider, exists in a 3x3 grid and moves (in this case) one row down and one column across every 4 generations. Because we understand this fundamental but fairly complex behaviour, we can build a more complicated test. Set up a 5x5 board, create a glider, and see if

  1. the board is different from its start state at time T+1;
  2. the board does not return to its start state at time T+2 through T+19; and
  3. the board does return to its start start at time T+20.
Code to do this:
  b5 := life.NewBoard(5,5)
  life.AddGlider(0, 0, b5, life.DownRight)
  b6 := life.CopyBoard(b5)
  if ! life.AreEqual(b5,b6) {
    t.Error("Copied boards aren't the same")
  }
  // A glider takes 4 cycles to move 1 block down and 1 block across.
  // On a 5x5 board, it will take 5 x 4 cycles to completely cycle
  for i := 0 ; i< 19 ; i++ {
    life.Cycle(b5)
    if life.AreEqual(b5,b6) {
      t.Error(fmt.Sprintf("Glider cycle %d has looped, should not", i))
  }
  life.Cycle(b5)
  if ! life.AreEqual(b5,b6) {
    t.Error("Glider on 5x5 board did not cycle with period 20")
  }
Now, even if you assume AreEqual(), NewBoard(), CopyBoard() work fine, you could certainly construct functions AddGlider(), Cycle() which pass this test. However you'd have to try pretty hard to get them right enough to pass, but still wrong. This is the essence of unit testing - you make it progressively harder, though not impossible, for a function to do the wrong thing. One plausible failure scenario is to make the adjacent-cells locator in Cycle() incorrect such that the glider goes up-and-across rather than down-and-across. To fix that, you could add some code to turn-on a critical cell at (say) time 8, such that that cell would be live in the expected motion, so no effect, but empty in the other motion.

Clearly, for unit testing to work, you want a unit tester who is at least as ingenious (and motivated) as the coder. In most cases, the coder is the unit tester, so "soft" unit tests are unfortunately common - still, at least they're a basis to argue that the code meets some kind of spec. And if the client isn't happy with the tests, they're free to add their own.

Why am I so mad at Neil Ferguson? He's free to make whatever epidemiological assumptions that he wants, but he usurped the "authority" of computer modelling to assert that his model should be trusted, without actually undertaking the necessary and fundamental computer science practices - not least, unit testing.

[1] Lies: Neil Ferguson, take note
[2] Object-oriented model avoided for clarity to readers

2020-05-10

Harmeet Dhillon picked a winner

I enjoyed reading a Gizmodo article today. (This is not a common occurrence). The article itself was a mostly-triumphant comment on James "neurotic women" Damore closing his lawsuit against The Google:

Damore proceeded to sue Google for discrimination in January 2018. Per Bloomberg, three other men who worked for or applied for jobs at Alphabet, Google’s parent company, also signed on to Damore's lawsuit. In the lawsuit, Damore's lawyers argued that he and others "were ostracized, belittled, and punished for their heterodox political views, and for the added sin of their birth circumstances of being Caucasians and/or males."
I read the internal blog posts in the initial complaint, and to be honest it looked pretty problematic for Google. So why close the lawsuit now?

Aha! a clue in a the Bloomberg article on the suit conclusion:

A lawyer for the men, Harmeet Dhillon, said they're prohibited as part of their agreement with Google from saying anything beyond what's in Thursday’s court filing. Google declined to comment.
It's pretty clear, isn't it? Google settled. They looked at what would plausibly come out of discovery, and - even if they were pretty confident in a Silicon Valley jury taking the socially woke side of the case - didn't like how a court case would play out in public. This is a guess on my part, to be clear, but a fairly confident guess. How much would a company pay for positive nationwide publicity? You can treble that for them to avoid negative nationwide publicity.

Damore probably got fairly close to a sensible loss-of-earnings amount. Harmeet Dhillon, his lawyer probably got 30%-40% of that; maybe on the lower end because the publicity was worth beaucoup $$ to her.

When your ess-jay-double-yuh's
Cost you many dollars,
That's Damore!

When their memes and blog post
Enrich lawyers the most
That's Damore!

Called it - EU Big Data has no Value

Back in 2014 I said re the EU Big Data project:

The EU is about to hand a couple billion euros to favoured European companies and university research departments, and it's going to get nine tenths of squat all out of it. Mark my words, and check back in 2020 to see what this project has produced to benefit anyone other than its participants.
Well, this is 2020 - what happened?

Here's the bigdatavalue.eu blog - the most recent article?

THE SECOND GOLDEN AGE OF DUTCH SCIENCE, 1850-1914
Posted on February 18, 2019 by admin
Previous post:
PAKISTAN AND AFGHANISTAN: OPPORTUNITIES AND CHALLENGES IN THE WAKE OF THE CURRENT CRISIS
Posted on September 4, 2018 by admin
I guess nothing actually happened then. But hey, it's only €500M....

Per the original article:

The project, which will start work on 1 January 2015, will examine climate information, satellite imagery, digital pictures and videos, transaction records and GPS signals. It will also look at data privacy issues, access rights to data and databases, intellectual property rights and legal aspects of new technical developments such as who holds the rights to automatically generated data.
"Look at", but apparently didn't actually "do" anything...

It's a human tragedy that the UK won't be involved post-Brexit in such innovative projects such as this.