A story for Firefly

I didn’t want to get out of bed.

From deep in my sound-asleep place, I could hear the snorts and coughs and shuddering guttural rasps of a cat as she struggled to breathe. Then the plomp on my legs as she jumped off her perch to the bed, and the bump on the floor as she went gronking and boffling out of the room. Wandering away, her struggling calls continued to permeate my fading dream-scape.

She’s fine, I think, but I wonder if maybe this is the time she might not be. Firefly, named by my niece for the campground she was found in and not for my beloved old television show, has always had a respiratory illness. Brought to me just shy of a decade ago by way of my sister’s house, where her presence made some other cats mad and she couldn’t stay the long haul, she’d lounged into my High Park apartment and from that first day when she climbed up on my chest and took a snooze, we were besties.

But she’d always had the sneezes, the coughs. The starts and fits of breath that accompanied her one very bad eye, which would ooze a goopy brown substance while her other clear yellow-green eye would gaze out curiously. She’d wheeze and rasp and shudder one morning and be fine a minute later. She’d languish and look forlorn and I’d wonder: is this it? Can my cat breathe at all right now? And then she’d go stick her paw in her water dish and lick it and roll around in the sun. That’s just her way. So she’s fine, I think.

But I wonder if maybe this is the time she might not be.

I reach up and fumble with the window turner bauble and I manage to open the window even wider. Cold air rushes in and I quickly start wrenching my hand the other way, shutting out the windy scrape and scutter of leaf on leaf with the frigid morning air. The snorts continue from the hall. With a grand surge of effort I sit myself up. I can see her silhouetted in the hallway, pointed toward the stairs and away from me, her awkward pose down there doesn’t mean she can’t breathe, but she isn’t looking comfy.

I stand. Stretch. Take a few steps around the bed to her and – she skitters off, right down the stairs. Damn cat. I have to pee before I go on a chase. She’ll be fine the next few minutes for sure.

The light is blinding. I fumble the slider down to a dimmer level, and swing on the warm water tap just before I start to pee. My mouth is loaded with gross and I don’t want to rinse with cold water. A moment later, smoothing my hair and holding it to my neck so it stays out of the water, I notice: it tastes sweet! Rinse and spit, go again. Still sweet, what on earth? I turn it hotter, take a little more, rinse thoroughly despite the sweetness, gargle gargle spit, but it persists. More. The sweetness is subsiding. Swallow. More. The sensation is clearly fading now. Gulp. Bizarre.

As I step back to the bedroom, I decide I quite like the light of the bathroom now, so I leave it on and just close the door — it’ll flow out through the transom window, and I don’t want it too bright to wake Jenna up. It is absolutely too chilly to go downstairs in my underwear, so I head back to the bedroom and fart around with my shirt in the dark. I find the seams in it to tell how I’m olding it, then over my head and on it goes as Jenna stirs. I tell her the cat’s breathing kinda funny, and she sighs her assent. I’m the cat wrangler.

I pull my one very warm awesome sock on, and then the other composite sock I’ve made by layering two thin ones. I glance at my phone: 06:57 am. Earlier than I want to get up on a thanksgiving Saturday, but it’s hardly the middle of the night. Still seems quite dark.

Stepping away from the bed, I realize I won’t be nearly warm enough, so I grab a blanket and throw it over my back poncho style, like a wizard. I begin my journey down the stairs in search of her, following her mild rhythmic croaking from below. This is pretty normal for her, I tell myself. She’s probably fine. Somehow, she’s always been fine.

Two years ago, we went on a trip to Winnipeg. In our old apartment, we had a crawlspace upstairs, and you can maybe guess what that means. Any time it was open, the cat wanted to be nowhere other than that crawlspace. We had gotten quite complacent about travel with her. I would leave out two water bowls and two mountains of food, and she’d absolutely be fine for 3-4 days. This was gonna be about 5 days away, but we’d made sure everything was ready for her.

