Categories
Current Events Humor

Fake ad, but true statement

Tap the photo to see it at full size.

This is why I’ve been posting most things — even if it’s just a single photo or link — on my blogs rather than social media. As far as I’m concerned, the primary purpose of Facebook, Twitter, and LinkedIn are to direct readers to my blogs.

Categories
Security The Street Finds Its Own Uses For Things

Weaponizing social media with strobing images, Neuromancer, and what we can do

In another occurrence of terrible people weaponizing the internet, a number of assholes posted strobing images to Twitter with the intent of inducing seizures in people with the photosensitive variety of epilepsy. In order to ensure that their intended victims viewed the images, they @-mentioned the Epilepsy Foundation’s Twitter username and included epilepsy-related hashtags in their tweets. Worse still, they did this in November — National Epilepsy Awareness Month — when a larger than usual number of people would be following the Epilepsy Foundation’s Twitter account.

The Epilepsy foundation has since filed criminal complaints against the owners of 30 Twitter accounts with law enforcement, with the intention of ensuring that the perpetrators “are held fully accountable”.

This isn’t the first time that someone has tried this sort of attack against a person with epilepsy. In December of 2016, John Rayne Rivello, who didn’t agree with journalist Kurt Eichenwald’s negative takes on Donald Trump, tweeted a seizure-inducing animated GIF to Eichenwald from an account named @jew-goldstein. The GIF included the text “YOU DESERVE A SEIZURE FOR YOUR POSTS”.

Eichenwald viewed the tweet, as suffered a seizure, as was Rivello’s intent. As written up in The Outline:

According to a federal civil suit filed by Eichenwald against Rivello in Maryland, that seizure left him vulnerable to additional ones; he had another a week later. The second one forced him to increase the dosage of his anti-convulsive medication, despite profoundly debilitating side effects, and he spent Christmas of 2016 in a sedated haze.

Unsurprisingly, Rivello’s defense in the suit is based on the First Amendment, but as the Outline article says in a pull quote:

PUNCHING SOMEONE IN THE FACE COMMUNICATES A MESSAGE, BUT IT ISN’T ONE PROTECTED BY THE FIRST AMENDMENT.

The proceeding has been delayed until January 31, and Rivello is expected to plead guilty.

William Gibson wrote about this in Neuromancer

The idea of deliberately using strobing images on screens to induce epileptic seizures isn’t new. It most prominent use in science fiction that I’m aware of dates from 1984, in a heist executed on the Sense/Net broadcasting corporation by the protagonists and a gang called the Panther Moderns in William Gibson’s cyberpunk novel, Neuromancer:

The Panther Moderns allowed four minutes for their first move to take effect, then injected a second carefully prepared dose of misinformation. This time, they shot it directly into the Sense/Net building’s internal video system.

At 12:04:03, every screen in the building strobed for eighteen seconds in a frequency that produced seizures in a susceptible segment of Sense/Net employees. Then something only vaguely like a human face filled the screens, its features stretched across asymmetrical expanses of bone like some obscene Mercator projection. Blue lips parted wetly as the twisted, elongated jaw moved. Something, perhaps a hand, a thing like a reddish clump of gnarled roots, fumbled toward the camera, blurred, and vanished. Subliminally rapid images of contamination: graphics of the building’s water supply system, gloved hands manipulating laboratory glassware, something tumbling down into darkness, a pale splash… The audio track, its pitch adjusted to run at just less than twice the standard playback speed, was part of a month-old newscast detailing potential military uses of a substance known as HsG, a biochemical governing the human skeletal growth factor. Overdoses of HsG threw certain bone cells into overdrive, accelerating growth by factors as high as one thousand percent.

What can we do?

  • Read the Mozilla doc Web accessibility for seizures and physical reactions and follow its recommendations.
  • On your web pages and applications, consider removing auto-play from animated GIFs and videos.
  • Use tools to screen your video content for seizure-inducing flashing or strobing:
  • If you have the ability, write applications like Epilepsy Blocker, which detects potentially seizure-inducing images and videos. Otherwise, help susceptible people install it on their devices, and help spread the word about it!
  • And finally, if you see people using these kinds of attacks on social media, report and block them. If Gamergate taught us only one thing, it’s that the “ignore the bullies” tactic doesn’t work against online harassment campaigns.

