Uncanny Valley


The RipStik gets a mention in Anna Wiener’s Uncanny Valley.

If you’re looking for some smart Sunday reading about the oft-neglected people aspect of technology, start with Anna Wiener’s Uncanny Valley, where she writes about her experience working that alternate reality known as San Francisco, circa 2013.

It’s a world where your culture and the company culture are one and the same, job descriptions are an energy-drink admixture of “HR’s idea of fun and a 23-year-old’s idea of work-life balance”, you can’t tell whether getting together over drinks is dating or networking, and FOMO hangs in the air like the city’s famous summer fog.

accept - tentative - decline

Here’s an excerpt:

A MEETING IS DROPPED MYSTERIOUSLY onto our calendars, and at the designated time we shuffle warily into a conference room. The last time this happened, we were given forms that asked us to rate various values on a scale of 1 to 5: our desire to lead a team; the importance of work-life balance. I gave both things a 4 and was told I didn’t want it enough.

The conference room has a million-dollar view of downtown San Francisco, but we keep the shades down. Across the street, a bucket drummer bangs out an irregular heartbeat. We sit in a row, backs to the window, laptops open. I look around the room and feel a wave of affection for these men, this small group of misfits who are the only people who understand this new backbone to my life. On the other side of the table, our manager paces back and forth, but he’s smiling. He asks us to write down the names of the five smartest people we know, and we dutifully oblige. I look at the list and think about how much I miss my friends back home, how bad I’ve been at returning phone calls and emails, how bloated I’ve become with start-up self-importance, how I’ve stopped making time for what I once held dear. I can feel blood rush to my cheeks.

“OK,” my manager says. “Now tell me: why don’t they work here?”


Another excerpt reminds me of the line from Neal Stephenson’s Snow Crash that’s stayed with me since first reading it in 1992: “It was, of course, nothing more than sexism, the especially virulent type espoused by male techies who sincerely believe that they are too smart to be sexists”:

WE HIRE AN ENGINEER fresh out of a top undergraduate program. She walks confidently into the office, springy and enthusiastic. We’ve all been looking forward to having a woman on our engineering team. It’s a big moment for us. Her onboarding buddy brings her around to make introductions, and as they approach our corner, my coworker leans over and cups his hand around my ear: as though we are colluding, as though we are 5 years old. “I feel sorry,” he says, his breath moist against my neck. “Everyone’s going to hit on her.”

I include this anecdote in an email to my mom. The annual-review cycle is nigh, and I’m on the fence about whether or not to bring up the running list of casual hostilities toward women that add unsolicited spice to the workplace. I tell her about the colleague with the smart-watch app that’s just an animated GIF of a woman’s breasts bouncing in perpetuity; I tell her about the comments I’ve fielded about my weight, my lips, my clothing, my sex life; I tell her that the first woman engineer is also the only engineer without SSH access to the servers. I tell her that compared with other women I’ve met here, I have it good, but the bar is low. It’s tricky: I like these coworkers — and I dish it back — but in the parlance of our industry, this behavior is scalable. I don’t have any horror stories yet; I’d prefer things stay this way. I expect my mother to respond with words of support and encouragement. I expect her to say, “Yes! You are the change this industry needs.” She emails me back almost immediately. “Don’t put complaints about sexism in writing,” she writes. “Unless, of course, you have a lawyer at the ready.”

web horizontal rule

Go and read Uncanny Valley. If my endorsement isn’t enough, take Paul “ftrain” Ford’s

…or Leigh Alexander, from whom I found out about the article in the first place:

Inside Silicon Valley’s Big Pitch Day

y combinator demo day

Inside Silicon Valley’s Big Pitch Day is another piece by Anna Wiener about Y Combinator’s Demo Day, the show-and-tell held at the end of every March and August where companies funded by the seed accelerator firm parade their people and products to a room of very exclusive guests. She covers it not with the breathless tech-for-tech’s sake style that a more nerd-focused writer might employ, nor with the tech-for-getting-filthy-rich’s sake manner that someone with a Forbes-y/Business Insider-y bent would use. As she puts it:

