Blog

April 18, 2019 11:04 +0000  |  Free Software 0

A while back I made a small contribution to GitLab and they were so appreciative that they sent me a free mug which I then tweeted about.

This tweet was rather popular, as it was re-tweeted by a bunch of GitLab contributors and staff, and among a few thank-yous, I received one private message from someone asking about how easy it was to contribute and if I had any tips about the process.

As I've done this a few times (mostly as on-offs) and have a few ¹ ² ³ Free software projects out there myself, it turns out I did have some pointers. I thought it was worth sharing them here.

  1. Respect the requests of the project. If they have a coding style, follow it as carefully as you can. They may come back with requests for changes to conform to the style guide. Just roll with it and adjust your code. For large projects especially it's important that all contributed code conform so that the total project doesn't end up looking like a Frankenstein of different styles.
  2. Don't go big (at first anyway). Make your first merge request a small one that fixes a simple thing and/or adds a simple feature. If your changes introduce new functionality, make sure that your merge request includes a test or two to support it. If you don't include a test, it's very common for the maintainer(s) to request one as tests (a) help others understand what your changes are supposed to do, and (b) ensures that other people's changes don't accidentally break your stuff down the road.
  3. Be accommodating. This overlaps a bit with 1 and 2, but basically the thing to remember that while you think of your addition is a gift (and it is), it's also a burden to the maintainers. While your code may fix a bug or add something awesome, if it's hard to maintain/understand, doesn't come with tests, doesn't conform to the established style, or some-other-thing-that's-important-to-the-maintainer(s) then you're introducing pain rather than offering something valuable. In a well-maintained project (like GitLab) the maintainers will be friendly and responsive and work with you to get your merge request into a shape that's compatible with the long-term goals of the project. Work with them to do what's needed. Making your first merge request is just the first step toward actually getting your changes merged.