Just as we were leaving, I checked she was out by her bowls in the living room and all the doors that ought to be open and closed were correct. Walking down the stairs to the front door I remembered: backup headphones! What if my headphones break? I’d have nothing to listen to — what a curse! So back up to the living room, then up to the computer room upstairs and into the crawlspace I went. Found the box with more headphones, pulled it out. Put some in my backpack. Pushed the box back. Closed the crawlspace. Down the stairs, down the other stairs, and out.

We had a great time in Winnipeg. We visited Jenna’s grandma for her 91st birthday — a visit delayed by the initial onset of COVID-19 the year prior. I’d never been to the city. We stayed in a hotel downtown, and Jenna’s whole family was out there for the visit. We saw museums and went on walks and visited her lovely Grandma in her apartment. By the time we got home though, we were thinking of one thing: that lovely cat greeting us at the door, saying “hellooo, I missed you!”

But when we opened the door, there was no cat. We walked in and took off our shoes and went up the stairs, and in the living room, no cat. In the back room, no cat. Upstairs in the computer room… no cat. No cat in the bedroom. Did she run past us on the way in? Not in the upstairs washroom. What about under the bed? Is she hiding behind the couch? Did she get into a cupboard somehow? The laundry room? No cat. No cat anywhere we were looking, despite our calls. We’d both begun to cry and I was checking the laundry room for the third time when Jenna called out “oh my god!” from upstairs.

A small, grey, blinking creature stepped out of the crawlspace toward her. She let out a very faint meow. I galloped up the stairs to them and found Jenna sitting on the floor crying, with the cat looking startled and rumpled, but miraculously… fine. She went waddling down the stairs toward her food and water and started chomping.

We both crept after her, counting the hours we’d been away and our blessings that this cat was somehow walking around. I phoned an after-hours vet and explained what had happened, and they asked about her condition. She had had a drink and was now being very friendly, and seemed in high spirits. They told us to bring her in if she wouldn’t take food or if she seemed to be developing yellowness in her gums and lips. Otherwise, if she seemed fine, she likely was. We could not believe it. She wandered between us hanging out, and we both sat and cried, and cried. She was fine. Somehow she always is.

Back to the poncho: as I get to the turn in the stairs, I can see her shadow by the doorway to the dining room. I carefully step down each of the last three steps. Less than a year in this house and we have both slipped on these stairs more than once already, so creeping care is the order of the day here. By the time I get to the door, she’s skittered away again. Never a great sign if she won’t let me get near. I manage to close the gap as she makes for her safest spot under the table, and I scoop her snorting little frame up into my arms, holding her a little aloft to keep those swinging feet away from my pristine flesh.

I turn her and put one hand under her upper chest, lifting it slightly and letting her feet under my other hand fall a little. This will open up her lung space a bit and allow the chest-holding hand to massage her neck around the side of her windpipe, to help her clear out phlegm. She seems to know I’m trying, but that doesn’t mean she likes it.

Sitting down with her in my living room chair, facing the front window, she starts up her “I’m outta here” routine — swinging legs, squirming — so I lift and loft again, and she settles back down on my lap. She usually enjoys being held up by her chest, especially if I give her a bit of a belly rub. I do so, but she’s not very interested this morning.

Her struggles continue, but each breath seems a little more even now, and as her patience with my timid massage wanes, I let her go free on my lap. She jumps straight down to the ground, taking up a spot a few feet away on the floor. If she’ll walk back to check out my hand, that bit of sociability might convince me she’s feeling close to fine … but, no, she demurs. And wanders back to the shoes by the bottom of the stairs, settling in to stare not at me, but near me.

I sit back for a moment and rest. Her breathing is still laboured, but seems consistent now. I turn to my right and reach for the wispy fluffy tinsel-like cat toy on a wand. I bring it around the corner and start bouncing it around on the floor. Instantly she knows the game is afoot: she goes low, hiding behind a blundstone, peeking. But the tinsel is too exposed — after just a moment, she loses interest. I pull it away to the far side of my legs: the less she sees of it, the oddly more enticing. And like clockwork, she poofs into position, preparing to pounce.

