johnny turbo
Started the week with a much stronger ride than I have been able to do this year. I had the energy and motivation to push myself, especially on ascents.
Finally finished backing up the Lenovo Extreme laptop. Tried out Garuda Linux Hyprland version which was nicely organised with lots of neat desktop tools.
Installed Debian Linux as Garuda Linux had issues installing on the Software RAID partitions that the laptop had (two 512 GB drives in RAID 0). I recreated the Software RAID with the Debian installer anyway, so maybe Garuda Linux would install on the recreated array. I am not ready to switch to Wayland yet as there are a few key applications that are not yet supported.
Cycling day tripλ︎
Cycling around the Isle of Wight this month. Its a 113 km circuit of the island which is quite lumpy.
Healthλ︎
Monday was sunny but not too hot, so I went for a quick 60km cycle ride. I was feeling a bit tired before I started, but once I was going then I was surprised how much energy I had. I was able to push on hill climbs much more than usual, more than other rides this year.
Another blood test this month and another nice long walk to the medical centre. It was 13.21km round trip, including a little walk around Waitrose on the way back. More stretching of my legs is definitely required.
Debian Linuxλ︎
I had been running Ubuntu for a long time on my Lenovo Extreme laptop. After a few weeks of backing files up and committing all my code experiements and configs to GitHub, it was finally time to do a complete clean install.
I have switch to Debian Linux as my operating system of choice. Ubuntu is great but started introducing a lot of packages using the Snap approach rather than the original deb package format. Snaps havent always been a great experience, in terms of access and performance, although it has improved. I find snaps to be very inefficient use of the filespace and they package their own copy of libraries rather than using shared libraries.
Whist snaps can make some packaging a bit easier, it is at the expense of the user experience.
Everything you can do with Ubuntu, you can do in Debian (and you can only do those things on Ubuntu because Debian existed in the first place).
Install from USBλ︎
Downloaded the Debian Linux install .iso
file from Debiain.org.
Copied the .iso
file to a 4Gb USB memory stick
Inserted the USB into the laptop and switched on. The Enter
key brings up a menu
Set the language to British English and the Keyboard to US English (for the Keyboard.io Model01 keyboard)
The laptop has two Solid State drives (SSD) which I've used in a RAID 0 array for performance in writing. I haven't had any issues with this approach, so I continued to use it.
Recreated the Raid array from scratch. I deleted the existing RAID array the older partitions completely and recreating then.
Used the Tasksel
wizard at the end of the install to include OpenSSH server (as well as the default Debian & Gnome Desktop tasks)
Update to testing release (usually quite stable - but minimise system upgrades until something is needed or fixed). Updating individual packages safer. Only doing an update when I have spare time to fix things.
https://wiki.debian.org/DebianTesting
Edit the apt configuration and use trixie (the name for the next release and currently pointed to by testing)
#deb cdrom:[Debian GNU/Linux 12.11.0 _Bookworm_ - Official amd64 NETINST with firmware 20250517-09:51]/ bookworm contrib main non-free-firmware
# deb http://deb.debian.org/debian/ bookworm main non-free-firmware
# deb-src http://deb.debian.org/debian/ bookworm main non-free-firmware
# deb http://security.debian.org/debian-security bookworm-security main non-free-firmware
# deb-src http://security.debian.org/debian-security bookworm-security main non-free-firmware
# bookworm-updates, to get updates before a point release is made;
# see https://www.debian.org/doc/manuals/debian-reference/ch02.en.html#_updates_and_backports
# deb http://deb.debian.org/debian/ bookworm-updates main non-free-firmware
# deb-src http://deb.debian.org/debian/ bookworm-updates main non-free-firmware
# This system was installed using small removable media
# (e.g. netinst, live or single CD). The matching "deb cdrom"
# entries were disabled at the end of the installation process.
# For information about how to configure apt package sources,
# see the sources.list(5) manual.
# ----------
# Testing - trixie
deb http://deb.debian.org/debian/ trixie main non-free-firmware
deb-src http://deb.debian.org/debian/ trixie main non-free-firmware
deb http://security.debian.org/debian-security trixie-security main non-free-firmware
deb-src http://security.debian.org/debian-security trixie-security main non-free-firmware
NOTE: I havent updated this to the new form for apt packages, although the regolith-desktop entries are updated to the new form.
Install Regolith Desktopλ︎
An excellent tiling desktop with useful features from Gnome. So much easier to use and completely keyboard driven :happy-camper:
X11 config has changed recently (jan/feb 2025) which breaks the Debian install for Regoligh desktop, but there is an updated packages in the regolith-desktop unstable repository with the fix (and it works very nicely).
Regolith Desktop Apt repositories - testing and unstable
Chrome Browserλ︎
I use Firefox ESR to browse the world wide web by default. A few websites dont work so well, so I also install Chrome.
Downloaded the .deb
file from the Chrome Browser website
Installed as root (su -
) with apt
Gitλ︎
Installed Git via Debian package manager
Download practicalli/dotfiles for ssh keys and config and git config
Created symbolic link to dotfiles/git in .config
Copied SSH public/private keys and personalised config from another laptop into ~/.ssh/
. Normally I would add unique keys for each laptop, but I will reuse these keys for convenience and add new keys later on.
Neovimλ︎
Neovim 0.10.x is the latest packaged version for Debian.
Downloaded the 0.11.2 release (May 30 2025) from the Neovim GitHub releases page
Moved the appimage to /usr/local/bin/
and renamed the file to include its version number.
sudo mv /home/practicalli/Downloads/nvim-linux-x86_64.appimage /usr/local/bin/nvim-0.11.2-linux-x86_64.appimage
Created a symbolic link to start neovim with the nvim
command.
Cloned Practicalli Astro5
Created symbolic link in the .config directory
Sourced the aliases in .config/shell-aliases
to ensure they are loaded.
Zshλ︎
Installed the zsh package
Installed Oh-my-zsh (trying this instead of prezto to see if I like it). Its a bit simpler to install than Prezto, but then I havent customised it yet :)
Edit ~/.zshrc
file and add the starship initialisation code at the end. Also source
the shell-aliases from the Practicalli dotfiles.
Set the XFreeDesktop environment variables in .config/zshenv
and create symbolic link ~/.zshenv
I quickly didnt like Oh-my-zsh
It doesnt seem to support fish-like completion. The plugins I looked at added aliases that were more cryptic that the commands they stood for, especially for Arch Linux and Debian plugins.
Apparently I shouldnt source .zshrc
which seems very dubious, instead I need to use the omz
tool.
There was no obvious place to add environment variables, e.g. a .zshenv
file.
Prezto feels a much more organised, has features relevant to my needs and just feels better thought out. Oh-my-zsh feels a bit like yak shaving.
Change the user account default shell to zsh. Use which zsh
to find the location on the OS for the zsh binary.
Logout to update user shell
The change to zsh as the default shell will not take effect until the user account is logged out of the current session. Closing the terminal app and reopening is not enough.
Starship promptλ︎
Starship is packaged for Debian Linux testing but is one minor version behind.
Used the starship install script which adds starship
to the /usr/local/bin/
directory.
As root:
Edited ~/.zshrc
and added the starship lauch code for Zsh
Article - Using RAID as a back upλ︎
RAID isnt a backup, dont pretend it is if you have valuable and irreplaceable data.
If you have a lot of data that can be replaced or dont mind it being lost, then read on.
For a single raid system, the most fault tollerant you can get is
- Multiple RAID 6 arrays across the disks, so if one disk fails completely then not all the RAID arrays will be affected.
- A fitted drive marked as spare
- Solid State Drives of reasonable quality
Solid State Drivesλ︎
Using solid state drives has been more reliable in my experience than motorised hard drives (spinning plates).
SSD's are more expensive per storage capacity, but the gap keeps coming down compared to mechanical drives. A 4 TB SSD can be bought for around the same price as an 8TB mechanical hard drive.
SSD's are quiet and generate much less heat, so they are much nicer to have on or near your desk.
AIλ︎
Notes from the Virtual AI and Security conference
- Intellectual atrophy
- Concern: short-circuiting the learning process, especially for those who haven't learned their craft.
- Opportunity: standing on the shoulder of giants (assumiung people are learning from the results of AI and feel enabled to challenge the results of AI).
- Can generative AI become "a bicycle for your mind", inspiring you to be more creative and inquisitive and more productive ?
- RisK: the AI becomes the source of truth and engineers opinions and concerns
- AI becomes the pilot and developer becomes the co-pilot (or replaced completely)
- scaling AI (not currently that optomistic)
- virtual employees
- agents collaborationg with agents
- security
- prompt injection attacks
- "these aren't the droids your looking for" - convincing agents to do something they shouldn't
- AI supply chain (or API supply chain mixed with AI or created by AI)
- OWASP LLM Top 10 project - helps understand the risk of LLMs in applications
- Meta Content Protocol
- reminds me of GraphQL where a layer is added to your data to enable customers to search for the information they need
- security concerns if exposing sensitive data
- hacking the MCP prompt to get information that a customer shouldn't have
- performance issues on existing systems - need to be able to scale the MCP service and the services it hits (or add good caching in between and ensure you are managing updates)
- versioning of information ?
AI threat top 5 2025λ︎
- Developers relying on AI Generated code
Your developers using windsurf or vibe coding (cursor) and non-professional developers (sales, marketing, CEO, etc).
Under time pressure from the business, developers can us AI to generate solutions that do not get due diligence, especially when developers are unfamiliar with the programming language or libraries.
Code reviews become "it looks about right", ILAR, without taking the time to properly evaluate the code quality and security risk potential.
Then if AI is used to support the quality of Pull Requests, then AI is effectively checking its own work 🤯
AI as a short-cut to creating code either introduces greater risks (quality, security) or saves no time due to more sanity checks being required.
- Data Platforms ingesting all your data
Platforms ingest customer data to provide insights to help drive business decisions, a very attractive target for hackers often using social engineering to gain information (emails, etc)
- AI tooling within organisations
So many tools that can be used and can be hard to keep up with use and track the security risk being introduced.
- AI supply chain: suppliers and suppliers of suppliers of suppliers using AI, etc...
Even if you do not use AI, your suppliers (and their suppliers) could well be. Where is your data ending up throughout the chain and what systems are using it? What security checks and mitigations are done all throughout the supply chain.
Requires due diligence of the supply chain which can be time consuming and not always transparent.
- Implementing AI in your products
Personal experiencesλ︎
Back in 1997 I was considering a PhD at Newcastle University. One of the topics that seemed interesting was agents (and all the challenges of using software agents). I was fascinated by the subject but there didn't seem much of a practical application for these concepts at that time.
Now there is a lot of discussion about Agentic AI, which is a fancy word for software agents that
Whilst thinking abut malicious agents I remembered the Matrix movies and Agent smith as a metaphor.
Agent smith was a disillusioned piece of software in the matrix who had come to despise the humans, possibly due to the fact he was in charge of managing their erratic behaviour. At the end of the first movie, Agent Smith is destroyed by Neo from the inside out.
In the second movie Agent smith actually survived the experience and enhanced his abilities, so Smith could invade other software agents and any other software in the matrix. Smith would convert each person to a clone of himself.
By the third movie, Smith was taking over almost all the Matix. Only Neo was left to try and stop Smith.
I find this a cautionary tail for an autonomous AI agent that goes rogue, taking over and controlling other agents.
Why rustλ︎
Benefitsλ︎
Runtime performance as fast (or faster) than C / C++
Safety
Fullstack (backend and web development, WASM)
Multi-core support
Expressive compiler - really good feedback
Appreciated by the community
Consistency - strict coding standards
Negatives
- learning curve quite steep (Milford video series helps) - more support in 2025
- rust is maturing (although is this still the case?) - how mature are the libraries in 2025
- learning the rust concepts
Toolsλ︎
The following is used in Milford videos
VS Code - add the C/C++ extension to support debugging - Rust (rls) extension - RLS popup installs the server when opening your first Rust project - rustup
Test in the VS Code terminal using the commands
- rustc --version
- cargo --version
- rustup --version
Compilerλ︎
The compiler versions are organised by editions, e.g. "2018". The edition of the compiler is defined in the Cargo.toml
project configuration file.
Immutabilityλ︎
Most things are immutable by default (not sure about String objects)
Use mut
to define something as mutable
Installλ︎
On Debian Linux there is a rust-all
package that seems to do everything...
Package: rust-all
Version: 1.85.0+dfsg3-1
Priority: optional
Section: devel
Source: rustc
Maintainer: Debian Rust Maintainers <pkg-rust-maintainers@alioth-lists.debian.net>
Installed-Size: 366 kB
Depends: rustc (>= 1.85.0+dfsg3-1), rustfmt (>= 1.85.0+dfsg3-1), rust-analyzer (>= 1.85.0+dfsg3-1), rust-clippy (>= 1.85.0+dfsg3-1), rust-gdb (>= 1.85.0+dfsg3-1) | rust-lldb (>= 1.85.0+dfsg3-1), rust-llvm (>= 1.85.0+dfsg3-1), cargo
Recommends: cargo (= 1.85.0+dfsg3-1)
Suggests: rust-doc (>= 1.85.0+dfsg3-1), rust-src (>= 1.85.0+dfsg3-1), libstd-rust-dev-wasm32 (>= 1.85.0+dfsg3-1)
Homepage: http://www.rust-lang.org/
Download-Size: 243 kB
APT-Sources: http://deb.debian.org/debian trixie/main amd64 Packages
Description: Rust systems programming language - all developer tools
Rust is a curly-brace, block-structured expression language. It
visually resembles the C language family, but differs significantly
in syntactic and semantic details. Its design is oriented toward
concerns of "programming in the large", that is, of creating and
maintaining boundaries - both abstract and operational - that
preserve large-system integrity, availability and concurrency.
.
It supports a mixture of imperative procedural, concurrent actor,
object-oriented and pure functional styles. Rust also supports
generic programming and meta-programming, in both static and dynamic
styles.
.
This package is an empty metapackage that depends on all developer tools
in the standard rustc distribution that have been packaged for Debian.
apt install rust-all
Installing:
rust-all
Installing dependencies:
cargo gdb libbabeltrace1 libclang-cpp19 libdebuginfod-common libhttp-parser2.9 libobjc4 libsource-highlight4t64 libstdc++-14-dev lld-19 llvm-19-linker-tools python3-pygments rust-clippy rustc
clang-19 lib32gcc-s1 libc6-i386 libclang-rt-19-dev libdebuginfod1t64 libipt2 libpfm4 libstd-rust-1.85 libxml2-dev llvm-19 llvm-19-runtime python3-yaml rust-gdb rustfmt
clang-tools-19 lib32stdc++6 libclang-common-19-dev libclang1-19 libgit2-1.9 libobjc-14-dev libsource-highlight-common libstd-rust-dev libz3-dev llvm-19-dev llvm-19-tools rust-analyzer rust-llvm
Suggested packages:
cargo-doc clang-19-doc wasi-libc gdb-doc gdbserver libc-dbg libstdc++-14-doc llvm-19-doc python-pygments-doc rust-doc rust-src libstd-rust-dev-wasm32
Summary:
Upgrading: 0, Installing: 42, Removing: 0, Not Upgrading: 12
Download size: 196 MB
Space needed: 1,100 MB / 942 GB available
Hold on... Rust recommends rustup
but its not part of rust-all.
Installing rustup removes some of the rust-all packages and rust-all meta-package...
~ apt install rustup rust-src
Solving dependencies... Error!
Some packages could not be installed. This may mean that you have
requested an impossible situation or if you are using the unstable
distribution that some required packages have not yet been created
or been moved out of Incoming.
The following information may help to resolve the situation:
Unsatisfied dependencies:
rust-src : Conflicts: rustup but 1.27.1-3+b1 is to be installed
Error: Unable to correct problems, you have held broken packages.
Error: The following information from --solver 3.0 may provide additional context:
Unable to satisfy dependencies. Reached two conflicting decisions:
1. rustup:amd64=1.27.1-3+b1 is selected for install
2. rustup:amd64=1.27.1-3+b1 is not selected for install because:
1. rust-src:amd64=1.85.0+dfsg3-1 is selected for install
2. rust-src:amd64 Conflicts rustup
➜ ~ apt install rustup
The following packages were automatically installed and are no longer required:
libgit2-1.9 libhttp-parser2.9 lld-19 rust-llvm
Use 'apt autoremove' to remove them.
Installing:
rustup
REMOVING:
cargo libstd-rust-1.85 libstd-rust-dev rust-all rust-analyzer rust-clippy rust-gdb rustc rustfmt
Summary:
Upgrading: 0, Installing: 1, Removing: 9, Not Upgrading: 12
Download size: 2,158 kB
Freed space: 355 MB
Continue? [Y/n] y
Get:1 http://deb.debian.org/debian trixie/main amd64 rustup amd64 1.27.1-3+b1 [2,158 kB]
Fetched 2,158 kB in 0s (6,803 kB/s)
(Reading database ... 292033 files and directories currently installed.)
Removing rust-all (1.85.0+dfsg3-1) ...
Removing cargo (1.85.0+dfsg3-1) ...
Removing rustc (1.85.0+dfsg3-1) ...
Removing libstd-rust-dev:amd64 (1.85.0+dfsg3-1) ...
Removing rustfmt (1.85.0+dfsg3-1) ...
Removing rust-analyzer (1.85.0+dfsg3-1) ...
Removing rust-clippy (1.85.0+dfsg3-1) ...
Removing rust-gdb (1.85.0+dfsg3-1) ...
Removing libstd-rust-1.85:amd64 (1.85.0+dfsg3-1) ...
Selecting previously unselected package rustup.
(Reading database ... 291892 files and directories currently installed.)
Preparing to unpack .../rustup_1.27.1-3+b1_amd64.deb ...
Unpacking rustup (1.27.1-3+b1) ...
Setting up rustup (1.27.1-3+b1) ...
Processing triggers for man-db (2.13.1-1) ...
Processing triggers for libc-bin (2.41-8) ...
Oh dear, it seems the Debian package of rustup
is from May 2024, so over a year ago. There has been a major (1.28.0) and two minor releases (tags) since then.
Uninstall what I have just installed...
apt remove --purge rustup cargo rust-clippy rustc llvm-19 llvm-19-runtime python3-yaml rust-gdb rustfmt clang-tools-19 lib32stdc++6 libclang-common-19-dev libclang1-19 libgit2-1.9 libobjc-14-dev libsource-highlight-common libstd-rust-dev libz3-dev llvm-19-dev llvm-19-tools rust-analyzer rust-llvm
Now install via the script on the rust-up site
This script does print out what its going to do before doing it (at least an overview)
I ran this as root thinking it would try install something globally, but this is not the case.
➜ ~ curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
info: downloading installer
Welcome to Rust!
This will download and install the official compiler for the Rust
programming language, and its package manager, Cargo.
Rustup metadata and toolchains will be installed into the Rustup
home directory, located at:
/root/.rustup
This can be modified with the RUSTUP_HOME environment variable.
The Cargo home directory is located at:
/root/.cargo
This can be modified with the CARGO_HOME environment variable.
The cargo, rustc, rustup and other commands will be added to
Cargo's bin directory, located at:
/root/.cargo/bin
This path will then be added to your PATH environment variable by
modifying the profile files located at:
/root/.profile
/root/.bashrc
/root/.zshenv
You can uninstall at any time with rustup self uninstall and
these changes will be reverted.
Current installation options:
default host triple: x86_64-unknown-linux-gnu
default toolchain: stable (default)
profile: default
modify PATH variable: yes
1) Proceed with standard installation (default - just press enter)
2) Customize installation
3) Cancel installation
So cancel this install and run as Practicalli, my usual account name.
Also want to change the location of the Rustup home directory with RUSTUP_HOME
and the cargo home via CARGO_HOME
I use the XFreeDesktop configs, so I can either use that variable in the name or use .config. I'll try first with the XFreeDesktop variable
I also want to group all the rust configs into a single directory so I know they all relate to rust (rather than being spread around the .config directory). I'll create a $XDG_CONFIG_HOME/rust
directory
Define rust related variables relative to the XFreeDesktop variables, adding these to ~/.zshenv
file
# Rust Lang Development tools
export RUSTUP_HOME="${RUSTUP_HOME:=$HOME/.config/rust/rustup/}"
export CARGO_HOME="${RUSTUP_HOME:=$HOME/.config/rust/cargo/}"
NOTE: apparently .zshenv
file is sourced every time a new zsh session is started. So one-off exports like these are better suited to the .zprofile
file
Lets test that theory...
Yes this is the case. Opening a new tab in kitty starts a new Zsh session and it did have the RUSTUP_HOME
variable, echo $RUSTUP_HOME
. Switching to an existing kitty tab, the RUSTUP_HOME
variable did not exist.
Bicycle maintenanceλ︎
I bought a few bike parts from AliExpress and so it was a good excuse to do some bike maintenance whist I was trying these out, especially as I am doing a long ride at the end of the month.
- 3D Printed carbon seat
- Carbon & titanium look keo pedals
- Mini rear-view mirror to attach in the bar end
- TPU inner tubes for tyres between 18 and 28C, weiging in at a tiny 25 grams (5 of these weigh the same as a bitumen rubber inner tube)
- carbon out-front (needs an adaptor to fit better with my handlebars)
- micro chain pin splitter (small and light so fits in my bar bag easily)
When trying out the carbon out-front one of the top bolts broke that the stem uses to hold the handle bars. I believe I didnt loosen the top bolts when changing the bottom bolts for the out-front, this probably put to much force in the wrong direction on those bolts.
A visit to the local Bike shop and I had a replacement stem (they had a spare from a bike where the shop-bought handlebars were replaced with drops).
This got me thinking about extra maintenance, especially keeping all the nuts and bolts in good shape. Previously I have used Lithium grease everywhere, although it was time to check if that was still a good approach.
Greaseλ︎
Moving parts can use any good general purpose grease, e.g. car grease
Lithium based grease is good for keeping water out. Some places where it can be used include
- thru axe - not weight bearing but adding lithium to the thread ends of the thru axe should prevent water damage
- screws and bolts to prevent corrosion, so its okay as a general anti-seizure use
Copper grease is very good for anti-seizure protection on threaded or press-fit connections between different materials
- bolts for stem
- bolts anywhere on the bike ?
Carbon paste or assembly paste is good for carbon on carbon joints, increasing friction so less torque may be needed for a secure connection
- carbon seat post
- carbon bar stem to carbon handlebar
I think I will get a small pot of all three types of grease as they will be useful for different parts of the bike.
Thank you.