Skip to content

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

cp debian.iso /dev/sda

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

deb [arch=amd64 signed-by=/usr/share/keyrings/regolith-archive-keyring.gpg] https://archive.regolith-desktop.com/debian/testing testing main
deb [arch=amd64 signed-by=/usr/share/keyrings/regolith-archive-keyring.gpg] https://archive.regolith-desktop.com/debian/unstable testing main

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

apt install /home/practicalli/Downloads/google-chrome-stable_current_amd64.deb

Gitλ︎

Installed Git via Debian package manager

apt install git

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.

ln -s /usr/local/bin/nvim-0.11.2-linux-x86_64.appimage /usr/local/bin/nvim

Cloned Practicalli Astro5

git clone --depth 1 e:nvim-astro5

Created symbolic link in the .config directory

ln -s ~/projects/practicalli/nvim-astro5 ~/.config/nvim-astro5

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.

chsh -s $(which zsh)

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:

curl -sS https://starship.rs/install.sh | sh

Edited ~/.zshrc and added the starship lauch code for Zsh

eval "$(starship init 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

let mut change_me = true;

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

curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh

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

mkdir $XDG_CONFIG_HOME/rust

Define rust related variables relative to the XFreeDesktop variables, adding these to ~/.zshenv file

~/.zshrc
# 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.

🌐 Practical.li Website

Practical.li GitHub Org practicalli-johnny profile

@practicalli@clj.social @practical_li