I begin to retreat the bouncing wand farther behind my legs and the chair, and she goes absolutely low, compressing tension to tautness, and she springs! Running… just… past it, oddly. She comes to a stop looking a little confused about her miss, then starts up onto the scratching post nearby as a consolation. For a few minutes I wave the toy around above her, as she swings paw after paw at it and jumps fervently up and down. This is a cat in her element: she has total control.

I sense her beginning to lose interest, let the toy slack, and relax again. She’s fine. Her breathing sounds much easier now. My eyes un-focus and I see the pattern of leaves fluttering wildly in the morning breeze out the window. Should I stay up? I think I’d quite like to be back in bed now. But I’m up already. There’s an alarm in just 45 minutes — do I really want 45 more minutes in bed? I have to pick up the car rental at 9:30, so I could turn the alarm off, and maybe catch a couple hours…

What would I do if I did stay up? I could write. Or draw, or program something… a game? I could make some plans. But nothing I can do in an hour would be worth it, I remind myself. Nothing in the next hour would amount to anything.

Just then, an striking slash of light dings me in the corner of my eye through the window. What? What was that? What could possibly have lit up out there?

I begin moving my head all over, up, down, bouncing it left to right, trying to build a parallax view. Something twinkled like a blinding little star out there, and I need to know what it was… was it a firefly out there in October? That couldn’t b- there it is again! I swear that was just a point in space until it was a shining beam; what gives? It was gone as quick as it arrived.

I’m moving my head around furiously now — maybe there’s something being hidden by a leaf, I think. Some odd angle I can catch. It’s somewhere over our neighbour’s walk across the road, or maybe in front of their porch, if I can just see… yes, there it is again! I’ve pinpointed it at last: a little solar walkway light, like they have lining their entire porch. It shone one single striking stroke, and then went dark. I’m sitting rapt, absolutely focused on it. It can’t have been more than 10 seconds between the last few. DING! Like a camera, there it goes again! The whole chamber of the little lamp was illuminated brighter than a bulb in my own living room, bluish-white, like a tiny bolt of lightning. I wait another moment… ZING! There it is again! What an amazing little thing. Why is it doing this?

When will it strike next?

It’s gotta happen any second now…

But, the light stayed dark. Its compatriots were just quiet background figures, resting in relief against the porch. The dancing leaves took up the show as best they could, but no more flashes.

Sitting back, losing my air of attention, I decided: okay, I should go back to bed. The cat bounded up onto the windowsill, looking at a something only she can see out there — clearly absolutely thrilled. Maybe she sees her own magic lights. She’s breathing near silently now, seeming completely at ease. That cat is fine.

I could go back to bed, or I could try to write, or draw, or program… I could make plans. Nothing I can do in an hour would be worth it. Nothing in the next hour would amount to anything, I remind myself.

I stand up, and step across to the couch. Pulling the laptop off a side table, I sit back down and pull my warm wizard robe around my shoulders, making a small cave. The cat is suddenly quite interested, quickly over to me and nosing around the entrance. I add a blanket for padding on my lap, and she’s off to the races exploring in there, poking around (uncomfortably) and purring up a storm. I open up a text editor, and begin to write:

“I didn’t want to get out of bed.”

Idiomatic

I wish I could remember where I got these. I’m pretty sure it was a markov chain, trained on common idioms and placed on someone’s website, likely linked to from an IRC I was in, or on hacker news, and I think I just refreshed it over and over and kept the ones that stood out? But it’s also possible that someone wrote these exact things, and compiled them into this specific list intentionally… I searched a few on google though, and found no results!

So while I can take no credit for their brilliance, these have been in a text file on my computer since about February 2017 — time to set them free:

