Skip to content

Bikes Assembled, Clojure updated

Clojure Monthy updates for the CLI aliases and Project Templates.

Neovim update of plugins for the Practicalli Astro5 configuration.

Compilation and install of a TUI app to play music from YouTube, which has an excellent selection of music available. I prefer using the TUI to the YouTube Music website.

A quick trip to the Coney Hall cycle shop fixed a troublesome hub in the rear wheel, checked with the mechanic on how to assemble the compression plug, donation of an old rear wheel, and collection of a 100mm and 110mm stem to test out the correct length for a good bike fit.

My rim brake wheels are starting to wear out, after 20 years of riding. I will seek out some Fulcrum wheels so I can keep the original look. Fulcrum Racing 5, 3, 1 or zero wheels are options. The Racing Zero wheels are the lightest at around 1430 grams, as they use aluminium bladed spokes. Probably nicer than some of the cheaper carbon wheels.

A review of my tennis elbow and trigger finger with the local GP. I am being referred to advanced Physiotherapy to see if I need an injection in my finger to relieve the locking. From the x-ray of my hand there was no sign of Osteoarthritis (yet) although my blood test did indicate markers for rheumatoid arthritis.

Clojureλ︎

Time to update Clojure CLI Config.

I update the libraries in each alias to their latest version using liquidz/antq. I have an alias called :update/dependency-versions.

I run clojure -T:update/dependency-versions from the root of the project locally. Then commit the changes that liquidz/antq has made.

First I commit updates to the actions in any of the GitHub workflows for the project.

Then I commit all the library version changes in deps.edn.

Finally I cut a new release with details of all workflow and library changes.

Continuous Integration for the latest dependenciesλ︎

There seem to be several approaches to including

  1. Running Antq locally and manually create a PR for the changes, create a new release from PR (works but time consuming, although I have optomised it a bit)
  2. Create a GitHub workflow with antq action and add an action to create a PR from the output of antq
  3. Use clojure-dependency-update-action (author @nnichols states project in maintenance mode, recommends using renovate instead)
  4. Create workflow with BigConfig (havent tried this yet, is this too big for this specific task ?)
  5. Create a renovate github action (WIP)
  6. Setup Mend Renovate service (free version) and add custom sources for Clojars.org and GitHub
  7. Create a dependabot workflow (does this support Clojure archives & repositories - official support very unlikely).

When asking on the Clojurians slack I only had a reply from one person. They kindly shared their companies custom script they run to update dependencies. Several parts are particular to that company, but I could spend some time crafting something easily maintainable for Practicalli.

There were several mentions of Renovate in the Clojurians Slack community, but nothing that indicates a working solution (equivalent to antq).

Practicalliλ︎

I am trying to understand the best way to update Zensical and it is not that obvious.

The Zensical documentation says uv can be used to upgrade a package. I created a Makefile task to update the Zensical package. Running this task downloaded the latest version of zensical, but it doesnt seem to be the right approach for updating Zensical (even though the Zensical website describes this command as the way to update using uv).

Make task: docs-upgrade - this approach no longer used
docs-upgrade:  ## Update Zensical version in Python virtual environment
    $(info -- Install Zensical  ---------------------)
    $(PYTHON_VENV_ACTIVATE) && uv lock --upgrade-package zensical==$(version)
Run make docs-upgrade task
make docs-upgrade version="0.0.21"
Output from docs-upgrade
cycling main  ? ✗ make docs-upgrade version="0.0.21"
-- Install Zensical  ---------------------
. .venv/bin/activate && uv lock --upgrade-package zensical==0.0.21
Using CPython 3.13.11 interpreter at: /usr/bin/python3.13
Resolved 9 packages in 432ms
Updated zensical v0.0.9 -> v0.0.21

This does not update the pyproject.toml file.

Checking the version of zensical shows the original version in the pyproject.toml file, 0.0.9, rather than the newer 0.0.21.

After editing the pyproject.toml file and updating the version of zensical in the dependencies, the zensical version was still showing 0.0.9.

Zensical version in pyproject.toml file

pyproject.toml
[project]
name = "cycling"
version = "0.1.0"
description = "Practical guide to cycling"
readme = "README.md"
requires-python = ">=3.13"
dependencies = [
    "zensical>=0.0.21",
]

Then install Zensical again. This cleans out the Python Virtual Environment and installs Zensical and related packages.

Install Zensical in Python Virtual Environment