Recommended reading

Categories
Programming

Table-driven programming and the weather forecasting stone

Creative Commons photo by Tim Rogers. Click to see the source.

Whenever a picturesque small town located by a body of water gets popular with tourists, someone eventually sets up a “weather forecasting stone” like the one pictured above. It’s not all that different from a lot of what a lot of programs do: For a given input, provide corresponding output.

Prior to becoming a senior developer at Lilypad/Fintech, I took a consulting gig where my mission was to bring an application to a more workable condition. During that time. I saw a lot of “weather forecasting stone” code, and in this article, I’ll show you what I did with it.

The most common approach: if / else if

Most of the “weather forecasting stone” code took the form of good ol’ if / else if. Here’s the JavaScript implementation:

let forecast;
if (stoneCondition == 'wet') {
  forecast = 'Rain';
} else if (stoneCondition == 'dry') {
  forecast = 'Not raining';
} else if (stoneCondition == 'shadow') {
  forecast = 'Sunny';
} else if (stoneCondition == 'white') {
  forecast = 'Snowing';
} else if (stoneCondition == 'unseen') {
  forecast = 'Foggy';
} else if (stoneCondition == 'swinging') {
  forecast = 'Windy';
} else if (stoneCondition == 'jumping') {
  forecast = 'Earthquake';
} else if (stoneCondition == 'gone') {
  forecast = 'Tornado';
}

Aside from not handling the case where stoneCondition doesn’t match any of the expected values, this code works just fine. It’s reasonably readable, but it doesn’t have the conciseness of the the sign in the photo. It reads more like this:

  • Is the stone wet?
    • The forecast is “Rain”.
  • Otherwise, is the stone dry?
    • The forecast is “Not raining”.
  • Otherwise, is the stone casting a shadow?
    • The forecast is “Sunny”.
  • Otherwise, is the stone casting a shadow?
    • The forecast is “Sunny”.
  • Otherwise, is the stone white on top?
    • The forecast is “Snowing”.
  • Otherwise, is the stone unseen?
    • The forecast is “Foggy”.
  • Otherwise, is the stone swinging?
    • The forecast is “Windy”.
  • Otherwise, is the stone jumping?
    • The forecast is “Earthquake”.
  • Otherwise, is the stone gone?
    • The forecast is “Tornado”.

Another approach: switch

In the same application, I saw more “weather forecasting stone” code, and from all appearances, it appeared that it was written by another programmer. This one preferred to keep variable names as short as possible, often condensing them to remove as many vowels as possible. They also were deeply in love with the switch statement. Their code, as implemented in JavaScript, looked like this:

let frcst;
switch (stnCndtn) {
  case 'wet':
    frcst = 'Rain';
    break;
  case 'dry':
    frcst = 'Not raining';
    break;
  case 'shadow':
    frcst = 'Sunny';
    break;
  case 'white':
    frcst = 'Snowing';
    break;
  case 'unseen':
    frcst = 'Foggy';
    break;
  case 'swinging':
    frcst = 'Windy';
    break;
  case 'jumping':
    frcst = 'Earthquake';
    break;
  case 'gone':
    frcst = 'Tornado';
    break;
  default:
    frcst = 'Unknown';
}

The switch statement in JavaScript is modeled after the one in C. This means that a break statement has to be added to the end of each case to prevent fall-through. You should think of it as more of a goto statement in disguise rather than a structured branching statement.

Note that switch requires a default clause to handle the case when none of the other cases apply. In the code above, I’ve set it so that any case we haven’t accounted for causes the forecast to be “Unknown”. In the circumstance where the code should never have to deal with an unexpected case, I’d have the default throw an exception or similar red flag that we should catch during development.

