Categories
Review

“Two Hundred and Twenty-One Baker Streets”

I’ve actually read several of the stories in this anthology before, in other anthologies. Which, I suppose, is a statement about my taste in books.
Of the ones that were new, however, a couple of them were sufficient to make a partial repeat purchase worth it.
So, which stood out to me?
Far and away the best was The Lantern Men, which was a mildly interesting take on the Sherlock story (he’s an architect this time around!), but was one of the creepiest things I’ve ever read. It followed The Rich Man’s Hand, which was creepy enough that I thought “oh, I can’t go to bed on that, I’ll read one more,” and that turned out to be a mistake.
A Woman’s Place is a delightful little cyberpunk kind of thing, and my favorite take on Mrs. Hudson that I’ve seen… quite possibly ever. The opening scene, of her delivering tea and sandwiches while Sherlock and Watson interview a client? Oh, I won’t spoil a thing, but within the first page I was enraptured, and by the end, utterly delighted.
The Small World of 221b turned into a different genre than I thought it was, which was a fun twist, and I like the story that it told.
The Final Conjuration, too, was a genre-blending version of the story, and one I quite liked.
Finally, The Innocent Icarus was a great piece of world-building, and I’d quite like to read more in that setting at some point.
And that’s more than half the stories in the anthology; there’s also, as I mentioned, a few that I’d read before and quite liked, so it’s well worth the price. Check it out.

Categories
Review

“Grunt”

Mary Roach
I spent the entire time reading this book thinking that it was by the same person who wrote Combat-Ready Kitchen. Which was an interesting comparison to have in mind, as I quite liked that one, but “Grunt” was much more fun. While “Combat-Ready Kitchen” felt like it was trying to be ready for use as a textbook in a history class, “Grunt” was unabashedly written by a human being who likes to mention their human responses. I’ve got a great deal of highlights of comedic moments that Roach captured very well.1
As someone with precisely zero interest in joining the military, I think Roach is an excellent writer for this topic. Clearly she’s got a bit more experience in this area than I do — nobody who’s spent a week on a nuclear submarine doing research for a book can really be as clueless as she tries to convey — but she’s removed enough from it that she can be an excellent go-between. The feigned cluelessness doesn’t read as an affectation, it reads as making sure the genuinely clueless folks like me can follow along.
And it’s just an interesting subject matter. The Department of Defense has a spectacular research budget, which they put into doing all sorts of neat things. Nothing in the book focuses on the science of Exciting New Ways To Make People Dead; in fact, it’s almost universally focused on the opposite. I’m okay with my tax dollars going to research on reconstructive surgery and heat-stroke prevention.
I can definitely recommend “Grunt”. It’s a fun read, and the science is neat. Check it out.


  1. And a pent-up rant about just how bad the experience of trying to highlight stuff is in Apple Books. While the location of the highlight has a clear correlation to where your finger is on-screen, they’re not directly related in the way that we’re trained to expect from iOS. And god forbid you want to highlight something that spans across a page break – to date, the only way I’ve found to do this is to change the text size until they’re on the same page. Even Amazon does better than that, and their Kindle app has never not felt like an abandoned project. 
Categories
Review

“A Furnace Sealed”

Keith R.A. DeCandido
This is a delightful little bit of urban fantasy, following a man who hunts supernatural creatures for a living. Or rather, deals with supernatural problems — there’s a bit of the ‘hunting’ aspect, but in general he’s got more of a ‘fixer’ vibe, trying to avoid violence where possible. The first chapter sees him fighting a unicorn, along with the delightful revelation that unicorns don’t have any special affinity for virgin maidens, it’s just that they’re infuriated by the scent of men.1 This leads to a slight relationship dispute when it takes offense to one member of a lesbian couple, and Bram, the protagonist, makes a quick escape.
And from there, it’s a fun little journey. Like I said, it’s a delightful bit of urban fantasy: the mental image of someone driving a semi through the streets of the Bronx, hoping nobody notices the unicorn in the back, is a pretty good one. And the actual world being set up strikes a nice balance of depth without feeling overwhelming — there’s a bit of a Buffy vibe at times, some of that “well, there could be a Monster of the Week, but we’ve also established some actual lore” vibe.2
It’s a good book, and I’m lookin forward to the sequel(s) implied by the subtitle. Give it a read.


  1. Having occasionally had to clean the men’s locker room when I was working at the pool, I can relate. 
  2. If I’m going to make Buffy references, I should probably watch the show at some point. Or at least read the Wikipedia summary. 