“A bad workman is king.”
“Practice is the best medicine.”
“Every cloud costs lives.”
“Pride doesn’t grow on trees.”
“A chain never strikes twice.”
“Doubt is the sweetest fruit.”
“A golden key is no use.”
“Live for today, for tomorrow never strikes twice.”
“Half a loaf washes the other.”
“Half a loaf must be endured.”
“Fools and horses are all that cost lives.”
“Beauty abhors a vacuum.”
“Honesty corrupts absolutely.”
“Two is company, but three makes strange bedfellows.”
“Talk makes the most noise.”
“Crime dies young.”
“Those who don’t learn from history never forget.”
“The pen is always right.”
“Speak of the devil and he gets monkeys.”
“An empty barrel happens.”
“Lightning makes lemonade.”
“Those who can, do; those who can’t, must be endured.”
“Power corrupts; absolute power will never hurt me.”
“Hindsight is always greener on the other side.”
“Failing to plan wins.”
“When the going gets tough, the tough are golden.”
“The love of money is hot.”
“A little knowledge wasn’t built in a day.”
“Two heads are the best form of defence.”
“Give a man enough rope and he doesn’t fall far from the tree.”
“Money is king.”
“Great minds are the bottom line.”
“If you pay peanuts, you are cheap.”
“Every dog may look at a king.”
“A free lunch is next to godliness.”
“Tuesday’s child is just a bowl of cherries.”
“Lightning is nine-tenths of the law.”

Google’s “Verify it’s You” pattern is dangerous

Years ago, Google introduced “Verify It’s You”, basically just a prompt to log back in after session expiry, and it has always irked me: it trains users to see an otherwise unidentified tab with a generic google login form, and enter their credentials by rote.

Google, could you please verify it’s you?

There should be some better sign on this page that it was actually recently signed into my account, in part so that I can investigate and know for sure I’m not being conned by some clever phisher, but more importantly so users at large are not generally predisposed to blindly entering some of our most important credentials to nondescript forms. They don’t even retain the favicon of the app you were on! It’s just a generic google favicon.

If this were a small shop, a random business, heck, even a bank, this behaviour might be fine. You tend to know where your bank tab is. But most days, I end up logged into 2+ google accounts with a motley assortment of gmail, drive, meet, youtube, and calendar tabs scattered around. Was this random tab the one I opened a calendar invite in and forgot to close? Well, I’ll just enter my password to see…

I wonder, how many attackers are there out there exploiting it?

Planning Poker is a Finger Pointing at the Moon

And boy, do people hate planning poker.

It comes up all the time with friends and coworkers. When talking about life as a dev, work processes, management, or the industry as a whole, eventually someone mentions work-costing, and people hate points being assigned to work they have to do.

Planning poker is one common name for the act of a group choosing those point values for future work, to determine the time and the effort the group believes will be required to perform the work.

And people have legit issues with it: the method their team follows, its accuracy in finding costs, how frequently it’s done, the way the points get used, and the reasons they have to do it. But most concerns are targeted at the ineffectiveness of costing, which misses the true, hidden point of the task — and you can’t blame them for missing it! They see the finger, not the moon.

Buddha’s no moon

The finger and the moon are an old zen metaphor: those who seek the moon and find people pointing fingers to the sky shouldn’t mistake the fingers for the thing they seek. They shouldn’t mistake a temple, or an idol, for the end result of the teaching. The finger is just a thing that helps them get to the thing.

Planning poker is often discussed as a way to determine the cost of work, and that’s how it’s sold. Many companies only bother to do it because certain strata of management want to know what things cost and when they’ll be finished. Planning poker puts numbers to work, so why not use it? Some people want to use the costs it produces to forecast future project timelines, while others want to measure their teams’ (or, frightfully, individuals’) relative productivity by their completion of certain numbers of points in given time periods. But planning poker isn’t really good for or about any of that — it’s just a finger, pointing at the moon.

The moon here is all the parts of your work that you don’t even know exist until you’re working through the middle of them. It’s all the hidden costs that an optimistic Product Owner would never consider. You can’t have one person sit on their own in a room and just see all these things, so what can you do?