It works, but it’s even wordier than the if / else if example, thanks to the required break statement on every clause except the default one. Once again, it’s not as concise as the sign, because it reads like this:

  • Is the stone wet?
    • The forecast is “Rain”.
    • Stop here.
  • Is the stone dry?
    • The forecast is “Not raining”.
    • Stop here.
  • Is the stone casting a shadow?
    • The forecast is “Sunny”.
    • Stop here.
  • Is the stone casting a shadow?
    • The forecast is “Sunny”.
    • Stop here.
  • Is the stone white on top?
    • The forecast is “Snowing”.
    • Stop here.
  • Is the stone unseen?
    • The forecast is “Foggy”.
    • Stop here.
  • Is the stone swinging?
    • The forecast is “Windy”.
    • Stop here.
  • Is the stone jumping?
    • The forecast is “Earthquake”.
    • Stop here.
  • Is the stone gone?
    • The forecast is “Tornado”.
    • Stop here.
  • And if you’ve made it this far:
    • The forecast is “Unknown”.

My preferred approach: Lookup tables

While both approaches work, I was still looking to make the code as simple to read as the sign (and in the process, also make it simple to maintain and modify). I wanted code that looked like this table:

If the stone’s condition is… …then the forecast is:
Wet Rain
Dry Not raining
Casting a shadow Sunny
White on top Snowing
Unseen Foggy
Swinging Windy
Jumping Earthquake
Gone Tornado
None of the above Unknown

Here’s my lookup-table based implementation of the “weather forecasting stone” sign, in JavaScript

const FORECAST_LOOKUP_TABLE = {
  'wet'      : 'Rain',
  'dry'      : 'Not raining',
  'shadow'   : 'Sunny',
  'white'    : 'Snowing',
  'unseen'   : 'Foggy',
  'swinging' : 'Windy',
  'jumping'  : 'Earthquake',
  'gone'     : 'Tornado',
  'default'  : 'Unknown'
}
const forecastLookup = (stoneCondition) =>
  FORECAST_LOOKUP_TABLE[stoneCondition] || FORECAST_LOOKUP_TABLE['default']

This code gives you a couple of things:

  1. FORECAST_LOOKUP_TABLE, an object that acts as a lookup table. Its property keys are the set of strings for all the possible stone conditions, and its values are the forecasts that correspond to each condition.
  2. forecastLookup, a function that makes it easier to use the lookup table.

With this code, you can get the forecast using the lookup table…

let forecast = FORECAST_LOOKUP_TABLE['wet'];

…or to handle unexpected stone conditions, get it using the forecastLookup() function:

let forecast1 = forecastLookup('wet'); // results in "Rain"
let forecast2 = forecastLookup('covered in gravy'); // results in "Unknown"

The table-based solution is easier to read and maintain than the if / else and switch methods. It also requires fewer lines, which is important if you follow Corbató’s Law:

Simply put, what Corbató is saying is that every day, you only have so many lines of code in you on any given day. The corollary to Corbató’s Law is that for maximum productivity, you should code in such a way that uses as few lines as possible while maintaining readability and maintainability. I think my solution does just that!

Categories
Current Events Security The Street Finds Its Own Uses For Things

The 2020 presidential campaigns aren’t ready to fight disinformation. It might be up to us.

In today’s New York Times, there’s a frightening article titled 2020 Campaigns Throw Their Hands Up on Disinformation, which Techmeme succinctly summarizes like so: Campaign staff and researchers say almost no political campaigns, including presidential ones, have teams for spotting and pushing back on disinformation.

Welcome to the downside of the old internet promise that anyone can be a publisher or a journalist: It’s that everyone also has to be an editor, a fact-checker, a media critic, and yes, an investor too.

Start with these basics:

Also worth reading: The Internet Broke the News Industry—and Can Fix It, Too, by Jimmy Wales and Orit Kopel:

The people-powered solution

In the end, what may end up making a big difference is the rise of contributors who care enough to give up some of their time to act as independent fact-checkers and watchdogs. That’s how the Urban Legends Reference Pages got its start, and it eventually became Snopes. Just as social media accounts can be used to spread disinformation, they can also be used to spread the truth. Algorithms have been weaponized against people, but they can also be harnessed to protect them.

Someone’s going to have to take on the challenges that the campaigns and social media networks can’t or won’t do, and as the drivers of the information age, that responsibility will fall to us. Are we up to it?

