I was genuinely surprised that I don’t have another review to reference here — I would swear that I wrote one about the book where these characters were first introduced, Murder on the Titania, but apparently not.1
So, the introduction: in the Sherlock Holmes style, very vaguely. Zombies, and steampunk, and all the other internet buzzwords abound, but it works surprisingly well together. The primary arc of the first story can be summed up with the image of a Native American man and a Latina woman rolling their eyes as an elderly white man tries to convince himself he’s the hero because he’s slightly less of an imperialist than the bad guy.
And if that hasn’t sold you on the concept, I’m not sure what will. It’s a fun little read, check it out.
I do love a good anthology. It’s all the fun of starting a new book, several times over, and with much less of a time commitment each time.
This did have some of the downside, though – about halfway through, I found myself getting rather bored of the concept of pirates. It’s a bit too coherent a theme, I feel; the book had a lot of the variance that makes anthologies fun, but keeping everything tied to ‘pirates’ limited it a bit more than is really healthy for an anthology.
After that midway nadir, though, it recovered nicely, going off into some interesting science fiction bits, and ending on a delightfully weird fantasy (or, possibly, extremely-distant-future?) piece.
So hey, have some fun with a variety of pirate stories.
Erin M. Hartshorn
“This feels like an indie novel,” I told one of my friends as I was reading it. “The content is really interesting, but the title says ‘there wasn’t an editor.’” Looking at the cover now, I’m doubling down on that statement. It looks, honestly, ridiculous. But it was also one of the most fun books I’ve read recently.
It also feels like it’s setting up for a series, both in the subtitle and in the amount of world-building it contains, which I’m pretty okay with. That world building was quite interesting, and I’d like to see what Pepper does next. It’s a fascinating blend of little and big stakes — competing for promotion from ‘assistant manager’ to ‘manager’ at work, a bit of relationship drama, and, oh, a serial killer.
Which leads me to the other thing I said to someone about this book as I was just starting to read it. “It feels like the plot is going to be a Scooby Doo episode, just a real estate developer using ghost stories to drop property values… except they’re murdering people so that they’re Actual Ghosts.”
And hey, if that doesn’t sound like a fun book to you, then… you’re reading the wrong blog for book reviews. Give it a read.
Following my recent post on form design, I thought it might be interesting to take a look at what is, in the US, one of the most universal forms: the ballot.
This sits at the intersection of my interests in design and civic engagement. It’s also a much more controversial topic than I’d normally touch with a ten-foot pole, but here I am.
(‘Pole/poll’ pun? Absolutely intended.)
And first, an admission: that image up top, of people at a polling station? That’s an utterly alien concept to me. I’ve never been to a polling station; I live in Oregon, a state that finished moving to universal vote-by-mail when I was in elementary school.
Now, vote-by-mail is a very controversial topic these days, but as someone who grew up with it, I thought it would be interesting to do a case study of how it works in Oregon.
Vote by Mail: A Case Study
Overall, the user experience of voting in an election in Oregon is, to my eye, already a ways ahead of most of the rest of the country. There’s still room for improvement, though.
So, what is Oregon doing right, and what are we doing wrong?
In doing the research for this article, I found out that “register when you get your driver’s license” went from “… if you fill out this extra piece of paper while you’re at the DMV” to being an automatic process, thanks to the amusingly-titled “Motor-Voter Law.”
Ease of Information
While I can’t say we don’t have our share of crappy political ads, the state has a standard way of providing information on everyone running: the voting pamphlet, sent to every household prior to the election. (They are also available online.)
(Image credit: Statesman Journal)
These pamphlets, nice as they are, aren’t perfect. The actual process for putting information in them is a touch convoluted, and surprisingly unregulated. While each entry mentions where the information comes from, and plagiarism or misquoting are banned, there is nothing enshrined in law (or policy) to prevent misleading entries.
Let’s take a look at the information architecture of the section on a single ballot measure.
At the top, the easily-memorable measure number takes precedence, followed by the shortest-form summary, the title.
Each measure has a very clear summary section, as well as the “Result of ‘Yes’ Vote” and “Result of ‘No’ Vote” area, which state, very explicitly, what each bubble on the accompanying ballot will do.
But then things break down, with “Arguments in Favor” and “Arguments in Opposition.” This is an official state document; everything about this measure, so far, has been as factual and rigorous as one could hope. These arguments, though, are unregulated beyond “no plagiarism, no misquoting people.” If you want to write a 350 words of “why you should vote against this,” pay the fee to have it entered in, and file it as an “Argument in Favor” there’s nothing to stop you.
And that’s a problem. This is an official state document; it’s got the seal on the cover, and a lot of very solid information in it, giving it credence. Unverified information in the Arguments gains legitimacy by association.
For comparison, let’s take a look at a different state.
California’s voter pamphlets are laid out very differently. The first thing that caught my eye – and made assembling this comparison in a visually-pleasing way rather difficult – was that the ballot measure doesn’t have a table of contents.
To save you a great deal of scrolling, I’ve pulled together the section headings from the 2020 Voter’s Pamphlet, Proposition 20, and summarizing somewhat:
Official Title and Summary
Summary of Legislative Analyst’s Estimate of Net State and Local Government Fiscal Impact
Analysis by the Legislative Analyst
(Specific Proposal Title)
Argument in Favor of Proposition
Rebuttal to Argument in Favor of Proposition
Argument Against Proposition
Rebuttal to Argument Against Proposition
Distinctly more words to it, but notice some key differences:
There’s an actual analysis of the legislation, expanding beyond the fiscal impact to the actual outcomes of the bill. This is provided by the Legislative Analyst’s Office, who are explicitly nonpartisan.
Arguments in favor and against are paired with rebuttals, allowing for more of a dialog between sides.
Note, however, that there’s still no legal requirement for an “argument in favor” to actually be in favor. There is a strong precedent for judicial intervention, which is something of an improvement, at least. And the typography makes a statement, too.
On the left, the Analysis by the Legislative Analyst. It’s rich text – there’s use of bold to highlight key points, and various levels of headings to organize it. On the right, the Arguments, sans formatting. They’re also in a smaller font size, and have their own unique style of heading. In short, the Arguments look different, providing a subtle reminder that this section is not the product of the nonpartisan election officers.
And now, back to the other aspects of the election. But first, a reminder to find other sources of information on the candidates and ballot measures. As a good starting point, I recommend Vote411, from the League of Women Voters, and Ballotpedia.
Ease of Voting
A few weeks before the election, the Oregon Department of State mails out ballots to all registered voters. The package includes the ballot, a return envelope, and a second ‘privacy’ envelope that you can use if you’re worried somebody might be able to see the contents of your ballot through the outer envelope.
One of the inspirations for this post was the American Institute for Graphic Arts’ “Design for Democracy” program. They did a larger-scale version of my research on form design, investigating and determining best practices for ballot design.
Let’s take a look at a (reasonably) representative sample of an Oregon ballot. This comes from the 2020 primaries, courtesy of Lincoln County:
It’s actually pretty good. The visual design follows most of the guidelines, although the “Write-in” lines and text need a bit more space. The main issue I see is the instructions – they’re fairly clearly written, but they are written. Pairing them with a visual explanation – the cartoons, in AIGA’s example – makes them even easier to follow.
The UX of Elections
Elections in the US, being controlled at the state level, rather than federally designed, are something of an ongoing A/B test. We can see different electoral systems in use across the country, and use opinion polls after the fact to judge how well-represented people feel by the results.
Were I polled right now, I’d feel fairly happy with how my state handles things.
So, what are the key action items for, say, another state, looking to implement some of Oregon’s best practices?
Reduce the friction of voting. Make it easy to register, easy to get your ballot, easy to fill out your ballot, and easy to turn it in.
That’s it, that’s the list, the whole idea. Make it easier to vote, by whatever means possible. I’m an advocate for doing so by enabling universal mail-in-voting, thanks to some of the inherent benefits:
No standing in line, or going into cramped polling places – an excellent benefit during a pandemic!
Voting on your own time, rather than needing to take half a day off to wait in line. (‘On your own time’ within reasonable limits – there’s still a deadline to get it turned in on time.)
But, of course, I’m not done. I have some recommendations for Oregon, as well:
Validate the voting pamphlet materials. Don’t just trust what people submit, make sure it’s actually espousing the viewpoint it claims. Do some fact checking, while you’re at it.
Visually distinguish public submissions. Use some gestalt principles – things that are close together, and look similar, look like they’re part of a group. Move the public submissions a little further away, and make them look different, to remind people that they aren’t from the same source as the rest of the material.
Demonstrate how to fill out the ballot. The instructions are fairly well-written, but “comfortable reading English” should not be a requirement to vote.
Postscript: while I’m advocating for improving voting, I am absolutely not advocating digital voting. No.No, no, no.
For form design, cognitive load theory can be boiled down to the idea that people only have so much space in their brain, so don’t overfill it. The exact amount varies depending on context: is the information auditory or visual?1 What stage of processing are you going through? (Gwizdka 3)
Techniques for Reducing Cognitive Load
Produce less cognitive load. Intrinsic cognitive load is necessary to what the user is trying to do; extrinsic is work because the design surrounding the goal is bad (Hollender et al. 1279; Feinberg & Murphy 345).
Use multiple modalities. Mixing visual with auditory, for example, allows users to distribute the cognitive load across multiple cognitive subsystems (Oviatt 4).
Do the work for them. Pre-filling known fields (i.e., a user’s name and address when they’re already signed in) moves the cognitive load from the user to the computer, saving the user the effort (Gupta et al. 45; Winckler et al. 195).
Cognitive Load in Human-Computer Interaction
Under heavy cognitive load, users work slower, and may commit more errors (Rukzio et al. 3). From a young age, humans are goal-oriented; slowing them down as they work towards these goals, unless explicitly a design goal, can only cause frustration (Klossek et al.). Reducing cognitive load leads to happier users.
Applying Cognitive Load Theory to Form Design
Cognitive load theory gives us several key takeaways:
Indicate which fields are required. Provide a clear indicator of what is required so your users don’t have to guess (Bargas-Avila, Javier A., et al., 20 Guidelines 5).2
Pre-fill data when possible. Use available sources—an existing account, or on-device sensors—to save the user the effort. However, if that data might not be accurate, don’t guess; leave the field blank to prompt the user to enter the correct data (Rukzio et al. 3-4).
Don’t interrupt the user by validating data. Real-time validation is fine, as long as it doesn’t force the user to switch from ‘completion mode’ to ‘revision mode’ (Bargas-Avila, Javier A., et al., Useable error messages 5).3
There has not been any research into the combined effects of marking required fields and pre-filling fields; however, we can extend the conclusions in the first two points, above, as such: a required field, even if pre-filled, remains required, and should be marked as such.
Baddeley, Alan D., and Graham Hitch. “Working memory.” Psychology of learning and motivation. Vol. 8. Academic press, 1974. 47-89. Bargas-Avila, Javier A., et al. “Simple but crucial user interfaces in the World Wide Web: introducing 20 guidelines for usable web form design, user interfaces.” (2010). Bargas-Avila, Javier A., et al. “Usable error message presentation in the World Wide Web: Do not show errors right away.” Interacting with Computers 19.3 (2007): 330-341. Budiu, Raluca. Marking Required Fields in Forms. 16 June 2019, www.nngroup.com/articles/required-fields/. Feinberg, Susan, and Margaret Murphy. “Applying cognitive load theory to the design of web-based instruction.” 18th Annual Conference on Computer Documentation. ipcc sigdoc 2000. Technology and Teamwork. Proceedings. IEEE Professional Communication Society International Professional Communication Conference an. IEEE, 2000. Gupta, Abhishek, et al. “Simplifying and improving mobile based data collection.” Proceedings of the Sixth International Conference on Information and Communications Technologies and Development: Notes-Volume 2. 2013. Gwizdka, Jacek. “Distribution of cognitive load in web search.” Journal of the American Society for Information Science and Technology 61.11 (2010): 2167-2187. Harper, Simon, Eleni Michailidou, and Robert Stevens. “Toward a definition of visual complexity as an implicit measure of cognitive load.” ACM Transactions on Applied Perception (TAP) 6.2 (2009): 1-18. Hollender, Nina, et al. “Integrating cognitive load theory and concepts of human–computer interaction.” Computers in human behavior 26.6 (2010): 1278-1288. Klossek, U. M. H., J. Russell, and Anthony Dickinson. “The control of instrumental action following outcome devaluation in young children aged between 1 and 4 years.” Journal of Experimental Psychology: General 137.1 (2008): 39. Oviatt, Sharon. “Human-centered design meets cognitive load theory: designing interfaces that help people think.” Proceedings of the 14th ACM international conference on Multimedia. 2006. Pauwels, Stefan L., et al. “Error prevention in online forms: Use color instead of asterisks to mark required-fields.” Interacting with Computers 21.4 (2009): 257-262. Rukzio, Enrico, et al. “Visualization of uncertainty in context aware mobile applications.” Proceedings of the 8th conference on Human-computer interaction with mobile devices and services. 2006. Stockman, Tony, and Oussama Metatla. “The influence of screen-readers on web cognition.” Proceeding of Accessible design in the digital world conference (ADDW 2008), York, UK. 2008. Tullis, Thomas S., and Ana Pons. “Designating required vs. optional input fields.” CHI’97 Extended Abstracts on Human Factors in Computing Systems (1997): 259-260. Winckler, Marco, et al. “An approach and tool support for assisting users to fill-in web forms with personal information.” Proceedings of the 29th ACM international conference on Design of communication. 2011.
The foremost theory splits it into three: the phonological loop (sound), the episodic buffer, and the visuospatial scratchpad, all controlled by a central executive (Baddeley & Hitch; the episodic buffer was added by Baddeley in a later revision than that cited here). ↩
There is some dispute over what makes the best indicator; the general consensus in industry is to use asterisks to mark required fields (Budiu). Studies have shown, however, that using a background color in the field to highlight required fields performs better (Pauwels et al.), which in turn is outperformed by physically separating the required fields from the optional ones (Tullis & Pons). All, however, agree that it is preferable to mark the required fields, rather than the optional. ↩
Non-interruptive real-time validation, say by adding error messages beneath invalid fields, works well for sighted users. Be aware, however, that screen reader software struggles with dynamically-updating pages (Stockman & Metatla); avert this accessibility problem by providing both real-time and on-demand validation, presenting errors in a modal fashion when the user attempts to submit the form with invalid data. ↩
Oh, this book got me. I’ve got a Diana Wynne Jones feeling about it — it took a while to grip me, and then suddenly I caught myself thinking “well, how long will it really take me to finish reading this?” and staying up way later than I should’ve to see where it was going. It’s absolutely a slow start, and (given that I had no memory of buying the book/what it was about) I had no idea where it was going.1
And, as always, what really got me was the worldbuilding. It’s distinctly uncooperative at the start — the character who has the most interesting secrets, who knows the most about what’s going on, starts of being super cagey about it all. So even though Alan, the protagonist, is just as inquisitive as you’d want a protagonist to be, there’s no exposition-dump at any point. What you learn happens in a slow trickle, bits and pieces coming up as the story needs them. It’s a dangerous way to do it — done badly, it feels like the author is making it up as they go along — but, in this case, it worked well. I’m interested to see where the series goes: the main plot wraps up in a surprisingly neat bow at the end, but there’s a couple threads by the wayside that very clearly show this was meant to be a series.
So, hey, I liked the book. Check it out.
And, really, that’s the most fun part of this whole “read all the books I have on my Kindle that I don’t remember buying” project — everything’s a surprise! Everything on here was chosen by someone who’s got a reasonable idea of what I like (by which I mean ‘Past Grey’), but they didn’t tell me anything about any of them, I can just see the title and author. ↩
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.
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.
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. ↩
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.
Having occasionally had to clean the men’s locker room when I was working at the pool, I can relate. ↩
If I’m going to make Buffy references, I should probably watch the show at some point. Or at least read the Wikipedia summary. ↩
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.
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.” ↩
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.
… 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! ↩
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.)
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.
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.
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.
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.
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.
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 numberof booksI’ve readin 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.
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.↩
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. ↩
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. ↩