Tall, Snarky Canadian
Python core developer. Tall, snarky Canadian.
- Posts
- 173 from 21 Jun 2013 to 16 Aug 2026
- Posting
- monthly (9 in the last year)
- Kind
- personal blog
- Feed
- https://snarky.ca/rss/
2026 7
- What's missing to have reproducible builds on PyPI
- My nomination statement for the 2026 Python packaging council
- How to publish to PyPI using GitHub Actions securely
- Why I wrote PEP 832 -- virtual environment discovery
- Why pylock.toml includes digital attestations
- State of WASI support for CPython: March 2026
- CLI subcommands with lazy imports
2025 6
2024 6
2023 18
- My proof-of-concept record type
- State of standardized lock files: December 2023
- Introducing basicenum
- Announcing microvenv 2023.5
- Why I put in some effort to lower my carbon footprint
- State of standardized lock files for Python: August 2023
- Differentiating between writing down dependencies to use packages and for packages themselves
- State of WASI support for CPython: June 2023
- Proposing a struct syntax for Python
- In response to the Changelog #526
- MVPy: Minimum Viable Python
- Unravelling `del`
- Unravelling `global`
- How virtual environments work
- Use TOML for `.env` files?
- Testing a Python project using the WASI build of CPython with pytest
- The many shapes and sizes of keyboards
- Classifying Python virtual environment workflows
2022 9
2021 21
- Unravelling `finally` and `else` from `try` statements
- Unravelling `elif`/`else` from `if` statements
- Unravelling `break` and `continue`
- A reverse chronology of some Python features
- Selecting a programming language can be a form of premature optimization
- Unravelling decorators
- Unravelling data structure displays
- Unravelling comprehensions
- Unravelling generator expressions
- Unravelling the `async with` statement
- Unravelling `async for` loops
- Introducing the Python Launcher for Unix
- What to do when you botch a release on PyPI
- How I rate films
- Unravelling `async` and `await`
- Unravelling the `with` statement
- Unravelling the `pass` statement
- The social contract of open source
- Unravelling `for` statements
- Unravelling assertions
- Unravelling the import statement
2020 15
- Unravelling boolean operations
- Unravelling membership testing
- Unravelling `not` in Python
- Unravelling `is` and `is not`
- Unravelling rich comparison operators
- Unravelling unary arithmetic operators
- Unravelling augmented arithmetic assignment
- Unravelling binary arithmetic operations in Python
- Unravelling attribute access in Python
- What is the core of the Python programming language?
- Why I don't like SemVer anymore
- The many ways to pass code to Python from the terminal
- Thoughts on where tools fit into a workflow
- What the heck is pyproject.toml?
- A quick-and-dirty guide on how to install packages for Python
2019 8
- Why you should use `python -m pip`
- What it's like to be on the Python steering council
- A Primer on the Stellar Network
- How do you verify that PyPI can be trusted?
- Podcast interviews where I talk about Python's governance
- The challenges in designing a library for PEP 425 (aka wheel tags)
- Deconstructing xkcd.com/1987/
- An update on Python's governance
2018 1
2017 8
- Becoming an OSS project maintainer is about trust
- Clarifying PEP 518 (a.k.a. pyproject.toml)
- Designing an async API, from sans-I/O on up
- Customizing class creation in Python
- How to use your project & Travis to help test Python itself
- Don't just open the door, welcome people through it
- My experience with type hints and mypy
- Looking for commonality among HTTP request APIs
2016 14
- My impressions of Elm
- Adding syntax highlighting to Ghost's default theme
- Why I changed my blogging platform to Ghost(Pro)
- Why I took October off from OSS volunteering
- What to look for in a new TV
- Introducing Which Film
- Network protocols, sans I/O
- (Attempting) practical password management
- Why pathlib.Path doesn't inherit from str in Python
- How to pitch Python 3 to management
- How the heck does async/await work in Python 3.5?
- The history behind the decision to move Python to GitHub
- My New Years programming resolutions
- Why `print` became a function in Python 3
2015 16
- Where are we in the Python 3 transition?
- Stop using Python 2.6 please
- Why Python 3 exists
- If I were designing Python's import from scratch
- Comparing Twitter & Google+ engagement
- How I stay happy making open source software
- Why I bought a Google OnHub router
- Try to not use the Python C API directly
- Trying out Jupyter Notebooks
- Python 3 support on PyPI
- Looking at Python 3 usage in the astronomy community
- Porting to Python 3 is like "eating your vegetables"
- Going all-in on the mobile web
- Alternative voting systems for Canada
- Why WhatsApp made its web app use your phone as a server
- How to get your parents off of Skype using WebRTC
2014 26
- Commentary on getting your code to run on Python 2/3
- The long-term view of Python 2.7
- The game mechanics of Destiny
- What I would buy my family for Xmas
- Setting up a Raspberry Pi for XBMC and automatic torrenting by RSS feed
- Comprehending the different levels of the cloud
- Bringing someone into the modern age of technology
- Telephony in the modern age
- Trying out the fish shell
- How to argue for Python's use
- Why I don't worry about Python losing users
- How to keep Python 3 moving forward
- My impressions of Dart
- Security of cash vs. bank accounts vs. Bitcoin
- Should my family get tablets or laptops?
- What phones my family should use
- Radical idea: make the CBC web-only and use their spectrum for internet access
- The shift towards telecoms becoming just a dumb pipe
- caniusepython3 1.1.0
- My experience creating caniusepython3
- My guess as to why tablets have not taken off
- Using Chrome Mobile Apps to make Oplop an Android/iOS app
- What security precautions my family should use
- What computers my family should use
- Some ideas on cleaning up the Senate
- My impressions of Scala
2013 10
- The key challenges in designing a programming language
- My thoughts on Go (again)
- Taking the Time to Re-evaluate Assumptions
- Offline JavaScript Testing
- What Would it Take to Stay in the 1% of Earners Perpetually?
- Trying to choose a soundbar
- Why I will never fit in among C++ programmers
- Writing a Zip File Importer: The Loader (Part 3)
- Writing a Zip File Importer: The Finder (Part 2)
- Writing a Zip File Importer: The Path Hook (Part 1)
Undated 8
- What will it take for physical media to go away
- What uhd tvs means maybe
- How can i fight climate change in my day to day life
- How i manage package version numbers
- Why competitive marketplaces arent always the best solution
- A tutorial on python package building
- What are the popular docker images for python
- Lazy importing in python 3 7