Twitter and Tear Gas: The Power and Fragility of Networked Protest review

Twitter and Tear Gas: The Power and Fragility of Networked Protest

Twitter and Tear Gas: The Power and Fragility of Networked Protest by Zeynep Tufekci

My rating: 4 of 5 stars

Pretty interesting look at how protests/social movements work, and how social media has changed them. I’ve long enjoyed Tufekci’s articles and it was neat to read about events that I just knew a little about, especially because she has a lot of firsthand experiences.

One point near the end of the book is that when faced with a popular uprising, governments used to try to block the communications of the movement to stop them from being able to coordinate and gain support. With the ubiquity of the Internet, that’s much harder to do (and more disruptive to the population as a whole), so instead a strategy has been to flood social media, etc, with fake images and dispute the authenticity of real ones. The goal is to make it seem like figuring out the truth is impossible and breed cynicism and hopelessness. This is a really hard strategy to counter, and feels pretty pertinent to the Russian interference in the 2016 US Presidential election.

It took me a while to get through the book, but I’ve been pretty distracted by following Democratic primary and impeachment and whatnot. When I read Twitter a lot I can feel my attention span drain away. Luckily if I force myself to read longer content I can build it back up…

Odds and ends:
– The Tea Party is a good example of a social movement in the US. One of their first protests was done on April 15, 2009 in cities across the US, and a clever study looked at the weather in different US cities to compare those where it was sunny versus where the protest was rained out. In the cities where a protest was held, the next election had higher Republican turnout and representatives tended to support more Tea Party-friendly policies.
– There’s an interesting section in the logistics of the 1963 March on Washington, which was really challenging because there were so many people (hundreds of thousands!). The organizers invested in a state-of-the-art sound system to be able to communicate with the large crowd and keep things orderly, but the night before the sound system was sabotaged. One of the organizers asked the Justice Department for help, and they got technicians from the Army Signal Corps to dismantle and rebuild the sound system overnight, and it worked perfectly the day of!
– Tufekci gives the example of the Occupy movement as a movement that kind of fizzled. One example she gives is the gathering in Atlanta in 2011, where Representative John Lewis (a hero from the civil rights era) wanted to address the crowd, but because two people out of the hundreds there didn’t want him to (for seemingly nonsensical reasons), he wasn’t allowed to. This is a problem with a “consensus-driven” model of making decisions – it’s very easy for a small group of people to stop anything from happening.
– In the Gezi Park protests in Turkey in 2013, one group that joined was young male soccer fans. (It was helpful that many already owned gas masks to protect against tear gas outside soccer stadiums!) They were used to chanting sexist/homophobic things and adapted those chants to target politicians. There was also a LGBTQ group that was well-respected in the park, and they convinced the soccer fans (many of whom hadn’t encountered the LGBTQ community before) to stop using those words. The soccer fans were also impressed by their bravery in defending the park. Protests can build bridges!
– There’s an interesting look at a few very popular sites on Reddit that were basically used for child pornography. The sites wete allowed to exist and a community thrived around them. Reddit’s argument for allowing them to continue was something along the lines of “well, they’d be sharing these pictures in private anyway, what’s the difference?”. But Tufecki points out that allowing a community to exist around this is far different, and the norms of the community led people to think all of this was OK. (Reddit did eventually shut the sites down)
– Some researchers at Harvard did a clever study where they were able to figure out which social media posts were censored in China from a large set of posts. Somewhat surprisingly, most criticism of the state and Chinese leaders was allowed. What was not allowed was anything that encouraged people to protest or take action, especially if the posts were concentrated in a geographic area. Even if people were talking about organizing in support of the government, their posts were still censored! Apparently the government values passivity in the population above all else.
– Tufekci dramatically describes being in an airport in Turkey in July 2016 as she saw major bridges in Istanbul being blocked by tanks with no information forthcoming and gradually realized the country was in the middle of a coup. The turning point was when President Erdogan appeared via FaceTime live on CNN Turkey and asked people to take to the streets to resist the coup. In a later survey, 83% of the country watched the appearance, and a majority of people did take to the streets to resist the coup. While the Parliament building was being bombed(!), the Turkish Parliament met and livestreamed on their phones asking people to resist.

View all my reviews

linked list friday: diaper changing stations, tipping, california prop 65

What I like (and don’t like) about the Rust language

I recently started playing around with Rust a bit, and it’s a pretty neat language! I’m not super into programming language design or obscure languages, although I did try to get into Haskell a while back. What turned me off is that it was hard to do normal-seeming things like reading a file. Also I think I really understood monads for three days, then lost it again…

Anyway, Rust! It’s a high-performance memory-safe language, which are two descriptions you don’t usually hear together. According to the latest TIOBE rankings, it’s #25, which is dangerously close to a somewhat popular language. Mozilla developed the language and now uses it for parts of Firefox, and according to the Stack Overflow developer survey it’s been the “most loved” language three years in a row.