Categories
Current Events Tampa Bay

What’s happening in the Tampa Bay tech/entrepreneur/nerd scene (Week of Monday, December 16, 2019 through New Year’s Eve)

It’s the last “Tampa Bay tech events” list of 2019…and of the decade!

The time around Christmas always sees a sharp decline in tech, entrepreneur, and nerd events, which is why this edition is listing the events for the last two weeks on the year. I hope you had a great 2019, and I’ll see you in 2020!

This weekly list, which I started in 2017, has been around for about three years. and I hope you’ve found it useful. The mailing list version is a relatively new thing — thanks to Justin Davis for the suggestions — and will continue into the new year and the new decade.

Monday, December 16

Tuesday, December 17

Wednesday, December 18

Thursday, December 19

Friday, December 20

Saturday, December 21

Sunday, December 22

Monday, December 23

Tuesday, December 24

Wednesday, December 25

(No events)

Thursday, December 26

Friday, December 27

Saturday, December 28

Sunday, December 29

Monday, December 30

Tuesday, December 31

Do you have an upcoming event that you’d like to see on this list?

If you know of an upcoming event that you think should appear on this list, please let me know!

Join the mailing list!

If you’d like to get this list in your email inbox every week, enter your email address below. You’ll only be emailed once a week, and the email will contain this list, plus links to any interesting news, upcoming events, and tech articles.

Join the Tampa Bay Tech Events list and always be informed of what’s coming up in Tampa Bay!


Categories
Current Events Tampa Bay

Scenes from the Computer Coach / High Tech Connect holiday party

Photo by Hubert Sacasa. Tap the photo to see it at full size. Tap here to see the source [LinkedIn].

From a short-term point of view, the overflowing parking lot, the place packed so full that it was difficult to get around, and the all-too-quickly disappearing food may seem like a bad sign.

But from a long-term point of view, this is a great sign for the Tampa Bay tech scene: It means that even in the middle of the week in the holiday season with so many competing events and activities, Tampa Bay techies are so active in the community that they’ll fill up a large patio.

The Computer Coach / High Tech Connect holiday party took place at the Brick House last night. It wasn’t just well-attended, but attended by more than just the “usual suspects” whom you’d normally expect to see. There were a lot of new faces — or at least new to me — and this was great news.

Photo by Joey deVilla. Tap the photo to see it at full size.

One of the nice things about attending a party full of techies is that when you wear a meme, people get it:

Photo by Hubert Sacasa. Tap the photo to see it at full size. Tap here to see the source [LinkedIn].

Later on in the evening, Computer Coach’s Chief Success Officer Suzanne Ricci addressed the crowd. She talked about Tampa Bay’s debut on CompTIA’s list of top 20 metros for technology, and how a lot of the credit goes to the strong community that’s been forming here over the past decade. She also mentioned the recent good news: the opening of a new Drift office in Tampa Bay, which the company selected based on “a budding tech scene and a diverse talent pool.”

Photo by Joey deVilla. Tap the photo to see it at full size.

The past few gatherings in Tampa Bay have given me a sense of deja vu. It has a lot of similarities to Toronto in the early 2000s, when its tech scene was forming, putting together the key elements that would eventually transform it into one of North America’s top technology powerhouses. I see a lot of the same things happening here, and it’s thanks to Tampa Bay techies. Let’s keep it up!

Photo by Hubert Sacasa. Tap the photo to see it at full size. Tap here to see the source [LinkedIn].

More parties next week!

If you were looking for big Tampa Bay techie gatherings next week, you’re in luck. The Tampa Bay UX Group is celebrating both the holidays and their hitting 1,000 members on Tuesday…

…and if you’re looking for a similar event on the St. Pete side of the bay, the big holiday party jointly held by Suncoast Developers Guild, the Tampa Ruby Brigade, GDG Suncoast, and Women Who Code Tampa happens on Thursday at Suncoast Developers Guild:

Categories
Humor Programming

I had the same reaction

As its own creator says: “In C++ it’s harder to shoot yourself in the foot, but when you do, you blow off your whole leg.”

Thanks to Jennifer Newsome for the find!