I’ve worked in tech for a few years and love technology, if not always the techindustry: I’m neither an entrepreneur nor an engineer, I’m just a humanist with a sociology degree. I went to Demo Day as both an insider and an outsider, hoping to see a slice of the future.

She points out the sili-ness that comes with Silicon Valley, but at the end, she also points out reasons to be hopeful:

Still, to see one of Silicon Valley’s most lauded accelerators give a platform to people working in sanitation, social services, and healthcare felt tremendous. The future of technology is not necessarily in consumer or B2B software, and it’s not necessarily in the United States, either—some of the more compelling ideas came from international companies catering to local markets. These were hardly the most glamorous companies, but they were the companies that seemed most important to get in front of an audience with as much economic, cultural, and political clout as those assembled at Demo Day.

The Y Combinator motto is straightforward: “Make something people want.” At Demo Day, there were signs that the accelerator, and Silicon Valley as a whole, could also help companies make something people need.

For those of you who were curious about the company she was writing about in Uncanny Valley, she drops a hint in Inside Silicon Valley’s Big Pitch Day: “Full disclosure: From 2013-2014, I worked for a Y Combinator startup. The CEO was 24.”

Hacking Technology’s Boy’s Club

ellen ullman

There are a precious few books that I have to keep buying over and over again because I keep giving away my copy to friends. One of these books is Close to the Machine: Technophilia and its Discontents by Ellen Ullman. Published in 1997, it’s a memoir that tells a good number of interesting stories, shows the human side of computer (and yes, there is one), and finally, it manages to pull off what should be impossible — it makes coding look interesting, and even exciting, to non-coders. As a reader of this blog, it may seem strange to you to not think of programming as exciting, but we’re the kind of people who look forward to a long flight as a chance to try out a new programming language or API.

Anna Wiener’s January 2016 article for The New Republic, Hacking Technology’s Boy’s Club, is a good intro to Ellen Ullman for those of you who aren’t familiar with her or her work. In some parts, we see an Ullman who’s concerned about the social issues of the tech industry and its products:

“It will not work to keep asking men to change,” Ullman told me. “Many have no real objective to do so. There’s no reward for them. Why should they change? They’re doing well inside the halls of coding.” To be perfectly clear: Ullman isn’t anti-geek-culture; she’s not anti-technology; she’s not anti-men. She doesn’t want to raze the clubhouse. She simply wants those inside to open the door.

Though she retired from the tech industry at the end of the last boom, to read Ullman’s work is to remember she’s been with us all along. Code, for all its elegance and power, is just a tool. “As with all advances in technology, the new offerings are often helpful, and marvelous—sometimes frightening, as with advances in surveillance,” she said. “The services are enormously convenient, but then there is the culture left behind. When we receive the dry cleaning delivery, we no longer see who does the work. We don’t see the tailor in the window, the presser surrounded by steam. When you order food on your phone from GrubHub, you don’t see the cooks and helpers in the hot kitchen.” The question of who delivers to whom, she continued, is directly related to inequality at large—it’s essential that the technologies we create and use are also building a world we want to live in.

But she’s just as into the hardcore, technical nitty-gritty that you and I love:

One afternoon last summer, I invited Ullman to my workplace. Within minutes, she and two young engineers were debating the merits of strongly typed languages, a conversation they’ve had many times before; it quickly became clear that Ullman had tipped the scales. “See? I told you so,” one said, vindicated. As enjoyable as it was to watch her, I was in over my head. Ullman noticed immediately. “Sorry—you must be bored,” she said. “This is fun for me.”

web horizontal rule

There you have it: three interesting articles by Anna Wiener. I look forward to reading more of her work.


adding geolocation to our weather app

The next Tampa iOS Meetup has been announced for Wednesday, May 4th at 6:30 p.m.. This one builds on the previous meetup (but if you missed the last one, we’ll get you caught up) and is called Adding geolocation to our weather app.  It takes place at our usual spot: Energy Sense Finance, 3825 Henderson Boulevard (just west of Dale Mabry), Suite 300.

We’ll pick up from where our last meetup, Build a simple weather app (and learn basic network programming along the way), left off. The app required you to specify your location before it would report the weather. But that’s not how most weather apps work: they use geolocation to get your phone’s coordinates and provide them to the weather service. In this meetup, we’ll show you how to harness the power of iOS geolocation through the Core Location framework.