As for the technical part, this is a pretty good process for any merge request to any project (though admittedly I didn't follow this for this one merge request to GitLab as it was just a documentation fix):

  1. Check out the code locally and get it running. Depending on the size of the project, you may not be able to get all of it up, but at least get the part you want to change/test.
  2. Run the tests and make sure they pass.
  3. Create a separate branch off of master (or whatever branch the project asks you branch from)
  4. Make your changes.
  5. Add some tests to confirm your changes (you may want to do #4 before this one).
  6. Run all the tests together to make sure they still pass.
  7. Commit everything. Some projects ask that you break up everything into logical commits, while others ask you collapse everything into a single commit. Check the rules for each project to see they have such a policy. If not, use your best judgement.
  8. Make your merge request!

April 02, 2019 22:46 +0000  |  Politics United Kingdom 0

Stephen started a conversation with me over a private Twitter chat the other day and I wanted to share it here (with his permission of course). I think it provides a pretty good snapshot not just of what the hell is going on over here, but also of how I feel about all of this mess at this time in my life.

This isn't a verbatim copy/paste, as I've tried to fix grammar, spelling, and message sequence where appropriate.

Third loss???? WTF is going on over there?

It's what you get when you put a few hundred people in the House who consider their own careers (and personal interests) above the country and its citizens.

  • The people were idiots and voted to leave (barely)
  • The new PM decides that 51% is a mandate and does her best to get a smooth exit
  • She spends 2 years fighting with her own party and not consulting the opposition about what sort of deal the UK wants, then goes to Brussels where she's treated as the UK deserved to be treated: a 2nd-rate country based on a tiny island off the coast of a massive economy, suffering from delusions of empire.
  • She returns with the best possible deal she was ever going to get (considering that she wasn't interested in doing anything the opposition wanted)
  • That deal is rejected by the opposition (duh)
  • It's also rejected by most of her own party because she's surrounded herself with disaster capitalists, hard brexiters, and a few remainers.
  • The deal won't pass
  • The alternatives won't pass
  • The default is no-deal
  • No deal means we are seriously fucked: food shortages, blockades, population exchanges... the whole thing. The House is playing with fire and doesn't give two shits who gets burned.

Ah but the house voted against no deal lol

Yep looks like you're fucked

Sorry....

Yeah don't remind me. Honestly, I was happy to have this country go up in flames, but now that I've got a kid here (who still doesn't have a passport (we're waiting on the government) I can't conceive of a way to get us out -- smoothly or otherwise.

To give you a rough Idea, I plotted on Google Maps the other day, the route to Dover on foot -- assuming I'd have to walk it to GTFO of this country. It's 37 hours straight walking for the record.

Do you absolutely need a passport? I can cross to the US with Everett without him having a passport

That's insane, why would you do that?

The UK isn't in Schengen, so it's full passport controls to enter & exit the UK.

That is zombie apocoplyse like talk.

My point re passports is only that I need a passport to get to the US but the kid doesn't because of age. Mind you that is by land.... not by air, and you are on an island... so yea....

I am honestly this concerned.

Food shortages mean looting and rioting. The Brits are not prepared for this in the slightest.

Oh and then there's the mass currency devaluation and liquidity controls that'll likely come in as well.

I figure if I can get to Dover, I can walk through the tunnel (assuming the trains are offline due to no-deal.

Say you get the passport, what would you do? You're tied economically to the UK.

OK that was nuts

What you just said

We're not really tied, no. Christina has a good job, and I have a good skill. I can work anywhere I want, and Christina can find work given her reputation. I'm not worried about us economically, aside from the savings I have in pouds.

I know you are mobile but I was thinking about Christina - academic jobs are not falling out of trees, but if you think you could then cool.

why not move your savings to Euros and Cdn?

BEFORE Brexit?

I've been doing that, but we don't want to move everything just in case.

But I do have more here than I should. I keep putting it off whenever good news comes across the wire. It makes me think that I won't need to move it.

There was good news? It's been one shit show after the other.

It's incredible that things have fallen that much over there.

It depends on how this all plays out. With each rejection, we move closer both to no-deal *and* to repeal of Article 50. The hope is that as all the alternatives fall away: general election, 2nd referrendum, different deal... you're left with only 2 options: no-deal, and no-leave. The ECJ has already ruled that the UK can unilaterally repeal Article 50 at any point until they actually leave so... it could go either way.

They say that you're supposed to judge risk not just on the odds, but on the outcome of the alternatives. If one option is "Zombie Apocalypse" bad, and the other is "ok so we don't starve", then the rational thing to do is plan for the apocalpyse.

Really? The UK can just walk away from this without the EU's permission? Hmmmm the problem now is the deadline, there is not enough time for a referendum and/or election.

So yeah, that's what's happening over here. I hope your day is better.

February 23, 2019 13:38 +0000  |  Anna Family 5

Anna Hermione Io Angelopoulou-Quinn

It's been a few weeks, but I didn't want to officially announce her to the world until she had a name and believe it or not, that took a while to put together. It turns out that selecting a name for your child when she's the product of a cross-cultural relationship is actually pretty difficult.

We had a number of restrictions guiding our decision-making process:

  • I wanted the name to be exciting, but not in the way Christina thinks is exciting.
  • Christina wanted the name to be interesting, but not in the way that I think names should be interesting.
  • The name had to be "doable" for both families. Names that make sense in Greek mouths aren't always compatible with white bread world I grew up in.
  • It couldn't be too long, because her family name was already imposing.
  • It couldn't have an r in it, because Christina can't roll her r's for the Greek pronunciation.
  • It had to be pretty, because we both like pretty.

We wrestled with the name for weeks after she was born. What originally felt like an easy job spiralled into a constant debate:

"X is lovely, but what if no one will take her seriously?"

"I like Y, but I don't think your parents will get it."

"What about Z! It's awesome, right?", "No."

The process was especially hard on Christina who went back-and-forth a lot, long after I had resigned myself to a position of "any of these 5 will do". In the end though, we got there, and my daughter is officially ready to meet you all.

An explanation of the name, for those of you who might be a little confused:

Anna (Άννα) is simple, pretty, and universal across cultures. The name is common in Canada, Greece, the Netherlands, Russia, Turkey, etc. etc. It's unlikely to catch anyone off guard and pronunciation/confusion are probably not going to be a problem for her.

Hermione (Ερμιόνη) is a traditional Greek name that somehow became rather popular in the UK. Then JK Rowling wrote Harry Potter and with it created the badass that is Hermione Granger. For those of you who never saw the movies, it's pronounced "her-my-knee".

Io (Ιώ) is named for my favourite moon in the solar system. Pronounced "eye-oh", it's a fascinating world warped and pulled through tidal forces acting on it from Jupiter and its sister moons. Seriously, read the Wikipedia article. Io is amazeballs. The name also originally comes from the Greek Goddess, but that story is dumb and pales in comparison to the reality of space.

Angelopoulou-Quinn (Αγγελοπούλου-Κουίν) is the hyphenate of our two family names -- sort of. A fun fact about Greek family names is that they change based on the gender of the person. Additionally, countries outside of Greece often don't recognise this which leads to cases like Christina: her family name is Angelopoulou, but when acquiring her British citizenship, the authorities over here wouldn't recognise the different spelling and required that she have her father's last name: "Angelopoulos". So, while the name on Christina's British passport (and our marriage certificate) is "Angelopoulos", that's not really her name. It's going to be a fun one to explain at customs I'm sure.

Welcome to the world Anna Hermione Io, first of her name. I'm excited to see who you become. Until then, we can all watch you grow.

January 05, 2019 18:58 +0000  |  6

A few people have been asking if we've got a registry out there so people can send us Cool Stuff for the baby. Well if you're one of those people, or just feel like sending something for the latest member of our family, here's a list to give you some inspiration:

I believe both sites will let you buy a thing and have it shipped directly to us, so you don't have to worry about trans-atlantic postage.

January 05, 2019 18:34 +0000  |  2

Look at me, posting my 2018 recap just 5 days into 2019. I think I've grown.

In some respects, this was kind of a big year for me, but depending on your point of view, 2018 is rather unimpressive when compared to some of my previous years.

Personal

This was kind of a big year on this front. Christina and I are still happily married and living in Cambridge. Some friends have moved away (back to a stable country with promise and no Brexit, how dare you?) and gained some new ones. We also moved to a new part of Cambridge -- into an actual house. It's the first time I've lived in a house in 18 years and so far, I don't like it.

One thing has pretty much dominated our lives this year though...

Pregnancy

Christina got knocked up this year -- on purpose even! The baby is due any day now, but her coming into the world will have to be a note for 2019.

For the most part, the pregnancy has gone well. Christina is uncomfortable, but by comparison to what she's heard from other mothers, she insists, this has been surprisingly easy. She was cycling to work even until yesterday, but she's now officially on leave, probably until around July. I'm afraid she might go a little bit crazy without a day job.

For my part, I haven't really had much to do (yet). Christina's a fully capable woman who, outside of the occasional help off the couch, hasn't really needed help, even when I insisted on giving it. I expect the bulk of my contribution will come after the kid is born, while we sleep in shifts for a few months. I'm so not looking forward to that.

Once we announced that we had a kid on the way, our friends Matt & Mila were especially supportive, offloading a bunch of their baby stuff to us as they prepared to return to Canada. Watching them raise Kiera over the last year has given us a lovely window into what to expect. I will never forget the look on Matt's face when I bumped into him in Tesco just a month after Kiera was born. I saw my future and it was scary :-)

Grandma Nana

This was also the year my grandmother died, though for those of us who knew what she was going through, it was more a relief than a reason to despair. Grandma had been fighting pulmonary fibrosis for thirteen years, and was ready to go. She exercised her right to die on her own terms, but I'll miss her nonetheless.

My Mom Beat Cancer

My mom, smoker for roughly half a century, came to me back in May with news that she had breast Cancer. It wasn't too far along, and the doctors were confident that she could beat it, and she did.

It's hard to explain what those months were like for me. I found out while I was on vacation visiting family, and everything that came after the news felt surreal. I am not ready to lose my mom yet. What would this be like for her? What kind of pain was she lined up for to fight this? Would my daughter ever get to know her grandmother?

revelstoke1.jpg

I can't imagine what it must be like for people in countries without socialised medicine. Along with the impending loss of a family member, you'd have to consider the ramifications of crippling debt that would follow. In Canada however, my mom walked into the hospital and received surgery and radiation, covered by public funds. She beat the plauge of the 20th century and got to keep her house.

I am so proud of her, but more than that, I'm relieved that she's still around.

Weight Loss

Finally, I started reversing my slow upward trend of weight gain over the last few years and lost roughly 7kg (15.4lbs) over 6 months. I'm feeling healthier and have more energy, and the process has opened my eyes to the amount of bad information we all get when it comes to food.

I lost weight (slowly, and responsibly) by following physics: I took the number of calories required to keep me alive on a day-to-day basis and consumed a few hundred calories less than that number, every day for six months.

What surprised me is how little I knew about a healthy diet in general, namely how little weight loss has to do with (a) exercise or (b) so-called healthy foods. You will absolutely lose weight if you limit yourself to a cookies-only diet, so long as you limit those cookies to the right number of calories per day. Everything else: vitamins, and minerals: that'll keep your liver from failing, but eating more calories than you burn will always make you fat.

Exercise is another lie we collectively follow. Yes, it's absolutely good for you to be active, but if you're expecting a bout of exercise to be the crux of your weight loss programme, you're in for a disappointment. Running on a treadmill for 30min burns roughly 2 cookies worth of calories. You'd have to run on that treadmill for about six hours to work off a single cheeseburger.

Mostly I've managed this by eating the same as I always have, but simply eating less of it. I still consume an inordinate amount of chocolate and indulge in burgers from Five Guys from time-to-time, but always in the context of keeping things under that limit, and it's worked.

As I'm a data-nerd, I've collected the results into a nifty chart that updates every day here

The Vancouver Seawall

Travel

2018 was a rather limited year for travel. With the exception of 2 Canada trips, we mostly stuck close to home.

Toronto

Christina had a short conference she had to appear at in Osgoode Hall in Toronto, so I came along and we turned it into a short holiday. It's was nice to see some friends again, including the city I love, and introduce them to my wife. We ate at all of my favourite places: Futures, Burrito Boyz, Alexandros, (Christina approved of the gyros), C'est What, even Fran's! I got to spend the day with Kelly, have lunch with Lara & Theresa, and go on an epic walk through the Don Valley with Stephen, rounding out the evening at "Snakes & Lattes" with our respective wives.

in-toronto.jpg

Toronto's an amazing city and I miss it dearly. It was wonderful to be there again, if only for a little while.

Brussels

For Eurovision this year, Christina and I hopped on the Eurostar and visited her cousin in Brussels. It was just a short weekend trip, but we met her new boyfriend, visited Mini Europe, ate some burgers and cheered for Estonia (well I did anyway) while we watched the show on Matina's "fabulous A/V system".

Assuming Brexit doesn't destroy the UK in March, I'm thinking maybe this year we'll host a Eurovision party and return the favour.

Canada & Wedding #3

The big bit of travel this year was the voyage home with my new family members in tow.

Christina, her parents, and I all hopped on a flight to Vancouver in July for a "see as much of Canada as you (reasonably) can in in 3 weeks" trip. Her parents had never been to Canada before, so I was determined to show them a good time.

This was also the occasion for our third wedding -- it was also my favourite of the three. To all of you who came, thank you so much for making it the Best Day Ever.

doughnut.jpg

The trip included just over a week in Vancouver, where we walked all over the city: Stanley Park, Commercial, the West End, Gastown, Chinatown, UBC, up to Grouse Mountain, and Granville Island. We saw Bard on the Beach, went through the Aquarium, and walked most of the Sea Wall. You know, touristy things. We even checked out Dude Chilling Park, which Carol thought was hilarious.

Once we were through with Vancouver, we headed up to Kelowna to see the rest of my family. My parents put us up in a nearby condo, and for most of that week, we just decompressed from the excitement of the previous one. Still, we had a bunch of family visits, a trip to see some kangaroos, and a walk along the Myra Canyon Tresles where we managed to see a couple of moose wandering up the path to the top of the mountain.

After our week of down-time, we headed North to Revelstoke where we crashed for the night, then onto Banff to see the prettiest part of Alberta for a couple days. Unfortunately, after the first day, the forest fire smoke made sticking around intolerable, and the staff at the excellent Falcon Crest Lodge were cool with letting us check out a day early.

carol.jpg

We headed East into the prairies, over to Drumhellar, watching the land flatten out around us. It wasn't as dramatic as Saskatchewan, but we weren't going to get that far on this trip. We spent an afternoon at the Tyrell Museum, and then headed into Calgary for a proper steak dinner. That was our last night in Canada.

Overall, and with the exception of Wedding #3, I think much of this trip was (at least to me) to give Christina's family a good impression of where I came from. Her parents got to meet my family, my friends, and my country -- as best as I could show it anyway. It was an amazing trip, but it took a lot out of me.

Amsterdam

The last trip out-of-country was just to Amsterdam for another RIPE hackathon, this time on quantum computing. My friend Mihnea put me up while I was in town and he came out with us for the closing dinner of the event. I miss that town a lot :-)

Revelstoke.jpg

Professional

Only one big thing went down in 2018 on this file: I changed jobs.

MoneyMover → Founders4Schools

I loved working at MoneyMover. The work itself wasn't particularly exciting, but the people -- I love the people there.
Everyone is so friendly and encouraging. You really get the impression that people care about you and the work they do. It's unfortunately something quite rare in my field.

moneymover.jpg

However, the work wasn't really challenging me, and I was beginning to worry that I was missing out on some critical fields of development in the industry. In IT, you're only so valuable as the technologies you can keep on top of, so this is the sort of thing that can hurt you if you take your eye off the ball for too long.

So when the opportunity to move onto a charitable organisation that was promising more complex work, better pay, and a great parental leave package, I couldn't say no. I started at Founders4Schools in November, and am slowly settling into my job. I've stayed connected to MoneyMover though, doing a little contracting work for them here-and-there when I have the energy out of office hours.

Free Software

This year was kind of a big deal for Aletheia and Paperless, and I had the wisdom to not start anything new ;-)

Aletheia

I started this project in 2017, but it was 2018 where it got a lot more people looking at it. The biggest event of course was the talk I gave at PyConUK: the longest, and most nerve-wracking talk I've ever given. People tell me that they couldn't see it, but let me tell you that this was the most stressful moment in my professional life. Still, it felt amazing, and I got lots of exciting questions and comments afterward.

I also did a guest spot on a local university podcast called PirWired. Sure, the show is hosted by a friend of mine, but the audience is non-technical people interested in the subject my technical project is trying to solve. Rahel was a great host, and the experience was a lot of fun.

revelstoke3.jpg

I've also since added a project page to this site for it, along with one for Paperless.

On the whole, I'm rather disappointed with the lack of traction I'm seeing with this project. I believe that this is the best option for the problem it's trying to solve, but I'm afraid I'm not much good at getting people to pay attention to stuff. The code is Free, so anyone can use it, but if they don't know about it, they're never going to use it.

Paperless

With my commitment to Aletheia, Paperless has more or less moved into maintenance mode -- at least for me. People will post pull-requests to the GitHub repo about 3 or 4 times a month, and I try to merge them in a timely fashion, but for the most part, I'm not doing any new development on it.

violet-and-lucy.jpg

Of course, that hasn't stopped it from continuing to grow in popularity. It just crested over 5000 stars on GitHub and users are now responding to each other on the issue queue. It seems people really dig it, especially for its simplicity (my ideology is always a limited number of moving parts), and they're building a community around it.

It's with all this in mind that I posted a special issue about the status of the project on December 31st. I've put out a request for co-maintainers and/or ideas regarding how the community might better grow the project without requiring as much from me. So far the results have been positive, but no one has had the resources to step up and take a leading role yet.

okanagan.jpg

In The World

Much of 2018 felt like we were collectively holding our breath to see what may come next.

parents-and-lucy.jpg

Brexit

Brexit is still a disaster, but only appears to be getting worse. The Conservatives hammered out a deal that nobody likes (but was honestly the best they were ever going to get with the EU) and so the political debate is a complete mess:

  • The Leave Conservatives hate the deal because they think it ties their hands. They advocate for a "hard Brexit": leaving with no deal. Experts say that this would undoubtably lead to food shortages, economic collapse, and difficulty getting in and out of the country.
  • The Remain Conservatives hate the deal because it means actually leaving, though I don't know of any Conservative voices interested in undoing this mess.
  • Labour is obsessed with calling an election to replace the Conservatives. They're going with the "We could have gotten a better deal" angle, which is a lie, because the EU is holding all the cards.
  • The Liberal Democrats, Scottish Nationalists, and Greens are all calling for a 2nd referendum in the hopes that were it to reverse the initial vote, we could safely call the whole thing off. The problem here is that there's no reason to believe the public has sufficiently changed its mind, and it would take (much) longer to organise a referendum than we have before the deadline.
  • The media here has somehow managed to convince the public that Brexit is Labour's fault. Somehow, the party that hasn't had power during any of this, is responsible for the mess that it is.

This country is so fucked.

I've been joking that I'll arrange for us to be in Greece over the deadline. You know, just in case a hard Brexit really does happen and we're left having to deal with food shortages while nursing a 3 month old. I'm now seriously considering it.

Doug Ford

Doug Ford's Conservative party won in Ontario, ushering in a sort of "Trump Light" mindset into Canada's biggest economy. I'm concerned that this isn't being seen for what it really is: a beachhead for MAGA nutjobbery in my home country.

Sure, Canada has a "progressive" party at the helm (more on that later), but governments are transitory, and if the Harper years have taught us anything, it's that a determined ruling party (and leader) can leave lasting scars on a nation.

There is widespread hate (and I do mean hate) for Trudeau across Canada. It's at the heart of groups like the Proud Boys and the Yellow Vest Protests. Ford tapped into it for his own campaign, and it's unlikely that he's the only one who noticed this trend.

Canada is teetering on the edge of an abyss filled with the same anti-immigrant, anti-environment ignorance and fear we see driving the US, but unlike the US, I think there's too many Canadians that refuse to see it. There's still this idea that we're supposed to be better than the Americans. That we could never have a Trump, because being Canadian somehow insulates us from ignorance and fear.

As someone living in the UK, a country with much the same sort of blinders, I say to you now: It doesn't. Be vigilant Canada.

kangaroo-and-jack.jpg

Trudeau Bought a Pipeline

Also on the Canadian front, in a brilliant feat of offloading private risk to public coffers, our "progressive" Prime Minister had us buy a pipeline. Now, Canada bears the financial risk of producing a pipeline designed to hasten the deaths of millions around the world. Go Canada!

US Election

The US had some (sort of) good news though: the Democrats managed to take back the House of Representatives, bringing in some amazing congressmen like my new hero, Alexandria Ocasio Cortez.

This is the next generation of the Left and it's about time they showed up. With progressive platforms like socialised medicine, abolishing ICE, and recognising climate change as the "single biggest national security threat", they represent a motivated front of people devoted to fixing the mess were all stuck in rather than stoking the coals of hate and fear.

This is a Left that recognises that the majority is leaning right not because they offer anything in particular, but because the centre is so dedicated to keeping the status quo: even in the face of a dire need for change. Every country on Earth could learn a thing or two the recent successes of the Left in the US. The EU especially could find value here: this is the time for parties like the Greens and Diem25 to shine.

Most importantly, this push back from the Left will help to move the Overton Window in the right direction. For too long, crazy, racist, xenophobic, and anti-science has been becoming more and more normal. That shit has got to stop.

banff-bow-river.jpg

Good News

Finally, I have some good news, courtesy of this inspiring article that I found as the year closed out. Some of my favourites:

  • In 2018, after more than ten years of debate, 140 nations agreed to begin negotiations on a historic “Paris Agreement for the Ocean,” the first-ever international treaty to stop overfishing and protect life in the high seas. National Geographic
  • Germany released new figures showing that more than 300,000 refugees have now found jobs, and the share of MPs with migrant backgrounds has risen from 3% to 9% in the last two elections. Economist
  • The UNDP released a new report showing that 271 million people in India have moved out of poverty since 2005, nearly halving the country’s poverty rate in one decade. Times of India
  • A new report showed that the global fertility rate (average number of children a woman gives birth to) has halved since 1950. Half the world’s countries are now below replacement levels. BBC
  • The world passed 1,000 GW of cumulative installed wind and solar power this year. 10 years ago, there was less than 8 GW of solar. Future Crunch
  • Allianz, the world’s biggest insurance company by assets, said it would cease insuring coal-fired power plants and coal mines.
  • China, the world’s biggest energy consumer, revised its renewable energy target upwards, committing to 35% clean energy by 2030. Engadget
  • The United States set a new record for coal plant closures this year, with 22 plants in 14 states totalling 15.4GW of dirty energy going dark. #MAGA. Clean Technica
  • Ireland became the world’s first country to divest from fossil fuels, after a bill was passed with all-party support in the lower house of parliament. Guardian
  • Crime falls when you take in millions of refugees too. The number of reported crimes in Germany has fallen by 10%, to the lowest level in 30 years. Washington Post
  • The Malaysian government announced it would not allow any further expansion of oil palm plantations, and that it intends to maintain forest cover at 50%. Malaymail
  • Denmark became the latest country to announce a ban on internal combustion engines. There are now 16 countries with bans that come into effect before 2040 — including China and India, the two biggest car markets in the world. Bloomberg
  • The European Parliament passed a full ban on single-use plastics, estimated to make up over 70% of marine litter. It will come into effect in 2021. Independent
  • There is now a giant 600 metre long boom in the Pacific that uses oceanic forces to clean up plastic, and you can track its progress here. Despite a few early setbacks, the team behind it thinks they can clean up half the Great Pacific Garbage Patch in the next seven years. Ocean Cleanup

What's Next

My daughter is expected to be born in a matter of days so... that's happening. We've got Brexit on the horizon, and I imagine other things I haven't yet considered. For now though, I'm going to call it quits on this post 'cause it's already been 4hours and I still haven't collected the images I'm going to use.

November 16, 2018 19:39 +0000  |  2

This is going to be one of those ranty posts. If you don't fancy that sort of thing, you may wanna skip this one.

As a man, I honestly never gave much thought to childbirth. It wasn't something I'd have to deal with, so much like how to survive in a malaria-infested jungle, I mostly dismissed the idea as something others might have to contend with, but not something I needed to think about.

Then I married a girl who wanted a baby and so we started talking about and researching childbirth. What I've learnt in the past 6 months has been horrifying. If you have a uterus and are planning on using it to make a baby, you may want to buckle up. Here's a shortlist of the stuff that happens to you that we don't generally talk about:

Tearing

53-79% of women tear their vagainas during childbirth. For the lucky ones, this is only a 1st or 2nd degree tear which rip up your mucosal tissues (no stitches), labia minora (stitches... if the midwife notices), the perineum, or the area between the vagina and the anus.

For the unlucky ones, 3rd and 4th degree tears can extend all the way to the anus and even the anal sphincter. This is the sort of thing that you never truly heal from.

Breaking your tailbone

This is what we call it colloquially, but you're really breaking the joints in your tailbone which, if you're lucky (again) will heal after a few weeks of pain. If you're unlucky your tailbone will never heal correctly, you're forever in pain, and not even surgery can help you. [Source]

Incontinence

Ignoring the possibility of fistula from the aforementioned tearing, incontinence (the inability for you to control when you pee) is extremely disproportionately common in women vs men, in large part resulting from pregnancy and childbirth.

Painful Sex (dyspareunia)

Loss of pleasure or even painful sex, is another one. A recent study here in the UK showed that 7.5% of women suffer from this, with that number fluctuating between 5.3% and 10.4% depending on the age of the woman. In another study, 49% of all women experienced pain up to 6 months after birth, and 3.5% continued to suffer after that.


The reason we don't talk about this is multidimensional, but much of it can be attributed to a combination of taboos around sex, and a general lack-of-interest in women's health as a society. Most men don't know what a perineum is, or even that childbirth typically involves tearing, not to mention all of those other risks.

That's not the whole story though. If it were, I'd end the post here. Instead, I want to talk about our experience with the UK's midwife system, how backward, irrational, and dangerous it is, and how I sincerely believe it represents a system of women oppressing women.

Some Context

In the UK, we have the National Health Service (NHS), which is a form of single-payer health care much like Canada's Medicare system. Like Medicare, the NHS is struggling to keep up with demand, but unlike Medicare, the NHS is cripplingly poor. They're so broke that people aren't replacing the lights in the hospitals, there's regular shortages of staff, and a surplus of beds, as there's not enough people to staff them. Doctor strikes (to varying degrees) are a real concern.

It's in this climate that the NHS has adopted midwifery to handle the childbirth process. Over the years they've brought in less-rigorously trained midwives to do jobs the more experienced (and better paid) doctors were doing, freeing the doctors up for other work and thereby reducing the overall cost of baby-making on a national scale. These days, childbirth typically doesn't even involve a doctor and roughly 2.1% of births are done at home.

A midwife might be a trained & experienced registered nurse who chose to specialise in midwifery, or they could just be someone fresh out of high school with a C-average who liked the idea of being a midwife and showed up for a whole 3 years of training. There are no national minimum academic entry requirements for entry into pre-registration midwifery degrees.

Once trained, the midwives are posted to general practises around the country, where would-be parents are sent directly to them. From the moment you pee on that stick, the midwife is the gatekeeper between you and the NHS. She decides if you can see a doctor, if your needs are sufficient that you might go over her head to someone with an actual medical degree.

Feelings, not Evidence

None of this would be a problem really if the midwives were actually thoughtful, rational people, but everything we've seen to date tells us that the opposite is true.

Our midwife has flat-out lied to us on multiple occasions about Christina's health risks and personal welfare. Whether those lies were out of ignorance or ideology, there's no way to know, but the result is an immediate distrust of the only person you're permitted to talk to within the National Health Service.

When your midwife tells you that "vaccination causes whooping cough", there's no recourse for you to find a health care professional that isn't a dangerous idiot. In fact you're encouraged to come to them with everyday questions about your health, your risks, and those of your baby, and you're expected to take their advice at face-value. She is the "professional" after all.

When in Doubt, Make it Up

One of my favourite logical fallacies, the "appeal to nature", is the blind assumption that whatever is "natural" must be the best option. When it comes to baby-making, this means ignoring the fact that childbirth is fucking dangerous and has killed and maimed hundreds of millions of women over the centuries. Prioritising "natural" over man-made practises by virtue of their "naturalness" is not a rational choice but an emotional, and therefore irrational one.

In the context of the NHS midwife system, this takes the form of your only available "professional" giving you advice like the following:

Note: these are actual examples of advice given by midwives to us directly:

  • "Hypnobirthing works!" It doesn't.
  • "Aromatherapy works!" I'm not even going to dignify this the a refuting link.
  • "Avoid 'unnatural' sugars like chocolate or candy, and instead opt for 'natural' ones like honey because 'the sugars are different' and 'natural sugars won't make you crash'." The truth is that honey and sugar are both carbohydrates composed primarily of glucose and fructose, and that if anything, the opposite is true.
  • "Water births reduce tearing". While it's true that water births tend to involve less pain, fewer drugs, and a faster process overall, they don't reduce tearing. In fact, a UK study showed that water births had a 12% higher rate of perineal tears, and a 23% lower rate of episiotomy (when they cut you to avoid tearing). The reality is that it's a terrible method to use if you expect anyone to help monitor the process, because no one can see what's happening and work to prevent damage.
  • "Every woman can breast feed". This is also false and was the subject of a particularly galling incident during a prenatal class we attended last weekend:

    One of the attendees asked "what if you can't breast feed?" and the woman responded: "Why would you think that?" and went on to lecture him about how ignorant he was about women's bodies, that every woman can indeed breastfeed (false) and suggested that his wife was just lazy and wanted to sleep. She then went on to insist that we shouldn't bring formula to the hospital and that if they felt it was appropriate they would provide some.

    Finally, she claimed formula is so hard for a baby to digest that it can cause constipation for up to 4 days. In fact, it's normal for breast fed babies not to poop for as much as 5 days, and formula too has unpredictable results in "regularity". I could find no study citing a correlation (let alone a causation) between constipation and the method with which babies were being fed.

  • "Forceps don't increase tearing". Well of course the forceps don't cause the tear, but inserting them into you, widening you to fit a baby's head & forceps certainly does. Risks to mother and baby with completely dodged or glazed over despite multiple requests for more information.
  • "Midwives don't perform episiotomies". Except that when you press her for details as to who is cutting into you with a scalpel, she confesses that midwives, with all their years of medical training do in fact perform them.

On top of all of this, our experience with their examinations would be laughable if it weren't terrifying. Different midwives have "examined" Christina and found:

  • The baby hadn't grown in 2 weeks.
    • An ultrasound, performed by an actual doctor, showed that the baby was fine. The midwife just wasn't measuring properly.
  • The baby had turned. The midwife pointed to the location of the head, feet, etc.
    • An ultrasound, performed by an actual doctor, showed that the midwife had a completely backward notion of where the baby actually was.

These are the "professionals" you expect to protect you and your baby from injury and death. These women cut into you and make critical life-and-death decisions. The women who lie when the facts don't suit their worldview, and demonstrably don't have the skills (or perhaps just the interest? It's unclear which is worse) to gather the evidence needed to perform the work for which they're responsible.

Women as Baby-Making Machines

The above is disturbing for anyone headed into a life-threatening medical procedure, but unfortunately it's just the start. Imagine a situation where your appendectomy surgeon says to you: "What's really important here is that we save that appendix". You would be understandably alarmed. Surely the doctor's job is to make sure you survive the procedure... right?

If there's anything that's made abundantly clear though our dealings with NHS midwives it's that they don't care about women. Concerns about pain or long-term disability are either shrugged off or met with the same response:

Don't worry, worst case scenario, you won't be able to have another baby for a couple years.

That's right, you had a question about whether your sexual organs would ever be able to work properly again, and the "professional" let you know that the real question is whether or not you'll be able to give birth again soon.

To the midwife, every woman is just a baby-making machine.

The midwives have told us that they operate under what they call "assumed consent" during the birthing process. In other words, you're given the opportunity to outline what your needs are during childbirth, what your red-lines are around things like forceps and C-sections, and then those requirements are promptly thrown out in favour of what the midwife feels is best in the moment. The same professional that couldn't tell you where the baby was a few weeks ago.

If the aromatherapy and hypnobirthing hasn't done the trick and labour goes bad, the midwife makes the call as to whether she'll try to cut your perineum, or if she'll call the doctor to come with the forceps. C-section is typically off the table unless the baby is in real danger. Even more exciting is that these choices are time-sensitive: once the baby is far enough down the birth canal, a C-section becomes very dangerous -- but they might do it anyway.

You don't get a say in any of this. Your consent is assumed, and for the parts where legally your consent is still required, try standing up for your rights when you're hemorrhaging in a bathtub.

The Realities of Geography

So that's the state of things in this backward country. Christina had her final scan at 28 weeks and now we get to depend on the expert opinions of the midwives as their magic fingers somehow figure out if the baby has turned and if it's likely to be small enough not to irreparably harm her.

If somehow the complete lack of knowledge of the situation fails to produce a smooth & uneventful birth, it's unlikely that we will be able to refuse the use of forceps. We just get to hope that the overworked, underpaid doctor using medieval tools to operate on a woman he's never met and knows nothing about won't accidentally maim Christina, kill the baby, or just cause her brain damage.

Hope. In twenty fucking eighteen, people in the UK don't have pre-natal scans to determine child position and size, or properly educated medical help, but they have hope, because hope doesn't cost money.

Statistically speaking, the UK is a disaster on this file compared to other European countries. In countries with high rates of C-sections (either elective or as a first go-to for emergencies) forceps births are much, much lower:

Vaginal spontaneousVaginal instrumentalElective CaesareanEmergency Caesarean
Germany62.26.415.415.9
Italy58.63.424.913.1
Romania62.50.53.833.1
England62.812.69.914.7

Source: Royal College of Obstetricians and Gynaecologists

What's Next

We've been told that the hospital here flatly denies maternal requests for C-sections, despite the fulfillment of such requests being officially part of the NHS guidelines. We've talked about it, and Christina is comfortable with the "natural" method so long as she can trust that in the event that things go wrong, that forceps will not be used, but rather she would go straight to C-section.

But that's the problem: trust. There just isn't any between us and these budget midwives. They've lied to us, pushed an agenda, demonstrably ignored evidence and best practise in favour of ideology. They're grossly unqualified to cut into another human being, and have directly stated that they have no intention of adhering to Christina's wishes. I don't know what we're going to do, what we can do in this situation.

This is a Feminist Issue

Critically, and as a feminist, I find much of how we treat childbirth outrageous. From where I'm standing I see a bunch of crazy people, crazy women, imposing their whacked-out religion on other women under the guise of "taking back" pregnancy & childbirth from the evil doctors.

It's framed as a battle between "women know better because women" and "doctors want to medicalise everything for profit", but this is a preposterous comparison. The UK is suffering from shortages of nurses and doctors. There's no drive -- especially in a nationalised health care service -- to medicalise anything for profit. The motivation is quite the opposite, so this a blatant myth, a myth fact-phobic hippies are using to beat women into submission.

If this were a prostate cancer treatment, you can bet there'd be outrage. Men aren't socialsed to shut up and put up with whatever society foists upon us, but women are a different story. Women are being fed this lie that childbirth is safe & magical, that massage, hypnosis, and essential oils are just as good as ultrasounds because they're "natural".

Most importantly, women are told that to deny this myth is a betrayal of the feminine, that good mothers sacrifice for their children and so they shouldn't be concerned about what happens to them. This is bullying and oppression, by women, of women.

If this was an organisation of unqualified men insisting that bullshit snake oils were all women needed, that the risks weren't real, and that any concern for the mother's health made her a bad mother, we'd all know what to call it. But it's women pushing this fantasy, and so we play along. We set public policy to fund treatments that don't work, to employ people that lie to their patients.

I'm seething. I'm angry that the state would do this to my wife, but I'm even more angry that society has bought into this fantasy so much that getting professional help for a dangerous procedure is near impossible.

We can hope everything will be alright, but I think any rational person would take knowledgeable professionals over hope any day.

Update: 2018-12-24

As we've spent more and more time in the midwife system here, we've realised that there's effectively two types of midwife in the NHS. There's the hippy-dippy anti-vaxxers, and the battle-hardened, evidence-based decision makers. The line appears to be drawn between the people who give advice & visit you at home vs. the people who actually deliver the babies in a hospital. Much of what you see in this post comes from our experiences with the former, but since this post was written, we've had the opportunity to sit down with a few not-crazy midwives -- one of whom was visibly disturbed when we talked about our experiences above.

We're feeling a lot better about the process now. The biggest hurdle for us was one of trust: whether the midwife on-site during the birth would have Christina's best interests at heart, or whether she would let ideology and logical fallacies drive her decision making. Now that we've had a chance to sit with the not-crazy midwives, we have a lot more trust in the system.

This isn't to say however that there aren't some seriously dangerous idiots in the midwifing system or that they don't enjoy an undeserved amount of cover for their insanity under a stolen banner of feminism. There's no excuse for "medical professionals" to be recommending homeopathy under any circumstances and these people need to be fired. I just don't want to tar all midwives with the same crazy brush. It would seem that a few (far too many) bad (hippie) apples are reflecting poorly on the rest.

July 29, 2018 22:57 +0000  |  2

Even as a kid, I'd always known what I wanted to do for my own wedding. "Potluck in the park" I'd say, and everyone would look at me like I'm crazy or joking. I would then go on about how I was totally serious, that everyone would bring doughnuts and KFC, and that it would be cheapest, lowest-hassle wedding of all time. It would also be a lot of other things, but I would rarely talk about that.

Weddings #1 & #2 we're lovely, but most of the people I love, like deep-down-from-my-toes-up-love, the ones I've known forever, couldn't be there. People like my brother and his new family, or Michelle, Jeanie, Ruth, Shawna, Quinn, Chris & Trish, and Noreen -- I've known these people for more than twenty years -- and none of them were able to cross the Atlantic last year. Then there's the people I met later in life, with whom I've bonded terribly strongly: Poesy, Robin, Stephanie -- they couldn't be there in Cambridge or Athens either, so this one, this day was really important to me.

It was a day full of love, and hugs, and the all-important KFC & doughnuts. Some old friends brought their kids, Ruth brought her family's newest addition, Nelix the dog, and Noreen managed to rope Merry in with her too. People brought their partners, and chocolate, and a shared support for Christina & me. Michelle and I got to sing together, and we looped in Quinn & Merry for an SATB reunion that's 21 years old now. I got to meet Chris' new twins, and teach Violet how to tell time, and we had the simplest, most intimate ceremony I could have asked for.

Poesy led a simple ceremony wherein Violet tossed flowers about while she gave us all a crash course in indigenous culture, and Michael worked his photography magic with everyone over the course of the whole day.

I have never felt more loved, and more blessed than I did yesterday. Thank you to everyone who came out to make it wonderful. I don't think I'm capable of shaping my gratitude into the words I need to tell you how much I appreciate it.

July 01, 2018 15:04 +0000  |  4

So, yeah, this is happening.

Christina is officially carrying around a parasite that will one day rip its way out of her to be adorable for a few years before getting snotty and rebellious until she finally emerges to be the next Something Awesome.

In case you missed the pronoun selection there, yes, the doctors say they're pretty sure it's going to be a girl.

Predictably, I'm both excited and terrified by the whole ordeal. A kid changes everything, not the least of which is the simple cost of existing. Never mind the price of baby clothes, toys, diapers, and child-care, or the costs of food, toys, and clothing for a teenager. A dependent means adding 30% onto nearly every travel arrangement I'm going to make for the next twenty years.

There's also of course the near complete lack of support system we have here in the UK. We have a few friends, and zero family. While my brother lives a stone's throw from both sets of grandparents, we're 73623km from Kelowna and 2991km from Athens. Sure, family will visit, but we're on our own for most of this.

And then there's the risk that the child will be born with a severe disability of some kind that would relegate us to babysitters for life. We've done all the tests one can do for this sort of thing, but the risk is never 100% eliminated. This is the sort of thing you don't really consider when you think about bringing a new life into this world: that that life would mean that you are forever responsible for feeding them, cleaning up after them, that any semblance of a private life you may have fantasised about is gone. I'm willing to bet that every parent is absolutely terrified of this.

Finally, there's that wonderful conversation between two characters on one of the greatest TV shows ever made:

The world is dark and full of terrors: global warming is going to be the primary antagonist of her life, just as Nazism is making a comeback. The ocean is choking on plastic while every ecosystem is in decline and we're facing a mass privatisation of all fields of human endeavour -- and yet, terrors or not, she's coming. The world had best get ready.

I feel like I haven't done enough to fix the world in advance of her arrival, but she's coming anyway, before any of us are prepared. I already know what sort of person I want to raise her to be though, and I hope that that, combined with the wisdom our families have granted us will be enough to get her there.

I'm worried, but I feel like I'm ready -- at least mentally if not financially or globally. This is going to be an adventure.

May 18, 2018 09:11 +0000  |  0

Objects vs. Functions

I volunteer with a few groups of new software developers and a question that keeps coming up is: "why should I use objects?". Typically this is couched in something like: "I just have a lot of functions organised into files, and I'm not sure what reorganising all of my code to be OOP would really do for me".

So I thought I'd write out a detailed explanation with examples & such for those who might find it useful. Here goes:

It's ok not to OOP

I love me some objects. In fact, I'll often use objects for no other reason than to have my code neatly tucked into classes, even when a function will do, but I'm crazy like that. The truth is, a lot of smaller projects & scripts don't need OOP to do what you want, but once you really get a handle on what they can do for you, you might find that you're Classifying All The Things.

Regardless, please don't read this as some sort of "Classes are the One True Path" rant, 'cause it's not.

Foodz

I like me some food, so the examples I'm going to use are food-based. For our exercise we're going to be writing code for an imaginary kitchen run by robots, an idea that in 2018 really isn't all that crazy.

We've got 50 people to feed at 20 tables. Our code needs to keep track of who ordered what from what table, as well as prepare the food in the kitchen and deliver it to our hungry patrons. That's a lot of code, so we won't be writing it all out here. Instead, I'll break down a rough idea of how this might be done using procedural code (functions in files) vs. object-oriented code.

The Procedural Way (functions)

When you're working with functions, you're effectively pushing data around and modifying it when necessary. For our kitchen example, you might start with a complex array of data for our patrons:

patrons = [
    {
        "name": "Amber", 
        "table": 1, 
        "order": [
            {"name": "House Salad", "price": 350, "dressing": "Ranch"},
            {"name": "Death by Chocolate", "price": 250, "flavour": "Chocolate"}
        ]
    },
    {"name": "Brianne", "table": 1, "order": ["steak", "cake"]},
    {"name": "Charlie", "table": 2, "order": ["chicken burger", "pudding"]},
    {"name": "Dianna", "table": 2, "order": ["salad", "pudding"]},
    ...
]

That takes care of who is sitting where and what they ordered. Next we also need instructions for making the food, which uses a branching system of rules:

def make_food(food: str) -> str:
    if food == "salad":
        return make_salad()
    if food == "burger":
        return make_burger()
    if food == "steak":
        return make_steak()

Each of those functions in turn might call other functions to do the "making", for example, the steak might include something like marinade() or salad.py could have another function inside it called make_dressing() which is called from inside make_salad(). The key thing to note here is that each of these functions are either very specific, or contain branching code to decide which thing to call next. It can get very messy, very fast as you add more and more types of food.

Finally, we need to serve the stuff. The kitchen will announce to the waitbots that the food is ready (that's an exercise in queues & pub/sub for another day) and the waitbots will bring the food to everyone.

To do this, the food plates will have a type, like salad or burger, but we also need to include who the food is for. To do this procedurally, this usually involves bundling bits of information together and passing that around, so your business logic might do something like:

def process_order(patron: dict) -> None:
    for food in patron["order"]:
        deliver_to_table(patron["table"], make_food(food))

for patron in patrons:
    process_order(order)

As make_food() returns prepared food, then we can just pass the result of the food making to deliver_to_table along with the table number and we're good, right?

The thing is, this is really complicated, and we've got a lot of raw data floating around that's created a rather rigid system. What if a patron changes their mind and wants to order a side of fries? What about all the different types of burgers out there, are we going to create a separate method for make_chicken_burger(), make_veggie_burger(), and make_cow_burger(), or just one larger method with a bunch of if pattie == "chicken": code in it?

At first glance, this looks like something that will work, but in the long run, managing and extending this code is going to be painful.

The Object-oriented Way

Objects have two primary strengths:

  • Encapsulation
  • Extendability

I'm going to explain both before we get to how to run this kitchen the OOP way.

Encapsulation

It's just a fancy way of saying that objects know how to do stuff. Rather than taking raw data and acting upon it, you just create an object and tell it to do a high-level thing -- it will figure out the rest.

For example, assume that cooking a steak requires using a grill and (hopefully) includes a long series of instructions on how to use that grill. Assume also that it involves a marinade or rub and maybe a selection of sauces to apply.

In a procedural system, you'd have a function called make_steak() which would likely have internal calls to maridade_steak() and to grill_steak(). These functions would likely be different from the instructions for cooking cow burgers or chicken burgers, so each food type would require its own special function with its own rules. Sure, you can probably have some functions cross-call each other, but the more you do that, the messier your code becomes.

In an OOP system, the interface is as simple a calling steak.prepare() -- the steak object will figure out the rest for you.

Extendability

The "figure out the rest" part is only different from the procedural method because you can do stuff like subclassing in OOP. A rib-eye steak is a lot like a sirloin steak, but there may be slight differences in the preparation. Subclassing means that you can take the standard rules for steak preparation and extend them for your specific case. Suddenly your code is a lot simpler.

Have a look at the examples to see what I mean.

Our OOP Kitchen

We need to keep track of our patrons: where they're sitting, what they've ordered, so we could create a Patron class, but as the patrons aren't really doing anything in our exercise, this would kinda be overkill. I mean you could create a class called Patron, but it wouldn't do much more than hold data, which a dictionary or list will do just fine already:

class Patron:
    def __init__(self, name: str, table: int, orders=None) -> None:
        self.name = name
        self.table = table
        self.orders = orders or []

Well it's neat & clean, so let's keep it for now. I suppose we could later extend Patron to include a .pay() method that would tally the costs for their meal table and pay from their bank account, but for now, let's just use this as an example of a really simply class.

Now, as each person comes through the door and they're seated, we create new Patron objects and attach them to our list of patrons:

patrons = [
    Patron(name="Amber", table=1, order=["salad", "cake"]),
    Patron(name="Brianne", table=1, order=["steak", "cake"]),
    Patron(name="Charlie", table=2, order=["burger", "pudding"]),
    Patron(name="Dianna", table=2, order=["salad", "pudding"]),
    ...
]

So far, not very useful. It's basically the same as our procedural system. However now let's make our code smarter and do away with these strings for the food, replacing them with objects.

We'll start with a Food class:

class Food:

    def __init__(self, name, price) -> None:
        self.name = name
        self.price = price
        self.calories = 0
        self.is_prepared = False
        self.is_served = False

    def prepare(self) -> None:
        self.is_prepared = True

    def serve(self) -> None:
        self.is_served = True

    def get_price(self) -> int:
        return self.price

We now have a thing (food) that knows how to prepare itself. We can create an instance of food, and it will know what it means to prepare itself. Of course right now, all it does is set .is_prepared = True, but should that ever need to change to say, notify a central server that a particular food was just prepared, you only need to modify the Food class and your business logic won't know the difference.

So that's encapsulation, but let's do the extension part. Let's define a series of different foods:

class Salad(Food):

    def __init__(self, name, price, dressing) -> None:
        super().__init__(name, price)
        self.dressing = dressing
        self.calories = 50

    def prepare(self) -> None:
        self._add_dressing()
        super().prepare()

    def _add_dressing(self):
        self.calories += 200


class Burger(Food):

    def __init__(self, name, price) -> None:
        super().__init__(name, price)
        self.temperature = 22
        self.calories = 300
        self.pattie = None  # Defined in the subclasses

    def prepare(self) -> None:
        self._grill()
        self._add_bun()
        super().prepare()

    def _grill(self):
        self.temperature = 100
        self.calories += 20

    def _add_bun(self):
        pass  # Obviously important, but I'm not sure how to code this.


class ChickenBurger(Burger):

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.pattie = "chicken"


class CowBurger(Burger):

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.pattie = "cow"
        self.calories += 30

This is the magic of extending your classes: you get to be lazy.

We defined Food once and since everything else is a kind of food, we extend that class to further define the food we're talking about:

  • Salads are low on calories, but need dressing
  • Cow burgers are calorific
  • Chicken burgers have more calories than salads, but fewer than cow burgers
  • Both cow & chicken burgers are prepared the same way, so we have the intermediary Burger class that knows how to ._grill() and ._add_bun().
  • Salads need to have an _add_dressing() step in their preparation.

Note that everywhere, we're calling super() to make sure that we get the benefits of the parent class. Not only that, but doing this ensures that if we change the parent class (say we start notifying someone that food has been prepared), then all the child classes automatically get that happening.

Now, let's go back to our patron definition and spice that up a bit:

patrons = [
    Patron(
        name="Amber", 
        table=1, 
        order=[
            Salad(name="House", price=350, dressing="Ranch"), 
            Cake(name="Death by Chocolate", price=250, flavour="Chocolate")
        ]
    ),
    Patron(
        name="Brianne", 
        table=1, 
        order=[
            Steak(name="Rib Eye", price=1399)
            Cake(name="Lemontastic", price=200, flavour="lemon")
        ]
    ),
    ...
]

Now your business logic looks like this:

for patron in patrons:
    for food in patron.orders:
        food.prepare()
        food.serve(patron.table)

At this stage, your code is ready to be extended like crazy just by editing the objects themselves:

  • If you've introduced a new buffalo burger that has special preparation instructions like combining with coriander, you can just create a subclass of Burger with special instructions to do just that.
  • If you run a promotion on burgers, you can override .get_price() in your Burger class and put your discounting logic in there to affect all burgers.
  • If you want to trigger a notification of some kind when the food is served, you just update the code in Food.serve()

As a bonus, your code is a lot cleaner because your function calls aren't riddled with all of these suffixes like prepare_steak(), grill_steak(), etc. Instead, you have one concise interface: .prepare() and .serve(). Let the object figure out what that means to it.

Finally, your objects know more about themselves, say for example, we now want to tally a per-patron bill for the end of the night. OOP makes this easy, we just update our Patron class with a .get_bill() method:

class Patron:
    def __init__(self, name: str, table: int, orders=None) -> None:
        self.name = name
        self.table = table
        self.orders = orders or []

    def get_bill(self) -> None:
        for order in self.orders:
            print(f"{order.name}: {order.price}")

After that, you need only call .get_bill() on each patron to get what they owe. No looping over complex data sets, or calling special functions for calculations. You could even modify Patron to allow for coupon discounts -- your interface is the same: .get_bill() while the Patron knows what that means.

May 01, 2018 18:44 +0000  |  2

My earliest memory of my grandmother is of her giving my brother and me some Arrowroot cookies to dip in milk. They had a magical softness to them when you suspended them in the half-full glass for just the right amount of time. Grandma taught me that.

For the most part though, my childhood memories of her are sparse. Visiting Grandma & Grandad wasn't fun, it was just something you did, and often it would involve the adults doing boring stuff like talking, so Matt & I would hide out in our grandparent's bedroom watching one of those old tube-based TVs that took 5 minutes to warm up before you could see anything.

I wasn't a very engaged kid. Looking back on all that time I could have had with her now, I feel cheated by my 8 year-old self who chose Mary Poppins over time with my grandmother.

To be honest though, I don't think 8 year-old me could have appreciated Grandma Nana the way I came to as an adult. Young Daniel didn't know much about what was going on in the world, and honestly, I don't think he cared very much either. To him, Grandma's house meant cookies & movies and that was good enough.

It wasn't until decades later that I really came to appreciate and understand my grandmother better. The woman was unyielding in a way that can only be described as inspirational. At a time in my life when I was beginning to take an interest in politics and Canadian history in general, my grandmother was there, answering all of my questions and sending me scanned copies of newspaper articles covering topics we'd discussed earlier that week.

I was raised on rather right-wing ideals, but Grandma worked against that full-time, sending me links and petitions from the Canadian Centre for Policy Alternatives, and articles from Rabble. These weren't one-way discussions either: we disagreed often, sometimes spiralling into long email threads, referencing article after article. The goal was never to "win", but to better understand each other. Grandma didn't mould who I was, rather she challenged my preconceptions to help me build the person I wanted to be.

As I got older and more involved in politics & activism, our relationship developed into a pattern of advice. I would call or write to ask what she thought about a new campaign I was working on, or sometimes just for some encouragement. One time in particular, I wrote to her, tired & upset about a lot of the criticism I'd run up against in my political work in Toronto. I was lost and felt as if fighting wasn't worthwhile if all I was going to hear were people complaining and shouting me down. She had the Best Advice Ever, and I carry it with me to this day:

"The only people that don't get criticism are those that don't do anything."

In any avenue she could access, she was an activist her whole life. As a young woman, she volunteered with the NDP in its early years to help give Tommy Douglas a stronger voice in the House of Commons, and even in her 80s and 90s, she was circulating online petitions and tweeting about environmental and social issues.

Just last year, she was committed to the hospital for a litany of health issues, but the morning she checked out, she insisted that rather than going home, her daughter had to take her straight to an advance polling booth for the BC election. My grandmother, her lungs crippled with pulmonary fibrosis and breathing from a machine, made sure that she got her vote counted.

And this, this is how she went out. Literally lying on her death bed, her lungs ravaged after thirteen years of that slow-drowning disease, she contacted a local paper because she wanted to share with them that she would be taking advantage of Canada's new Medical Assistance in Dying law. As the first person in the Okanagan to make use of this law, she wanted to share her reasoning, and her strong belief that the Right to Die should be enshrined in the Canadian Charter of Rights and Freedoms.

At 91 and choking to death on her own lungs, my grandmother remained as fierce as ever. Using even her own death to further her desire for a better world. Not for her of course, her time was up, but for you and me.

I'm going to miss our talks, but her life has been an inspiration to me. I will endeavour to make sure that she isn't the last Quinn to be so uncompromising in both action and principles.