To be pedantic: there is no such thing as a boolean value. It's all just bytes and larger numbers behind an abstraction that allows a higher-level programming language to implement Boolean algebra by interpreting numbers a certain way. One such abstraction is the POSIX convention of treating a return code of zero as success and everything else as a failure. This consequently defines how Boolean algebra is implemented in POSIX-compliant shells:
The if statement tests the return code of the command specified in the header, then executes the then branch if the return code is zero, the else branch otherwise.
The while loop similarly tests the command in the head and executes the body if its return code is zero.
The boolean && and || operators treat zero return values as true and nonzero return values as false. Go try it out.
Even the true and false commands are just programs that immediately return 0 and 1 respectively.
If you start treating nonzero return codes like a success value with meaning, the only thing you'll achieve is that your scripts won't be compatible with the shell. stdout exists. Use it.
Local Unbound with Tailscale's split DNS has been solid for me. I use it as an OPNsense service with the web GUI, but the standalone YAML config looks simple enough.
I've never used Linkwarden, but the /data folder is often used by Docker containers to store the application's data, so it's likely an internal path. You'll have to create a volume that exposes the internal /data path to the host filesystem, then whatever is written into that directory will be made available to both the container and the host system. Any file or directory in the container can be exposed this way.
I usually put my data volumes in /srv (where my large RAID array is mounted) and config volumes in /config, into a subdirectory named after the service, and with the minimal necessary privileges to run the container and the service. You could, for example, create volumes like this:
It does as much as most desktop distributions. More in some areas. It has merits regardless of your politics. I know I'll be borrowing some of the scripts.
It goes both ways. The situation is still developing, whatever information you have might become obsolete an hour from now. If you need to air your feelings, this isn't the right place for it. It's also worth keeping in mind that the interaction that led to this controversy was nothing more than an already opinionated post and a reply from a Framework employee who has no say in who gets sponsored. Even the person who made the original post decided to "let it rest".
Be intelligent, do not be led into a smear campaign on somebody's leash.
I don't know which label is the most accurate, but he supports Putin's war, which lands him in the "shitbag" category. Being technically not fascist does not negate supporting the military invasion of a sovereign country, the ethnic cleansing of its people, and the rape, murder, and torture committed by the invaders.
And that improves readability, how? Don't get me wrong, I'm a big fan of the Elvis operator, but chaining multiple null coalescing assignments into a one-line expression is a chore to decipher.
Looks a lot like more syntax sugar to me, to hide boilerplate code. It's not necessarily a bad thing, but it can obfuscate the actual meaning of the code for the sake of brevity. What does A ??= B do at a glance, for example?
It's not exclusive to C# or "corporate" languages either. Rust has a fuckton of syntax sugar that makes it difficult to read.
Yes, and that is one of the tools that would be evaluated. My immediate problem is that it requires a working OS to rollback to the last filesystem snapshot if the configuration change (which is still not atomic) is interrupted.
The area where filesystem-level snapshots would be amazing is the /home partition, whenever a teacher asks the computer to be cleaned before an exam.
Not only has this made me realize how fucking old I am, but I also got curious about how Limewire is doing, and...
In September 2025, LimeWire acquired the Fyre Festival brand, including its intellectual property, trademarks, online domains, and social media assets, from Billy McFarland via an auction held on eBay.
...according to Wikipedia. At this point, my 2025 bingo card would serve better as kindling.
What's even even more fucked up is that the package still installs an executable to /usr/bin/firefox, but it's just a wrapper script that launches the Snap application... and also replaces your desktop shortcuts, application launcher shortcuts, and favourites with its own Reforged Edition file if you're running GNOME, Unity, MATE, or KDE Plasma.
bash
# [...]
# GNOME Shell
OLD="firefox.desktop"
NEW="firefox_firefox.desktop"
FAVS=$(gsettings get org.gnome.shell favorite-apps 2> /dev/null)
if echo "$FAVS" | grep -q "'$OLD'"; then
NEWFAVS=$(echo $FAVS | sed -e "s#'$OLD'#'$NEW'#")
gsettings set org.gnome.shell favorite-apps "$NEWFAVS"
fi
# MATE
OLD="/usr/share/applications/firefox.desktop"
NEW="/var/lib/snapd/desktop/applications/firefox_firefox.desktop"
OBJECTS=$(gsettings get org.mate.panel object-id-list 2> /dev/null)
for object in $OBJECTS; do
object=$(echo $object | cut -d\' -f2)
launcher=$(gsettings get org.mate.panel.object:/org/mate/panel/objects/$object/ launcher-location)
if [ "$launcher" = "'$OLD'" ]; then
gsettings set org.mate.panel.object:/org/mate/panel/objects/$object/ launcher-location "'$NEW'"
fi
done
# [...]
# TODO: handle other desktop environments
exec /snap/bin/firefox "$@"
To be pedantic: there is no such thing as a boolean value. It's all just bytes and larger numbers behind an abstraction that allows a higher-level programming language to implement Boolean algebra by interpreting numbers a certain way. One such abstraction is the POSIX convention of treating a return code of zero as success and everything else as a failure. This consequently defines how Boolean algebra is implemented in POSIX-compliant shells:
ifstatement tests the return code of the command specified in the header, then executes thethenbranch if the return code is zero, theelsebranch otherwise.whileloop similarly tests the command in the head and executes the body if its return code is zero.&&and||operators treat zero return values as true and nonzero return values as false. Go try it out.trueandfalsecommands are just programs that immediately return 0 and 1 respectively.If you start treating nonzero return codes like a success value with meaning, the only thing you'll achieve is that your scripts won't be compatible with the shell.
stdoutexists. Use it.