We’ll begin with a quick walkthrough of last meetup’s weather app, just as a reminder for those of you who were there, and as a way for those of you who weren’t to get caught up. Then we’ll get right into the business of adding geolocation capability to our weather app, so that when you run it, it displays the weather for your location.

At the end of this session, you’ll know how to make use of geolocation through Core Location. We’ll make the source code and presentation materials available at the end, to make it easier for you to start your own geolocation projects.

Join us this Wednesday, get to know your fellow Tampa Bay iOS developers, and get ready to learn and have some fun!

Tampa iOS Meetup is a monthly meetup run by local mobile developer/designer Angela Don and Yours Truly. While Tampa has a couple of great iOS developer meetups — Craig Clayton’s Suncoast iOS and Chris Woodard’s Tampa Bay Cocoaheads — they’re aimed at intermediate- to expert-level iOS developers. We figured that there was room for a third iOS meetup in the Tampa Bay area, and especially one that focused on people new to iOS development or even development in general. So we made one.

The Details

  • What: Tampa iOS’ Meetup’s “Adding geolocation to our weather app” session. Please sign up on our Meetup page so we can plan accordingly!
  • When: Wednesday, May 4, 2016, 6:30 p.m. – 9:00 p.m. We’ll have some snacks at 6:30, with the presentation beginning at 7:00.
  • Where: Energy Sense Finance, 3825 Henderson Boulevard (just west of Dale Mabry), Suite 300. See the map below.

  • What to bring: Yourself, but if you’d like to follow along, bring your Macbook and make sure it’s got the latest Xcode.
  • What to read in advance: If you’re one of those people who likes to do some readings ahead of a presentation, try this example location app written in Swift. We’ll be using our own tutorial material, but this may come in handy.


Want to test an iPhone/iPad game?

by Joey deVilla on April 25, 2016

Wine Crush is a simple “Candy Crush”-like game that I’m developing for my friends at Aspirations Winery in the nearby city of Clearwater. It’s the first of a few apps that I hope to publish to the App Store this year. If you’ve got an hour or so to spare and are the sort of person who always has ideas on how apps could be improved, this opportunity’s the one you’ve been waiting for!

Wine Crush is a pretty straightforward game. You play by creating matching groups of wine-related images — glasses of wine, bottles, corks, grapes and cheese — in groups of three or more. You can create horizontal matching groups…

Animation showing how players form a horizontal match in Wine Crush.

…or vertical matching groups:

Animation showing how players form a vertical match in Wine Crush.

You score points for creating matching groups, and the goal for each level of the game is to score a target number of points within a given number of moves. If you meet the goal, you get to proceed to the next level. If you don’t, it’s GAME OVER.

Anitra Pavka (3rd from left) and Joey deVilla (4th from right) at 'Wine-O Bingo' at Aspirations Winery, Clearwater, Florida.

“Wine-O Bingo” at Aspirations Winery, summer 2014. My wife Anitra’s third from the left, and I’m the smiling guy across the table from her, fourth from the right.

Wine Crush is designed as a promotional tool for Aspirations Winery, which is run by Bill and Robin Linville. My wife Anitra has been buying their wines for years. She took me to one of their regular “Wine-O Bingo” events in 2014 (pictured above), and made friends with them after entertaining their guests with a couple of their accordion numbers. Soon after, I approached them with a proposition: Would you like to have an iPhone game for your winery?

They said yes, and I got to work. Starting with the “How to make a game link Candy Crush” tutorials from RayWenderlich.com as a basis, I put together a game with wine-related imagery and Aspirations’ branding, using artwork that Robin provided. The backgrounds for the games’ levels are various labels for Aspirations’ wines, and there are a couple of buttons on the main screen that you can click to find out more about the winery.

For Aspirations, it’s a cute little way to get their name out their in a way that sets them apart from most other small family-owned wineries. As for me, this app is a way for me to help out some friends, sharpen my programming skills, build a portfolio, and gain some valuable experience with the App Store. Aside from a fair bit of free wine (for which I’m very grateful), I’m not getting paid for this project.

