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.)
Author: Grey
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.

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.
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.
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:
JupyterLab File System Research

We’re currently wrapping up the spring quarter, and this seemed like an opportune moment to pause, catch my breath, and go back over some of the work that we’ve done so far.
And I will, first, pause to say that my use of ‘we’ there is very deliberate. I am part of a wonderful team of designers and researchers, working on the file system in JupyterLab:
- Justin Lischak Earley, project manager
- Jana Abumeri, research lead
- Nick Straughn, researcher
- Emily Fan, design lead
And myself, in a design role.
After years of being a developer, my first serious involvement in the world of open-source is as a designer. How about that?
So, what have we done so far?

Heuristic Evaluation
We began with a heuristic evaluation of JupyterLab, going through the process of setting up and using the file browser, and identifying key pain points.
We used Nielsen’s ten heuristics, and assigned a severity rating, from low to high, to problems. And, not to be all negative, we also highlighted some key strengths.
Why do a heuristic evaluation?
A heuristic evaluation is a great starting point. It’s a low-cost way to go through an entire interface and identify usability problems, and it’s quick, too.
Working asynchronously, have each of your panel members — and, in this case, the panel consisted of the five of us on the design team — individually go through the interface, making a note of any usability issues they see. Once everyone is done, combine the lists, merging similar/identical items.
Research shows that this technique works, even if the people doing the evaluation aren’t subject matter experts.

Competitive Analysis
Next, we identified several competitors to JupyterLab, direct and indirect, and some influencers — products that aren’t competing with JupyterLab, but could offer some design inspiration.
Why do a competitive analysis?
In short, because it’s really helpful to know what your competition is up to. Are there features they have that your users need? That’s a problem. Do you have something cool that your competitors don’t come close to? That’s a marketing opportunity.
It’s a chance to see what the state of the art is, and what market niches are un-filled. (Like, for example, the lack of good sharing features I highlighted in my last competitive analysis.)

