Blog

January 30, 2022 13:30 +0000  |  Canada COVID-19 Politics 3

For those not up on Canadian politics (though this is all international news by now), a large group of truckers started what they call a "freedom convoy": a long stream of trucks have driven to the nation's capital (Ottawa) and demanded that the government end the vaccine mandate imposed on border crossings with the US. They see this mandate as imposing on the right of bodily autonomy (it's not exactly a "choice" when your alternative is starving) and they want it gone.

Unfortunately, that's the limit to any semblance of critical thinking these people have exercised on this front. There are a number of legitimate problems with this campaign:

  • The mandate at the border exists on both sides. In order to enter the US you must be vaccinated, so even if Canada didn't have this mandate, this would be a zero net-gain: you'd still have to be vaccinated to enter the US in the first place. This is likely a deliberate agreement between the two countries to ensure limited migration of the virus across the border.
  • Health policy in Canada is generally set by the provinces, and the federal government has no jurisdiction in this area. These people left their own provinces to protest at the seat of a government that can't make the changes they're demanding.
  • And finally, my favourite one is that their demands are not for the Prime Minister or even the House of Commons, but to the unelected senate and largely ceremonial Governor General, neither of which have the power to do anything without legislation voted on by the House.

The people running this thing are clearly not burdened with an overabundance of schooling, but that hasn't stopped tens (maybe even hundreds) of thousands of people from joining the campaign in their own cars. My brother is telling me that he's seeing cars and trucks lining up all over BC, and there are similar reports of smaller groups forming all over the country.

Who Are They

The protest has evolved from one ill-conceived campaign against a cross-border vaccine mandate into one against any attempt to further combat the virus and that's got a lot more traction with a lot more people.

There's a lot of different groups of people in this thing. You've got antivaxxers, anti-maskers, racists, homophobes, transphobes, and straight up Nazis in the mix, but it's important to note that these groups don't entirely overlap. My understanding is that the majority are anti-maskers, and while a lot of them aren't vaccinated, a lot of them claim to be vaccinated themselves. They're not all racists, bigots and Nazis, but a lot of them definitely share a lot of racist content on Facebook where this thing is being organised.

As an aside, seriously, if you're in a Facebook group where people are sharing stuff about the "great replacement theory", how do you manage to think: "yeah this is definitely a group I want to be in"?

What's Happened So Far

The result of all of this is that this mob has rolled into Ottawa to stand in front of Parliament to shout at an empty building about how they want their freedoms back. After the debacle of the American coup attempt, Canada's politicians decided to be smart and get the hell out of there well in advance. Trudeau and his family have been relocated to a secret location and other MPs have been warned not to go home but rather somewhere "safe".

Personally, I'm concerned for the residents of Ottawa, especially my family. If you cram enough trucks and people into a small town like that, getting them out of there becomes a real logistical problem. Even if the organisers decided to turn around and go home right now, how exactly do you coordinate that many cars when the drivers have been told that they're there to blockade? How will the grocery stores get stocked? How will emergency vehicles get around?

...and they're not turning around right now. People are still coming. In terms of infrastructure alone, how well can the city hold up when a bunch of people who should have flunked grade 6 social studies drive into town with no plan or intent to leave?

At least things have been mostly non-violent so far. There's been some vandalism, and some crass, shitty behaviour (not at all surprising), but unlike January 6th, no one has tried to kill or kidnap anyone.

Trudeau's Failed Leadership

Out of all of this, I think I'm most angry at Trudeau and his Liberal Party (though not for the same reasons as the mob). Canada has been dealing with COVID for more than 2 years now and while information was skint when this all started, everyone definitely knew that there would be a massive toll on Canada's medical infrastructure and the economy in general.

His leadership in these areas has been terrible during the pandemic. He effectively bet everything on a vaccine and did little to address the gaping holes in Canada's medical system that existed long before the pandemic. Doctors and nurses are still working 16-hour shifts watching people die every day. Hospitals are still underfunded, understaffed, and completely unable to handle the new reality: COVID isn't going away.

Inflation is way up, driving up food prices while wages have remained largely flat. Housing costs remain exorbitantly high, and as a result, millions of working-class Canadians are constantly afraid of losing their jobs, their homes, and finally their lives.

Trudeau's response to all of this as been to scapegoat antivaxxers and anti-maskers who, while objectively being selfish assholes, are hardly to blame for high inflation and housing insecurity. He's found a wedge to drive into the public, that keeps us all blaming each other instead of him for his complete lack of leadership in key sectors during a pandemic. What's worse is that by politicising the unvaccinated, he's driven a biologically significant portion of the public to dig-in and refuse vaccination.