make docs-install
Output of make docs-install
cycling main  ? ❯ make docs-install
-- Install Zensical  ---------------------
. .venv/bin/activate && uv add zensical
Using CPython 3.13.11 interpreter at: /usr/bin/python3.13
Removed virtual environment at: .venv
Creating virtual environment at: .venv
Resolved 9 packages in 192ms
Prepared 1 package in 5.91s
Installed 7 packages in 459ms
 + click==8.3.1
 + deepmerge==2.0
 + markdown==3.10
 + pygments==2.19.2
 + pymdown-extensions==10.17.1
 + pyyaml==6.0.3
 + zensical==0.0.21

The question remaining is that should I simply update the pyproject.toml file and run make docs-install and forget about upgrading the zensical package using uv ?

TUI Appsλ︎

YouTube Music has a very good collection of music available on its service. I do find the website a little clunky to use, so it was nice to find a TUI app called YouTUI that would let me find music by artists and create playlists from albums.

Shellbeats is another TUI, althogh its focus is on searching and playing songs. There didnt seem to be a way to show albums, although playlists can be added and saved.

YouTUIλ︎

The YouTUI project does not create binary releases. Instead I downloaded the source code and built a binary using the Rust compiler, as the TUI is written in Rust.

The compilation did take a very long time to complete (on a 10 year old computer).

Build YouTUI binary from rust source code

cargo install youtui --locked

The rust compiler creates the binary file ~/.cargo/bin/youtui. This is not on the execution path, so I gave the complete path to run YouTUI.

Build YouTUI binary from rust source code

~/.cargo/bin/youtui

The TUI runs okay, although there are a couple of steps before the music can be played.

By default YouTUI uses browser authentication, so the cookie from a POST request to music.youtube.com must be copies to the ~/.config/youtui/cookie.txt file. The Cookie value was copies from the Firefox developer tools (F12) > Network tab > Select a POST request > Resource Headers > Cookie

Now I can search for music in YouTUI, but the music will not play (403 forbidden errors).

Copy the examples/config/config.toml file from the YouTui GitHub repository into ~/.config/youtui/config.toml. Edit this config file and use yt-dlp as the download tool (installing yt-dlp if not already available).

YouTUI config file excerpt

# Example config.toml file for youtui containing the application defaults.
auth_type = "Browser"
# downloader_type = "Native" - failing to download
downloader_type = "YtDlp"
yt_dlp_command = "yt-dlp"

Now I could search for music and play a song or album from the command line.

The final refinement to make is to refactor the keys to be in the vim-style (hopefully that also updates the built in help menus).

Neovimλ︎

Time to update AstroNvim plugins again.

An update highlights there are new versions of the specific AstroNvim plugins with release 5.3.15. A second call to update brought in additional plugins now the newer AstroNvim plugins were installed.

The Astrocommunity has some breaking changes, but not affecting any plugins used in the Practicalli nvim-astro5 config.