Categories
Review

“Superintelligence: Paths, Dangers, Strategies”

Nick Bostrom
This was, simultaneously, one of the driest and most terrifying books I have ever read.
Really, the conclusion summarized it well:

“Before the prospect of an intelligence explosion, we humans are like small children playing with a bomb. Such is the mismatch between the power of our plaything and the immaturity of our conduct. Superintelligence is a challenge for which we are not ready now and will not be ready for a long time. We have little idea when the detonation will occur, though if we hold the device to our ear we can hear a faint ticking sound.”

It is what the title says: a list of ways we can achieve superintelligence (including, I’d note, a discussion of the fact that it’s both necessary and inevitable), a harrowing discussion of exactly how many ways it can go wrong, and some things we can start trying to do to keep it from going all Skynet on us. Or, as is more likely, wiping out humanity without really noticing, because we were a convenient source of raw materials.
Like I said: terrifying.
But valuable. I’m also convinced this book should be required reading for any AI course. And, y’know, a good chunk of the population beyond that: I count AI as one of the three most likely existential threats out there.1
So hey, want to somehow be a little bored and scared out of your mind at the same time? Read it.


  1. I’ve got it tied with “Global War, Nuclear” and “Climate Change.” Lower on the list are “A Pandemic With 100% Transmission Rate and 90-Plus Percent Lethality” and “Something From Space.” 
Categories
Review

“Mythology”

Edith Hamilton
I’ve always had a bit of an interest in Greek mythology. It started with “D’aulaires’ Book of Greek Myths”, went through the Percy Jackson phase, and since then has mostly consisted of using names from Greek mythology as names for projects. Hey, they’re objectively cool names — they had to be, to stick in people’s minds through centuries of oral retellings.
This book is definitely in a different style then d’Aulaires. The latter was noticeably aimed at children, both in the style of illustration and in the way the content was edited. Hamilton’s audience is clearly more adult, and rereading these stories was interesting in that context. Part of it, I’m sure, is just the context of “I’m an adult now, and know quite a lot more of what the world is like,” but the actual events are different in some of the telling, as well.
Where the book really shines, though, is in the design — it’s gorgeous. It feels like the literary equivalent of a coffee-table book. In the edition I have, at least, the actual paper has a weighty feel to it, and the page design, interspersed with the occasional light-text-on-dark-paper section headings and family trees, is a delight. There’s also the occasional full-page ‘plate’ illustration, which feel right at home with the rest of the design of the book.
The title itself is a little bit misleading, in my opinion — with the full title, “Mythology: Timeless Tales of Gods and Heroes” implying a bit of “this is all the mythologies.” The cover art, however, is very clear that we’re sticking to the Greco-Roman world, which helps. (Admittedly, there is a little section at the end that goes into Norse mythology, but it’s a very small portion of the book, and quite limited in scale. It’s also very interesting to read — again, some of the stories are very different from how I know them.1)
So, if you like mythology and having pretty books you can put out on the coffee table so that your guests know just how cultured you are, I absolutely recommend this one.


  1. … probably related to the fact that my knowledge of Norse mythology comes entirely from its use as cultural context, and never actually directly reading any. Turns out Marvel’s Thor isn’t 100% accurate to the source material, shocking
Categories
Review

“Ra”

Sam Hughes
This is one of the most interesting pieces of fantasy/science-fiction I’ve read recently. I’m sure I’ve mentioned before, in these book reviews, that I like world-building and systems of magic, and this delivers in spades. Magic, in Ra, is a type of engineering, and involves a great deal of math and rules and planning ahead. It’s a system to be uncovered, and scientists around the world are doing science at it, figuring out the rules. Why isn’t natural mana usable? What’s up with the weird dreams that all mages share? What happens to waste energy — magical friction — and why hasn’t anyone managed to detect it yet?
Basically, this is a book that takes solid aim at the mindset of someone like me, who will sit down and read through a veritable textbook on the workings of a magic system. And then, instead of just being a textbook, it comes with a whole story, that answers some of those questions in a way that makes for a solid story. (It helps that there’s a good amount of in-jokes for computer nerds — I mean, Wheel? That’s a neat touch.)
So, if you’re at all this sort of nerd, go give it a read. (You can also read it for free on the author’s website, but, y’know, pay people for their work.)