People are idiots, but it's a leader's job to know this and find a way to help everyone despite their idiocy. Trudeau has done what all Liberals do though: found a way to keep his job by pitting Canadians against each other.

Why the Convoy is Stupid

There are legitimate criticisms of Liberal leadership, but we can't talk about them because doing so requires adult concepts like understanding other people's perspectives and accounting for nuance in complex topics. Trudeau doesn't want these sorts of conversations because it would inevitably lead to interrogating his failures, and so the convoy is great news for him.

Now he can point to a clearly identified minority who get their "facts" from Facebook as the problem, and then go back to doing nothing to actually help them. All of those people who are afraid of losing everything -- they now may well do just that, and he's cool with it. He's convinced enough of us that they're the real problem after all.

January 12, 2022 23:58 +0000  |  COVID-19 Mental Health Politics Science 0

It's been just over two years since this all started. Back in 2020 everyone with half a brain was concerned: there was zero immunity, not even an inkling of a vaccine, an endless void of things we didn't know about COVID-19 and mass graves being dug in urban centres around the world.

Since then, by some estimates around 5.5 million people have died from the virus. In the U.S. alone, COVID-19 killed more people in the last 28 days than car accidents killed all year. No matter how you cut the numbers, this has been far more dangerous than the flu. The threat was real, the evidence speaks for itself.

A few important things have happened since then though:

  • We've rolled out around 9.6 billion vaccine doses. Yes, the distribution of these doses has been grossly disproportionate between the rich and the poor (hooray for Capitalism!), and some of these have been more effective than others. Some doses have had some scary side effects (albeit in fringe cases), but huge swaths of the world are now demonstrably safer than we once were.
  • Our understanding of the virus has exploded, and with it, public understanding has grown considerably (though the misinformation is rampant out there as well). Some of the key critical pieces of information we've learnt so far include:
    • Children under 12 don't seem to be affected very strongly by the virus. In nearly all cases, if symptoms exist at all, it's indistinguishable from the common cold. They are however demonstrated carriers.
    • The vaccine does not prevent infection (fun fact: few vaccines manage this), but importantly while it reduces the negative effects of the virus on the recipient, transmission appears to still be common, albeit likely diminished compared to the unvaccinated.
  • The Omicron variant, while difficult to pronounce for some (seriously people, find a Greek to help you already) is proving itself to be a milder form of the virus. It causes far fewer severe cases, even fewer hospitalisations, and even fewer deaths. Among the hospitalised and dead, the highest proportion are the unvaccinated and those who likely would have bought the farm with a bad case of the flu.

So, as rational people who accept new information and circumstances as they are (rather than trying to distort them through a lens of bias) we must re-evaluate our response to the virus with this new information in mind. Let's recap the above into something easier to digest:

  1. People most likely to suffer severe side effects have a vaccine to protect them.
  2. This vaccine has proven very effective at keeping people alive.
  3. The latest (and dominant) variant is a demonstrated lower risk.