I just ported probabilityToFriendlyString to Rust. So what makes it so great?

  • The borrow checker – Most languages fall into two categories when it comes to memory management. The first I’ll call “C style”, which means you the programmer are responsible for allocating and freeing memory. This is incredibly easy to get wrong in such a way that you either crash or, worse, create a security vulnerability. But you can write very high-performing code. The second I’ll call “Java style”, which means the language has a garbage collector that automatically cleans up memory when it’s done being used. These languages generally don’t allow raw access to memory, which is safer, but the garbage collector means your app has to pause at random times.

    A hybrid option is Automatic Reference Counting, used in Objective-C and Swift, which means the compiler inserts reference counting calls so at runtime when an object’s refcount goes to 0 it gets freed. This is pretty good performance (although not as good as C style) and it’s harder to get wrong, although you can still have cycles where memory doesn’t get freed if you’re not careful.

    Rust’s solution to this is to let the compiler determine the lifetime of most things and insert a call to free memory when it knows you’re done using it. This is the best of both worlds – you the programmer don’t have to do anything, and memory just gets freed when you can’t use it anymore in the most high-performance way possible!

    Obviously there’s a catch, which is that you have to be very explicit to the compiler about how you’re using variables when you pass them to methods – it’s kinda like const-correctness in C++ but on steroids. But it’s worth it for the memory safety and high performance! (see more in the “stuff I don’t like” below)
  • The language seems to have a “batteries included” mindset, much like Python. In Rust’s case this is less about the standard library and more about the fact that it comes with a packaging system (crates), a builtin way to write tests, and a way to generate documentation. (here’s the documentation for the probabilityToFriendlyString crate!) I understand the idea that allowing users to choose a package manager can lead to more innovation and whatnot, but especially as someone new to the language it’s frustrating to have to learn about different package managers just to use multiple packages. JavaScript is just the worst about this…
  • Instead of interfaces, Rust has “traits”, which I think are just interfaces that can have default implementations? One very cool thing about these (that also appears in Haskell) is that you can have traits like Eq that the compiler can derive automatically and give you a reasonable equality operator. C# does this for structs, but for some reason the automatically derived operator uses reflection and is crazy slow.
  • I really like the whole combination of enums (which are called “algebraic data types” in other languages – these aren’t like enums in C#, etc!) and pattern matching to make it easy to return errors from methods.
  • The compiler has incredibly helpful errors. Check out some examples here – they say what’s wrong in clear language and how to fix it.
  • I guess Rust can compile to WebAssembly or something? I haven’t tried this but it sounds neat!
  • There are macros, which I haven’t read about. But macros are good!

After having used Rust for a few days, here are some of the things I don’t like:

  • There’s no method overloading – apparently this has something to do with type inference or something? I wanted to make a method with an optional String parameter, which is technically possible but looks like this which is pretty ugly.
  • There’s no inheritance of concrete classes. (which are called “structs”) Honestly, this is mostly OK since traits are the way to do multiple inheritance and you can have implementation of methods inside a trait. Still takes some getting used to though.
  • With the borrow checker, you have to think carefully about ownership. I’ll admit the compiler messages are so helpful that I bumbled my way around a bit to a working solution without really understanding what I was doing. This is probably not a good idea 🙂
  • Minor quibble, but the call to verify values in a test is assert_eq?, and the parameter names are has “left” and “right” instead of “expected” and “actual” which are much clearer.

If you’ve made it this far, you must be at least a little interested in Rust. I’d recommend reading through at least part of the Rust book. (another example of “batteries included”!) And if you’re familiar with LabVIEW, Rebar is an addon that implements some Rust-like ideas. (thanks Ben Leedom!)

Some final thoughts on the Astros season

  • Losing in Game 7 of the World Series does not mean the Astros’ 2019 season was a failure.  Yes, expectations were high, especially after they won 107 games in the regular season (best in MLB), but there’s a lot of randomness in the playoffs and that’s just the way it is.  Honestly this was less painful than how the Yankees lost – in Game 6 they were down 4-2 going into the 9th inning, and DJ LeMahieu hit a 2 run home run to tie it, then Altuve hit a walkoff home run in the bottom of the 9th to send the Astros to the World Series.  It did hurt that the Astros were down to ~20% chance to win the series after going down 2-0, then up to ~80% after going up 3-2, then they lost…
  • Poor Will Harris.  He was very good in the regular season and postseason, and then he gave up a late home run in Game 6 to put things out of reach, and a late home run in Game 7 to let the Nationals go ahead.  He was also responsible for the collapse in 2015 in Game 4 against the Royals – the Astros were up 6-2 in the 8th inning and the Royals won 9-6 😦
  • I think AJ Hinch made mostly good decisions in the game.  Taking Greinke out in the 7th after giving up a home run and a walk was questionable given how well he had been pitching, but he hadn’t gone that long in a start in a while.  I can understand the thinking that “I have a good bullpen, I just need 8 more outs”. On the home run Will Harris made a good pitch and Howie Kendrick just baaaaaarely hit it off the foul pole.  And I can understand not bringing in Gerrit Cole then – yeah, he’s the Astros’ best pitcher, but he’s never pitched on short rest before, so it seems dicey to bring him in the middle of an inning on 2 days rest.
  • However, AJ Hinch said after the game that Cole would only come in if the Astros were ahead, which is just dumb.  This is the last game of the season!  If he’s our best option, use him even if we’re down a run or two!  Anyway, none of this probably mattered because our closer gave up another run that probably put it out of reach anyway at 4-2.
  • Much is being made of the fact that the road team won all 7 games.  Prior to this, no 7-game series in baseball, basketball, or hockey had ever had the road team even win the first 6 games.  But it’s not that unlikely if the teams are evenly matched (around a 1/64 chance), and the home field advantage in baseball is not that big compared with other sports.  It is weird that none of the games were particularly close – the Nats won the first game 5-4, but after that the margins of victory were 9, 3, 7, 6, 5, 4.
  • I know Gerrit Cole is a free agent now, and probably mad that AJ Hinch didn’t put him in, and mad that the Astros didn’t win, but to put on his agent Scott Boras’s cap (instead of an Astros cap) is both bizarre and disrespectful.  Just wait a day!  You know you’re going to get a huge contract!
  • I don’t have the numbers in front of me, but in their losses the Astros were dreadful with runners in scoring position.  That really just goes to randomness, though – I doubt they were trying less hard or anything!
  • This hurts, but honestly I’m happy for the Nats, and I was rooting for them until they played Houston.  They were behind in all 5 of their elimination games and came back to win them, which is really impressive.
  • Watching Astros postseason games is really stressful.  I think the optimal experience for watching postseason games is having a team to root for but ultimately not caring too much…
  • We’ll get ’em next year!

linked list tuesday: AI is not going to take all our jobs, Nests are creepy

The Astros are going to the World Series! What a crazy game!

The Astros beat the Yankees last night to win the ALCS 4 games to 2 and go to the World Series. And it was a pretty crazy game!

The Astros’ strength all season long has been their hitting and their starting pitching. Their defense is pretty good, and their relief pitching has been anywhere from OK to pretty good. The Yankees have also been great at hitting, but their bullpen is also great. (their defense is also pretty good and their starting pitching has been good but not great)

Knowing this, the fact that Game 6 was a “bullpen game” for both teams meant that the Yankees had an advantage on paper. See, the Astros have 2 amazing starting pitches (Verlander and Cole) and 1 very good one (Greinke). But in the postseason you need four starting pitchers, and the late season collapse of Wade Miley (very good until September; terrible thereafter) meant that the Astros didn’t have a great option, so they decided to use a bunch of relief pitchers in the game. Usually you hope for a starting pitcher to go 6 or 7 innings; tonight the Astros’ first pitcher went 1 2/3 innings. The Yankees have similar issues, but as I mentioned their relief pitching is better.

The Astros took a 3-0 lead in the first inning off a Yuli Gurriel home run (while I was putting a kid to bed so I couldn’t watch :-/ ), then the Yankees chipped away at the lead until going into the bottom of the 8th inning the Astros were up 4-2. At this point the best two pitchers the Yankees had left were Zack Britton, who is very good, and Aroldis Champan, who is their usual closer and very very good.

To me, it seemed obvious that Chapman should be pitching the bottom of the 8th. The Yankees needed to keep the game as close as possible because they only had one more inning to get back in it, so there doesn’t seem to be any point to “saving” Chapman for if the Yankees happened to tie or take the lead in the 9th. Also Chapman hasn’t pitched a lot this postseason and can go 2 innings. But they put Britton in, and he ended up in a bases-loaded situation with two outs before getting a pinch hitter out to escape the inning.

In the top of the 9th the Astros brought in their closer Roberto Osuna, who has been very good all season long. I swear I thought to myself that it would be ironic if Osuna had a problem here after the Astros doing well with using a bunch of less-good relievers in weird situations the rest of the game. And lo and behold, after a walk and a strikeout DJ LeMahieu hit a home run to tie the game. I was watching the game on my phone in bed, and the Hulu app lagged a bit and then reconnected just in time for the ball to go over the wall, and for a minute I wondered “did that really just happen?”. George Springer was in right field and came really really close to catching the ball, but no dice. (looking at the replay I don’t think he actually could have caught it, it was just inches past where he was reaching…)

Osuna managed to not meltdown and got out of the rest of the inning, so the Astros went to the bottom of the 9th tied with their 8-9-1 hitters coming up. (so their two worst hitters were up first and second) Because of the seemingly questionable decision earlier, now Aroldis Chapman could come in for the Yankees. Also, the Astros were down to only a few relief pitchers so the prospect of going to extra innings seemed grim. After two quick outs, Springer got a walk, and Jose Altuve came to the plate. Jake Marisnick was up after him, and he was put in as a defensive replacement because he’s not a good hitter. But Altuve hit a home run to left field, Astros win 6-4!