Categories
Education Portfolio Technology

Swift Student Challenge

A few days ago, Apple announced the winners of their Swift Student Challenge. I had applied and used my “taking a test” tactic, which was to hit ‘submit’ and then promptly erase the whole thing from my brain. (What’s done is done, and I feel silly worrying about something I have no control over.)

So when I got the email that “my status was updated” it was a bit of a surprise.

And when I clicked through the link (because, of course, they can’t just say in the email, you have to sign in) I was in for more of a surprise.

My submission had been accepted. I’m one of 350 students around the world whose work sufficiently impressed the judges at Apple.

Screenshot from Apple Developer website. It reads: Congratulations! Your submission has been selected for a WWDC20 Swift Student Challenge award. You'll receive an exclusive WWDC20 jacket and pin set at the mailing address you provided on your submission form. You'll also be able to download pre-release software, request lab appointments, and connect with Apple engineers over WWDC20 content on the forums. In addition, one year of individual membership in the Apple Developer Program will be assigned free of charge to eligible accounts of recipients who have reached the age of majority in their region. For details, see the WWDC20 Swift Student Challenge Terms and Conditions.
Neat!

Now, throughout the whole process of applying, I was my usual secretive self. I think two people knew that I was applying at all, much less what I was working on. Since it’s over with, though, it’s time for the unveiling.

What I made

I wanted to bring back a concept I’ve played with before: cellular automata. A few days before the competition was announced, I’d seen a video that really caught my interest.

Well hey, I thought, I’ve got some code for running cellular automata. I want to learn Swift Playgrounds. And I’ve been having fun with SwiftUI. Let’s combine those things, shall we?

The first big change was a visual history; when a cell dies, I don’t want it to just go out, I want it to fade slowly, leaving behind a trail of where the automata have spread.

The second was rewriting all the visuals in SwiftUI, which was a fun project. Animation timings took me a bit to get right, as did figuring out how to do an automated ‘update n times a second’ in Combine. The biggest issue I had, actually, was performance – I had to do some fun little tricks to get it to run smoothly. (Note the .drawingGroup() here – that made a big difference.)

And third, I didn’t want it to just be “here’s some code, look how pretty,” I wanted to actually use the Playground format to show some cool stuff. This turned out to be the most frustrating part of the whole thing – the Swift Playgrounds app doesn’t actually support creating a PlaygroundBook, and the Xcode template wasn’t supported in the then-current version of Xcode.

But the end result? Oh, I’m quite happy with it. PlaygroundBooks are cool once you get past how un-documented they are. You can, to borrow a Jupyter turn of phrase, mix code and prose in a lovely, interactive way.

Screenshot of the 'Grid' page of the playground book.  The full text is at https://github.com/grey280/SwiftLife/blob/master/Swift%20Student%20Submission.playgroundbook/Contents/Chapters/Chapter1.playgroundchapter/Pages/Grid.playgroundpage/main.swift
Don’t worry, the real version (and some videos) are below.

Doing the actual writing was pretty fun. This is a concept I’ve spent a lot of time learning about, just because it captured my interest, and I wanted to share that in a fun way.

Overall, I’m quite happy with the result. If you’d like to see more, I’ve made recordings of the ‘randomized grid’ and ‘Wolfram rule’ pages running, and the actual playground is available on GitHub.

Categories
Technology

Reversi: A Postmortem

Spring quarter consisted of two things: beginning the internship, and an “intro to programming” course. Which, at first glance, seems like it would’ve been a “coast to an easy A” kind of thing for me, but that wasn’t my goal. And, to quote the Dean of UCI’s Graduate Division, “grad school is for you.”