The title screen and two game screens from Wine Crush.

Wine Crush needs to be tested before I put it on the App Store. As the developer, I’m a little too close to the project to spot all the bugs and places where it could be improved. That’s where you come in. I’m looking for a small group of people who like trying out new apps to take a pre-release version of Wine Crush for a spin, point out problems and crashes, and give me some feedback. I will also ask you to test some other interesting iPhone/iPad/Apple TV projects I’m working on. It won’t be an all-consuming process; all I’m asking for is a little bit of your downtime and your opinions.

Does the opportunity to test and give feedback on soon-to-be-released iPhone/iPad/Apple TV apps sound interesting to you? If it does and you’d like to join the test group, drop me a line at joey@joeydevilla.com.

This article also appears in The Adventures of Accordion Guy in the 21st Century.

{ 1 comment }

apple tv fun facts

A slide from tonight’s presentation.

tampa bay user experienceI was scheduled to speak tonight at the Tampa Bay UX Meetup and talk about Apple TV UX with my wife Anitra, but as luck would have it, work commitments this evening with GSG’s biggest client have conspired to keep me away.

The show must go on, and it’s in very good hand. Anitra’s forgotten more about user experience than I will ever learn, what with her work as a user experience and web accessibility consultant. She also wrote the accessibility chapter in O’Reilly’s HTML5 Cookbook and was a technical editor for O’Reilly’s Universal Design for Web Applications book. She’ll apply her knowledge to the fourth-generation Apple TV user experience, and walk you through it. There’ll be a presentation, followed by live demos of Apple TV apps and interface. She’ll also point you to resources that you can use to help you design and even build tvOS apps.

It all happens tonight at 6:00 p.m. at the offices of 352 Inc., located at 5100 West Kennedy Boulevard, Suite 352 in Tampa. You can sign up and find out more on the Tampa Bay UX Meetup page. My thanks to organizer Krissy Scoufis for all her help!



new android emulator

Click the screenshot to see it at full size.

Regrets and mistakes, part one

nuclear explosion

This question appeared on Server Fault on Sunday:

I run a small hosting provider with more or less 1535 customers and I use Ansible to automate some operations to be run on all servers. Last night I accidentally ran, on all servers, a Bash script with a rm -rf {foo}/{bar} with those variables undefined due to a bug in the code above this line.

All servers got deleted and the offsite backups too because the remote storage was mounted just before by the same script (that is a backup maintenance script).

How I can recover from a rm -rf / now in a timely manner?

Most of the answers were along the lines of: “If you’ve got backups, you’ll be fine. If you don’t, you’re about to go out of business.”

iOS and Swift

swift adjectives

Regrets and mistakes, part two

sad man at computer

From My Biggest Regret as a Programmer:

I could go on and on but the key is that you can’t make changes in how people do things in a technical sense unless you have the ability, the authority and the opportunity. Once you make that call and assuming you find the right places to grow, the sky is really the limit.

When I was on TV (Computer Chronicles) in early 1987 showing our product Trapeze the other presenter was Mike Slade who was product manager of Excel. At the time young me thought him some random marketing weenie (young people can be pretty stupid). Yet he started all these companies later including ESPN, worked for Apple in various leadership roles, was a good friend of Steve Jobs and started his own VC firm.

And today I am still just a programmer. Who’s the weenie now? I doubt I will ever be able to really retire. Thankfully I am still good at delivery (I was recruited into my present job by a former manager who needed what he knew I can do) but still all I will be until I croak is what I am now.

{ 1 comment }

smartphone weather

Welcome to part two in a series of articles on building your own iOS weather app in Swift!

The previous article in this series showed you how to:

  • Get a key for OpenWeatherMap’s API for current weather data
  • Make a manual API call using your browser
  • Create a basic app to get the data from OpenWeatherMap
  • Tweak the app

In this article, we’ll explain the code that was presented in the previous article and make the next major step in writing our weather app: extracting the data from the JSON returned by OpenWeatherMap.

A deeper look at the code that gets the weather data

