Return to Big Stages, macOS Dynamic Linker, & Nox
Greetings Friend!
Hope everyone made it into 2023 and that the overall trajectory will improve somewhat! I for one managed to get (non-COVID) sick twice this winter (including 5 days of fever in a hotel on a quick "vacation"), so I hope you made it through better.
It's been too long again, and this time I don't have that much to announce (famous first words; turns out I do), since I've spent most of my free time working on my FOSS projects and making popcorn in the bright fire that Twitter has become under its new management.
Speaking of: This is probably a good moment to mention that I'm https://mastodon.social/@hynek in the Fediverse – just in case Twitter doesn't make it until my next newsletter. 😅
Either way, I'm grateful you chose a way to be notified of my content that can't be cut off by a maniac!
Fruit Flies Went BIG
Last time I wrote to you, I was announcing my How I’m a Productive Programmer With a Memory of a Fruit Fly blog post. I've already insinuated that it might be a popular post, but little did I know that it's gonna absolutely crush everything else I've ever written! I’m glad it resonated with so many people and I hope I’ve helped some of you to lighten the daily grind of writing code.
Copyrights and Wasting Your Time
Another thing that seemed to have hit a nerve and went big was an article of mine from late 2021: You Can Stop Updating Copyright Attribution Years
Chances are you’ve seen it pop up in discussions on a project you follow, for I’m getting traffic from all of GitHub and it makes me very happy, because it means I've helped to ease the load on fellow maintainers.
I also consider it one of my life’s biggest achievements that Daniel Stenberg cited it as one of the reasons to drop years in curl. While his later summary, alas, doesn’t mention it anymore, the summary is still very much worth reading since he isn’t as chicken about making legal claims as I am.
macOS and Vanishing Environment Variables
The first article of the year turned out a bit inside baseball. Prodded by a bug in Hatch, I did a deep dive why certain environment variables (all the start with DYLD_
, to be precise) vanish seemingly unpredictably. Spoiler alert: as with Docker signals, it’s all about calls being unexpectedly wrapped in shells.
Interestingly, that article did quite well on Hacker News despite being a fringe topic. Apparently it got a second chance for being culturally technically valuable, so I’m officially now the NPR of blogging.
Back to the Big Stage!
You may wonder why it took me so long to write this newsletter, after publishing the blog posts days ago. The answer is: I was desperately waiting for the result of PyCon US 2023's call for paper.
And I'm happy to report that after too many years I'll be on the big stage again!
Here’s a secret teaser of the first slide just for you, my loyal subscribers:
As you may have guessed, it’s based on my epic (as in: long) blog post from 2021. I hope to reach a new audience thanks to the new medium and I also hope I won’t have to give it to an empty room, so please everybody buy tickets and see you in Salt Lake City!
Nox
While waiting for the PyCon US decision, I’ve actually managed to push out another blog post! This time one that has been living in my head rent-free and I took the opportunity to finally evict it.
I love tox, the common way to run Python tests across different Python versions and other factors. If you’re not familiar: Think of it as CI matrices like you get from GitHub Actions, just locally on your computer.
The problem I have tho, is that I’m increasingly confused by its INI-based DSL. So I’ve started using Nox, a very similar product (hence the name) that uses a Python file instead in some of my projects. Eventually, people kept asking me as to why and I’ve been evading the question for the simple reason that I’ve been on the receiving end of people proclaiming attrs a legacy project compared to dataclasses, or lately Pydantic and I’m viscerally opposed to do that to the tox maintainers myself.
Nevertheless, I have finally given in and written Why I Like Nox. Please note that I’m not trying to convince anyone to abandon tox or even to use Nox (at work, I use Hatch Environments instead of both; at least in projects that don’t suffer from the DYLD
problem).
It’s literally just an explanation why I use Nox for some projects and if those reason resonate with you, you now have an option.
Tidbits
Thread
This is a new one. I probably should have a dunk comment blog. I'm an avid user of Obsidian (I'm writing these very words in it right now), but I’ve never found my place in the Zettelkasten / PKM / Tools for Thought circle-jerking. I actually kinda felt bad about how I use Obsidian (and Roam Research which I used before and left because of its toxic community, but that’s a story for a different day).
But then I’ve stumbled over Unbundling Tools for Thought and it resonated heavily with me. Not to the full extend, mind you, but it made clear to me that there’s a spectrum of how deep you go using these kinds of tools and if I find a billion of loose atomic notes confusing, and don't want to spend all day drawing pretty Maps of Content in Excalidraw, it's fine, too.
This whole thing with influencers using these tools only to produce content about them1 and making the tools the end in itself strongly reminds me of Bullet Journaling that was supposed to simplify task management, but has become a major source of procrastination opportunities.
I’ve summed up my thoughts in threads on Mastodon and Twitter, and I think that it truly resonated with people who felt the same pressure.
TIL
I’m still not writing enough TILs, but at least three of my past blog posts started as TILs until I dove deeper, and then they graduated. I guess if the section becomes an incubator for blog posts, that's fine too.
Never the less, I did write one! If you use GitHub Actions for CI, you might have run into a deprecation warning about the set-output
that linked to an absolutely useless blog post. So I wrote down How to Fix the set-output GitHub Actions Deprecation Warning.
To my surprise, GitHub reached out to me in private and improved their blog post, so that's a win for everyone.
FOSS
Let's do a very brief tour of my most important FOSS activities, which are all Python this month:
-
Sponsorship perks: Yeah this one is self-serving. 😇 I've been generously supported by individuals and companies on GitHub Actions for over a year now. I always wanted to express my gratitude but wasn't sure how. Now I've launched a bunch perks that should be especially interesting to companies since they currently can get their logo on the READMEs of my projects for just $50 / month (for now). But the lower tiers get more too: I've started thanking my sponsors in all my project releases!
Any of that sounds interesting? Check them out!
-
stamina: I've open-sourced a new project! It's just a wrapper around tenacity, but I use it in almost every project at work. Check it out if you want an ergonomic package for retries with type hints and sensible defaults.
-
attrs got its 22.2 with mostly under-the-hood changes – although our investments into runtime performance is paying off! It's also the first release using more CI-based PyPI release automation which I hope to blog in the future.
-
structlog got also an overdue release, but this one was quite huge for the reason alone that I've almost completely rewritten and heavily expanded the documentation. If you've ever bounced off it in the past, give it another try!
-
Towncrier: After using Towncrier for many years in attrs, I got more involved in its maintenance. Most notably, I wrote a tutorial on How to Keep a Changelog in Markdown. If you thought that Towncrier is Python-only or reStructuredText-only, check it out!
Thats all for today and as usual it’s way more words than expected! Have a fantastic 2023 and as always: the reply button is free!
Off to writing a talk,
—h
-
I also have complicated feelings about the fact that the Obsidian community has reached the point where they hustle Obsidian courses to each other. In my experience that tends to be a watershed moment. ↩