So, at the start of the quarter, I sat down to figure out what my goals for this class would be, and came up with two things. The first, which I won’t be writing about, was to get a bit more teaching experience – in the vein of “guiding people to asking the right questions,” rather than just showing them the answers.

Second, and the topic of this post, was that I wanted to learn Vapor. The professor was kind enough to let me do this – instead of doing the course project (an online game of Reversi) in Node, I did it in Vapor.

As a learning exercise, I’d say it was… okay.

What Went Well

I love Swift as a language. The type system just fits in my head, it aligns incredibly well with how I think.

In this case, that meant representing all the events to the server, and the responses from the server, as enums.

It also meant that I could have a solid Game class that represented the whole game board, with some neat logic, like getters that calculate the current score and if the game has ended. Pair those with a custom Codable implementation, and you’ve moved the majority of the logic to the server.

… and What Didn’t

The fact that I’m representing events to and from the server as enums, instead of using Vapor’s routing system, was a result of tacking on another thing I wanted to learn about, and trying to loosely hew to the nominal course objectives. The official version of the project used WebSockets for all the communication. Vapor supports WebSockets. Great combo, right?

Well, sure, but it meant I did almost nothing with the actual routing. Instead I re-implemented a lot of it by hand, and not in a very clean way. Vapor doesn’t scope things the way I expected – based on some experimentation, it instantiates a single copy of your controller class and reuses it, rather than having one per connection. So instead of having nice class-level storage of variables, and splitting everything up into functions with the main one handling routing, it all wound up crammed into the main function. Just so I could maintain the proper scope on variables. I’m still not happy about it.

What’s Next

I’d like to keep tinkering with Vapor. When I’ve got the time, I have a project in mind where it seems like a good fit.

In the meantime, I hope their documentation improves a lot. The docs they have are good tutorials, and cover their material well; they also, it feels like, leave out the lion’s share of the actual framework. By the end of the project, I’d given up on the docs and was just skimming through the source code on GitHub, trying to find the implementation of whatever I was trying to work with. (This, by the way, doesn’t work with Leaf, the templating engine – the docs are basically nonexistent, and the code is abstracted enough that you can’t really skim it, either.)

Complaints aside, I still like Vapor. I picked up a book on the framework, which seems like a pretty good reference on the topic.

And hey, it was a neat little project. (The JavaScript is a disorganized mess, but it’s also aggressively vanilla – while the rest of the class was learning about NPM, I decided to see how far I could get with no JS dependencies whatsoever. Answer: very.) Check it out, if you’d like:

Categories
Review

“alt.sherlock.holmes”

Jamie Wyman, Gini Koch, Glen Mehn
I’ve probably mentioned before that I’m a sucker for Sherlock Holmes stories. If not, you may have been able to figure it out, based on the number of books I’ve read in the genre.1 I believe I picked this one up as part of a Humble Bundle (or Storybundle, more likely) based entirely on the fact that there was a book in there titled “alt.sherlock.holmes.”
And for that, it was worth it, because this was quite fine. Three different takes on Sherlock Holmes, all unique and interesting. I’ll say right off that my favorite was the second of the three — almost the inverse of Elementary, in a way, with handsome Dr. Watson being recruited by a still-named-Sherlock, definitely-just-miss-Holmes to investigate some very Hollywood murders. The third take, featuring Sherlock and Watson in 1960s New York, was more traditional in its take—Mycroft, I think, being the biggest difference from my mental image of him, as he’s gone a bit more sinister—although having the two actually sleeping together was a nice touch.2 The first was the furthest-out, with Sherlock not especially being a detective, and the setting—a circus—by far the most unique. Unfortunately, it was also the most predictable; in the larger story told there, I picked out the culprit within the first chapter. Still, it was an interesting read.3
All in all, if you like a good Sherlock Holmes story, give these a read.


  1. And those were just the ones that I could find by searching my archives for “Sherlock Holmes”; I know off the top of my head that there’s at least one more. 
  2. I know a few people have written theses about the queer theory of Sherlock Holmes, and I tend to like those interpretations. Historians have gone to great lengths to erase queer people from history (yep, nothing gay at all about Shakespeare writing a bunch of love sonnets to a man, let’s just… republish those with all the pronouns swapped, shall we?) and I am all in favor of putting some of that queer history back, even if it’s in the form of fiction. 
  3. Admittedly, the 1960s version was also quite predictable, but that’s because I took a history class on the 1960s and picked up a great deal of well-informed cynicism as a result. 
