vbernat
vbernat on Hacker News
In Zsh, you can set PATH with path=(~/.local/bin $path). There, it works as shell expansion works.
It's already using a high port. Forwarding a high port directly with SSH prevent exposing the service through a virtual host and provide HTTPS (but I didn't think of it until your mentioned it). And it would open the service to be discovered by enumerating all possible ports, like you mentioned in your first comment.
sish and ngrok are mentioned in the intro along with the reasons I didn't go this way (specific SSH server to run for the first and not self-hosted for the later).
This domain is crowded with solutions. I only explored that myself because the "free" solutions only requiring an SSH client were unreliable, including the free tier of ngrok (broken SSH tunnel).
The attack you mention is solved in the second part of the article.
This looks a good idea to let people choose their preferred medium. I am not into video either, but I turned one of my latest blog article into a video using Claude, since I thought it would be “easy.” I asked it to build the video by screencasting a browser presenting the interactive diagrams of the article and add some titles. It build some kind of recording app for me. It still took me many hours, but I think I would be faster if I redid it. I would pay to have it done faster, but I want to keep control of the text, not have a summary.
The article: https://vincent.bernat.ch/en/blog/2026-spanning-tree-video
The tool built by Claude to make the video: https://github.com/vincentbernat/vincent.bernat.ch/tree/2808...
"anorack" is a specific spell checker to tell if we need "a" or "an". It uses espeak to decompose a word into phonemes.
I am setting cache to `false` and directly use actions/cache:
- uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6
if: ${{ inputs.setup-go == 'true' }}
with:
path: |
${{ env.gocache }}
${{ env.gomodcache }}
key: ${{ runner.os }}-${{ runner.arch }}-go${{ steps.go-setup.outputs.go-version }}-${{ hashFiles('go.sum') }}-${{ env.today }}
restore-keys: |
${{ runner.os }}-${{ runner.arch }}-go${{ steps.go-setup.outputs.go-version }}-${{ hashFiles('go.sum') }}-
${{ runner.os }}-${{ runner.arch }}-go${{ steps.go-setup.outputs.go-version }}-
You get one new cache every day, and you can still load the most recent one if you are the first run today.
If you like watching the first animation, you can get it for the other diagrams with a well-known video game code.
Posted by
vbernat on Tuesday September 01, 2026 @11:40AM
from the vincent.bernat.ch dept.
Mostly, they try to avoid it by allocating extents instead of blocks (so, they look for a contiguous space to store most files) and by delaying allocation to accommodate for a growing files.
Author here. This article features interactive demonstrations of the spanning tree protocol (an old protocol to detect and fix loops in Ethernet networks) using MSTPD (user-space implementation for Linux) compiled to WebAssembly with Emscripten.
Posted by
vbernat on Monday August 24, 2026 @09:11AM
from the vincent.bernat.ch dept.
This is not untrue, but I suppose that if you don't prevent bots from accessing your website, they won't try to use the more advanced scrapers running JS and won't trigger your analytics.
The bug on Linux still exists today on this family (e100, e1000, e1000e). Maybe the root cause is different, but the solution is still to disable TCP segmentation offload and I suppose this is a firmware bug. At some point, Mellanox took over the "top" card segment for servers.
It is now mostly unusable for web analytics. So many scrapers are pretending to be browsers. On my site, there is a factor 10 with what I consider an honest view of human visitors.
In France, thanks to STIR/SHAKEN, this is not possible any more for the fixed phone numbering plans (and telemarketers have to register their phone numbers in a subset of this numbering plan). For mobile lines, this is still not 100% implemented due to the difficulty of handling roaming, but I think it is becoming efficient as I didn't have a telemarketer with a mobile number since a long time (they seem to hide their number now).
Posted by
vbernat on Tuesday August 11, 2026 @12:42AM
from the vincent.bernat.ch dept.
After 27" 4K OLED last year, I suppose 24" are next! I didn't have the patience to wait and I have migrated to 27" 4k OLED (Alienware).
Posted by
vbernat on Thursday July 23, 2026 @08:02AM
from the telcokwaks.com dept.
I have switched from FVWM to awesome because of Lua. Many years later, I have switched to i3 because it's not using a programming language for configuration. It's fine to have a configuration language if you have time to maintain, but your configuration can become quite complex and difficult to evolve. And it is also far more subject to breakage when upgrading.
I think I've found balance by using a Python daemon as a "companion" for my i3 configuration. It listens and react to event. It enhances the configuration, so when it's broken, it's not a big deal. And the interface exposed by i3 is smaller, so less risk of breakage. https://vincent.bernat.ch/en/blog/2021-i3-window-manager#i3-...
Posted by
vbernat on Friday July 17, 2026 @05:14PM
from the telcokwaks.com dept.
I don't think CF is that much present, but yes, the situation is dire.
I have also restored the very first articles I wrote in the 90s when I was young <
https://vincent.bernat.ch/en/blog/2026-old-web-articles>. At the time, they were not "great," but now I think they have some limited historical values. For example, one of them is about how the national phone operator was billing minutes. The information was easy to find in the past but is pretty scarce now.
I didn't use the wayback machine because it didn't archive everything I needed and because I still had the files on my hard drive, but if I didn't, I would have been happy to recover them.
I often run a linkchecker on my blog and substitute broken URL with links to the Wayback machine. Unfortunately, this is becoming quite difficult to detect broken URL as everybody is fighting bots. I am using linkchecker <
https://github.com/linkchecker/linkchecker/> and it respects robots.txt but many sites are now serving 503 or various other codes.
Biking is not meant to replace everything. More people biking means more room for people that cannot bike. Bike-heavy cities like Amsterdam show that most of your "facts" are incorrect (bikes can be used to transport goods, are usable when it rains, are used by a large part of the population). That's a trope common when bike displaces cars, but studies show the reverse (for example in Madrid:
https://www.sciencedirect.com/science/article/abs/pii/S02642...). Also, biking is good for health despite the risks (for example
https://www.bmj.com/content/343/bmj.d4521).
It already does. With IPv6, you don't go through some CGNAT box, that could misbehave or just break (and since the biggest chunk of content is available through IPv6, this may not be a priority). Also, a shared IPv4 can be banned by various sites if one of the owner misbehave. This issue is not present with IPv6.
More on this: https://vincent.bernat.ch/en/blog/2024-why-ipv6
6rd will soon get away to get native IPv6 instead. Also, 6rd is what allowed France to lead IPv6 deployment.