Not Equal
, .It took me way too long to figure out why {"PrivateKey": "abcde"}
and
{"PrivateKey", "abcde"}
aren’t equal (hint: the latter one is set, not
dictionary and their string representations differ with only one character).
Hi! My name is Michał Góral, I am software developer (currently at Nokia) and this is my personal website. You can read more about me on a separate page if you’re curious.
You can contact me by e-mail: dev@goral.net.pl. My PGP key fingerprint is: 0423 DE59 98D1 2C33 E599 CDCF E3DD DA4D C45F 58CB.
It took me way too long to figure out why {"PrivateKey": "abcde"}
and
{"PrivateKey", "abcde"}
aren’t equal (hint: the latter one is set, not
dictionary and their string representations differ with only one character).
Today I discovered that my ISP, Netia, switched my dynamic public IPv4 address to CGNAT. They did it a week ago or so without any prior notification and today was the first time since then that I tried to connect to the Wireguard server on my router.
Good thing I have Tailscale account and Tailscale doesn’t give a damn about CGNAT or firewall rules which ISP might implement. I like Wireguard more though, because it is simpler, fully self-hosted (sidenote: I’m aware about Headscale) and has nicer logo.
I wish more operators in Poland finally implemented IPv6 and be done with this IPv4 nonsense.
Neovim 0.11 disabled building translations
by default which means that they’re no longer available in published artifacts
as well. This caught me by a surprise when I tried to update my neovim-mg
DEB
package which I build for myself. To me this is accessibility issue for
non-English speakers which I resolved by switching to manual building of Neovim:
make \
CMAKE_BUILD_TYPE=Release \
CMAKE_EXTRA_FLAGS='-DENABLE_TRANSLATIONS=ON'
Neovim team says that building translations was too time-consuming, but to be honest, I didn’t notice a big slowdown. Maybe it’s different when you build it many times a day on CI.
Today I’m reading way too many posts that people are blocking whole Alibaba Cloud IP ranges (for reference: 47.80.0.0/13, 47.74.0.0/15, 47.76.0.0/14) and I’m thinking: pfff, I already did it a year ago or something. I first wrote about blocking bots in 2020 and situation got worse since then. Scrapers don’t care about robots.txt, they fake user agents, attack from different IPs and generally do anything they can to not be rate limited.
There’s a new nuclear weapon for us, the small web enthusiasts: Anubis which requires browser to do a proof of work. Maybe I’ll test it on the weekend, it looks promising.
It’s not funny though. My thoughts are with Drew, domi, Mikko and many other people who, like me, host bigger or smaller sites and struggle with AI scrapers bullshit. Fuck these scrapers.
Here’s iptables configuration for Alibaba:
-4 -A INPUT -s 47.74.0.0/15 -j DROP
-4 -A INPUT -s 47.76.0.0/14 -j DROP
-4 -A INPUT -s 47.80.0.0/13 -j DROP
Monochrome colorschemes are good and pleasant for eyes. That's why I created one for Vim.
I synchronize a lot of things, each of them differently. Let's take a look how to write a simple Bash script which automates and parallels that.
DWM-like master-stack layout for i3 is possible by using i3's IPC mechanism.
Presentation of simple scripts and techniques allowing automatic generation of program's version.
Formatting is one of these parts of TWC which I disliked the most. This has finally changed with release of TWC 0.9 and complete rewrite of formatting strings syntax.
Presentation of my program for toggling file comments depending on a list of keywords in a language similar to preprocesor.
With markorapp, a script which I wrote, it's easy to create "singletons" in i3. Singletons are applications which should have only one instance, like a particular terminal.
Writing and using webhooks to automate deployment of web applications.
I released a new version of SubConvert, a program to convert between various video subtitle formats.
Operating System Controls as escape sequences which can be used to change the background of both terminal and programs running in it.
Changelog is important, but we can simplify our lives and generate it, at least partially.
Every once in a while I learn something new about Vim. This time it's :keepalt command.
Workaround for a problem with how Sway draws borders around floating windows
We can use user-level systemd services to run X sessions.
Xsession is a default way of starting X sessions in Debian, but for some reason it remains a mystery for many people. Here I try to shed some light on it.
Configuring one of the best SMTP clients on Debian and some caveats which we must remember.
Git has capabilities of writing custom credential helpers, which can fill passwords for accessing HTTP repos for us.
I did it! I forced a buggy xrandr to toggle screens and not kill X session!
How to configure VPS and peers so they can talk to each other via Wireguard
How to mutate immutable Synology configuration and persist these changes
How to configure udev rules on Synology to create persistent device names in /dev/serial/by-id
How I replaced 2 types of wi-fi modules for Haier air conditioners with ESP8266
Home Assistant is one of my most beloved selfhosted applications. Here's why.
There is one const usage in C++ which is a little different than the others. Andrei Alexandrescu called it the most important const.
A short introduction to one of the most breakthrough features of C++11: rvalue references and move semantics.
The article about Return Value Optimization - one of the most important features of C++ compilers.
Structured Bindings is a new way to decompose values returned from functions. It's similar to some other programming languages and greatly simplifies the code.
How can we live with types which do not implement assignment operator?
How C++ handles dependant names and why we must use typename keyword everywhere.
Name hiding is a surprising feature of C++. Here we'll learn a little more about it.
A trick which allows us to easily convert from const_iterator to iterator. Please don't do that.
It's possible to create a functions in C, similar to printf and scanf, which accept infinite number of arguments.
Clever descriptor which automatically converts assigned values to the annotated type.
Graceful shutdown of PyQt applications might be harder than it looks like. This article presents the problem and a way to resolve it.
Process substitution in Bash is a powerful technique which allows us to redirect command's output to programs which only accept files.
Obstacles I encountered while testing accessibility of this blog's theme.
A video presenging Droste Effect which is a recursive image.
Even though I almost entirely stopped listening to it, I can't stay silent about recent events in Polish Radio Trójka.
Notes should be pretty too, because why not? Here I'll show you my method of rendering them to HTML.
It seems that we have a curse of abundance: so many to-do apps and methodologies that we can no longer choose one.
Trying something new for mail provider: a small company from Switzerland called Migadu.
It's a little late to make a New Year's resolution, but I'll make one nevertheless.
Simple Fix for a problem when you have one pen and too many inks.
Niesulice is a small village over Niesłysz lake.
Photos from our visit to Exotic Zoo in Kaszuby during our 2019 trip.