Categories
Review

“Redemption’s Blade”

Adrian Tchaikovsky 
This fledgling series, I found out by trawling through Wikipedia a bit, is called “After the War,” and that’s a fitting title if ever I heard one.
The book has extreme Dungeons and Dragons energy. You could use the setting for a game with absolutely no issue, and even the pattern of events in the book feels episodic in the way that a long-running campaign does. What’s really interesting, though, is that the book opens in the aftermath of that long-running campaign. The Big Bad is dead; the gang broke up, and our protagonist already has the endgame-level weapon, an infinitely sharp sword. (Her first side quest, for reference, is trying to find a scabbard that will last for more than a couple hours, so she can walk around without worrying about accidentally cutting off someone’s leg by bumping into them.)
What I really liked about the book is that it’s all about the forgotten bits of world building. Sure, the Big Bad is dead, but that doesn’t change the fact that he’d assembled a massive army, half of which were unnatural abominations created via dark magic. The lands he conquered are still devastated. The nations he crushed don’t magically spring back into being; their scattered (and, largely, dismembered) peoples can’t just reappear back in their homelands, none the worse for the wear. And the grand coalition, all the free nations of the world banding together to fight against the army of darkness? Well, politics kicked back into gear pretty quickly.
“Redemption’s Blade” is one of the best books I’ve read recently, and I can absolutely recommend it to. Give it a read.

Categories
Review

“Harry Potter and the Cursed Child”

J.K. Rowling, Jack Thorne, John Tiffany
I am disappointed and intrigued.
Let’s start with the disappointment: First, that JK Rowling managed to create a couple characters with truly excellent chemistry, and then aggressively refused to let it actually happen. (And here is where I say that I’m disappointed but not surprised, because she isn’t exactly the most woke about queer representation.)
Secondly, that this is such a weird development for some of the characters. What’s going on with Ron? Ron is a complex and interesting character, who the movies didn’t do justice, and got turned into something barely more than comic relief in Cursed Child.
(And here’s where I throw the spoiler warning; the play-and-book have only been out for three years, and if you’re like me, that’s not enough time to guarantee you know how it goes.)
And thirdly, that this completely breaks some of the rules the original series had established. (Though, admittedly, Fantastic Beasts did that first — apparently magic in the ‘30s was a couple of orders of magnitude more powerful? Why?) In the books, time travel had rules that made sense. Your can’t cause a paradox, because you’ve already time traveled. Here, though, suddenly we care about the grandfather paradox?
And yet, I’m still intrigued. Because Albus and Scorpius are fun together. Because it’s another look into the magical world that was the shared childhood of my generation. Because it’s written as a play, and I cannot fathom how they would stage some of this.
It’s an alright read, doesn’t take too long, so if you’re at all interested, give it a go. And if you’ve got a chance to see the actual play… that’s probably worth the time, just to see the staging.

Categories
Review

“Creative Confidence”

Tom Kelley, David Kelley
There something about this genre of book that just doesn’t sit right with me.1 I appreciate the points that they’re making, but it always feels like 80% of the book is one big humblebrag about all the people the author has worked with. How many big-name companies can we name-drop? Why yes, I have worked with Proctor & Gamble, how ever did you notice?
I suppose part of it is that they’re trying to establish why you should listen to them, and demonstrate that the ideas are good, which is a valid thing to do. In execution, though, it always feels excessive. Like a good editor could cut at least half of the book away without actually losing anything of use, but opted not to because the result would be too short and necessitate a lower price.
All of which is to say, this is definitely one of those business/self-help books, and it could be edited down into a pamphlet if you really wanted. But it was still interesting to read—the ideas are good. It’s almost like running one of the most famous design firms in the world and teaching at one of the most prestigious schools of design actually means something! Give it a read, if you’re interested. (And no, being creative isn’t a prerequisite—that’s one of the key points of the book. Spoilers.)


  1. In this case, I think “this genre of book” means “if you told me they gave a TED Talk espousing these ideas, I would be utterly unsurprised.” 