You can build a temple with a finger in it pointing at the moon, i.e. a process that naturally leads to the discovery of these unknowns. That’s planning poker.

Planning Poker is not itself a Heavenly Body

Planning poker has many variations, but it’s typically done by having cards in roughly fibonacci number increments from about 1 to 33, which every member of a small development team has a copy of while attending the session. A story or task to be costed is selected — it may have a prior general assessment as “large”, “medium”, etc. from an initial triage lookover, and after some discussion of the task, everyone privately chooses a card with a cost from their own set. They all reveal simultaneously to avoid a big group-think in first selection.

On any appreciably complex story, at this stage you will find a cost disparity between team members. Someone who is junior might think something they don’t understand is more or less expensive than makes sense to the rest of the team. Someone who is feeling pessimistic that day might put in a high cost, or vice versa with an optimist, or just someone who knows more or less about the problem space. Now that the cards are down, the discussion begins — the finger has pointed.

“Junior Dev Danny, why do you think this story will take 3 points?”, quoth the scrum master.

Danny now has to fumble around and rationalise their cost. They might have good reasons, and they might not. Everyone sitting in the room listens, and other members of the team can agree or disagree and give their own reasons. You do this a few times with the outlier costs, write down the most legitimate concerns and new stuff that fell out in the process, and what you’ll find is this:

  1. Your cost will average toward a meaningless number.
  2. You ended up with a far better description of the task.
  3. Everyone on the team better understands the work to be done.

If you asked everyone to just improve the description, or just read through all of the tasks? Especially without the meeting? You would end up with shit. No one cares enough to read closely over all of the tasks. People hate that stuff and it would be culled from your process simply by never happening.

But if you get everyone in a room and ask them to assign point values for the sake of finding out the cost to the business? Well, you still end up with shit on that front. No one cares enough to do a great job by themselves, if it’s even possible, and people hate this stuff and want to remove it from the process because they feel it’s a waste of time, even as they make use of the way better descriptions and feel good knowing what the whole team is working on. As a byproduct of the process and its shit, we all get to see the moon.

Caveats

There are some caveats here. Being evaluated in any way by the points output gives a lot of awful incentives to game them, even subconsciously, which leads away from good discussion. Also, doing punishing amounts of discussion over small bits of work builds enough process-hate to get people to check out and stop even listening, which also leads away from good discussion. And trying to evaluate work that is too remote (e.g. if you’re on a team that is too large, or is handling many totally unrelated projects, or is trying to work 6 months into the future rather than on stories for the next few weeks/month) will let people zone right out during the process.

For these discussions to happen you need a right-sized, reasonably focused team that’s only having the meetings they need to have, and they have to be able to talk without fear of being penalised for wrongness. This is sadly a tall order for some places!

So whatever you do with the numbers that come out of planning poker, please don’t measure your team by them in any sort of performance-review capacity, and though they’re better than nothing at all, please don’t trust the numbers to tell you the exact launch date.

But keep doing the estimation!

Keep watching the skies

It gives a key time to teach junior developers about your systems. It gives product, design, and QA people more confidence and context in the work being done. It gets everyone on the team invested in every task. And it uncovers a huge amount of work that you otherwise wouldn’t see until you were standing in the middle of it! This lets you adjust course before you have momentum built, while you’re less invested in work you’ve already done, which may even have been the wrong work to do in the first place if you’d only sat down and talked it through as a team.

These things are absolutely key to producing good software in a reasonable period of time and making life less miserable for everyone. It has saved teams I’ve been on so much hassle, so many times. We found the moon.

Planning poker absolutely helps us all to find it, even though it mostly sucks at accurate cost estimation, and people can grossly misuse the numbers it produces.

Installing Rust on Windows in 2018