Sketches & Wireframes
While the research team continues with interviews and surveys, Emily and I started in on sketches and wireframes of the new file browser.
Why sketch/wireframe?
Because it’s too early to be pushing pixels.
Design is an iterative process: research feeds design feeds research feeds design. The initial research gave us our starting point; now, we make sketches, wireframes, and low-fidelity prototypes. The research team will take those and test them. What they learn will feed the next set of prototypes, and the cycle continues.
Especially early on in the process, you want to go low-fidelity; not only because it’s easier, but because it looks easier. If you make something pixel-perfect and beautiful, it looks like a finished project; the people testing it feel bad for pointing out what’s wrong with it, and stay silent, and those flaws work their way into the final product. Nobody’s happy.
What’s next?
We’ve got some more research deliverables that we’re in the process of wrapping up, which I will (eventually) post about here. And then, prototyping and testing!
Playlist of the Month: May 2020
Eventually I’m gonna have time to update my command-line thing to support editing the links database, and not just adding to it. Y’know, sometime in the distance future when I actually have free time.
Cologne – Haux on Something to Remember – EP
Sober – Edwin Raphael on Sober – Single
Falling Down – Harrison Storm on Falling Down – Single
Angel – H. Kenneth on Angel – Single
F**k Collingwood – Hayden Calnin on F**k Collingwood – Single
Don’t Take the Money – Harry Strange on Don’t Take the Money – Single
This is Where it Ends – Richard Walters on This is Where it Ends – Single
Blinding Lights – The Weeknd on Blinding Lights – Single
Let Me Down – Run River North on Monsters Calling Home, Vol. 2 – EP
I Gave It All – Aquilo on Painting Pictures of a War – EP
Somewhere (feat. Octavian) – The Blaze on Somewhere (feat. Octavian) – Single
Slowly – ODIE on Slowly – Single
Lie – Jake Scott on Year of the Sunflower
All My Life – William Wild on Rental House / All My Life – Single
New Shapes (feat. Octavian) – Diplo on Europa – EP
Four in the Morning – Harry Strange on Four in the Morning – Single
Girls – Balcony on Girls – Single
Numb – Elderbrook on Numb – Single
Morning Prayers – Steve Benjamins on Morning Prayers – Single
In Your Eyes – The Weeknd on After Hours (Deluxe)
It’s Getting Worse – Gavin Haley & Mokita on It’s Getting Worse – Single
scorton’s creek – Isaac Dunbar on scorton’s creek – Single
Mean It – Lauv & LANY on ~how i’m feeling~
Just Asking – Aquilo on Just Asking – Single
Can’t Get You out of My Head – Mattis on Can’t Get You out of My Head – Single
Just Say Something – Nathan Ball on Just Say Something – Single
After All – Miles Hardt on After All – Single
Lonely Star – Oh Wonder on Lonely Star – Single
Devil On My Back – ferdinant. on Devil On My Back – Single
Church – Charles Fauna on Yonder
Been Thru This Before (feat. Giggs, SAINt JHN) – Marshmello, Southside, Giggs & SAINt JHN on Been Thru This Before (feat. Giggs, SAINt JHN) – Single
I Love You Always Forever – Donna Lewis on Now In a Minute1
Heavy – Haux on Violence in a Quiet Mind
Enough For You – Lani Rose on Enough For You – Single
PDLIF – Bon Iver on PDLIF – Single
Let There Be Light – Alex Sampson on Let There Be Light – Single
Nunca Estoy – C. Tangana on Nunca Estoy – Single
Friday – Charles Fauna on Eulogy – EP
Sunlight – Maty Noyes on Sunlight – Single
No Man’s Land – HAEVN on No Man’s Land – Single
Poison (feat. Take A Daytrip, Obongjayar & Santi) – Octavian on Poison (feat. Take A Daytrip, Obongjayar & Santi) – Single
Goliath – Woodkid on Goliath – Single
Dream Alone – Rydyr on Dream Alone – Single
Stains – Fyfe & Joel Baker on Stains – Single
ghost – Zachary Knowles on magnolia – EP
I Dare You (Unplugged) – Amber Run on I Dare You (Unplugged) – Single
Fun – Terror Jr on Fun – Single
Lovesick – Trevor Daniel on Nicotine
Mars – Charles Fauna on Yonder
Wait to Come Over – Charles Fauna on Eulogy – EP2
Listen (with Ivy Sole) – Charles Fauna & Ivy Sole on Yonder
A Total Dream – Charles Fauna on Yonder
He Don’t Trust Me – Balcony on He Don’t Trust Me – Single
Unfortunate Love (feat. Harrison Storm) – Hayden Calnin on Unfortunate Love (feat. Harrison Storm) – Single3
Get Back – Alt Bloom on Get Back – Single
Savages – Council on Savages – Single
Peaked – EDEN on Peaked – Single4
Starboy (feat. Daft Punk) – The Weeknd on Starboy
Drown – Chance Peña on Drown – Single
I Love You’s – Hailee Steinfeld on I Love You’s – Single5
Parable – Mako on Parable – Single
Shades of Blue – noelle on Shades of Blue – Single
Bonkers – Dizzee Rascal & Armand Van Helden on Tongue N’ Cheek (Dirtee Deluxe Edition)6
Turn Away – Harry Strange on Turn Away – Single
Opps – Vince Staples, Yugen Blakrok on Black Panther The Album Music From And Inspired By7
Moonlight popolare – Mahmood & Massimo Pericolo on Moonlight popolare – Single
On & On – Fyfe & Joel Baker on Prayer Emojis – EP
Losing Myself – Andrey Azizov & LONDIN on Losing Myself – Single
After All – Jackson Penn on After All – Single
Alps – Novo Amor & Ed Tullett on Alps
Good Together – Shallou & Ashe on Magical Thinking
Guille Asesino – C. Tangana on Bien:( – EP
Palm Springs (feat. In.Drip.) – Luna Shadows on Palm Springs (feat. In.Drip.) – Single
2FU – Gavin Haley on 2FU – Single
Lost My Mind – FINNEAS on Blood Harmony
Sono un bravo ragazzo un po’ fuori di testa – Random on Sono un bravo ragazzo un po’ fuori di testa – Single8
- I’ve been putting together a playlist, on the side, of songs that remind me of my childhood. This may or may not have been the one that started that project. ↩
- Of all the Charles Fauna on this list, I think this is my favorite. ↩
- I was so excited when I saw this song pop up in New Music Weekly, two of my favorite artists at the moment. ↩
- New EDEN made me wish for new Majik, but Majik… doesn’t exist, I can’t actually find anything about either of the members anywhere online. I hope they’re doing okay. ↩
- In a similar but very different vein as I Love You Always Forever, above. ↩
- Got a couple songs from movie scenes in this playlist, dunno what’s up with that. ↩
- An excellent scene in an excellent movie. ↩
- I wish I’d started listening to modern Italian music back when I was still in undergrad, would’ve been fun to bring that to a class on classical Italian music. ↩
“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.
- 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. ↩
“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.
“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.
“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.)
- 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.” ↩
Permanence Objects
A while back, I went to a concert given by a friend of mine. It was her capstone presentation, a sort of thesis-equivalent for music majors. That sort of presentation is something I have some experience with, and so I’m pretty comfortable saying that Sabine knocked it out of the park with hers.
One aspect that I liked, especially compared to my blogging-it-after-the-fact style, was that she built the whole thing around a multimedia web experience. Every piece had, at very least, a page on the site with lyrics; one had a multi-page version that felt like a high-budget lyric video.
I’m going to continue to encourage her to put her music on the various paid streaming services so she can get at least a little bit of money from people listening to it, but in the meantime, please do check out her site, it is… an experience.
Playlist of the Month: April 2020
Remember back when time was a meaningful concept?
Cologne – Haux on Something to Remember – EP
Sober – Edwin Raphael on Sober – Single
Falling Down – Harrison Storm on Falling Down – Single
Angel – H. Kenneth on Angel – Single
F**k Collingwood – Hayden Calnin on F**k Collingwood – Single
Hard Lines, Hard Times – William Wild on Hard Lines, Hard Times – Single
everything i wanted – Billie Eilish on everything i wanted – Single
Don’t Take the Money – Harry Strange on Don’t Take the Money – Single
This is Where it Ends – Richard Walters on This is Where it Ends – Single
Borders – Nathan Ball on Borders – Single
Lies (feat. H. Kenneth) – Syence on Lies (feat. H. Kenneth) – Single
Blinding Lights – The Weeknd on Blinding Lights – Single
Magic in the Hamptons (feat. Lil Yachty) – Social House on Magic in the Hamptons (feat. Lil Yachty) – Single
Let Me Down – Run River North on Monsters Calling Home, Vol. 2 – EP
I Gave It All – Aquilo on Painting Pictures of a War – EP
The Box – Roddy Ricch on Please Excuse Me For Being Antisocial
Falling (blackbear Remix) – Trevor Daniel & blackbear on Falling (blackbear Remix) – Single
Somewhere (feat. Octavian) – The Blaze on Somewhere (feat. Octavian) – Single
Slowly – ODIE on Slowly – Single
Lie – Jake Scott on Year of the Sunflower
ROXANNE – Arizona Zervas on ROXANNE – Single
All My Life – William Wild on Rental House / All My Life – Single
Pines – ferdinant. on Pines – Single
New Shapes (feat. Octavian) – Diplo on Europa – EP
Prayers to the Trap God – Roddy Ricch on Please Excuse Me For Being Antisocial
Four in the Morning – Harry Strange on Four in the Morning – Single
Girls – Balcony on Girls – Single
not ur friend – Jeremy Zucker on not ur friend – Single
Light Again – bobbycrush on Light Again – Single
Baby Girl – Bryce Vine on Baby Girl – Single
Numb – Elderbrook on Numb – Single
Tongue In the Bag – XYLØ on The Ganglands of My Heart – EP
Faith – The Weeknd on After Hours
Hardest To Love – The Weeknd on After Hours
After Hours – The Weeknd on After Hours
Morning Prayers – Steve Benjamins on Morning Prayers – Single
In Your Eyes – The Weeknd on After Hours (Deluxe)
It’s Getting Worse – Gavin Haley & Mokita on It’s Getting Worse – Single1
Stars (feat. PRIDES) – ARCADES on Stars (feat. PRIDES) – Single
Walk Away – Eskei83 & H. Kenneth on Walk Away – Single
Too Late – The Weeknd on After Hours
I Can’t Help (with Sarcastic Sounds) – Shoffy on Flash
Snowchild – The Weeknd on After Hours
Peanut Butter Waffles – Ryan Caraveo on Peanut Butter Waffles – Single
Water Fountain – Alec Benjamin on Narrated for You
Not Like Falling Out of Love – Nick Wilson on Not Like Falling Out of Love – Single
scorton’s creek – Isaac Dunbar on scorton’s creek – Single2
Mean It – Lauv & LANY on ~how i’m feeling~
Redemption Song – Mahmood on Redemption Song – Single
Tati – Gavin Haley & Yung Pinch on Tati – Single
Just Asking – Aquilo on Just Asking – Single
Can’t Get You out of My Head – Mattis on Can’t Get You out of My Head – Single
Just Say Something – Nathan Ball on Just Say Something – Single
Marionette (feat. Carl Brave) – Random on Marionette (feat. Carl Brave) – Single
crowded room – Christian French on crowded room – Single
Missed You (Bonus Track) – The Weeknd on After Hours (Deluxe)
makeup drawer – Isaac Dunbar on Makeup Drawer – Single
K. – Reece on K. – Single3
After All – Miles Hardt on After All – Single
What Could Be as Lonely as Love (Unplugged) – Amber Run on What Could Be as Lonely as Love (Unplugged) – Single
Lonely Star – Oh Wonder on Lonely Star – Single
Devil On My Back – ferdinant. on Devil On My Back – Single
I miss you, I’m sorry – Gracie Abrams on I miss you, I’m sorry – Single
Pages (feat. Rory Hope) – JacobNeverhill on Pages (feat. Rory Hope) – Single
Learning to Live Again – DANIEL SAINT BLACK on Daniel Saint Black – EP
Young And Beautiful – Glass Animals on Young And Beautiful (Quarantine Covers Ep. 2)
Church – Charles Fauna on Yonder4
Been Thru This Before (feat. Giggs, SAINt JHN) – Marshmello, Southside, Giggs & SAINt JHN on Been Thru This Before (feat. Giggs, SAINt JHN) – Single
Bed (Live from Nest Recorders) – SYML on Live from Nest Recorders – Single
I Love You Always Forever – Donna Lewis on Now In a Minute
Heavy – Haux on Violence in a Quiet Mind5
Enough For You – Lani Rose on Enough For You – Single
PDLIF – Bon Iver on PDLIF – Single
Let There Be Light – Alex Sampson on Let There Be Light – Single
Magic – Coldplay on Ghost Stories
Shadow and a Dancer – The Fray on Helios
Nunca Estoy – C. Tangana on Nunca Estoy – Single
Friday – Charles Fauna on Eulogy – EP
Sunlight – Maty Noyes on Sunlight – Single
No Man’s Land – HAEVN on No Man’s Land – Single
Poison (feat. Take A Daytrip, Obongjayar & Santi) – Octavian on Poison (feat. Take A Daytrip, Obongjayar & Santi) – Single
Goliath – Woodkid on Goliath – Single6
- Warning: the chorus is likely to get caught in your head. ↩
- This is a rare one in that it made it onto my monthly playlist and one of my specific-mood playlists at the same time. ↩
- This song was nice and hard to find. The iTunes search algorithm hasn’t improved at all, and also kept crashing when I was trying to look things up. Helpful. ↩
- This is probably my #1 recommendation from this list. Listen to the whole album, actually, it’s quite good. (And the intro song feels intensely like the beginning of a ride at Disneyworld.) ↩
- I am extremely excited for this album. ↩
- New Haux and new Woodkid? It’s a good month for music. ↩
Personalization