In the last installment, I gave you enough code to connect to OpenWeatherMap and retrieve the weather data, but never explained how it works. Let’s fix that oversight.

Our simple weather app makes use of the NSURLSession class along with a lot of classes that go along with it. Together, classes in the NSURLSession family of classes give us an API for downloading and uploading data from the internet, in a number of different ways.

The diagram below shows the classes that our weather app works with, either directly or indirectly:

nsurlsession diagram

Here’s a slightly more in-depth explanation of the classes in the diagram above:

NSURLSession class Instances of NSURLSession are containers — collections of other objects — that provide an API for sending data to and receiving data from a given URL. You use the NSURLSession API to create one or more sessions, which are objects that coordinate one or more tasks, which are objects that actually transfer the data.
Shared session object The shared session object is a pre-made singleton instance of NSURLSession. It’s not as configurable as other NSURLSession instances that you can instantiate yourself, but for simple requests, such as the kind we’re making in our bare-bones weather app, it’s good enough. You access the shared session with NSURLSession‘s sharedSession class method.
NSURLSessionTask class As mentioned in the explanation of NSURLSession above, tasks are the objects within an NSURLSession instance that actually transfer the data. NSURLSessionTask is the base class for tasks.
NSURLSessionDataTask class

You typically don’t instantiate an NSURLSessionTask object, but one of its subclasses, and you do so by calling one of NSURLSession‘s task creation methods. NSURLSessionDataTask is the class for data tasks, which are used to download data from a given server into memory. We’re using an NSURLSessionDataTask instance to request and collect data from OpenWeatherMap.

In addition to data tasks, there are also upload tasks, which are used to upload data to a server, and download tasks, which are used for downloading data from a server into a file (as opposed to memory, which is where data tasks download their data to).

That’s the “big picture” view. Keep it in mind as we look at the code that does the downloading, contained in the getWeatherInfo function in the WeatherGetter class:

I’ve added number comments to the code, which correspond to the explanations below:

  1. We use NSURLSession‘s class method sharedSession to get a reference to the shared session object, and assign that reference to the local variable session.
  2. We construct an URL using the URL for OpenWeatherMap’s current weather API, filling in the blanks with the name of the city that we want the weather for, and our OpenWeatherMap API key.
  3. We want to use a data task to request and retrieve the data from OpenWeatherMap. As mentioned earlier, tasks are created by using one of NSURLSession‘s task-creation methods. In this case, we’re using dataTaskWithURL, which we provide with 2 arguments:
    • The URL created in step 2, and
    • A completion handler that executes once the task is done requesting and retrieving the data. The completion handler will receive three arguments, which we can work with:
      1. data: If the request was successfully made and the data was successfully received, this will contain that received data.
      2. response: The response from the server.
      3. error: If the request was not made successfully or the data was not received successfully, this will contain information about the error.
  4. If the error argument isn’t nil, we assign its value to a local variable also named error, and then display its contents.
  5. If the error argument is nil, it means that no error occurred, and we display both the server response and the data received, in both raw and human-readable formats.
  6. Up until this point, we’ve only defined the data task. This statement activates it.

Turning the weather data into a Swift dictionary

Right now, if the weather request was successfully made and the data was successfully received, we take that data, convert it into a human-readable string, and output it to the debug console…

…and that human-readable string looks something like this:

{"coord":{"lon":-82.46,"lat":27.95},"weather":[{"id":800,"main":"Clear","description":"clear sky","icon":"01n"}],"base":"cmc stations","main":{"temp":295.49,"pressure":1015,"humidity":64,"temp_min":294.15,"temp_max":296.15},"wind":{"speed":2.1,"deg":280},"clouds":{"all":1},"dt":1460163717,"sys":{"type":1,"id":728,"message":0.004,"country":"US","sunrise":1460200241,"sunset":1460245929},"id":4174757,"name":"Tampa","cod":200}

We could simply perform all sorts of string operations to extract the data we need, but why should we? The data is already in JSON format, which maps nicely to data structures in most programming languages, including Swift. There should be a simple way to take that incoming data and turn it into a nice Swift dictionary.

