Likely Querki downtime tomorrow
This isn't yet certain, but Querki will probably be down for several hours tomorrow afternoon/evening, as we move to our new home.

Seeking recommendations: hotels, restaurants and sights in Vancouver and Seattle?
Kate and I have decided that this fall's vacation is going to be to the Pacific Northwest -- several days in Vancouver, and then a couple in Seattle. Neither of us has ever been to Vancouver, so we're particularly interested in getting recommendations there. (Especially because we'll be there for our anniversary, so will be looking for a good restaurant.)

So -- anybody have recommendations? We've looked through the guidebooks, but always prefer to hear what friends have to say...

Details on QL
For the who are paying a little attention to Querki (but not following querki_project): the first major phase of the QL language is finally finished. A little while ago, I introduced bound values, and last week I was finally driven to add local function definitions. That brings us to the point where I've implemented all of the read-time functions that are in the plans. There will likely be some enhancements as we go, to support transforming and storing data as it gets saved to the database, but the main spine of the language is in place.

It's been an interesting experience, deriving the simplest language I could come up with that suffices for this purpose. It's certainly more complex than it once was, but still -- the reasonably full language definition fits in a handful of screens. It's not *quite* as simple as Scheme, but it's well up there.

The end result is a bit surprising, with a couple of aspects that emerged organically as I developed. One is the fact that it's a very pure functional language: that wasn't an original design goal, but after a while, it became clear that there was no good reason *not* to go for pure-functional, and all the usual arguments in favor apply here. The other is the incredibly strange way Querki handles function parameters, behaving more like macros than conventional functions. I keep feeling like this *surely* must be wrong, since no other language I know works this way, but it's clearly optimal for the way Querki thinks about data.

(An open question is whether QL should be considered a DSL. It kind of is, in somewhat the same way that SQL is: the domain is "data transformation". I have trouble considering that a "domain", but there you go.)

Anyway, I've written up a first-draft guide to the language, which can be found here. I'm unlikely to change any major aspects of the language at this point -- this syntax was evolved through a lot of careful thought about how one works in Querki -- but questions and comments would be quite welcome...

You know you've been around the block a few times...
... when your internal monologue goes something like this:

"A-ha!  Yes, that looks like the right solution to the problem."

(Smug.)  "Oh, I like that -- it's pretty innovative, and I think it's even a good user workflow."

(Dismay.)  "Oh, crap -- that means I probably have to write an effing patent..."
ETA: folks, I appreciate that you're trying to help with the comments, but you're not -- you're making an extremely difficult and painful decision much worse. I've been studying this question at *least* as long as any of you, I understand it quite deeply from all sides, and quite frankly, you're not in my shoes and don't understand the sheer number of issues I'm juggling here. Please stop.

What next, after Trump?
[Some political musings. This is relatively off-the-cuff, not too carefully thought through yet, looking for responses.]

I finally finished reading siderea's latest opus, "The Two Moral Modes". (Part 1, Part 2, Part 3) Highly recommended, although it falls somewhere on the spectrum between "disturbing" and "chilling". I wish I could say it was wrong, but I suspect the analysis is at least largely correct.

One of its premises is that there is a general mode of thought, common to many people in the US, to which Donald Trump is speaking *quite* directly, and that explains at least some of his devoted following. It has nothing to do with what I would usually call "morality", and (for purposes of this argument) not much to do with practical things like economics; rather, it has to do with espousing a firm distinction of "Us" vs. "Them", that taps into a not-very-latent desire for a well-defined out-group to abuse. None of this liberal wishy-washiness about "Them".

And I'm starting to realize that, in a weird way, we may have dodged a bullet. I mean, I believe that Trump is more an effect than a cause -- that he's tapping into a lot of pre-existing fear, hostility and (to use siderea's term) reviling, not just causing it through rabble-rousing. He's not steering this: rather, he has the born salesman's touch for figuring out what you already want, and pitching that *this* snake-oil is exactly that. If you look at his constant message changes, it's obvious that he's simply reflecting what he thinks folks desire.

Why is this lucky? Because he's such an *obvious* jackass. I mean, Trump is a cartoonish buffoon. He's doing a great job of turning himself into the leader that Mode 2 wants, but at the price of doing it so obviously that everybody else is completely repulsed. Unless you desperately *want* to believe in him, it's almost impossible to see the slightest sincerity or conviction (or competence) in the man.

Consider: what if we'd gotten a better politician instead? By historical standards of demagoguery, Trump is a crude amateur: unsubtle, careless, and crass. And he's *still* polling frighteningly well. Not well enough to get elected unless something weird and horrible happens, but well enough that, in a typical parliamentary system, he'd wind up leading one of the main parties in parliament, and quite possibly Prime Minister. A more polished operator, with his sales talent plus a modicum of discipline, might well have won this election even in the US.

So let's assume that Trump doesn't become President. (Because really, it's not worthwhile to assume the apocalypse.) If he *is* tapping into a deep latent stream of badness, that's not going to just go away -- it's going to keep fermenting. Indeed, given a taste of possible power, it's likely to catalyze and become something much more concrete.

At which point, what? Some of the politicians who *are* good at this, and sociopathic enough to view it cold-bloodedly, will surely be trying to figure out how to use it to their advantage. They won't *call* themselves fascists, of course, but the smart ones are going to recognize that there are a lot of people out there who are craving what amounts to a fascist / Mode 2 leadership, and will be trying to position themselves for that.

The silver lining is that Trump, through his sheer sloppiness, has probably woken everyone up to this. By being so obvious about it, he's breeding an early opposition. Still, I see a rocky road, and likely some serious political realignment, ahead. I don't see any way that the waves of emotion that Trump has stirred up are going to simply go away quietly.

Opinions? Anybody want to play with a bit of psycho-historical speculation here?

And *that* is why I'm building Querki
Really, today's XKCD summarizes my elevator pitch remarkably well:

Review: Tubshroom
Indiegogo is the new "As Seen on TV": the place where you find the gadgets that are almost ridiculously mundane, and yet often innovative and useful. Today's example is the Tubshroom.

The Use Case: thanks to the genetic combination of a father who started balding at 21 and a mother who still has a fine head of hair (plus my own lifestyle choices), I have longish hair that is, let's not mince words, continually falling out. A shower hair-catcher is a necessity, but I've long struggled to find one I really like. The ones that sit inside the drain tend to quickly fill up and clog; the ones that sit over it tend not to stay in place. For the past several years I've been using one of the latter, an Oxo that mostly works well, but I've had to reset the suction cups that hold it down before each shower.

Along comes the Tubshroom, which is a clever twist on the problem. As the name suggests, this looks like nothing so much as a bright-green silicone mushroom (other colors are now available) that you drop into the drain. The "stalk" is highly perforated -- the hair wraps around that, but since it has a lot more surface area, it doesn't clog up as quickly as the traditional in-drain models. (And the cap has more holes, to serve as an emergency valve if things start to clog.)

It looks like I need to clean it every 4-5 days. It's easy to pull out by the cap, and while the hair winds up tightly wrapped around the stalk, the bendable silicone makes it easy to pull it all off.

Overall, the best solution I've found to this particular problem. Recommended to anyone with long hair, who needs to deal with the resulting shower issues...

Product Design: The Asshole Contingency
Anyone interested in the design of software (or anything, really, but particularly software) really should take a read through this short but correct article.

Its point is simple: software is often designed for (in the telling of the famous physics joke) perfect spherical users, who are all cooperative and well-intentioned towards each other. Unfortunately, the real world doesn't work like that -- there *are* assholes out there. Not a gigantic number, but it doesn't *take* a gigantic number to mess everything up: the old adage "It only takes one bad apple to spoil the bunch" is nowhere truer than in the online experience. The proof is all over the Web.

I suspect Querki is going to get some pushback for some of its baked-in decisions, such as the fact that there is not, and probably never will be, a way to enable anonymous, unmoderated commentary. This article is a good outline of why: my consistent assumption is that a small but non-trivial number of the users are going to be bad actors, who are attempting to harm others or the service itself, or are simply assholes; the whole system is designed around that assumption. Dealing with that, and taming the resulting complexities, is one of its biggest ongoing design challenges...

Entrepalooza 2016
As I dive into the craziness that is fund-raising for Querki, I may as well blog about it for posterity. No deep thoughts, just a bit of diary entry for amusement, and for those who might want to go down this road someday.

Tonight's outing was to Entrepalooza, MassChallenge's annual shindig. Roza and I got there on the casual side of 6pm, since I had figured that a a large and loud party like this would have folks gradually arriving over the first hour or so. Wrong-o: there were a couple hundred people in line ahead of us.

The event was held at the Royale, a pretty large club in the theater district downtown. As expected, it was loud and crowded (presumably not helped by the fact that they were pushing $5 "VIP" tickets, with all the Harpoon you could drink), but in fact a good deal more useful than I'd expected. The focus was mainly on service offerings for entrepreneurs -- accelerators, gatherings, newsletters, tech services and so on. Each had its own eensy-weensy table on the floor, and was pitching its services to the mobs of entrepreneurs and would-bes wandering around. We found several that seem like they might be noticeably helpful for us, including the MIT Enterprise Forum, the Venture Cafe Foundation, TIE and The Capital Network. Between those, my calendar for the next few months is starting to look a lot busier.

I was gently amused that, while we're still very early on this road, we are a *lot* further than most of the people present -- we wound up in conversation with several earnest 20-somethings who had a clever idea and not much else. (I listened to one of them, pitching to an accelerator, smoothly transition into, "Do you maybe have any intern openings?".) Having an actual product in beta, that's been through well over a hundred releases, looks positively baked by comparison.

I remembered to grab my "I write code so you don't have to" button, which got a lot of inquiries. I may yet make that a semi-official slogan for Querki, since it gets to the point quite nicely.

I'm finding the overall sensation vaguely familiar, which is comforting. I've learned that, at the outset of any major project, I have an overwhelming sense of, "OMG, we're doomed! I don't know what I'm doing! Doomed! DOOOOOMED!". So I spend a while -- anywhere from days to months -- poking at the problem, looking at it from all the different angles, understanding what goes into it, and so on. Eventually, there comes the day that I look at the problem again, and say, "Oh -- okay, that's easy."

(Mind, that's the engineer's definition of "easy", which means "not hard", which means "I'm quite sure that it's physically possible to solve this". It still might take years of work -- but now I understand *what* work needs to be done, so it's no longer scary.)

That seems to be roughly where we now are. We need to raise a sum of money that, while not especially much by enterprise-software standards, is still dauntingly large -- enough to hire a bunch of people, and push Querki through to a serious launch. The process is a bit of a black box, and that little voice in the back of my mind is going, "Doomed, I tell you! DOOOOMED!". But I'm starting to feel like I understand the resources that are available for learning the process (how's that for indirection?), and have some hope that, while this isn't ever likely to be easy-easy, there is some hope of achieving not-Doomed in the foreseeable future...

Living with an accidental honeypot; or, A rise in industrial-scale spam?
One of the odd side-effects of having owned and used my own domain for a *long* time now is that I wind up with an interesting and sometimes annoying view into the world of Spam. I've had for well over 20 years, and I used it as my primary email for much of that, as did Jane.

More importantly, we were both great devotees of giving out bespoke addresses to anybody we didn't entirely trust. Hotels get *very* confused when I tell them to use, eg, "" as my email address, but it means that I've been able to detect who has bad email security and filter out anything to that address if it gets picked up by the spammers. If you sell your email address list, or are just careless about it, I will know. (As it turns out, political groups tend to be the worst.)

(NB: you can do this in Gmail, at least most of the time, by putting a "+" suffix onto your email address. So if you are actually "", you can give out "" -- it'll still go to you, and lets you do smart filtering based on the To: field. Some sites choke on the "+", but it usually works.)

The result is that I have given out hundreds, maybe thousands of email addresses on over the years, including my legitimate ones, the ones given to vendors, and specialized addresses I've put on websites, like "". And it turns out, that makes a remarkably effective honeypot for spam.

A "honeypot", in computer security, is something you put out there to lure the bad guys in -- typically some fake data that looks real and appealing, that you use to draw them in and trap them. In this particular case, much of the content of my spambox is *wildly* obvious spam -- not so much because any individual email is conspicuously bad, but because I receive two dozen copies of it to two dozen email addresses.

So for instance, today's biggest example has the subject line "Image[some random number].pdf", and the body "Sent from my Sony Xperia™ smartphone", plus an attached "image" that is, of course, actually a virus. It's unlikely I would fall for such a thing anyway, but I'm certainly less likely to when I have multiple screenfuls of them. Google is smart enough to notice that these contain viruses, and put them into Spam -- I'm downright surprised that they aren't smart enough to notice that there are so many near-identical emails, and just trash-can them. I would far rather they did.

I've long been amused at the lack of honor among thieves -- it's been very clear for 10-15 years that some people are simply taking existing email addresses, modifying them in trivial ways, and reselling them in order to bulk up the lists. For example, caitlin@waks was a real email address, but about ten years ago I started to notice "caitlinn", and then "caitlinnn", or "aitlin" -- non-existent email addresses that somebody invented. (I rather like "ookbook", which sounds like I'm writing about monkeys.) I'd bet good money that that was done simply so that people could sell packages of "ten million email addresses!" and suchlike. Indeed, many of them are even less real -- addresses that look like nothing so much as a cat walking across the keyboard.

The really interesting thing I'm noticing this week, though, is a sudden spike in what I can only describe as industrial-scale spam. There's been an *enormous* uptick in the number of spams landing in my Spambox. Traditionally, I would get ten of something; now, I'm getting a hundred. And they are from all of the above categories -- addresses stolen from vendors, addresses from websites, and the various multilated forms that have gradually come into common use over the years.

I suspect somebody has gotten serious about selling Spam as a Service. This feels like some site has bought up *all* the lists they can find, and opened up an API for blasting out trivial variations of a template to umpteen million addresses at high speed. The virus-laden ones have a straightforward business plan behind them (one thing you learn in financial security is how much spam is all about stealing ACH credentials); the ones that are simply, eg, "Hi ekyz how are you?" are a bit more mysterious, but I assume are attempting to lure a victim into a conversation.

Anyway, just some food for thought. There is one sad consequence of all this: I think it's time for me to turn most of Jane's email addresses off. The various forms of "jane@waks", "caitlin@waks", and so on, have been coming to me over the years, but we're down to well under one legitimate email per year, and a fair number of spams per day. So I think it's time to filter those into the bit-bucket. I will admit, even knowing that it's the sensible thing to do, it's remarkably hard for me to set up those filters...

Review: BodyBrew
As I've mentioned before, I've become a devotee of cold-brew coffee in recent years. Conventional coffee is too hard on my stomach, and frankly I don't care for the bitter edge that much anyway. So cold-brew -- coffee soaked at room temperature for many hours, instead of quickly and harshly in near-boiling water -- suits me well. A good cold-brew produces a strong concentrate that you dilute with water, or in my case milk -- the result is a lovely, smooth iced latte.

So when I came across the IndieGogo for BodyBrew last year, I decided to give it a shot. The idea of a bespoke device for cold-brew seemed a bit frivolous (you can do it reasonably well in a standard french press), but I like the stuff enough that it seemed worth a flyer. I've now had mine for several weeks, and it's a keeper.

The BodyBrew produces a *lot* of cold-brew: you start with 40 oz of water, which results in 24 oz of concentrate. This may not sound like much, but the stuff is *ferociously* strong. Between the recipe (1/2 lb of coffee per batch), a long brew time (you can do as little as 12 hours, but up to 72 for a really strong brew), and the device designed to give it a really good soak, the flavor is at least twice as strong as my traditional french-press brew, as is the caffeine. Indeed, the latter is what reminded me to write this review. Traditionally, I dilute cold-brew with milk as a 1:2 ratio, and that's nice. This stuff, I've been diluting at somewhere over 1:3, and I'm *still* winding up downright jittery if I'm not careful. It's the strongest cold-brew concentrate I've ever come across.

It also specifically allows for re-brewing a second time with the same grounds, which gets you another three cups of conventional-strength coffee; I've been mixing that with the concentrate to stretch it a bit. It's a minor detail, but when I'm using this much coffee per batch, it's helpful.

The design is thoughtful and clever in a number of ways. For example, the top of the hourglass-shaped device unscrews and becomes the decanter, which you keep in the fridge. There's a screw-on decanter lid for that, as well as one for the bottom half in case you do the re-brew thing. It comes with a shotglass for measuring your concentrate. For extra money you can buy a travel canteen for the concentrate, and a timer for tracking how long it's been brewing; IMO, both of those are pointless, and not worth the extra $10 each.

Overall, the device isn't cheap ($60), and it does use a lot of coffee grounds. OTOH, the concentrate is tasty and strong, and I get over a week's worth (maybe more once I tune the strength down a bit) for $5 worth of coffee, so the ongoing cost isn't bad. Assuming it holds up (which it's done decently well so far, including a run through the dishwasher), I suspect it'll prove a good investment. Recommended if you like cold-brew enough to make it regularly, as I do in the warmer months...

eBay illustrates why allowing JavaScript is *always* a bad idea
[For the programmers]

Here's a delicious little security alert about a vulnerability in eBay, which potentially allows malicious vendors to steal your eBay credentials and such. I recommend reading down to the details -- the JSF**k hack itself is kind of brilliant.

The moral of the story is that any time you see the phrase "code validation" in the context of JavaScript you should worry. Trying to make sure that code isn't going to do anything malicious is almost arbitrarily difficult. You should either allow JavaScript -- in which case you better make sure you have a way to sandbox it and you understand all the possible attacks -- or forbid it outright. Unless you understand the problem *very* deeply, I recommend the latter.

(This is why Querki only allows a subset of HTML and CSS. A large subset, but we intentionally disallow any approach I can find that might allow JavaScript in. In some ways this makes me sad -- it limits the flexibility of the system -- but security is the higher priority...)

Centrist and proud of it
There's been a prevailing narrative in the current Democratic primary, promulgated heavily by much of the media (which loves simple narratives), that goes kind of like this. *Real* Democrats, who have principles, are voting for Sanders. The people voting for Clinton are doing so reluctantly, mostly because of "electability", but they don't actually *want* her to win, they just want to beat the Republicans. That's because she's a "centrist", which means she doesn't have any principles, and she's "just" a politician.

Enough of this crap.

Let's say this clearly: I'm voting for Clinton because I think she'd make a very good president. Frankly, I think she'd be better than most, precisely *because* of who she is and what she stands for.

I quite enjoyed the '08 primaries, because I didn't feel like I was choosing between the lesser of two evils. Both of the candidates were smart centrists. (Much of the electorate deluded themselves into believing that Obama was some kind of radical, but I always found that mysterious: if you listened to what he actually said, he was *obviously* a centrist, and that was much of why I liked him.) I decided to vote for Obama over Clinton for one simple reason: I thought his campaign was better *managed*, and the Presidency is, first and foremost, the ultimate management job. That's the point of the freaking executive branch -- they're the ones who are supposed to get things done. Since then, I've developed more respect for Clinton -- she did a solidly good job at State (itself a big management position), and knowing what I know now I'm not sure which way I'd go if offered the same choice.

(Actually, Obama had one other advantage: I have a mild preference for younger leaders. That's not a viable option in the current Democratic primary, and that makes me sad for the party.)

Yes, she's an insider. That's a *good* thing. I am continually mystified by the cult of the "outsider", and rather scared by the apparent right-wing desire for a fascist who will come in from the outside and sweep everything before him -- the potential danger aside, it's a rather anti-American (if long-held and common) viewpoint. In a finely-balanced system of checks and balances, being an insider is how you get things done -- *effective* presidents, the ones who actually accomplish something, are the ones who have a lot of experience in the field. And yes, that means being a politician.

As for the whole "she has no principles" charge, give me a freaking break. Yes, she's a little nuanced. I like that in a politician. The dangerous politicians -- the *scary* politicians, ultimately -- are the ones who see the world in simple black and white, believe that their way is the only way and that complex problems have simple solutions. The world is complex and nuanced, and our culture is evolving a lot faster than most people notice. Leading that culture without causing more problems than you're solving requires recognizing and navigating that complexity.

And yes, she's made a few mistakes -- the whole email-server thing was a dumb own-goal. But seriously, as scandals go, this one's pretty pathetically minor. Frankly, for a woman who has been square in the spotlight for 25 years, I'm deeply impressed that the worst the Republicans are throwing at her so far are that and their delusional fantasies about Benghazi. Anyone who can go that long, under that kind of microscope, and only be getting those accusations, probably has more integrity than most of us.

She'd make a damned good President. Out of the entire circus of candidates who have thrown their hats in the ring this time around, she's the only one I can honestly say that about. I am supporting her on Tuesday, proudly and with my head held high. I encourage you to consider doing the same.

The joys of writing a new test harness
  • Time to track down the bug: 3 minutes

  • Size of the fix: 1 line

  • Time to add enough pieces to the new test harness to *validate* the fix: 8 hours
It's necessary, and it'll pay off in the long run, but *man*, I had forgotten what a pain in the ass it is to build a good Selenium-based harness. On the plus side, this little fix required adding a lot of the critical pieces -- enough to express several of the common Querki operations as one-liners...

Mixed feelings
Part of my brain is going, "Wow, this is wonderfully beautiful weather!" And part is going, "Wow, this is *disturbingly* beautiful weather!"

Yes, there's the El Nino effect, and after last February I can't entirely look the gift horse in the mouth. But there's something pretty broken about hitting the mid-60s on February 1...

Help: sluggish mouse pointer? (Windows)
[Context: Windows 7]

Garh; this is driving my crazy. For the past couple of weeks, the mouse on my desktop machine has been notably sluggish -- the pointer is "stuttering" a lot, not keeping up with me as I move the mouse. I've replaced the mouse's batteries (a common recommendation), and that doesn't seem to do it. Antivirus is up to date, and I believe the problem is happening a *little* even at system start, although it tends to take a while to become grotesquely annoying; none of my usual foreground processes seem to be involved. Likely related, I'm sometimes seeing difficulty with typing -- stuff I type takes a long time to register, and sometimes doesn't work at all. CPU is *not* pegging at all: moving the mouse around a lot barely registers on the CPU meter, even when it's stuttering and catching constantly.

The problem almost has to be something to do with interrupts and a bollixed driver, but I have no idea where to look to diagnose it. Any pointers on how to track down the offending process, short of wiping and reinstalling the whole bloody computer, would be greatly appreciated. (Comments recommending that I change operating systems would not. Please don't; I'm not in the mood.)


Review: Sense8
The thing about streaming series is that you get to watch them at your own pace, without the pressure of, "OMG, my DVR is about to explode!" So it's taken me a while to get around to Netflix' recent series Sense8. I kind of regret that, because I would have started talking it up sooner if I'd realized how good it was.

Sense8 is written by JMS (of Babylon 5) and the Wachowshi brothers (of The Matrix). So I went into it with a nervous concern of, "this might be the most bombastic thing ever written". The reality is quite the opposite: this is by far the most *human* thing I've seen from any of them, possibly JMS' best writing to date. It isn't big, loud and special-effects-laden; instead, it is very much about normal people dealing with human (if dramatic) concerns, who are finding that their lives have just changed in a rather weird way.

At its heart, Sense8 is a deep exploration of telepathy -- a topic often covered in written science fiction over the years, but rarely done well in the visual media. The premise is straightforward: these 8 people, scattered around the world, are beginning to find themselves as mentally linked. They can talk to each other; moreover, they begin to find that they can share skills with each other. It's a lot more mundane than spaceships and monsters, but the story shows just how powerful it can be.

The series is the most diverse I've ever seen -- so much so that it has to have been quite deliberate. Our protagonists, in a nutshell, are:
  • The Icelandic musician, living in London to try to forget her past.

  • The Nigerian bus driver, whose focus on earning enough money to keep his mother healthy is going to make him some dangerous friends.

  • The lesbian hacker from San Francisco. (In pretty much the only solidly-healthy relationship in the story.)

  • The East German safecracker, about to make a big and risky score.

  • The Indian bride-to-be, whose future would look perfect if she actually loved her prospective groom.

  • The Chicago cop. (Because there had to be one generic whitebread guy, but he is no more the "lead" than anybody else.)

  • The macho latin movie star, closeted from the entire world (especially himself), who accidentally finds himself in a sweetly odd poly relationship.

  • And my personal favorite: the tightly-wound South Korean businesswoman, with her own distinctive mode of blowing off steam, whose family problems are about to explode.
Oh, and one of those characters is trans, but the series doesn't even bother to mention that until halfway though. There's something refreshingly modern about that simply being a background detail.

Each character is the center of their own story, and Season 1 is mainly telling those stories, as they slowly weave together with each other. It's quite faithful to its premise, though: while the protagonists are gradually accepting the reality of this link, and figuring out how to help each other with it, they stay quite separate -- only two of them even meet physically during Season 1. So each character gets their own story, each a sort of movie unto itself, with the rest as their friends, associates and helpers as they do so.

Of course, there is also an Evil Shadowy Conspiracy that is out to get them (this *is* a modern science fiction story, after all), and interestingly, the two American characters don't really have much plot aside from it -- there may be a statement about the American media there. But it's more a lurking presence in the first season, driving a bit of plot but not really defining the story.

There are no obvious special effects here, but you have to pay *close* attention as the camera dances back and forth between characters and stories. The series doesn't bother with a great deal of expository dialog; it assumes that the viewer is smart enough to keep up with what's going on. (Instead of plot exposition, we get a fair amount of heart-to-heart emotional discussion, as each of our heroes tries to help the others grapple with their problems.) It starts pretty slow, and the first couple of episodes are difficult going as you try to figure out what the hell is going on, but by its midpoint the season is *rocketing* along -- it starts getting hard not to binge through the rest of it as the plots begin to climax.

Note that, being an unrated series on Netflix, there's a fair amount of violence -- not terribly gory, but it's a significant undercurrent to several of these plots. There's also a moderate amount of explicit (and given these characters, mostly gay) sex: not terribly gratuitous, but it's important to some of these characters and the story doesn't shy away from it. The mood is often dark, but nicely cut with some very funny subplots.

Overall, highly recommended -- possibly the best TV show I've watched in the past year. Particularly recommended to fans of Orphan Black, which is the closest analogue I can think of in flavor. If you've got Netflix, check it out, and give it three episodes to get the hang of it...

Running headless browser tests using ScalaTest
[Continuing the previous story, basically. Again, only interesting to the Scala-using crowd. None of this is rocket science, but since I had to piece it all together from scattered info I might as well post it. Note that this is stream-of-consciousness notes, as I develop this test harness.]

Next step: can we run our browser-based functional tests "headless"? This is awfully useful: Selenium is great, but it is *very* distracting to have a browser window suddenly pop up in front of you and start doing things by itself. (And that simply won't work in a truly headless environment, such as an automated test server.)

Fortunately, this also proves to be easy, if poorly-documented. This answer on SO works perfectly fine for ScalaTest + Play. The key is the useful little program xvfb -- the X Virtual Frame Buffer. Basically, it's a program that lets you set up a "virtual" window that doesn't actually exist, which you can then point your tests at.

So first, you need to install xvfb, which on Ubuntu is:
sudo apt-get install xvfb
Then you run it, like this:
Xvfb :1 -screen 5 1280x1024x8 &
(Note the capital "X" in Xvfb.) That is, run a virtual screen in the background (that "&" at the end), creating display number 1 and screen number 5, with the specified virtual resolution. That kicks the screen off as a background process (you can find it with "ps").

Finally, say this:
export DISPLAY=:1.5
This tells the processes in this shell that, if they're trying to show something in X, they should use display 1, screen 5 -- your new virtual screen.

Now you can run sbt and your ScalaTest + Play functional tests as documented. The browser will start and run as directed, but you won't see anything, since the "display" is all going to xvfb's bit-bucket.

A nice side-effect of this approach is that the xvfb stuff is completely external to your test. You can write this into your standard shell environment for normal use, but you can also turn it off when things are going wrong, or if you simply want to be able to observe the proceedings while you are coding up your tests.

Getting Chrome working under ScalaTest
[Very Typesafe-stack-specific, but having spent the time figuring it out...]

Nothing to brighten my day than managing to solve what briefly looked like an intractable problem.

I'm trying to get full-stack functional tests running for Querki. (Not before time, I know.) To do this, I'm using ScalaTest + Play, which seems to be the approved solution. This is built on top of Selenium, the long-standing standard toolset for driving a browser for testing.

Problem was, when I wrote my first trivial test, ScalaTest refused to run it, claiming "Was unable to create a Selenium ChromeDriver on this platform". This was mysterious -- I have Chrome installed on this (Ubuntu) machine, and it works fine. A brief round with Typesafe suggested that the problem might be my X windows setup, which was a tad depressing, but I decided to get stubborn, rip the lid off the code and see what was actually going on.

It turns out, if you look at the relevant code in scalatestplus-play, that ScalaTest is intentionally flattening all exceptions from Selenium's ChromeDriver into a simple "that doesn't work here" cancellation. This is useful -- it's how you can write an all-browsers test suite in ScalaTest, and have it just quietly suppress the ones that don't make sense on this platform (eg, trying to run an Internet Explorer test on Ubuntu, or a Safari test on Windows). But it also loses what turn out to be some extremely helpful and informative exceptions that are raised by ChromeDriver.

So I added and ran this pseudo-test:
class DriverTests
  extends WordSpec
  with Matchers
  with ChromeFactory
  "I should be able to get a decent error" in {
    new ChromeDriver()
That gave me what I was looking for: the actual exception was
[info]   java.lang.IllegalStateException: The path to the driver executable must be set by the system property; for more information, see The latest version can be downloaded from
[info]   at
[info]   at org.openqa.selenium.remote.service.DriverService.findExecutable(
[info]   at
It turns out that, as it says, you need to manually download the relevant native drivers, install them, and point to them. Oddly, I haven't found this documented anywhere.

Anyway, fixing that produced *another* helpful exception, telling me that ChromeDriver required Chrome >= version 46, and mine was too old. I updated that, and *poof* -- it all works.

So: if you are having trouble getting ScalaTest's browser drivers working, I recommend the above little pseudo-test, so you actually get the underlying exceptions. And note that you need those drivers...

Sundown (review)
[Oh, right -- posted this to Facebook last week, but forgot to mention it here...]

OMG -- when I wasn't looking, Sundown came out! Time for a burble.

I first encountered Sassafrass a few years ago at Arisia, and was blown away. Unlike the usual filk, they perform the music of Ada Palmer: complex harmonized a capella with far more depth than you'll usually encounter.

And I heard several tracks from their then-upcoming album, Sundown, which apparently came out sometime last year. Sundown is unlike anything else you'll ever find: the core Norse myths retold as an intricate a capella opera. I've been waiting for the full album ever since, and it's brilliant. (For those who have heard Sassafrass' previous albums: this one's different. Studio-quality, with proper mixing and everyone really practiced. This is what the music *should* sound like, and which the previous, mostly-live albums could only aspire to.)

I love the whole album, but particular standouts include:
  • "My Brother, My Enemy" (a bitter duet for Odin and Loki)

  • "Hearthfire" (beautiful and heartbreaking)

  • "Ice and Fire" (a duet for dueling Eddas, the entire history of the universe in 11 minutes -- this one is hilarious live, with Powerpoint presentation in the background)

  • "The Futhark Song" (essentially the traditional alphabet song, for Futhark)
Highly recommended in general, especially to SCAdians. The music can be challenging, and won't be to all tastes, but I recommend listening to a few of the above at the website to see if you are into it.

Also notable is the album Make Them All Real, which is a bunch of their other songs, remastered from their rough earlier albums. It's not quite as polished as Sundown, but includes "Somebody Will", which I generally think of as *the* anthem of classic science fiction -- a beautiful, melancholy song of the patience required to build the future. And several other lovely songs, including the period Ideo Gloria: it's also well worth getting.

Check it out, and spread the word...


Log in