Categories
Programming Tools

Playlister

In the past couple months, I’ve had an ongoing series on converting iTunes playlists to text files, with a brief digression into scripting with Swift. While I doubt that I’m entirely done with the topic, I have reached a point where I’m ready enough to do another write-up.
This morning, I made playlister available to the public. It is not a consumer-facing application like my others; it is very much a tool for people who are comfortable with the command line.
In between the previous iteration of this tool and the current, I actually had a version of playlister built and shareable (Chase has that version installed on his Mac, actually) but, before releasing it to the public, I looked at the code and thought “I can do better.”1
So I buckled down and spent some time indulging in my love for API design, and tried some tricks I’ve been wanting to try.
The rewritten version ships with a library, LibPlaylister, that provides the basic ideas — protocols that allow for interacting with the library, playlists, and tracks; conversion to Markdown — as well as some neat new tricks. There’s some hooks for customization, such as the RatingFormatter protocol, and included FiveStarRatingFormatter, and the new LinkStore protocol, which provides a layer of abstraction on the SQLite-based caching of links.2
It was also an excuse to add to my Swift toolbox. I worked with SwiftCLI for a while, and then converted to ArgumentParser when that was released. I’ve done file interactions, and a lightweight database. I’ve learned a lot about Swift Package Manager.3 I learned a bit about XCTest, and figured out how to get it working in GitHub Actions. (And, more interestingly, figured out how to conditionally include frameworks in an SPM package. I wanted the tests running on Linux, but Linux… doesn’t have the iTunesLibrary framework, shockingly.)
I had fun building this, and will probably continue to tweak it. (I mean, it could be fun to get it automatically pulling links from the iTunes Search API, and just asking ‘is this the right link?’ instead of requiring manual entry.4)
For now, though, it’s ready enough to share, and made for a fun write-up and a good way to de-stress by tinkering.


  1. Interesting aside from giving that to Chase: Did you know that macOS has a ‘quarantine’ flag it puts on executables sent via AirDrop? That was some fun googling to figure out. The solution: xattr -d com.apple.quarantine ./playlister 
  2. That caching is definitely the biggest productivity gain of this, as compared to the previous version — now, when I go to write up my monthly playlist, the whole first part of the playlist doesn’t require any interaction at all. 
  3. Coming from working with nom’s package.json format at work, SPM Package.swift files are nice. Like, you can have comments in them! And, more, you can have actual code, so you can do neat stuff like this
  4. Although, at that point, I’d probably wind up writing it up as a SwiftUI app so I can show images. Which… might have been part of the inspiration for making LibPlaylister a separate library. 
Categories
Education

User Testing