Now combine that with the effects of our COVID-19 countermeasures on society:

  • Domestic abuse cases are up
  • Education has been torpedoed for two straight years, disproportionately affecting the poor who lack access to study space, internet connectivity, and/or computers at home.
    • Putting aside the academic costs, the price paid by children in their social development will only be seen with time.
  • Substance abuse cases are up
  • Obesity rates are increasing among children (and I'm going to go out on a limb here and assume the same for adults).
  • Our collective mental health is an absolute disaster.
  • Our physical health is taking a beating too, with people avoiding hospitals, Cancers are going undiagnosed until it's too late.

It's in the context of all of the facts that we have to weigh the social costs of things like closing schools, gyms, and other public venues, cancelling public events, and mandating vaccines for children. On a personal level, it seems prudent for people to dial back the fear. It's not 2019 anymore. We know more, we have more defences, the risks to our health are greatly diminished and that's something to celebrate.

We need to calm down and stop screaming at our leaders to do crazy things like lock the country down again. If that was going to work, we should have done it (properly) two years ago. Doing it today will only give you the illusion of safety, which frankly is the more dangerous public policy. We need to stop trying to force parents to vaccinate their 5 year olds and start reaching out to people who have been isolated throughout the pandemic. Let's address mental health, tend to the wounds of those of us who really got screwed by all of this: the poor, the working class, the global south, and take a sober second look at the state of our health care system.

I'm going to do my part. It's been two years: I can recognise the results of my own social conditioning and I don't like what I see. I'm going to make a concerted effort to break down the walls I've built around me over the last two years and I encourage you to do the same.

I'm going to continue wearing a mask indoors when I go shopping, because while the science on masks-as-public-policy is still pretty fuzzy, I think more than anything it's a recognition of consideration for the feelings of others. As time goes on though, I expect to lose the mask as well. Once the official guidance changes over here, I'm also going to start going back to the office -- provided my team members are of similar mind. I need to get back to my life, and now that we have the knowledge & tools at hand, it's finally the right thing to do.

January 07, 2022 22:53 +0000  |  Free Software Linux Majel 1

For the last two years I've been working on Majel, a project that allows you to control your computer with your voice. The first incarnation was released back in March, but was dependent on Mycroft, so I've been working to rewrite it to be independent. The end goal: to be able to release it as an image file for the Raspberry Pi so people can just download it, burn it onto an SD card, pop it into their Pi and have it Just Work™.

The development process has been surprisingly easy, with only a few hiccups around audio processing in Python. The new architecture has proven to be really solid and I'm excited to share that in detail at a later date -- but that's not what this post is about. This post is about packaging for the Raspberry Pi and what a nightmare it's been for me.

For the purposes of this post, you just need to know that I wrote a Python application that interfaces with GNOME, Firefox, Chromium, Skype, and other desktop tools to do cool stuff.

What follows is a series of things I now understand that came at the cost of a lot of time and hair-pulling. If you're thinking about going down this road for your own project, my hope is that sharing my experiences here will help save you frustration in the future.

The CPU Architecture

Anyone who knows anything about the Raspberry Pi project can tell you that these little devices don't run the same kind of CPU you're probably used to. Where most computers we use today (not including phones) use x86 processors (typically built by Intel or AMD), the Raspberry Pi uses ARM chips. If your knowledge of the situation (like mine) ended there, then I'm about to save you some pain.

Just like the x86 ecosystem (which consists of i386, i686, x86_64 and other "sub-architectures"), the ARM family includes a wide variety of architectures which you need to build explicitly for when you're making your own stuff. For example, if you've got a Python wheel labelled aarch64 it will only run on 64-bit ARM systems, while one labelled armv7l will run on 32-bit ARM systems.

The Raspberry Pi's hardware 4 can run both but the default "Raspberry Pi OS" is 32-bit and exclusively runs armv7l binaries. If you want to use aarch64, you must install an OS other than the default.

Python Support

In the Python world, the vast majority of packages on PyPI are "pure-python" (ie. they will run on any system already running Python). However there's a lot of packages out there that're bundled with some compiled code (usually C or C++). These packages must be compiled exclusively for your architecture in order to run and if your architecture isn't supported with a pre-existing build, you either have to build it yourself (painful, especially on a Pi) or you're shit out of luck.

For example, the popular cryptography library is not pure python and therefore must be compiled for the architecture it's running on. Thankfully, that project's maintainers support a variety of platforms but note that armv7l isn't one of them.

In fact, finding a package on PyPI with support for armv7l is actually quite rare. Instead, Raspberry Pi users have a special "hack" on their system (one of many I discovered in my travels), an additional Python repo, enabled by default: piwheels.org.

If you're running Raspberry Pi OS, you'll find that nearly all of your not-pure-python packages are not coming from PyPI at all, but are rather coming from piwheels.org: a repository of .whl files, built exclusively for the Raspberry Pi. This is pretty great, though it was definitely a surprise.

If however you're not using Raspberry Pi OS and are instead using an aarch64-based OS like Manjaro, then there's no piwheels.org for you. Instead, you have to hope that the package you need has pre-built support for your architecture. Thankfully, aarch64 is much more common in PyPI, but it's not everywhere. The vosk package for example has armv7l packages but not aarch64 ones.

Finally, Poetry has an annoying bug/limitation in it that means you can't configure your pypackage.toml file work across architectures. Your poetry.lock file will only store hashes for one architecture at a time, so if you run poetry update on an x86_64 machine, the resulting poetry.lock will be entirely different from one generated from an aarch64 machine. As this undermines the whole idea of a consistent, distributable, versioned lock file, it's rather disappointing.

The Operating Systems

So now that we know a bit about the limitations of Python in different operating systems running on the same hardware, let's talk about those systems in more detail

Raspberry Pi OS (formerly Raspbian)

Raspberry Pi OS is Debian-based, but critically it is not your typical Debian system. In an effort to make using the Pi easy for everyone from children to seasoned professionals, the Raspberry Pi Foundation has applied a lot of tweaks and hacks to standard Debian which can catch you off guard if you're not ready for them.

Old & Busted Software

Like any Debian system, everything is old-as-fuck as the maintainers prefer stability over modern features. If you're using your Pi to control humidity in a greenhouse, this is probably a good idea, but if you're hoping to take advantage of modern graphical user interfaces, you're going to have a bad time.

For example, the current version of GNOME available for the Pi is two versions behind the GNOME project's release schedule and it's a good bet that that gap will grow with time. As for Firefox, the most recent version you can get is Mozilla's "extended support release" (ESR) which is a nice way of saying "we promise to support this version for years and years but it won't be meaningfully updated during that time*.

What's more, simply installing GNOME on a standard Raspberry Pi OS image absolutely will not work because there's something called pi-package installed by default that claims to have installed an inferior version of gnome-settings and that conflicts with the would-be-installed version. You must instead use a "Lite" version of the image (the one that doesn't come with X or LXDE) and then install GNOME from there.

Special Configuration Pattern

Configuration of the Pi is done with a program called raspi-config which is installed by default, but if you're using a Pi 4, most of the options you can select in this tool will fail to apply.

As best I can tell, Bluetooth is entirely broken from the start. None of the usual patterns I would expect to get it working (like running systemctl start bluetooth and opening the Bluetooh UI) resulted in success. This is not a hardware problem, but a software one. I can only assume that there's some special Raspian way to do this.

Non-standard Re-packaging

Chromium is a first-class citizen in Piworld, installed by default on the standard image, but strangely listed as chromium-browser rather than the usual chromium. You can even get Widevine support in it (so you can watch encrypted video on Netflix & Prime) simply by running apt install libwidevinecdm0. This deviates from what you see on a typical Chromium install, since modern versions of Chromium allow you to download Widevine support automatically. I can only assume that this is a special concession for the armv7l architecture.

Widevine support in Firefox appears to be impossible.

Kodi has been compiled to exclusively run without an X server or Wayland present. Undoubtedly this is to allow Pi users to just install Kodi and run it without the overhead of a UI they aren't using, but if you want that standard overhead, you're SOL.

Building Your Own Image

If your goal, like mine, is to distribute your app as a Raspberry Pi image, then you'll want to look into pi-gen, an automated system that let's you build a Pi image on an x86-based machine. It's impressively simple, but critically only runs on Debian-based systems. If you're running Fedora, Arch, or some other system, they have a Docker-based runner, but I couldn't get it to work. To get it working on my Arch system, I started a Debian VM and and it worked beautifully... after consuming a whopping 42GB of disk space!

My original idea what to build Majel automatically via Gitlab's CI. With a disk footprint like that however, I'm afraid I'm going to have to rethink that idea.

Manjaro

After running afoul of all of the above, I started looking into alternative base images to work with. Thankfully, Raspberry Pi's excellent Pi Imager (available on FlatHub) makes the burning of alternative images super-easy, and I found Manjaro Linux (a flavour of Arch Linux) to be a really good starting point for my project. In fact, there's a GNOME variant available so you can burn an image that boots into GNOME shell!

As an Arch-derivative, it runs really close to the bleeding edge, so installing a modern version of Firefox and Kodi was super-easy. There were a few surprises though.

It's Not the Same Architecture

While Raspberry Pi OS is running on armv7l, Manjaro builds all of its packages for aarch64. That means that piwheels.org is out of the question, and that there's still going to be some Python packages that aren't published to PyPI with support for Manjaro on a Pi (looking at you vosk).

Wayland is the Default

It's a "new hotness" sort of OS, which means that the default UI server isn't Xorg, but Wayland. For most people, this is probably ok, but for me, since my project relies heavily on Xorg (Majel uses pyautogui which can't do Wayland) this was a problem. Thankfully, you can switch to using Xorg simply by installing xorg-server and uncommenting the WaylandEnable=false line in /etc/gdm/custom.conf.

Widevine is... Problematic

While getting Widevine support in Raspberry Pi OS is easy, getting it working in Manjaro is pretty sketchy. Sure you can install modern versions of both Chromium and Firefox and they work great, but Widevine isn't there, and it won't autodownload, even in Chromium.

Instead, you have to install this crazy/amazing package called chromium-docker from the AUR. The installation process builds a local Docker image of Ubuntu wherein you install Chromium and you can take advantage of the aforementioned libwidevinecdm0. Running it from that point forward involves starting the Docker container and running Chromium from inside it. That's just... bananas.

Packaging is Tricky

The easiest way to make my project installable on Arch-based systems is to contribute an AUR package, but writing one that will install properly on both aarch64 and x86_64 systems was surprisingly not straightforward.

All the docs you read will tell you that there's one variable you set for package sources, conveniently called source=(). What took far too long to find was that you can actually suffix this variable name with the name of the architecture: source_aarch64=() and source_x86_64=(). You then do the same for the sha512sums=() variables and finally, you write some sketchy if/else Bash in your package() function to check if ${CARCH} is equal to aarch64 or x86_64 etc. Have a look at what I had to do for the vosk library if you're curious.

Creating Your Own Image Looks Easy

Manjaro has all of their OS builds available on GitHub, so from the outside it looks like making your own build should be easy. I haven't tried it yet though, so I can't comment.

Everything Else

With the exception of the above, working with Manjaro on the Raspberry Pi is delightful. Getting my Flic button paired with the Pi via Bluetooth was 100% painless and straightforward, and the OS in general has all sorts of nice creature comforts built into it, like zsh by default, a pretty drop-in replacement for cat, and a nice set of custom icons.

Ubuntu

Finally, there's Ubuntu, which admittedly I actively dislike. The whole proprietary Snap system, the ugly re-skinning of GNOME, the dependence on Debian unstable under the hood so everything is both old and broken... Ubuntu is everything I don't want in Linux under one roof. It's also hugely popular though, and likely the only place I'll be able to get Widevine easy out-of-the-box.

The first time I installed it, it locked up the mouse and keyboard for minutes at a time during the initial setup phase. As I write this, I'm still waiting for the initial boot to finish and the mouse is frozen on the screen. I'm not confident that my desire to see this work will be strong enough to overcome my contempt for this distro.

In General

The Pi is marketed as a tiny computer that you can leverage to do anything your heart desires provided you have the time, patience, and are comfortable with a low-power device doing the lifting. The question is though: is something as complicated as a voice-activated desktop automation system that plays streaming video even possible on hardware as limited as a Raspberry Pi?

It turns out, it's totally doable. In Raspberry Pi OS, I managed to bring up simultaneous instances of Firefox and Chromium and play "The Witcher" on Netflix by way of voice command. All processing, even the speech-to-text handling was done on-device and the performance was admirable.

The only caveat I will mention is that streaming video at full screen will absolutely not work at 4K resolution. In fact, I didn't get anything resembling a good framerate until I bumped the resolution all the way down to 1280x720. For my purposes though, this is completely reasonable: this is basically a very smart television after all and the quality of stream I get from Amazon Prime is abysmal anyway.

Conclusion

As long as this post is, it isn't even the end of my development process. I still have to give Ubuntu a fair shake and decide which of the above will be the reference platform for Majel. It'll install just fine on x86-based systems, but as the Pi is what I always envisioned for it, I want to get this part right before I officially "release" the new Mycroft-free version 2.0. Hopefully that'll be sometime in the spring, as I only have a few hours a night to work on it.

Until then, maybe the above will be useful to someone. If it was, please leave a comment! If it wasn't and you have questions, feel free to ask :-)

October 13, 2021 22:25 +0000  |  Violet 0

My sister in law is wonderful, but she's also strangely infuriating. She's one of these people that can be handed the absolute worst thing in the world and find a way to see the good in it.

So you might imagine how her reaction her daughter being diagnosed with stage 4 neuroblastoma might conflict with my natural tendency toward anger, frustration and helplessness. Somehow, every time I check in with the family, she's paradoxically positive about the whole thing.

  • My brother has got his head down, working to fight this thing.
  • My mother is angry.
  • My father is depressed.
  • ...but Shawna goes on and on about how grateful she is.

It's taken me months to understand it, but I think I finally do. All this time I've been angry at a god I don't believe in for giving my niece Cancer, and Shawna's been looking at the reality of the situation:

Violet has Cancer. This is a fact. A terrible fact, but it's not something to which we can ascribe malice or blame on any individual. It's rather pointless to waste energy being angry about something that wasn't consciously inflicted. Instead, it makes sense to recognise the beauty in this moment:

  • The literally hundreds, even thousands of people who are rooting for her, donating time, money, toys, and books to her.
  • The amazing generosity of the Ronald McDonald House that has given her family a home while Violet is treated.
  • The Canadian health care system, funded by the whole country to give Violet a fighting chance.
  • The constant flow of encouraging messages from around the world.

I'm not sure that I have it in me to be so clear-headed about this, but I admire her for her perspective. It's definitely the healthier attitude, both for her and for Violet. I'm going to try to be more like her.

September 22, 2021 07:41 +0000  |  Economy 4

We've managed to do what for many in our generation is considered the impossible: we've bought a house.

It's a new build, 4 bedrooms, and has all sorts of fancy things like underfloor heating on all three floors and a heat pump keeping everything warm. The building material is also atypical for British homes (that's good) and so far the place is so warm that we often keep the windows open on cold September nights.

Financially, we're doing alright. The mortgage is for something like 17 years, but since we've been saving for so long we managed to make a substantial down-payment so that our monthly payments are lower than we were paying when we were renting. The mortgage terms also allow up to 10% overpayment each year and our fixed term is for 5 years, so it's possible that we'll be able to pay the whole damned thing off in as few as 10 years.

So far it's been pretty great. For the first time in years, my home feels warm and dry. No more ridiculous light switches on strings or "power shower" installations, gone are the walls so poorly insulated that heat just bleeds out throughout the day. We have a dishwasher. Dear gods have I missed dishwashers.

I'm not sure what more there is to say. We're still working on furnishing it, but once we have a few important things like a couch and dining room table, I'll shoot a video to share.

Note: The title of this post isn't a typo, but a reference to Anna's inability to pronounce the phrase "new house" 😂

July 23, 2021 16:22 +0000  |  Climate Change Employment Ethics Shell 1

Update: 2½ years later, I've realised how naïve this was and outlined that naïvety in a separate post.

I made a career decision a few months ago that I've meant to document here for a while now. I left my previous job at Workfinder that was making me miserable, for an amazing job with a green energy company called Limejump.

The people I work with are wonderful. They're both technically capable and respectful human beings. I'm not just talking about my immediate colleagues either. In my 7 months with the company, this has been my experience with everyone I've worked with there -- all the way up to the CEO. People are friendly, enthusiastic, and professional. The team collectively owns mistakes and works together toward common goals that we (the business and engineering) establish together. Seriously, it's pretty great.

I cannot stress enough how powerfully black & white the move has been for me. To come from a job where the higher-ups regularly micromanaged, second-guessed, and belittled everyone and then shoved us under the bus when things went wrong, to where I am now is really quite jarring. I'd spent so much time being miserable that I'd forgotten what it was like to work with decent people.

If you find yourself in a similar situation, I'm here to remind you that not every company is as toxic as the one you're stuck in. If you have options, get out while you can! Hell, if you can roll code, I might be able to find you a spot with us.

So yeah, that's the good news: I'm finally happy in a job again. I'd forgotten what that was like, so the experience still leaves me a bit giddy, even after 7 months.

"So why the dire-sounding title?" I hear you asking. Well, Limejump comes with a significant piece of baggage that I had to unpack and come to terms with before accepting the job. That's the real topic of this post: Limejump is owned by Shell.

Yes, that Shell.

If you know me personally, it's likely that you know that I have some hard lines I don't cross for employment. I don't do guns, I don't do fossil fuels, and I certainly don't do anything illegal. The reasoning behind this is one of conscience, but it's also rational: gaining financially from destroying the world you have to live in makes absolutely no sense. Shell violates the fossil fuel rule fundamentally, and historically has a long documented history of Evil under its belt.

And yet, here I am, taking a paycheque from Shell, and to my mind, doing so with my morals intact. That probably sounds antithetical, so let me explain:

The way I see it, Shell is a publicly-traded company that must, like any other, do evil. It's insane, but this is how capitalism works: a publicly-traded company can't knowingly refrain from doing evil if doing so means that it will make less (or even lose) money for its shareholders. If your goal then is to save the earth from companies like Shell, you have but two choices:

  1. Make Shell illegal. Sue them into oblivion or figuratively kill them by revoking their charter to exist.
  2. Find a way to make doing evil less profitable than doing good.

To be clear, I am all for Option #1, but no amount of screaming from my blog is going to work on that front, so unless activists and human rights lawyers have a need for some high-level software design, I'm afraid I'm not much use to that cause. I have however been offered an opportunity to move on option #2.

Limejump is doing something extremely ambitious and technically difficult: we're developing a framework for consolidating disparate green energy sources into a sort of distributed power plant that compensates for all of the fluctuations inherent in green energy solutions. Sometimes the wind isn't blowing, and the sun isn't always shining, and yet you need power for your laptop at 3am.

The number of companies on the planet even bothering to try to solve this problem is tiny and almost none of them have the sort of resources that Shell brings to the table. If we can prove that this is viable (spoiler alert: it definitely is, we're doing it), then the reality of free, limitless energy becomes a serious "carrot" to pull companies like Shell away from fossil fuels. Combine that with the "stick" in actions like Extinction Rebellion, law suits, rising fuel prices, and political pressure, and I believe that you can steer this earth-killing beast of a ship into a force for Good. Not because I believe that a company can have a conscience (it can't), but because that's where the money is.

Until or unless Option #1 can happen, this sort of work needs to be done, so I took the job. I hope it was the right choice and that I'm not being naïve. I suppose that's a question for Future Me, but for right now, it honestly feels like the Right decision.

June 22, 2021 20:11 +0000  |  Family 0

I've been carrying this around with me for a while now, and I've still not fully wrapped my brain around it. I have a lot of feelings though, so I'm going to hash them out here. This post may well come through as a bit of a disjointed rant, but I feel like this is the sort of thing that needs to be recorded here, even if it's not wholly coherent.

My niece Violet, the beautiful, energetic, amazing little 8 year-old has Cancer.

The details of what we know right now:

  • It's called "neuroblastoma", which basically means tumours growing on nerve endings around her kidneys, liver, lymph nodes, and spine. It's in her bone marrow for fuck's sake.
  • This is typically something you see in much younger kids, around 2 years-old. Most often it's discovered when they're younger as a single growth, at which point your chances of survival are higher. Violet is "Stage IV" however, which is very bad. It's likely this Cancer has been with her for years and gone undetected as she's had no symptoms until she had a seizure a couple weeks ago.
  • All hope is not lost though. There's a variety of treatments that this poor little girl is going to have to endure, from chemo, to radiation, to surgery, to an array of drugs and antibodies. If we're lucky, the fight will be long, but end in victory.

Her parents, sister, and grandparents on one side have all moved down from Peachland into Vancouver, staying at the oh-so-fucking-amazing Ronald McDonald House (seriously, send them money if you can) while they wait out treatment.

My brother Matt is half living out of RMH, and half out of a trailer while he goes to work every day, while his wife Shawna basically lives in the ICU with Violet. Her parents are at RMH with Violet's little sister, just trying to keep the family together and somewhat sane.

My parents are stuck up in Kelowna, taking care of Matt's two dogs, feeling about as helpless and frustrated as I am, thousands of kilometres away. "You could come here", Matt told me, "but I don't know what you'd do. You can't even get into the ICU to see her."

Christina monitors Facebook for updates from Shawna just trying to stay connected to this gods-awful nightmare, and me... well I suppose it's the result of my upbringing, but I'm angry.

It's irrational anger of course. You can't blame "God" once you realise he doesn't exist, but that doesn't change the fact that I grew up surrounded by people who assured me that he does... and that he loves you... just enough to give you fucking Cancer when you're eight years old.

Idiot myths aside, I'm angry at the universe, because even after I shed the silly stories about talking snakes and slavery being a-ok, I still had this naïve notion that there's a justice in the world, that Bad Things happened to Bad People, and that Good People would be spared. Consciously knowing that that's bullshit isn't enough: I still feel cheated. I find myself looking for reasons how maybe I did something wrong to cause this because somehow, deep down I still think that the universe is moral.

But it's not. 8 year olds get fucking Cancer, while Nazis, rapists, and murderers live into old age.

"I used to think it was awful that life was so unfair. Then I thought, 'wouldn't it be much worse if life were fair, and all the terrible things that happen to us come because we actually deserve them?' So now I take great comfort in the general hostility and unfairness of the universe."

— Marcus Cole, Babylon 5, "A Late Delivery From Avalon"

Trying to look past the anger, I'm trying to be rational and it's not helping. Either I do nothing and she beats this thing, or I do nothing and she dies.

I have some money, but money can't fix this. Regardless, her community in Peachland is all pulling together for her and there's a GoFundMe that's raised CAD $26,000 already. They don't need my money.

I have bone marrow, maybe I can donate it?. It turns out that they don't really do that anymore, as it's more effective to extract your own bone marrow before the treatment and then re-inject it afterward. The risk of rejection is much lower and you don't have to search for a match in a haystack of donors.

I can't even visit 'cause I can't get into see her.

So I'm standing here, on the other side of the world — which might just as well be down the street — helpless and angry because the universe saw fit to give an 8 year-old Cancer.

May 13, 2021 16:40 +0000  |  Fun Stuff 0

On second thought, that whole "let's build a Crazy New Thing" energy I had might just get preempted by something shiny getting released tomorrow:

May 11, 2021 22:51 +0000  |  Free Software Majel 0

I'm going to try to do a better job of recording my development process here, and to that end, I wanna talk about my latest Big Shiny Idea.

My Majel project was mostly well-received, but the most common piece of feedback I got was how hard it was to install. The dependency on Mycroft really kicked the project in the nuts because Mycroft isn't really user-friendly and the company behind it doesn't appear to be prioritising that aspect because they intend to make their money selling physical devices.

On top of that, Mycroft isn't exactly ideal for this sort of thing, since it's operating on the same premise as Alexa & Google Home: it's actively listening for commands which means there's a constant battle between being able to hear said commands and you know, playing music. I'm just tired of saying "Hey Mycroft... HEY MYCROFT" and getting nothing because it can't tell the difference between my voice and the one on the tv.

So I have a new plan, with a new architecture, and dreams of usability. Fun stuff!

At the moment in my head there are at least 3 components: the "orchestrator", the cloud service, and the remote.

The Orchestrator

This is basically what Majel already is, but I'm going to refactor it to leverage pyautogui and control your whole desktop rather than just your browser.

The Remote

No more yelling at the screen. You have an app on your phone consisting of a two buttons: listen and stop, along with the possibility of a few presets you use often. These buttons send messages to the orchestrator to tell it what to do.

There's no reason this has to be just a mobile app though. It can be a tap on your watch, or an IOT button if you like.

The Cloud Service

Unfortunately, after a lot of digging, I've found that there's no (easy) way that you can have a web app or mobile app talk to an unencrypted websocket. There's restrictions built into most platforms that block that sort of thing, so you have to encrypt the traffic, and the easiest way for non-nerds to do that is to use a 3rd-party service. This is that service: a dumb relay between remotes and orchestrators that itself cannot impersonate a remote (for obvious security reasons). This cloud service could be self-hosted of course, but for new users, or people who just don't care about that sort of thing, remotes & orchestrators will connect to majel.danielquinn.org.

So that's the idea. I'm still in the planning phase, but I've got a lot of energy behind me on this for the moment. We'll have to see where that leads. For now, here's the diagram I worked out tonight:

May 07, 2021 11:27 +0000  |  Health 0

I have science running through my veins!

I'll be 42 this July, which was enough for me to make the cut for the UK's COVID vaccination programme. Registration was remarkably easy, and unfettered by any attempts by private businesses to inject themselves into the process: I received a text last week that directed me to the official NHS website, entered a few bits of confirmation info, selected a date and time, and I was done! All I had to do was show up.

Today I rode my bike down the road to a converted bowling club where a dozen volunteers shepherded us around and moved us into a waiting space, to the nurses who jabbed us, and back to another waiting space where they ask us to stick around just in case. That's where I am right now, and I'm thinking I'll stick around a while longer 'cause I want to be sure I'm alright.

I received the Oxford/Astra-Zeneca vaccine, which wasn't my preference, but you take what you can get. This is an adenovirus-based vaccine that likely comes with fun side effects like fever, muscle pain etc. There's also a very small risk of blood clots that I have to be aware of, but the risks are tiny in comparison to actually getting COVID, so I'll take it.

Part of me feels a bit guilty though. I'm benefitting here from "vaccine nationalism", the process of rich countries buying up global stock and vaccinating their whole populations first before poorer countries can get access. I'm at a much lower risk than an 80 year old man in India, and yet I'm now (partially) protected, and that man is going to die. This whole ordeal has been an exercise in understanding monkeyspheres and I don't think I've really come to terms with any of it yet. I just wanted my family protected, and then me protected... is it really so wrong to prioritise these above strangers on the other side of the world?

The question is broader though, as we begin to see how the virus is mutating in India and other similarly unprotected populations. Perhaps selfishness isn't enough. Vaccine nationalism may even prove itself to be a fault in the system that COVID exploits. Only time will tell.