Enter the NSJSONSerialization class, which can convert JSON into Foundation objects (such as arrays and dictionaries), and vice versa. It has a method called JSONObjectWithData that takes two arguments:

  • data: An NSData object containing JSON data, which we happen to have as one of the parameters of our completion handler, and
  • options: Options that specify how the JSON data should be read and how the corresponding Foundation objects should be created.

Let’s change the code so that we no longer turn the data into a string, but instead using NSJSONSerialization‘s JSONObjectWithData method to turn it into a dictionary:

If you run the app now, you’ll see that when put into dictionary form, it’s easy to extract weather data:

Date and time: 1462277829
City: Tampa
Longitude: -82.45999999999999
Latitude: 27.95
Weather ID: 800
Weather main: Clear
Weather description: clear sky
Weather icon ID: 02d
Temperature: 294.659
Humidity: 95
Pressure: 1025.47
Cloud cover: 8
Wind direction: 168.003 degrees
Wind speed: 2.11
Country: US
Sunrise: 1462272456
Sunset: 1462320359

Here’s what the complete WeatherGetter.swift should look like now:

At this point, the WeatherGetter class doesn’t just get the weather data from OpenWeatherMap; it also puts that data into a form that we can process: a Dictionary. We’re still displaying the information in the debug console — we’re still not showing it to anyone who’s not running the app with Xcode.

In the next installment in this series, we’ll take the weather data, now in dictionary form, and make it visible to the user. We’ll also make it possible for the user to enter a city to get the weather for, rather than hard-wire it into the app.

xcode download

You can download the project files for this aricle (74KB zipped) here.


the unbeatable squirrel girl cover

Marvel Comics are doing some interesting things with characters that aren’t that well-known outside comic book fandom, not just with the Guardians of the Galaxy, a (very radically altered) Big Hero 6, and Ant-Man on the big screen and Jessica Jones, Peggy Carter, and various agents of S.H.I.E.L.D. on smaller ones, but even in their comic books, with Ms. Marvel and, more recently, the incredibly cute and unbeatable (it says right so in the title) Squirrel Girl.

Conceived as a throw-away character in the early ’90s when most comic book series were trying to be like The Dark Knight Returns, the 1982 Wolverine solo series, or the X-Men, Squirrel Girl has become important enough to merit her own book, The Unbeatable Squirrel Girl, written by Ryan North of Dinosaur Comics fame.

Ryan North has a computer science background, with a bachelor’s degree from Ottawa’s Carleton University and a master’s from the University of Toronto (that’s right, he’s Canadian). That background is what drives some of Squirrel Girl’s story; when she’s not fighting criminals and supervillains, she’s Doreen Green, first-year student (that’s a Canadianism; most Americans would say freshman) of computer science at Empire State University.

Sometimes her computer science studies are the backdrop, as in this scene, where she shows up a little bit late for her class on databases…

squirrel girl database class 1

squirrel girl database class 2

squirrel girl database class 3

…and other times, it plays a key role in defeating A-list supervillains like Victor von Doom. Doom’s primary flaw is that he’s a supreme egomaniac. Although he’s a science and engineering genius, he’s too proud to have learned programming languages that weren’t of his own design.

So when Squirrel Girl sends a message in C++ to her friends backing her up…

squirrel girl programming 1

Click the comic to see it at full size.

(By the bye, here’s the code that she called out…)

…Doom doesn’t understand what she’s saying, since he only programs robots in his own “Doomsembly language” and never learned any real programming languages because it would mean learning from others…

squirrel girl programming 2

Click the comic to see it at full size.

Before you go spoiling the fun by saying “there’s no way you can formulate and yell out that code in that little time, and then have a friend do ASCII conversions in her head that quickly”, remember that all this is happening in a confrontation between a villain in a mechanical suit powered by both super-science and sorcery and a young woman with squirrel powers.

Also amusing: how the comic book often starts with Twitter conversations:

squirrel girl twitter

In case you’re wondering, the jingle she’s referring to is from the 1960’s Iron Man cartoon…

…and it gets referenced in the first Iron Man movie as his mobile phone ringtone…

The Unbeatable Squirrel Girl is a fun read, and the computer science bits just make it even more fun for a former computer science major like myself.