Rust is a systems programming language in a similar space to C++ that I’ve been meaning to try out for some time. Reddit’s roguelikedev community recently began doing a community-wide roguelike-tutorial follow-along, and a member of the community conveniently ported the old python tutorial to Rust! I’ve got a repo to follow along here. So it begins. 😀

Or so it would have begun   D:

It turns out that installing Rust can be a pretty painful and laborious experience, particularly if you try to be clever and thrifty like I did. So here’s how to properly install Rust on Windows, using the MSVC++ toolchain, in 2018 — first a summary, then I’ll explain my mistakes briefly, and then I’ll show some screenshots to make it even more clear.

A note on my Windows version:

I used this process to install Rust on a Windows 7 machine. I expect that Windows 8, 8.1, and 10 have similar requirements, options, and results, but I can’t guarantee it will be identical. Things are most likely very different if you want to use Rust via the Windows subsystem for Linux.

How To Install Rust on Windows in 2018

  1. Download and Install the MSVC++ Core Build Tools, and select just the main Visual C++ Build Tools option, then proceed. It will include the Windows 10 SDK (yes, Windows 10 is fine even if you’re on 7 or 8) and in the background it will include the Windows C Runtime (often called the CRT).
  2. Install Rust using rust-lang.org’s rustup_init tool, follow its few prompts, and wait very patiently through the installation of rust-doc that can run for 20+ minutes without any indications of progress.
  3. Restart any shells you had open to give them access to your updated environment variables. You should be ready to run rustc --version and check that things worked.

That looks easy! What did I do wrong?

First, I made the mistake of customising the Build Tool installation — it wants to download and install 3-6 GB of data and I thought I knew better. Then, during the very long rust-doc installation my first time through, I grew concerned that it had crashed and cancelled my installation halfway through. Then later, I trusted that I had the same understanding of the phrase “Core Build Tools” as the Rust installer. I proceeded to wade through old github issues for hours while slowly uninstalling and reinstalling repeatedly, and tinkering until it worked.

So, some rules to avoid these pitfalls:

  • Do not customise the Core Build Tool installation! (unless you know you have to)
  • Do not cancel your rust installation halfway through! (if you do, you’ll likely need to do a full uninstall to get back to a working rust)
  • Do not trust that your idea of some jargon-y phrase like Core Build Tools is the same as the person who wrote the documentation! The Rust installer thinks of the “Core Build Tools” as the Core Build Tools and the Windows C runtime and the Windows SDK.

Screen by screen: How to install Rust on Windows

So first, download the MSVC++ Core Build Tools (the file is called vs_buildtools.exe):

The download is on this page, but not here at the top:

an image of several links which are (not obviously) not the build tool download links

It’s here, quite far down:

an image of the correct download link for the vs buildtools file

Launch that tool once you have it — as of June 2018, this is its name and icon:

an image of the build tools icon on windows

It should look like this when run, and it will spend a bit of time downloading a bigger version of itself and seeming to disappear before giving you anything useful:

an image of the build tools self installer

Once it finally opens up, only check off this one thing, and just accept that it’s going to be a multi-gigabyte download.

an image of the build tool options, with only one option checked off

Once that’s done, you should be set for Visual Studio requirements! Now to install Rust. First, download rustup-init.exe from rust-lang.org:

an image of the rustup-init.exe download link on rust-lang.org

Then run it and follow the prompts:

an image of the initial output of rustup_init.exe

And wait… a 5 up to a 20 minute wait for rust-docs to finish is totally normal. :/

an image of rustup init at the long-running rust-doc step

Hopefully, finally, success!

an image of rustup_init after successful install

Close your open terminals, open a new one up, and try running rustc --version:

an image of rustc --version returning its version

Then make a sample app by running cargo new --bin your_app_name, and try compiling+running it from within the new directory using cargo run --release as in the image below. I’ve added a few cat+ls calls to the image to show context, but you should see pretty similar things:

an image of cargo generating, compiling, and running a new project

If your project ran like the above, you’re all set. You can finally live on as a happy rustacean. Congratulations! 😀