I am rather bad at the whole concept of relaxation. I say this as an introduction, because writing this post is my idea of taking a break from putting together the final presentation for my class on user testing.
The course has been interesting overall. I will readily admit that I don’t intend to make a career of user research, but I am glad I’ve had the experience. Research is, after all, critical to design and development both. We can try to stick to the whole “if we asked people what they wanted, they would’ve said ‘a faster horse’” thing, but, shockingly, we actually aren’t omniscient. We aren’t our users.
Throughout the course of the course (and now you can tell my brain is a bit fried, because I’m throwing in wordplay), we’ve used a few different techniques. My favorite so far has been card sorting: it’s easy to explain, quick to do, and works very well for figuring out a sensible way to organize a bunch of stuff.1
I also quite enjoyed the competitive analysis assignment—going through, as best as I could, the entire market for a specific category was a surprisingly fun challenge. It’s also immediately visible how useful it is, from a strategic perspective: at the end of that assignment, I closed out an open project I had where I’d been putting together sketches for a fitness application. While it would’ve been fun to build, it really wouldn’t have had anything truly unique to establish itself in the market, and I’m too much of a Broke Millennial to be able to devote that much time to ‘fun to build.’2
We also did some quantitative and qualitative user testing, which I found interesting, but also served as the main argument for my “I don’t have a career as a researcher ahead of me” stance. Interesting, yes; useful, when done right; surprisingly difficult to do right, absolutely.
The qualitative structure was a bit more forgiving than the quantitative. We used UserTesting.com, which has a well-polished interface for assembling a test, a slightly less well-polished interface for going through a test, and a checkout page that leaked memory at an astonishing rate.34 Those complaints aside, the actual data I got was very helpful—the biggest issue I had with it was because of my own mistake, and the more open nature of the test meant that even that failure helped me sort out the answer to a different question I had.5
Going into the class, I thought I was going to like the quantitative testing more—I majored in computer science, and threw in a minor in math at the end, I’m a Numbers Guy. In execution, though, I wasn’t a fan. Part of this is probably due to the software we used: I was utterly unimpressed with Loop11. Their test assembly and reporting interface felt very Web 2.0, which I always find a bit alarming for an online-only business, and while the test-taking interface was a bit better (hello, Material Design 1.0!) it was unusable in Safari and a privacy disaster waiting to happen everywhere else.67 And for all that trouble, the data I got wasn’t all that useful. Though, a caveat to that: quantitative testing is more appropriate for summative testing, verifying that your completed design/product works as it’s supposed to, and I won’t be in a position to actually do that sort of testing for, oh, months at the earliest. Certainly not in time to use the results for this class, so I misused the technique a little bit in order to have something to work with.
As I said at the start, though I don’t intend to make a career of this, I’m glad to have taken the class—at very least, it means I’ll have that much more respect for the work my colleagues who do make a career of it are doing. And I sincerely doubt that this will be the last time that I do some testing myself; it’s important to do, and I quite like having the data to validate my designs.


  1. You can do it with actual cards, if you have time and are actually in the same place as your participants. If not, you can use online tools. We used OptimalSort, which is available as part of the OptimalWorkshop suite of tools. If that’s the only thing you’re going to do with it, I honestly can’t recommend it, because while it’s a good tool, it is not, on its own, worth the price. (Having seen their pricing structure, am I considering breaking into that market? Only vaguely.) 
  2. But hey, while we’re on the topic, check out some of my apps
  3. I left the tab alone for ten minutes and came back to 30,000 error messages in Safari’s console and about 2 gigabytes of RAM consumed. On their checkout page. C’mon, folks, that’s just embarrassing. 
  4. To be fair, I’ve got a pile of content blockers enabled, and at a quick glance quite a few of the error messages where a result of that. On the other hand, you shouldn’t be throwing that many little privacy-violating scripts at people to start with, and you definitely shouldn’t be doing it so badly
  5. I’m being intentionally vague about what I was actually testing, because it’s something I may yet fully develop, and I don’t talk about things until they’re good and ready. 
  6. I suspect Safari’s refusal to work with it was related to the latter concern; I didn’t dig into what was going wrong, just threw my hands in the air in disgust and installed Firefox. 
  7. As far as I can tell from some cursory inspection of the functionality of their ‘no code’ feature, it works by having your testers install a browser extension that… executes a man-in-the-middle attack, of sorts, on every page they view. When asking people to do the test, I told them to install the extension, do the test, and then immediately uninstall the extension—and that because I didn’t want to try walking people through installing a completely separate browser to do it in, like I did. 
Categories
Programming

Relational Databases

Inspired by a mix of Julia Evans and how much fun I had last time, I threw together another sketchnote on the basics of relational databases.

Relational Databases: How we store data! They model relations between things. Databases have tables, which have rows and columns.  A column has one type of data, like CHAR, VARCHAR, and NVARCHAR for text, INT, BIGINT, FLOAT, and DOUBLE for numbers, BOOL for booleans, and DATETIME for dates and times. Columns can also be nullable, which basically means ‘optional.’ Having a single type of data per column allows databases to be very fast and efficient. Rows are the actual data in the database, and are also referred to as ‘records’ or ‘entries.’ Keys: a table has a column as its primary key. That means that each row has a unique value there, which you can use to identify the row. Kinda like a social security number, or your phone number - it’s uniquely yours! A foreign key is a value that is the primary key of another table. You can use it to reference a row in a different table.
(Obviously I’m skipping over a lot of detail, but as a very quick intro to what a relational database is, I think it works!)