Astronvim update packages
  Breaking Changes (1)
    ● astrocommunity 0.04ms  start
        773e9bd refactor(cord-nvim): remove redundant build step (#1732) (2 days ago)
        9ee60b5 fix(opencode-nvim): Fix keybinding commands (#1731) (6 days ago)
        b17ae49 fix(crazy-coverage-nvim): update command and key descriptions (#1726) (6 days ago)
        75acbbd fix(overseer-nvim)!: Adjust overseer-nvim command to match v2.0 (#1729) (9 days ago)
        8925b98 fix(fyler-nvim): rename deprecated setting  (#1727) (2 weeks ago)


  Updated (8)
    ● AstroNvim 0.08ms  start
        7fd5832 chore(main): release 5.3.15 (10 days ago)
        93b273b fix(snapshot): update `lazy_snapshot` (10 days ago)

    ○ blink.cmp  InsertEnter  CmdlineEnter
        4b18c32 chore: bump version to 1.9.1 (22 hours ago)
        22cbfef docs: fix changelog repo links (2 days ago)
        0d67f21 chore(nix): update flake.lock (2 days ago)
        bc54f81 chore: bump version to 1.9.0 (2 days ago)
        cc824ec chore: bump frizbee to 0.7.0 to fix nightly build (2 days ago)
        0dbc060 docs: add blink-cmp-copilot-chat community source (#2371) (2 days ago)
        fab799d refactor(window): simplify positioning logic for documentation (5 days ago)
        b137f63 fix: don't clear last_char on transient mode changes (#2325) (13 days ago)
        2b4d146 feat(cmdline): support v:lua custom completion (#2350) (13 days ago)
        e05c91f fix(provider): respect `min_keyword_length` over global setting (#2354) (13 days ago)
        820f1dd fix: explicitly target temp buffer in dot-repeat (3 weeks ago)
        356ec15 docs: update vimdocs (3 weeks ago)
        946b55d docs(recipes): fix lspkind after breaking change (#2358) (3 weeks ago)
        b1b7740 docs: update vimdocs (3 weeks ago)
        8883f6d docs: remove mention of luasnip as built-in source (3 weeks ago)

    ○ conjure  janet  fennel  racket  hy  scheme  guile  julia  lisp  rust  clojure  python  sql  lua
        8dba456 Merge pull request #757 from russtoku/fix-issue-756 (3 days ago)
        8e4d20e Fix for issue #756. (5 days ago)
        4036396 Merge pull request #755 from jship/docs (3 weeks ago)
        793faab Document the macroexpand-related mappings in Clojure docs (3 weeks ago)
        33daae1 Update Elixir docs to refer to Elixir REPL instead of Ruby one (3 weeks ago)
        db81492 Add a mapping to restart the babashka auto REPL (3 weeks ago)
        fa0c1f5 Pick elixir command based on OS #747 (3 weeks ago)
        1c0af54 Merge pull request #754 from pyrmont/bugfix.random-sponsor (3 weeks ago)
        889d1fe Merge pull request #753 from pyrmont/bugfix.eval-file-log (3 weeks ago)
        1c99f32 Merge branch 'jship-python-on-success-init' (3 weeks ago)
        d48c4cc Update README.adoc (3 weeks ago)
        85954f9 Merge pull request #750 from jship/ts-python-error (3 weeks ago)
        fcfcac5 Merge pull request #748 from russtoku/patch-1 (3 weeks ago)
        5262736 Set math.randomseed before generating sponsor message (3 weeks ago)
        3823914 Call modify-client-exec-fn-opts in eval.file (3 weeks ago)
        eaa241d Python client was doing some on-success init inside call to display-repl-status (3 weeks ago)
        6093f55 Avoid pcall on vim.treesitter.language.add as it doesn't assert/error (3 weeks ago)
        2a8912b Update README.adoc (4 weeks ago)

    ○ gist.nvim  GistCreateFromFile  GistsList  GistCreate
        38136c3 fix: update 0x0 user-agent to include program version (2 weeks ago)
        da0289a refactor: improve error handling and setup validation (2 weeks ago)
        6231003 fix(gitlab,sourcehut): add nil checks for config.prompts (2 weeks ago)
        6295004 fix(list): add nil check for config.list (2 weeks ago)
        a9a324c fix(gh): add nil checks and unify is_public field (2 weeks ago)
        0bc9df1 fix: unify is_public field naming in CreateContext (2 weeks ago)
        746ec1e align 0x0 and termbin apis (2 weeks ago)
        4f64899 fix: better error handling (2 weeks ago)
        d8c7f3d refactor: use new neovim apis (0.10+) (2 weeks ago)
        3602ff9 chore: recursive config merge (2 weeks ago)

    ○ grug-far.nvim  GrugFar  GrugFarWithin
        275dbed only close window when new window was initially created and we are in that window (3 days ago)
        14babc9 feat: complete command with context (6 days ago)
        1f7a722 fix: treesitter highlight on result don't work on 0.12 (2 weeks ago)

    ○ neogit  Neogit  User AstroGitFile
        7387022 feat: allow to customize initial name on branch rename (12 days ago)

    ○ octo.nvim  Octo
        5ae580d fix: preserve cursor position when hiding thread buffer (#1422) (2 weeks ago)
        295252d fix(pickers.fzf.search): accommodate new fzf_live (#1420) (2 weeks ago)
        e1ec5cc fix(pr): enter pr checks window on open (#1419) (3 weeks ago)

    ○ schemastore.nvim
        6365190 Update SchemaStore catalog (19 hours ago)
Second update now that AstroNvim plugins updated
  Updated (6)
    ○ friendly-snippets  LuaSnip
        6cd7280 Revert "Merge pull request #512 from xudyang1/ci/pass-glob-to-prettier" (13 days ago)
        bde8ad4 Merge pull request #512 from xudyang1/ci/pass-glob-to-prettier (13 days ago)
        9c6afe4 ci: pass globs to prettier rather than the shell (1 year, 3 months ago)

    ● mason-tool-installer.nvim 1.02ms  Lazy load
        443f1ef Merge pull request #85 from zachbugay/main (2 weeks ago)
        0dd96da remove changes to .luarc.json (2 weeks ago)
        9ff030b Use Mason Package Install Options (3 weeks ago)

    ● neoconf.nvim 3.25ms  nvim-lspconfig
        bbe36f4 chore(build): auto-generate vimdoc, schemas and annotations (13 days ago)
        58f1567 chore(build): auto-generate vimdoc, schemas and annotations (2 weeks ago)
        91cae15 chore(build): auto-generate vimdoc, schemas and annotations (2 weeks ago)
        54bb266 chore(build): auto-generate vimdoc, schemas and annotations (3 weeks ago)
        3115c11 chore(build): auto-generate vimdoc, schemas and annotations (3 weeks ago)
        b432480 chore(build): auto-generate vimdoc, schemas and annotations (3 weeks ago)
        7568d2b chore(build): auto-generate vimdoc, schemas and annotations (3 weeks ago)
        f063e73 chore(build): auto-generate vimdoc, schemas and annotations (4 weeks ago)
        f2fd6a4 chore(build): auto-generate vimdoc, schemas and annotations (5 weeks ago)
        5b66419 chore(build): auto-generate vimdoc, schemas and annotations (5 weeks ago)

    ● none-ls.nvim 8.65ms  User AstroFile
        3c206df chore: Auto generate docs (3 weeks ago)
        e2cbdcb fix(builtins/diagnostics/vacuum): also check for `nil` (#317) (3 weeks ago)
        1fcf9cb [pre-commit.ci] pre-commit autoupdate (#316) (4 weeks ago)
        0b45795 chore: Auto generate docs (5 weeks ago)
        e701fa6 feat(diagnostics): gitleaks builtin (#315) (5 weeks ago)

    ○ nvim-dap  mason-nvim-dap.nvim
        085386b Flush logs eagerly (2 weeks ago)
        cdfd55a Extend docs for status() with statusline integration example (4 weeks ago)
        b4c65e7 Fallback step_into with askFortargets to regular step_into on empty targets (4 weeks ago)
        a151766 Change `executables` filter for pick_file to check file extension on windows (4 weeks ago)
        03e83f1 Allow stopped event with threadId that's missing in threads response (5 weeks ago)
        7bb46cc Fix payload for restart request per DAP spec (#1576) (5 weeks ago)

    ● nvim-ts-autotag 2.23ms  User AstroFile
        db15f2e Add 'only: issues' to stale bot config to disable it for PRs (2 weeks ago)
        578eef4 feat: add vento support (2 weeks ago)
        ed4ad67 feat: dot support (2 weeks ago)

Cyclingλ︎

I learned about modern headsets over the weekend, specifically the difference between spider caps and compression plugs.

I have a Bianchi 928 RC bicycle from 2006, which has a carbon frame, forks, stem and handlebards.

When swapping over the original stem (120mm) for a shorter stem (90mm) for a better bike fit, the compression plug slipped down into the fork preventing the stem cap from bolting in place.

The main body of the compression plug cam out quite quickly with a few taps of a rubber mallet. The bolt at the base of the plug had fallen much further down the fork and in a position that didnt come out. After leaving the fork inverted overnight, I managed to tap the bolt loose.

I took the opportunity to remove the fork and clean all the bearings. Applying copper grease to the bearings and fork, it was refitted to the headset.

The information for the compression plug states that it should be fitted with the fork and stem fitted. The assembly minimises the risk of splintering the head pipe of the fork.

the compression plug bolt should be tightened up to between 6-8 Newtons, using a torgue wrench. I tightened the plug bolt to 6 Newtons.

With the handle bars refitted to the stem, the stem bolts around the head of the fork were tightened to 5 N using a torque wrench.

Two rides this week were completed to test out the maintenance. All the work seems good, however, there does seem to be a creek from the left brake lever which may come from the cable that had a little oxidation where it comes out of the frame.

I had a mechanical on the Sunday ride. The tube went pop and was instantly flat. I think it was another sliver of flint, althogh when changing the tube I noticed the rim tape was damaged, with a partial hole over one of the spoke holes in the rim.

I used a part of the deflated tube (using my teeth to create a small section) to cover the hole in the rim tape. The new inner tube was inflated successfully, although the tyre did become softer when I was about 300 meters away from home. I walked the rest of the way.


Thank you.

🌐 Practical.li Website

Practical.li GitHub Org practicalli-johnny profile

@practicalli@clj.social @practical_li