Did something go wrong? Here are some quick problems/solutions:

advapi32.dll not found:

This is the first DLL in the list that the linker looks for, and this pretty firmly means that Rust can’t find your Windows SDK. Usually that’s because the SDK is not installed. You should download the MSVC++ 2017 Core Build Tools, install them as shown above (they’ll include a Windows SDK by default), and then try reinstalling Rust.

user_32.dll not found:

This also means that Rust can’t find elements from the Windows SDK — maybe it’s old, or has been modified. Try following the same directions for the advapi32.dll problem above.

mspdb110.dll not found:

There’s a theme here: Rust’s linker can’t find things because they aren’t there or they’re broken. This one (I think) is from the C Runtime. Try uninstalling your MSVC++ and following the instructions above.

Some other kind of link.exe-related error:

This is probably also due to a Windows SDK, C Runtime, or Core Build Tools issue. Try the above MSVC++ installation step again before anything else — if you’ve done that already, maybe there’s an old MSVC++ hanging around in the way? Look in Add/Remove programs — careful though, you likely don’t need (or want) to remove anything called a “Redistributable”.

The Rust installer says no MSVC++ is installed:

If you definitely want to work with MSVC++ and are getting this, make sure you’ve followed the instructions above, and if you have it is possible that Visual Studio has been updated and moved things around again. Until a newer version of Rust comes along to fix the issue, if you can find a file called “vcvarsall.bat” inside of a folder similar to C:\Program Files (x86)\Microsoft Visual Studio\2017\BuildTools\VC\Auxiliary\Build, running that on your command line with an argument to specify your architecture should set the correct environment variables for Rust to find your MSVC++ installation.

Remember: that will only set the variables for the single terminal window you run them in, and it’ll need to be re-run if the window closes. I have a previous post (see Windows CMD Aliases) that may give you some ideas about automatically running code when you open a terminal on Windows.

If you want to, you can just hit continue here. To do so, you will need the MinGW compiler installed, and Rust will then target the GNU toolchain on Windows. This will mean that you can’t link against libraries built with MSVC++, which might be a dealbreaker.

The MSVC++ download link that Rust’s Installer gave me says it’s expired!

This is a weird one and should only be happening for a few weeks.

Someone thought a random Hubspot account could be a good place to host a file that the installer linked to, and it ended up not being so good a place. There is already a merged PR to fix the issue and point to the link from Microsoft, which is what I use above. Follow the directions there and you’ll be okay.

If for some reason you need the 2015 Visual Studio Core Build Tools, you can still get those through my link to the 2017 tools above, but you’ll have to wander into customising what you install. Remember that you need a Core Tools option, a Windows SDK (8.1+), and a CRT (C Runtime) at the minimum for Rust to work.

Rustup/rustc/cargo complains that it has no default target:

You might just not have a target set. You can tell rustup to target msvc++ by running something like rustup default x86_64-pc-windows-msvc. If that doesn’t work, you may not have fully installed Rust, perhaps due to a lack of permissions, or due to a pre-existing Rust installation that got in the way.

You should try to uninstall rust using rustup self uninstall, and once you get it gone, reinstall it. Maybe try a custom location if you don’t have access to the .cargo folder it was trying to install into. When it’s done, it should look something like the screen above with green text that says it was successful.

Other problems / these solutions didn’t work:

Sorry! This was just the set of problems I ran into and can recall after a nearly sleepless night. If you’re stuck, don’t forget that Google is your first and best friend in the world of problem-solving, but you may be able to get interactive help from humans on the Rust Community Forums, or on IRC on irc.mozilla.org’s #rust-beginners channel. You should likely glance over the community’s code of conduct before jumping into these spaces. 🙂

Conclusion

Hopefully this has helped you get off the ground with Rust on Windows! If I can save anyone some time out of this, that would make my painful experience far more worthwhile. Go forth and Rust! And keep an eye out for my own wicked Rust roguelike, The Glass Oak!