Based on a reading from User Friendly.

Fluidics 2.0

At long last, I am quite happy to share that Fluidics 2.0 is now available on the App Store. If you’d like to see the full feature list, check out the release post over on the new Fluidics website; this is going to be more of a ‘making of’ sort of post.
So, what’s new in Fluidics 2.0 that warrants it being Two Point Oh?
To start with, I rewrote it from the ground up. Which is widely considered to be a bad idea, but I stand by the decision. I built Fluidics as a project in undergrad; while that wasn’t all that long ago, I’ve learned a great deal since then.
And beyond that, the iOS world has changed. Fluidics 1.0 was built on storyboards and imperative programming; Fluidics 2.0 is entirely SwiftUI. (The only storyboards present are in the widgets, which… cannot be built without storyboards. Maybe in SwiftUI 2.0?)
And while I wanted the core of the application to stay the same – I love the visual of the screen filling up, and the way the colors transition from the ‘above water’ to ‘under water’ areas never fails to make me smile – I also wanted some of the more idiosyncratic stuff to… fit in better.

That iOS-y Feeling
Gone are the cards.
Settings is now a full-screen experience, and that extra room to breathe makes for a lot easier navigation.
For the Quick Add, I went with the new style of cards in iOS 13, which are just as easy to dismiss thanks to the universal swipe-down gesture, and have fewer… weird bugs.
One of the key ideas of the design program I’m doing right now is that “you are not your user.”
Which, in this case, meant I had to buckle down and accept what my actual users kept telling me. Cool as I think it is to swipe from screen to screen, other people mostly just found it confusing. Tabs? Tabs are standard for apps, which makes them easy to understand; they’re also very well-integrated with VoiceOver, which is something the swiping always struggled with.

