In a previous note, I discussed running coroutines in a non-blocking manner using gather. This approach works well when you have a known number of coroutines that you want to run in a non-blocking manner. However, if you have tens, hundreds, or more tasks, especially when network calls are involved, it can be important to limit concurrency. We can use a semaphore to limit the number of coroutines that are running at once by blocking until other coroutines have finished executing.
Python coroutines allow for asynchronous programming in a language that earlier in its history, has only supported synchronous execution. I’ve previous compared taking a synchronous approach in Python to a parallel approach in Go using channels. If you’re familiar with async/await in JavaScript, Python’s syntax will look familiar. Python’s event loop allows coroutines to yield control back to the loop, awaiting their turn to resume execution, which can lead to more efficient use of resources.
Render is a platform as a service company that makes it easy to quickly deploy small apps. They have an easy-to-use free tier and I wanted run a Python app with dependencies managed by Poetry. Things had been going pretty well until I unexpectedly got the following error after a deploy Fatal Python error: init_fs_encoding: failed to get the Python codec of the filesystem encoding Python runtime state: core initialized ModuleNotFoundError: No module named 'encodings' You don’t have to search for too long to find out this isn’t good.
In Javascript, using async/await is a cleaner approach compared to use of callbacks. Occasionally, you run into useful but older modules that you’d like to use in the more modern way. Take fluent-ffmpeg, a 10 year old package that uses callbacks to handle various events like start, progress, end and error. Using callbacks, we have code that looks like this: const ffmpeg = require('fluent-ffmpeg'); function convertVideo(inputPath, outputPath, callback) { ffmpeg(inputPath) .
When deploying software with Kubernetes, you need to expose a liveness HTTP request in the application. The Kubernetes default liveness HTTP endpoint is /healthz, which seems to be a Google convention, z-pages. A lot of Kubernetes deployments won’t rely on the defaults. Here is an example Kubernetes pod configuration for a liveness check at <ip>:8080/health: apiVersion: v1 kind: Pod metadata: name: liveness-http spec: containers: - name: liveness image: args: - /server livenessProbe: httpGet: path: "/health" port: 8080 initialDelaySeconds: 3 periodSeconds: 3 When setting up a new app to be deployed on Kubernetes, ideally, the liveness endpoint is defined in a service scaffold (this is company and framework dependent), but in the case it isn’t, you just need to add a simple HTTP handler for the route configured in the yaml file.
Given the following make target .PHONY: my_target my_target: @python scripts/ $(arg) one can the argument with an argument in the following manner make my_target arg=my_arg I used this approach to run a python script to create the file for this post make til p=make/pass-arg-to-target for the following make target .PHONY: til til: @python scripts/ $(p) It’s also possible to prepend the variable p=make/pass-arg-to-target make til
I learned about skhd recently, actually after coming across the yabai project. I’ve been toying with the idea of moving away from Hammerspoon for my hotkey and window management, so I took the opportunity to explore skhd as a possible alternative. Initial setup To get started on macOS, I followed the guide in the project README. First, I installed skhd via brew. brew install koekeishiya/formulae/skhd The instructions say to start the service immediately with
I used open-interpreter to read an epub file and create a DIY audio book. Open-interpreter suggested that I use the bs4 and ebooklib libraries. It recommended an API to create audio files from text, but I was easily able to switch this out for the free and local alternative, say on macOS. As I worked (let the model write code), it was easier to copy the code to a separate file and make modifications.
There is a website I log into often that I protect with 2FA. One thing that bothers me about this process is that the 2FA screen does not immediately focus to the input, so I can immediately start entering my 2FA code. Today, I tackled that problem. The most recent experience I’ve had writing userscripts was with a closed source browser extension. A few minutes of search and I discovered Violentmonkey, an open source option with no tracking software.
I usually use tail -n +2 to get all the first line of a file but today I learned you can also accomplish the same task with sed '1d' Both also work for removing more than just the first line of an input. To remove the first three lines sed '1,3d' is equivalent to tail -n +4 It seems like tail is recommended for larger files though, since it doesn’t process the entire file.