Dark Mode
SwiftUI also comes with effectively free Dark Mode support. Most of the actual work, for me, was in finding slight variations on the colors that looked as good in Dark Mode as the originals did in Light Mode. (Day Mode?)
Finally, this new version of Fluidics is something like a tenth the size-on-disk of the previous. This comes from a few places: some actual clean-up work I did helped, but the biggest gains were from updating to the latest version of Swift; that means that, instead of including Swift itself in the app, I can just use the system-level one. So it’s iOS’ problem to keep track of that whopping couple of megabytes of code, and not Fluidics’. Nice.
Similarly, switching to iOS-standard cards instead of the custom ones saves some room. While I was working on dependencies, I switched from a weird, all-local, very-unstable implementation of StoreKit to RevenueCat, which is much easier to work with and saved me a great deal of tearing out my hair.
The final big change was a bit of a side project itself: a new website for Fluidics. The old one was… fine, I suppose. It gave me a chance to try out static site generation with Jenkins (on GitHub Pages), but… hand-coding HTML and CSS, while something I can do, isn’t something I really enjoy doing.

WordPress
In the interim, however, WordPress has had some excellent updates, the Twenty Twenty theme is easy enough to tweak, and Gutenberg with some plugins makes for a very good editing experience, so here we go.
The new site looks better, and makes it a lot easier for me to do things like, say, having a blog where I can do visually-interesting update notes for each release.

A quick post of a class assignment we did a while back – tinkering with data visualization. I went with my travels and my playlists as the data sources.


Uninvited Redesign: Blink

It’s been interesting to watch electric vehicles grow in popularity, a trend that I expect to continue unless someone decides to pour marketing money on hydrogen. That said, aside from Tesla’s Supercharger network, EVs are seriously lacking an answer to the refueling infrastructure of gasoline vehicles.
I’ve tried a couple of the different commercial offerings, and have so far found them all to be a horrible user experience. (Current winner? The charging stations at the public library, which were installed recently enough that they haven’t been activated. There’s no sign to indicate that, no information on the stations’ display screens, and if you call their support to ask “what’s the deal?” they’ll tell you that “those stations were decommissioned.”)
Blink is, at least in my area, the most robust charging network, and thus is the only one whose app I’ve bothered to try. And it is… not great.
So, continuing on in the proud Design Student tradition of uninvited redesigns, here’s my takedown and redesign of Blink’s app. (And hey, if someone from Blink is reading this – send me an email, I’d be happy to flesh this out a bit more. Or write some of the code.)
Also available as a PDF, if that’s your jam: