diff --git a/feed_json_updated.json b/feed_json_updated.json index a01f1c5a..309415a9 100644 --- a/feed_json_updated.json +++ b/feed_json_updated.json @@ -1 +1 @@ -{"version": "https://jsonfeed.org/version/1", "title": "Practicalli Personal Journal", "home_page_url": "https://practical.li/journal/", "feed_url": "https://practical.li/journal/feed_json_updated.json", "description": "Daily journal of thoughts and experiences", "icon": "https://github.com/practicalli/graphic-design/blob/live/logos/practicalli-logo.png?raw=true", "authors": [{"name": "Practicalli"}], "language": "en", "items": [{"id": "https://practical.li/journal/learning-linux-like-its-1995/", "url": "https://practical.li/journal/learning-linux-like-its-1995/", "title": "Learning Linux like its 1995", "content_html": "<p>Using Arch Linux (for Hyprland experiments) takes me back to the mid 1990's when I was learning Linux from the ground up.</p>\n<p>At the end of 1994 I was installing Slackware Linux (from 82 floppy disks) and spending hours figuring out what to compile into the Linux kernel (before the days of dynamic loading). There was a huge amount to learn (usually without my own internet connection).</p>\n<p>Arch Linux wiki pages have a huge amount of information, showing all the possible options for every piece of software and service. This does present a dilemma of choice.</p>\n<p>Having experienced many years with Linux, I know many of the concepts and software associated with a Linux system. I dont need to read all the options, but do find myself scrolling a lot until I find something familiar (or simple).</p>\n<p>The goals for this month include</p>\n<ul>\n<li>documenting Neovim & Conjure workflow</li>\n<li>meaningful exercise every day (health permitting)</li>\n<li>bicycle ride (weather permitting)</li>\n<li>avoid Hyprland turning into a huge time sync (couch potato time only)</li>\n</ul>\n<p>My health took more of a knock this week as I am finding it very difficult to walk. I've had pain in my right hip for a couple of weeks and on Friday I started walking and felt a sharp pain. Every step with my right leg is painful and going up and down stairs is particularly painful.</p>\n<p>The hip pain coupled with my left knee pain significantly limiting my ability to exercise this week.</p>\n<p>Movies this week:</p>\n<ul>\n<li><a href=\"https://en.wikipedia.org/wiki/Death_on_the_Nile_(1978_film)\">Death on the Nile 1978</a> with Peter Ustinov as Hercule Poirot, including an all-star cast from the time including David Niven, Angela Landsbury and Betty Davis.</li>\n</ul>", "image": "https://practical.li/journal/assets/images/social/learning-linux-like-its-1995.png", "date_modified": "2025-01-19T22:54:42+00:00", "authors": [{"name": "Practicalli Johnny"}], "tags": ["clojure", "practicalli"]}, {"id": "https://practical.li/journal/a-freezing-start-to-a-new-year/", "url": "https://practical.li/journal/a-freezing-start-to-a-new-year/", "title": "A freezing start to a new year", "content_html": "<p>GitHub is currently <a href=\"https://github.com/actions/runner-images/issues/10636\">:fontawesome-brands-github: rolling out a change to make Ubuntu 24.04 the default image</a> when <a href=\"#github-ci-workflow\">running a workflow on <code>ubuntu-latest</code></a>. As some packages have been removed to save space, then its prudent to give the <a href=\"https://practical.li/engineering-playbook/continuous-integration/github/workflows/practicalli/\">:fontawesome-solid-book-open: Practicalli GitHub workflows</a>{target=_blank} a test on Ubuntu 24.04.</p>\n<p>Organising my <a href=\"#digital-music\">digital music</a> and audio books so they all fit nicely on my smart phone (using Opus audio format and VLC to play the music).</p>\n<p><a href=\"#arch-linux\">Arch Linux</a> recommends not using <code>pacman -Syu</code> to update all packages and today I experience why. I can no longer login to the desktop :facepalm: EDIT: this seems to be specific to the NWG-shell configuration, as the vanilla hyprland desktop does work.</p>\n<p>I assume this is a breaking change of hyprland that NWG-shell has not resolved. This is another reason to start again with hyprland and build my own config (although this will be a big time sink, so can wait).</p>\n<p>Its freezing temperatures outside in London, UK at the moment, so I am trying to get outside when the sun is still shining. The paths are slippy and so are the roads, so even if I felt up to cycling outside, then it could be quite tricky.</p>", "image": "https://practical.li/journal/assets/images/social/a-freezing-start-to-a-new-year.png", "date_modified": "2025-01-12T21:29:51+00:00", "authors": [{"name": "Practicalli Johnny"}], "tags": ["archlinux", "audacity", "opus", "practicalli"]}, {"id": "https://practical.li/journal/a-new-dawn-a-new-day-its-a-new-life/", "url": "https://practical.li/journal/a-new-dawn-a-new-day-its-a-new-life/", "title": "A new dawn a new day its a new life", "content_html": "<p>As we come to the end of 2025 I continue to contemplate what is next?</p>\n<p>Do I want to continue in the software engineering industry with its many systemic faults?</p>\n<p>Or should I branch out and do something completely different?</p>\n<p><a href=\"https://80000hours.org/\">80,000 hours</a> is a guide to careers that have a positive impact on the world.</p>\n<p>My searching for a new home are currently focusing on the East coast of Scotland (which is dryer than London at the moment). Aberdeen (the granite city) has good support for cycling and a few cycle clubs in the area.</p>\n<p>Wired up my Playstation 4 and VR headset to start playing games again. During more severe covid symptoms I couldnt wear the VR headset as it put too much pressure on my head. From an hour of play today, the VR headset felt okay.</p>\n<p>I had a few quick games of Stardust and one surprisingly successful game of <a href=\"https://youtube.com/playlist?list=PLy9I_IfUBzKJgBTlbzRB0k4i1ARDVPSgy&si=Fq2TPODPdD1YQ6cI\">Polybius</a>.</p>", "image": "https://practical.li/journal/assets/images/social/a-new-dawn-a-new-day-its-a-new-life.png", "date_modified": "2025-01-03T00:00:58+00:00", "authors": [{"name": "Practicalli Johnny"}], "tags": ["neovim", "practicalli"]}, {"id": "https://practical.li/journal/holiday-stuffing/", "url": "https://practical.li/journal/holiday-stuffing/", "title": "Holiday stuffing", "content_html": "<p>Feeling a little sick so binging on movies and shows on Apple TV+. On Monday afternoon Apple TV+ would not stream content (the play button disappeared) although I could browse the catalogue of shows. After several hours the play button came back, although contacting Apple support was quite pointless.</p>\n<p><img alt=\"Mooless Moo Plant bases stake and ale pie\" src=\"https://optimise2.assets-servd.host/political-lechwe/production/Mooless-info.jpg?w=1600&h=904&q=82&fm=webp&fit=crop&dm=1681290833&s=8fc234ed1acd070f99e0a7b3ef95079c\">{align=right loading=lazy style=\"width:360px\"}</p>\n<p>A relaxing week trying out some new vegetarian and vegan meals. <a href=\"https://shop.pieminister.co.uk/products/mooless-moo/\">Pieminister Mooless Moo pie</a> is a plant based stake and ale pie, using jackfruit for the stake pieces. The pastry was lovely and crispy and the pie was very filling. The only downside to the pie for me was it was the taste and texture was too much like beef and I've never really liked that even when I did eat meat.</p>\n<p>New potatoes, Edamame, Spinach and Garden Peas complement the pie, along with some very thick <a href=\"https://www.bisto.co.uk/products/bisto-best-vegetable-gravy-granules-230g/\">Bisto Best Vegetable Gravy</a> (I add way too many granules to make the gravy nice and thick).</p>", "image": "https://practical.li/journal/assets/images/social/holiday-stuffing.png", "date_modified": "2024-12-29T18:31:27+00:00", "authors": [{"name": "Practicalli Johnny"}], "tags": ["emacs", "neovim", "practicalli"]}, {"id": "https://practical.li/journal/finding-my-joy/", "url": "https://practical.li/journal/finding-my-joy/", "title": "Finding My Joy", "content_html": "<p>In season 2, episode 2 of \"The Big Door Prize\" they talk about \"Finding your Joy\". This seems like an inspiring new years resolution, or at least a theme I should focus on for 2025.</p>\n<p>You only live one life and you should take time out to enjoy it. There were many aspects to 2024 that constrained my joy, so I will endeavour to may 2025 a most joyous year.</p>\n<p>Practicalli Updates:</p>\n<ul>\n<li><a href=\"https://practical.li/clojure/data-inspector/\">Clojure Data Inspector tools - overview and portal page updated</a></li>\n</ul>", "image": "https://practical.li/journal/assets/images/social/finding-my-joy.png", "date_modified": "2024-12-22T18:42:20+00:00", "authors": [{"name": "Practicalli Johnny"}], "tags": ["clojure", "practicalli"]}, {"id": "https://practical.li/journal/what-is-past-is-prologue/", "url": "https://practical.li/journal/what-is-past-is-prologue/", "title": "What is past is prologue", "content_html": "<p>!!! QUOTE\n If a technology was truly dead, no one would feel the need to talk about it on the internet</p>\n<h2>Dead is mainstream</h2>\n<p>When people state that some technology or practice is dead via the internet, it typically means that thing is the mainstream.</p>\n<p>If something was truely dead, no one would feel the need to talk about it as that topic would not relate to anyone.</p>\n<p>This technique is essentially click-bate and trying to persuade you to 'buy-in' to something else (usually for the profit of aother person)</p>", "image": "https://practical.li/journal/assets/images/social/what-is-past-is-prologue.png", "date_modified": "2024-12-15T13:23:01+00:00", "authors": [{"name": "Practicalli Johnny"}], "tags": ["appimage", "debian", "hyprland", "leadership", "practicalli"]}, {"id": "https://practical.li/journal/long-cold-winter/", "url": "https://practical.li/journal/long-cold-winter/", "title": "Long Cold Winter", "content_html": "<p><a href=\"#converting-audio-with-ffmpeg\">Converted some audio files to Opus codec</a>, which provides a really optimum compression and allows for relatively low bit rates and results in much smaller files with the same quality.</p>\n<p>Neovim upcoming changes</p>\n<ul>\n<li>neovim 0.11 has some breaking changes, so assume early in 2025</li>\n<li>astronvim v5 once neovim 0.11 released</li>\n<li><a href=\"https://github.com/WhoIsSethDaniel/mason-tool-installer.nvim\">:fontawesome-brands-github: mason-tool-installer.nvim</a> to simplify mason config in astronvim v5 - discussed in Atronvim Discord community. maston-tool-installer still <a href=\"https://github.com/WhoIsSethDaniel/mason-tool-installer.nvim/blob/main/lua/mason-tool-installer/init.lua\">:fontawesome-brands-github: uses the mason registry</a> for tool versions.</li>\n</ul>\n<p>Starting to <a href=\"#notes-for-updating-my-cv\">update my CV from recent commercial experiences</a>, focusing on the areas of product, delivery and people.</p>", "image": "https://practical.li/journal/assets/images/social/long-cold-winter.png", "date_modified": "2024-12-11T11:22:17+00:00", "authors": [{"name": "Practicalli Johnny"}], "tags": ["codec", "mason", "neovim", "opus", "practicalli"]}, {"id": "https://practical.li/journal/making-use-of-black-friday/", "url": "https://practical.li/journal/making-use-of-black-friday/", "title": "Making use of Black Friday", "content_html": "<p>Black Friday as a concept is confusing as it no longer has anything to do with a specific Friday and currently seems to cover at least 2 weeks of promotions. I did get some good prices even before Black Friday actually started.</p>\n<p><a href=\"#nas\">Adventures with SSD and NAS Versions</a> kept me busy over the weekend, resurrecting an older NAS unit with Solid State Drives for a very quiet media storage device.</p>", "image": "https://practical.li/journal/assets/images/social/making-use-of-black-friday.png", "date_modified": "2024-12-01T18:18:38+00:00", "authors": [{"name": "Practicalli Johnny"}], "tags": ["hardware", "network-attached-storage", "network-file-system", "solid-state-drive", "thecus"]}, {"id": "https://practical.li/journal/linux-wayland-compositor--hyprland/", "url": "https://practical.li/journal/linux-wayland-compositor--hyprland/", "title": "Linux Wayland Compositor & Hyprland", "content_html": "<p>A friend recommended <a href=\"https://hyprland.org/\">Hyprland window manager</a> which is similar to i3 window manager I currently used, but more optomised for the Wayland compositor.</p>\n<p>Practicalli currently uses Regolith Desktop, a complete Linux desktop that leverages Gnome and i3 tiling window manager.</p>\n<p>Regolith Desktop provides quite a rich experience using the <code>regolith-desktop</code> Debian package. I have not had much success with Regolith when running with Wayland (specifically Sway).</p>\n<p>Sway compositor is an implementation of wayland for i3 window manager. Some of my applications do not see to play nice with Sway (e.g. chromium browser scrolling, simplescreenrecorder cannot run on wayland).</p>\n<p>OBS did seem to work okay on wayland, given a sufficiently recent version.</p>\n<p>A friend recommended Hyprland, a tiling compositor that provides the latest Wayland features and lots of eye candy. Its pretty easy to setup on Debian, although there is much additional setup before it would be comparable to Regolith Desktop.</p>\n<p>Neovim Grug plugin is being considered as an alternative to the Spectre tool for search and replacing across a project.</p>", "image": "https://practical.li/journal/assets/images/social/linux-wayland-compositor--hyprland.png", "date_modified": "2024-11-22T22:52:13+00:00", "authors": [{"name": "Practicalli Johnny"}], "tags": ["debian", "hyprland", "linux", "neovim", "practicalli", "slack"]}, {"id": "https://practical.li/journal/practicalli-plans-for-the-rest-of-the-year/", "url": "https://practical.li/journal/practicalli-plans-for-the-rest-of-the-year/", "title": "Practicalli plans for the rest of the year", "content_html": "<p>Starting to <a href=\"#practicalli-plans\">plan work for the Practicalli content</a> for the next 3 months.</p>\n<p>On the Practicalli GitHub Org, <a href=\"#optimise-github-org-log-retention\">action log retention time was minimised</a> to a week (from 90 days) as I don't need to wade through that history and it will save a bit of storage in the Cloud. I am surprised GitHub have such a high default for their free plans.</p>\n<p>Upgraded to a <a href=\"#new-monitor\">Dell 40 inch 5k2k monitor</a> for work and it makes a huge difference. Its a beautiful monitor and it works really well with Linux and the tiling window of Regolith Desktop (i3).</p>\n<p>I am continuing my search for a new place to live, even further into the countryside with easy access to hiking and cycling activities.</p>\n<p>Although I am always thankful for an opportunity to work with a commercial company, I do feel the weight lifted from my shoulders now that relationship has concluded. Within hours I started to feel the return of much of the energy I have been lacking for the last few months.</p>\n<p>They do say a change is as good as a rest, so investing time in Practicalli content is giving me an energy boost.</p>\n<p><img alt=\"Freedom quote\" src=\"https://cdn4.geckoandfly.com/wp-content/uploads/2016/07/freedom-quotes-10.jpg\">{loading=lazy}</p>", "image": "https://practical.li/journal/assets/images/social/practicalli-plans-for-the-rest-of-the-year.png", "date_modified": "2024-11-22T13:36:03+00:00", "authors": [{"name": "Practicalli Johnny"}], "tags": ["github", "hardware", "practicalli", "practicalli"]}, {"id": "https://practical.li/journal/the-wonderful-complexity-of-people/", "url": "https://practical.li/journal/the-wonderful-complexity-of-people/", "title": "The wonderful complexity of people", "content_html": "<p>!!! QUOTE \"A Tail of Two Cities - Charles Dickens\"\n It was the best of times, it was the worst of times.</p>\n<p>!!! QUOTE \"Johnny Stevenson (maybe others)\"\n People are wonderfully complex experiences</p>\n<p>My feelings of disappointed with my current commercial role are returning to the forefront of my mind. Many aspects of the role and company seem to be clear in peoples minds but not always effectively shared. I think I understand the role and then something else happens that makes me feel I don't. I believe something will need to change soon for the benefit of all.</p>\n<p>There have been a few highlights with the role, but I expected more of myself and the company. I do set high expectations for myself, although have learned to be more kind about what I can realistically achieve and 'which battles to fight' (figuratively speaking of course).</p>\n<p>During this engagement I have continually reset my expectations about what could be achieved and what I could realistically achieve. There are a couple of peers where there has been conflict without understanding of why I am seen as the cause. I have tried to explore but if people do have issues with me its not clearly being communicated to me.</p>\n<p>In hindsight, many opportunities to get support from my manger and peers were missed. Mostly as we had so many challenges to discuss and partly due to pressures of delivery.</p>\n<p>When a person doesn't have clarity around a problem then there is very little they can do to resolve or adapt.</p>\n<p>A self-reflection review is in progress and its is a good opportunity to take my own time to reflect on my current role and if its still the right fit for me.</p>", "image": "https://practical.li/journal/assets/images/social/the-wonderful-complexity-of-people.png", "date_modified": "2024-11-21T17:03:42+00:00", "authors": [{"name": "Practicalli Johnny"}], "tags": ["leadership", "practicalli"]}, {"id": "https://practical.li/journal/the-king-is-probably-dead-long-live-the-king/", "url": "https://practical.li/journal/the-king-is-probably-dead-long-live-the-king/", "title": "The king is probably dead long live the king", "content_html": "<p>!!! QUOTE\n You are only a leader if people are willing to follow</p>\n<p>It has been hard to shake the concern that my current commercial role has not worked out, probably not really been working for quite a while in hindsight. Was it ever really working?</p>\n<p>Some aspects have greatly improved but there are some fundamental communication constraints that I really didn't understand the cause of (plenty of assumptions, but not enough communication or time to really address these challenges).</p>\n<p>There are the common systemic challenges that come from working at any startup that is working hard to establish itself as a long term sustainable business. This was a given. A new person coming into this environment that has been running for many years leaves a lot of context unknown and typically unspoken.</p>\n<p>I continued to try identify the causes throughout the week and trying to evaluate if there is any appetite and opportunity to address these within our typical schedule. It did feel that the more I tried to connect the quicker the feeling of connection slipped away.</p>\n<p>I believe my frustration and disappointment have been leaking out over the last month, which I am disappointed about as well.</p>\n<p>It is always a challenge for an engineering manager to identify where they can add value. For much of the current role I never seemed to connect with the team at a deep enough level. It is too easy to feel I am simply not needed by the team as the communication has been very limited. In once exceptional case, it was easy to feel my presence was simply not wanted.</p>\n<p>Tuesday I was really exhausted, partly because of the continued cough but also the concerns that I still wasn't able to break through to the team (especially if they feel unsafe to ask questions). I am not sleeping well and need to find energy to exercise more.</p>\n<p>Wednesday I made time for self-reflection as part of the company feedback initiative. I did struggle to quantify to myself what I had done. In hindsight I should have spend more time on this and consulted my journal, although I still feel I would come up short of my own lofty goals for the role.</p>\n<p>Friday was the end of my commercial current role.</p>\n<blockquote>\n<p>The title of this article is from the first episode of the first series of the Black Adder TV show. There were quite a few Shakepearean quotes used for comic effect.</p>\n</blockquote>", "image": "https://practical.li/journal/assets/images/social/the-king-is-probably-dead-long-live-the-king.png", "date_modified": "2024-11-21T17:03:42+00:00", "authors": [{"name": "Practicalli Johnny"}], "tags": ["leadership", "practicalli"]}, {"id": "https://practical.li/journal/debian-linux-migration/", "url": "https://practical.li/journal/debian-linux-migration/", "title": "Debian Linux migration", "content_html": "<p>Enjoying Debian Linux and freedom from Snaps</p>", "image": "https://practical.li/journal/assets/images/social/debian-linux-migration.png", "date_modified": "2024-11-17T11:16:06+00:00", "authors": [{"name": "Practicalli Johnny"}], "tags": ["practicalli"]}, {"id": "https://practical.li/journal/holiday-in-paramout-plus/", "url": "https://practical.li/journal/holiday-in-paramout-plus/", "title": "Holiday in Paramout Plus", "content_html": "<p>After being ill for most of the week I am finally starting to enjoying my second week of holiday, binging on some Paramount+ and having a lazy Sunday enjoying the extra hour in bed after the end of summer time.</p>\n<p>Updating Practicalli Journal and Clojure CLI Config repositories, fixing links and markdown issues from the Megalinter reports.</p>\n<p>Updating to Megalinter 0.8.1 GitHub action on Practicalli repositories as I work on them. The upgrade will include each repository in the Grafana dashboards for Practicalli projects.</p>\n<p>Issues</p>\n<ul>\n<li><strong>DOING</strong> <a href=\"https://github.com/practicalli/clojure-cli-config/issues/87\">security: add clj-watson to clojure cli config</a></li>\n<li><strong>DOING</strong> zsh environment varaibles not loading into jvm</li>\n</ul>", "image": "https://practical.li/journal/assets/images/social/holiday-in-paramout-plus.png", "date_modified": "2024-11-17T11:16:06+00:00", "authors": [{"name": "Practicalli Johnny"}], "tags": ["clojure", "practicalli"]}, {"id": "https://practical.li/journal/practicalli-project-spring-2023/", "url": "https://practical.li/journal/practicalli-project-spring-2023/", "title": "Practicalli Project Spring 2023", "content_html": "<p><img alt=\"Clojurists Together Logo\" src=\"https://raw.githubusercontent.com/practicalli/graphic-design/live/buttons/practicalli-clojurists-together-button.svg\">{align=right loading=lazy style=\"height:150px;width:150px\"}</p>\n<p>Due to covid illness during 2022 the planned work has been spread over late 2022 - early 2023.</p>", "image": "https://practical.li/journal/assets/images/social/practicalli-project-spring-2023.png", "date_modified": "2024-11-17T11:16:06+00:00", "authors": [{"name": "Practicalli Johnny"}], "tags": ["clojurists-together"]}, {"id": "https://practical.li/journal/back-to-work/", "url": "https://practical.li/journal/back-to-work/", "title": "Back to work", "content_html": "<p>Busy week at work getting ready for a new team member. I spent Friday afternoon building up a relationship and getting accustom to spending time working together. Several weeks of work had been done to get ready for the new starter.</p>\n<p>One of the interesting challenges for anyone starting a new job is to ensure too much enthusiasm doesnt lead to missing important steps. It will be a good first check-in with the new starter to see if they have been too enthusiastic or taken a more measured approach.</p>\n<p>Current issues</p>\n<ul>\n<li><strong>DONE</strong> <a href=\"https://github.com/practicalli/clojure-cli-config/issues/87\">security: add clj-watson to clojure cli config</a></li>\n</ul>", "image": "https://practical.li/journal/assets/images/social/back-to-work.png", "date_modified": "2024-11-05T19:37:11+00:00", "authors": [{"name": "Practicalli Johnny"}], "tags": ["clojure", "practicalli"]}, {"id": "https://practical.li/journal/practicalli-work-over-the-winter-break/", "url": "https://practical.li/journal/practicalli-work-over-the-winter-break/", "title": "Practicalli work over the winter break", "content_html": "<p>The company I work for takes a break over the winter, so I have some time to spend on Practicalli content.</p>", "image": "https://practical.li/journal/assets/images/social/practicalli-work-over-the-winter-break.png", "date_modified": "2024-10-22T15:22:01+00:00", "authors": [{"name": "Practicalli Johnny"}], "tags": ["practicalli"]}, {"id": "https://practical.li/journal/onboarding-to-a-new-role-hacking-clojure--neovim/", "url": "https://practical.li/journal/onboarding-to-a-new-role-hacking-clojure--neovim/", "title": "Onboarding to a new role, hacking Clojure & Neovim", "content_html": "<p>Nervous excitement about starting a new role and hopeful I dont mess it up.</p>\n<p>Enjoying writing a regular practicalli again, which is something I missed when not working.</p>", "image": "https://practical.li/journal/assets/images/social/onboarding-to-a-new-role-hacking-clojure--neovim.png", "date_modified": "2024-10-22T15:22:01+00:00", "authors": [{"name": "Practicalli Johnny"}], "tags": ["practicalli"]}, {"id": "https://practical.li/journal/discussing-new-role-expectations/", "url": "https://practical.li/journal/discussing-new-role-expectations/", "title": "Discussing new role expectations", "content_html": "<p>Learning a little more about the responsibilities and expectations of the new role, which seems very much as expected.</p>", "image": "https://practical.li/journal/assets/images/social/discussing-new-role-expectations.png", "date_modified": "2024-10-22T15:22:01+00:00", "authors": [{"name": "Practicalli Johnny"}], "tags": ["practicalli"]}, {"id": "https://practical.li/journal/health-and-new-chair/", "url": "https://practical.li/journal/health-and-new-chair/", "title": "Health and new chair", "content_html": "<p>The BeYou chair is being delivered today, will it live up to my expectations?</p>", "image": "https://practical.li/journal/assets/images/social/health-and-new-chair.png", "date_modified": "2024-10-22T15:22:01+00:00", "authors": [{"name": "Practicalli Johnny"}], "tags": ["practicalli"]}, {"id": "https://practical.li/journal/its-april-fool/", "url": "https://practical.li/journal/its-april-fool/", "title": "Its April Fool", "content_html": "<p>Adding SSH keys to the YubiKey hardware security key provides convenience of SSH key use, especially when required for multiple computers.</p>\n<p>Using a YubiKey to keep a single SSH key pair removes the need to generate a key pair for each computer.</p>\n<p>Using one SSH key avoids the need for multiple entries in the allowed-signatures file to check locally that a commit has been signed.</p>", "image": "https://practical.li/journal/assets/images/social/its-april-fool.png", "date_modified": "2024-10-22T15:22:01+00:00", "authors": [{"name": "Practicalli Johnny"}], "tags": ["astronvim", "git", "neovim", "practicalli"]}, {"id": "https://practical.li/journal/warmer-weather/", "url": "https://practical.li/journal/warmer-weather/", "title": "Warmer weather", "content_html": "<p>Practicalli AstroNvim User Config changed to be as additive as possible, leaving the template as unchanged as possible.</p>\n<p>The sunnier weather is a boots to motivation, although its still very windy. At least I can get into the garden without sinking.</p>\n<p>Another Saturday morning ride, a tough experience although not completely exhausted afterward.</p>", "image": "https://practical.li/journal/assets/images/social/warmer-weather.png", "date_modified": "2024-10-22T15:22:01+00:00", "authors": [{"name": "Practicalli Johnny"}], "tags": ["astronvim", "clojure", "neovim", "practicalli"]}, {"id": "https://practical.li/journal/flexiana-interview/", "url": "https://practical.li/journal/flexiana-interview/", "title": "Flexiana Interview", "content_html": "<p>I enjoyed the interview with Flexiana team this week, they are very friendly and it we had some very interesting discussions. I included my interview preparation notes which were mosty the same as shared in the video.</p>\n<p>A blip with Emacs 29.4 release stopped the which-key menu from showing when in a major mode. This affected both the leader and local leader key. Within a couple of hours the issue was resolved before I really figured out the cause. I installed Emacs 29.4 on Termux to replicate an issue that was reported in the #spacemacs channel of the Clojurians Community slack community.</p>", "image": "https://practical.li/journal/assets/images/social/flexiana-interview.png", "date_modified": "2024-10-22T15:22:01+00:00", "authors": [{"name": "Practicalli Johnny"}], "tags": ["clojure", "practicalli"]}, {"id": "https://practical.li/journal/fixing-neovim-treesitter-breaking-changes/", "url": "https://practical.li/journal/fixing-neovim-treesitter-breaking-changes/", "title": "Fixing Neovim Treesitter breaking changes", "content_html": "<p>The sun is out, the sky is blue... and I had the opportunity to understand some Neovim plugins a little more, in order to fix a breaking change with Neovim Treesitter support for Clojure.</p>\n<p>!!! INFO \"Pull Requests this week\"</p>\n<pre><code>- MERGED: [#7 queries: clojure has-type? updated to kind-eq?](https://github.com/PaterJason/nvim-treesitter-sexp/pull/7) for nvim-treesitter-sexp project\n</code></pre>", "image": "https://practical.li/journal/assets/images/social/fixing-neovim-treesitter-breaking-changes.png", "date_modified": "2024-10-22T15:22:01+00:00", "authors": [{"name": "Practicalli Johnny"}], "tags": ["astronvim", "github", "neovim", "practicalli", "ssh"]}, {"id": "https://practical.li/journal/neovim-on-termux-enhancements/", "url": "https://practical.li/journal/neovim-on-termux-enhancements/", "title": "Neovim on Termux enhancements", "content_html": "<p>More Neovim updates and getting closer to a release of Practicalli Astro-config</p>\n<p>I have been using Neovim (and Emacs) on Termux, so I can code on my Android tablet or Android smart phone. I typically use an external keyboard (e.g. Keyboard.io Atreus or Model100), especially when considerable typing is involved.</p>\n<p>As the hardware and compilation tooling is different for Android Linux (compared to amd64 linux) the Clojure and Lua LSP language servers would not install via the Mason manager. As these two languages are in the top 3 languages I use, then it is a great boost to get these servers working locally and configuring Neovim to use them instead.</p>\n<p>I use the <code>date</code> command when I had a need to tweak the time on my Linux computer, saves launching the <strong>Settings</strong> app and using the mouse.</p>\n<p>!!! INFO \"Timezones made easy\"\n <a href=\"https://time.is/\">time.is</a> makes figuring out timezones really simple. See the current time in any timezone across the world.</p>\n<pre><code>time.is very useful for events where people attend from different timezones. Set the local time and share a link for others who will see the event time in their own timezone.\n</code></pre>\n<h2>Neovim</h2>\n<p>I'm making some changes to the Practicalli AstroNvim configuration (AstroNvim4) over the next few days.</p>\n<p>All my personal Neovim & plugin options (and associated workflow biases) will only be in <code>lua/plugins/practicalli.lua</code>. With these options only in one file, anyone else using the configuration can easily disable them.</p>\n<p>I will encourage other users to create there own <code>lua/plugins/personal.lua</code> customisation so any changes from upstream will be easier to merge.</p>\n<p>The GitHub repository will be renamed to <code>practicalli/astro-config</code> which its much easier to write and say during screencasts. GitHub should redirect when pulling updates</p>\n<p>This week I will update Practicalli Neovim book install guide with new repo and further info on how to use the config effectively (especially with your own customisations)</p>\n<p>Then the first official release of the config will be created via GitHub releases.</p>\n<p>If I have time, there are lots of things to add to Practicalli Neovim book too (including a few more plugins I'm using in the config)</p>", "image": "https://practical.li/journal/assets/images/social/neovim-on-termux-enhancements.png", "date_modified": "2024-10-22T15:22:01+00:00", "authors": [{"name": "Practicalli Johnny"}], "tags": ["neovim", "practicalli"]}, {"id": "https://practical.li/journal/springing-back-into-life-slowly/", "url": "https://practical.li/journal/springing-back-into-life-slowly/", "title": "Springing back into life slowly", "content_html": "<p>The last month has been tough due to illness, although still managed to do a little work with Practicalli to keep me motivated (both for work and my own personal health)</p>\n<p>I though the Practicalli Project Templates had broken when I tried to create a new service project. It took me an hour or so to realise I had simply been using the command with the wrong argument, doh!</p>", "image": "https://practical.li/journal/assets/images/social/springing-back-into-life-slowly.png", "date_modified": "2024-10-22T15:22:01+00:00", "authors": [{"name": "Practicalli Johnny"}], "tags": ["clojure", "practicalli"]}, {"id": "https://practical.li/journal/having-a-donut-party-with-system-components/", "url": "https://practical.li/journal/having-a-donut-party-with-system-components/", "title": "Having a Donut Party with system components", "content_html": "<p>Not quite back to full health yet, so took it easy at the weekend.</p>\n<p>More work on restoring spare bicycles so I can sell them or otherwise find a good home.</p>\n<p>Continued the refactor of the Practicalli Service template, specifically refining the design of the system config and helper functions to support a development REPL workflow.</p>", "image": "https://practical.li/journal/assets/images/social/having-a-donut-party-with-system-components.png", "date_modified": "2024-10-22T15:22:01+00:00", "authors": [{"name": "Practicalli Johnny"}], "tags": ["clojure", "donut", "practicalli", "repl-workflow"]}, {"id": "https://practical.li/journal/git-multiple-ssh-keys--neovim/", "url": "https://practical.li/journal/git-multiple-ssh-keys--neovim/", "title": "Git Multiple SSH Keys & Neovim", "content_html": "<p>A short week at work made even shorter by a company day to celebrate going live. A chance to unwind and reflect.</p>\n<p><a href=\"https://github.com/neovim/neovim/milestones\">Neovim 0.10 is planned for 1 May 2024</a>. Plugins should be unafected, although actively developing plugins like Neogit are trying to used parts of the Neovim API. The parts of Neogit that use 0.10 api should be more efficient, although I assume there wont be a noticable difference in functionality.</p>\n<p>I will update Neovim to 0.10 when AstroNvim confirms it is working well with that release.</p>", "image": "https://practical.li/journal/assets/images/social/git-multiple-ssh-keys--neovim.png", "date_modified": "2024-10-22T15:22:01+00:00", "authors": [{"name": "Practicalli Johnny"}], "tags": ["clojure", "git", "neovim", "practicalli"]}, {"id": "https://practical.li/journal/company-offsite-week/", "url": "https://practical.li/journal/company-offsite-week/", "title": "Company offsite week", "content_html": "<p>Travelled for a work event in Portugal with a chance to meet people I work with face to face for the first time. It was a very enjoyable and also quite intensive event. I kept myself busy to help combat fatigue from travelling and manage a swim each morning and evening whilst I was at the hotel.</p>\n<p>I am accustom to working remotely since 2010, having worked for companies based outside of the UK. It is always very valuable to meet people face to face and can start or strengthen a relationship.</p>", "image": "https://practical.li/journal/assets/images/social/company-offsite-week.png", "date_modified": "2024-10-22T15:22:01+00:00", "authors": [{"name": "Practicalli Johnny"}], "tags": ["astronvim", "neovim", "practicalli"]}, {"id": "https://practical.li/journal/refactor-astronvim-clojure-pack/", "url": "https://practical.li/journal/refactor-astronvim-clojure-pack/", "title": "Refactor AstroNvim Clojure pack", "content_html": "<p>Pull requests this week</p>\n<ul>\n<li>:fontawesome-solid-code-pull-request: <strong>MERGED</strong> <a href=\"https://github.com/folke/ts-comments.nvim/pull/19\">Add Clojure comment patterns to ts-comments.nvim</a></li>\n<li>:fontawesome-solid-code-pull-request: <strong>MERGED</strong> <a href=\"https://github.com/AstroNvim/astrocommunity/pull/982\">Modularise Astrocommunity Clojure pack</a></li>\n<li>:fontawesome-solid-code-pull-request: <strong>MERGED</strong> <a href=\"https://github.com/AstroNvim/astrocommunity/pull/991\">Update AstroNvim Cloure pack description & simplify examples</a></li>\n<li>:fontawesome-solid-code-pull-request: <strong>MERGED</strong> <a href=\"https://github.com/AstroNvim/astrocommunity/pull/992\">Fix vim-visual-multi dependency name</a></li>\n</ul>\n<p>Total commits this week: 37</p>\n<p>Submitted <a href=\"https://github.com/AstroNvim/astrocommunity/pull/982\">a pull request to refactor the AstroNvim Community Clojure language pack</a> which I <a href=\"https://github.com/AstroNvim/astrocommunity/pull/248\">contributed in June 2023</a>.</p>\n<ul>\n<li>add nvim-treesitter-sexp plugin</li>\n<li>add example of disabling / configuring parinfer plugin</li>\n<li>add ts-comment.nvim to support <code>;;</code> and <code>;</code> comment characters</li>\n<li>remove autocmd from conjure plugin (no longer needed)</li>\n<li>remove most of the opinionated conjure configuration overrides, although still hiding the repl log buffer (HUD) by default as its nicer as a separate tab. Maybe if I can have it open by default as a tab, then I could live with having the HUD open on REPL startup (a nice way to check things are working)</li>\n</ul>\n<p>Still sleepy from travel to the company off-site last week and the cycle ride on Saturday. Although I did manage some work in the garden on Sunday.</p>", "image": "https://practical.li/journal/assets/images/social/refactor-astronvim-clojure-pack.png", "date_modified": "2024-10-22T15:22:01+00:00", "authors": [{"name": "Practicalli Johnny"}], "tags": ["neovim", "practicalli"]}, {"id": "https://practical.li/journal/practicalli-content-planning/", "url": "https://practical.li/journal/practicalli-content-planning/", "title": "Practicalli content planning", "content_html": "<p>Hyprland promises to be a great experience but also a potential time drain, so will save most of the investigation and further configuration until the winter break (or if I need a little distraction of the new shiny for motivation).</p>\n<p>Taking two weeks off from work and have some time to work on Practicalli content.</p>", "image": "https://practical.li/journal/assets/images/social/practicalli-content-planning.png", "date_modified": "2024-10-22T15:22:01+00:00", "authors": [{"name": "Practicalli Johnny"}], "tags": ["clojure", "megalinter", "neovim", "practicalli"]}, {"id": "https://practical.li/journal/hacking-on-practicalli-content/", "url": "https://practical.li/journal/hacking-on-practicalli-content/", "title": "Hacking on Practicalli content", "content_html": "<p>I am enjoying my 2 week at home vacation (stay-cation) and have already completely rewired my desk, laptops, Monitors and NAS storage devices on the electronic standing desk. It feels a lot more organised and easier to find everything as everything has its place.</p>\n<p>Now I can focus on getting lots of <a href=\"#practicalli\">Practicalli content done</a> (as well as catch up with shows on Paramount+ and maybe a little Polybus on the Playstation4 VR headset)</p>\n<p>I am interested in switching to the Hyprland, although its changing fast so I dug out an older laptop and installed Arch Linux with Hyprland using the <code>archinstall</code> tool. Unfortunately the laptop I used doesnt seem to support Hyprland or something is missing from the install.</p>\n<p>I am taking a stay-cation as I am still recovering from Covid and the weather is also quite grim. I am getting out for walks each day and on Friday I completed a short cycle ride as it was nice and sunny outside. Unfortunately my chest started feeling like it was on fire a few minutes into the ride, so I slowed down and limited myself to 10km.</p>\n<p>I was feeling really sleepy after the ride, so I kept myself awake by sorting through the cardboard boxes in my attic. Many boxes made the ultimate sacrifice (for an uncluttered house) and went to the recycling service.</p>", "image": "https://practical.li/journal/assets/images/social/hacking-on-practicalli-content.png", "date_modified": "2024-10-22T15:22:01+00:00", "authors": [{"name": "Practicalli Johnny"}], "tags": ["neovim", "practicalli", "practicalli"]}, {"id": "https://practical.li/journal/megalinter-8-and-monthly-version-updates/", "url": "https://practical.li/journal/megalinter-8-and-monthly-version-updates/", "title": "Megalinter 8 and monthly version updates", "content_html": "<p>Megalinter updates to version 8 using the megalinter runner tool, adding a Makefile task to simplify the command line (so I dont have to remember the command).</p>\n<p>Material for MkDocs provides a nice diff view using the <code>diff</code> language for a code block. Add or copy a diff into the code block, ensuring the <code>-</code> and <code>+</code> signs are included and the diff is automatically highlighted. See the <a href=\"#megalinter\">Megalinter</a> section of this post for an example.</p>\n<p>Feeling quite low the last few weeks, mostly due to continued Covid symptoms, low blood oxygen and lack of energy. Waking up I feel like I have experienced carbon dioxide poisoning (which I have experienced working on a mushroom farm). I am disorientated, dizzy and feel quite terrible.</p>", "image": "https://practical.li/journal/assets/images/social/megalinter-8-and-monthly-version-updates.png", "date_modified": "2024-10-22T15:22:01+00:00", "authors": [{"name": "Practicalli Johnny"}], "tags": ["clojure", "practicalli"]}, {"id": "https://practical.li/journal/megalinter-grafana-dashboards/", "url": "https://practical.li/journal/megalinter-grafana-dashboards/", "title": "MegaLinter Grafana Dashboards", "content_html": "<p>As Practicalli projects are being updated to Megalinter version 8 it seemed a good time to try the Megalinter API reporter to publish data to use with Grafana. A chance to learn more about creating Dashboards and if Grafana is any easier than DataDog.</p>\n<p>!!! WARNING \"Megalinter not publishing logs on Grafana yet\"\n Unfortunately I havent been able to make the Megalinter API Reporter work with this journal project, Clojure CLI Config or a new megalinter-test project I created.</p>\n<p>Health is a little better after resting over the weekend, although still have lots of symptoms.</p>\n<p>!!! EXAMPLE \"Megalinter Grafana dashboard example project\"\n <a href=\"https://github.com/practicalli/megalinter-test\">:fontawesome-brands-github: Practicalli Megalinter-Test</a>{target=_blank .md-button}</p>\n<pre><code>NOTE: I am trying to diagnose why this project does not seem to be sending logs to Grafana.\n</code></pre>", "image": "https://practical.li/journal/assets/images/social/megalinter-grafana-dashboards.png", "date_modified": "2024-10-22T15:22:01+00:00", "authors": [{"name": "Practicalli Johnny"}], "tags": ["dashboard", "debian", "github", "grafana", "megalinter", "practicalli"]}, {"id": "https://practical.li/journal/here-comes-the-rain/", "url": "https://practical.li/journal/here-comes-the-rain/", "title": "Here Comes The Rain", "content_html": "<p>Thunderstorms abound which will be good for the vegetables growing in my garden (beetroot, courgettes, parsnips and onions)</p>", "image": "https://practical.li/journal/assets/images/social/here-comes-the-rain.png", "date_modified": "2024-10-22T15:22:01+00:00", "authors": [{"name": "Practicalli Johnny"}], "tags": ["clojure", "debian", "practicalli"]}, {"id": "https://practical.li/journal/day-98-coaching-and-4clojure-53/", "url": "https://practical.li/journal/day-98-coaching-and-4clojure-53/", "title": "Day 98: Coaching and 4Clojure 53", "content_html": "<p>Continued coaching one of my regular students</p>\n<p>Took Poppy (one of my cats) to the vets for a checkup. Apart from a some plaque build Poppy is fine. More toothpaste and teeth cleaning for Poppy.</p>\n<p>Cycled into Wagamama Southbank for another coaching session, getting my teeth stuck into 4Clojure challenge #53, a tricky one eventually solved with <code>partition</code> and <code>partition-by</code>.</p>\n<p>!!! INFO \"4Clojure solution\"\n <a href=\"https://github.com/practicalli/four-clojure/commit/846c62fa2b95a844368d72011f0cc1d361bb4470\">4Clojure #53 solution</a>{target=_blank}</p>", "image": "https://practical.li/journal/assets/images/social/day-98-coaching-and-4clojure-53.png", "date_modified": "2024-10-22T11:22:46+00:00", "authors": [{"name": "Practicalli Johnny"}], "tags": ["100daysofcode", "4clojure", "clojure"]}, {"id": "https://practical.li/journal/day-100-4clojure/", "url": "https://practical.li/journal/day-100-4clojure/", "title": "Day 100: 4Clojure", "content_html": "<p>100 days of code challenge completed. Was it worth it? Well yes, it got me coding almost every day, and overall I certainly achieved more than 100 hours of coding, more like several 100 hours of coding.</p>\n<p>I didnt do was work on a specific project every day, but that would have felt more like work and I enjoyed having a break from that routine.</p>\n<p>Will I do a 100 days of code challenge again? Not sure, its quite a hard thing to be consistent with. I will certainly keep a developer journal from now on as it has been very useful.</p>\n<p>!!! INFO \"4Clojure solution\"</p>\n<pre><code>Write up of the 4Clojure exercises I covered in yesterdays Clojure study group broadcast.\n\nPopped out for a few essentials in the last day I am prepared to go shopping before the holidays :)\n\n- [4Clojure #17](https://github.com/jr0cket/four-clojure/commit/7ff29a9f7014fde30e133f88f78c15d8729ed68e){target=_blank}\n- [4Clojure #18](https://github.com/jr0cket/four-clojure/commit/f75d84c2ab82b0b74c6b87b29935c2a4e175cfc0){target=_blank}\n- [4Clojure #19](https://github.com/jr0cket/four-clojure/commit/0a4a8561b951284aa90910f339cdae9c20225007){target=_blank}\n- [4Clojure #20](https://github.com/jr0cket/four-clojure/commit/91616e84ed16803a76734a443a7a4b3b65c20262){target=_blank}\n- [4Clojure #21](https://github.com/jr0cket/four-clojure/commit/5fe42949b7123c42a6b8d1f6ab8df2c7afc8f200){target=_blank}\n- [4Clojure #22](https://github.com/jr0cket/four-clojure/commit/d7444b2f3f2f39937c4889cb080724ac790ec374){target=_blank}\n</code></pre>", "image": "https://practical.li/journal/assets/images/social/day-100-4clojure.png", "date_modified": "2024-10-22T11:22:46+00:00", "authors": [{"name": "Practicalli Johnny"}], "tags": ["100daysofcode", "4clojure", "clojure"]}, {"id": "https://practical.li/journal/how-much-root-cause-analysis-to-do/", "url": "https://practical.li/journal/how-much-root-cause-analysis-to-do/", "title": "How much root cause analysis to do?", "content_html": "<p>Winter starts on Friday 22nd December, although its already much colder this year.</p>\n<p>Early to bed tonight as I start commercial work on Monday morning.</p>", "image": "https://practical.li/journal/assets/images/social/how-much-root-cause-analysis-to-do.png", "date_modified": "2024-10-22T00:22:57+00:00", "authors": [{"name": "Practicalli Johnny"}], "tags": ["practicalli"]}, {"id": "https://practical.li/journal/first-day-at-the-new-company/", "url": "https://practical.li/journal/first-day-at-the-new-company/", "title": "First day at the new company", "content_html": "<p>How does it feel to be employed... wonderful.</p>", "image": "https://practical.li/journal/assets/images/social/first-day-at-the-new-company.png", "date_modified": "2024-10-22T00:22:57+00:00", "authors": [{"name": "Practicalli Johnny"}], "tags": ["practicalli"]}, {"id": "https://practical.li/journal/on-boarding-at-the-new-job/", "url": "https://practical.li/journal/on-boarding-at-the-new-job/", "title": "On-boarding at the new job", "content_html": "<p>Balancing enthusiasm to be productive with learning enough first so as not to be dangerous</p>", "image": "https://practical.li/journal/assets/images/social/on-boarding-at-the-new-job.png", "date_modified": "2024-10-22T00:22:57+00:00", "authors": [{"name": "Practicalli Johnny"}], "tags": ["practicalli"]}, {"id": "https://practical.li/journal/conjure-lsp-bug--cycling-video-editing/", "url": "https://practical.li/journal/conjure-lsp-bug--cycling-video-editing/", "title": "Conjure LSP bug & Cycling video editing", "content_html": "<p>Updated to Kitty 0.35.1 easily and switching between dark and light themes working instantly again.</p>\n<p>Diagnosed a 'new buffer' error with Conjure when using Neovim 0.9.0 and when opening a Clojure file, although everything works well in 0.10.0. EDIT: The maintainer added a fix to the <code>develop</code> branch for testing.</p>\n<p><a href=\"https://github.com/Olical/conjure/issues/582\">#582 REVIEW: Conjure throws new Buffer error</a>{target=_blank .md-button}</p>\n<p>Video editing of footage taken by the front mounted camera on my bicycle. Advanced cycle training at Gravesend at the start of June.\n<a href=\"https://youtu.be/7PnCrLdTmUo\">:fontawesome-brands-youtube: Bigfoot Cycling Club at Gravesent Cyclopark</a></p>\n<p>Took a few days away from the computer to work on the garden as its nice and sunny. A mostly sunny ride on Saturday around the Kent countryside.</p>", "image": "https://practical.li/journal/assets/images/social/conjure-lsp-bug--cycling-video-editing.png", "date_modified": "2024-10-22T00:18:26+00:00", "authors": [{"name": "Practicalli Johnny"}], "tags": ["clojure", "conjure", "cycling", "neovim", "practicalli"]}, {"id": "https://practical.li/journal/practicalli-project-update-5/", "url": "https://practical.li/journal/practicalli-project-update-5/", "title": "Practicalli Project Update 5", "content_html": "<p><img alt=\"Clojurists Together Logo\" src=\"https://raw.githubusercontent.com/practicalli/graphic-design/live/buttons/practicalli-clojurists-together-button.svg\">{align=right loading=lazy style=\"height:150px;width:150px\"}</p>\n<p>A range of updates, new content and tool reviews and testing. <a href=\"https://exercism.io/profiles/Practicalli\">Helping lots of students on Exercism</a> in the last week.</p>", "image": "https://practical.li/journal/assets/images/social/practicalli-project-update-5.png", "date_modified": "2024-10-21T23:42:40+00:00", "authors": [{"name": "Practicalli Johnny"}], "tags": ["clojurists-together"]}, {"id": "https://practical.li/journal/practicalli-project-update-2/", "url": "https://practical.li/journal/practicalli-project-update-2/", "title": "Practicalli Project Update 2", "content_html": "<p><img alt=\"Clojurists Together Logo\" src=\"https://raw.githubusercontent.com/practicalli/graphic-design/live/buttons/practicalli-clojurists-together-button.svg\">{align=right loading=lazy style=\"height:150px;width:150px\"}</p>\n<p>Invested time to understand the changes coming to the Clojure CLI tools and understand the opportunities that <a href=\"https://insideclojure.org/2020/09/04/clj-exec/\">Clojure exec</a> (<code>:exec-fn</code> & <code>:exec-args</code>) brings to aliases. These changes provided a catalyst to start redesigning the aliases used in <a href=\"https://practical.li/clojure/clojure-spec/data/defining-specifications/#naming-fully-qualified-keywords\">practicalli/clojure-cli-config</a>.</p>", "image": "https://practical.li/journal/assets/images/social/practicalli-project-update-2.png", "date_modified": "2024-10-21T23:42:40+00:00", "authors": [{"name": "Practicalli Johnny"}], "tags": ["clojurists-together"]}, {"id": "https://practical.li/journal/monthly-library-updates/", "url": "https://practical.li/journal/monthly-library-updates/", "title": "Monthly library updates", "content_html": "<p>The last monthly review of library dependency versions in Clojure CLI Config aliases for 2023</p>", "image": "https://practical.li/journal/assets/images/social/monthly-library-updates.png", "date_modified": "2024-10-21T22:33:04+00:00", "authors": [{"name": "Practicalli Johnny"}], "tags": ["practicalli"]}, {"id": "https://practical.li/journal/running-walking-coughing/", "url": "https://practical.li/journal/running-walking-coughing/", "title": "Running walking coughing", "content_html": "<p>Run Johnny Run... then have a sleepy day.</p>", "image": "https://practical.li/journal/assets/images/social/running-walking-coughing.png", "date_modified": "2024-10-21T22:33:04+00:00", "authors": [{"name": "Practicalli Johnny"}], "tags": ["practicalli"]}, {"id": "https://practical.li/journal/visiting-the-new-office/", "url": "https://practical.li/journal/visiting-the-new-office/", "title": "Visiting the new office", "content_html": "<p>Party on dudes...</p>", "image": "https://practical.li/journal/assets/images/social/visiting-the-new-office.png", "date_modified": "2024-10-21T22:33:04+00:00", "authors": [{"name": "Practicalli Johnny"}], "tags": ["practicalli"]}, {"id": "https://practical.li/journal/weekly-journal--neovide/", "url": "https://practical.li/journal/weekly-journal--neovide/", "title": "Weekly journal & Neovide", "content_html": "<p>The Practicalli journal will move to a weekly cadence now I have a full time job with Griffin Bank.</p>\n<p>I do write a daily journal for my activities in Griffin and will share information that is not sensitive or business valuable.</p>", "image": "https://practical.li/journal/assets/images/social/weekly-journal--neovide.png", "date_modified": "2024-10-21T22:33:04+00:00", "authors": [{"name": "Practicalli Johnny"}], "tags": ["practicalli"]}, {"id": "https://practical.li/journal/neovim-updates-and-neovide/", "url": "https://practical.li/journal/neovim-updates-and-neovide/", "title": "Neovim updates and Neovide", "content_html": "<p>Enjoying the new role as there is so much to do that I can get involved with.</p>\n<p>Also enjoying Neovide GUI for Neovim, although its more convienient to simply run <code>astro</code> for Neovim in a terminal. When I am comfortable setting the base directory or working with multiple project, then Neovide will be more convienient to use.</p>", "image": "https://practical.li/journal/assets/images/social/neovim-updates-and-neovide.png", "date_modified": "2024-10-21T22:33:04+00:00", "authors": [{"name": "Practicalli Johnny"}], "tags": ["practicalli"]}, {"id": "https://practical.li/journal/end-of-line-for-2023/", "url": "https://practical.li/journal/end-of-line-for-2023/", "title": "End of line... for 2023", "content_html": "<p>My personal plans for 2024 are not set in stone, but I would like to relocate to the countryside by the summer.</p>\n<p>Predictions for 2024:</p>\n<ul>\n<li>the year of the AI lawsuits as more companies and individuals realise they content has been used to train AI models without permission or recompense.</li>\n<li>Anthropocene is declared a new geographic era in the history of the earth, marking the significant change humanity has made to the planet (not for the good).</li>\n</ul>", "image": "https://practical.li/journal/assets/images/social/end-of-line-for-2023.png", "date_modified": "2024-10-21T22:33:04+00:00", "authors": [{"name": "Practicalli Johnny"}], "tags": ["practicalli"]}, {"id": "https://practical.li/journal/planing-practicalli-2024/", "url": "https://practical.li/journal/planing-practicalli-2024/", "title": "Planing Practicalli 2024", "content_html": "<p>How could the community help people find relevant and quality libraries to use for their own development projects?</p>", "image": "https://practical.li/journal/assets/images/social/planing-practicalli-2024.png", "date_modified": "2024-10-21T22:33:04+00:00", "authors": [{"name": "Practicalli Johnny"}], "tags": ["practicalli"]}]} \ No newline at end of file +{"version": "https://jsonfeed.org/version/1", "title": "Practicalli Personal Journal", "home_page_url": "https://practical.li/journal/", "feed_url": "https://practical.li/journal/feed_json_updated.json", "description": "Daily journal of thoughts and experiences", "icon": "https://github.com/practicalli/graphic-design/blob/live/logos/practicalli-logo.png?raw=true", "authors": [{"name": "Practicalli"}], "language": "en", "items": [{"id": "https://practical.li/journal/learning-linux-like-its-1995/", "url": "https://practical.li/journal/learning-linux-like-its-1995/", "title": "Learning Linux like its 1995", "content_html": "<p>Using Arch Linux (for Hyprland experiments) takes me back to the mid 1990's when I was learning Linux from the ground up.</p>\n<p>At the end of 1994 I was installing Slackware Linux (from 82 floppy disks) and spending hours figuring out what to compile into the Linux kernel (before the days of dynamic loading). There was a huge amount to learn (usually without my own internet connection).</p>\n<p>Arch Linux wiki pages have a huge amount of information, showing all the possible options for every piece of software and service. This does present a dilemma of choice.</p>\n<p>Having experienced many years with Linux, I know many of the concepts and software associated with a Linux system. I dont need to read all the options, but do find myself scrolling a lot until I find something familiar (or simple).</p>\n<p>The goals for this month include</p>\n<ul>\n<li>documenting Neovim & Conjure workflow</li>\n<li>meaningful exercise every day (health permitting)</li>\n<li>bicycle ride (weather permitting)</li>\n<li>avoid Hyprland turning into a huge time sync (couch potato time only)</li>\n</ul>\n<p>My health took more of a knock this week as I am finding it very difficult to walk. I've had pain in my right hip for a couple of weeks and on Friday I started walking and felt a sharp pain. Every step with my right leg is painful and going up and down stairs is particularly painful.</p>\n<p>The hip pain coupled with my left knee pain significantly limiting my ability to exercise this week.</p>\n<p>Movies this week:</p>\n<ul>\n<li><a href=\"https://en.wikipedia.org/wiki/Death_on_the_Nile_(1978_film)\">Death on the Nile 1978</a> with Peter Ustinov as Hercule Poirot, including an all-star cast from the time including David Niven, Angela Landsbury and Betty Davis.</li>\n</ul>", "image": "https://practical.li/journal/assets/images/social/learning-linux-like-its-1995.png", "date_modified": "2025-01-19T23:11:22+00:00", "authors": [{"name": "Practicalli Johnny"}], "tags": ["clojure", "practicalli"]}, {"id": "https://practical.li/journal/a-freezing-start-to-a-new-year/", "url": "https://practical.li/journal/a-freezing-start-to-a-new-year/", "title": "A freezing start to a new year", "content_html": "<p>GitHub is currently <a href=\"https://github.com/actions/runner-images/issues/10636\">:fontawesome-brands-github: rolling out a change to make Ubuntu 24.04 the default image</a> when <a href=\"#github-ci-workflow\">running a workflow on <code>ubuntu-latest</code></a>. As some packages have been removed to save space, then its prudent to give the <a href=\"https://practical.li/engineering-playbook/continuous-integration/github/workflows/practicalli/\">:fontawesome-solid-book-open: Practicalli GitHub workflows</a>{target=_blank} a test on Ubuntu 24.04.</p>\n<p>Organising my <a href=\"#digital-music\">digital music</a> and audio books so they all fit nicely on my smart phone (using Opus audio format and VLC to play the music).</p>\n<p><a href=\"#arch-linux\">Arch Linux</a> recommends not using <code>pacman -Syu</code> to update all packages and today I experience why. I can no longer login to the desktop :facepalm: EDIT: this seems to be specific to the NWG-shell configuration, as the vanilla hyprland desktop does work.</p>\n<p>I assume this is a breaking change of hyprland that NWG-shell has not resolved. This is another reason to start again with hyprland and build my own config (although this will be a big time sink, so can wait).</p>\n<p>Its freezing temperatures outside in London, UK at the moment, so I am trying to get outside when the sun is still shining. The paths are slippy and so are the roads, so even if I felt up to cycling outside, then it could be quite tricky.</p>", "image": "https://practical.li/journal/assets/images/social/a-freezing-start-to-a-new-year.png", "date_modified": "2025-01-12T21:29:51+00:00", "authors": [{"name": "Practicalli Johnny"}], "tags": ["archlinux", "audacity", "opus", "practicalli"]}, {"id": "https://practical.li/journal/a-new-dawn-a-new-day-its-a-new-life/", "url": "https://practical.li/journal/a-new-dawn-a-new-day-its-a-new-life/", "title": "A new dawn a new day its a new life", "content_html": "<p>As we come to the end of 2025 I continue to contemplate what is next?</p>\n<p>Do I want to continue in the software engineering industry with its many systemic faults?</p>\n<p>Or should I branch out and do something completely different?</p>\n<p><a href=\"https://80000hours.org/\">80,000 hours</a> is a guide to careers that have a positive impact on the world.</p>\n<p>My searching for a new home are currently focusing on the East coast of Scotland (which is dryer than London at the moment). Aberdeen (the granite city) has good support for cycling and a few cycle clubs in the area.</p>\n<p>Wired up my Playstation 4 and VR headset to start playing games again. During more severe covid symptoms I couldnt wear the VR headset as it put too much pressure on my head. From an hour of play today, the VR headset felt okay.</p>\n<p>I had a few quick games of Stardust and one surprisingly successful game of <a href=\"https://youtube.com/playlist?list=PLy9I_IfUBzKJgBTlbzRB0k4i1ARDVPSgy&si=Fq2TPODPdD1YQ6cI\">Polybius</a>.</p>", "image": "https://practical.li/journal/assets/images/social/a-new-dawn-a-new-day-its-a-new-life.png", "date_modified": "2025-01-03T00:00:58+00:00", "authors": [{"name": "Practicalli Johnny"}], "tags": ["neovim", "practicalli"]}, {"id": "https://practical.li/journal/holiday-stuffing/", "url": "https://practical.li/journal/holiday-stuffing/", "title": "Holiday stuffing", "content_html": "<p>Feeling a little sick so binging on movies and shows on Apple TV+. On Monday afternoon Apple TV+ would not stream content (the play button disappeared) although I could browse the catalogue of shows. After several hours the play button came back, although contacting Apple support was quite pointless.</p>\n<p><img alt=\"Mooless Moo Plant bases stake and ale pie\" src=\"https://optimise2.assets-servd.host/political-lechwe/production/Mooless-info.jpg?w=1600&h=904&q=82&fm=webp&fit=crop&dm=1681290833&s=8fc234ed1acd070f99e0a7b3ef95079c\">{align=right loading=lazy style=\"width:360px\"}</p>\n<p>A relaxing week trying out some new vegetarian and vegan meals. <a href=\"https://shop.pieminister.co.uk/products/mooless-moo/\">Pieminister Mooless Moo pie</a> is a plant based stake and ale pie, using jackfruit for the stake pieces. The pastry was lovely and crispy and the pie was very filling. The only downside to the pie for me was it was the taste and texture was too much like beef and I've never really liked that even when I did eat meat.</p>\n<p>New potatoes, Edamame, Spinach and Garden Peas complement the pie, along with some very thick <a href=\"https://www.bisto.co.uk/products/bisto-best-vegetable-gravy-granules-230g/\">Bisto Best Vegetable Gravy</a> (I add way too many granules to make the gravy nice and thick).</p>", "image": "https://practical.li/journal/assets/images/social/holiday-stuffing.png", "date_modified": "2024-12-29T18:31:27+00:00", "authors": [{"name": "Practicalli Johnny"}], "tags": ["emacs", "neovim", "practicalli"]}, {"id": "https://practical.li/journal/finding-my-joy/", "url": "https://practical.li/journal/finding-my-joy/", "title": "Finding My Joy", "content_html": "<p>In season 2, episode 2 of \"The Big Door Prize\" they talk about \"Finding your Joy\". This seems like an inspiring new years resolution, or at least a theme I should focus on for 2025.</p>\n<p>You only live one life and you should take time out to enjoy it. There were many aspects to 2024 that constrained my joy, so I will endeavour to may 2025 a most joyous year.</p>\n<p>Practicalli Updates:</p>\n<ul>\n<li><a href=\"https://practical.li/clojure/data-inspector/\">Clojure Data Inspector tools - overview and portal page updated</a></li>\n</ul>", "image": "https://practical.li/journal/assets/images/social/finding-my-joy.png", "date_modified": "2024-12-22T18:42:20+00:00", "authors": [{"name": "Practicalli Johnny"}], "tags": ["clojure", "practicalli"]}, {"id": "https://practical.li/journal/what-is-past-is-prologue/", "url": "https://practical.li/journal/what-is-past-is-prologue/", "title": "What is past is prologue", "content_html": "<p>!!! QUOTE\n If a technology was truly dead, no one would feel the need to talk about it on the internet</p>\n<h2>Dead is mainstream</h2>\n<p>When people state that some technology or practice is dead via the internet, it typically means that thing is the mainstream.</p>\n<p>If something was truely dead, no one would feel the need to talk about it as that topic would not relate to anyone.</p>\n<p>This technique is essentially click-bate and trying to persuade you to 'buy-in' to something else (usually for the profit of aother person)</p>", "image": "https://practical.li/journal/assets/images/social/what-is-past-is-prologue.png", "date_modified": "2024-12-15T13:23:01+00:00", "authors": [{"name": "Practicalli Johnny"}], "tags": ["appimage", "debian", "hyprland", "leadership", "practicalli"]}, {"id": "https://practical.li/journal/long-cold-winter/", "url": "https://practical.li/journal/long-cold-winter/", "title": "Long Cold Winter", "content_html": "<p><a href=\"#converting-audio-with-ffmpeg\">Converted some audio files to Opus codec</a>, which provides a really optimum compression and allows for relatively low bit rates and results in much smaller files with the same quality.</p>\n<p>Neovim upcoming changes</p>\n<ul>\n<li>neovim 0.11 has some breaking changes, so assume early in 2025</li>\n<li>astronvim v5 once neovim 0.11 released</li>\n<li><a href=\"https://github.com/WhoIsSethDaniel/mason-tool-installer.nvim\">:fontawesome-brands-github: mason-tool-installer.nvim</a> to simplify mason config in astronvim v5 - discussed in Atronvim Discord community. maston-tool-installer still <a href=\"https://github.com/WhoIsSethDaniel/mason-tool-installer.nvim/blob/main/lua/mason-tool-installer/init.lua\">:fontawesome-brands-github: uses the mason registry</a> for tool versions.</li>\n</ul>\n<p>Starting to <a href=\"#notes-for-updating-my-cv\">update my CV from recent commercial experiences</a>, focusing on the areas of product, delivery and people.</p>", "image": "https://practical.li/journal/assets/images/social/long-cold-winter.png", "date_modified": "2024-12-11T11:22:17+00:00", "authors": [{"name": "Practicalli Johnny"}], "tags": ["codec", "mason", "neovim", "opus", "practicalli"]}, {"id": "https://practical.li/journal/making-use-of-black-friday/", "url": "https://practical.li/journal/making-use-of-black-friday/", "title": "Making use of Black Friday", "content_html": "<p>Black Friday as a concept is confusing as it no longer has anything to do with a specific Friday and currently seems to cover at least 2 weeks of promotions. I did get some good prices even before Black Friday actually started.</p>\n<p><a href=\"#nas\">Adventures with SSD and NAS Versions</a> kept me busy over the weekend, resurrecting an older NAS unit with Solid State Drives for a very quiet media storage device.</p>", "image": "https://practical.li/journal/assets/images/social/making-use-of-black-friday.png", "date_modified": "2024-12-01T18:18:38+00:00", "authors": [{"name": "Practicalli Johnny"}], "tags": ["hardware", "network-attached-storage", "network-file-system", "solid-state-drive", "thecus"]}, {"id": "https://practical.li/journal/linux-wayland-compositor--hyprland/", "url": "https://practical.li/journal/linux-wayland-compositor--hyprland/", "title": "Linux Wayland Compositor & Hyprland", "content_html": "<p>A friend recommended <a href=\"https://hyprland.org/\">Hyprland window manager</a> which is similar to i3 window manager I currently used, but more optomised for the Wayland compositor.</p>\n<p>Practicalli currently uses Regolith Desktop, a complete Linux desktop that leverages Gnome and i3 tiling window manager.</p>\n<p>Regolith Desktop provides quite a rich experience using the <code>regolith-desktop</code> Debian package. I have not had much success with Regolith when running with Wayland (specifically Sway).</p>\n<p>Sway compositor is an implementation of wayland for i3 window manager. Some of my applications do not see to play nice with Sway (e.g. chromium browser scrolling, simplescreenrecorder cannot run on wayland).</p>\n<p>OBS did seem to work okay on wayland, given a sufficiently recent version.</p>\n<p>A friend recommended Hyprland, a tiling compositor that provides the latest Wayland features and lots of eye candy. Its pretty easy to setup on Debian, although there is much additional setup before it would be comparable to Regolith Desktop.</p>\n<p>Neovim Grug plugin is being considered as an alternative to the Spectre tool for search and replacing across a project.</p>", "image": "https://practical.li/journal/assets/images/social/linux-wayland-compositor--hyprland.png", "date_modified": "2024-11-22T22:52:13+00:00", "authors": [{"name": "Practicalli Johnny"}], "tags": ["debian", "hyprland", "linux", "neovim", "practicalli", "slack"]}, {"id": "https://practical.li/journal/practicalli-plans-for-the-rest-of-the-year/", "url": "https://practical.li/journal/practicalli-plans-for-the-rest-of-the-year/", "title": "Practicalli plans for the rest of the year", "content_html": "<p>Starting to <a href=\"#practicalli-plans\">plan work for the Practicalli content</a> for the next 3 months.</p>\n<p>On the Practicalli GitHub Org, <a href=\"#optimise-github-org-log-retention\">action log retention time was minimised</a> to a week (from 90 days) as I don't need to wade through that history and it will save a bit of storage in the Cloud. I am surprised GitHub have such a high default for their free plans.</p>\n<p>Upgraded to a <a href=\"#new-monitor\">Dell 40 inch 5k2k monitor</a> for work and it makes a huge difference. Its a beautiful monitor and it works really well with Linux and the tiling window of Regolith Desktop (i3).</p>\n<p>I am continuing my search for a new place to live, even further into the countryside with easy access to hiking and cycling activities.</p>\n<p>Although I am always thankful for an opportunity to work with a commercial company, I do feel the weight lifted from my shoulders now that relationship has concluded. Within hours I started to feel the return of much of the energy I have been lacking for the last few months.</p>\n<p>They do say a change is as good as a rest, so investing time in Practicalli content is giving me an energy boost.</p>\n<p><img alt=\"Freedom quote\" src=\"https://cdn4.geckoandfly.com/wp-content/uploads/2016/07/freedom-quotes-10.jpg\">{loading=lazy}</p>", "image": "https://practical.li/journal/assets/images/social/practicalli-plans-for-the-rest-of-the-year.png", "date_modified": "2024-11-22T13:36:03+00:00", "authors": [{"name": "Practicalli Johnny"}], "tags": ["github", "hardware", "practicalli", "practicalli"]}, {"id": "https://practical.li/journal/the-wonderful-complexity-of-people/", "url": "https://practical.li/journal/the-wonderful-complexity-of-people/", "title": "The wonderful complexity of people", "content_html": "<p>!!! QUOTE \"A Tail of Two Cities - Charles Dickens\"\n It was the best of times, it was the worst of times.</p>\n<p>!!! QUOTE \"Johnny Stevenson (maybe others)\"\n People are wonderfully complex experiences</p>\n<p>My feelings of disappointed with my current commercial role are returning to the forefront of my mind. Many aspects of the role and company seem to be clear in peoples minds but not always effectively shared. I think I understand the role and then something else happens that makes me feel I don't. I believe something will need to change soon for the benefit of all.</p>\n<p>There have been a few highlights with the role, but I expected more of myself and the company. I do set high expectations for myself, although have learned to be more kind about what I can realistically achieve and 'which battles to fight' (figuratively speaking of course).</p>\n<p>During this engagement I have continually reset my expectations about what could be achieved and what I could realistically achieve. There are a couple of peers where there has been conflict without understanding of why I am seen as the cause. I have tried to explore but if people do have issues with me its not clearly being communicated to me.</p>\n<p>In hindsight, many opportunities to get support from my manger and peers were missed. Mostly as we had so many challenges to discuss and partly due to pressures of delivery.</p>\n<p>When a person doesn't have clarity around a problem then there is very little they can do to resolve or adapt.</p>\n<p>A self-reflection review is in progress and its is a good opportunity to take my own time to reflect on my current role and if its still the right fit for me.</p>", "image": "https://practical.li/journal/assets/images/social/the-wonderful-complexity-of-people.png", "date_modified": "2024-11-21T17:03:42+00:00", "authors": [{"name": "Practicalli Johnny"}], "tags": ["leadership", "practicalli"]}, {"id": "https://practical.li/journal/the-king-is-probably-dead-long-live-the-king/", "url": "https://practical.li/journal/the-king-is-probably-dead-long-live-the-king/", "title": "The king is probably dead long live the king", "content_html": "<p>!!! QUOTE\n You are only a leader if people are willing to follow</p>\n<p>It has been hard to shake the concern that my current commercial role has not worked out, probably not really been working for quite a while in hindsight. Was it ever really working?</p>\n<p>Some aspects have greatly improved but there are some fundamental communication constraints that I really didn't understand the cause of (plenty of assumptions, but not enough communication or time to really address these challenges).</p>\n<p>There are the common systemic challenges that come from working at any startup that is working hard to establish itself as a long term sustainable business. This was a given. A new person coming into this environment that has been running for many years leaves a lot of context unknown and typically unspoken.</p>\n<p>I continued to try identify the causes throughout the week and trying to evaluate if there is any appetite and opportunity to address these within our typical schedule. It did feel that the more I tried to connect the quicker the feeling of connection slipped away.</p>\n<p>I believe my frustration and disappointment have been leaking out over the last month, which I am disappointed about as well.</p>\n<p>It is always a challenge for an engineering manager to identify where they can add value. For much of the current role I never seemed to connect with the team at a deep enough level. It is too easy to feel I am simply not needed by the team as the communication has been very limited. In once exceptional case, it was easy to feel my presence was simply not wanted.</p>\n<p>Tuesday I was really exhausted, partly because of the continued cough but also the concerns that I still wasn't able to break through to the team (especially if they feel unsafe to ask questions). I am not sleeping well and need to find energy to exercise more.</p>\n<p>Wednesday I made time for self-reflection as part of the company feedback initiative. I did struggle to quantify to myself what I had done. In hindsight I should have spend more time on this and consulted my journal, although I still feel I would come up short of my own lofty goals for the role.</p>\n<p>Friday was the end of my commercial current role.</p>\n<blockquote>\n<p>The title of this article is from the first episode of the first series of the Black Adder TV show. There were quite a few Shakepearean quotes used for comic effect.</p>\n</blockquote>", "image": "https://practical.li/journal/assets/images/social/the-king-is-probably-dead-long-live-the-king.png", "date_modified": "2024-11-21T17:03:42+00:00", "authors": [{"name": "Practicalli Johnny"}], "tags": ["leadership", "practicalli"]}, {"id": "https://practical.li/journal/debian-linux-migration/", "url": "https://practical.li/journal/debian-linux-migration/", "title": "Debian Linux migration", "content_html": "<p>Enjoying Debian Linux and freedom from Snaps</p>", "image": "https://practical.li/journal/assets/images/social/debian-linux-migration.png", "date_modified": "2024-11-17T11:16:06+00:00", "authors": [{"name": "Practicalli Johnny"}], "tags": ["practicalli"]}, {"id": "https://practical.li/journal/holiday-in-paramout-plus/", "url": "https://practical.li/journal/holiday-in-paramout-plus/", "title": "Holiday in Paramout Plus", "content_html": "<p>After being ill for most of the week I am finally starting to enjoying my second week of holiday, binging on some Paramount+ and having a lazy Sunday enjoying the extra hour in bed after the end of summer time.</p>\n<p>Updating Practicalli Journal and Clojure CLI Config repositories, fixing links and markdown issues from the Megalinter reports.</p>\n<p>Updating to Megalinter 0.8.1 GitHub action on Practicalli repositories as I work on them. The upgrade will include each repository in the Grafana dashboards for Practicalli projects.</p>\n<p>Issues</p>\n<ul>\n<li><strong>DOING</strong> <a href=\"https://github.com/practicalli/clojure-cli-config/issues/87\">security: add clj-watson to clojure cli config</a></li>\n<li><strong>DOING</strong> zsh environment varaibles not loading into jvm</li>\n</ul>", "image": "https://practical.li/journal/assets/images/social/holiday-in-paramout-plus.png", "date_modified": "2024-11-17T11:16:06+00:00", "authors": [{"name": "Practicalli Johnny"}], "tags": ["clojure", "practicalli"]}, {"id": "https://practical.li/journal/practicalli-project-spring-2023/", "url": "https://practical.li/journal/practicalli-project-spring-2023/", "title": "Practicalli Project Spring 2023", "content_html": "<p><img alt=\"Clojurists Together Logo\" src=\"https://raw.githubusercontent.com/practicalli/graphic-design/live/buttons/practicalli-clojurists-together-button.svg\">{align=right loading=lazy style=\"height:150px;width:150px\"}</p>\n<p>Due to covid illness during 2022 the planned work has been spread over late 2022 - early 2023.</p>", "image": "https://practical.li/journal/assets/images/social/practicalli-project-spring-2023.png", "date_modified": "2024-11-17T11:16:06+00:00", "authors": [{"name": "Practicalli Johnny"}], "tags": ["clojurists-together"]}, {"id": "https://practical.li/journal/back-to-work/", "url": "https://practical.li/journal/back-to-work/", "title": "Back to work", "content_html": "<p>Busy week at work getting ready for a new team member. I spent Friday afternoon building up a relationship and getting accustom to spending time working together. Several weeks of work had been done to get ready for the new starter.</p>\n<p>One of the interesting challenges for anyone starting a new job is to ensure too much enthusiasm doesnt lead to missing important steps. It will be a good first check-in with the new starter to see if they have been too enthusiastic or taken a more measured approach.</p>\n<p>Current issues</p>\n<ul>\n<li><strong>DONE</strong> <a href=\"https://github.com/practicalli/clojure-cli-config/issues/87\">security: add clj-watson to clojure cli config</a></li>\n</ul>", "image": "https://practical.li/journal/assets/images/social/back-to-work.png", "date_modified": "2024-11-05T19:37:11+00:00", "authors": [{"name": "Practicalli Johnny"}], "tags": ["clojure", "practicalli"]}, {"id": "https://practical.li/journal/practicalli-work-over-the-winter-break/", "url": "https://practical.li/journal/practicalli-work-over-the-winter-break/", "title": "Practicalli work over the winter break", "content_html": "<p>The company I work for takes a break over the winter, so I have some time to spend on Practicalli content.</p>", "image": "https://practical.li/journal/assets/images/social/practicalli-work-over-the-winter-break.png", "date_modified": "2024-10-22T15:22:01+00:00", "authors": [{"name": "Practicalli Johnny"}], "tags": ["practicalli"]}, {"id": "https://practical.li/journal/onboarding-to-a-new-role-hacking-clojure--neovim/", "url": "https://practical.li/journal/onboarding-to-a-new-role-hacking-clojure--neovim/", "title": "Onboarding to a new role, hacking Clojure & Neovim", "content_html": "<p>Nervous excitement about starting a new role and hopeful I dont mess it up.</p>\n<p>Enjoying writing a regular practicalli again, which is something I missed when not working.</p>", "image": "https://practical.li/journal/assets/images/social/onboarding-to-a-new-role-hacking-clojure--neovim.png", "date_modified": "2024-10-22T15:22:01+00:00", "authors": [{"name": "Practicalli Johnny"}], "tags": ["practicalli"]}, {"id": "https://practical.li/journal/discussing-new-role-expectations/", "url": "https://practical.li/journal/discussing-new-role-expectations/", "title": "Discussing new role expectations", "content_html": "<p>Learning a little more about the responsibilities and expectations of the new role, which seems very much as expected.</p>", "image": "https://practical.li/journal/assets/images/social/discussing-new-role-expectations.png", "date_modified": "2024-10-22T15:22:01+00:00", "authors": [{"name": "Practicalli Johnny"}], "tags": ["practicalli"]}, {"id": "https://practical.li/journal/health-and-new-chair/", "url": "https://practical.li/journal/health-and-new-chair/", "title": "Health and new chair", "content_html": "<p>The BeYou chair is being delivered today, will it live up to my expectations?</p>", "image": "https://practical.li/journal/assets/images/social/health-and-new-chair.png", "date_modified": "2024-10-22T15:22:01+00:00", "authors": [{"name": "Practicalli Johnny"}], "tags": ["practicalli"]}, {"id": "https://practical.li/journal/its-april-fool/", "url": "https://practical.li/journal/its-april-fool/", "title": "Its April Fool", "content_html": "<p>Adding SSH keys to the YubiKey hardware security key provides convenience of SSH key use, especially when required for multiple computers.</p>\n<p>Using a YubiKey to keep a single SSH key pair removes the need to generate a key pair for each computer.</p>\n<p>Using one SSH key avoids the need for multiple entries in the allowed-signatures file to check locally that a commit has been signed.</p>", "image": "https://practical.li/journal/assets/images/social/its-april-fool.png", "date_modified": "2024-10-22T15:22:01+00:00", "authors": [{"name": "Practicalli Johnny"}], "tags": ["astronvim", "git", "neovim", "practicalli"]}, {"id": "https://practical.li/journal/warmer-weather/", "url": "https://practical.li/journal/warmer-weather/", "title": "Warmer weather", "content_html": "<p>Practicalli AstroNvim User Config changed to be as additive as possible, leaving the template as unchanged as possible.</p>\n<p>The sunnier weather is a boots to motivation, although its still very windy. At least I can get into the garden without sinking.</p>\n<p>Another Saturday morning ride, a tough experience although not completely exhausted afterward.</p>", "image": "https://practical.li/journal/assets/images/social/warmer-weather.png", "date_modified": "2024-10-22T15:22:01+00:00", "authors": [{"name": "Practicalli Johnny"}], "tags": ["astronvim", "clojure", "neovim", "practicalli"]}, {"id": "https://practical.li/journal/flexiana-interview/", "url": "https://practical.li/journal/flexiana-interview/", "title": "Flexiana Interview", "content_html": "<p>I enjoyed the interview with Flexiana team this week, they are very friendly and it we had some very interesting discussions. I included my interview preparation notes which were mosty the same as shared in the video.</p>\n<p>A blip with Emacs 29.4 release stopped the which-key menu from showing when in a major mode. This affected both the leader and local leader key. Within a couple of hours the issue was resolved before I really figured out the cause. I installed Emacs 29.4 on Termux to replicate an issue that was reported in the #spacemacs channel of the Clojurians Community slack community.</p>", "image": "https://practical.li/journal/assets/images/social/flexiana-interview.png", "date_modified": "2024-10-22T15:22:01+00:00", "authors": [{"name": "Practicalli Johnny"}], "tags": ["clojure", "practicalli"]}, {"id": "https://practical.li/journal/fixing-neovim-treesitter-breaking-changes/", "url": "https://practical.li/journal/fixing-neovim-treesitter-breaking-changes/", "title": "Fixing Neovim Treesitter breaking changes", "content_html": "<p>The sun is out, the sky is blue... and I had the opportunity to understand some Neovim plugins a little more, in order to fix a breaking change with Neovim Treesitter support for Clojure.</p>\n<p>!!! INFO \"Pull Requests this week\"</p>\n<pre><code>- MERGED: [#7 queries: clojure has-type? updated to kind-eq?](https://github.com/PaterJason/nvim-treesitter-sexp/pull/7) for nvim-treesitter-sexp project\n</code></pre>", "image": "https://practical.li/journal/assets/images/social/fixing-neovim-treesitter-breaking-changes.png", "date_modified": "2024-10-22T15:22:01+00:00", "authors": [{"name": "Practicalli Johnny"}], "tags": ["astronvim", "github", "neovim", "practicalli", "ssh"]}, {"id": "https://practical.li/journal/neovim-on-termux-enhancements/", "url": "https://practical.li/journal/neovim-on-termux-enhancements/", "title": "Neovim on Termux enhancements", "content_html": "<p>More Neovim updates and getting closer to a release of Practicalli Astro-config</p>\n<p>I have been using Neovim (and Emacs) on Termux, so I can code on my Android tablet or Android smart phone. I typically use an external keyboard (e.g. Keyboard.io Atreus or Model100), especially when considerable typing is involved.</p>\n<p>As the hardware and compilation tooling is different for Android Linux (compared to amd64 linux) the Clojure and Lua LSP language servers would not install via the Mason manager. As these two languages are in the top 3 languages I use, then it is a great boost to get these servers working locally and configuring Neovim to use them instead.</p>\n<p>I use the <code>date</code> command when I had a need to tweak the time on my Linux computer, saves launching the <strong>Settings</strong> app and using the mouse.</p>\n<p>!!! INFO \"Timezones made easy\"\n <a href=\"https://time.is/\">time.is</a> makes figuring out timezones really simple. See the current time in any timezone across the world.</p>\n<pre><code>time.is very useful for events where people attend from different timezones. Set the local time and share a link for others who will see the event time in their own timezone.\n</code></pre>\n<h2>Neovim</h2>\n<p>I'm making some changes to the Practicalli AstroNvim configuration (AstroNvim4) over the next few days.</p>\n<p>All my personal Neovim & plugin options (and associated workflow biases) will only be in <code>lua/plugins/practicalli.lua</code>. With these options only in one file, anyone else using the configuration can easily disable them.</p>\n<p>I will encourage other users to create there own <code>lua/plugins/personal.lua</code> customisation so any changes from upstream will be easier to merge.</p>\n<p>The GitHub repository will be renamed to <code>practicalli/astro-config</code> which its much easier to write and say during screencasts. GitHub should redirect when pulling updates</p>\n<p>This week I will update Practicalli Neovim book install guide with new repo and further info on how to use the config effectively (especially with your own customisations)</p>\n<p>Then the first official release of the config will be created via GitHub releases.</p>\n<p>If I have time, there are lots of things to add to Practicalli Neovim book too (including a few more plugins I'm using in the config)</p>", "image": "https://practical.li/journal/assets/images/social/neovim-on-termux-enhancements.png", "date_modified": "2024-10-22T15:22:01+00:00", "authors": [{"name": "Practicalli Johnny"}], "tags": ["neovim", "practicalli"]}, {"id": "https://practical.li/journal/springing-back-into-life-slowly/", "url": "https://practical.li/journal/springing-back-into-life-slowly/", "title": "Springing back into life slowly", "content_html": "<p>The last month has been tough due to illness, although still managed to do a little work with Practicalli to keep me motivated (both for work and my own personal health)</p>\n<p>I though the Practicalli Project Templates had broken when I tried to create a new service project. It took me an hour or so to realise I had simply been using the command with the wrong argument, doh!</p>", "image": "https://practical.li/journal/assets/images/social/springing-back-into-life-slowly.png", "date_modified": "2024-10-22T15:22:01+00:00", "authors": [{"name": "Practicalli Johnny"}], "tags": ["clojure", "practicalli"]}, {"id": "https://practical.li/journal/having-a-donut-party-with-system-components/", "url": "https://practical.li/journal/having-a-donut-party-with-system-components/", "title": "Having a Donut Party with system components", "content_html": "<p>Not quite back to full health yet, so took it easy at the weekend.</p>\n<p>More work on restoring spare bicycles so I can sell them or otherwise find a good home.</p>\n<p>Continued the refactor of the Practicalli Service template, specifically refining the design of the system config and helper functions to support a development REPL workflow.</p>", "image": "https://practical.li/journal/assets/images/social/having-a-donut-party-with-system-components.png", "date_modified": "2024-10-22T15:22:01+00:00", "authors": [{"name": "Practicalli Johnny"}], "tags": ["clojure", "donut", "practicalli", "repl-workflow"]}, {"id": "https://practical.li/journal/git-multiple-ssh-keys--neovim/", "url": "https://practical.li/journal/git-multiple-ssh-keys--neovim/", "title": "Git Multiple SSH Keys & Neovim", "content_html": "<p>A short week at work made even shorter by a company day to celebrate going live. A chance to unwind and reflect.</p>\n<p><a href=\"https://github.com/neovim/neovim/milestones\">Neovim 0.10 is planned for 1 May 2024</a>. Plugins should be unafected, although actively developing plugins like Neogit are trying to used parts of the Neovim API. The parts of Neogit that use 0.10 api should be more efficient, although I assume there wont be a noticable difference in functionality.</p>\n<p>I will update Neovim to 0.10 when AstroNvim confirms it is working well with that release.</p>", "image": "https://practical.li/journal/assets/images/social/git-multiple-ssh-keys--neovim.png", "date_modified": "2024-10-22T15:22:01+00:00", "authors": [{"name": "Practicalli Johnny"}], "tags": ["clojure", "git", "neovim", "practicalli"]}, {"id": "https://practical.li/journal/company-offsite-week/", "url": "https://practical.li/journal/company-offsite-week/", "title": "Company offsite week", "content_html": "<p>Travelled for a work event in Portugal with a chance to meet people I work with face to face for the first time. It was a very enjoyable and also quite intensive event. I kept myself busy to help combat fatigue from travelling and manage a swim each morning and evening whilst I was at the hotel.</p>\n<p>I am accustom to working remotely since 2010, having worked for companies based outside of the UK. It is always very valuable to meet people face to face and can start or strengthen a relationship.</p>", "image": "https://practical.li/journal/assets/images/social/company-offsite-week.png", "date_modified": "2024-10-22T15:22:01+00:00", "authors": [{"name": "Practicalli Johnny"}], "tags": ["astronvim", "neovim", "practicalli"]}, {"id": "https://practical.li/journal/refactor-astronvim-clojure-pack/", "url": "https://practical.li/journal/refactor-astronvim-clojure-pack/", "title": "Refactor AstroNvim Clojure pack", "content_html": "<p>Pull requests this week</p>\n<ul>\n<li>:fontawesome-solid-code-pull-request: <strong>MERGED</strong> <a href=\"https://github.com/folke/ts-comments.nvim/pull/19\">Add Clojure comment patterns to ts-comments.nvim</a></li>\n<li>:fontawesome-solid-code-pull-request: <strong>MERGED</strong> <a href=\"https://github.com/AstroNvim/astrocommunity/pull/982\">Modularise Astrocommunity Clojure pack</a></li>\n<li>:fontawesome-solid-code-pull-request: <strong>MERGED</strong> <a href=\"https://github.com/AstroNvim/astrocommunity/pull/991\">Update AstroNvim Cloure pack description & simplify examples</a></li>\n<li>:fontawesome-solid-code-pull-request: <strong>MERGED</strong> <a href=\"https://github.com/AstroNvim/astrocommunity/pull/992\">Fix vim-visual-multi dependency name</a></li>\n</ul>\n<p>Total commits this week: 37</p>\n<p>Submitted <a href=\"https://github.com/AstroNvim/astrocommunity/pull/982\">a pull request to refactor the AstroNvim Community Clojure language pack</a> which I <a href=\"https://github.com/AstroNvim/astrocommunity/pull/248\">contributed in June 2023</a>.</p>\n<ul>\n<li>add nvim-treesitter-sexp plugin</li>\n<li>add example of disabling / configuring parinfer plugin</li>\n<li>add ts-comment.nvim to support <code>;;</code> and <code>;</code> comment characters</li>\n<li>remove autocmd from conjure plugin (no longer needed)</li>\n<li>remove most of the opinionated conjure configuration overrides, although still hiding the repl log buffer (HUD) by default as its nicer as a separate tab. Maybe if I can have it open by default as a tab, then I could live with having the HUD open on REPL startup (a nice way to check things are working)</li>\n</ul>\n<p>Still sleepy from travel to the company off-site last week and the cycle ride on Saturday. Although I did manage some work in the garden on Sunday.</p>", "image": "https://practical.li/journal/assets/images/social/refactor-astronvim-clojure-pack.png", "date_modified": "2024-10-22T15:22:01+00:00", "authors": [{"name": "Practicalli Johnny"}], "tags": ["neovim", "practicalli"]}, {"id": "https://practical.li/journal/practicalli-content-planning/", "url": "https://practical.li/journal/practicalli-content-planning/", "title": "Practicalli content planning", "content_html": "<p>Hyprland promises to be a great experience but also a potential time drain, so will save most of the investigation and further configuration until the winter break (or if I need a little distraction of the new shiny for motivation).</p>\n<p>Taking two weeks off from work and have some time to work on Practicalli content.</p>", "image": "https://practical.li/journal/assets/images/social/practicalli-content-planning.png", "date_modified": "2024-10-22T15:22:01+00:00", "authors": [{"name": "Practicalli Johnny"}], "tags": ["clojure", "megalinter", "neovim", "practicalli"]}, {"id": "https://practical.li/journal/hacking-on-practicalli-content/", "url": "https://practical.li/journal/hacking-on-practicalli-content/", "title": "Hacking on Practicalli content", "content_html": "<p>I am enjoying my 2 week at home vacation (stay-cation) and have already completely rewired my desk, laptops, Monitors and NAS storage devices on the electronic standing desk. It feels a lot more organised and easier to find everything as everything has its place.</p>\n<p>Now I can focus on getting lots of <a href=\"#practicalli\">Practicalli content done</a> (as well as catch up with shows on Paramount+ and maybe a little Polybus on the Playstation4 VR headset)</p>\n<p>I am interested in switching to the Hyprland, although its changing fast so I dug out an older laptop and installed Arch Linux with Hyprland using the <code>archinstall</code> tool. Unfortunately the laptop I used doesnt seem to support Hyprland or something is missing from the install.</p>\n<p>I am taking a stay-cation as I am still recovering from Covid and the weather is also quite grim. I am getting out for walks each day and on Friday I completed a short cycle ride as it was nice and sunny outside. Unfortunately my chest started feeling like it was on fire a few minutes into the ride, so I slowed down and limited myself to 10km.</p>\n<p>I was feeling really sleepy after the ride, so I kept myself awake by sorting through the cardboard boxes in my attic. Many boxes made the ultimate sacrifice (for an uncluttered house) and went to the recycling service.</p>", "image": "https://practical.li/journal/assets/images/social/hacking-on-practicalli-content.png", "date_modified": "2024-10-22T15:22:01+00:00", "authors": [{"name": "Practicalli Johnny"}], "tags": ["neovim", "practicalli", "practicalli"]}, {"id": "https://practical.li/journal/megalinter-8-and-monthly-version-updates/", "url": "https://practical.li/journal/megalinter-8-and-monthly-version-updates/", "title": "Megalinter 8 and monthly version updates", "content_html": "<p>Megalinter updates to version 8 using the megalinter runner tool, adding a Makefile task to simplify the command line (so I dont have to remember the command).</p>\n<p>Material for MkDocs provides a nice diff view using the <code>diff</code> language for a code block. Add or copy a diff into the code block, ensuring the <code>-</code> and <code>+</code> signs are included and the diff is automatically highlighted. See the <a href=\"#megalinter\">Megalinter</a> section of this post for an example.</p>\n<p>Feeling quite low the last few weeks, mostly due to continued Covid symptoms, low blood oxygen and lack of energy. Waking up I feel like I have experienced carbon dioxide poisoning (which I have experienced working on a mushroom farm). I am disorientated, dizzy and feel quite terrible.</p>", "image": "https://practical.li/journal/assets/images/social/megalinter-8-and-monthly-version-updates.png", "date_modified": "2024-10-22T15:22:01+00:00", "authors": [{"name": "Practicalli Johnny"}], "tags": ["clojure", "practicalli"]}, {"id": "https://practical.li/journal/megalinter-grafana-dashboards/", "url": "https://practical.li/journal/megalinter-grafana-dashboards/", "title": "MegaLinter Grafana Dashboards", "content_html": "<p>As Practicalli projects are being updated to Megalinter version 8 it seemed a good time to try the Megalinter API reporter to publish data to use with Grafana. A chance to learn more about creating Dashboards and if Grafana is any easier than DataDog.</p>\n<p>!!! WARNING \"Megalinter not publishing logs on Grafana yet\"\n Unfortunately I havent been able to make the Megalinter API Reporter work with this journal project, Clojure CLI Config or a new megalinter-test project I created.</p>\n<p>Health is a little better after resting over the weekend, although still have lots of symptoms.</p>\n<p>!!! EXAMPLE \"Megalinter Grafana dashboard example project\"\n <a href=\"https://github.com/practicalli/megalinter-test\">:fontawesome-brands-github: Practicalli Megalinter-Test</a>{target=_blank .md-button}</p>\n<pre><code>NOTE: I am trying to diagnose why this project does not seem to be sending logs to Grafana.\n</code></pre>", "image": "https://practical.li/journal/assets/images/social/megalinter-grafana-dashboards.png", "date_modified": "2024-10-22T15:22:01+00:00", "authors": [{"name": "Practicalli Johnny"}], "tags": ["dashboard", "debian", "github", "grafana", "megalinter", "practicalli"]}, {"id": "https://practical.li/journal/here-comes-the-rain/", "url": "https://practical.li/journal/here-comes-the-rain/", "title": "Here Comes The Rain", "content_html": "<p>Thunderstorms abound which will be good for the vegetables growing in my garden (beetroot, courgettes, parsnips and onions)</p>", "image": "https://practical.li/journal/assets/images/social/here-comes-the-rain.png", "date_modified": "2024-10-22T15:22:01+00:00", "authors": [{"name": "Practicalli Johnny"}], "tags": ["clojure", "debian", "practicalli"]}, {"id": "https://practical.li/journal/day-98-coaching-and-4clojure-53/", "url": "https://practical.li/journal/day-98-coaching-and-4clojure-53/", "title": "Day 98: Coaching and 4Clojure 53", "content_html": "<p>Continued coaching one of my regular students</p>\n<p>Took Poppy (one of my cats) to the vets for a checkup. Apart from a some plaque build Poppy is fine. More toothpaste and teeth cleaning for Poppy.</p>\n<p>Cycled into Wagamama Southbank for another coaching session, getting my teeth stuck into 4Clojure challenge #53, a tricky one eventually solved with <code>partition</code> and <code>partition-by</code>.</p>\n<p>!!! INFO \"4Clojure solution\"\n <a href=\"https://github.com/practicalli/four-clojure/commit/846c62fa2b95a844368d72011f0cc1d361bb4470\">4Clojure #53 solution</a>{target=_blank}</p>", "image": "https://practical.li/journal/assets/images/social/day-98-coaching-and-4clojure-53.png", "date_modified": "2024-10-22T11:22:46+00:00", "authors": [{"name": "Practicalli Johnny"}], "tags": ["100daysofcode", "4clojure", "clojure"]}, {"id": "https://practical.li/journal/day-100-4clojure/", "url": "https://practical.li/journal/day-100-4clojure/", "title": "Day 100: 4Clojure", "content_html": "<p>100 days of code challenge completed. Was it worth it? Well yes, it got me coding almost every day, and overall I certainly achieved more than 100 hours of coding, more like several 100 hours of coding.</p>\n<p>I didnt do was work on a specific project every day, but that would have felt more like work and I enjoyed having a break from that routine.</p>\n<p>Will I do a 100 days of code challenge again? Not sure, its quite a hard thing to be consistent with. I will certainly keep a developer journal from now on as it has been very useful.</p>\n<p>!!! INFO \"4Clojure solution\"</p>\n<pre><code>Write up of the 4Clojure exercises I covered in yesterdays Clojure study group broadcast.\n\nPopped out for a few essentials in the last day I am prepared to go shopping before the holidays :)\n\n- [4Clojure #17](https://github.com/jr0cket/four-clojure/commit/7ff29a9f7014fde30e133f88f78c15d8729ed68e){target=_blank}\n- [4Clojure #18](https://github.com/jr0cket/four-clojure/commit/f75d84c2ab82b0b74c6b87b29935c2a4e175cfc0){target=_blank}\n- [4Clojure #19](https://github.com/jr0cket/four-clojure/commit/0a4a8561b951284aa90910f339cdae9c20225007){target=_blank}\n- [4Clojure #20](https://github.com/jr0cket/four-clojure/commit/91616e84ed16803a76734a443a7a4b3b65c20262){target=_blank}\n- [4Clojure #21](https://github.com/jr0cket/four-clojure/commit/5fe42949b7123c42a6b8d1f6ab8df2c7afc8f200){target=_blank}\n- [4Clojure #22](https://github.com/jr0cket/four-clojure/commit/d7444b2f3f2f39937c4889cb080724ac790ec374){target=_blank}\n</code></pre>", "image": "https://practical.li/journal/assets/images/social/day-100-4clojure.png", "date_modified": "2024-10-22T11:22:46+00:00", "authors": [{"name": "Practicalli Johnny"}], "tags": ["100daysofcode", "4clojure", "clojure"]}, {"id": "https://practical.li/journal/how-much-root-cause-analysis-to-do/", "url": "https://practical.li/journal/how-much-root-cause-analysis-to-do/", "title": "How much root cause analysis to do?", "content_html": "<p>Winter starts on Friday 22nd December, although its already much colder this year.</p>\n<p>Early to bed tonight as I start commercial work on Monday morning.</p>", "image": "https://practical.li/journal/assets/images/social/how-much-root-cause-analysis-to-do.png", "date_modified": "2024-10-22T00:22:57+00:00", "authors": [{"name": "Practicalli Johnny"}], "tags": ["practicalli"]}, {"id": "https://practical.li/journal/first-day-at-the-new-company/", "url": "https://practical.li/journal/first-day-at-the-new-company/", "title": "First day at the new company", "content_html": "<p>How does it feel to be employed... wonderful.</p>", "image": "https://practical.li/journal/assets/images/social/first-day-at-the-new-company.png", "date_modified": "2024-10-22T00:22:57+00:00", "authors": [{"name": "Practicalli Johnny"}], "tags": ["practicalli"]}, {"id": "https://practical.li/journal/on-boarding-at-the-new-job/", "url": "https://practical.li/journal/on-boarding-at-the-new-job/", "title": "On-boarding at the new job", "content_html": "<p>Balancing enthusiasm to be productive with learning enough first so as not to be dangerous</p>", "image": "https://practical.li/journal/assets/images/social/on-boarding-at-the-new-job.png", "date_modified": "2024-10-22T00:22:57+00:00", "authors": [{"name": "Practicalli Johnny"}], "tags": ["practicalli"]}, {"id": "https://practical.li/journal/conjure-lsp-bug--cycling-video-editing/", "url": "https://practical.li/journal/conjure-lsp-bug--cycling-video-editing/", "title": "Conjure LSP bug & Cycling video editing", "content_html": "<p>Updated to Kitty 0.35.1 easily and switching between dark and light themes working instantly again.</p>\n<p>Diagnosed a 'new buffer' error with Conjure when using Neovim 0.9.0 and when opening a Clojure file, although everything works well in 0.10.0. EDIT: The maintainer added a fix to the <code>develop</code> branch for testing.</p>\n<p><a href=\"https://github.com/Olical/conjure/issues/582\">#582 REVIEW: Conjure throws new Buffer error</a>{target=_blank .md-button}</p>\n<p>Video editing of footage taken by the front mounted camera on my bicycle. Advanced cycle training at Gravesend at the start of June.\n<a href=\"https://youtu.be/7PnCrLdTmUo\">:fontawesome-brands-youtube: Bigfoot Cycling Club at Gravesent Cyclopark</a></p>\n<p>Took a few days away from the computer to work on the garden as its nice and sunny. A mostly sunny ride on Saturday around the Kent countryside.</p>", "image": "https://practical.li/journal/assets/images/social/conjure-lsp-bug--cycling-video-editing.png", "date_modified": "2024-10-22T00:18:26+00:00", "authors": [{"name": "Practicalli Johnny"}], "tags": ["clojure", "conjure", "cycling", "neovim", "practicalli"]}, {"id": "https://practical.li/journal/practicalli-project-update-5/", "url": "https://practical.li/journal/practicalli-project-update-5/", "title": "Practicalli Project Update 5", "content_html": "<p><img alt=\"Clojurists Together Logo\" src=\"https://raw.githubusercontent.com/practicalli/graphic-design/live/buttons/practicalli-clojurists-together-button.svg\">{align=right loading=lazy style=\"height:150px;width:150px\"}</p>\n<p>A range of updates, new content and tool reviews and testing. <a href=\"https://exercism.io/profiles/Practicalli\">Helping lots of students on Exercism</a> in the last week.</p>", "image": "https://practical.li/journal/assets/images/social/practicalli-project-update-5.png", "date_modified": "2024-10-21T23:42:40+00:00", "authors": [{"name": "Practicalli Johnny"}], "tags": ["clojurists-together"]}, {"id": "https://practical.li/journal/practicalli-project-update-2/", "url": "https://practical.li/journal/practicalli-project-update-2/", "title": "Practicalli Project Update 2", "content_html": "<p><img alt=\"Clojurists Together Logo\" src=\"https://raw.githubusercontent.com/practicalli/graphic-design/live/buttons/practicalli-clojurists-together-button.svg\">{align=right loading=lazy style=\"height:150px;width:150px\"}</p>\n<p>Invested time to understand the changes coming to the Clojure CLI tools and understand the opportunities that <a href=\"https://insideclojure.org/2020/09/04/clj-exec/\">Clojure exec</a> (<code>:exec-fn</code> & <code>:exec-args</code>) brings to aliases. These changes provided a catalyst to start redesigning the aliases used in <a href=\"https://practical.li/clojure/clojure-spec/data/defining-specifications/#naming-fully-qualified-keywords\">practicalli/clojure-cli-config</a>.</p>", "image": "https://practical.li/journal/assets/images/social/practicalli-project-update-2.png", "date_modified": "2024-10-21T23:42:40+00:00", "authors": [{"name": "Practicalli Johnny"}], "tags": ["clojurists-together"]}, {"id": "https://practical.li/journal/monthly-library-updates/", "url": "https://practical.li/journal/monthly-library-updates/", "title": "Monthly library updates", "content_html": "<p>The last monthly review of library dependency versions in Clojure CLI Config aliases for 2023</p>", "image": "https://practical.li/journal/assets/images/social/monthly-library-updates.png", "date_modified": "2024-10-21T22:33:04+00:00", "authors": [{"name": "Practicalli Johnny"}], "tags": ["practicalli"]}, {"id": "https://practical.li/journal/running-walking-coughing/", "url": "https://practical.li/journal/running-walking-coughing/", "title": "Running walking coughing", "content_html": "<p>Run Johnny Run... then have a sleepy day.</p>", "image": "https://practical.li/journal/assets/images/social/running-walking-coughing.png", "date_modified": "2024-10-21T22:33:04+00:00", "authors": [{"name": "Practicalli Johnny"}], "tags": ["practicalli"]}, {"id": "https://practical.li/journal/visiting-the-new-office/", "url": "https://practical.li/journal/visiting-the-new-office/", "title": "Visiting the new office", "content_html": "<p>Party on dudes...</p>", "image": "https://practical.li/journal/assets/images/social/visiting-the-new-office.png", "date_modified": "2024-10-21T22:33:04+00:00", "authors": [{"name": "Practicalli Johnny"}], "tags": ["practicalli"]}, {"id": "https://practical.li/journal/weekly-journal--neovide/", "url": "https://practical.li/journal/weekly-journal--neovide/", "title": "Weekly journal & Neovide", "content_html": "<p>The Practicalli journal will move to a weekly cadence now I have a full time job with Griffin Bank.</p>\n<p>I do write a daily journal for my activities in Griffin and will share information that is not sensitive or business valuable.</p>", "image": "https://practical.li/journal/assets/images/social/weekly-journal--neovide.png", "date_modified": "2024-10-21T22:33:04+00:00", "authors": [{"name": "Practicalli Johnny"}], "tags": ["practicalli"]}, {"id": "https://practical.li/journal/neovim-updates-and-neovide/", "url": "https://practical.li/journal/neovim-updates-and-neovide/", "title": "Neovim updates and Neovide", "content_html": "<p>Enjoying the new role as there is so much to do that I can get involved with.</p>\n<p>Also enjoying Neovide GUI for Neovim, although its more convienient to simply run <code>astro</code> for Neovim in a terminal. When I am comfortable setting the base directory or working with multiple project, then Neovide will be more convienient to use.</p>", "image": "https://practical.li/journal/assets/images/social/neovim-updates-and-neovide.png", "date_modified": "2024-10-21T22:33:04+00:00", "authors": [{"name": "Practicalli Johnny"}], "tags": ["practicalli"]}, {"id": "https://practical.li/journal/end-of-line-for-2023/", "url": "https://practical.li/journal/end-of-line-for-2023/", "title": "End of line... for 2023", "content_html": "<p>My personal plans for 2024 are not set in stone, but I would like to relocate to the countryside by the summer.</p>\n<p>Predictions for 2024:</p>\n<ul>\n<li>the year of the AI lawsuits as more companies and individuals realise they content has been used to train AI models without permission or recompense.</li>\n<li>Anthropocene is declared a new geographic era in the history of the earth, marking the significant change humanity has made to the planet (not for the good).</li>\n</ul>", "image": "https://practical.li/journal/assets/images/social/end-of-line-for-2023.png", "date_modified": "2024-10-21T22:33:04+00:00", "authors": [{"name": "Practicalli Johnny"}], "tags": ["practicalli"]}, {"id": "https://practical.li/journal/planing-practicalli-2024/", "url": "https://practical.li/journal/planing-practicalli-2024/", "title": "Planing Practicalli 2024", "content_html": "<p>How could the community help people find relevant and quality libraries to use for their own development projects?</p>", "image": "https://practical.li/journal/assets/images/social/planing-practicalli-2024.png", "date_modified": "2024-10-21T22:33:04+00:00", "authors": [{"name": "Practicalli Johnny"}], "tags": ["practicalli"]}]} \ No newline at end of file diff --git a/feed_rss_created.xml b/feed_rss_created.xml index 97b9769c..c0d8a668 100644 --- a/feed_rss_created.xml +++ b/feed_rss_created.xml @@ -1 +1 @@ -<?xml version="1.0" encoding="UTF-8" ?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/"> <channel><title>Practicalli Personal Journal</title><description>Daily journal of thoughts and experiences</description><link>https://practical.li/journal/</link><atom:link href="https://practical.li/journal/feed_rss_created.xml" rel="self" type="application/rss+xml" /><managingEditor>Practicalli</managingEditor><docs>https://github.com/practicalli/journal/</docs><language>en</language> <pubDate>Sun, 19 Jan 2025 22:58:44 -0000</pubDate> <lastBuildDate>Sun, 19 Jan 2025 22:58:44 -0000</lastBuildDate> <ttl>1440</ttl> <generator>MkDocs RSS plugin - v1.17.1</generator> <image> <url>https://github.com/practicalli/graphic-design/blob/live/logos/practicalli-logo.png?raw=true</url> <title>Practicalli Personal Journal</title><link>https://practical.li/journal/</link> </image> <item> <title>Learning Linux like its 1995</title> <author>Practicalli Johnny</author> <category>clojure</category> <category>practicalli</category> <description><p>Using Arch Linux (for Hyprland experiments) takes me back to the mid 1990's when I was learning Linux from the ground up.</p><p>At the end of 1994 I was installing Slackware Linux (from 82 floppy disks) and spending hours figuring out what to compile into the Linux kernel (before the days of dynamic loading). There was a huge amount to learn (usually without my own internet connection).</p><p>Arch Linux wiki pages have a huge amount of information, showing all the possible options for every piece of software and service. This does present a dilemma of choice.</p><p>Having experienced many years with Linux, I know many of the concepts and software associated with a Linux system. I dont need to read all the options, but do find myself scrolling a lot until I find something familiar (or simple).</p><p>The goals for this month include</p><ul><li>documenting Neovim &amp; Conjure workflow</li><li>meaningful exercise every day (health permitting)</li><li>bicycle ride (weather permitting)</li><li>avoid Hyprland turning into a huge time sync (couch potato time only)</li></ul><p>My health took more of a knock this week as I am finding it very difficult to walk. I've had pain in my right hip for a couple of weeks and on Friday I started walking and felt a sharp pain. Every step with my right leg is painful and going up and down stairs is particularly painful.</p><p>The hip pain coupled with my left knee pain significantly limiting my ability to exercise this week.</p><p>Movies this week:</p><ul><li><a href="https://en.wikipedia.org/wiki/Death_on_the_Nile_(1978_film)">Death on the Nile 1978</a> with Peter Ustinov as Hercule Poirot, including an all-star cast from the time including David Niven, Angela Landsbury and Betty Davis.</li></ul></description><link>https://practical.li/journal/learning-linux-like-its-1995/</link> <pubDate>Mon, 13 Jan 2025 00:00:00 +0000</pubDate><source url="https://practical.li/journal/feed_rss_created.xml">Practicalli Personal Journal</source><guid isPermaLink="true">https://practical.li/journal/learning-linux-like-its-1995/</guid> <enclosure url="https://practical.li/journal/assets/images/social/learning-linux-like-its-1995.png" type="image/png" length="0" /> </item> <item> <title>A new dawn a new day its a new life</title> <author>Practicalli Johnny</author> <category>neovim</category> <category>practicalli</category> <description><p>As we come to the end of 2025 I continue to contemplate what is next?</p><p>Do I want to continue in the software engineering industry with its many systemic faults?</p><p>Or should I branch out and do something completely different?</p><p><a href="https://80000hours.org/">80,000 hours</a> is a guide to careers that have a positive impact on the world.</p><p>My searching for a new home are currently focusing on the East coast of Scotland (which is dryer than London at the moment). Aberdeen (the granite city) has good support for cycling and a few cycle clubs in the area.</p><p>Wired up my Playstation 4 and VR headset to start playing games again. During more severe covid symptoms I couldnt wear the VR headset as it put too much pressure on my head. From an hour of play today, the VR headset felt okay.</p><p>I had a few quick games of Stardust and one surprisingly successful game of <a href="https://youtube.com/playlist?list=PLy9I_IfUBzKJgBTlbzRB0k4i1ARDVPSgy&amp;si=Fq2TPODPdD1YQ6cI">Polybius</a>.</p></description><link>https://practical.li/journal/a-new-dawn-a-new-day-its-a-new-life/</link> <pubDate>Sun, 29 Dec 2024 00:00:00 +0000</pubDate><source url="https://practical.li/journal/feed_rss_created.xml">Practicalli Personal Journal</source><guid isPermaLink="true">https://practical.li/journal/a-new-dawn-a-new-day-its-a-new-life/</guid> <enclosure url="https://practical.li/journal/assets/images/social/a-new-dawn-a-new-day-its-a-new-life.png" type="image/png" length="None" /> </item> <item> <title>Holiday stuffing</title> <author>Practicalli Johnny</author> <category>emacs</category> <category>neovim</category> <category>practicalli</category> <description><p>Feeling a little sick so binging on movies and shows on Apple TV+. On Monday afternoon Apple TV+ would not stream content (the play button disappeared) although I could browse the catalogue of shows. After several hours the play button came back, although contacting Apple support was quite pointless.</p><p><img alt="Mooless Moo Plant bases stake and ale pie" src="https://optimise2.assets-servd.host/political-lechwe/production/Mooless-info.jpg?w=1600&amp;h=904&amp;q=82&amp;fm=webp&amp;fit=crop&amp;dm=1681290833&amp;s=8fc234ed1acd070f99e0a7b3ef95079c">{align=right loading=lazy style="width:360px"}</p><p>A relaxing week trying out some new vegetarian and vegan meals. <a href="https://shop.pieminister.co.uk/products/mooless-moo/">Pieminister Mooless Moo pie</a> is a plant based stake and ale pie, using jackfruit for the stake pieces. The pastry was lovely and crispy and the pie was very filling. The only downside to the pie for me was it was the taste and texture was too much like beef and I've never really liked that even when I did eat meat.</p><p>New potatoes, Edamame, Spinach and Garden Peas complement the pie, along with some very thick <a href="https://www.bisto.co.uk/products/bisto-best-vegetable-gravy-granules-230g/">Bisto Best Vegetable Gravy</a> (I add way too many granules to make the gravy nice and thick).</p></description><link>https://practical.li/journal/holiday-stuffing/</link> <pubDate>Sun, 22 Dec 2024 00:00:00 +0000</pubDate><source url="https://practical.li/journal/feed_rss_created.xml">Practicalli Personal Journal</source><guid isPermaLink="true">https://practical.li/journal/holiday-stuffing/</guid> <enclosure url="https://practical.li/journal/assets/images/social/holiday-stuffing.png" type="image/png" length="0" /> </item> <item> <title>Finding My Joy</title> <author>Practicalli Johnny</author> <category>clojure</category> <category>practicalli</category> <description><p>In season 2, episode 2 of "The Big Door Prize" they talk about "Finding your Joy". This seems like an inspiring new years resolution, or at least a theme I should focus on for 2025.</p><p>You only live one life and you should take time out to enjoy it. There were many aspects to 2024 that constrained my joy, so I will endeavour to may 2025 a most joyous year.</p><p>Practicalli Updates:</p><ul><li><a href="https://practical.li/clojure/data-inspector/">Clojure Data Inspector tools - overview and portal page updated</a></li></ul></description><link>https://practical.li/journal/finding-my-joy/</link> <pubDate>Mon, 16 Dec 2024 00:00:00 +0000</pubDate><source url="https://practical.li/journal/feed_rss_created.xml">Practicalli Personal Journal</source><guid isPermaLink="true">https://practical.li/journal/finding-my-joy/</guid> <enclosure url="https://practical.li/journal/assets/images/social/finding-my-joy.png" type="image/png" length="None" /> </item> <item> <title>What is past is prologue</title> <author>Practicalli Johnny</author> <category>appimage</category> <category>debian</category> <category>hyprland</category> <category>leadership</category> <category>practicalli</category> <description><p>!!! QUOTE If a technology was truly dead, no one would feel the need to talk about it on the internet</p><h2>Dead is mainstream</h2><p>When people state that some technology or practice is dead via the internet, it typically means that thing is the mainstream.</p><p>If something was truely dead, no one would feel the need to talk about it as that topic would not relate to anyone.</p><p>This technique is essentially click-bate and trying to persuade you to 'buy-in' to something else (usually for the profit of aother person)</p></description><link>https://practical.li/journal/what-is-past-is-prologue/</link> <pubDate>Mon, 09 Dec 2024 00:00:00 +0000</pubDate><source url="https://practical.li/journal/feed_rss_created.xml">Practicalli Personal Journal</source><guid isPermaLink="true">https://practical.li/journal/what-is-past-is-prologue/</guid> <enclosure url="https://practical.li/journal/assets/images/social/what-is-past-is-prologue.png" type="image/png" length="None" /> </item> <item> <title>Long Cold Winter</title> <author>Practicalli Johnny</author> <category>codec</category> <category>mason</category> <category>neovim</category> <category>opus</category> <category>practicalli</category> <description><p><a href="#converting-audio-with-ffmpeg">Converted some audio files to Opus codec</a>, which provides a really optimum compression and allows for relatively low bit rates and results in much smaller files with the same quality.</p><p>Neovim upcoming changes</p><ul><li>neovim 0.11 has some breaking changes, so assume early in 2025</li><li>astronvim v5 once neovim 0.11 released</li><li><a href="https://github.com/WhoIsSethDaniel/mason-tool-installer.nvim">:fontawesome-brands-github: mason-tool-installer.nvim</a> to simplify mason config in astronvim v5 - discussed in Atronvim Discord community. maston-tool-installer still <a href="https://github.com/WhoIsSethDaniel/mason-tool-installer.nvim/blob/main/lua/mason-tool-installer/init.lua">:fontawesome-brands-github: uses the mason registry</a> for tool versions.</li></ul><p>Starting to <a href="#notes-for-updating-my-cv">update my CV from recent commercial experiences</a>, focusing on the areas of product, delivery and people.</p></description><link>https://practical.li/journal/long-cold-winter/</link> <pubDate>Mon, 02 Dec 2024 00:00:00 +0000</pubDate><source url="https://practical.li/journal/feed_rss_created.xml">Practicalli Personal Journal</source><guid isPermaLink="true">https://practical.li/journal/long-cold-winter/</guid> <enclosure url="https://practical.li/journal/assets/images/social/long-cold-winter.png" type="image/png" length="None" /> </item> <item> <title>Making use of Black Friday</title> <author>Practicalli Johnny</author> <category>hardware</category> <category>network-attached-storage</category> <category>network-file-system</category> <category>solid-state-drive</category> <category>thecus</category> <description><p>Black Friday as a concept is confusing as it no longer has anything to do with a specific Friday and currently seems to cover at least 2 weeks of promotions. I did get some good prices even before Black Friday actually started.</p><p><a href="#nas">Adventures with SSD and NAS Versions</a> kept me busy over the weekend, resurrecting an older NAS unit with Solid State Drives for a very quiet media storage device.</p></description><link>https://practical.li/journal/making-use-of-black-friday/</link> <pubDate>Mon, 25 Nov 2024 00:00:00 +0000</pubDate><source url="https://practical.li/journal/feed_rss_created.xml">Practicalli Personal Journal</source><guid isPermaLink="true">https://practical.li/journal/making-use-of-black-friday/</guid> <enclosure url="https://practical.li/journal/assets/images/social/making-use-of-black-friday.png" type="image/png" length="54253" /> </item> <item> <title>Practicalli plans for the rest of the year</title> <author>Practicalli Johnny</author> <category>github</category> <category>hardware</category> <category>practicalli</category> <category>practicalli</category> <description><p>Starting to <a href="#practicalli-plans">plan work for the Practicalli content</a> for the next 3 months.</p><p>On the Practicalli GitHub Org, <a href="#optimise-github-org-log-retention">action log retention time was minimised</a> to a week (from 90 days) as I don't need to wade through that history and it will save a bit of storage in the Cloud. I am surprised GitHub have such a high default for their free plans.</p><p>Upgraded to a <a href="#new-monitor">Dell 40 inch 5k2k monitor</a> for work and it makes a huge difference. Its a beautiful monitor and it works really well with Linux and the tiling window of Regolith Desktop (i3).</p><p>I am continuing my search for a new place to live, even further into the countryside with easy access to hiking and cycling activities.</p><p>Although I am always thankful for an opportunity to work with a commercial company, I do feel the weight lifted from my shoulders now that relationship has concluded. Within hours I started to feel the return of much of the energy I have been lacking for the last few months.</p><p>They do say a change is as good as a rest, so investing time in Practicalli content is giving me an energy boost.</p><p><img alt="Freedom quote" src="https://cdn4.geckoandfly.com/wp-content/uploads/2016/07/freedom-quotes-10.jpg">{loading=lazy}</p></description><link>https://practical.li/journal/practicalli-plans-for-the-rest-of-the-year/</link> <pubDate>Mon, 18 Nov 2024 00:00:00 +0000</pubDate><source url="https://practical.li/journal/feed_rss_created.xml">Practicalli Personal Journal</source><guid isPermaLink="true">https://practical.li/journal/practicalli-plans-for-the-rest-of-the-year/</guid> <enclosure url="https://practical.li/journal/assets/images/social/practicalli-plans-for-the-rest-of-the-year.png" type="image/png" length="54273" /> </item> <item> <title>The king is probably dead long live the king</title> <author>Practicalli Johnny</author> <category>leadership</category> <category>practicalli</category> <description><p>!!! QUOTE You are only a leader if people are willing to follow</p><p>It has been hard to shake the concern that my current commercial role has not worked out, probably not really been working for quite a while in hindsight. Was it ever really working?</p><p>Some aspects have greatly improved but there are some fundamental communication constraints that I really didn't understand the cause of (plenty of assumptions, but not enough communication or time to really address these challenges).</p><p>There are the common systemic challenges that come from working at any startup that is working hard to establish itself as a long term sustainable business. This was a given. A new person coming into this environment that has been running for many years leaves a lot of context unknown and typically unspoken.</p><p>I continued to try identify the causes throughout the week and trying to evaluate if there is any appetite and opportunity to address these within our typical schedule. It did feel that the more I tried to connect the quicker the feeling of connection slipped away.</p><p>I believe my frustration and disappointment have been leaking out over the last month, which I am disappointed about as well.</p><p>It is always a challenge for an engineering manager to identify where they can add value. For much of the current role I never seemed to connect with the team at a deep enough level. It is too easy to feel I am simply not needed by the team as the communication has been very limited. In once exceptional case, it was easy to feel my presence was simply not wanted.</p><p>Tuesday I was really exhausted, partly because of the continued cough but also the concerns that I still wasn't able to break through to the team (especially if they feel unsafe to ask questions). I am not sleeping well and need to find energy to exercise more.</p><p>Wednesday I made time for self-reflection as part of the company feedback initiative. I did struggle to quantify to myself what I had done. In hindsight I should have spend more time on this and consulted my journal, although I still feel I would come up short of my own lofty goals for the role.</p><p>Friday was the end of my commercial current role.</p><blockquote><p>The title of this article is from the first episode of the first series of the Black Adder TV show. There were quite a few Shakepearean quotes used for comic effect.</p></blockquote></description><link>https://practical.li/journal/the-king-is-probably-dead-long-live-the-king/</link> <pubDate>Mon, 11 Nov 2024 00:00:00 +0000</pubDate><source url="https://practical.li/journal/feed_rss_created.xml">Practicalli Personal Journal</source><guid isPermaLink="true">https://practical.li/journal/the-king-is-probably-dead-long-live-the-king/</guid> <enclosure url="https://practical.li/journal/assets/images/social/the-king-is-probably-dead-long-live-the-king.png" type="image/png" length="60338" /> </item> <item> <title>The wonderful complexity of people</title> <author>Practicalli Johnny</author> <category>leadership</category> <category>practicalli</category> <description><p>!!! QUOTE "A Tail of Two Cities - Charles Dickens" It was the best of times, it was the worst of times.</p><p>!!! QUOTE "Johnny Stevenson (maybe others)" People are wonderfully complex experiences</p><p>My feelings of disappointed with my current commercial role are returning to the forefront of my mind. Many aspects of the role and company seem to be clear in peoples minds but not always effectively shared. I think I understand the role and then something else happens that makes me feel I don't. I believe something will need to change soon for the benefit of all.</p><p>There have been a few highlights with the role, but I expected more of myself and the company. I do set high expectations for myself, although have learned to be more kind about what I can realistically achieve and 'which battles to fight' (figuratively speaking of course).</p><p>During this engagement I have continually reset my expectations about what could be achieved and what I could realistically achieve. There are a couple of peers where there has been conflict without understanding of why I am seen as the cause. I have tried to explore but if people do have issues with me its not clearly being communicated to me.</p><p>In hindsight, many opportunities to get support from my manger and peers were missed. Mostly as we had so many challenges to discuss and partly due to pressures of delivery.</p><p>When a person doesn't have clarity around a problem then there is very little they can do to resolve or adapt.</p><p>A self-reflection review is in progress and its is a good opportunity to take my own time to reflect on my current role and if its still the right fit for me.</p></description><link>https://practical.li/journal/the-wonderful-complexity-of-people/</link> <pubDate>Mon, 04 Nov 2024 00:00:00 +0000</pubDate><source url="https://practical.li/journal/feed_rss_created.xml">Practicalli Personal Journal</source><guid isPermaLink="true">https://practical.li/journal/the-wonderful-complexity-of-people/</guid> <enclosure url="https://practical.li/journal/assets/images/social/the-wonderful-complexity-of-people.png" type="image/png" length="56883" /> </item> <item> <title>Back to work</title> <author>Practicalli Johnny</author> <category>clojure</category> <category>practicalli</category> <description><p>Busy week at work getting ready for a new team member. I spent Friday afternoon building up a relationship and getting accustom to spending time working together. Several weeks of work had been done to get ready for the new starter.</p><p>One of the interesting challenges for anyone starting a new job is to ensure too much enthusiasm doesnt lead to missing important steps. It will be a good first check-in with the new starter to see if they have been too enthusiastic or taken a more measured approach.</p><p>Current issues</p><ul><li><strong>DONE</strong> <a href="https://github.com/practicalli/clojure-cli-config/issues/87">security: add clj-watson to clojure cli config</a></li></ul></description><link>https://practical.li/journal/back-to-work/</link> <pubDate>Mon, 28 Oct 2024 00:00:00 +0000</pubDate><source url="https://practical.li/journal/feed_rss_created.xml">Practicalli Personal Journal</source><guid isPermaLink="true">https://practical.li/journal/back-to-work/</guid> <enclosure url="https://practical.li/journal/assets/images/social/back-to-work.png" type="image/png" length="43152" /> </item> <item> <title>Holiday in Paramout Plus</title> <author>Practicalli Johnny</author> <category>clojure</category> <category>practicalli</category> <description><p>After being ill for most of the week I am finally starting to enjoying my second week of holiday, binging on some Paramount+ and having a lazy Sunday enjoying the extra hour in bed after the end of summer time.</p><p>Updating Practicalli Journal and Clojure CLI Config repositories, fixing links and markdown issues from the Megalinter reports.</p><p>Updating to Megalinter 0.8.1 GitHub action on Practicalli repositories as I work on them. The upgrade will include each repository in the Grafana dashboards for Practicalli projects.</p><p>Issues</p><ul><li><strong>DOING</strong> <a href="https://github.com/practicalli/clojure-cli-config/issues/87">security: add clj-watson to clojure cli config</a></li><li><strong>DOING</strong> zsh environment varaibles not loading into jvm</li></ul></description><link>https://practical.li/journal/holiday-in-paramout-plus/</link> <pubDate>Mon, 21 Oct 2024 00:00:00 +0000</pubDate><source url="https://practical.li/journal/feed_rss_created.xml">Practicalli Personal Journal</source><guid isPermaLink="true">https://practical.li/journal/holiday-in-paramout-plus/</guid> <enclosure url="https://practical.li/journal/assets/images/social/holiday-in-paramout-plus.png" type="image/png" length="48672" /> </item> <item> <title>Hacking on Practicalli content</title> <author>Practicalli Johnny</author> <category>neovim</category> <category>practicalli</category> <category>practicalli</category> <description><p>I am enjoying my 2 week at home vacation (stay-cation) and have already completely rewired my desk, laptops, Monitors and NAS storage devices on the electronic standing desk. It feels a lot more organised and easier to find everything as everything has its place.</p><p>Now I can focus on getting lots of <a href="#practicalli">Practicalli content done</a> (as well as catch up with shows on Paramount+ and maybe a little Polybus on the Playstation4 VR headset)</p><p>I am interested in switching to the Hyprland, although its changing fast so I dug out an older laptop and installed Arch Linux with Hyprland using the <code>archinstall</code> tool. Unfortunately the laptop I used doesnt seem to support Hyprland or something is missing from the install.</p><p>I am taking a stay-cation as I am still recovering from Covid and the weather is also quite grim. I am getting out for walks each day and on Friday I completed a short cycle ride as it was nice and sunny outside. Unfortunately my chest started feeling like it was on fire a few minutes into the ride, so I slowed down and limited myself to 10km.</p><p>I was feeling really sleepy after the ride, so I kept myself awake by sorting through the cardboard boxes in my attic. Many boxes made the ultimate sacrifice (for an uncluttered house) and went to the recycling service.</p></description><link>https://practical.li/journal/hacking-on-practicalli-content/</link> <pubDate>Mon, 14 Oct 2024 00:00:00 +0000</pubDate><source url="https://practical.li/journal/feed_rss_created.xml">Practicalli Personal Journal</source><guid isPermaLink="true">https://practical.li/journal/hacking-on-practicalli-content/</guid> <enclosure url="https://practical.li/journal/assets/images/social/hacking-on-practicalli-content.png" type="image/png" length="50806" /> </item> <item> <title>Practicalli content planning</title> <author>Practicalli Johnny</author> <category>clojure</category> <category>megalinter</category> <category>neovim</category> <category>practicalli</category> <description><p>Hyprland promises to be a great experience but also a potential time drain, so will save most of the investigation and further configuration until the winter break (or if I need a little distraction of the new shiny for motivation).</p><p>Taking two weeks off from work and have some time to work on Practicalli content.</p></description><link>https://practical.li/journal/practicalli-content-planning/</link> <pubDate>Mon, 07 Oct 2024 00:00:00 +0000</pubDate><source url="https://practical.li/journal/feed_rss_created.xml">Practicalli Personal Journal</source><guid isPermaLink="true">https://practical.li/journal/practicalli-content-planning/</guid> <enclosure url="https://practical.li/journal/assets/images/social/practicalli-content-planning.png" type="image/png" length="48310" /> </item> <item> <title>Linux Wayland Compositor & Hyprland</title> <author>Practicalli Johnny</author> <category>debian</category> <category>hyprland</category> <category>linux</category> <category>neovim</category> <category>practicalli</category> <category>slack</category> <description><p>A friend recommended <a href="https://hyprland.org/">Hyprland window manager</a> which is similar to i3 window manager I currently used, but more optomised for the Wayland compositor.</p><p>Practicalli currently uses Regolith Desktop, a complete Linux desktop that leverages Gnome and i3 tiling window manager.</p><p>Regolith Desktop provides quite a rich experience using the <code>regolith-desktop</code> Debian package. I have not had much success with Regolith when running with Wayland (specifically Sway).</p><p>Sway compositor is an implementation of wayland for i3 window manager. Some of my applications do not see to play nice with Sway (e.g. chromium browser scrolling, simplescreenrecorder cannot run on wayland).</p><p>OBS did seem to work okay on wayland, given a sufficiently recent version.</p><p>A friend recommended Hyprland, a tiling compositor that provides the latest Wayland features and lots of eye candy. Its pretty easy to setup on Debian, although there is much additional setup before it would be comparable to Regolith Desktop.</p><p>Neovim Grug plugin is being considered as an alternative to the Spectre tool for search and replacing across a project.</p></description><link>https://practical.li/journal/linux-wayland-compositor--hyprland/</link> <pubDate>Mon, 30 Sep 2024 00:00:00 +0000</pubDate><source url="https://practical.li/journal/feed_rss_created.xml">Practicalli Personal Journal</source><guid isPermaLink="true">https://practical.li/journal/linux-wayland-compositor--hyprland/</guid> <enclosure url="https://practical.li/journal/assets/images/social/linux-wayland-compositor--hyprland.png" type="image/png" length="59724" /> </item> <item> <title>Here Comes The Rain</title> <author>Practicalli Johnny</author> <category>clojure</category> <category>debian</category> <category>practicalli</category> <description><p>Thunderstorms abound which will be good for the vegetables growing in my garden (beetroot, courgettes, parsnips and onions)</p></description><link>https://practical.li/journal/here-comes-the-rain/</link> <pubDate>Mon, 23 Sep 2024 00:00:00 +0000</pubDate><source url="https://practical.li/journal/feed_rss_created.xml">Practicalli Personal Journal</source><guid isPermaLink="true">https://practical.li/journal/here-comes-the-rain/</guid> <enclosure url="https://practical.li/journal/assets/images/social/here-comes-the-rain.png" type="image/png" length="46556" /> </item> <item> <title>MegaLinter Grafana Dashboards</title> <author>Practicalli Johnny</author> <category>dashboard</category> <category>debian</category> <category>github</category> <category>grafana</category> <category>megalinter</category> <category>practicalli</category> <description><p>As Practicalli projects are being updated to Megalinter version 8 it seemed a good time to try the Megalinter API reporter to publish data to use with Grafana. A chance to learn more about creating Dashboards and if Grafana is any easier than DataDog.</p><p>!!! WARNING "Megalinter not publishing logs on Grafana yet" Unfortunately I havent been able to make the Megalinter API Reporter work with this journal project, Clojure CLI Config or a new megalinter-test project I created.</p><p>Health is a little better after resting over the weekend, although still have lots of symptoms.</p><p>!!! EXAMPLE "Megalinter Grafana dashboard example project" <a href="https://github.com/practicalli/megalinter-test">:fontawesome-brands-github: Practicalli Megalinter-Test</a>{target=_blank .md-button}</p><pre><code>NOTE: I am trying to diagnose why this project does not seem to be sending logs to Grafana.</code></pre></description><link>https://practical.li/journal/megalinter-grafana-dashboards/</link> <pubDate>Mon, 16 Sep 2024 00:00:00 +0000</pubDate><source url="https://practical.li/journal/feed_rss_created.xml">Practicalli Personal Journal</source><guid isPermaLink="true">https://practical.li/journal/megalinter-grafana-dashboards/</guid> <enclosure url="https://practical.li/journal/assets/images/social/megalinter-grafana-dashboards.png" type="image/png" length="53772" /> </item> <item> <title>Megalinter 8 and monthly version updates</title> <author>Practicalli Johnny</author> <category>clojure</category> <category>practicalli</category> <description><p>Megalinter updates to version 8 using the megalinter runner tool, adding a Makefile task to simplify the command line (so I dont have to remember the command).</p><p>Material for MkDocs provides a nice diff view using the <code>diff</code> language for a code block. Add or copy a diff into the code block, ensuring the <code>-</code> and <code>+</code> signs are included and the diff is automatically highlighted. See the <a href="#megalinter">Megalinter</a> section of this post for an example.</p><p>Feeling quite low the last few weeks, mostly due to continued Covid symptoms, low blood oxygen and lack of energy. Waking up I feel like I have experienced carbon dioxide poisoning (which I have experienced working on a mushroom farm). I am disorientated, dizzy and feel quite terrible.</p></description><link>https://practical.li/journal/megalinter-8-and-monthly-version-updates/</link> <pubDate>Mon, 09 Sep 2024 00:00:00 +0000</pubDate><source url="https://practical.li/journal/feed_rss_created.xml">Practicalli Personal Journal</source><guid isPermaLink="true">https://practical.li/journal/megalinter-8-and-monthly-version-updates/</guid> <enclosure url="https://practical.li/journal/assets/images/social/megalinter-8-and-monthly-version-updates.png" type="image/png" length="62600" /> </item> <item> <title>Clojure 1.12 and Learn Clojure book</title> <author>Practicalli Johnny</author> <category>clojure</category> <category>practicalli</category> <category>practicalli</category> <description><p>Work on Practicalli Learn Clojure book, a practical guide to getting comfortable working with Clojure. A full guide to using Clojure is in the Practicalli Clojure book.</p><p>Added RSS feed for Journal, although I feel that all these blogs should be merged into the <a href="https://practical.li/blog">https://practical.li/blog</a> site for a single collection or articles. The articles can be categorised to keep them separate.</p><p>Health is still recovering from a little Covid symptoms. Took Monday off work and slept most of the day.</p></description><link>https://practical.li/journal/clojure-112-and-learn-clojure-book/</link> <pubDate>Mon, 02 Sep 2024 00:00:00 +0000</pubDate><source url="https://practical.li/journal/feed_rss_created.xml">Practicalli Personal Journal</source><guid isPermaLink="true">https://practical.li/journal/clojure-112-and-learn-clojure-book/</guid> <enclosure url="https://practical.li/journal/assets/images/social/clojure-112-and-learn-clojure-book.png" type="image/png" length="55872" /> </item> <item> <title>Clojure specific Which-key menu</title> <author>Practicalli Johnny</author> <category>neovim</category> <category>practicalli</category> <description><p>Whilst looking for a Neovim way to have language specific configuration, I discovered the <code>after/ftplugin</code> approach. This allows a configuration to be loaded when a buffer is switched to a specific language.</p></description><link>https://practical.li/journal/clojure-specific-which-key-menu/</link> <pubDate>Mon, 19 Aug 2024 00:00:00 +0000</pubDate><source url="https://practical.li/journal/feed_rss_created.xml">Practicalli Personal Journal</source><guid isPermaLink="true">https://practical.li/journal/clojure-specific-which-key-menu/</guid> <enclosure url="https://practical.li/journal/assets/images/social/clojure-specific-which-key-menu.png" type="image/png" length="55807" /> </item> <item> <title>Tetris and the fall of the USSR (and Neovim Conjure menu)</title> <author>Practicalli Johnny</author> <category>clojure</category> <category>neovim</category> <category>practicalli</category> <description><p>Enjoyed watching the <a href="https://en.wikipedia.org/wiki/Tetris">Tetris movie</a> and wondered just how much was real and dramatised. Reading the background to the game it does seem the main thread of the movie is accurate, with perhaps some additional dramatic effect. It was a very enjoyable movie regardless.</p><p>I do remember the break-up of the USSR when it happened, first with Gorbachev as leader and then Boris Yeltsin. Then the Oligarchs (super rich) moved in and supported a more draconian leader in Putin (assumingly so they could keep hold of all their money).</p><p>I also remember Robert Maxwell as a disgraced billionaire that stole from his own company and mysteriously vanished from his luxury yacht.</p></description><link>https://practical.li/journal/tetris-and-the-fall-of-the-ussr-and-neovim-conjure-menu/</link> <pubDate>Mon, 12 Aug 2024 00:00:00 +0000</pubDate><source url="https://practical.li/journal/feed_rss_created.xml">Practicalli Personal Journal</source><guid isPermaLink="true">https://practical.li/journal/tetris-and-the-fall-of-the-ussr-and-neovim-conjure-menu/</guid> <enclosure url="https://practical.li/journal/assets/images/social/tetris-and-the-fall-of-the-ussr-and-neovim-conjure-menu.png" type="image/png" length="65176" /> </item> <item> <title>HTTP Message Signing investigation</title> <author>Practicalli Johnny</author> <category>clojure</category> <category>practicalli</category> <description><p>API Security is typically managed by issuing a token for authentication. Only requests that include a valid token are processed, any requests with an expired or missing token are rejected. HTTP code 401 Unauthorised error message is returned for rejected requests.</p><p>When dealing with very sensitive data and higher risk actions common in financial services, additional security mechanisms are required. So I have been looking at mTLS and <a href="#http-message-signatures">HTTP Message Signatures</a> (RFC9421) this week.</p><p>Not going to be a productive week as I am full of flu. Given the time of year its most likely a variant of Covid. So far I've only had a headache, congested chest / nose / ears and some fatigue. Taking lots of paracetamol and drinking lots of water to try keep the inflammation at bay.</p><p>Edit: I was mostly okay by the weekend, although still had a sore throat and coughing.</p></description><link>https://practical.li/journal/http-message-signing-investigation/</link> <pubDate>Mon, 05 Aug 2024 00:00:00 +0000</pubDate><source url="https://practical.li/journal/feed_rss_created.xml">Practicalli Personal Journal</source><guid isPermaLink="true">https://practical.li/journal/http-message-signing-investigation/</guid> <enclosure url="https://practical.li/journal/assets/images/social/http-message-signing-investigation.png" type="image/png" length="58404" /> </item> <item> <title>A very hot week</title> <author>Practicalli Johnny</author> <category>clojure</category> <category>practicalli</category> <description><p>Its a bit too hot for rational thought... and caught flu at the end of the week, so not much happened.</p><p>Time for some project maintenance courtesy of the <a href="https://practical.li/engineering-playbook/continuous-integration/github/workflows/practicalli/#scheduled-version-check">scheduled version GitHub workflow</a>, run at the start of each month.</p></description><link>https://practical.li/journal/a-very-hot-week/</link> <pubDate>Mon, 29 Jul 2024 00:00:00 +0000</pubDate><source url="https://practical.li/journal/feed_rss_created.xml">Practicalli Personal Journal</source><guid isPermaLink="true">https://practical.li/journal/a-very-hot-week/</guid> <enclosure url="https://practical.li/journal/assets/images/social/a-very-hot-week.png" type="image/png" length="44854" /> </item> <item> <title>Data Driven Components & Neovim updates</title> <author>Practicalli Johnny</author> <category>astro</category> <category>clojure</category> <category>clojure</category> <category>donut</category> <category>integrant</category> <category>neovim</category> <description><p><a href="https://github.com/practicalli/astro">:fontawesome-brands-github: Practicalli Astro</a> config for Clojure development with Neovim initial release.</p><p>Presented my experiences with Component libraries to London Clojurians this week, specifically comparing Integrant and Donut-party/system. I discussed my Service REPL workflow to show the benefits and constraints of these two libraries.</p><p>For component libraries to work well, then code should be reloadable. There are a few parts of the Clojure language that do make it harder to reload code, (deftype, defrecord, etc), although I tend to avoid those parts anyway.</p><p>Issues this week</p><p><a href="https://github.com/practicalli/astro">:fontawesome-brands-github: practicalli/astro</a>:</p><ul><li>DONE <a href="https://github.com/practicalli/astro/issues/10">:fontawesome-brands-github: search: find text pattern in specific files and file types</a></li><li>DONE <a href="https://github.com/practicalli/astro/issues/9">:fontawesome-brands-github: config: capitalise Leader &amp; LocalLeader - vim convention</a></li><li>DONE <a href="https://github.com/practicalli/astro/issues/8">:fontawesome-brands-github: plugin: conjure sub-menu key labels in which-key version 3</a></li><li>DONE <a href="https://github.com/practicalli/astro/issues/7">:fontawesome-brands-github: plugin: spectre moved to search category in astrocommunity</a></li><li>DONE <a href="https://github.com/practicalli/astro/issues/6">:fontawesome-brands-github: plugin: better-escape.nvim rewrite required config change</a></li></ul></description><link>https://practical.li/journal/data-driven-components--neovim-updates/</link> <pubDate>Mon, 22 Jul 2024 00:00:00 +0000</pubDate><source url="https://practical.li/journal/feed_rss_created.xml">Practicalli Personal Journal</source><guid isPermaLink="true">https://practical.li/journal/data-driven-components--neovim-updates/</guid> <enclosure url="https://practical.li/journal/assets/images/social/data-driven-components--neovim-updates.png" type="image/png" length="64286" /> </item> <item> <title>Montly Clojure Library updates</title> <author>Practicalli Johnny</author> <category>bazel</category> <category>clojure</category> <category>make</category> <category>practicalli</category> <description><p>Exploring the mysteries of the Bazel build tool at work. Whilst technically its a very powerful tool it really lacks a good developer experience.</p><p>Its supposed to be a more powerful make, although ironically I use a <code>Makefile</code> so that Bazel is much easier to use.</p><p>It could be an opportunity to use Babashka, but that would be more work than using a Makefile as I dont have much Babashka experience.</p></description><link>https://practical.li/journal/montly-clojure-library-updates/</link> <pubDate>Mon, 15 Jul 2024 00:00:00 +0000</pubDate><source url="https://practical.li/journal/feed_rss_created.xml">Practicalli Personal Journal</source><guid isPermaLink="true">https://practical.li/journal/montly-clojure-library-updates/</guid> <enclosure url="https://practical.li/journal/assets/images/social/montly-clojure-library-updates.png" type="image/png" length="55159" /> </item> <item> <title>Monthly Library Updates for Practicalli Projects</title> <author>Practicalli Johnny</author> <category>clojure</category> <category>practicalli</category> <description><p>Monthly updates for Practicalli projects, driven by a scheduled version GitHub workflow that uses antq to report on project library dependencies and GitHub action library versions.</p><ul><li>Release: Clojure CLI Config - 2024-07-07</li><li>Release: Project Templates - 2024-07-07</li></ul><p>Which-key version 3 released, fixing localleader issue and providing a horizontal menu option.</p></description><link>https://practical.li/journal/monthly-library-updates-for-practicalli-projects/</link> <pubDate>Mon, 08 Jul 2024 00:00:00 +0000</pubDate><source url="https://practical.li/journal/feed_rss_created.xml">Practicalli Personal Journal</source><guid isPermaLink="true">https://practical.li/journal/monthly-library-updates-for-practicalli-projects/</guid> <enclosure url="https://practical.li/journal/assets/images/social/monthly-library-updates-for-practicalli-projects.png" type="image/png" length="63741" /> </item> <item> <title>Flexiana Interview</title> <author>Practicalli Johnny</author> <category>clojure</category> <category>practicalli</category> <description><p>I enjoyed the interview with Flexiana team this week, they are very friendly and it we had some very interesting discussions. I included my interview preparation notes which were mosty the same as shared in the video.</p><p>A blip with Emacs 29.4 release stopped the which-key menu from showing when in a major mode. This affected both the leader and local leader key. Within a couple of hours the issue was resolved before I really figured out the cause. I installed Emacs 29.4 on Termux to replicate an issue that was reported in the #spacemacs channel of the Clojurians Community slack community.</p></description><link>https://practical.li/journal/flexiana-interview/</link> <pubDate>Mon, 01 Jul 2024 00:00:00 +0000</pubDate><source url="https://practical.li/journal/feed_rss_created.xml">Practicalli Personal Journal</source><guid isPermaLink="true">https://practical.li/journal/flexiana-interview/</guid> <enclosure url="https://practical.li/journal/assets/images/social/flexiana-interview.png" type="image/png" length="43416" /> </item> <item> <title>Updating Practicalli Neovim</title> <author>Practicalli Johnny</author> <category>astronvim</category> <category>neovim</category> <category>practicalli</category> <description><p><a href="https://github.com/practicalli/astro">Practicalli Astro config</a> is not very stable so its time to refactor the <a href="https://practical.li/neovim">Practicalli Neovim</a> book now that the <a href="https://github.com/practicalli/astro">Practicalli Astro</a> configuration is established.</p></description><link>https://practical.li/journal/updating-practicalli-neovim/</link> <pubDate>Mon, 24 Jun 2024 00:00:00 +0000</pubDate><source url="https://practical.li/journal/feed_rss_created.xml">Practicalli Personal Journal</source><guid isPermaLink="true">https://practical.li/journal/updating-practicalli-neovim/</guid> <enclosure url="https://practical.li/journal/assets/images/social/updating-practicalli-neovim.png" type="image/png" length="50638" /> </item> <item> <title>Conjure LSP bug & Cycling video editing</title> <author>Practicalli Johnny</author> <category>clojure</category> <category>conjure</category> <category>cycling</category> <category>neovim</category> <category>practicalli</category> <description><p>Updated to Kitty 0.35.1 easily and switching between dark and light themes working instantly again.</p><p>Diagnosed a 'new buffer' error with Conjure when using Neovim 0.9.0 and when opening a Clojure file, although everything works well in 0.10.0. EDIT: The maintainer added a fix to the <code>develop</code> branch for testing.</p><p><a href="https://github.com/Olical/conjure/issues/582">#582 REVIEW: Conjure throws new Buffer error</a>{target=_blank .md-button}</p><p>Video editing of footage taken by the front mounted camera on my bicycle. Advanced cycle training at Gravesend at the start of June.<a href="https://youtu.be/7PnCrLdTmUo">:fontawesome-brands-youtube: Bigfoot Cycling Club at Gravesent Cyclopark</a></p><p>Took a few days away from the computer to work on the garden as its nice and sunny. A mostly sunny ride on Saturday around the Kent countryside.</p></description><link>https://practical.li/journal/conjure-lsp-bug--cycling-video-editing/</link> <pubDate>Mon, 17 Jun 2024 00:00:00 +0000</pubDate><source url="https://practical.li/journal/feed_rss_created.xml">Practicalli Personal Journal</source><guid isPermaLink="true">https://practical.li/journal/conjure-lsp-bug--cycling-video-editing/</guid> <enclosure url="https://practical.li/journal/assets/images/social/conjure-lsp-bug--cycling-video-editing.png" type="image/png" length="65948" /> </item> <item> <title>Neovim on Termux enhancements</title> <author>Practicalli Johnny</author> <category>neovim</category> <category>practicalli</category> <description><p>More Neovim updates and getting closer to a release of Practicalli Astro-config</p><p>I have been using Neovim (and Emacs) on Termux, so I can code on my Android tablet or Android smart phone. I typically use an external keyboard (e.g. Keyboard.io Atreus or Model100), especially when considerable typing is involved.</p><p>As the hardware and compilation tooling is different for Android Linux (compared to amd64 linux) the Clojure and Lua LSP language servers would not install via the Mason manager. As these two languages are in the top 3 languages I use, then it is a great boost to get these servers working locally and configuring Neovim to use them instead.</p><p>I use the <code>date</code> command when I had a need to tweak the time on my Linux computer, saves launching the <strong>Settings</strong> app and using the mouse.</p><p>!!! INFO "Timezones made easy" <a href="https://time.is/">time.is</a> makes figuring out timezones really simple. See the current time in any timezone across the world.</p><pre><code>time.is very useful for events where people attend from different timezones. Set the local time and share a link for others who will see the event time in their own timezone.</code></pre><h2>Neovim</h2><p>I'm making some changes to the Practicalli AstroNvim configuration (AstroNvim4) over the next few days.</p><p>All my personal Neovim &amp; plugin options (and associated workflow biases) will only be in <code>lua/plugins/practicalli.lua</code>. With these options only in one file, anyone else using the configuration can easily disable them.</p><p>I will encourage other users to create there own <code>lua/plugins/personal.lua</code> customisation so any changes from upstream will be easier to merge.</p><p>The GitHub repository will be renamed to <code>practicalli/astro-config</code> which its much easier to write and say during screencasts. GitHub should redirect when pulling updates</p><p>This week I will update Practicalli Neovim book install guide with new repo and further info on how to use the config effectively (especially with your own customisations)</p><p>Then the first official release of the config will be created via GitHub releases.</p><p>If I have time, there are lots of things to add to Practicalli Neovim book too (including a few more plugins I'm using in the config)</p></description><link>https://practical.li/journal/neovim-on-termux-enhancements/</link> <pubDate>Mon, 10 Jun 2024 00:00:00 +0000</pubDate><source url="https://practical.li/journal/feed_rss_created.xml">Practicalli Personal Journal</source><guid isPermaLink="true">https://practical.li/journal/neovim-on-termux-enhancements/</guid> <enclosure url="https://practical.li/journal/assets/images/social/neovim-on-termux-enhancements.png" type="image/png" length="51876" /> </item> <item> <title>Fixing Neovim Treesitter breaking changes</title> <author>Practicalli Johnny</author> <category>astronvim</category> <category>github</category> <category>neovim</category> <category>practicalli</category> <category>ssh</category> <description><p>The sun is out, the sky is blue... and I had the opportunity to understand some Neovim plugins a little more, in order to fix a breaking change with Neovim Treesitter support for Clojure.</p><p>!!! INFO "Pull Requests this week"</p><pre><code>- MERGED: [#7 queries: clojure has-type? updated to kind-eq?](https://github.com/PaterJason/nvim-treesitter-sexp/pull/7) for nvim-treesitter-sexp project</code></pre></description><link>https://practical.li/journal/fixing-neovim-treesitter-breaking-changes/</link> <pubDate>Mon, 03 Jun 2024 00:00:00 +0000</pubDate><source url="https://practical.li/journal/feed_rss_created.xml">Practicalli Personal Journal</source><guid isPermaLink="true">https://practical.li/journal/fixing-neovim-treesitter-breaking-changes/</guid> <enclosure url="https://practical.li/journal/assets/images/social/fixing-neovim-treesitter-breaking-changes.png" type="image/png" length="62426" /> </item> <item> <title>Multiple SSH keys for Commercial and Community work</title> <author>Practicalli Johnny</author> <category>git</category> <category>practicalli</category> <description><p>Its easy to go down a rabbit hole of your own making when trying to make something complex work. Taking a step back allows for a much simpler approach to be considered.</p><p>I realised there was a much simpler approach to managing multiple SSH keys, especially when one of those keys is for commercial work that requires Single Sign-On authorisation.</p></description><link>https://practical.li/journal/multiple-ssh-keys-for-commercial-and-community-work/</link> <pubDate>Mon, 27 May 2024 00:00:00 +0000</pubDate><source url="https://practical.li/journal/feed_rss_created.xml">Practicalli Personal Journal</source><guid isPermaLink="true">https://practical.li/journal/multiple-ssh-keys-for-commercial-and-community-work/</guid> <enclosure url="https://practical.li/journal/assets/images/social/multiple-ssh-keys-for-commercial-and-community-work.png" type="image/png" length="67263" /> </item> <item> <title>Refactor AstroNvim Clojure pack</title> <author>Practicalli Johnny</author> <category>neovim</category> <category>practicalli</category> <description><p>Pull requests this week</p><ul><li>:fontawesome-solid-code-pull-request: <strong>MERGED</strong> <a href="https://github.com/folke/ts-comments.nvim/pull/19">Add Clojure comment patterns to ts-comments.nvim</a></li><li>:fontawesome-solid-code-pull-request: <strong>MERGED</strong> <a href="https://github.com/AstroNvim/astrocommunity/pull/982">Modularise Astrocommunity Clojure pack</a></li><li>:fontawesome-solid-code-pull-request: <strong>MERGED</strong> <a href="https://github.com/AstroNvim/astrocommunity/pull/991">Update AstroNvim Cloure pack description &amp; simplify examples</a></li><li>:fontawesome-solid-code-pull-request: <strong>MERGED</strong> <a href="https://github.com/AstroNvim/astrocommunity/pull/992">Fix vim-visual-multi dependency name</a></li></ul><p>Total commits this week: 37</p><p>Submitted <a href="https://github.com/AstroNvim/astrocommunity/pull/982">a pull request to refactor the AstroNvim Community Clojure language pack</a> which I <a href="https://github.com/AstroNvim/astrocommunity/pull/248">contributed in June 2023</a>.</p><ul><li>add nvim-treesitter-sexp plugin</li><li>add example of disabling / configuring parinfer plugin</li><li>add ts-comment.nvim to support <code>;;</code> and <code>;</code> comment characters</li><li>remove autocmd from conjure plugin (no longer needed)</li><li>remove most of the opinionated conjure configuration overrides, although still hiding the repl log buffer (HUD) by default as its nicer as a separate tab. Maybe if I can have it open by default as a tab, then I could live with having the HUD open on REPL startup (a nice way to check things are working)</li></ul><p>Still sleepy from travel to the company off-site last week and the cycle ride on Saturday. Although I did manage some work in the garden on Sunday.</p></description><link>https://practical.li/journal/refactor-astronvim-clojure-pack/</link> <pubDate>Mon, 20 May 2024 00:00:00 +0000</pubDate><source url="https://practical.li/journal/feed_rss_created.xml">Practicalli Personal Journal</source><guid isPermaLink="true">https://practical.li/journal/refactor-astronvim-clojure-pack/</guid> <enclosure url="https://practical.li/journal/assets/images/social/refactor-astronvim-clojure-pack.png" type="image/png" length="59095" /> </item> <item> <title>Company offsite week</title> <author>Practicalli Johnny</author> <category>astronvim</category> <category>neovim</category> <category>practicalli</category> <description><p>Travelled for a work event in Portugal with a chance to meet people I work with face to face for the first time. It was a very enjoyable and also quite intensive event. I kept myself busy to help combat fatigue from travelling and manage a swim each morning and evening whilst I was at the hotel.</p><p>I am accustom to working remotely since 2010, having worked for companies based outside of the UK. It is always very valuable to meet people face to face and can start or strengthen a relationship.</p></description><link>https://practical.li/journal/company-offsite-week/</link> <pubDate>Mon, 13 May 2024 00:00:00 +0000</pubDate><source url="https://practical.li/journal/feed_rss_created.xml">Practicalli Personal Journal</source><guid isPermaLink="true">https://practical.li/journal/company-offsite-week/</guid> <enclosure url="https://practical.li/journal/assets/images/social/company-offsite-week.png" type="image/png" length="51274" /> </item> <item> <title>Gardening in the mornings</title> <author>Practicalli Johnny</author> <category>clojure</category> <category>practicalli</category> <description><p>A new month so time to update libraries across Practicalli projects.</p><p>Bank holiday Monday and two personal holidays this week, so only two days at work and very few meetings, yay!. Time to prepare for the company offsite event next week and see how lightly I can pack.</p><p>I made a big impact on upgrading the garden this week. All the paving stones at the end of the garden were levelled so the shed is no longer on a slope. A thick weed surpressing membrane was fitted underneath all the paving stones.</p><p>The raised garden bed was be reworked by adjusting the top of the railway sleepers to be level to the top of the paving stones. This adds a nice clean line with the garden and makes maintenance in and around the garden easier. Weed surpressing membrane was added to the side and underneath of each sleeper. Spare wood panels was used to keep the membrane in plate and to also add more robustness to the sleepers.</p><p>Most of the work was done in the early mornings as the weather was quite hot.</p></description><link>https://practical.li/journal/gardening-in-the-mornings/</link> <pubDate>Mon, 06 May 2024 00:00:00 +0000</pubDate><source url="https://practical.li/journal/feed_rss_created.xml">Practicalli Personal Journal</source><guid isPermaLink="true">https://practical.li/journal/gardening-in-the-mornings/</guid> <enclosure url="https://practical.li/journal/assets/images/social/gardening-in-the-mornings.png" type="image/png" length="50849" /> </item> <item> <title>500 Commit Streak on GitHub</title> <author>Practicalli Johnny</author> <category>clojure</category> <category>practicalli</category> <description><p>500 day commit streak on GitHub reached today. This was legitimately achieved by doing a small amount of work each day.</p><p>I am not actively coding and committing on a regular basis in my current role, so the large majority of these commits are for Practicalli or Open Source projects.</p><p><img alt="GitHub stats - 500 day commit streak" src="https://github.com/practicalli/graphic-design/blob/live/github/github-stats-streak-500-days-dark.png?raw=true"></p><p>Continuing to simplify the Practicalli AstroNvim User Config, so changes from the AstroNvim template are in new files or in <code>community.lua</code>.</p><p>The most visual opinionated changes are in <code>practicalli.lua</code>, such as dashboard logo and theme.</p><p>Motivated to work on the <a href="https://practical.li/sustainable-life">:fontawesome-solid-book-open: Practicalli Sustainable Life</a> book after joining a sustainability working group at the company.</p></description><link>https://practical.li/journal/500-commit-streak-on-github/</link> <pubDate>Mon, 29 Apr 2024 00:00:00 +0000</pubDate><source url="https://practical.li/journal/feed_rss_created.xml">Practicalli Personal Journal</source><guid isPermaLink="true">https://practical.li/journal/500-commit-streak-on-github/</guid> <enclosure url="https://practical.li/journal/assets/images/social/500-commit-streak-on-github.png" type="image/png" length="54356" /> </item> <item> <title>Practicalli Project Template updates</title> <author>Practicalli Johnny</author> <category>clojure</category> <category>practicalli</category> <description><p>Adding some nice little improvements to the <a href="https://github.com/practicalli/project-templates">:fontawesome-brands-github: Practicalli Project Templates</a></p></description><link>https://practical.li/journal/practicalli-project-template-updates/</link> <pubDate>Mon, 22 Apr 2024 00:00:00 +0000</pubDate><source url="https://practical.li/journal/feed_rss_created.xml">Practicalli Personal Journal</source><guid isPermaLink="true">https://practical.li/journal/practicalli-project-template-updates/</guid> <enclosure url="https://practical.li/journal/assets/images/social/practicalli-project-template-updates.png" type="image/png" length="52400" /> </item> <item> <title>Its April Fool</title> <author>Practicalli Johnny</author> <category>astronvim</category> <category>git</category> <category>neovim</category> <category>practicalli</category> <description><p>Adding SSH keys to the YubiKey hardware security key provides convenience of SSH key use, especially when required for multiple computers.</p><p>Using a YubiKey to keep a single SSH key pair removes the need to generate a key pair for each computer.</p><p>Using one SSH key avoids the need for multiple entries in the allowed-signatures file to check locally that a commit has been signed.</p></description><link>https://practical.li/journal/its-april-fool/</link> <pubDate>Mon, 01 Apr 2024 00:00:00 +0000</pubDate><source url="https://practical.li/journal/feed_rss_created.xml">Practicalli Personal Journal</source><guid isPermaLink="true">https://practical.li/journal/its-april-fool/</guid> <enclosure url="https://practical.li/journal/assets/images/social/its-april-fool.png" type="image/png" length="41641" /> </item> <item> <title>Git Multiple SSH Keys & Neovim</title> <author>Practicalli Johnny</author> <category>clojure</category> <category>git</category> <category>neovim</category> <category>practicalli</category> <description><p>A short week at work made even shorter by a company day to celebrate going live. A chance to unwind and reflect.</p><p><a href="https://github.com/neovim/neovim/milestones">Neovim 0.10 is planned for 1 May 2024</a>. Plugins should be unafected, although actively developing plugins like Neogit are trying to used parts of the Neovim API. The parts of Neogit that use 0.10 api should be more efficient, although I assume there wont be a noticable difference in functionality.</p><p>I will update Neovim to 0.10 when AstroNvim confirms it is working well with that release.</p></description><link>https://practical.li/journal/git-multiple-ssh-keys--neovim/</link> <pubDate>Mon, 25 Mar 2024 00:00:00 +0000</pubDate><source url="https://practical.li/journal/feed_rss_created.xml">Practicalli Personal Journal</source><guid isPermaLink="true">https://practical.li/journal/git-multiple-ssh-keys--neovim/</guid> <enclosure url="https://practical.li/journal/assets/images/social/git-multiple-ssh-keys--neovim.png" type="image/png" length="56395" /> </item> <item> <title>Having a Donut Party with system components</title> <author>Practicalli Johnny</author> <category>clojure</category> <category>donut</category> <category>practicalli</category> <category>repl-workflow</category> <description><p>Not quite back to full health yet, so took it easy at the weekend.</p><p>More work on restoring spare bicycles so I can sell them or otherwise find a good home.</p><p>Continued the refactor of the Practicalli Service template, specifically refining the design of the system config and helper functions to support a development REPL workflow.</p></description><link>https://practical.li/journal/having-a-donut-party-with-system-components/</link> <pubDate>Mon, 11 Mar 2024 00:00:00 +0000</pubDate><source url="https://practical.li/journal/feed_rss_created.xml">Practicalli Personal Journal</source><guid isPermaLink="true">https://practical.li/journal/having-a-donut-party-with-system-components/</guid> <enclosure url="https://practical.li/journal/assets/images/social/having-a-donut-party-with-system-components.png" type="image/png" length="62762" /> </item> <item> <title>Debian Linux almost everywhere</title> <author>Practicalli Johnny</author> <category>clojure</category> <category>practicalli</category> <description><p>Enjoying being back in Debian Linux world, with <a href="https://regolith-desktop.com/">regolith desktop</a> as the tiling window manager.</p><p>I have several Lenovo laptops and all but one are now upgraded to Debian Linux, using the testing version of the distribution.</p><p>The most significant difference with Debian Linux is the use of a separate root account for administration, rather than using <code>sudo</code> in Ubuntu Linux.</p></description><link>https://practical.li/journal/debian-linux-almost-everywhere/</link> <pubDate>Sun, 10 Mar 2024 00:00:00 +0000</pubDate><source url="https://practical.li/journal/feed_rss_created.xml">Practicalli Personal Journal</source><guid isPermaLink="true">https://practical.li/journal/debian-linux-almost-everywhere/</guid> <enclosure url="https://practical.li/journal/assets/images/social/debian-linux-almost-everywhere.png" type="image/png" length="54628" /> </item> <item> <title>Springing back into life slowly</title> <author>Practicalli Johnny</author> <category>clojure</category> <category>practicalli</category> <description><p>The last month has been tough due to illness, although still managed to do a little work with Practicalli to keep me motivated (both for work and my own personal health)</p><p>I though the Practicalli Project Templates had broken when I tried to create a new service project. It took me an hour or so to realise I had simply been using the command with the wrong argument, doh!</p></description><link>https://practical.li/journal/springing-back-into-life-slowly/</link> <pubDate>Mon, 04 Mar 2024 00:00:00 +0000</pubDate><source url="https://practical.li/journal/feed_rss_created.xml">Practicalli Personal Journal</source><guid isPermaLink="true">https://practical.li/journal/springing-back-into-life-slowly/</guid> <enclosure url="https://practical.li/journal/assets/images/social/springing-back-into-life-slowly.png" type="image/png" length="55385" /> </item> <item> <title>Alias Shell that updates Shell</title> <author>Practicalli Johnny</author> <category>clojure</category> <category>practicalli</category> <description><p>As this week is mosly tweaks for Zsh history, I've titled this journal entry to be a play on words from the Shakesphere play 'Alls well that ends well'.</p><p>The <code>fd</code> built-in command for Zsh is a very effective way to keep the command history clean.</p></description><link>https://practical.li/journal/alias-shell-that-updates-shell/</link> <pubDate>Mon, 26 Feb 2024 00:00:00 +0000</pubDate><source url="https://practical.li/journal/feed_rss_created.xml">Practicalli Personal Journal</source><guid isPermaLink="true">https://practical.li/journal/alias-shell-that-updates-shell/</guid> <enclosure url="https://practical.li/journal/assets/images/social/alias-shell-that-updates-shell.png" type="image/png" length="54203" /> </item> <item> <title>Engineering Practices</title> <author>Practicalli Johnny</author> <category>practicalli</category> <description><p>Illness is all around. Around 12% of people in Germany are currenly ill through covid, flu or a stomach virus. I have some relatively mild symptoms this week.</p><p>The hunt for a new place to live continues, investigating lots of facinating places in Scotland. Discovered an Ecopark with sustainably built housing. There is one house for sale and some new builds in the near future. Requested a build plan for the new build houses.</p></description><link>https://practical.li/journal/engineering-practices/</link> <pubDate>Mon, 19 Feb 2024 00:00:00 +0000</pubDate><source url="https://practical.li/journal/feed_rss_created.xml">Practicalli Personal Journal</source><guid isPermaLink="true">https://practical.li/journal/engineering-practices/</guid> <enclosure url="https://practical.li/journal/assets/images/social/engineering-practices.png" type="image/png" length="47279" /> </item> <item> <title>The editors strike back</title> <author>Practicalli Johnny</author> <category>practicalli</category> <description><p>Interesting edge cases with evil-cleverparens and another question about choice of editor for complete beginners to programming.</p><p>Covid strikes again. Wiped out by the end of the week.</p></description><link>https://practical.li/journal/the-editors-strike-back/</link> <pubDate>Mon, 12 Feb 2024 00:00:00 +0000</pubDate><source url="https://practical.li/journal/feed_rss_created.xml">Practicalli Personal Journal</source><guid isPermaLink="true">https://practical.li/journal/the-editors-strike-back/</guid> <enclosure url="https://practical.li/journal/assets/images/social/the-editors-strike-back.png" type="image/png" length="47965" /> </item> <item> <title>Striving toward consistency</title> <author>Practicalli Johnny</author> <category>practicalli</category> <description><p>Will feel good to have all Practicalli website content have a consisten look.</p><p>Material for MkDocs really helps me convey information effectively (at least in my own view).</p><p>Still have a few covid symptoms, but not as much this week. Usually only in the mornings.</p></description><link>https://practical.li/journal/striving-toward-consistency/</link> <pubDate>Mon, 05 Feb 2024 00:00:00 +0000</pubDate><source url="https://practical.li/journal/feed_rss_created.xml">Practicalli Personal Journal</source><guid isPermaLink="true">https://practical.li/journal/striving-toward-consistency/</guid> <enclosure url="https://practical.li/journal/assets/images/social/striving-toward-consistency.png" type="image/png" length="55157" /> </item> <item> <title>No one is omnipotent</title> <author>Practicalli Johnny</author> <category>practicalli</category> <description><p>Understand what is the most valuable thing and focus on attaing it.</p><p>Technical writing is a skill that regularly needs practice.</p></description><link>https://practical.li/journal/no-one-is-omnipotent/</link> <pubDate>Mon, 29 Jan 2024 00:00:00 +0000</pubDate><source url="https://practical.li/journal/feed_rss_created.xml">Practicalli Personal Journal</source><guid isPermaLink="true">https://practical.li/journal/no-one-is-omnipotent/</guid> <enclosure url="https://practical.li/journal/assets/images/social/no-one-is-omnipotent.png" type="image/png" length="47244" /> </item> <item> <title>Quiet before the storm</title> <author>Practicalli Johnny</author> <category>practicalli</category> <description><p>Its not as windy as previous weeks, but there is another storm on its way.</p><p>Feeling too tired for exercise over the weekend, need to pace myself at work a little better.</p><p>Hopefully as the weather gets warmer or at least sunnier it will be easier to do more outside activities.</p></description><link>https://practical.li/journal/quiet-before-the-storm/</link> <pubDate>Mon, 22 Jan 2024 00:00:00 +0000</pubDate><source url="https://practical.li/journal/feed_rss_created.xml">Practicalli Personal Journal</source><guid isPermaLink="true">https://practical.li/journal/quiet-before-the-storm/</guid> <enclosure url="https://practical.li/journal/assets/images/social/quiet-before-the-storm.png" type="image/png" length="48189" /> </item> <item> <title>Warmer weather</title> <author>Practicalli Johnny</author> <category>astronvim</category> <category>clojure</category> <category>neovim</category> <category>practicalli</category> <description><p>Practicalli AstroNvim User Config changed to be as additive as possible, leaving the template as unchanged as possible.</p><p>The sunnier weather is a boots to motivation, although its still very windy. At least I can get into the garden without sinking.</p><p>Another Saturday morning ride, a tough experience although not completely exhausted afterward.</p></description><link>https://practical.li/journal/warmer-weather/</link> <pubDate>Mon, 15 Jan 2024 00:00:00 +0000</pubDate><source url="https://practical.li/journal/feed_rss_created.xml">Practicalli Personal Journal</source><guid isPermaLink="true">https://practical.li/journal/warmer-weather/</guid> <enclosure url="https://practical.li/journal/assets/images/social/warmer-weather.png" type="image/png" length="43596" /> </item> <item> <title>Breaking ground on the new year</title> <author>Practicalli Johnny</author> <category>practicalli</category> <description><p>Rushing work is the slowest way to make progress.</p><p>Exhausted after this week of work, so took a break from cycling and running. Lots of cat naps over the weekend.</p></description><link>https://practical.li/journal/breaking-ground-on-the-new-year/</link> <pubDate>Mon, 08 Jan 2024 00:00:00 +0000</pubDate><source url="https://practical.li/journal/feed_rss_created.xml">Practicalli Personal Journal</source><guid isPermaLink="true">https://practical.li/journal/breaking-ground-on-the-new-year/</guid> <enclosure url="https://practical.li/journal/assets/images/social/breaking-ground-on-the-new-year.png" type="image/png" length="53297" /> </item> </channel></rss> \ No newline at end of file +<?xml version="1.0" encoding="UTF-8" ?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/"> <channel><title>Practicalli Personal Journal</title><description>Daily journal of thoughts and experiences</description><link>https://practical.li/journal/</link><atom:link href="https://practical.li/journal/feed_rss_created.xml" rel="self" type="application/rss+xml" /><managingEditor>Practicalli</managingEditor><docs>https://github.com/practicalli/journal/</docs><language>en</language> <pubDate>Sun, 19 Jan 2025 23:15:40 -0000</pubDate> <lastBuildDate>Sun, 19 Jan 2025 23:15:40 -0000</lastBuildDate> <ttl>1440</ttl> <generator>MkDocs RSS plugin - v1.17.1</generator> <image> <url>https://github.com/practicalli/graphic-design/blob/live/logos/practicalli-logo.png?raw=true</url> <title>Practicalli Personal Journal</title><link>https://practical.li/journal/</link> </image> <item> <title>Learning Linux like its 1995</title> <author>Practicalli Johnny</author> <category>clojure</category> <category>practicalli</category> <description><p>Using Arch Linux (for Hyprland experiments) takes me back to the mid 1990's when I was learning Linux from the ground up.</p><p>At the end of 1994 I was installing Slackware Linux (from 82 floppy disks) and spending hours figuring out what to compile into the Linux kernel (before the days of dynamic loading). There was a huge amount to learn (usually without my own internet connection).</p><p>Arch Linux wiki pages have a huge amount of information, showing all the possible options for every piece of software and service. This does present a dilemma of choice.</p><p>Having experienced many years with Linux, I know many of the concepts and software associated with a Linux system. I dont need to read all the options, but do find myself scrolling a lot until I find something familiar (or simple).</p><p>The goals for this month include</p><ul><li>documenting Neovim &amp; Conjure workflow</li><li>meaningful exercise every day (health permitting)</li><li>bicycle ride (weather permitting)</li><li>avoid Hyprland turning into a huge time sync (couch potato time only)</li></ul><p>My health took more of a knock this week as I am finding it very difficult to walk. I've had pain in my right hip for a couple of weeks and on Friday I started walking and felt a sharp pain. Every step with my right leg is painful and going up and down stairs is particularly painful.</p><p>The hip pain coupled with my left knee pain significantly limiting my ability to exercise this week.</p><p>Movies this week:</p><ul><li><a href="https://en.wikipedia.org/wiki/Death_on_the_Nile_(1978_film)">Death on the Nile 1978</a> with Peter Ustinov as Hercule Poirot, including an all-star cast from the time including David Niven, Angela Landsbury and Betty Davis.</li></ul></description><link>https://practical.li/journal/learning-linux-like-its-1995/</link> <pubDate>Mon, 13 Jan 2025 00:00:00 +0000</pubDate><source url="https://practical.li/journal/feed_rss_created.xml">Practicalli Personal Journal</source><guid isPermaLink="true">https://practical.li/journal/learning-linux-like-its-1995/</guid> <enclosure url="https://practical.li/journal/assets/images/social/learning-linux-like-its-1995.png" type="image/png" length="0" /> </item> <item> <title>A new dawn a new day its a new life</title> <author>Practicalli Johnny</author> <category>neovim</category> <category>practicalli</category> <description><p>As we come to the end of 2025 I continue to contemplate what is next?</p><p>Do I want to continue in the software engineering industry with its many systemic faults?</p><p>Or should I branch out and do something completely different?</p><p><a href="https://80000hours.org/">80,000 hours</a> is a guide to careers that have a positive impact on the world.</p><p>My searching for a new home are currently focusing on the East coast of Scotland (which is dryer than London at the moment). Aberdeen (the granite city) has good support for cycling and a few cycle clubs in the area.</p><p>Wired up my Playstation 4 and VR headset to start playing games again. During more severe covid symptoms I couldnt wear the VR headset as it put too much pressure on my head. From an hour of play today, the VR headset felt okay.</p><p>I had a few quick games of Stardust and one surprisingly successful game of <a href="https://youtube.com/playlist?list=PLy9I_IfUBzKJgBTlbzRB0k4i1ARDVPSgy&amp;si=Fq2TPODPdD1YQ6cI">Polybius</a>.</p></description><link>https://practical.li/journal/a-new-dawn-a-new-day-its-a-new-life/</link> <pubDate>Sun, 29 Dec 2024 00:00:00 +0000</pubDate><source url="https://practical.li/journal/feed_rss_created.xml">Practicalli Personal Journal</source><guid isPermaLink="true">https://practical.li/journal/a-new-dawn-a-new-day-its-a-new-life/</guid> <enclosure url="https://practical.li/journal/assets/images/social/a-new-dawn-a-new-day-its-a-new-life.png" type="image/png" length="None" /> </item> <item> <title>Holiday stuffing</title> <author>Practicalli Johnny</author> <category>emacs</category> <category>neovim</category> <category>practicalli</category> <description><p>Feeling a little sick so binging on movies and shows on Apple TV+. On Monday afternoon Apple TV+ would not stream content (the play button disappeared) although I could browse the catalogue of shows. After several hours the play button came back, although contacting Apple support was quite pointless.</p><p><img alt="Mooless Moo Plant bases stake and ale pie" src="https://optimise2.assets-servd.host/political-lechwe/production/Mooless-info.jpg?w=1600&amp;h=904&amp;q=82&amp;fm=webp&amp;fit=crop&amp;dm=1681290833&amp;s=8fc234ed1acd070f99e0a7b3ef95079c">{align=right loading=lazy style="width:360px"}</p><p>A relaxing week trying out some new vegetarian and vegan meals. <a href="https://shop.pieminister.co.uk/products/mooless-moo/">Pieminister Mooless Moo pie</a> is a plant based stake and ale pie, using jackfruit for the stake pieces. The pastry was lovely and crispy and the pie was very filling. The only downside to the pie for me was it was the taste and texture was too much like beef and I've never really liked that even when I did eat meat.</p><p>New potatoes, Edamame, Spinach and Garden Peas complement the pie, along with some very thick <a href="https://www.bisto.co.uk/products/bisto-best-vegetable-gravy-granules-230g/">Bisto Best Vegetable Gravy</a> (I add way too many granules to make the gravy nice and thick).</p></description><link>https://practical.li/journal/holiday-stuffing/</link> <pubDate>Sun, 22 Dec 2024 00:00:00 +0000</pubDate><source url="https://practical.li/journal/feed_rss_created.xml">Practicalli Personal Journal</source><guid isPermaLink="true">https://practical.li/journal/holiday-stuffing/</guid> <enclosure url="https://practical.li/journal/assets/images/social/holiday-stuffing.png" type="image/png" length="0" /> </item> <item> <title>Finding My Joy</title> <author>Practicalli Johnny</author> <category>clojure</category> <category>practicalli</category> <description><p>In season 2, episode 2 of "The Big Door Prize" they talk about "Finding your Joy". This seems like an inspiring new years resolution, or at least a theme I should focus on for 2025.</p><p>You only live one life and you should take time out to enjoy it. There were many aspects to 2024 that constrained my joy, so I will endeavour to may 2025 a most joyous year.</p><p>Practicalli Updates:</p><ul><li><a href="https://practical.li/clojure/data-inspector/">Clojure Data Inspector tools - overview and portal page updated</a></li></ul></description><link>https://practical.li/journal/finding-my-joy/</link> <pubDate>Mon, 16 Dec 2024 00:00:00 +0000</pubDate><source url="https://practical.li/journal/feed_rss_created.xml">Practicalli Personal Journal</source><guid isPermaLink="true">https://practical.li/journal/finding-my-joy/</guid> <enclosure url="https://practical.li/journal/assets/images/social/finding-my-joy.png" type="image/png" length="None" /> </item> <item> <title>What is past is prologue</title> <author>Practicalli Johnny</author> <category>appimage</category> <category>debian</category> <category>hyprland</category> <category>leadership</category> <category>practicalli</category> <description><p>!!! QUOTE If a technology was truly dead, no one would feel the need to talk about it on the internet</p><h2>Dead is mainstream</h2><p>When people state that some technology or practice is dead via the internet, it typically means that thing is the mainstream.</p><p>If something was truely dead, no one would feel the need to talk about it as that topic would not relate to anyone.</p><p>This technique is essentially click-bate and trying to persuade you to 'buy-in' to something else (usually for the profit of aother person)</p></description><link>https://practical.li/journal/what-is-past-is-prologue/</link> <pubDate>Mon, 09 Dec 2024 00:00:00 +0000</pubDate><source url="https://practical.li/journal/feed_rss_created.xml">Practicalli Personal Journal</source><guid isPermaLink="true">https://practical.li/journal/what-is-past-is-prologue/</guid> <enclosure url="https://practical.li/journal/assets/images/social/what-is-past-is-prologue.png" type="image/png" length="None" /> </item> <item> <title>Long Cold Winter</title> <author>Practicalli Johnny</author> <category>codec</category> <category>mason</category> <category>neovim</category> <category>opus</category> <category>practicalli</category> <description><p><a href="#converting-audio-with-ffmpeg">Converted some audio files to Opus codec</a>, which provides a really optimum compression and allows for relatively low bit rates and results in much smaller files with the same quality.</p><p>Neovim upcoming changes</p><ul><li>neovim 0.11 has some breaking changes, so assume early in 2025</li><li>astronvim v5 once neovim 0.11 released</li><li><a href="https://github.com/WhoIsSethDaniel/mason-tool-installer.nvim">:fontawesome-brands-github: mason-tool-installer.nvim</a> to simplify mason config in astronvim v5 - discussed in Atronvim Discord community. maston-tool-installer still <a href="https://github.com/WhoIsSethDaniel/mason-tool-installer.nvim/blob/main/lua/mason-tool-installer/init.lua">:fontawesome-brands-github: uses the mason registry</a> for tool versions.</li></ul><p>Starting to <a href="#notes-for-updating-my-cv">update my CV from recent commercial experiences</a>, focusing on the areas of product, delivery and people.</p></description><link>https://practical.li/journal/long-cold-winter/</link> <pubDate>Mon, 02 Dec 2024 00:00:00 +0000</pubDate><source url="https://practical.li/journal/feed_rss_created.xml">Practicalli Personal Journal</source><guid isPermaLink="true">https://practical.li/journal/long-cold-winter/</guid> <enclosure url="https://practical.li/journal/assets/images/social/long-cold-winter.png" type="image/png" length="None" /> </item> <item> <title>Making use of Black Friday</title> <author>Practicalli Johnny</author> <category>hardware</category> <category>network-attached-storage</category> <category>network-file-system</category> <category>solid-state-drive</category> <category>thecus</category> <description><p>Black Friday as a concept is confusing as it no longer has anything to do with a specific Friday and currently seems to cover at least 2 weeks of promotions. I did get some good prices even before Black Friday actually started.</p><p><a href="#nas">Adventures with SSD and NAS Versions</a> kept me busy over the weekend, resurrecting an older NAS unit with Solid State Drives for a very quiet media storage device.</p></description><link>https://practical.li/journal/making-use-of-black-friday/</link> <pubDate>Mon, 25 Nov 2024 00:00:00 +0000</pubDate><source url="https://practical.li/journal/feed_rss_created.xml">Practicalli Personal Journal</source><guid isPermaLink="true">https://practical.li/journal/making-use-of-black-friday/</guid> <enclosure url="https://practical.li/journal/assets/images/social/making-use-of-black-friday.png" type="image/png" length="54253" /> </item> <item> <title>Practicalli plans for the rest of the year</title> <author>Practicalli Johnny</author> <category>github</category> <category>hardware</category> <category>practicalli</category> <category>practicalli</category> <description><p>Starting to <a href="#practicalli-plans">plan work for the Practicalli content</a> for the next 3 months.</p><p>On the Practicalli GitHub Org, <a href="#optimise-github-org-log-retention">action log retention time was minimised</a> to a week (from 90 days) as I don't need to wade through that history and it will save a bit of storage in the Cloud. I am surprised GitHub have such a high default for their free plans.</p><p>Upgraded to a <a href="#new-monitor">Dell 40 inch 5k2k monitor</a> for work and it makes a huge difference. Its a beautiful monitor and it works really well with Linux and the tiling window of Regolith Desktop (i3).</p><p>I am continuing my search for a new place to live, even further into the countryside with easy access to hiking and cycling activities.</p><p>Although I am always thankful for an opportunity to work with a commercial company, I do feel the weight lifted from my shoulders now that relationship has concluded. Within hours I started to feel the return of much of the energy I have been lacking for the last few months.</p><p>They do say a change is as good as a rest, so investing time in Practicalli content is giving me an energy boost.</p><p><img alt="Freedom quote" src="https://cdn4.geckoandfly.com/wp-content/uploads/2016/07/freedom-quotes-10.jpg">{loading=lazy}</p></description><link>https://practical.li/journal/practicalli-plans-for-the-rest-of-the-year/</link> <pubDate>Mon, 18 Nov 2024 00:00:00 +0000</pubDate><source url="https://practical.li/journal/feed_rss_created.xml">Practicalli Personal Journal</source><guid isPermaLink="true">https://practical.li/journal/practicalli-plans-for-the-rest-of-the-year/</guid> <enclosure url="https://practical.li/journal/assets/images/social/practicalli-plans-for-the-rest-of-the-year.png" type="image/png" length="54273" /> </item> <item> <title>The king is probably dead long live the king</title> <author>Practicalli Johnny</author> <category>leadership</category> <category>practicalli</category> <description><p>!!! QUOTE You are only a leader if people are willing to follow</p><p>It has been hard to shake the concern that my current commercial role has not worked out, probably not really been working for quite a while in hindsight. Was it ever really working?</p><p>Some aspects have greatly improved but there are some fundamental communication constraints that I really didn't understand the cause of (plenty of assumptions, but not enough communication or time to really address these challenges).</p><p>There are the common systemic challenges that come from working at any startup that is working hard to establish itself as a long term sustainable business. This was a given. A new person coming into this environment that has been running for many years leaves a lot of context unknown and typically unspoken.</p><p>I continued to try identify the causes throughout the week and trying to evaluate if there is any appetite and opportunity to address these within our typical schedule. It did feel that the more I tried to connect the quicker the feeling of connection slipped away.</p><p>I believe my frustration and disappointment have been leaking out over the last month, which I am disappointed about as well.</p><p>It is always a challenge for an engineering manager to identify where they can add value. For much of the current role I never seemed to connect with the team at a deep enough level. It is too easy to feel I am simply not needed by the team as the communication has been very limited. In once exceptional case, it was easy to feel my presence was simply not wanted.</p><p>Tuesday I was really exhausted, partly because of the continued cough but also the concerns that I still wasn't able to break through to the team (especially if they feel unsafe to ask questions). I am not sleeping well and need to find energy to exercise more.</p><p>Wednesday I made time for self-reflection as part of the company feedback initiative. I did struggle to quantify to myself what I had done. In hindsight I should have spend more time on this and consulted my journal, although I still feel I would come up short of my own lofty goals for the role.</p><p>Friday was the end of my commercial current role.</p><blockquote><p>The title of this article is from the first episode of the first series of the Black Adder TV show. There were quite a few Shakepearean quotes used for comic effect.</p></blockquote></description><link>https://practical.li/journal/the-king-is-probably-dead-long-live-the-king/</link> <pubDate>Mon, 11 Nov 2024 00:00:00 +0000</pubDate><source url="https://practical.li/journal/feed_rss_created.xml">Practicalli Personal Journal</source><guid isPermaLink="true">https://practical.li/journal/the-king-is-probably-dead-long-live-the-king/</guid> <enclosure url="https://practical.li/journal/assets/images/social/the-king-is-probably-dead-long-live-the-king.png" type="image/png" length="60338" /> </item> <item> <title>The wonderful complexity of people</title> <author>Practicalli Johnny</author> <category>leadership</category> <category>practicalli</category> <description><p>!!! QUOTE "A Tail of Two Cities - Charles Dickens" It was the best of times, it was the worst of times.</p><p>!!! QUOTE "Johnny Stevenson (maybe others)" People are wonderfully complex experiences</p><p>My feelings of disappointed with my current commercial role are returning to the forefront of my mind. Many aspects of the role and company seem to be clear in peoples minds but not always effectively shared. I think I understand the role and then something else happens that makes me feel I don't. I believe something will need to change soon for the benefit of all.</p><p>There have been a few highlights with the role, but I expected more of myself and the company. I do set high expectations for myself, although have learned to be more kind about what I can realistically achieve and 'which battles to fight' (figuratively speaking of course).</p><p>During this engagement I have continually reset my expectations about what could be achieved and what I could realistically achieve. There are a couple of peers where there has been conflict without understanding of why I am seen as the cause. I have tried to explore but if people do have issues with me its not clearly being communicated to me.</p><p>In hindsight, many opportunities to get support from my manger and peers were missed. Mostly as we had so many challenges to discuss and partly due to pressures of delivery.</p><p>When a person doesn't have clarity around a problem then there is very little they can do to resolve or adapt.</p><p>A self-reflection review is in progress and its is a good opportunity to take my own time to reflect on my current role and if its still the right fit for me.</p></description><link>https://practical.li/journal/the-wonderful-complexity-of-people/</link> <pubDate>Mon, 04 Nov 2024 00:00:00 +0000</pubDate><source url="https://practical.li/journal/feed_rss_created.xml">Practicalli Personal Journal</source><guid isPermaLink="true">https://practical.li/journal/the-wonderful-complexity-of-people/</guid> <enclosure url="https://practical.li/journal/assets/images/social/the-wonderful-complexity-of-people.png" type="image/png" length="56883" /> </item> <item> <title>Back to work</title> <author>Practicalli Johnny</author> <category>clojure</category> <category>practicalli</category> <description><p>Busy week at work getting ready for a new team member. I spent Friday afternoon building up a relationship and getting accustom to spending time working together. Several weeks of work had been done to get ready for the new starter.</p><p>One of the interesting challenges for anyone starting a new job is to ensure too much enthusiasm doesnt lead to missing important steps. It will be a good first check-in with the new starter to see if they have been too enthusiastic or taken a more measured approach.</p><p>Current issues</p><ul><li><strong>DONE</strong> <a href="https://github.com/practicalli/clojure-cli-config/issues/87">security: add clj-watson to clojure cli config</a></li></ul></description><link>https://practical.li/journal/back-to-work/</link> <pubDate>Mon, 28 Oct 2024 00:00:00 +0000</pubDate><source url="https://practical.li/journal/feed_rss_created.xml">Practicalli Personal Journal</source><guid isPermaLink="true">https://practical.li/journal/back-to-work/</guid> <enclosure url="https://practical.li/journal/assets/images/social/back-to-work.png" type="image/png" length="43152" /> </item> <item> <title>Holiday in Paramout Plus</title> <author>Practicalli Johnny</author> <category>clojure</category> <category>practicalli</category> <description><p>After being ill for most of the week I am finally starting to enjoying my second week of holiday, binging on some Paramount+ and having a lazy Sunday enjoying the extra hour in bed after the end of summer time.</p><p>Updating Practicalli Journal and Clojure CLI Config repositories, fixing links and markdown issues from the Megalinter reports.</p><p>Updating to Megalinter 0.8.1 GitHub action on Practicalli repositories as I work on them. The upgrade will include each repository in the Grafana dashboards for Practicalli projects.</p><p>Issues</p><ul><li><strong>DOING</strong> <a href="https://github.com/practicalli/clojure-cli-config/issues/87">security: add clj-watson to clojure cli config</a></li><li><strong>DOING</strong> zsh environment varaibles not loading into jvm</li></ul></description><link>https://practical.li/journal/holiday-in-paramout-plus/</link> <pubDate>Mon, 21 Oct 2024 00:00:00 +0000</pubDate><source url="https://practical.li/journal/feed_rss_created.xml">Practicalli Personal Journal</source><guid isPermaLink="true">https://practical.li/journal/holiday-in-paramout-plus/</guid> <enclosure url="https://practical.li/journal/assets/images/social/holiday-in-paramout-plus.png" type="image/png" length="48672" /> </item> <item> <title>Hacking on Practicalli content</title> <author>Practicalli Johnny</author> <category>neovim</category> <category>practicalli</category> <category>practicalli</category> <description><p>I am enjoying my 2 week at home vacation (stay-cation) and have already completely rewired my desk, laptops, Monitors and NAS storage devices on the electronic standing desk. It feels a lot more organised and easier to find everything as everything has its place.</p><p>Now I can focus on getting lots of <a href="#practicalli">Practicalli content done</a> (as well as catch up with shows on Paramount+ and maybe a little Polybus on the Playstation4 VR headset)</p><p>I am interested in switching to the Hyprland, although its changing fast so I dug out an older laptop and installed Arch Linux with Hyprland using the <code>archinstall</code> tool. Unfortunately the laptop I used doesnt seem to support Hyprland or something is missing from the install.</p><p>I am taking a stay-cation as I am still recovering from Covid and the weather is also quite grim. I am getting out for walks each day and on Friday I completed a short cycle ride as it was nice and sunny outside. Unfortunately my chest started feeling like it was on fire a few minutes into the ride, so I slowed down and limited myself to 10km.</p><p>I was feeling really sleepy after the ride, so I kept myself awake by sorting through the cardboard boxes in my attic. Many boxes made the ultimate sacrifice (for an uncluttered house) and went to the recycling service.</p></description><link>https://practical.li/journal/hacking-on-practicalli-content/</link> <pubDate>Mon, 14 Oct 2024 00:00:00 +0000</pubDate><source url="https://practical.li/journal/feed_rss_created.xml">Practicalli Personal Journal</source><guid isPermaLink="true">https://practical.li/journal/hacking-on-practicalli-content/</guid> <enclosure url="https://practical.li/journal/assets/images/social/hacking-on-practicalli-content.png" type="image/png" length="50806" /> </item> <item> <title>Practicalli content planning</title> <author>Practicalli Johnny</author> <category>clojure</category> <category>megalinter</category> <category>neovim</category> <category>practicalli</category> <description><p>Hyprland promises to be a great experience but also a potential time drain, so will save most of the investigation and further configuration until the winter break (or if I need a little distraction of the new shiny for motivation).</p><p>Taking two weeks off from work and have some time to work on Practicalli content.</p></description><link>https://practical.li/journal/practicalli-content-planning/</link> <pubDate>Mon, 07 Oct 2024 00:00:00 +0000</pubDate><source url="https://practical.li/journal/feed_rss_created.xml">Practicalli Personal Journal</source><guid isPermaLink="true">https://practical.li/journal/practicalli-content-planning/</guid> <enclosure url="https://practical.li/journal/assets/images/social/practicalli-content-planning.png" type="image/png" length="48310" /> </item> <item> <title>Linux Wayland Compositor & Hyprland</title> <author>Practicalli Johnny</author> <category>debian</category> <category>hyprland</category> <category>linux</category> <category>neovim</category> <category>practicalli</category> <category>slack</category> <description><p>A friend recommended <a href="https://hyprland.org/">Hyprland window manager</a> which is similar to i3 window manager I currently used, but more optomised for the Wayland compositor.</p><p>Practicalli currently uses Regolith Desktop, a complete Linux desktop that leverages Gnome and i3 tiling window manager.</p><p>Regolith Desktop provides quite a rich experience using the <code>regolith-desktop</code> Debian package. I have not had much success with Regolith when running with Wayland (specifically Sway).</p><p>Sway compositor is an implementation of wayland for i3 window manager. Some of my applications do not see to play nice with Sway (e.g. chromium browser scrolling, simplescreenrecorder cannot run on wayland).</p><p>OBS did seem to work okay on wayland, given a sufficiently recent version.</p><p>A friend recommended Hyprland, a tiling compositor that provides the latest Wayland features and lots of eye candy. Its pretty easy to setup on Debian, although there is much additional setup before it would be comparable to Regolith Desktop.</p><p>Neovim Grug plugin is being considered as an alternative to the Spectre tool for search and replacing across a project.</p></description><link>https://practical.li/journal/linux-wayland-compositor--hyprland/</link> <pubDate>Mon, 30 Sep 2024 00:00:00 +0000</pubDate><source url="https://practical.li/journal/feed_rss_created.xml">Practicalli Personal Journal</source><guid isPermaLink="true">https://practical.li/journal/linux-wayland-compositor--hyprland/</guid> <enclosure url="https://practical.li/journal/assets/images/social/linux-wayland-compositor--hyprland.png" type="image/png" length="59724" /> </item> <item> <title>Here Comes The Rain</title> <author>Practicalli Johnny</author> <category>clojure</category> <category>debian</category> <category>practicalli</category> <description><p>Thunderstorms abound which will be good for the vegetables growing in my garden (beetroot, courgettes, parsnips and onions)</p></description><link>https://practical.li/journal/here-comes-the-rain/</link> <pubDate>Mon, 23 Sep 2024 00:00:00 +0000</pubDate><source url="https://practical.li/journal/feed_rss_created.xml">Practicalli Personal Journal</source><guid isPermaLink="true">https://practical.li/journal/here-comes-the-rain/</guid> <enclosure url="https://practical.li/journal/assets/images/social/here-comes-the-rain.png" type="image/png" length="46556" /> </item> <item> <title>MegaLinter Grafana Dashboards</title> <author>Practicalli Johnny</author> <category>dashboard</category> <category>debian</category> <category>github</category> <category>grafana</category> <category>megalinter</category> <category>practicalli</category> <description><p>As Practicalli projects are being updated to Megalinter version 8 it seemed a good time to try the Megalinter API reporter to publish data to use with Grafana. A chance to learn more about creating Dashboards and if Grafana is any easier than DataDog.</p><p>!!! WARNING "Megalinter not publishing logs on Grafana yet" Unfortunately I havent been able to make the Megalinter API Reporter work with this journal project, Clojure CLI Config or a new megalinter-test project I created.</p><p>Health is a little better after resting over the weekend, although still have lots of symptoms.</p><p>!!! EXAMPLE "Megalinter Grafana dashboard example project" <a href="https://github.com/practicalli/megalinter-test">:fontawesome-brands-github: Practicalli Megalinter-Test</a>{target=_blank .md-button}</p><pre><code>NOTE: I am trying to diagnose why this project does not seem to be sending logs to Grafana.</code></pre></description><link>https://practical.li/journal/megalinter-grafana-dashboards/</link> <pubDate>Mon, 16 Sep 2024 00:00:00 +0000</pubDate><source url="https://practical.li/journal/feed_rss_created.xml">Practicalli Personal Journal</source><guid isPermaLink="true">https://practical.li/journal/megalinter-grafana-dashboards/</guid> <enclosure url="https://practical.li/journal/assets/images/social/megalinter-grafana-dashboards.png" type="image/png" length="53772" /> </item> <item> <title>Megalinter 8 and monthly version updates</title> <author>Practicalli Johnny</author> <category>clojure</category> <category>practicalli</category> <description><p>Megalinter updates to version 8 using the megalinter runner tool, adding a Makefile task to simplify the command line (so I dont have to remember the command).</p><p>Material for MkDocs provides a nice diff view using the <code>diff</code> language for a code block. Add or copy a diff into the code block, ensuring the <code>-</code> and <code>+</code> signs are included and the diff is automatically highlighted. See the <a href="#megalinter">Megalinter</a> section of this post for an example.</p><p>Feeling quite low the last few weeks, mostly due to continued Covid symptoms, low blood oxygen and lack of energy. Waking up I feel like I have experienced carbon dioxide poisoning (which I have experienced working on a mushroom farm). I am disorientated, dizzy and feel quite terrible.</p></description><link>https://practical.li/journal/megalinter-8-and-monthly-version-updates/</link> <pubDate>Mon, 09 Sep 2024 00:00:00 +0000</pubDate><source url="https://practical.li/journal/feed_rss_created.xml">Practicalli Personal Journal</source><guid isPermaLink="true">https://practical.li/journal/megalinter-8-and-monthly-version-updates/</guid> <enclosure url="https://practical.li/journal/assets/images/social/megalinter-8-and-monthly-version-updates.png" type="image/png" length="62600" /> </item> <item> <title>Clojure 1.12 and Learn Clojure book</title> <author>Practicalli Johnny</author> <category>clojure</category> <category>practicalli</category> <category>practicalli</category> <description><p>Work on Practicalli Learn Clojure book, a practical guide to getting comfortable working with Clojure. A full guide to using Clojure is in the Practicalli Clojure book.</p><p>Added RSS feed for Journal, although I feel that all these blogs should be merged into the <a href="https://practical.li/blog">https://practical.li/blog</a> site for a single collection or articles. The articles can be categorised to keep them separate.</p><p>Health is still recovering from a little Covid symptoms. Took Monday off work and slept most of the day.</p></description><link>https://practical.li/journal/clojure-112-and-learn-clojure-book/</link> <pubDate>Mon, 02 Sep 2024 00:00:00 +0000</pubDate><source url="https://practical.li/journal/feed_rss_created.xml">Practicalli Personal Journal</source><guid isPermaLink="true">https://practical.li/journal/clojure-112-and-learn-clojure-book/</guid> <enclosure url="https://practical.li/journal/assets/images/social/clojure-112-and-learn-clojure-book.png" type="image/png" length="55872" /> </item> <item> <title>Clojure specific Which-key menu</title> <author>Practicalli Johnny</author> <category>neovim</category> <category>practicalli</category> <description><p>Whilst looking for a Neovim way to have language specific configuration, I discovered the <code>after/ftplugin</code> approach. This allows a configuration to be loaded when a buffer is switched to a specific language.</p></description><link>https://practical.li/journal/clojure-specific-which-key-menu/</link> <pubDate>Mon, 19 Aug 2024 00:00:00 +0000</pubDate><source url="https://practical.li/journal/feed_rss_created.xml">Practicalli Personal Journal</source><guid isPermaLink="true">https://practical.li/journal/clojure-specific-which-key-menu/</guid> <enclosure url="https://practical.li/journal/assets/images/social/clojure-specific-which-key-menu.png" type="image/png" length="55807" /> </item> <item> <title>Tetris and the fall of the USSR (and Neovim Conjure menu)</title> <author>Practicalli Johnny</author> <category>clojure</category> <category>neovim</category> <category>practicalli</category> <description><p>Enjoyed watching the <a href="https://en.wikipedia.org/wiki/Tetris">Tetris movie</a> and wondered just how much was real and dramatised. Reading the background to the game it does seem the main thread of the movie is accurate, with perhaps some additional dramatic effect. It was a very enjoyable movie regardless.</p><p>I do remember the break-up of the USSR when it happened, first with Gorbachev as leader and then Boris Yeltsin. Then the Oligarchs (super rich) moved in and supported a more draconian leader in Putin (assumingly so they could keep hold of all their money).</p><p>I also remember Robert Maxwell as a disgraced billionaire that stole from his own company and mysteriously vanished from his luxury yacht.</p></description><link>https://practical.li/journal/tetris-and-the-fall-of-the-ussr-and-neovim-conjure-menu/</link> <pubDate>Mon, 12 Aug 2024 00:00:00 +0000</pubDate><source url="https://practical.li/journal/feed_rss_created.xml">Practicalli Personal Journal</source><guid isPermaLink="true">https://practical.li/journal/tetris-and-the-fall-of-the-ussr-and-neovim-conjure-menu/</guid> <enclosure url="https://practical.li/journal/assets/images/social/tetris-and-the-fall-of-the-ussr-and-neovim-conjure-menu.png" type="image/png" length="65176" /> </item> <item> <title>HTTP Message Signing investigation</title> <author>Practicalli Johnny</author> <category>clojure</category> <category>practicalli</category> <description><p>API Security is typically managed by issuing a token for authentication. Only requests that include a valid token are processed, any requests with an expired or missing token are rejected. HTTP code 401 Unauthorised error message is returned for rejected requests.</p><p>When dealing with very sensitive data and higher risk actions common in financial services, additional security mechanisms are required. So I have been looking at mTLS and <a href="#http-message-signatures">HTTP Message Signatures</a> (RFC9421) this week.</p><p>Not going to be a productive week as I am full of flu. Given the time of year its most likely a variant of Covid. So far I've only had a headache, congested chest / nose / ears and some fatigue. Taking lots of paracetamol and drinking lots of water to try keep the inflammation at bay.</p><p>Edit: I was mostly okay by the weekend, although still had a sore throat and coughing.</p></description><link>https://practical.li/journal/http-message-signing-investigation/</link> <pubDate>Mon, 05 Aug 2024 00:00:00 +0000</pubDate><source url="https://practical.li/journal/feed_rss_created.xml">Practicalli Personal Journal</source><guid isPermaLink="true">https://practical.li/journal/http-message-signing-investigation/</guid> <enclosure url="https://practical.li/journal/assets/images/social/http-message-signing-investigation.png" type="image/png" length="58404" /> </item> <item> <title>A very hot week</title> <author>Practicalli Johnny</author> <category>clojure</category> <category>practicalli</category> <description><p>Its a bit too hot for rational thought... and caught flu at the end of the week, so not much happened.</p><p>Time for some project maintenance courtesy of the <a href="https://practical.li/engineering-playbook/continuous-integration/github/workflows/practicalli/#scheduled-version-check">scheduled version GitHub workflow</a>, run at the start of each month.</p></description><link>https://practical.li/journal/a-very-hot-week/</link> <pubDate>Mon, 29 Jul 2024 00:00:00 +0000</pubDate><source url="https://practical.li/journal/feed_rss_created.xml">Practicalli Personal Journal</source><guid isPermaLink="true">https://practical.li/journal/a-very-hot-week/</guid> <enclosure url="https://practical.li/journal/assets/images/social/a-very-hot-week.png" type="image/png" length="44854" /> </item> <item> <title>Data Driven Components & Neovim updates</title> <author>Practicalli Johnny</author> <category>astro</category> <category>clojure</category> <category>clojure</category> <category>donut</category> <category>integrant</category> <category>neovim</category> <description><p><a href="https://github.com/practicalli/astro">:fontawesome-brands-github: Practicalli Astro</a> config for Clojure development with Neovim initial release.</p><p>Presented my experiences with Component libraries to London Clojurians this week, specifically comparing Integrant and Donut-party/system. I discussed my Service REPL workflow to show the benefits and constraints of these two libraries.</p><p>For component libraries to work well, then code should be reloadable. There are a few parts of the Clojure language that do make it harder to reload code, (deftype, defrecord, etc), although I tend to avoid those parts anyway.</p><p>Issues this week</p><p><a href="https://github.com/practicalli/astro">:fontawesome-brands-github: practicalli/astro</a>:</p><ul><li>DONE <a href="https://github.com/practicalli/astro/issues/10">:fontawesome-brands-github: search: find text pattern in specific files and file types</a></li><li>DONE <a href="https://github.com/practicalli/astro/issues/9">:fontawesome-brands-github: config: capitalise Leader &amp; LocalLeader - vim convention</a></li><li>DONE <a href="https://github.com/practicalli/astro/issues/8">:fontawesome-brands-github: plugin: conjure sub-menu key labels in which-key version 3</a></li><li>DONE <a href="https://github.com/practicalli/astro/issues/7">:fontawesome-brands-github: plugin: spectre moved to search category in astrocommunity</a></li><li>DONE <a href="https://github.com/practicalli/astro/issues/6">:fontawesome-brands-github: plugin: better-escape.nvim rewrite required config change</a></li></ul></description><link>https://practical.li/journal/data-driven-components--neovim-updates/</link> <pubDate>Mon, 22 Jul 2024 00:00:00 +0000</pubDate><source url="https://practical.li/journal/feed_rss_created.xml">Practicalli Personal Journal</source><guid isPermaLink="true">https://practical.li/journal/data-driven-components--neovim-updates/</guid> <enclosure url="https://practical.li/journal/assets/images/social/data-driven-components--neovim-updates.png" type="image/png" length="64286" /> </item> <item> <title>Montly Clojure Library updates</title> <author>Practicalli Johnny</author> <category>bazel</category> <category>clojure</category> <category>make</category> <category>practicalli</category> <description><p>Exploring the mysteries of the Bazel build tool at work. Whilst technically its a very powerful tool it really lacks a good developer experience.</p><p>Its supposed to be a more powerful make, although ironically I use a <code>Makefile</code> so that Bazel is much easier to use.</p><p>It could be an opportunity to use Babashka, but that would be more work than using a Makefile as I dont have much Babashka experience.</p></description><link>https://practical.li/journal/montly-clojure-library-updates/</link> <pubDate>Mon, 15 Jul 2024 00:00:00 +0000</pubDate><source url="https://practical.li/journal/feed_rss_created.xml">Practicalli Personal Journal</source><guid isPermaLink="true">https://practical.li/journal/montly-clojure-library-updates/</guid> <enclosure url="https://practical.li/journal/assets/images/social/montly-clojure-library-updates.png" type="image/png" length="55159" /> </item> <item> <title>Monthly Library Updates for Practicalli Projects</title> <author>Practicalli Johnny</author> <category>clojure</category> <category>practicalli</category> <description><p>Monthly updates for Practicalli projects, driven by a scheduled version GitHub workflow that uses antq to report on project library dependencies and GitHub action library versions.</p><ul><li>Release: Clojure CLI Config - 2024-07-07</li><li>Release: Project Templates - 2024-07-07</li></ul><p>Which-key version 3 released, fixing localleader issue and providing a horizontal menu option.</p></description><link>https://practical.li/journal/monthly-library-updates-for-practicalli-projects/</link> <pubDate>Mon, 08 Jul 2024 00:00:00 +0000</pubDate><source url="https://practical.li/journal/feed_rss_created.xml">Practicalli Personal Journal</source><guid isPermaLink="true">https://practical.li/journal/monthly-library-updates-for-practicalli-projects/</guid> <enclosure url="https://practical.li/journal/assets/images/social/monthly-library-updates-for-practicalli-projects.png" type="image/png" length="63741" /> </item> <item> <title>Flexiana Interview</title> <author>Practicalli Johnny</author> <category>clojure</category> <category>practicalli</category> <description><p>I enjoyed the interview with Flexiana team this week, they are very friendly and it we had some very interesting discussions. I included my interview preparation notes which were mosty the same as shared in the video.</p><p>A blip with Emacs 29.4 release stopped the which-key menu from showing when in a major mode. This affected both the leader and local leader key. Within a couple of hours the issue was resolved before I really figured out the cause. I installed Emacs 29.4 on Termux to replicate an issue that was reported in the #spacemacs channel of the Clojurians Community slack community.</p></description><link>https://practical.li/journal/flexiana-interview/</link> <pubDate>Mon, 01 Jul 2024 00:00:00 +0000</pubDate><source url="https://practical.li/journal/feed_rss_created.xml">Practicalli Personal Journal</source><guid isPermaLink="true">https://practical.li/journal/flexiana-interview/</guid> <enclosure url="https://practical.li/journal/assets/images/social/flexiana-interview.png" type="image/png" length="43416" /> </item> <item> <title>Updating Practicalli Neovim</title> <author>Practicalli Johnny</author> <category>astronvim</category> <category>neovim</category> <category>practicalli</category> <description><p><a href="https://github.com/practicalli/astro">Practicalli Astro config</a> is not very stable so its time to refactor the <a href="https://practical.li/neovim">Practicalli Neovim</a> book now that the <a href="https://github.com/practicalli/astro">Practicalli Astro</a> configuration is established.</p></description><link>https://practical.li/journal/updating-practicalli-neovim/</link> <pubDate>Mon, 24 Jun 2024 00:00:00 +0000</pubDate><source url="https://practical.li/journal/feed_rss_created.xml">Practicalli Personal Journal</source><guid isPermaLink="true">https://practical.li/journal/updating-practicalli-neovim/</guid> <enclosure url="https://practical.li/journal/assets/images/social/updating-practicalli-neovim.png" type="image/png" length="50638" /> </item> <item> <title>Conjure LSP bug & Cycling video editing</title> <author>Practicalli Johnny</author> <category>clojure</category> <category>conjure</category> <category>cycling</category> <category>neovim</category> <category>practicalli</category> <description><p>Updated to Kitty 0.35.1 easily and switching between dark and light themes working instantly again.</p><p>Diagnosed a 'new buffer' error with Conjure when using Neovim 0.9.0 and when opening a Clojure file, although everything works well in 0.10.0. EDIT: The maintainer added a fix to the <code>develop</code> branch for testing.</p><p><a href="https://github.com/Olical/conjure/issues/582">#582 REVIEW: Conjure throws new Buffer error</a>{target=_blank .md-button}</p><p>Video editing of footage taken by the front mounted camera on my bicycle. Advanced cycle training at Gravesend at the start of June.<a href="https://youtu.be/7PnCrLdTmUo">:fontawesome-brands-youtube: Bigfoot Cycling Club at Gravesent Cyclopark</a></p><p>Took a few days away from the computer to work on the garden as its nice and sunny. A mostly sunny ride on Saturday around the Kent countryside.</p></description><link>https://practical.li/journal/conjure-lsp-bug--cycling-video-editing/</link> <pubDate>Mon, 17 Jun 2024 00:00:00 +0000</pubDate><source url="https://practical.li/journal/feed_rss_created.xml">Practicalli Personal Journal</source><guid isPermaLink="true">https://practical.li/journal/conjure-lsp-bug--cycling-video-editing/</guid> <enclosure url="https://practical.li/journal/assets/images/social/conjure-lsp-bug--cycling-video-editing.png" type="image/png" length="65948" /> </item> <item> <title>Neovim on Termux enhancements</title> <author>Practicalli Johnny</author> <category>neovim</category> <category>practicalli</category> <description><p>More Neovim updates and getting closer to a release of Practicalli Astro-config</p><p>I have been using Neovim (and Emacs) on Termux, so I can code on my Android tablet or Android smart phone. I typically use an external keyboard (e.g. Keyboard.io Atreus or Model100), especially when considerable typing is involved.</p><p>As the hardware and compilation tooling is different for Android Linux (compared to amd64 linux) the Clojure and Lua LSP language servers would not install via the Mason manager. As these two languages are in the top 3 languages I use, then it is a great boost to get these servers working locally and configuring Neovim to use them instead.</p><p>I use the <code>date</code> command when I had a need to tweak the time on my Linux computer, saves launching the <strong>Settings</strong> app and using the mouse.</p><p>!!! INFO "Timezones made easy" <a href="https://time.is/">time.is</a> makes figuring out timezones really simple. See the current time in any timezone across the world.</p><pre><code>time.is very useful for events where people attend from different timezones. Set the local time and share a link for others who will see the event time in their own timezone.</code></pre><h2>Neovim</h2><p>I'm making some changes to the Practicalli AstroNvim configuration (AstroNvim4) over the next few days.</p><p>All my personal Neovim &amp; plugin options (and associated workflow biases) will only be in <code>lua/plugins/practicalli.lua</code>. With these options only in one file, anyone else using the configuration can easily disable them.</p><p>I will encourage other users to create there own <code>lua/plugins/personal.lua</code> customisation so any changes from upstream will be easier to merge.</p><p>The GitHub repository will be renamed to <code>practicalli/astro-config</code> which its much easier to write and say during screencasts. GitHub should redirect when pulling updates</p><p>This week I will update Practicalli Neovim book install guide with new repo and further info on how to use the config effectively (especially with your own customisations)</p><p>Then the first official release of the config will be created via GitHub releases.</p><p>If I have time, there are lots of things to add to Practicalli Neovim book too (including a few more plugins I'm using in the config)</p></description><link>https://practical.li/journal/neovim-on-termux-enhancements/</link> <pubDate>Mon, 10 Jun 2024 00:00:00 +0000</pubDate><source url="https://practical.li/journal/feed_rss_created.xml">Practicalli Personal Journal</source><guid isPermaLink="true">https://practical.li/journal/neovim-on-termux-enhancements/</guid> <enclosure url="https://practical.li/journal/assets/images/social/neovim-on-termux-enhancements.png" type="image/png" length="51876" /> </item> <item> <title>Fixing Neovim Treesitter breaking changes</title> <author>Practicalli Johnny</author> <category>astronvim</category> <category>github</category> <category>neovim</category> <category>practicalli</category> <category>ssh</category> <description><p>The sun is out, the sky is blue... and I had the opportunity to understand some Neovim plugins a little more, in order to fix a breaking change with Neovim Treesitter support for Clojure.</p><p>!!! INFO "Pull Requests this week"</p><pre><code>- MERGED: [#7 queries: clojure has-type? updated to kind-eq?](https://github.com/PaterJason/nvim-treesitter-sexp/pull/7) for nvim-treesitter-sexp project</code></pre></description><link>https://practical.li/journal/fixing-neovim-treesitter-breaking-changes/</link> <pubDate>Mon, 03 Jun 2024 00:00:00 +0000</pubDate><source url="https://practical.li/journal/feed_rss_created.xml">Practicalli Personal Journal</source><guid isPermaLink="true">https://practical.li/journal/fixing-neovim-treesitter-breaking-changes/</guid> <enclosure url="https://practical.li/journal/assets/images/social/fixing-neovim-treesitter-breaking-changes.png" type="image/png" length="62426" /> </item> <item> <title>Multiple SSH keys for Commercial and Community work</title> <author>Practicalli Johnny</author> <category>git</category> <category>practicalli</category> <description><p>Its easy to go down a rabbit hole of your own making when trying to make something complex work. Taking a step back allows for a much simpler approach to be considered.</p><p>I realised there was a much simpler approach to managing multiple SSH keys, especially when one of those keys is for commercial work that requires Single Sign-On authorisation.</p></description><link>https://practical.li/journal/multiple-ssh-keys-for-commercial-and-community-work/</link> <pubDate>Mon, 27 May 2024 00:00:00 +0000</pubDate><source url="https://practical.li/journal/feed_rss_created.xml">Practicalli Personal Journal</source><guid isPermaLink="true">https://practical.li/journal/multiple-ssh-keys-for-commercial-and-community-work/</guid> <enclosure url="https://practical.li/journal/assets/images/social/multiple-ssh-keys-for-commercial-and-community-work.png" type="image/png" length="67263" /> </item> <item> <title>Refactor AstroNvim Clojure pack</title> <author>Practicalli Johnny</author> <category>neovim</category> <category>practicalli</category> <description><p>Pull requests this week</p><ul><li>:fontawesome-solid-code-pull-request: <strong>MERGED</strong> <a href="https://github.com/folke/ts-comments.nvim/pull/19">Add Clojure comment patterns to ts-comments.nvim</a></li><li>:fontawesome-solid-code-pull-request: <strong>MERGED</strong> <a href="https://github.com/AstroNvim/astrocommunity/pull/982">Modularise Astrocommunity Clojure pack</a></li><li>:fontawesome-solid-code-pull-request: <strong>MERGED</strong> <a href="https://github.com/AstroNvim/astrocommunity/pull/991">Update AstroNvim Cloure pack description &amp; simplify examples</a></li><li>:fontawesome-solid-code-pull-request: <strong>MERGED</strong> <a href="https://github.com/AstroNvim/astrocommunity/pull/992">Fix vim-visual-multi dependency name</a></li></ul><p>Total commits this week: 37</p><p>Submitted <a href="https://github.com/AstroNvim/astrocommunity/pull/982">a pull request to refactor the AstroNvim Community Clojure language pack</a> which I <a href="https://github.com/AstroNvim/astrocommunity/pull/248">contributed in June 2023</a>.</p><ul><li>add nvim-treesitter-sexp plugin</li><li>add example of disabling / configuring parinfer plugin</li><li>add ts-comment.nvim to support <code>;;</code> and <code>;</code> comment characters</li><li>remove autocmd from conjure plugin (no longer needed)</li><li>remove most of the opinionated conjure configuration overrides, although still hiding the repl log buffer (HUD) by default as its nicer as a separate tab. Maybe if I can have it open by default as a tab, then I could live with having the HUD open on REPL startup (a nice way to check things are working)</li></ul><p>Still sleepy from travel to the company off-site last week and the cycle ride on Saturday. Although I did manage some work in the garden on Sunday.</p></description><link>https://practical.li/journal/refactor-astronvim-clojure-pack/</link> <pubDate>Mon, 20 May 2024 00:00:00 +0000</pubDate><source url="https://practical.li/journal/feed_rss_created.xml">Practicalli Personal Journal</source><guid isPermaLink="true">https://practical.li/journal/refactor-astronvim-clojure-pack/</guid> <enclosure url="https://practical.li/journal/assets/images/social/refactor-astronvim-clojure-pack.png" type="image/png" length="59095" /> </item> <item> <title>Company offsite week</title> <author>Practicalli Johnny</author> <category>astronvim</category> <category>neovim</category> <category>practicalli</category> <description><p>Travelled for a work event in Portugal with a chance to meet people I work with face to face for the first time. It was a very enjoyable and also quite intensive event. I kept myself busy to help combat fatigue from travelling and manage a swim each morning and evening whilst I was at the hotel.</p><p>I am accustom to working remotely since 2010, having worked for companies based outside of the UK. It is always very valuable to meet people face to face and can start or strengthen a relationship.</p></description><link>https://practical.li/journal/company-offsite-week/</link> <pubDate>Mon, 13 May 2024 00:00:00 +0000</pubDate><source url="https://practical.li/journal/feed_rss_created.xml">Practicalli Personal Journal</source><guid isPermaLink="true">https://practical.li/journal/company-offsite-week/</guid> <enclosure url="https://practical.li/journal/assets/images/social/company-offsite-week.png" type="image/png" length="51274" /> </item> <item> <title>Gardening in the mornings</title> <author>Practicalli Johnny</author> <category>clojure</category> <category>practicalli</category> <description><p>A new month so time to update libraries across Practicalli projects.</p><p>Bank holiday Monday and two personal holidays this week, so only two days at work and very few meetings, yay!. Time to prepare for the company offsite event next week and see how lightly I can pack.</p><p>I made a big impact on upgrading the garden this week. All the paving stones at the end of the garden were levelled so the shed is no longer on a slope. A thick weed surpressing membrane was fitted underneath all the paving stones.</p><p>The raised garden bed was be reworked by adjusting the top of the railway sleepers to be level to the top of the paving stones. This adds a nice clean line with the garden and makes maintenance in and around the garden easier. Weed surpressing membrane was added to the side and underneath of each sleeper. Spare wood panels was used to keep the membrane in plate and to also add more robustness to the sleepers.</p><p>Most of the work was done in the early mornings as the weather was quite hot.</p></description><link>https://practical.li/journal/gardening-in-the-mornings/</link> <pubDate>Mon, 06 May 2024 00:00:00 +0000</pubDate><source url="https://practical.li/journal/feed_rss_created.xml">Practicalli Personal Journal</source><guid isPermaLink="true">https://practical.li/journal/gardening-in-the-mornings/</guid> <enclosure url="https://practical.li/journal/assets/images/social/gardening-in-the-mornings.png" type="image/png" length="50849" /> </item> <item> <title>500 Commit Streak on GitHub</title> <author>Practicalli Johnny</author> <category>clojure</category> <category>practicalli</category> <description><p>500 day commit streak on GitHub reached today. This was legitimately achieved by doing a small amount of work each day.</p><p>I am not actively coding and committing on a regular basis in my current role, so the large majority of these commits are for Practicalli or Open Source projects.</p><p><img alt="GitHub stats - 500 day commit streak" src="https://github.com/practicalli/graphic-design/blob/live/github/github-stats-streak-500-days-dark.png?raw=true"></p><p>Continuing to simplify the Practicalli AstroNvim User Config, so changes from the AstroNvim template are in new files or in <code>community.lua</code>.</p><p>The most visual opinionated changes are in <code>practicalli.lua</code>, such as dashboard logo and theme.</p><p>Motivated to work on the <a href="https://practical.li/sustainable-life">:fontawesome-solid-book-open: Practicalli Sustainable Life</a> book after joining a sustainability working group at the company.</p></description><link>https://practical.li/journal/500-commit-streak-on-github/</link> <pubDate>Mon, 29 Apr 2024 00:00:00 +0000</pubDate><source url="https://practical.li/journal/feed_rss_created.xml">Practicalli Personal Journal</source><guid isPermaLink="true">https://practical.li/journal/500-commit-streak-on-github/</guid> <enclosure url="https://practical.li/journal/assets/images/social/500-commit-streak-on-github.png" type="image/png" length="54356" /> </item> <item> <title>Practicalli Project Template updates</title> <author>Practicalli Johnny</author> <category>clojure</category> <category>practicalli</category> <description><p>Adding some nice little improvements to the <a href="https://github.com/practicalli/project-templates">:fontawesome-brands-github: Practicalli Project Templates</a></p></description><link>https://practical.li/journal/practicalli-project-template-updates/</link> <pubDate>Mon, 22 Apr 2024 00:00:00 +0000</pubDate><source url="https://practical.li/journal/feed_rss_created.xml">Practicalli Personal Journal</source><guid isPermaLink="true">https://practical.li/journal/practicalli-project-template-updates/</guid> <enclosure url="https://practical.li/journal/assets/images/social/practicalli-project-template-updates.png" type="image/png" length="52400" /> </item> <item> <title>Its April Fool</title> <author>Practicalli Johnny</author> <category>astronvim</category> <category>git</category> <category>neovim</category> <category>practicalli</category> <description><p>Adding SSH keys to the YubiKey hardware security key provides convenience of SSH key use, especially when required for multiple computers.</p><p>Using a YubiKey to keep a single SSH key pair removes the need to generate a key pair for each computer.</p><p>Using one SSH key avoids the need for multiple entries in the allowed-signatures file to check locally that a commit has been signed.</p></description><link>https://practical.li/journal/its-april-fool/</link> <pubDate>Mon, 01 Apr 2024 00:00:00 +0000</pubDate><source url="https://practical.li/journal/feed_rss_created.xml">Practicalli Personal Journal</source><guid isPermaLink="true">https://practical.li/journal/its-april-fool/</guid> <enclosure url="https://practical.li/journal/assets/images/social/its-april-fool.png" type="image/png" length="41641" /> </item> <item> <title>Git Multiple SSH Keys & Neovim</title> <author>Practicalli Johnny</author> <category>clojure</category> <category>git</category> <category>neovim</category> <category>practicalli</category> <description><p>A short week at work made even shorter by a company day to celebrate going live. A chance to unwind and reflect.</p><p><a href="https://github.com/neovim/neovim/milestones">Neovim 0.10 is planned for 1 May 2024</a>. Plugins should be unafected, although actively developing plugins like Neogit are trying to used parts of the Neovim API. The parts of Neogit that use 0.10 api should be more efficient, although I assume there wont be a noticable difference in functionality.</p><p>I will update Neovim to 0.10 when AstroNvim confirms it is working well with that release.</p></description><link>https://practical.li/journal/git-multiple-ssh-keys--neovim/</link> <pubDate>Mon, 25 Mar 2024 00:00:00 +0000</pubDate><source url="https://practical.li/journal/feed_rss_created.xml">Practicalli Personal Journal</source><guid isPermaLink="true">https://practical.li/journal/git-multiple-ssh-keys--neovim/</guid> <enclosure url="https://practical.li/journal/assets/images/social/git-multiple-ssh-keys--neovim.png" type="image/png" length="56395" /> </item> <item> <title>Having a Donut Party with system components</title> <author>Practicalli Johnny</author> <category>clojure</category> <category>donut</category> <category>practicalli</category> <category>repl-workflow</category> <description><p>Not quite back to full health yet, so took it easy at the weekend.</p><p>More work on restoring spare bicycles so I can sell them or otherwise find a good home.</p><p>Continued the refactor of the Practicalli Service template, specifically refining the design of the system config and helper functions to support a development REPL workflow.</p></description><link>https://practical.li/journal/having-a-donut-party-with-system-components/</link> <pubDate>Mon, 11 Mar 2024 00:00:00 +0000</pubDate><source url="https://practical.li/journal/feed_rss_created.xml">Practicalli Personal Journal</source><guid isPermaLink="true">https://practical.li/journal/having-a-donut-party-with-system-components/</guid> <enclosure url="https://practical.li/journal/assets/images/social/having-a-donut-party-with-system-components.png" type="image/png" length="62762" /> </item> <item> <title>Debian Linux almost everywhere</title> <author>Practicalli Johnny</author> <category>clojure</category> <category>practicalli</category> <description><p>Enjoying being back in Debian Linux world, with <a href="https://regolith-desktop.com/">regolith desktop</a> as the tiling window manager.</p><p>I have several Lenovo laptops and all but one are now upgraded to Debian Linux, using the testing version of the distribution.</p><p>The most significant difference with Debian Linux is the use of a separate root account for administration, rather than using <code>sudo</code> in Ubuntu Linux.</p></description><link>https://practical.li/journal/debian-linux-almost-everywhere/</link> <pubDate>Sun, 10 Mar 2024 00:00:00 +0000</pubDate><source url="https://practical.li/journal/feed_rss_created.xml">Practicalli Personal Journal</source><guid isPermaLink="true">https://practical.li/journal/debian-linux-almost-everywhere/</guid> <enclosure url="https://practical.li/journal/assets/images/social/debian-linux-almost-everywhere.png" type="image/png" length="54628" /> </item> <item> <title>Springing back into life slowly</title> <author>Practicalli Johnny</author> <category>clojure</category> <category>practicalli</category> <description><p>The last month has been tough due to illness, although still managed to do a little work with Practicalli to keep me motivated (both for work and my own personal health)</p><p>I though the Practicalli Project Templates had broken when I tried to create a new service project. It took me an hour or so to realise I had simply been using the command with the wrong argument, doh!</p></description><link>https://practical.li/journal/springing-back-into-life-slowly/</link> <pubDate>Mon, 04 Mar 2024 00:00:00 +0000</pubDate><source url="https://practical.li/journal/feed_rss_created.xml">Practicalli Personal Journal</source><guid isPermaLink="true">https://practical.li/journal/springing-back-into-life-slowly/</guid> <enclosure url="https://practical.li/journal/assets/images/social/springing-back-into-life-slowly.png" type="image/png" length="55385" /> </item> <item> <title>Alias Shell that updates Shell</title> <author>Practicalli Johnny</author> <category>clojure</category> <category>practicalli</category> <description><p>As this week is mosly tweaks for Zsh history, I've titled this journal entry to be a play on words from the Shakesphere play 'Alls well that ends well'.</p><p>The <code>fd</code> built-in command for Zsh is a very effective way to keep the command history clean.</p></description><link>https://practical.li/journal/alias-shell-that-updates-shell/</link> <pubDate>Mon, 26 Feb 2024 00:00:00 +0000</pubDate><source url="https://practical.li/journal/feed_rss_created.xml">Practicalli Personal Journal</source><guid isPermaLink="true">https://practical.li/journal/alias-shell-that-updates-shell/</guid> <enclosure url="https://practical.li/journal/assets/images/social/alias-shell-that-updates-shell.png" type="image/png" length="54203" /> </item> <item> <title>Engineering Practices</title> <author>Practicalli Johnny</author> <category>practicalli</category> <description><p>Illness is all around. Around 12% of people in Germany are currenly ill through covid, flu or a stomach virus. I have some relatively mild symptoms this week.</p><p>The hunt for a new place to live continues, investigating lots of facinating places in Scotland. Discovered an Ecopark with sustainably built housing. There is one house for sale and some new builds in the near future. Requested a build plan for the new build houses.</p></description><link>https://practical.li/journal/engineering-practices/</link> <pubDate>Mon, 19 Feb 2024 00:00:00 +0000</pubDate><source url="https://practical.li/journal/feed_rss_created.xml">Practicalli Personal Journal</source><guid isPermaLink="true">https://practical.li/journal/engineering-practices/</guid> <enclosure url="https://practical.li/journal/assets/images/social/engineering-practices.png" type="image/png" length="47279" /> </item> <item> <title>The editors strike back</title> <author>Practicalli Johnny</author> <category>practicalli</category> <description><p>Interesting edge cases with evil-cleverparens and another question about choice of editor for complete beginners to programming.</p><p>Covid strikes again. Wiped out by the end of the week.</p></description><link>https://practical.li/journal/the-editors-strike-back/</link> <pubDate>Mon, 12 Feb 2024 00:00:00 +0000</pubDate><source url="https://practical.li/journal/feed_rss_created.xml">Practicalli Personal Journal</source><guid isPermaLink="true">https://practical.li/journal/the-editors-strike-back/</guid> <enclosure url="https://practical.li/journal/assets/images/social/the-editors-strike-back.png" type="image/png" length="47965" /> </item> <item> <title>Striving toward consistency</title> <author>Practicalli Johnny</author> <category>practicalli</category> <description><p>Will feel good to have all Practicalli website content have a consisten look.</p><p>Material for MkDocs really helps me convey information effectively (at least in my own view).</p><p>Still have a few covid symptoms, but not as much this week. Usually only in the mornings.</p></description><link>https://practical.li/journal/striving-toward-consistency/</link> <pubDate>Mon, 05 Feb 2024 00:00:00 +0000</pubDate><source url="https://practical.li/journal/feed_rss_created.xml">Practicalli Personal Journal</source><guid isPermaLink="true">https://practical.li/journal/striving-toward-consistency/</guid> <enclosure url="https://practical.li/journal/assets/images/social/striving-toward-consistency.png" type="image/png" length="55157" /> </item> <item> <title>No one is omnipotent</title> <author>Practicalli Johnny</author> <category>practicalli</category> <description><p>Understand what is the most valuable thing and focus on attaing it.</p><p>Technical writing is a skill that regularly needs practice.</p></description><link>https://practical.li/journal/no-one-is-omnipotent/</link> <pubDate>Mon, 29 Jan 2024 00:00:00 +0000</pubDate><source url="https://practical.li/journal/feed_rss_created.xml">Practicalli Personal Journal</source><guid isPermaLink="true">https://practical.li/journal/no-one-is-omnipotent/</guid> <enclosure url="https://practical.li/journal/assets/images/social/no-one-is-omnipotent.png" type="image/png" length="47244" /> </item> <item> <title>Quiet before the storm</title> <author>Practicalli Johnny</author> <category>practicalli</category> <description><p>Its not as windy as previous weeks, but there is another storm on its way.</p><p>Feeling too tired for exercise over the weekend, need to pace myself at work a little better.</p><p>Hopefully as the weather gets warmer or at least sunnier it will be easier to do more outside activities.</p></description><link>https://practical.li/journal/quiet-before-the-storm/</link> <pubDate>Mon, 22 Jan 2024 00:00:00 +0000</pubDate><source url="https://practical.li/journal/feed_rss_created.xml">Practicalli Personal Journal</source><guid isPermaLink="true">https://practical.li/journal/quiet-before-the-storm/</guid> <enclosure url="https://practical.li/journal/assets/images/social/quiet-before-the-storm.png" type="image/png" length="48189" /> </item> <item> <title>Warmer weather</title> <author>Practicalli Johnny</author> <category>astronvim</category> <category>clojure</category> <category>neovim</category> <category>practicalli</category> <description><p>Practicalli AstroNvim User Config changed to be as additive as possible, leaving the template as unchanged as possible.</p><p>The sunnier weather is a boots to motivation, although its still very windy. At least I can get into the garden without sinking.</p><p>Another Saturday morning ride, a tough experience although not completely exhausted afterward.</p></description><link>https://practical.li/journal/warmer-weather/</link> <pubDate>Mon, 15 Jan 2024 00:00:00 +0000</pubDate><source url="https://practical.li/journal/feed_rss_created.xml">Practicalli Personal Journal</source><guid isPermaLink="true">https://practical.li/journal/warmer-weather/</guid> <enclosure url="https://practical.li/journal/assets/images/social/warmer-weather.png" type="image/png" length="43596" /> </item> <item> <title>Breaking ground on the new year</title> <author>Practicalli Johnny</author> <category>practicalli</category> <description><p>Rushing work is the slowest way to make progress.</p><p>Exhausted after this week of work, so took a break from cycling and running. Lots of cat naps over the weekend.</p></description><link>https://practical.li/journal/breaking-ground-on-the-new-year/</link> <pubDate>Mon, 08 Jan 2024 00:00:00 +0000</pubDate><source url="https://practical.li/journal/feed_rss_created.xml">Practicalli Personal Journal</source><guid isPermaLink="true">https://practical.li/journal/breaking-ground-on-the-new-year/</guid> <enclosure url="https://practical.li/journal/assets/images/social/breaking-ground-on-the-new-year.png" type="image/png" length="53297" /> </item> </channel></rss> \ No newline at end of file diff --git a/feed_rss_updated.xml b/feed_rss_updated.xml index 74534c20..c03e5877 100644 --- a/feed_rss_updated.xml +++ b/feed_rss_updated.xml @@ -1 +1 @@ -<?xml version="1.0" encoding="UTF-8" ?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/"> <channel><title>Practicalli Personal Journal</title><description>Daily journal of thoughts and experiences</description><link>https://practical.li/journal/</link><atom:link href="https://practical.li/journal/feed_rss_updated.xml" rel="self" type="application/rss+xml" /><managingEditor>Practicalli</managingEditor><docs>https://github.com/practicalli/journal/</docs><language>en</language> <pubDate>Sun, 19 Jan 2025 22:58:44 -0000</pubDate> <lastBuildDate>Sun, 19 Jan 2025 22:58:44 -0000</lastBuildDate> <ttl>1440</ttl> <generator>MkDocs RSS plugin - v1.17.1</generator> <image> <url>https://github.com/practicalli/graphic-design/blob/live/logos/practicalli-logo.png?raw=true</url> <title>Practicalli Personal Journal</title><link>https://practical.li/journal/</link> </image> <item> <title>Learning Linux like its 1995</title> <author>Practicalli Johnny</author> <category>clojure</category> <category>practicalli</category> <description><p>Using Arch Linux (for Hyprland experiments) takes me back to the mid 1990's when I was learning Linux from the ground up.</p><p>At the end of 1994 I was installing Slackware Linux (from 82 floppy disks) and spending hours figuring out what to compile into the Linux kernel (before the days of dynamic loading). There was a huge amount to learn (usually without my own internet connection).</p><p>Arch Linux wiki pages have a huge amount of information, showing all the possible options for every piece of software and service. This does present a dilemma of choice.</p><p>Having experienced many years with Linux, I know many of the concepts and software associated with a Linux system. I dont need to read all the options, but do find myself scrolling a lot until I find something familiar (or simple).</p><p>The goals for this month include</p><ul><li>documenting Neovim &amp; Conjure workflow</li><li>meaningful exercise every day (health permitting)</li><li>bicycle ride (weather permitting)</li><li>avoid Hyprland turning into a huge time sync (couch potato time only)</li></ul><p>My health took more of a knock this week as I am finding it very difficult to walk. I've had pain in my right hip for a couple of weeks and on Friday I started walking and felt a sharp pain. Every step with my right leg is painful and going up and down stairs is particularly painful.</p><p>The hip pain coupled with my left knee pain significantly limiting my ability to exercise this week.</p><p>Movies this week:</p><ul><li><a href="https://en.wikipedia.org/wiki/Death_on_the_Nile_(1978_film)">Death on the Nile 1978</a> with Peter Ustinov as Hercule Poirot, including an all-star cast from the time including David Niven, Angela Landsbury and Betty Davis.</li></ul></description><link>https://practical.li/journal/learning-linux-like-its-1995/</link> <pubDate>Sun, 19 Jan 2025 22:54:42 +0000</pubDate><source url="https://practical.li/journal/feed_rss_updated.xml">Practicalli Personal Journal</source><guid isPermaLink="true">https://practical.li/journal/learning-linux-like-its-1995/</guid> <enclosure url="https://practical.li/journal/assets/images/social/learning-linux-like-its-1995.png" type="image/png" length="0" /> </item> <item> <title>A freezing start to a new year</title> <author>Practicalli Johnny</author> <category>archlinux</category> <category>audacity</category> <category>opus</category> <category>practicalli</category> <description><p>GitHub is currently <a href="https://github.com/actions/runner-images/issues/10636">:fontawesome-brands-github: rolling out a change to make Ubuntu 24.04 the default image</a> when <a href="#github-ci-workflow">running a workflow on <code>ubuntu-latest</code></a>. As some packages have been removed to save space, then its prudent to give the <a href="https://practical.li/engineering-playbook/continuous-integration/github/workflows/practicalli/">:fontawesome-solid-book-open: Practicalli GitHub workflows</a>{target=_blank} a test on Ubuntu 24.04.</p><p>Organising my <a href="#digital-music">digital music</a> and audio books so they all fit nicely on my smart phone (using Opus audio format and VLC to play the music).</p><p><a href="#arch-linux">Arch Linux</a> recommends not using <code>pacman -Syu</code> to update all packages and today I experience why. I can no longer login to the desktop :facepalm: EDIT: this seems to be specific to the NWG-shell configuration, as the vanilla hyprland desktop does work.</p><p>I assume this is a breaking change of hyprland that NWG-shell has not resolved. This is another reason to start again with hyprland and build my own config (although this will be a big time sink, so can wait).</p><p>Its freezing temperatures outside in London, UK at the moment, so I am trying to get outside when the sun is still shining. The paths are slippy and so are the roads, so even if I felt up to cycling outside, then it could be quite tricky.</p></description><link>https://practical.li/journal/a-freezing-start-to-a-new-year/</link> <pubDate>Sun, 12 Jan 2025 21:29:51 +0000</pubDate><source url="https://practical.li/journal/feed_rss_updated.xml">Practicalli Personal Journal</source><guid isPermaLink="true">https://practical.li/journal/a-freezing-start-to-a-new-year/</guid> <enclosure url="https://practical.li/journal/assets/images/social/a-freezing-start-to-a-new-year.png" type="image/png" length="None" /> </item> <item> <title>A new dawn a new day its a new life</title> <author>Practicalli Johnny</author> <category>neovim</category> <category>practicalli</category> <description><p>As we come to the end of 2025 I continue to contemplate what is next?</p><p>Do I want to continue in the software engineering industry with its many systemic faults?</p><p>Or should I branch out and do something completely different?</p><p><a href="https://80000hours.org/">80,000 hours</a> is a guide to careers that have a positive impact on the world.</p><p>My searching for a new home are currently focusing on the East coast of Scotland (which is dryer than London at the moment). Aberdeen (the granite city) has good support for cycling and a few cycle clubs in the area.</p><p>Wired up my Playstation 4 and VR headset to start playing games again. During more severe covid symptoms I couldnt wear the VR headset as it put too much pressure on my head. From an hour of play today, the VR headset felt okay.</p><p>I had a few quick games of Stardust and one surprisingly successful game of <a href="https://youtube.com/playlist?list=PLy9I_IfUBzKJgBTlbzRB0k4i1ARDVPSgy&amp;si=Fq2TPODPdD1YQ6cI">Polybius</a>.</p></description><link>https://practical.li/journal/a-new-dawn-a-new-day-its-a-new-life/</link> <pubDate>Fri, 03 Jan 2025 00:00:58 +0000</pubDate><source url="https://practical.li/journal/feed_rss_updated.xml">Practicalli Personal Journal</source><guid isPermaLink="true">https://practical.li/journal/a-new-dawn-a-new-day-its-a-new-life/</guid> <enclosure url="https://practical.li/journal/assets/images/social/a-new-dawn-a-new-day-its-a-new-life.png" type="image/png" length="None" /> </item> <item> <title>Holiday stuffing</title> <author>Practicalli Johnny</author> <category>emacs</category> <category>neovim</category> <category>practicalli</category> <description><p>Feeling a little sick so binging on movies and shows on Apple TV+. On Monday afternoon Apple TV+ would not stream content (the play button disappeared) although I could browse the catalogue of shows. After several hours the play button came back, although contacting Apple support was quite pointless.</p><p><img alt="Mooless Moo Plant bases stake and ale pie" src="https://optimise2.assets-servd.host/political-lechwe/production/Mooless-info.jpg?w=1600&amp;h=904&amp;q=82&amp;fm=webp&amp;fit=crop&amp;dm=1681290833&amp;s=8fc234ed1acd070f99e0a7b3ef95079c">{align=right loading=lazy style="width:360px"}</p><p>A relaxing week trying out some new vegetarian and vegan meals. <a href="https://shop.pieminister.co.uk/products/mooless-moo/">Pieminister Mooless Moo pie</a> is a plant based stake and ale pie, using jackfruit for the stake pieces. The pastry was lovely and crispy and the pie was very filling. The only downside to the pie for me was it was the taste and texture was too much like beef and I've never really liked that even when I did eat meat.</p><p>New potatoes, Edamame, Spinach and Garden Peas complement the pie, along with some very thick <a href="https://www.bisto.co.uk/products/bisto-best-vegetable-gravy-granules-230g/">Bisto Best Vegetable Gravy</a> (I add way too many granules to make the gravy nice and thick).</p></description><link>https://practical.li/journal/holiday-stuffing/</link> <pubDate>Sun, 29 Dec 2024 18:31:27 +0000</pubDate><source url="https://practical.li/journal/feed_rss_updated.xml">Practicalli Personal Journal</source><guid isPermaLink="true">https://practical.li/journal/holiday-stuffing/</guid> <enclosure url="https://practical.li/journal/assets/images/social/holiday-stuffing.png" type="image/png" length="0" /> </item> <item> <title>Finding My Joy</title> <author>Practicalli Johnny</author> <category>clojure</category> <category>practicalli</category> <description><p>In season 2, episode 2 of "The Big Door Prize" they talk about "Finding your Joy". This seems like an inspiring new years resolution, or at least a theme I should focus on for 2025.</p><p>You only live one life and you should take time out to enjoy it. There were many aspects to 2024 that constrained my joy, so I will endeavour to may 2025 a most joyous year.</p><p>Practicalli Updates:</p><ul><li><a href="https://practical.li/clojure/data-inspector/">Clojure Data Inspector tools - overview and portal page updated</a></li></ul></description><link>https://practical.li/journal/finding-my-joy/</link> <pubDate>Sun, 22 Dec 2024 18:42:20 +0000</pubDate><source url="https://practical.li/journal/feed_rss_updated.xml">Practicalli Personal Journal</source><guid isPermaLink="true">https://practical.li/journal/finding-my-joy/</guid> <enclosure url="https://practical.li/journal/assets/images/social/finding-my-joy.png" type="image/png" length="None" /> </item> <item> <title>What is past is prologue</title> <author>Practicalli Johnny</author> <category>appimage</category> <category>debian</category> <category>hyprland</category> <category>leadership</category> <category>practicalli</category> <description><p>!!! QUOTE If a technology was truly dead, no one would feel the need to talk about it on the internet</p><h2>Dead is mainstream</h2><p>When people state that some technology or practice is dead via the internet, it typically means that thing is the mainstream.</p><p>If something was truely dead, no one would feel the need to talk about it as that topic would not relate to anyone.</p><p>This technique is essentially click-bate and trying to persuade you to 'buy-in' to something else (usually for the profit of aother person)</p></description><link>https://practical.li/journal/what-is-past-is-prologue/</link> <pubDate>Sun, 15 Dec 2024 13:23:01 +0000</pubDate><source url="https://practical.li/journal/feed_rss_updated.xml">Practicalli Personal Journal</source><guid isPermaLink="true">https://practical.li/journal/what-is-past-is-prologue/</guid> <enclosure url="https://practical.li/journal/assets/images/social/what-is-past-is-prologue.png" type="image/png" length="None" /> </item> <item> <title>Long Cold Winter</title> <author>Practicalli Johnny</author> <category>codec</category> <category>mason</category> <category>neovim</category> <category>opus</category> <category>practicalli</category> <description><p><a href="#converting-audio-with-ffmpeg">Converted some audio files to Opus codec</a>, which provides a really optimum compression and allows for relatively low bit rates and results in much smaller files with the same quality.</p><p>Neovim upcoming changes</p><ul><li>neovim 0.11 has some breaking changes, so assume early in 2025</li><li>astronvim v5 once neovim 0.11 released</li><li><a href="https://github.com/WhoIsSethDaniel/mason-tool-installer.nvim">:fontawesome-brands-github: mason-tool-installer.nvim</a> to simplify mason config in astronvim v5 - discussed in Atronvim Discord community. maston-tool-installer still <a href="https://github.com/WhoIsSethDaniel/mason-tool-installer.nvim/blob/main/lua/mason-tool-installer/init.lua">:fontawesome-brands-github: uses the mason registry</a> for tool versions.</li></ul><p>Starting to <a href="#notes-for-updating-my-cv">update my CV from recent commercial experiences</a>, focusing on the areas of product, delivery and people.</p></description><link>https://practical.li/journal/long-cold-winter/</link> <pubDate>Wed, 11 Dec 2024 11:22:17 +0000</pubDate><source url="https://practical.li/journal/feed_rss_updated.xml">Practicalli Personal Journal</source><guid isPermaLink="true">https://practical.li/journal/long-cold-winter/</guid> <enclosure url="https://practical.li/journal/assets/images/social/long-cold-winter.png" type="image/png" length="None" /> </item> <item> <title>Making use of Black Friday</title> <author>Practicalli Johnny</author> <category>hardware</category> <category>network-attached-storage</category> <category>network-file-system</category> <category>solid-state-drive</category> <category>thecus</category> <description><p>Black Friday as a concept is confusing as it no longer has anything to do with a specific Friday and currently seems to cover at least 2 weeks of promotions. I did get some good prices even before Black Friday actually started.</p><p><a href="#nas">Adventures with SSD and NAS Versions</a> kept me busy over the weekend, resurrecting an older NAS unit with Solid State Drives for a very quiet media storage device.</p></description><link>https://practical.li/journal/making-use-of-black-friday/</link> <pubDate>Sun, 01 Dec 2024 18:18:38 +0000</pubDate><source url="https://practical.li/journal/feed_rss_updated.xml">Practicalli Personal Journal</source><guid isPermaLink="true">https://practical.li/journal/making-use-of-black-friday/</guid> <enclosure url="https://practical.li/journal/assets/images/social/making-use-of-black-friday.png" type="image/png" length="54253" /> </item> <item> <title>Linux Wayland Compositor & Hyprland</title> <author>Practicalli Johnny</author> <category>debian</category> <category>hyprland</category> <category>linux</category> <category>neovim</category> <category>practicalli</category> <category>slack</category> <description><p>A friend recommended <a href="https://hyprland.org/">Hyprland window manager</a> which is similar to i3 window manager I currently used, but more optomised for the Wayland compositor.</p><p>Practicalli currently uses Regolith Desktop, a complete Linux desktop that leverages Gnome and i3 tiling window manager.</p><p>Regolith Desktop provides quite a rich experience using the <code>regolith-desktop</code> Debian package. I have not had much success with Regolith when running with Wayland (specifically Sway).</p><p>Sway compositor is an implementation of wayland for i3 window manager. Some of my applications do not see to play nice with Sway (e.g. chromium browser scrolling, simplescreenrecorder cannot run on wayland).</p><p>OBS did seem to work okay on wayland, given a sufficiently recent version.</p><p>A friend recommended Hyprland, a tiling compositor that provides the latest Wayland features and lots of eye candy. Its pretty easy to setup on Debian, although there is much additional setup before it would be comparable to Regolith Desktop.</p><p>Neovim Grug plugin is being considered as an alternative to the Spectre tool for search and replacing across a project.</p></description><link>https://practical.li/journal/linux-wayland-compositor--hyprland/</link> <pubDate>Fri, 22 Nov 2024 22:52:13 +0000</pubDate><source url="https://practical.li/journal/feed_rss_updated.xml">Practicalli Personal Journal</source><guid isPermaLink="true">https://practical.li/journal/linux-wayland-compositor--hyprland/</guid> <enclosure url="https://practical.li/journal/assets/images/social/linux-wayland-compositor--hyprland.png" type="image/png" length="59724" /> </item> <item> <title>Practicalli plans for the rest of the year</title> <author>Practicalli Johnny</author> <category>github</category> <category>hardware</category> <category>practicalli</category> <category>practicalli</category> <description><p>Starting to <a href="#practicalli-plans">plan work for the Practicalli content</a> for the next 3 months.</p><p>On the Practicalli GitHub Org, <a href="#optimise-github-org-log-retention">action log retention time was minimised</a> to a week (from 90 days) as I don't need to wade through that history and it will save a bit of storage in the Cloud. I am surprised GitHub have such a high default for their free plans.</p><p>Upgraded to a <a href="#new-monitor">Dell 40 inch 5k2k monitor</a> for work and it makes a huge difference. Its a beautiful monitor and it works really well with Linux and the tiling window of Regolith Desktop (i3).</p><p>I am continuing my search for a new place to live, even further into the countryside with easy access to hiking and cycling activities.</p><p>Although I am always thankful for an opportunity to work with a commercial company, I do feel the weight lifted from my shoulders now that relationship has concluded. Within hours I started to feel the return of much of the energy I have been lacking for the last few months.</p><p>They do say a change is as good as a rest, so investing time in Practicalli content is giving me an energy boost.</p><p><img alt="Freedom quote" src="https://cdn4.geckoandfly.com/wp-content/uploads/2016/07/freedom-quotes-10.jpg">{loading=lazy}</p></description><link>https://practical.li/journal/practicalli-plans-for-the-rest-of-the-year/</link> <pubDate>Fri, 22 Nov 2024 13:36:03 +0000</pubDate><source url="https://practical.li/journal/feed_rss_updated.xml">Practicalli Personal Journal</source><guid isPermaLink="true">https://practical.li/journal/practicalli-plans-for-the-rest-of-the-year/</guid> <enclosure url="https://practical.li/journal/assets/images/social/practicalli-plans-for-the-rest-of-the-year.png" type="image/png" length="54273" /> </item> <item> <title>The wonderful complexity of people</title> <author>Practicalli Johnny</author> <category>leadership</category> <category>practicalli</category> <description><p>!!! QUOTE "A Tail of Two Cities - Charles Dickens" It was the best of times, it was the worst of times.</p><p>!!! QUOTE "Johnny Stevenson (maybe others)" People are wonderfully complex experiences</p><p>My feelings of disappointed with my current commercial role are returning to the forefront of my mind. Many aspects of the role and company seem to be clear in peoples minds but not always effectively shared. I think I understand the role and then something else happens that makes me feel I don't. I believe something will need to change soon for the benefit of all.</p><p>There have been a few highlights with the role, but I expected more of myself and the company. I do set high expectations for myself, although have learned to be more kind about what I can realistically achieve and 'which battles to fight' (figuratively speaking of course).</p><p>During this engagement I have continually reset my expectations about what could be achieved and what I could realistically achieve. There are a couple of peers where there has been conflict without understanding of why I am seen as the cause. I have tried to explore but if people do have issues with me its not clearly being communicated to me.</p><p>In hindsight, many opportunities to get support from my manger and peers were missed. Mostly as we had so many challenges to discuss and partly due to pressures of delivery.</p><p>When a person doesn't have clarity around a problem then there is very little they can do to resolve or adapt.</p><p>A self-reflection review is in progress and its is a good opportunity to take my own time to reflect on my current role and if its still the right fit for me.</p></description><link>https://practical.li/journal/the-wonderful-complexity-of-people/</link> <pubDate>Thu, 21 Nov 2024 17:03:42 +0000</pubDate><source url="https://practical.li/journal/feed_rss_updated.xml">Practicalli Personal Journal</source><guid isPermaLink="true">https://practical.li/journal/the-wonderful-complexity-of-people/</guid> <enclosure url="https://practical.li/journal/assets/images/social/the-wonderful-complexity-of-people.png" type="image/png" length="56883" /> </item> <item> <title>The king is probably dead long live the king</title> <author>Practicalli Johnny</author> <category>leadership</category> <category>practicalli</category> <description><p>!!! QUOTE You are only a leader if people are willing to follow</p><p>It has been hard to shake the concern that my current commercial role has not worked out, probably not really been working for quite a while in hindsight. Was it ever really working?</p><p>Some aspects have greatly improved but there are some fundamental communication constraints that I really didn't understand the cause of (plenty of assumptions, but not enough communication or time to really address these challenges).</p><p>There are the common systemic challenges that come from working at any startup that is working hard to establish itself as a long term sustainable business. This was a given. A new person coming into this environment that has been running for many years leaves a lot of context unknown and typically unspoken.</p><p>I continued to try identify the causes throughout the week and trying to evaluate if there is any appetite and opportunity to address these within our typical schedule. It did feel that the more I tried to connect the quicker the feeling of connection slipped away.</p><p>I believe my frustration and disappointment have been leaking out over the last month, which I am disappointed about as well.</p><p>It is always a challenge for an engineering manager to identify where they can add value. For much of the current role I never seemed to connect with the team at a deep enough level. It is too easy to feel I am simply not needed by the team as the communication has been very limited. In once exceptional case, it was easy to feel my presence was simply not wanted.</p><p>Tuesday I was really exhausted, partly because of the continued cough but also the concerns that I still wasn't able to break through to the team (especially if they feel unsafe to ask questions). I am not sleeping well and need to find energy to exercise more.</p><p>Wednesday I made time for self-reflection as part of the company feedback initiative. I did struggle to quantify to myself what I had done. In hindsight I should have spend more time on this and consulted my journal, although I still feel I would come up short of my own lofty goals for the role.</p><p>Friday was the end of my commercial current role.</p><blockquote><p>The title of this article is from the first episode of the first series of the Black Adder TV show. There were quite a few Shakepearean quotes used for comic effect.</p></blockquote></description><link>https://practical.li/journal/the-king-is-probably-dead-long-live-the-king/</link> <pubDate>Thu, 21 Nov 2024 17:03:42 +0000</pubDate><source url="https://practical.li/journal/feed_rss_updated.xml">Practicalli Personal Journal</source><guid isPermaLink="true">https://practical.li/journal/the-king-is-probably-dead-long-live-the-king/</guid> <enclosure url="https://practical.li/journal/assets/images/social/the-king-is-probably-dead-long-live-the-king.png" type="image/png" length="60338" /> </item> <item> <title>Debian Linux migration</title> <author>Practicalli Johnny</author> <category>practicalli</category> <description><p>Enjoying Debian Linux and freedom from Snaps</p></description><link>https://practical.li/journal/debian-linux-migration/</link> <pubDate>Sun, 17 Nov 2024 11:16:06 +0000</pubDate><source url="https://practical.li/journal/feed_rss_updated.xml">Practicalli Personal Journal</source><guid isPermaLink="true">https://practical.li/journal/debian-linux-migration/</guid> <enclosure url="https://practical.li/journal/assets/images/social/debian-linux-migration.png" type="image/png" length="49250" /> </item> <item> <title>Holiday in Paramout Plus</title> <author>Practicalli Johnny</author> <category>clojure</category> <category>practicalli</category> <description><p>After being ill for most of the week I am finally starting to enjoying my second week of holiday, binging on some Paramount+ and having a lazy Sunday enjoying the extra hour in bed after the end of summer time.</p><p>Updating Practicalli Journal and Clojure CLI Config repositories, fixing links and markdown issues from the Megalinter reports.</p><p>Updating to Megalinter 0.8.1 GitHub action on Practicalli repositories as I work on them. The upgrade will include each repository in the Grafana dashboards for Practicalli projects.</p><p>Issues</p><ul><li><strong>DOING</strong> <a href="https://github.com/practicalli/clojure-cli-config/issues/87">security: add clj-watson to clojure cli config</a></li><li><strong>DOING</strong> zsh environment varaibles not loading into jvm</li></ul></description><link>https://practical.li/journal/holiday-in-paramout-plus/</link> <pubDate>Sun, 17 Nov 2024 11:16:06 +0000</pubDate><source url="https://practical.li/journal/feed_rss_updated.xml">Practicalli Personal Journal</source><guid isPermaLink="true">https://practical.li/journal/holiday-in-paramout-plus/</guid> <enclosure url="https://practical.li/journal/assets/images/social/holiday-in-paramout-plus.png" type="image/png" length="48672" /> </item> <item> <title>Practicalli Project Spring 2023</title> <author>Practicalli Johnny</author> <category>clojurists-together</category> <description><p><img alt="Clojurists Together Logo" src="https://raw.githubusercontent.com/practicalli/graphic-design/live/buttons/practicalli-clojurists-together-button.svg">{align=right loading=lazy style="height:150px;width:150px"}</p><p>Due to covid illness during 2022 the planned work has been spread over late 2022 - early 2023.</p></description><link>https://practical.li/journal/practicalli-project-spring-2023/</link> <pubDate>Sun, 17 Nov 2024 11:16:06 +0000</pubDate><source url="https://practical.li/journal/feed_rss_updated.xml">Practicalli Personal Journal</source><guid isPermaLink="true">https://practical.li/journal/practicalli-project-spring-2023/</guid> <enclosure url="https://practical.li/journal/assets/images/social/practicalli-project-spring-2023.png" type="image/png" length="54214" /> </item> <item> <title>Back to work</title> <author>Practicalli Johnny</author> <category>clojure</category> <category>practicalli</category> <description><p>Busy week at work getting ready for a new team member. I spent Friday afternoon building up a relationship and getting accustom to spending time working together. Several weeks of work had been done to get ready for the new starter.</p><p>One of the interesting challenges for anyone starting a new job is to ensure too much enthusiasm doesnt lead to missing important steps. It will be a good first check-in with the new starter to see if they have been too enthusiastic or taken a more measured approach.</p><p>Current issues</p><ul><li><strong>DONE</strong> <a href="https://github.com/practicalli/clojure-cli-config/issues/87">security: add clj-watson to clojure cli config</a></li></ul></description><link>https://practical.li/journal/back-to-work/</link> <pubDate>Tue, 05 Nov 2024 19:37:11 +0000</pubDate><source url="https://practical.li/journal/feed_rss_updated.xml">Practicalli Personal Journal</source><guid isPermaLink="true">https://practical.li/journal/back-to-work/</guid> <enclosure url="https://practical.li/journal/assets/images/social/back-to-work.png" type="image/png" length="43152" /> </item> <item> <title>Practicalli work over the winter break</title> <author>Practicalli Johnny</author> <category>practicalli</category> <description><p>The company I work for takes a break over the winter, so I have some time to spend on Practicalli content.</p></description><link>https://practical.li/journal/practicalli-work-over-the-winter-break/</link> <pubDate>Tue, 22 Oct 2024 15:22:01 +0000</pubDate><source url="https://practical.li/journal/feed_rss_updated.xml">Practicalli Personal Journal</source><guid isPermaLink="true">https://practical.li/journal/practicalli-work-over-the-winter-break/</guid> <enclosure url="https://practical.li/journal/assets/images/social/practicalli-work-over-the-winter-break.png" type="image/png" length="56481" /> </item> <item> <title>Onboarding to a new role, hacking Clojure & Neovim</title> <author>Practicalli Johnny</author> <category>practicalli</category> <description><p>Nervous excitement about starting a new role and hopeful I dont mess it up.</p><p>Enjoying writing a regular practicalli again, which is something I missed when not working.</p></description><link>https://practical.li/journal/onboarding-to-a-new-role-hacking-clojure--neovim/</link> <pubDate>Tue, 22 Oct 2024 15:22:01 +0000</pubDate><source url="https://practical.li/journal/feed_rss_updated.xml">Practicalli Personal Journal</source><guid isPermaLink="true">https://practical.li/journal/onboarding-to-a-new-role-hacking-clojure--neovim/</guid> <enclosure url="https://practical.li/journal/assets/images/social/onboarding-to-a-new-role-hacking-clojure--neovim.png" type="image/png" length="68037" /> </item> <item> <title>Discussing new role expectations</title> <author>Practicalli Johnny</author> <category>practicalli</category> <description><p>Learning a little more about the responsibilities and expectations of the new role, which seems very much as expected.</p></description><link>https://practical.li/journal/discussing-new-role-expectations/</link> <pubDate>Tue, 22 Oct 2024 15:22:01 +0000</pubDate><source url="https://practical.li/journal/feed_rss_updated.xml">Practicalli Personal Journal</source><guid isPermaLink="true">https://practical.li/journal/discussing-new-role-expectations/</guid> <enclosure url="https://practical.li/journal/assets/images/social/discussing-new-role-expectations.png" type="image/png" length="56297" /> </item> <item> <title>Health and new chair</title> <author>Practicalli Johnny</author> <category>practicalli</category> <description><p>The BeYou chair is being delivered today, will it live up to my expectations?</p></description><link>https://practical.li/journal/health-and-new-chair/</link> <pubDate>Tue, 22 Oct 2024 15:22:01 +0000</pubDate><source url="https://practical.li/journal/feed_rss_updated.xml">Practicalli Personal Journal</source><guid isPermaLink="true">https://practical.li/journal/health-and-new-chair/</guid> <enclosure url="https://practical.li/journal/assets/images/social/health-and-new-chair.png" type="image/png" length="45729" /> </item> <item> <title>Its April Fool</title> <author>Practicalli Johnny</author> <category>astronvim</category> <category>git</category> <category>neovim</category> <category>practicalli</category> <description><p>Adding SSH keys to the YubiKey hardware security key provides convenience of SSH key use, especially when required for multiple computers.</p><p>Using a YubiKey to keep a single SSH key pair removes the need to generate a key pair for each computer.</p><p>Using one SSH key avoids the need for multiple entries in the allowed-signatures file to check locally that a commit has been signed.</p></description><link>https://practical.li/journal/its-april-fool/</link> <pubDate>Tue, 22 Oct 2024 15:22:01 +0000</pubDate><source url="https://practical.li/journal/feed_rss_updated.xml">Practicalli Personal Journal</source><guid isPermaLink="true">https://practical.li/journal/its-april-fool/</guid> <enclosure url="https://practical.li/journal/assets/images/social/its-april-fool.png" type="image/png" length="41641" /> </item> <item> <title>Warmer weather</title> <author>Practicalli Johnny</author> <category>astronvim</category> <category>clojure</category> <category>neovim</category> <category>practicalli</category> <description><p>Practicalli AstroNvim User Config changed to be as additive as possible, leaving the template as unchanged as possible.</p><p>The sunnier weather is a boots to motivation, although its still very windy. At least I can get into the garden without sinking.</p><p>Another Saturday morning ride, a tough experience although not completely exhausted afterward.</p></description><link>https://practical.li/journal/warmer-weather/</link> <pubDate>Tue, 22 Oct 2024 15:22:01 +0000</pubDate><source url="https://practical.li/journal/feed_rss_updated.xml">Practicalli Personal Journal</source><guid isPermaLink="true">https://practical.li/journal/warmer-weather/</guid> <enclosure url="https://practical.li/journal/assets/images/social/warmer-weather.png" type="image/png" length="43596" /> </item> <item> <title>Flexiana Interview</title> <author>Practicalli Johnny</author> <category>clojure</category> <category>practicalli</category> <description><p>I enjoyed the interview with Flexiana team this week, they are very friendly and it we had some very interesting discussions. I included my interview preparation notes which were mosty the same as shared in the video.</p><p>A blip with Emacs 29.4 release stopped the which-key menu from showing when in a major mode. This affected both the leader and local leader key. Within a couple of hours the issue was resolved before I really figured out the cause. I installed Emacs 29.4 on Termux to replicate an issue that was reported in the #spacemacs channel of the Clojurians Community slack community.</p></description><link>https://practical.li/journal/flexiana-interview/</link> <pubDate>Tue, 22 Oct 2024 15:22:01 +0000</pubDate><source url="https://practical.li/journal/feed_rss_updated.xml">Practicalli Personal Journal</source><guid isPermaLink="true">https://practical.li/journal/flexiana-interview/</guid> <enclosure url="https://practical.li/journal/assets/images/social/flexiana-interview.png" type="image/png" length="43416" /> </item> <item> <title>Fixing Neovim Treesitter breaking changes</title> <author>Practicalli Johnny</author> <category>astronvim</category> <category>github</category> <category>neovim</category> <category>practicalli</category> <category>ssh</category> <description><p>The sun is out, the sky is blue... and I had the opportunity to understand some Neovim plugins a little more, in order to fix a breaking change with Neovim Treesitter support for Clojure.</p><p>!!! INFO "Pull Requests this week"</p><pre><code>- MERGED: [#7 queries: clojure has-type? updated to kind-eq?](https://github.com/PaterJason/nvim-treesitter-sexp/pull/7) for nvim-treesitter-sexp project</code></pre></description><link>https://practical.li/journal/fixing-neovim-treesitter-breaking-changes/</link> <pubDate>Tue, 22 Oct 2024 15:22:01 +0000</pubDate><source url="https://practical.li/journal/feed_rss_updated.xml">Practicalli Personal Journal</source><guid isPermaLink="true">https://practical.li/journal/fixing-neovim-treesitter-breaking-changes/</guid> <enclosure url="https://practical.li/journal/assets/images/social/fixing-neovim-treesitter-breaking-changes.png" type="image/png" length="62426" /> </item> <item> <title>Neovim on Termux enhancements</title> <author>Practicalli Johnny</author> <category>neovim</category> <category>practicalli</category> <description><p>More Neovim updates and getting closer to a release of Practicalli Astro-config</p><p>I have been using Neovim (and Emacs) on Termux, so I can code on my Android tablet or Android smart phone. I typically use an external keyboard (e.g. Keyboard.io Atreus or Model100), especially when considerable typing is involved.</p><p>As the hardware and compilation tooling is different for Android Linux (compared to amd64 linux) the Clojure and Lua LSP language servers would not install via the Mason manager. As these two languages are in the top 3 languages I use, then it is a great boost to get these servers working locally and configuring Neovim to use them instead.</p><p>I use the <code>date</code> command when I had a need to tweak the time on my Linux computer, saves launching the <strong>Settings</strong> app and using the mouse.</p><p>!!! INFO "Timezones made easy" <a href="https://time.is/">time.is</a> makes figuring out timezones really simple. See the current time in any timezone across the world.</p><pre><code>time.is very useful for events where people attend from different timezones. Set the local time and share a link for others who will see the event time in their own timezone.</code></pre><h2>Neovim</h2><p>I'm making some changes to the Practicalli AstroNvim configuration (AstroNvim4) over the next few days.</p><p>All my personal Neovim &amp; plugin options (and associated workflow biases) will only be in <code>lua/plugins/practicalli.lua</code>. With these options only in one file, anyone else using the configuration can easily disable them.</p><p>I will encourage other users to create there own <code>lua/plugins/personal.lua</code> customisation so any changes from upstream will be easier to merge.</p><p>The GitHub repository will be renamed to <code>practicalli/astro-config</code> which its much easier to write and say during screencasts. GitHub should redirect when pulling updates</p><p>This week I will update Practicalli Neovim book install guide with new repo and further info on how to use the config effectively (especially with your own customisations)</p><p>Then the first official release of the config will be created via GitHub releases.</p><p>If I have time, there are lots of things to add to Practicalli Neovim book too (including a few more plugins I'm using in the config)</p></description><link>https://practical.li/journal/neovim-on-termux-enhancements/</link> <pubDate>Tue, 22 Oct 2024 15:22:01 +0000</pubDate><source url="https://practical.li/journal/feed_rss_updated.xml">Practicalli Personal Journal</source><guid isPermaLink="true">https://practical.li/journal/neovim-on-termux-enhancements/</guid> <enclosure url="https://practical.li/journal/assets/images/social/neovim-on-termux-enhancements.png" type="image/png" length="51876" /> </item> <item> <title>Springing back into life slowly</title> <author>Practicalli Johnny</author> <category>clojure</category> <category>practicalli</category> <description><p>The last month has been tough due to illness, although still managed to do a little work with Practicalli to keep me motivated (both for work and my own personal health)</p><p>I though the Practicalli Project Templates had broken when I tried to create a new service project. It took me an hour or so to realise I had simply been using the command with the wrong argument, doh!</p></description><link>https://practical.li/journal/springing-back-into-life-slowly/</link> <pubDate>Tue, 22 Oct 2024 15:22:01 +0000</pubDate><source url="https://practical.li/journal/feed_rss_updated.xml">Practicalli Personal Journal</source><guid isPermaLink="true">https://practical.li/journal/springing-back-into-life-slowly/</guid> <enclosure url="https://practical.li/journal/assets/images/social/springing-back-into-life-slowly.png" type="image/png" length="55385" /> </item> <item> <title>Having a Donut Party with system components</title> <author>Practicalli Johnny</author> <category>clojure</category> <category>donut</category> <category>practicalli</category> <category>repl-workflow</category> <description><p>Not quite back to full health yet, so took it easy at the weekend.</p><p>More work on restoring spare bicycles so I can sell them or otherwise find a good home.</p><p>Continued the refactor of the Practicalli Service template, specifically refining the design of the system config and helper functions to support a development REPL workflow.</p></description><link>https://practical.li/journal/having-a-donut-party-with-system-components/</link> <pubDate>Tue, 22 Oct 2024 15:22:01 +0000</pubDate><source url="https://practical.li/journal/feed_rss_updated.xml">Practicalli Personal Journal</source><guid isPermaLink="true">https://practical.li/journal/having-a-donut-party-with-system-components/</guid> <enclosure url="https://practical.li/journal/assets/images/social/having-a-donut-party-with-system-components.png" type="image/png" length="62762" /> </item> <item> <title>Git Multiple SSH Keys & Neovim</title> <author>Practicalli Johnny</author> <category>clojure</category> <category>git</category> <category>neovim</category> <category>practicalli</category> <description><p>A short week at work made even shorter by a company day to celebrate going live. A chance to unwind and reflect.</p><p><a href="https://github.com/neovim/neovim/milestones">Neovim 0.10 is planned for 1 May 2024</a>. Plugins should be unafected, although actively developing plugins like Neogit are trying to used parts of the Neovim API. The parts of Neogit that use 0.10 api should be more efficient, although I assume there wont be a noticable difference in functionality.</p><p>I will update Neovim to 0.10 when AstroNvim confirms it is working well with that release.</p></description><link>https://practical.li/journal/git-multiple-ssh-keys--neovim/</link> <pubDate>Tue, 22 Oct 2024 15:22:01 +0000</pubDate><source url="https://practical.li/journal/feed_rss_updated.xml">Practicalli Personal Journal</source><guid isPermaLink="true">https://practical.li/journal/git-multiple-ssh-keys--neovim/</guid> <enclosure url="https://practical.li/journal/assets/images/social/git-multiple-ssh-keys--neovim.png" type="image/png" length="56395" /> </item> <item> <title>Company offsite week</title> <author>Practicalli Johnny</author> <category>astronvim</category> <category>neovim</category> <category>practicalli</category> <description><p>Travelled for a work event in Portugal with a chance to meet people I work with face to face for the first time. It was a very enjoyable and also quite intensive event. I kept myself busy to help combat fatigue from travelling and manage a swim each morning and evening whilst I was at the hotel.</p><p>I am accustom to working remotely since 2010, having worked for companies based outside of the UK. It is always very valuable to meet people face to face and can start or strengthen a relationship.</p></description><link>https://practical.li/journal/company-offsite-week/</link> <pubDate>Tue, 22 Oct 2024 15:22:01 +0000</pubDate><source url="https://practical.li/journal/feed_rss_updated.xml">Practicalli Personal Journal</source><guid isPermaLink="true">https://practical.li/journal/company-offsite-week/</guid> <enclosure url="https://practical.li/journal/assets/images/social/company-offsite-week.png" type="image/png" length="51274" /> </item> <item> <title>Refactor AstroNvim Clojure pack</title> <author>Practicalli Johnny</author> <category>neovim</category> <category>practicalli</category> <description><p>Pull requests this week</p><ul><li>:fontawesome-solid-code-pull-request: <strong>MERGED</strong> <a href="https://github.com/folke/ts-comments.nvim/pull/19">Add Clojure comment patterns to ts-comments.nvim</a></li><li>:fontawesome-solid-code-pull-request: <strong>MERGED</strong> <a href="https://github.com/AstroNvim/astrocommunity/pull/982">Modularise Astrocommunity Clojure pack</a></li><li>:fontawesome-solid-code-pull-request: <strong>MERGED</strong> <a href="https://github.com/AstroNvim/astrocommunity/pull/991">Update AstroNvim Cloure pack description &amp; simplify examples</a></li><li>:fontawesome-solid-code-pull-request: <strong>MERGED</strong> <a href="https://github.com/AstroNvim/astrocommunity/pull/992">Fix vim-visual-multi dependency name</a></li></ul><p>Total commits this week: 37</p><p>Submitted <a href="https://github.com/AstroNvim/astrocommunity/pull/982">a pull request to refactor the AstroNvim Community Clojure language pack</a> which I <a href="https://github.com/AstroNvim/astrocommunity/pull/248">contributed in June 2023</a>.</p><ul><li>add nvim-treesitter-sexp plugin</li><li>add example of disabling / configuring parinfer plugin</li><li>add ts-comment.nvim to support <code>;;</code> and <code>;</code> comment characters</li><li>remove autocmd from conjure plugin (no longer needed)</li><li>remove most of the opinionated conjure configuration overrides, although still hiding the repl log buffer (HUD) by default as its nicer as a separate tab. Maybe if I can have it open by default as a tab, then I could live with having the HUD open on REPL startup (a nice way to check things are working)</li></ul><p>Still sleepy from travel to the company off-site last week and the cycle ride on Saturday. Although I did manage some work in the garden on Sunday.</p></description><link>https://practical.li/journal/refactor-astronvim-clojure-pack/</link> <pubDate>Tue, 22 Oct 2024 15:22:01 +0000</pubDate><source url="https://practical.li/journal/feed_rss_updated.xml">Practicalli Personal Journal</source><guid isPermaLink="true">https://practical.li/journal/refactor-astronvim-clojure-pack/</guid> <enclosure url="https://practical.li/journal/assets/images/social/refactor-astronvim-clojure-pack.png" type="image/png" length="59095" /> </item> <item> <title>Practicalli content planning</title> <author>Practicalli Johnny</author> <category>clojure</category> <category>megalinter</category> <category>neovim</category> <category>practicalli</category> <description><p>Hyprland promises to be a great experience but also a potential time drain, so will save most of the investigation and further configuration until the winter break (or if I need a little distraction of the new shiny for motivation).</p><p>Taking two weeks off from work and have some time to work on Practicalli content.</p></description><link>https://practical.li/journal/practicalli-content-planning/</link> <pubDate>Tue, 22 Oct 2024 15:22:01 +0000</pubDate><source url="https://practical.li/journal/feed_rss_updated.xml">Practicalli Personal Journal</source><guid isPermaLink="true">https://practical.li/journal/practicalli-content-planning/</guid> <enclosure url="https://practical.li/journal/assets/images/social/practicalli-content-planning.png" type="image/png" length="48310" /> </item> <item> <title>Hacking on Practicalli content</title> <author>Practicalli Johnny</author> <category>neovim</category> <category>practicalli</category> <category>practicalli</category> <description><p>I am enjoying my 2 week at home vacation (stay-cation) and have already completely rewired my desk, laptops, Monitors and NAS storage devices on the electronic standing desk. It feels a lot more organised and easier to find everything as everything has its place.</p><p>Now I can focus on getting lots of <a href="#practicalli">Practicalli content done</a> (as well as catch up with shows on Paramount+ and maybe a little Polybus on the Playstation4 VR headset)</p><p>I am interested in switching to the Hyprland, although its changing fast so I dug out an older laptop and installed Arch Linux with Hyprland using the <code>archinstall</code> tool. Unfortunately the laptop I used doesnt seem to support Hyprland or something is missing from the install.</p><p>I am taking a stay-cation as I am still recovering from Covid and the weather is also quite grim. I am getting out for walks each day and on Friday I completed a short cycle ride as it was nice and sunny outside. Unfortunately my chest started feeling like it was on fire a few minutes into the ride, so I slowed down and limited myself to 10km.</p><p>I was feeling really sleepy after the ride, so I kept myself awake by sorting through the cardboard boxes in my attic. Many boxes made the ultimate sacrifice (for an uncluttered house) and went to the recycling service.</p></description><link>https://practical.li/journal/hacking-on-practicalli-content/</link> <pubDate>Tue, 22 Oct 2024 15:22:01 +0000</pubDate><source url="https://practical.li/journal/feed_rss_updated.xml">Practicalli Personal Journal</source><guid isPermaLink="true">https://practical.li/journal/hacking-on-practicalli-content/</guid> <enclosure url="https://practical.li/journal/assets/images/social/hacking-on-practicalli-content.png" type="image/png" length="50806" /> </item> <item> <title>Megalinter 8 and monthly version updates</title> <author>Practicalli Johnny</author> <category>clojure</category> <category>practicalli</category> <description><p>Megalinter updates to version 8 using the megalinter runner tool, adding a Makefile task to simplify the command line (so I dont have to remember the command).</p><p>Material for MkDocs provides a nice diff view using the <code>diff</code> language for a code block. Add or copy a diff into the code block, ensuring the <code>-</code> and <code>+</code> signs are included and the diff is automatically highlighted. See the <a href="#megalinter">Megalinter</a> section of this post for an example.</p><p>Feeling quite low the last few weeks, mostly due to continued Covid symptoms, low blood oxygen and lack of energy. Waking up I feel like I have experienced carbon dioxide poisoning (which I have experienced working on a mushroom farm). I am disorientated, dizzy and feel quite terrible.</p></description><link>https://practical.li/journal/megalinter-8-and-monthly-version-updates/</link> <pubDate>Tue, 22 Oct 2024 15:22:01 +0000</pubDate><source url="https://practical.li/journal/feed_rss_updated.xml">Practicalli Personal Journal</source><guid isPermaLink="true">https://practical.li/journal/megalinter-8-and-monthly-version-updates/</guid> <enclosure url="https://practical.li/journal/assets/images/social/megalinter-8-and-monthly-version-updates.png" type="image/png" length="62600" /> </item> <item> <title>MegaLinter Grafana Dashboards</title> <author>Practicalli Johnny</author> <category>dashboard</category> <category>debian</category> <category>github</category> <category>grafana</category> <category>megalinter</category> <category>practicalli</category> <description><p>As Practicalli projects are being updated to Megalinter version 8 it seemed a good time to try the Megalinter API reporter to publish data to use with Grafana. A chance to learn more about creating Dashboards and if Grafana is any easier than DataDog.</p><p>!!! WARNING "Megalinter not publishing logs on Grafana yet" Unfortunately I havent been able to make the Megalinter API Reporter work with this journal project, Clojure CLI Config or a new megalinter-test project I created.</p><p>Health is a little better after resting over the weekend, although still have lots of symptoms.</p><p>!!! EXAMPLE "Megalinter Grafana dashboard example project" <a href="https://github.com/practicalli/megalinter-test">:fontawesome-brands-github: Practicalli Megalinter-Test</a>{target=_blank .md-button}</p><pre><code>NOTE: I am trying to diagnose why this project does not seem to be sending logs to Grafana.</code></pre></description><link>https://practical.li/journal/megalinter-grafana-dashboards/</link> <pubDate>Tue, 22 Oct 2024 15:22:01 +0000</pubDate><source url="https://practical.li/journal/feed_rss_updated.xml">Practicalli Personal Journal</source><guid isPermaLink="true">https://practical.li/journal/megalinter-grafana-dashboards/</guid> <enclosure url="https://practical.li/journal/assets/images/social/megalinter-grafana-dashboards.png" type="image/png" length="53772" /> </item> <item> <title>Here Comes The Rain</title> <author>Practicalli Johnny</author> <category>clojure</category> <category>debian</category> <category>practicalli</category> <description><p>Thunderstorms abound which will be good for the vegetables growing in my garden (beetroot, courgettes, parsnips and onions)</p></description><link>https://practical.li/journal/here-comes-the-rain/</link> <pubDate>Tue, 22 Oct 2024 15:22:01 +0000</pubDate><source url="https://practical.li/journal/feed_rss_updated.xml">Practicalli Personal Journal</source><guid isPermaLink="true">https://practical.li/journal/here-comes-the-rain/</guid> <enclosure url="https://practical.li/journal/assets/images/social/here-comes-the-rain.png" type="image/png" length="46556" /> </item> <item> <title>Day 98: Coaching and 4Clojure 53</title> <author>Practicalli Johnny</author> <category>100daysofcode</category> <category>4clojure</category> <category>clojure</category> <description><p>Continued coaching one of my regular students</p><p>Took Poppy (one of my cats) to the vets for a checkup. Apart from a some plaque build Poppy is fine. More toothpaste and teeth cleaning for Poppy.</p><p>Cycled into Wagamama Southbank for another coaching session, getting my teeth stuck into 4Clojure challenge #53, a tricky one eventually solved with <code>partition</code> and <code>partition-by</code>.</p><p>!!! INFO "4Clojure solution" <a href="https://github.com/practicalli/four-clojure/commit/846c62fa2b95a844368d72011f0cc1d361bb4470">4Clojure #53 solution</a>{target=_blank}</p></description><link>https://practical.li/journal/day-98-coaching-and-4clojure-53/</link> <pubDate>Tue, 22 Oct 2024 11:22:46 +0000</pubDate><source url="https://practical.li/journal/feed_rss_updated.xml">Practicalli Personal Journal</source><guid isPermaLink="true">https://practical.li/journal/day-98-coaching-and-4clojure-53/</guid> <enclosure url="https://practical.li/journal/assets/images/social/day-98-coaching-and-4clojure-53.png" type="image/png" length="62762" /> </item> <item> <title>Day 100: 4Clojure</title> <author>Practicalli Johnny</author> <category>100daysofcode</category> <category>4clojure</category> <category>clojure</category> <description><p>100 days of code challenge completed. Was it worth it? Well yes, it got me coding almost every day, and overall I certainly achieved more than 100 hours of coding, more like several 100 hours of coding.</p><p>I didnt do was work on a specific project every day, but that would have felt more like work and I enjoyed having a break from that routine.</p><p>Will I do a 100 days of code challenge again? Not sure, its quite a hard thing to be consistent with. I will certainly keep a developer journal from now on as it has been very useful.</p><p>!!! INFO "4Clojure solution"</p><pre><code>Write up of the 4Clojure exercises I covered in yesterdays Clojure study group broadcast.Popped out for a few essentials in the last day I am prepared to go shopping before the holidays :)- [4Clojure #17](https://github.com/jr0cket/four-clojure/commit/7ff29a9f7014fde30e133f88f78c15d8729ed68e){target=_blank}- [4Clojure #18](https://github.com/jr0cket/four-clojure/commit/f75d84c2ab82b0b74c6b87b29935c2a4e175cfc0){target=_blank}- [4Clojure #19](https://github.com/jr0cket/four-clojure/commit/0a4a8561b951284aa90910f339cdae9c20225007){target=_blank}- [4Clojure #20](https://github.com/jr0cket/four-clojure/commit/91616e84ed16803a76734a443a7a4b3b65c20262){target=_blank}- [4Clojure #21](https://github.com/jr0cket/four-clojure/commit/5fe42949b7123c42a6b8d1f6ab8df2c7afc8f200){target=_blank}- [4Clojure #22](https://github.com/jr0cket/four-clojure/commit/d7444b2f3f2f39937c4889cb080724ac790ec374){target=_blank}</code></pre></description><link>https://practical.li/journal/day-100-4clojure/</link> <pubDate>Tue, 22 Oct 2024 11:22:46 +0000</pubDate><source url="https://practical.li/journal/feed_rss_updated.xml">Practicalli Personal Journal</source><guid isPermaLink="true">https://practical.li/journal/day-100-4clojure/</guid> <enclosure url="https://practical.li/journal/assets/images/social/day-100-4clojure.png" type="image/png" length="47449" /> </item> <item> <title>How much root cause analysis to do?</title> <author>Practicalli Johnny</author> <category>practicalli</category> <description><p>Winter starts on Friday 22nd December, although its already much colder this year.</p><p>Early to bed tonight as I start commercial work on Monday morning.</p></description><link>https://practical.li/journal/how-much-root-cause-analysis-to-do/</link> <pubDate>Tue, 22 Oct 2024 00:22:57 +0000</pubDate><source url="https://practical.li/journal/feed_rss_updated.xml">Practicalli Personal Journal</source><guid isPermaLink="true">https://practical.li/journal/how-much-root-cause-analysis-to-do/</guid> <enclosure url="https://practical.li/journal/assets/images/social/how-much-root-cause-analysis-to-do.png" type="image/png" length="56770" /> </item> <item> <title>First day at the new company</title> <author>Practicalli Johnny</author> <category>practicalli</category> <description><p>How does it feel to be employed... wonderful.</p></description><link>https://practical.li/journal/first-day-at-the-new-company/</link> <pubDate>Tue, 22 Oct 2024 00:22:57 +0000</pubDate><source url="https://practical.li/journal/feed_rss_updated.xml">Practicalli Personal Journal</source><guid isPermaLink="true">https://practical.li/journal/first-day-at-the-new-company/</guid> <enclosure url="https://practical.li/journal/assets/images/social/first-day-at-the-new-company.png" type="image/png" length="53428" /> </item> <item> <title>On-boarding at the new job</title> <author>Practicalli Johnny</author> <category>practicalli</category> <description><p>Balancing enthusiasm to be productive with learning enough first so as not to be dangerous</p></description><link>https://practical.li/journal/on-boarding-at-the-new-job/</link> <pubDate>Tue, 22 Oct 2024 00:22:57 +0000</pubDate><source url="https://practical.li/journal/feed_rss_updated.xml">Practicalli Personal Journal</source><guid isPermaLink="true">https://practical.li/journal/on-boarding-at-the-new-job/</guid> <enclosure url="https://practical.li/journal/assets/images/social/on-boarding-at-the-new-job.png" type="image/png" length="53198" /> </item> <item> <title>Conjure LSP bug & Cycling video editing</title> <author>Practicalli Johnny</author> <category>clojure</category> <category>conjure</category> <category>cycling</category> <category>neovim</category> <category>practicalli</category> <description><p>Updated to Kitty 0.35.1 easily and switching between dark and light themes working instantly again.</p><p>Diagnosed a 'new buffer' error with Conjure when using Neovim 0.9.0 and when opening a Clojure file, although everything works well in 0.10.0. EDIT: The maintainer added a fix to the <code>develop</code> branch for testing.</p><p><a href="https://github.com/Olical/conjure/issues/582">#582 REVIEW: Conjure throws new Buffer error</a>{target=_blank .md-button}</p><p>Video editing of footage taken by the front mounted camera on my bicycle. Advanced cycle training at Gravesend at the start of June.<a href="https://youtu.be/7PnCrLdTmUo">:fontawesome-brands-youtube: Bigfoot Cycling Club at Gravesent Cyclopark</a></p><p>Took a few days away from the computer to work on the garden as its nice and sunny. A mostly sunny ride on Saturday around the Kent countryside.</p></description><link>https://practical.li/journal/conjure-lsp-bug--cycling-video-editing/</link> <pubDate>Tue, 22 Oct 2024 00:18:26 +0000</pubDate><source url="https://practical.li/journal/feed_rss_updated.xml">Practicalli Personal Journal</source><guid isPermaLink="true">https://practical.li/journal/conjure-lsp-bug--cycling-video-editing/</guid> <enclosure url="https://practical.li/journal/assets/images/social/conjure-lsp-bug--cycling-video-editing.png" type="image/png" length="65948" /> </item> <item> <title>Practicalli Project Update 5</title> <author>Practicalli Johnny</author> <category>clojurists-together</category> <description><p><img alt="Clojurists Together Logo" src="https://raw.githubusercontent.com/practicalli/graphic-design/live/buttons/practicalli-clojurists-together-button.svg">{align=right loading=lazy style="height:150px;width:150px"}</p><p>A range of updates, new content and tool reviews and testing. <a href="https://exercism.io/profiles/Practicalli">Helping lots of students on Exercism</a> in the last week.</p></description><link>https://practical.li/journal/practicalli-project-update-5/</link> <pubDate>Mon, 21 Oct 2024 23:42:40 +0000</pubDate><source url="https://practical.li/journal/feed_rss_updated.xml">Practicalli Personal Journal</source><guid isPermaLink="true">https://practical.li/journal/practicalli-project-update-5/</guid> <enclosure url="https://practical.li/journal/assets/images/social/practicalli-project-update-5.png" type="image/png" length="50834" /> </item> <item> <title>Practicalli Project Update 2</title> <author>Practicalli Johnny</author> <category>clojurists-together</category> <description><p><img alt="Clojurists Together Logo" src="https://raw.githubusercontent.com/practicalli/graphic-design/live/buttons/practicalli-clojurists-together-button.svg">{align=right loading=lazy style="height:150px;width:150px"}</p><p>Invested time to understand the changes coming to the Clojure CLI tools and understand the opportunities that <a href="https://insideclojure.org/2020/09/04/clj-exec/">Clojure exec</a> (<code>:exec-fn</code> &amp; <code>:exec-args</code>) brings to aliases. These changes provided a catalyst to start redesigning the aliases used in <a href="https://practical.li/clojure/clojure-spec/data/defining-specifications/#naming-fully-qualified-keywords">practicalli/clojure-cli-config</a>.</p></description><link>https://practical.li/journal/practicalli-project-update-2/</link> <pubDate>Mon, 21 Oct 2024 23:42:40 +0000</pubDate><source url="https://practical.li/journal/feed_rss_updated.xml">Practicalli Personal Journal</source><guid isPermaLink="true">https://practical.li/journal/practicalli-project-update-2/</guid> <enclosure url="https://practical.li/journal/assets/images/social/practicalli-project-update-2.png" type="image/png" length="50841" /> </item> <item> <title>Monthly library updates</title> <author>Practicalli Johnny</author> <category>practicalli</category> <description><p>The last monthly review of library dependency versions in Clojure CLI Config aliases for 2023</p></description><link>https://practical.li/journal/monthly-library-updates/</link> <pubDate>Mon, 21 Oct 2024 22:33:04 +0000</pubDate><source url="https://practical.li/journal/feed_rss_updated.xml">Practicalli Personal Journal</source><guid isPermaLink="true">https://practical.li/journal/monthly-library-updates/</guid> <enclosure url="https://practical.li/journal/assets/images/social/monthly-library-updates.png" type="image/png" length="50947" /> </item> <item> <title>Running walking coughing</title> <author>Practicalli Johnny</author> <category>practicalli</category> <description><p>Run Johnny Run... then have a sleepy day.</p></description><link>https://practical.li/journal/running-walking-coughing/</link> <pubDate>Mon, 21 Oct 2024 22:33:04 +0000</pubDate><source url="https://practical.li/journal/feed_rss_updated.xml">Practicalli Personal Journal</source><guid isPermaLink="true">https://practical.li/journal/running-walking-coughing/</guid> <enclosure url="https://practical.li/journal/assets/images/social/running-walking-coughing.png" type="image/png" length="49571" /> </item> <item> <title>Visiting the new office</title> <author>Practicalli Johnny</author> <category>practicalli</category> <description><p>Party on dudes...</p></description><link>https://practical.li/journal/visiting-the-new-office/</link> <pubDate>Mon, 21 Oct 2024 22:33:04 +0000</pubDate><source url="https://practical.li/journal/feed_rss_updated.xml">Practicalli Personal Journal</source><guid isPermaLink="true">https://practical.li/journal/visiting-the-new-office/</guid> <enclosure url="https://practical.li/journal/assets/images/social/visiting-the-new-office.png" type="image/png" length="49596" /> </item> <item> <title>Weekly journal & Neovide</title> <author>Practicalli Johnny</author> <category>practicalli</category> <description><p>The Practicalli journal will move to a weekly cadence now I have a full time job with Griffin Bank.</p><p>I do write a daily journal for my activities in Griffin and will share information that is not sensitive or business valuable.</p></description><link>https://practical.li/journal/weekly-journal--neovide/</link> <pubDate>Mon, 21 Oct 2024 22:33:04 +0000</pubDate><source url="https://practical.li/journal/feed_rss_updated.xml">Practicalli Personal Journal</source><guid isPermaLink="true">https://practical.li/journal/weekly-journal--neovide/</guid> <enclosure url="https://practical.li/journal/assets/images/social/weekly-journal--neovide.png" type="image/png" length="53812" /> </item> <item> <title>Neovim updates and Neovide</title> <author>Practicalli Johnny</author> <category>practicalli</category> <description><p>Enjoying the new role as there is so much to do that I can get involved with.</p><p>Also enjoying Neovide GUI for Neovim, although its more convienient to simply run <code>astro</code> for Neovim in a terminal. When I am comfortable setting the base directory or working with multiple project, then Neovide will be more convienient to use.</p></description><link>https://practical.li/journal/neovim-updates-and-neovide/</link> <pubDate>Mon, 21 Oct 2024 22:33:04 +0000</pubDate><source url="https://practical.li/journal/feed_rss_updated.xml">Practicalli Personal Journal</source><guid isPermaLink="true">https://practical.li/journal/neovim-updates-and-neovide/</guid> <enclosure url="https://practical.li/journal/assets/images/social/neovim-updates-and-neovide.png" type="image/png" length="54694" /> </item> <item> <title>End of line... for 2023</title> <author>Practicalli Johnny</author> <category>practicalli</category> <description><p>My personal plans for 2024 are not set in stone, but I would like to relocate to the countryside by the summer.</p><p>Predictions for 2024:</p><ul><li>the year of the AI lawsuits as more companies and individuals realise they content has been used to train AI models without permission or recompense.</li><li>Anthropocene is declared a new geographic era in the history of the earth, marking the significant change humanity has made to the planet (not for the good).</li></ul></description><link>https://practical.li/journal/end-of-line-for-2023/</link> <pubDate>Mon, 21 Oct 2024 22:33:04 +0000</pubDate><source url="https://practical.li/journal/feed_rss_updated.xml">Practicalli Personal Journal</source><guid isPermaLink="true">https://practical.li/journal/end-of-line-for-2023/</guid> <enclosure url="https://practical.li/journal/assets/images/social/end-of-line-for-2023.png" type="image/png" length="45815" /> </item> <item> <title>Planing Practicalli 2024</title> <author>Practicalli Johnny</author> <category>practicalli</category> <description><p>How could the community help people find relevant and quality libraries to use for their own development projects?</p></description><link>https://practical.li/journal/planing-practicalli-2024/</link> <pubDate>Mon, 21 Oct 2024 22:33:04 +0000</pubDate><source url="https://practical.li/journal/feed_rss_updated.xml">Practicalli Personal Journal</source><guid isPermaLink="true">https://practical.li/journal/planing-practicalli-2024/</guid> <enclosure url="https://practical.li/journal/assets/images/social/planing-practicalli-2024.png" type="image/png" length="45964" /> </item> </channel></rss> \ No newline at end of file +<?xml version="1.0" encoding="UTF-8" ?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/"> <channel><title>Practicalli Personal Journal</title><description>Daily journal of thoughts and experiences</description><link>https://practical.li/journal/</link><atom:link href="https://practical.li/journal/feed_rss_updated.xml" rel="self" type="application/rss+xml" /><managingEditor>Practicalli</managingEditor><docs>https://github.com/practicalli/journal/</docs><language>en</language> <pubDate>Sun, 19 Jan 2025 23:15:40 -0000</pubDate> <lastBuildDate>Sun, 19 Jan 2025 23:15:40 -0000</lastBuildDate> <ttl>1440</ttl> <generator>MkDocs RSS plugin - v1.17.1</generator> <image> <url>https://github.com/practicalli/graphic-design/blob/live/logos/practicalli-logo.png?raw=true</url> <title>Practicalli Personal Journal</title><link>https://practical.li/journal/</link> </image> <item> <title>Learning Linux like its 1995</title> <author>Practicalli Johnny</author> <category>clojure</category> <category>practicalli</category> <description><p>Using Arch Linux (for Hyprland experiments) takes me back to the mid 1990's when I was learning Linux from the ground up.</p><p>At the end of 1994 I was installing Slackware Linux (from 82 floppy disks) and spending hours figuring out what to compile into the Linux kernel (before the days of dynamic loading). There was a huge amount to learn (usually without my own internet connection).</p><p>Arch Linux wiki pages have a huge amount of information, showing all the possible options for every piece of software and service. This does present a dilemma of choice.</p><p>Having experienced many years with Linux, I know many of the concepts and software associated with a Linux system. I dont need to read all the options, but do find myself scrolling a lot until I find something familiar (or simple).</p><p>The goals for this month include</p><ul><li>documenting Neovim &amp; Conjure workflow</li><li>meaningful exercise every day (health permitting)</li><li>bicycle ride (weather permitting)</li><li>avoid Hyprland turning into a huge time sync (couch potato time only)</li></ul><p>My health took more of a knock this week as I am finding it very difficult to walk. I've had pain in my right hip for a couple of weeks and on Friday I started walking and felt a sharp pain. Every step with my right leg is painful and going up and down stairs is particularly painful.</p><p>The hip pain coupled with my left knee pain significantly limiting my ability to exercise this week.</p><p>Movies this week:</p><ul><li><a href="https://en.wikipedia.org/wiki/Death_on_the_Nile_(1978_film)">Death on the Nile 1978</a> with Peter Ustinov as Hercule Poirot, including an all-star cast from the time including David Niven, Angela Landsbury and Betty Davis.</li></ul></description><link>https://practical.li/journal/learning-linux-like-its-1995/</link> <pubDate>Sun, 19 Jan 2025 23:11:22 +0000</pubDate><source url="https://practical.li/journal/feed_rss_updated.xml">Practicalli Personal Journal</source><guid isPermaLink="true">https://practical.li/journal/learning-linux-like-its-1995/</guid> <enclosure url="https://practical.li/journal/assets/images/social/learning-linux-like-its-1995.png" type="image/png" length="0" /> </item> <item> <title>A freezing start to a new year</title> <author>Practicalli Johnny</author> <category>archlinux</category> <category>audacity</category> <category>opus</category> <category>practicalli</category> <description><p>GitHub is currently <a href="https://github.com/actions/runner-images/issues/10636">:fontawesome-brands-github: rolling out a change to make Ubuntu 24.04 the default image</a> when <a href="#github-ci-workflow">running a workflow on <code>ubuntu-latest</code></a>. As some packages have been removed to save space, then its prudent to give the <a href="https://practical.li/engineering-playbook/continuous-integration/github/workflows/practicalli/">:fontawesome-solid-book-open: Practicalli GitHub workflows</a>{target=_blank} a test on Ubuntu 24.04.</p><p>Organising my <a href="#digital-music">digital music</a> and audio books so they all fit nicely on my smart phone (using Opus audio format and VLC to play the music).</p><p><a href="#arch-linux">Arch Linux</a> recommends not using <code>pacman -Syu</code> to update all packages and today I experience why. I can no longer login to the desktop :facepalm: EDIT: this seems to be specific to the NWG-shell configuration, as the vanilla hyprland desktop does work.</p><p>I assume this is a breaking change of hyprland that NWG-shell has not resolved. This is another reason to start again with hyprland and build my own config (although this will be a big time sink, so can wait).</p><p>Its freezing temperatures outside in London, UK at the moment, so I am trying to get outside when the sun is still shining. The paths are slippy and so are the roads, so even if I felt up to cycling outside, then it could be quite tricky.</p></description><link>https://practical.li/journal/a-freezing-start-to-a-new-year/</link> <pubDate>Sun, 12 Jan 2025 21:29:51 +0000</pubDate><source url="https://practical.li/journal/feed_rss_updated.xml">Practicalli Personal Journal</source><guid isPermaLink="true">https://practical.li/journal/a-freezing-start-to-a-new-year/</guid> <enclosure url="https://practical.li/journal/assets/images/social/a-freezing-start-to-a-new-year.png" type="image/png" length="None" /> </item> <item> <title>A new dawn a new day its a new life</title> <author>Practicalli Johnny</author> <category>neovim</category> <category>practicalli</category> <description><p>As we come to the end of 2025 I continue to contemplate what is next?</p><p>Do I want to continue in the software engineering industry with its many systemic faults?</p><p>Or should I branch out and do something completely different?</p><p><a href="https://80000hours.org/">80,000 hours</a> is a guide to careers that have a positive impact on the world.</p><p>My searching for a new home are currently focusing on the East coast of Scotland (which is dryer than London at the moment). Aberdeen (the granite city) has good support for cycling and a few cycle clubs in the area.</p><p>Wired up my Playstation 4 and VR headset to start playing games again. During more severe covid symptoms I couldnt wear the VR headset as it put too much pressure on my head. From an hour of play today, the VR headset felt okay.</p><p>I had a few quick games of Stardust and one surprisingly successful game of <a href="https://youtube.com/playlist?list=PLy9I_IfUBzKJgBTlbzRB0k4i1ARDVPSgy&amp;si=Fq2TPODPdD1YQ6cI">Polybius</a>.</p></description><link>https://practical.li/journal/a-new-dawn-a-new-day-its-a-new-life/</link> <pubDate>Fri, 03 Jan 2025 00:00:58 +0000</pubDate><source url="https://practical.li/journal/feed_rss_updated.xml">Practicalli Personal Journal</source><guid isPermaLink="true">https://practical.li/journal/a-new-dawn-a-new-day-its-a-new-life/</guid> <enclosure url="https://practical.li/journal/assets/images/social/a-new-dawn-a-new-day-its-a-new-life.png" type="image/png" length="None" /> </item> <item> <title>Holiday stuffing</title> <author>Practicalli Johnny</author> <category>emacs</category> <category>neovim</category> <category>practicalli</category> <description><p>Feeling a little sick so binging on movies and shows on Apple TV+. On Monday afternoon Apple TV+ would not stream content (the play button disappeared) although I could browse the catalogue of shows. After several hours the play button came back, although contacting Apple support was quite pointless.</p><p><img alt="Mooless Moo Plant bases stake and ale pie" src="https://optimise2.assets-servd.host/political-lechwe/production/Mooless-info.jpg?w=1600&amp;h=904&amp;q=82&amp;fm=webp&amp;fit=crop&amp;dm=1681290833&amp;s=8fc234ed1acd070f99e0a7b3ef95079c">{align=right loading=lazy style="width:360px"}</p><p>A relaxing week trying out some new vegetarian and vegan meals. <a href="https://shop.pieminister.co.uk/products/mooless-moo/">Pieminister Mooless Moo pie</a> is a plant based stake and ale pie, using jackfruit for the stake pieces. The pastry was lovely and crispy and the pie was very filling. The only downside to the pie for me was it was the taste and texture was too much like beef and I've never really liked that even when I did eat meat.</p><p>New potatoes, Edamame, Spinach and Garden Peas complement the pie, along with some very thick <a href="https://www.bisto.co.uk/products/bisto-best-vegetable-gravy-granules-230g/">Bisto Best Vegetable Gravy</a> (I add way too many granules to make the gravy nice and thick).</p></description><link>https://practical.li/journal/holiday-stuffing/</link> <pubDate>Sun, 29 Dec 2024 18:31:27 +0000</pubDate><source url="https://practical.li/journal/feed_rss_updated.xml">Practicalli Personal Journal</source><guid isPermaLink="true">https://practical.li/journal/holiday-stuffing/</guid> <enclosure url="https://practical.li/journal/assets/images/social/holiday-stuffing.png" type="image/png" length="0" /> </item> <item> <title>Finding My Joy</title> <author>Practicalli Johnny</author> <category>clojure</category> <category>practicalli</category> <description><p>In season 2, episode 2 of "The Big Door Prize" they talk about "Finding your Joy". This seems like an inspiring new years resolution, or at least a theme I should focus on for 2025.</p><p>You only live one life and you should take time out to enjoy it. There were many aspects to 2024 that constrained my joy, so I will endeavour to may 2025 a most joyous year.</p><p>Practicalli Updates:</p><ul><li><a href="https://practical.li/clojure/data-inspector/">Clojure Data Inspector tools - overview and portal page updated</a></li></ul></description><link>https://practical.li/journal/finding-my-joy/</link> <pubDate>Sun, 22 Dec 2024 18:42:20 +0000</pubDate><source url="https://practical.li/journal/feed_rss_updated.xml">Practicalli Personal Journal</source><guid isPermaLink="true">https://practical.li/journal/finding-my-joy/</guid> <enclosure url="https://practical.li/journal/assets/images/social/finding-my-joy.png" type="image/png" length="None" /> </item> <item> <title>What is past is prologue</title> <author>Practicalli Johnny</author> <category>appimage</category> <category>debian</category> <category>hyprland</category> <category>leadership</category> <category>practicalli</category> <description><p>!!! QUOTE If a technology was truly dead, no one would feel the need to talk about it on the internet</p><h2>Dead is mainstream</h2><p>When people state that some technology or practice is dead via the internet, it typically means that thing is the mainstream.</p><p>If something was truely dead, no one would feel the need to talk about it as that topic would not relate to anyone.</p><p>This technique is essentially click-bate and trying to persuade you to 'buy-in' to something else (usually for the profit of aother person)</p></description><link>https://practical.li/journal/what-is-past-is-prologue/</link> <pubDate>Sun, 15 Dec 2024 13:23:01 +0000</pubDate><source url="https://practical.li/journal/feed_rss_updated.xml">Practicalli Personal Journal</source><guid isPermaLink="true">https://practical.li/journal/what-is-past-is-prologue/</guid> <enclosure url="https://practical.li/journal/assets/images/social/what-is-past-is-prologue.png" type="image/png" length="None" /> </item> <item> <title>Long Cold Winter</title> <author>Practicalli Johnny</author> <category>codec</category> <category>mason</category> <category>neovim</category> <category>opus</category> <category>practicalli</category> <description><p><a href="#converting-audio-with-ffmpeg">Converted some audio files to Opus codec</a>, which provides a really optimum compression and allows for relatively low bit rates and results in much smaller files with the same quality.</p><p>Neovim upcoming changes</p><ul><li>neovim 0.11 has some breaking changes, so assume early in 2025</li><li>astronvim v5 once neovim 0.11 released</li><li><a href="https://github.com/WhoIsSethDaniel/mason-tool-installer.nvim">:fontawesome-brands-github: mason-tool-installer.nvim</a> to simplify mason config in astronvim v5 - discussed in Atronvim Discord community. maston-tool-installer still <a href="https://github.com/WhoIsSethDaniel/mason-tool-installer.nvim/blob/main/lua/mason-tool-installer/init.lua">:fontawesome-brands-github: uses the mason registry</a> for tool versions.</li></ul><p>Starting to <a href="#notes-for-updating-my-cv">update my CV from recent commercial experiences</a>, focusing on the areas of product, delivery and people.</p></description><link>https://practical.li/journal/long-cold-winter/</link> <pubDate>Wed, 11 Dec 2024 11:22:17 +0000</pubDate><source url="https://practical.li/journal/feed_rss_updated.xml">Practicalli Personal Journal</source><guid isPermaLink="true">https://practical.li/journal/long-cold-winter/</guid> <enclosure url="https://practical.li/journal/assets/images/social/long-cold-winter.png" type="image/png" length="None" /> </item> <item> <title>Making use of Black Friday</title> <author>Practicalli Johnny</author> <category>hardware</category> <category>network-attached-storage</category> <category>network-file-system</category> <category>solid-state-drive</category> <category>thecus</category> <description><p>Black Friday as a concept is confusing as it no longer has anything to do with a specific Friday and currently seems to cover at least 2 weeks of promotions. I did get some good prices even before Black Friday actually started.</p><p><a href="#nas">Adventures with SSD and NAS Versions</a> kept me busy over the weekend, resurrecting an older NAS unit with Solid State Drives for a very quiet media storage device.</p></description><link>https://practical.li/journal/making-use-of-black-friday/</link> <pubDate>Sun, 01 Dec 2024 18:18:38 +0000</pubDate><source url="https://practical.li/journal/feed_rss_updated.xml">Practicalli Personal Journal</source><guid isPermaLink="true">https://practical.li/journal/making-use-of-black-friday/</guid> <enclosure url="https://practical.li/journal/assets/images/social/making-use-of-black-friday.png" type="image/png" length="54253" /> </item> <item> <title>Linux Wayland Compositor & Hyprland</title> <author>Practicalli Johnny</author> <category>debian</category> <category>hyprland</category> <category>linux</category> <category>neovim</category> <category>practicalli</category> <category>slack</category> <description><p>A friend recommended <a href="https://hyprland.org/">Hyprland window manager</a> which is similar to i3 window manager I currently used, but more optomised for the Wayland compositor.</p><p>Practicalli currently uses Regolith Desktop, a complete Linux desktop that leverages Gnome and i3 tiling window manager.</p><p>Regolith Desktop provides quite a rich experience using the <code>regolith-desktop</code> Debian package. I have not had much success with Regolith when running with Wayland (specifically Sway).</p><p>Sway compositor is an implementation of wayland for i3 window manager. Some of my applications do not see to play nice with Sway (e.g. chromium browser scrolling, simplescreenrecorder cannot run on wayland).</p><p>OBS did seem to work okay on wayland, given a sufficiently recent version.</p><p>A friend recommended Hyprland, a tiling compositor that provides the latest Wayland features and lots of eye candy. Its pretty easy to setup on Debian, although there is much additional setup before it would be comparable to Regolith Desktop.</p><p>Neovim Grug plugin is being considered as an alternative to the Spectre tool for search and replacing across a project.</p></description><link>https://practical.li/journal/linux-wayland-compositor--hyprland/</link> <pubDate>Fri, 22 Nov 2024 22:52:13 +0000</pubDate><source url="https://practical.li/journal/feed_rss_updated.xml">Practicalli Personal Journal</source><guid isPermaLink="true">https://practical.li/journal/linux-wayland-compositor--hyprland/</guid> <enclosure url="https://practical.li/journal/assets/images/social/linux-wayland-compositor--hyprland.png" type="image/png" length="59724" /> </item> <item> <title>Practicalli plans for the rest of the year</title> <author>Practicalli Johnny</author> <category>github</category> <category>hardware</category> <category>practicalli</category> <category>practicalli</category> <description><p>Starting to <a href="#practicalli-plans">plan work for the Practicalli content</a> for the next 3 months.</p><p>On the Practicalli GitHub Org, <a href="#optimise-github-org-log-retention">action log retention time was minimised</a> to a week (from 90 days) as I don't need to wade through that history and it will save a bit of storage in the Cloud. I am surprised GitHub have such a high default for their free plans.</p><p>Upgraded to a <a href="#new-monitor">Dell 40 inch 5k2k monitor</a> for work and it makes a huge difference. Its a beautiful monitor and it works really well with Linux and the tiling window of Regolith Desktop (i3).</p><p>I am continuing my search for a new place to live, even further into the countryside with easy access to hiking and cycling activities.</p><p>Although I am always thankful for an opportunity to work with a commercial company, I do feel the weight lifted from my shoulders now that relationship has concluded. Within hours I started to feel the return of much of the energy I have been lacking for the last few months.</p><p>They do say a change is as good as a rest, so investing time in Practicalli content is giving me an energy boost.</p><p><img alt="Freedom quote" src="https://cdn4.geckoandfly.com/wp-content/uploads/2016/07/freedom-quotes-10.jpg">{loading=lazy}</p></description><link>https://practical.li/journal/practicalli-plans-for-the-rest-of-the-year/</link> <pubDate>Fri, 22 Nov 2024 13:36:03 +0000</pubDate><source url="https://practical.li/journal/feed_rss_updated.xml">Practicalli Personal Journal</source><guid isPermaLink="true">https://practical.li/journal/practicalli-plans-for-the-rest-of-the-year/</guid> <enclosure url="https://practical.li/journal/assets/images/social/practicalli-plans-for-the-rest-of-the-year.png" type="image/png" length="54273" /> </item> <item> <title>The wonderful complexity of people</title> <author>Practicalli Johnny</author> <category>leadership</category> <category>practicalli</category> <description><p>!!! QUOTE "A Tail of Two Cities - Charles Dickens" It was the best of times, it was the worst of times.</p><p>!!! QUOTE "Johnny Stevenson (maybe others)" People are wonderfully complex experiences</p><p>My feelings of disappointed with my current commercial role are returning to the forefront of my mind. Many aspects of the role and company seem to be clear in peoples minds but not always effectively shared. I think I understand the role and then something else happens that makes me feel I don't. I believe something will need to change soon for the benefit of all.</p><p>There have been a few highlights with the role, but I expected more of myself and the company. I do set high expectations for myself, although have learned to be more kind about what I can realistically achieve and 'which battles to fight' (figuratively speaking of course).</p><p>During this engagement I have continually reset my expectations about what could be achieved and what I could realistically achieve. There are a couple of peers where there has been conflict without understanding of why I am seen as the cause. I have tried to explore but if people do have issues with me its not clearly being communicated to me.</p><p>In hindsight, many opportunities to get support from my manger and peers were missed. Mostly as we had so many challenges to discuss and partly due to pressures of delivery.</p><p>When a person doesn't have clarity around a problem then there is very little they can do to resolve or adapt.</p><p>A self-reflection review is in progress and its is a good opportunity to take my own time to reflect on my current role and if its still the right fit for me.</p></description><link>https://practical.li/journal/the-wonderful-complexity-of-people/</link> <pubDate>Thu, 21 Nov 2024 17:03:42 +0000</pubDate><source url="https://practical.li/journal/feed_rss_updated.xml">Practicalli Personal Journal</source><guid isPermaLink="true">https://practical.li/journal/the-wonderful-complexity-of-people/</guid> <enclosure url="https://practical.li/journal/assets/images/social/the-wonderful-complexity-of-people.png" type="image/png" length="56883" /> </item> <item> <title>The king is probably dead long live the king</title> <author>Practicalli Johnny</author> <category>leadership</category> <category>practicalli</category> <description><p>!!! QUOTE You are only a leader if people are willing to follow</p><p>It has been hard to shake the concern that my current commercial role has not worked out, probably not really been working for quite a while in hindsight. Was it ever really working?</p><p>Some aspects have greatly improved but there are some fundamental communication constraints that I really didn't understand the cause of (plenty of assumptions, but not enough communication or time to really address these challenges).</p><p>There are the common systemic challenges that come from working at any startup that is working hard to establish itself as a long term sustainable business. This was a given. A new person coming into this environment that has been running for many years leaves a lot of context unknown and typically unspoken.</p><p>I continued to try identify the causes throughout the week and trying to evaluate if there is any appetite and opportunity to address these within our typical schedule. It did feel that the more I tried to connect the quicker the feeling of connection slipped away.</p><p>I believe my frustration and disappointment have been leaking out over the last month, which I am disappointed about as well.</p><p>It is always a challenge for an engineering manager to identify where they can add value. For much of the current role I never seemed to connect with the team at a deep enough level. It is too easy to feel I am simply not needed by the team as the communication has been very limited. In once exceptional case, it was easy to feel my presence was simply not wanted.</p><p>Tuesday I was really exhausted, partly because of the continued cough but also the concerns that I still wasn't able to break through to the team (especially if they feel unsafe to ask questions). I am not sleeping well and need to find energy to exercise more.</p><p>Wednesday I made time for self-reflection as part of the company feedback initiative. I did struggle to quantify to myself what I had done. In hindsight I should have spend more time on this and consulted my journal, although I still feel I would come up short of my own lofty goals for the role.</p><p>Friday was the end of my commercial current role.</p><blockquote><p>The title of this article is from the first episode of the first series of the Black Adder TV show. There were quite a few Shakepearean quotes used for comic effect.</p></blockquote></description><link>https://practical.li/journal/the-king-is-probably-dead-long-live-the-king/</link> <pubDate>Thu, 21 Nov 2024 17:03:42 +0000</pubDate><source url="https://practical.li/journal/feed_rss_updated.xml">Practicalli Personal Journal</source><guid isPermaLink="true">https://practical.li/journal/the-king-is-probably-dead-long-live-the-king/</guid> <enclosure url="https://practical.li/journal/assets/images/social/the-king-is-probably-dead-long-live-the-king.png" type="image/png" length="60338" /> </item> <item> <title>Debian Linux migration</title> <author>Practicalli Johnny</author> <category>practicalli</category> <description><p>Enjoying Debian Linux and freedom from Snaps</p></description><link>https://practical.li/journal/debian-linux-migration/</link> <pubDate>Sun, 17 Nov 2024 11:16:06 +0000</pubDate><source url="https://practical.li/journal/feed_rss_updated.xml">Practicalli Personal Journal</source><guid isPermaLink="true">https://practical.li/journal/debian-linux-migration/</guid> <enclosure url="https://practical.li/journal/assets/images/social/debian-linux-migration.png" type="image/png" length="49250" /> </item> <item> <title>Holiday in Paramout Plus</title> <author>Practicalli Johnny</author> <category>clojure</category> <category>practicalli</category> <description><p>After being ill for most of the week I am finally starting to enjoying my second week of holiday, binging on some Paramount+ and having a lazy Sunday enjoying the extra hour in bed after the end of summer time.</p><p>Updating Practicalli Journal and Clojure CLI Config repositories, fixing links and markdown issues from the Megalinter reports.</p><p>Updating to Megalinter 0.8.1 GitHub action on Practicalli repositories as I work on them. The upgrade will include each repository in the Grafana dashboards for Practicalli projects.</p><p>Issues</p><ul><li><strong>DOING</strong> <a href="https://github.com/practicalli/clojure-cli-config/issues/87">security: add clj-watson to clojure cli config</a></li><li><strong>DOING</strong> zsh environment varaibles not loading into jvm</li></ul></description><link>https://practical.li/journal/holiday-in-paramout-plus/</link> <pubDate>Sun, 17 Nov 2024 11:16:06 +0000</pubDate><source url="https://practical.li/journal/feed_rss_updated.xml">Practicalli Personal Journal</source><guid isPermaLink="true">https://practical.li/journal/holiday-in-paramout-plus/</guid> <enclosure url="https://practical.li/journal/assets/images/social/holiday-in-paramout-plus.png" type="image/png" length="48672" /> </item> <item> <title>Practicalli Project Spring 2023</title> <author>Practicalli Johnny</author> <category>clojurists-together</category> <description><p><img alt="Clojurists Together Logo" src="https://raw.githubusercontent.com/practicalli/graphic-design/live/buttons/practicalli-clojurists-together-button.svg">{align=right loading=lazy style="height:150px;width:150px"}</p><p>Due to covid illness during 2022 the planned work has been spread over late 2022 - early 2023.</p></description><link>https://practical.li/journal/practicalli-project-spring-2023/</link> <pubDate>Sun, 17 Nov 2024 11:16:06 +0000</pubDate><source url="https://practical.li/journal/feed_rss_updated.xml">Practicalli Personal Journal</source><guid isPermaLink="true">https://practical.li/journal/practicalli-project-spring-2023/</guid> <enclosure url="https://practical.li/journal/assets/images/social/practicalli-project-spring-2023.png" type="image/png" length="54214" /> </item> <item> <title>Back to work</title> <author>Practicalli Johnny</author> <category>clojure</category> <category>practicalli</category> <description><p>Busy week at work getting ready for a new team member. I spent Friday afternoon building up a relationship and getting accustom to spending time working together. Several weeks of work had been done to get ready for the new starter.</p><p>One of the interesting challenges for anyone starting a new job is to ensure too much enthusiasm doesnt lead to missing important steps. It will be a good first check-in with the new starter to see if they have been too enthusiastic or taken a more measured approach.</p><p>Current issues</p><ul><li><strong>DONE</strong> <a href="https://github.com/practicalli/clojure-cli-config/issues/87">security: add clj-watson to clojure cli config</a></li></ul></description><link>https://practical.li/journal/back-to-work/</link> <pubDate>Tue, 05 Nov 2024 19:37:11 +0000</pubDate><source url="https://practical.li/journal/feed_rss_updated.xml">Practicalli Personal Journal</source><guid isPermaLink="true">https://practical.li/journal/back-to-work/</guid> <enclosure url="https://practical.li/journal/assets/images/social/back-to-work.png" type="image/png" length="43152" /> </item> <item> <title>Practicalli work over the winter break</title> <author>Practicalli Johnny</author> <category>practicalli</category> <description><p>The company I work for takes a break over the winter, so I have some time to spend on Practicalli content.</p></description><link>https://practical.li/journal/practicalli-work-over-the-winter-break/</link> <pubDate>Tue, 22 Oct 2024 15:22:01 +0000</pubDate><source url="https://practical.li/journal/feed_rss_updated.xml">Practicalli Personal Journal</source><guid isPermaLink="true">https://practical.li/journal/practicalli-work-over-the-winter-break/</guid> <enclosure url="https://practical.li/journal/assets/images/social/practicalli-work-over-the-winter-break.png" type="image/png" length="56481" /> </item> <item> <title>Onboarding to a new role, hacking Clojure & Neovim</title> <author>Practicalli Johnny</author> <category>practicalli</category> <description><p>Nervous excitement about starting a new role and hopeful I dont mess it up.</p><p>Enjoying writing a regular practicalli again, which is something I missed when not working.</p></description><link>https://practical.li/journal/onboarding-to-a-new-role-hacking-clojure--neovim/</link> <pubDate>Tue, 22 Oct 2024 15:22:01 +0000</pubDate><source url="https://practical.li/journal/feed_rss_updated.xml">Practicalli Personal Journal</source><guid isPermaLink="true">https://practical.li/journal/onboarding-to-a-new-role-hacking-clojure--neovim/</guid> <enclosure url="https://practical.li/journal/assets/images/social/onboarding-to-a-new-role-hacking-clojure--neovim.png" type="image/png" length="68037" /> </item> <item> <title>Discussing new role expectations</title> <author>Practicalli Johnny</author> <category>practicalli</category> <description><p>Learning a little more about the responsibilities and expectations of the new role, which seems very much as expected.</p></description><link>https://practical.li/journal/discussing-new-role-expectations/</link> <pubDate>Tue, 22 Oct 2024 15:22:01 +0000</pubDate><source url="https://practical.li/journal/feed_rss_updated.xml">Practicalli Personal Journal</source><guid isPermaLink="true">https://practical.li/journal/discussing-new-role-expectations/</guid> <enclosure url="https://practical.li/journal/assets/images/social/discussing-new-role-expectations.png" type="image/png" length="56297" /> </item> <item> <title>Health and new chair</title> <author>Practicalli Johnny</author> <category>practicalli</category> <description><p>The BeYou chair is being delivered today, will it live up to my expectations?</p></description><link>https://practical.li/journal/health-and-new-chair/</link> <pubDate>Tue, 22 Oct 2024 15:22:01 +0000</pubDate><source url="https://practical.li/journal/feed_rss_updated.xml">Practicalli Personal Journal</source><guid isPermaLink="true">https://practical.li/journal/health-and-new-chair/</guid> <enclosure url="https://practical.li/journal/assets/images/social/health-and-new-chair.png" type="image/png" length="45729" /> </item> <item> <title>Its April Fool</title> <author>Practicalli Johnny</author> <category>astronvim</category> <category>git</category> <category>neovim</category> <category>practicalli</category> <description><p>Adding SSH keys to the YubiKey hardware security key provides convenience of SSH key use, especially when required for multiple computers.</p><p>Using a YubiKey to keep a single SSH key pair removes the need to generate a key pair for each computer.</p><p>Using one SSH key avoids the need for multiple entries in the allowed-signatures file to check locally that a commit has been signed.</p></description><link>https://practical.li/journal/its-april-fool/</link> <pubDate>Tue, 22 Oct 2024 15:22:01 +0000</pubDate><source url="https://practical.li/journal/feed_rss_updated.xml">Practicalli Personal Journal</source><guid isPermaLink="true">https://practical.li/journal/its-april-fool/</guid> <enclosure url="https://practical.li/journal/assets/images/social/its-april-fool.png" type="image/png" length="41641" /> </item> <item> <title>Warmer weather</title> <author>Practicalli Johnny</author> <category>astronvim</category> <category>clojure</category> <category>neovim</category> <category>practicalli</category> <description><p>Practicalli AstroNvim User Config changed to be as additive as possible, leaving the template as unchanged as possible.</p><p>The sunnier weather is a boots to motivation, although its still very windy. At least I can get into the garden without sinking.</p><p>Another Saturday morning ride, a tough experience although not completely exhausted afterward.</p></description><link>https://practical.li/journal/warmer-weather/</link> <pubDate>Tue, 22 Oct 2024 15:22:01 +0000</pubDate><source url="https://practical.li/journal/feed_rss_updated.xml">Practicalli Personal Journal</source><guid isPermaLink="true">https://practical.li/journal/warmer-weather/</guid> <enclosure url="https://practical.li/journal/assets/images/social/warmer-weather.png" type="image/png" length="43596" /> </item> <item> <title>Flexiana Interview</title> <author>Practicalli Johnny</author> <category>clojure</category> <category>practicalli</category> <description><p>I enjoyed the interview with Flexiana team this week, they are very friendly and it we had some very interesting discussions. I included my interview preparation notes which were mosty the same as shared in the video.</p><p>A blip with Emacs 29.4 release stopped the which-key menu from showing when in a major mode. This affected both the leader and local leader key. Within a couple of hours the issue was resolved before I really figured out the cause. I installed Emacs 29.4 on Termux to replicate an issue that was reported in the #spacemacs channel of the Clojurians Community slack community.</p></description><link>https://practical.li/journal/flexiana-interview/</link> <pubDate>Tue, 22 Oct 2024 15:22:01 +0000</pubDate><source url="https://practical.li/journal/feed_rss_updated.xml">Practicalli Personal Journal</source><guid isPermaLink="true">https://practical.li/journal/flexiana-interview/</guid> <enclosure url="https://practical.li/journal/assets/images/social/flexiana-interview.png" type="image/png" length="43416" /> </item> <item> <title>Fixing Neovim Treesitter breaking changes</title> <author>Practicalli Johnny</author> <category>astronvim</category> <category>github</category> <category>neovim</category> <category>practicalli</category> <category>ssh</category> <description><p>The sun is out, the sky is blue... and I had the opportunity to understand some Neovim plugins a little more, in order to fix a breaking change with Neovim Treesitter support for Clojure.</p><p>!!! INFO "Pull Requests this week"</p><pre><code>- MERGED: [#7 queries: clojure has-type? updated to kind-eq?](https://github.com/PaterJason/nvim-treesitter-sexp/pull/7) for nvim-treesitter-sexp project</code></pre></description><link>https://practical.li/journal/fixing-neovim-treesitter-breaking-changes/</link> <pubDate>Tue, 22 Oct 2024 15:22:01 +0000</pubDate><source url="https://practical.li/journal/feed_rss_updated.xml">Practicalli Personal Journal</source><guid isPermaLink="true">https://practical.li/journal/fixing-neovim-treesitter-breaking-changes/</guid> <enclosure url="https://practical.li/journal/assets/images/social/fixing-neovim-treesitter-breaking-changes.png" type="image/png" length="62426" /> </item> <item> <title>Neovim on Termux enhancements</title> <author>Practicalli Johnny</author> <category>neovim</category> <category>practicalli</category> <description><p>More Neovim updates and getting closer to a release of Practicalli Astro-config</p><p>I have been using Neovim (and Emacs) on Termux, so I can code on my Android tablet or Android smart phone. I typically use an external keyboard (e.g. Keyboard.io Atreus or Model100), especially when considerable typing is involved.</p><p>As the hardware and compilation tooling is different for Android Linux (compared to amd64 linux) the Clojure and Lua LSP language servers would not install via the Mason manager. As these two languages are in the top 3 languages I use, then it is a great boost to get these servers working locally and configuring Neovim to use them instead.</p><p>I use the <code>date</code> command when I had a need to tweak the time on my Linux computer, saves launching the <strong>Settings</strong> app and using the mouse.</p><p>!!! INFO "Timezones made easy" <a href="https://time.is/">time.is</a> makes figuring out timezones really simple. See the current time in any timezone across the world.</p><pre><code>time.is very useful for events where people attend from different timezones. Set the local time and share a link for others who will see the event time in their own timezone.</code></pre><h2>Neovim</h2><p>I'm making some changes to the Practicalli AstroNvim configuration (AstroNvim4) over the next few days.</p><p>All my personal Neovim &amp; plugin options (and associated workflow biases) will only be in <code>lua/plugins/practicalli.lua</code>. With these options only in one file, anyone else using the configuration can easily disable them.</p><p>I will encourage other users to create there own <code>lua/plugins/personal.lua</code> customisation so any changes from upstream will be easier to merge.</p><p>The GitHub repository will be renamed to <code>practicalli/astro-config</code> which its much easier to write and say during screencasts. GitHub should redirect when pulling updates</p><p>This week I will update Practicalli Neovim book install guide with new repo and further info on how to use the config effectively (especially with your own customisations)</p><p>Then the first official release of the config will be created via GitHub releases.</p><p>If I have time, there are lots of things to add to Practicalli Neovim book too (including a few more plugins I'm using in the config)</p></description><link>https://practical.li/journal/neovim-on-termux-enhancements/</link> <pubDate>Tue, 22 Oct 2024 15:22:01 +0000</pubDate><source url="https://practical.li/journal/feed_rss_updated.xml">Practicalli Personal Journal</source><guid isPermaLink="true">https://practical.li/journal/neovim-on-termux-enhancements/</guid> <enclosure url="https://practical.li/journal/assets/images/social/neovim-on-termux-enhancements.png" type="image/png" length="51876" /> </item> <item> <title>Springing back into life slowly</title> <author>Practicalli Johnny</author> <category>clojure</category> <category>practicalli</category> <description><p>The last month has been tough due to illness, although still managed to do a little work with Practicalli to keep me motivated (both for work and my own personal health)</p><p>I though the Practicalli Project Templates had broken when I tried to create a new service project. It took me an hour or so to realise I had simply been using the command with the wrong argument, doh!</p></description><link>https://practical.li/journal/springing-back-into-life-slowly/</link> <pubDate>Tue, 22 Oct 2024 15:22:01 +0000</pubDate><source url="https://practical.li/journal/feed_rss_updated.xml">Practicalli Personal Journal</source><guid isPermaLink="true">https://practical.li/journal/springing-back-into-life-slowly/</guid> <enclosure url="https://practical.li/journal/assets/images/social/springing-back-into-life-slowly.png" type="image/png" length="55385" /> </item> <item> <title>Having a Donut Party with system components</title> <author>Practicalli Johnny</author> <category>clojure</category> <category>donut</category> <category>practicalli</category> <category>repl-workflow</category> <description><p>Not quite back to full health yet, so took it easy at the weekend.</p><p>More work on restoring spare bicycles so I can sell them or otherwise find a good home.</p><p>Continued the refactor of the Practicalli Service template, specifically refining the design of the system config and helper functions to support a development REPL workflow.</p></description><link>https://practical.li/journal/having-a-donut-party-with-system-components/</link> <pubDate>Tue, 22 Oct 2024 15:22:01 +0000</pubDate><source url="https://practical.li/journal/feed_rss_updated.xml">Practicalli Personal Journal</source><guid isPermaLink="true">https://practical.li/journal/having-a-donut-party-with-system-components/</guid> <enclosure url="https://practical.li/journal/assets/images/social/having-a-donut-party-with-system-components.png" type="image/png" length="62762" /> </item> <item> <title>Git Multiple SSH Keys & Neovim</title> <author>Practicalli Johnny</author> <category>clojure</category> <category>git</category> <category>neovim</category> <category>practicalli</category> <description><p>A short week at work made even shorter by a company day to celebrate going live. A chance to unwind and reflect.</p><p><a href="https://github.com/neovim/neovim/milestones">Neovim 0.10 is planned for 1 May 2024</a>. Plugins should be unafected, although actively developing plugins like Neogit are trying to used parts of the Neovim API. The parts of Neogit that use 0.10 api should be more efficient, although I assume there wont be a noticable difference in functionality.</p><p>I will update Neovim to 0.10 when AstroNvim confirms it is working well with that release.</p></description><link>https://practical.li/journal/git-multiple-ssh-keys--neovim/</link> <pubDate>Tue, 22 Oct 2024 15:22:01 +0000</pubDate><source url="https://practical.li/journal/feed_rss_updated.xml">Practicalli Personal Journal</source><guid isPermaLink="true">https://practical.li/journal/git-multiple-ssh-keys--neovim/</guid> <enclosure url="https://practical.li/journal/assets/images/social/git-multiple-ssh-keys--neovim.png" type="image/png" length="56395" /> </item> <item> <title>Company offsite week</title> <author>Practicalli Johnny</author> <category>astronvim</category> <category>neovim</category> <category>practicalli</category> <description><p>Travelled for a work event in Portugal with a chance to meet people I work with face to face for the first time. It was a very enjoyable and also quite intensive event. I kept myself busy to help combat fatigue from travelling and manage a swim each morning and evening whilst I was at the hotel.</p><p>I am accustom to working remotely since 2010, having worked for companies based outside of the UK. It is always very valuable to meet people face to face and can start or strengthen a relationship.</p></description><link>https://practical.li/journal/company-offsite-week/</link> <pubDate>Tue, 22 Oct 2024 15:22:01 +0000</pubDate><source url="https://practical.li/journal/feed_rss_updated.xml">Practicalli Personal Journal</source><guid isPermaLink="true">https://practical.li/journal/company-offsite-week/</guid> <enclosure url="https://practical.li/journal/assets/images/social/company-offsite-week.png" type="image/png" length="51274" /> </item> <item> <title>Refactor AstroNvim Clojure pack</title> <author>Practicalli Johnny</author> <category>neovim</category> <category>practicalli</category> <description><p>Pull requests this week</p><ul><li>:fontawesome-solid-code-pull-request: <strong>MERGED</strong> <a href="https://github.com/folke/ts-comments.nvim/pull/19">Add Clojure comment patterns to ts-comments.nvim</a></li><li>:fontawesome-solid-code-pull-request: <strong>MERGED</strong> <a href="https://github.com/AstroNvim/astrocommunity/pull/982">Modularise Astrocommunity Clojure pack</a></li><li>:fontawesome-solid-code-pull-request: <strong>MERGED</strong> <a href="https://github.com/AstroNvim/astrocommunity/pull/991">Update AstroNvim Cloure pack description &amp; simplify examples</a></li><li>:fontawesome-solid-code-pull-request: <strong>MERGED</strong> <a href="https://github.com/AstroNvim/astrocommunity/pull/992">Fix vim-visual-multi dependency name</a></li></ul><p>Total commits this week: 37</p><p>Submitted <a href="https://github.com/AstroNvim/astrocommunity/pull/982">a pull request to refactor the AstroNvim Community Clojure language pack</a> which I <a href="https://github.com/AstroNvim/astrocommunity/pull/248">contributed in June 2023</a>.</p><ul><li>add nvim-treesitter-sexp plugin</li><li>add example of disabling / configuring parinfer plugin</li><li>add ts-comment.nvim to support <code>;;</code> and <code>;</code> comment characters</li><li>remove autocmd from conjure plugin (no longer needed)</li><li>remove most of the opinionated conjure configuration overrides, although still hiding the repl log buffer (HUD) by default as its nicer as a separate tab. Maybe if I can have it open by default as a tab, then I could live with having the HUD open on REPL startup (a nice way to check things are working)</li></ul><p>Still sleepy from travel to the company off-site last week and the cycle ride on Saturday. Although I did manage some work in the garden on Sunday.</p></description><link>https://practical.li/journal/refactor-astronvim-clojure-pack/</link> <pubDate>Tue, 22 Oct 2024 15:22:01 +0000</pubDate><source url="https://practical.li/journal/feed_rss_updated.xml">Practicalli Personal Journal</source><guid isPermaLink="true">https://practical.li/journal/refactor-astronvim-clojure-pack/</guid> <enclosure url="https://practical.li/journal/assets/images/social/refactor-astronvim-clojure-pack.png" type="image/png" length="59095" /> </item> <item> <title>Practicalli content planning</title> <author>Practicalli Johnny</author> <category>clojure</category> <category>megalinter</category> <category>neovim</category> <category>practicalli</category> <description><p>Hyprland promises to be a great experience but also a potential time drain, so will save most of the investigation and further configuration until the winter break (or if I need a little distraction of the new shiny for motivation).</p><p>Taking two weeks off from work and have some time to work on Practicalli content.</p></description><link>https://practical.li/journal/practicalli-content-planning/</link> <pubDate>Tue, 22 Oct 2024 15:22:01 +0000</pubDate><source url="https://practical.li/journal/feed_rss_updated.xml">Practicalli Personal Journal</source><guid isPermaLink="true">https://practical.li/journal/practicalli-content-planning/</guid> <enclosure url="https://practical.li/journal/assets/images/social/practicalli-content-planning.png" type="image/png" length="48310" /> </item> <item> <title>Hacking on Practicalli content</title> <author>Practicalli Johnny</author> <category>neovim</category> <category>practicalli</category> <category>practicalli</category> <description><p>I am enjoying my 2 week at home vacation (stay-cation) and have already completely rewired my desk, laptops, Monitors and NAS storage devices on the electronic standing desk. It feels a lot more organised and easier to find everything as everything has its place.</p><p>Now I can focus on getting lots of <a href="#practicalli">Practicalli content done</a> (as well as catch up with shows on Paramount+ and maybe a little Polybus on the Playstation4 VR headset)</p><p>I am interested in switching to the Hyprland, although its changing fast so I dug out an older laptop and installed Arch Linux with Hyprland using the <code>archinstall</code> tool. Unfortunately the laptop I used doesnt seem to support Hyprland or something is missing from the install.</p><p>I am taking a stay-cation as I am still recovering from Covid and the weather is also quite grim. I am getting out for walks each day and on Friday I completed a short cycle ride as it was nice and sunny outside. Unfortunately my chest started feeling like it was on fire a few minutes into the ride, so I slowed down and limited myself to 10km.</p><p>I was feeling really sleepy after the ride, so I kept myself awake by sorting through the cardboard boxes in my attic. Many boxes made the ultimate sacrifice (for an uncluttered house) and went to the recycling service.</p></description><link>https://practical.li/journal/hacking-on-practicalli-content/</link> <pubDate>Tue, 22 Oct 2024 15:22:01 +0000</pubDate><source url="https://practical.li/journal/feed_rss_updated.xml">Practicalli Personal Journal</source><guid isPermaLink="true">https://practical.li/journal/hacking-on-practicalli-content/</guid> <enclosure url="https://practical.li/journal/assets/images/social/hacking-on-practicalli-content.png" type="image/png" length="50806" /> </item> <item> <title>Megalinter 8 and monthly version updates</title> <author>Practicalli Johnny</author> <category>clojure</category> <category>practicalli</category> <description><p>Megalinter updates to version 8 using the megalinter runner tool, adding a Makefile task to simplify the command line (so I dont have to remember the command).</p><p>Material for MkDocs provides a nice diff view using the <code>diff</code> language for a code block. Add or copy a diff into the code block, ensuring the <code>-</code> and <code>+</code> signs are included and the diff is automatically highlighted. See the <a href="#megalinter">Megalinter</a> section of this post for an example.</p><p>Feeling quite low the last few weeks, mostly due to continued Covid symptoms, low blood oxygen and lack of energy. Waking up I feel like I have experienced carbon dioxide poisoning (which I have experienced working on a mushroom farm). I am disorientated, dizzy and feel quite terrible.</p></description><link>https://practical.li/journal/megalinter-8-and-monthly-version-updates/</link> <pubDate>Tue, 22 Oct 2024 15:22:01 +0000</pubDate><source url="https://practical.li/journal/feed_rss_updated.xml">Practicalli Personal Journal</source><guid isPermaLink="true">https://practical.li/journal/megalinter-8-and-monthly-version-updates/</guid> <enclosure url="https://practical.li/journal/assets/images/social/megalinter-8-and-monthly-version-updates.png" type="image/png" length="62600" /> </item> <item> <title>MegaLinter Grafana Dashboards</title> <author>Practicalli Johnny</author> <category>dashboard</category> <category>debian</category> <category>github</category> <category>grafana</category> <category>megalinter</category> <category>practicalli</category> <description><p>As Practicalli projects are being updated to Megalinter version 8 it seemed a good time to try the Megalinter API reporter to publish data to use with Grafana. A chance to learn more about creating Dashboards and if Grafana is any easier than DataDog.</p><p>!!! WARNING "Megalinter not publishing logs on Grafana yet" Unfortunately I havent been able to make the Megalinter API Reporter work with this journal project, Clojure CLI Config or a new megalinter-test project I created.</p><p>Health is a little better after resting over the weekend, although still have lots of symptoms.</p><p>!!! EXAMPLE "Megalinter Grafana dashboard example project" <a href="https://github.com/practicalli/megalinter-test">:fontawesome-brands-github: Practicalli Megalinter-Test</a>{target=_blank .md-button}</p><pre><code>NOTE: I am trying to diagnose why this project does not seem to be sending logs to Grafana.</code></pre></description><link>https://practical.li/journal/megalinter-grafana-dashboards/</link> <pubDate>Tue, 22 Oct 2024 15:22:01 +0000</pubDate><source url="https://practical.li/journal/feed_rss_updated.xml">Practicalli Personal Journal</source><guid isPermaLink="true">https://practical.li/journal/megalinter-grafana-dashboards/</guid> <enclosure url="https://practical.li/journal/assets/images/social/megalinter-grafana-dashboards.png" type="image/png" length="53772" /> </item> <item> <title>Here Comes The Rain</title> <author>Practicalli Johnny</author> <category>clojure</category> <category>debian</category> <category>practicalli</category> <description><p>Thunderstorms abound which will be good for the vegetables growing in my garden (beetroot, courgettes, parsnips and onions)</p></description><link>https://practical.li/journal/here-comes-the-rain/</link> <pubDate>Tue, 22 Oct 2024 15:22:01 +0000</pubDate><source url="https://practical.li/journal/feed_rss_updated.xml">Practicalli Personal Journal</source><guid isPermaLink="true">https://practical.li/journal/here-comes-the-rain/</guid> <enclosure url="https://practical.li/journal/assets/images/social/here-comes-the-rain.png" type="image/png" length="46556" /> </item> <item> <title>Day 98: Coaching and 4Clojure 53</title> <author>Practicalli Johnny</author> <category>100daysofcode</category> <category>4clojure</category> <category>clojure</category> <description><p>Continued coaching one of my regular students</p><p>Took Poppy (one of my cats) to the vets for a checkup. Apart from a some plaque build Poppy is fine. More toothpaste and teeth cleaning for Poppy.</p><p>Cycled into Wagamama Southbank for another coaching session, getting my teeth stuck into 4Clojure challenge #53, a tricky one eventually solved with <code>partition</code> and <code>partition-by</code>.</p><p>!!! INFO "4Clojure solution" <a href="https://github.com/practicalli/four-clojure/commit/846c62fa2b95a844368d72011f0cc1d361bb4470">4Clojure #53 solution</a>{target=_blank}</p></description><link>https://practical.li/journal/day-98-coaching-and-4clojure-53/</link> <pubDate>Tue, 22 Oct 2024 11:22:46 +0000</pubDate><source url="https://practical.li/journal/feed_rss_updated.xml">Practicalli Personal Journal</source><guid isPermaLink="true">https://practical.li/journal/day-98-coaching-and-4clojure-53/</guid> <enclosure url="https://practical.li/journal/assets/images/social/day-98-coaching-and-4clojure-53.png" type="image/png" length="62762" /> </item> <item> <title>Day 100: 4Clojure</title> <author>Practicalli Johnny</author> <category>100daysofcode</category> <category>4clojure</category> <category>clojure</category> <description><p>100 days of code challenge completed. Was it worth it? Well yes, it got me coding almost every day, and overall I certainly achieved more than 100 hours of coding, more like several 100 hours of coding.</p><p>I didnt do was work on a specific project every day, but that would have felt more like work and I enjoyed having a break from that routine.</p><p>Will I do a 100 days of code challenge again? Not sure, its quite a hard thing to be consistent with. I will certainly keep a developer journal from now on as it has been very useful.</p><p>!!! INFO "4Clojure solution"</p><pre><code>Write up of the 4Clojure exercises I covered in yesterdays Clojure study group broadcast.Popped out for a few essentials in the last day I am prepared to go shopping before the holidays :)- [4Clojure #17](https://github.com/jr0cket/four-clojure/commit/7ff29a9f7014fde30e133f88f78c15d8729ed68e){target=_blank}- [4Clojure #18](https://github.com/jr0cket/four-clojure/commit/f75d84c2ab82b0b74c6b87b29935c2a4e175cfc0){target=_blank}- [4Clojure #19](https://github.com/jr0cket/four-clojure/commit/0a4a8561b951284aa90910f339cdae9c20225007){target=_blank}- [4Clojure #20](https://github.com/jr0cket/four-clojure/commit/91616e84ed16803a76734a443a7a4b3b65c20262){target=_blank}- [4Clojure #21](https://github.com/jr0cket/four-clojure/commit/5fe42949b7123c42a6b8d1f6ab8df2c7afc8f200){target=_blank}- [4Clojure #22](https://github.com/jr0cket/four-clojure/commit/d7444b2f3f2f39937c4889cb080724ac790ec374){target=_blank}</code></pre></description><link>https://practical.li/journal/day-100-4clojure/</link> <pubDate>Tue, 22 Oct 2024 11:22:46 +0000</pubDate><source url="https://practical.li/journal/feed_rss_updated.xml">Practicalli Personal Journal</source><guid isPermaLink="true">https://practical.li/journal/day-100-4clojure/</guid> <enclosure url="https://practical.li/journal/assets/images/social/day-100-4clojure.png" type="image/png" length="47449" /> </item> <item> <title>How much root cause analysis to do?</title> <author>Practicalli Johnny</author> <category>practicalli</category> <description><p>Winter starts on Friday 22nd December, although its already much colder this year.</p><p>Early to bed tonight as I start commercial work on Monday morning.</p></description><link>https://practical.li/journal/how-much-root-cause-analysis-to-do/</link> <pubDate>Tue, 22 Oct 2024 00:22:57 +0000</pubDate><source url="https://practical.li/journal/feed_rss_updated.xml">Practicalli Personal Journal</source><guid isPermaLink="true">https://practical.li/journal/how-much-root-cause-analysis-to-do/</guid> <enclosure url="https://practical.li/journal/assets/images/social/how-much-root-cause-analysis-to-do.png" type="image/png" length="56770" /> </item> <item> <title>First day at the new company</title> <author>Practicalli Johnny</author> <category>practicalli</category> <description><p>How does it feel to be employed... wonderful.</p></description><link>https://practical.li/journal/first-day-at-the-new-company/</link> <pubDate>Tue, 22 Oct 2024 00:22:57 +0000</pubDate><source url="https://practical.li/journal/feed_rss_updated.xml">Practicalli Personal Journal</source><guid isPermaLink="true">https://practical.li/journal/first-day-at-the-new-company/</guid> <enclosure url="https://practical.li/journal/assets/images/social/first-day-at-the-new-company.png" type="image/png" length="53428" /> </item> <item> <title>On-boarding at the new job</title> <author>Practicalli Johnny</author> <category>practicalli</category> <description><p>Balancing enthusiasm to be productive with learning enough first so as not to be dangerous</p></description><link>https://practical.li/journal/on-boarding-at-the-new-job/</link> <pubDate>Tue, 22 Oct 2024 00:22:57 +0000</pubDate><source url="https://practical.li/journal/feed_rss_updated.xml">Practicalli Personal Journal</source><guid isPermaLink="true">https://practical.li/journal/on-boarding-at-the-new-job/</guid> <enclosure url="https://practical.li/journal/assets/images/social/on-boarding-at-the-new-job.png" type="image/png" length="53198" /> </item> <item> <title>Conjure LSP bug & Cycling video editing</title> <author>Practicalli Johnny</author> <category>clojure</category> <category>conjure</category> <category>cycling</category> <category>neovim</category> <category>practicalli</category> <description><p>Updated to Kitty 0.35.1 easily and switching between dark and light themes working instantly again.</p><p>Diagnosed a 'new buffer' error with Conjure when using Neovim 0.9.0 and when opening a Clojure file, although everything works well in 0.10.0. EDIT: The maintainer added a fix to the <code>develop</code> branch for testing.</p><p><a href="https://github.com/Olical/conjure/issues/582">#582 REVIEW: Conjure throws new Buffer error</a>{target=_blank .md-button}</p><p>Video editing of footage taken by the front mounted camera on my bicycle. Advanced cycle training at Gravesend at the start of June.<a href="https://youtu.be/7PnCrLdTmUo">:fontawesome-brands-youtube: Bigfoot Cycling Club at Gravesent Cyclopark</a></p><p>Took a few days away from the computer to work on the garden as its nice and sunny. A mostly sunny ride on Saturday around the Kent countryside.</p></description><link>https://practical.li/journal/conjure-lsp-bug--cycling-video-editing/</link> <pubDate>Tue, 22 Oct 2024 00:18:26 +0000</pubDate><source url="https://practical.li/journal/feed_rss_updated.xml">Practicalli Personal Journal</source><guid isPermaLink="true">https://practical.li/journal/conjure-lsp-bug--cycling-video-editing/</guid> <enclosure url="https://practical.li/journal/assets/images/social/conjure-lsp-bug--cycling-video-editing.png" type="image/png" length="65948" /> </item> <item> <title>Practicalli Project Update 5</title> <author>Practicalli Johnny</author> <category>clojurists-together</category> <description><p><img alt="Clojurists Together Logo" src="https://raw.githubusercontent.com/practicalli/graphic-design/live/buttons/practicalli-clojurists-together-button.svg">{align=right loading=lazy style="height:150px;width:150px"}</p><p>A range of updates, new content and tool reviews and testing. <a href="https://exercism.io/profiles/Practicalli">Helping lots of students on Exercism</a> in the last week.</p></description><link>https://practical.li/journal/practicalli-project-update-5/</link> <pubDate>Mon, 21 Oct 2024 23:42:40 +0000</pubDate><source url="https://practical.li/journal/feed_rss_updated.xml">Practicalli Personal Journal</source><guid isPermaLink="true">https://practical.li/journal/practicalli-project-update-5/</guid> <enclosure url="https://practical.li/journal/assets/images/social/practicalli-project-update-5.png" type="image/png" length="50834" /> </item> <item> <title>Practicalli Project Update 2</title> <author>Practicalli Johnny</author> <category>clojurists-together</category> <description><p><img alt="Clojurists Together Logo" src="https://raw.githubusercontent.com/practicalli/graphic-design/live/buttons/practicalli-clojurists-together-button.svg">{align=right loading=lazy style="height:150px;width:150px"}</p><p>Invested time to understand the changes coming to the Clojure CLI tools and understand the opportunities that <a href="https://insideclojure.org/2020/09/04/clj-exec/">Clojure exec</a> (<code>:exec-fn</code> &amp; <code>:exec-args</code>) brings to aliases. These changes provided a catalyst to start redesigning the aliases used in <a href="https://practical.li/clojure/clojure-spec/data/defining-specifications/#naming-fully-qualified-keywords">practicalli/clojure-cli-config</a>.</p></description><link>https://practical.li/journal/practicalli-project-update-2/</link> <pubDate>Mon, 21 Oct 2024 23:42:40 +0000</pubDate><source url="https://practical.li/journal/feed_rss_updated.xml">Practicalli Personal Journal</source><guid isPermaLink="true">https://practical.li/journal/practicalli-project-update-2/</guid> <enclosure url="https://practical.li/journal/assets/images/social/practicalli-project-update-2.png" type="image/png" length="50841" /> </item> <item> <title>Monthly library updates</title> <author>Practicalli Johnny</author> <category>practicalli</category> <description><p>The last monthly review of library dependency versions in Clojure CLI Config aliases for 2023</p></description><link>https://practical.li/journal/monthly-library-updates/</link> <pubDate>Mon, 21 Oct 2024 22:33:04 +0000</pubDate><source url="https://practical.li/journal/feed_rss_updated.xml">Practicalli Personal Journal</source><guid isPermaLink="true">https://practical.li/journal/monthly-library-updates/</guid> <enclosure url="https://practical.li/journal/assets/images/social/monthly-library-updates.png" type="image/png" length="50947" /> </item> <item> <title>Running walking coughing</title> <author>Practicalli Johnny</author> <category>practicalli</category> <description><p>Run Johnny Run... then have a sleepy day.</p></description><link>https://practical.li/journal/running-walking-coughing/</link> <pubDate>Mon, 21 Oct 2024 22:33:04 +0000</pubDate><source url="https://practical.li/journal/feed_rss_updated.xml">Practicalli Personal Journal</source><guid isPermaLink="true">https://practical.li/journal/running-walking-coughing/</guid> <enclosure url="https://practical.li/journal/assets/images/social/running-walking-coughing.png" type="image/png" length="49571" /> </item> <item> <title>Visiting the new office</title> <author>Practicalli Johnny</author> <category>practicalli</category> <description><p>Party on dudes...</p></description><link>https://practical.li/journal/visiting-the-new-office/</link> <pubDate>Mon, 21 Oct 2024 22:33:04 +0000</pubDate><source url="https://practical.li/journal/feed_rss_updated.xml">Practicalli Personal Journal</source><guid isPermaLink="true">https://practical.li/journal/visiting-the-new-office/</guid> <enclosure url="https://practical.li/journal/assets/images/social/visiting-the-new-office.png" type="image/png" length="49596" /> </item> <item> <title>Weekly journal & Neovide</title> <author>Practicalli Johnny</author> <category>practicalli</category> <description><p>The Practicalli journal will move to a weekly cadence now I have a full time job with Griffin Bank.</p><p>I do write a daily journal for my activities in Griffin and will share information that is not sensitive or business valuable.</p></description><link>https://practical.li/journal/weekly-journal--neovide/</link> <pubDate>Mon, 21 Oct 2024 22:33:04 +0000</pubDate><source url="https://practical.li/journal/feed_rss_updated.xml">Practicalli Personal Journal</source><guid isPermaLink="true">https://practical.li/journal/weekly-journal--neovide/</guid> <enclosure url="https://practical.li/journal/assets/images/social/weekly-journal--neovide.png" type="image/png" length="53812" /> </item> <item> <title>Neovim updates and Neovide</title> <author>Practicalli Johnny</author> <category>practicalli</category> <description><p>Enjoying the new role as there is so much to do that I can get involved with.</p><p>Also enjoying Neovide GUI for Neovim, although its more convienient to simply run <code>astro</code> for Neovim in a terminal. When I am comfortable setting the base directory or working with multiple project, then Neovide will be more convienient to use.</p></description><link>https://practical.li/journal/neovim-updates-and-neovide/</link> <pubDate>Mon, 21 Oct 2024 22:33:04 +0000</pubDate><source url="https://practical.li/journal/feed_rss_updated.xml">Practicalli Personal Journal</source><guid isPermaLink="true">https://practical.li/journal/neovim-updates-and-neovide/</guid> <enclosure url="https://practical.li/journal/assets/images/social/neovim-updates-and-neovide.png" type="image/png" length="54694" /> </item> <item> <title>End of line... for 2023</title> <author>Practicalli Johnny</author> <category>practicalli</category> <description><p>My personal plans for 2024 are not set in stone, but I would like to relocate to the countryside by the summer.</p><p>Predictions for 2024:</p><ul><li>the year of the AI lawsuits as more companies and individuals realise they content has been used to train AI models without permission or recompense.</li><li>Anthropocene is declared a new geographic era in the history of the earth, marking the significant change humanity has made to the planet (not for the good).</li></ul></description><link>https://practical.li/journal/end-of-line-for-2023/</link> <pubDate>Mon, 21 Oct 2024 22:33:04 +0000</pubDate><source url="https://practical.li/journal/feed_rss_updated.xml">Practicalli Personal Journal</source><guid isPermaLink="true">https://practical.li/journal/end-of-line-for-2023/</guid> <enclosure url="https://practical.li/journal/assets/images/social/end-of-line-for-2023.png" type="image/png" length="45815" /> </item> <item> <title>Planing Practicalli 2024</title> <author>Practicalli Johnny</author> <category>practicalli</category> <description><p>How could the community help people find relevant and quality libraries to use for their own development projects?</p></description><link>https://practical.li/journal/planing-practicalli-2024/</link> <pubDate>Mon, 21 Oct 2024 22:33:04 +0000</pubDate><source url="https://practical.li/journal/feed_rss_updated.xml">Practicalli Personal Journal</source><guid isPermaLink="true">https://practical.li/journal/planing-practicalli-2024/</guid> <enclosure url="https://practical.li/journal/assets/images/social/planing-practicalli-2024.png" type="image/png" length="45964" /> </item> </channel></rss> \ No newline at end of file diff --git a/learning-linux-like-its-1995/index.html b/learning-linux-like-its-1995/index.html index f8c221de..3d12ddc6 100644 --- a/learning-linux-like-its-1995/index.html +++ b/learning-linux-like-its-1995/index.html @@ -1103,10 +1103,13 @@ <h2 id="hyprland">Hyprland<a class="headerlink" href="#hyprland" title="Permanen <a id="__codelineno-3-4" name="__codelineno-3-4" href="#__codelineno-3-4"></a> "markup": true, <a id="__codelineno-3-5" name="__codelineno-3-5" href="#__codelineno-3-5"></a> "format": "{icon}", <a id="__codelineno-3-6" name="__codelineno-3-6" href="#__codelineno-3-6"></a> "rotate": "0", -<a id="__codelineno-3-7" name="__codelineno-3-7" href="#__codelineno-3-7"></a> // "icon-size": ${i_task +<a id="__codelineno-3-7" name="__codelineno-3-7" href="#__codelineno-3-7"></a> // "icon-size": ${i_task #(1) <a id="__codelineno-3-8" name="__codelineno-3-8" href="#__codelineno-3-8"></a> "icon-size": "8" <a id="__codelineno-3-9" name="__codelineno-3-9" href="#__codelineno-3-9"></a> }, </code></pre></div> +<ol> +<li>icon-size line seems incomplete, commented and replaced with a fixed value</li> +</ol> <p>The <code>waybar</code> command in a terminal runs waybar okay, although there are some warnings to review.</p> <div class="highlight"><pre><span></span><code><a id="__codelineno-4-1" name="__codelineno-4-1" href="#__codelineno-4-1"></a>❯<span class="w"> </span>waybar <a id="__codelineno-4-2" name="__codelineno-4-2" href="#__codelineno-4-2"></a> diff --git a/search/search_index.json b/search/search_index.json index 67d61242..689bd479 100644 --- a/search/search_index.json +++ b/search/search_index.json @@ -1 +1 @@ -{"config":{"lang":["en"],"separator":"[\\s\\-]+","pipeline":["stopWordFilter"]},"docs":[{"location":"","title":"Journal","text":"<p>A journal of thoughts and experiences from commercial work and community projects powered by Material for MkDocs</p> <p>Practical.li provides free online books covering practical guides to Clojure programming and development workflows. Practicalli Engineering Playbook contains specific guides across the full spectrum of software development.</p> <p></p> <p>All sponsorship funds are used to support the continued development of Practicalli series of books and videos, although most work is done at personal expense and time.</p> <p>Thanks to Cognitect, Nubank and sponsors from the Clojure community for your continued support</p>"},{"location":"practicalli-team/","title":"Practicalli team","text":"<p>Practicalli was created in 2019 by Johnny Stevenson as an idea born from the years spent learning Clojure in the community. I consider Practicalli a team effort as it relies on feedback and questions from the wider Clojure community, as well as the legion of libraries that have been created.</p> <p>My interest in Clojure was accidental at first but eventually became a passion it is hard to live without.</p> <p>The work created by Practicalli initially focused on learning the language, its idioms and common libraries. The work has broadened to include commercial experiences gained with Clojure since 2017.</p> <p>Although the published content is the sole effort of one person, it would not have been possible by the vast amount of work created by Cognitect and the Clojure community.</p> <p>I thank Bruce Durling for starting my journey into Clojure and the 100's of people I've met in person and online from the community that have motivated and inspired me.</p> <p>Practicalli Journal weekly updates</p> <p>Updates to Practicalli and general learning experiences are published in weekly articles on the Practicalli Journal website</p>"},{"location":"practicalli-team/#accidental-clojure","title":"Accidental Clojure","text":"<p>Over a decade of of Java development, including lots of Enterprise Java, Object Oriented databases and Corba integration work, I was looking for something to invigerate my career.</p> <p>I had a great appreciation for the Java platform but the project work seemed to be very similar and some challenges didnt seem to fit the Object Oriented approach so well.</p> <p>Scala programming language was making a lot of noise and was viewed as a useful way to start adoptiong a functional style of programming.</p> Haskel studied at University <p>A module on the Haskel language whist studying Software Engineering had planted the seed of functional programming and a declarative approach to writing code.</p> <p>Although Haskel as a language was an interesting option to take, the haskel ecosystem was not as widespread as Java and was seen as a far bigger jump. There was a limited understanding of job opportunities using Haskel, certainly compared to Java and Scala.</p> <p>I volunteered to start running a practical community event to practice Scala together. I attended the Python and Clojure dojo events to see how to run an event for Scala.</p> <p>After finding a company willing to host (and more importantly provide pizza and drinks) I started running a monthly Scala dojo.</p> <p>I kept going to the Clojure dojo as it was a very welcoming group and I was also facinated and highly confused by the language itself.</p> <p>During the first year of Clojure dojo events I slowly became very attached to the simplicity of solutions that could be created with language (even though I did strugle to understand the language as I wasnt dedicating enough time to learn it).</p> <p>I was also attracted by the thought of using Emacs for development, an editor that felt less complicated and heavyweight compared to IntelliJ used by most people for Java and Scala.</p> <p>Startup & compilation speed challenges</p> <p>IntelliJ has a very powerful indexing capability, however, for Scala it was indexing Java and Scala standard libraries which did add a few minutes when starting a projects.</p> <p>The Scala compiler in its early days did take some time to complete. As all the code was required to compile before running, then the feedback time during development was a bit of a constraint.</p> <p>Tooling optomisations and faster laptops did make things better during the first year, although still in a different time frame compared to the instant feedback with Clojure.</p>"},{"location":"practicalli-team/#conference-talks","title":"Conference talks","text":"<p>To focus my efforts to learn Clojure and share my enthusiasm, I started submitting talk proposals for conferences. An additional benefit was to go to the conferences for free.</p> <p>JAX London accepted my first Clojure talk proposal. I was very nervous giving the first talk and was still struggling to explain some of the concepts. However, the audience was very supportive in general.</p> <p>One person sat right at the front of the audience started to heckle me half way through. They wanted 'real world' examples of Clojure even though the talk was advertised as a simple introduction. Out of frustration I replied, \"this isnt the real world, its JAX London\". The audience laught out quite loudly, exept for the heckler who I think became more annoyed.</p> <p>I learned a lot about what I didnt understand about Clojure and undeterred I worked on creating better talks.</p> <p>I was hired by Atlassian as an Enginner and product ambassador (developer relations) which gave me a chance to present talks at conferences all over Europe.</p> <p>The talk I enjoyed the most was at JavaDays in Sofia, Bulgaria. I had moved away from slides and simply walked through live code examples, evaluating the code so the audience could see the REPL workflow as well as seeing the code in action.</p> <p>Working at Salesforce I was also encouraged to submit talks to conferences (as well as present with other community members at Salesforce specific events). I would submit talks and workshops on Salesforce and Clojure topics to double the chance of being accepted. Almost all conferences accepted Clojure talks over the Salesforce talks, although CodeMotion Rome did accept a Salesforce workshop as well as a Clojure talk.</p> <p>The most sureal environment I gave a Clojure talk at was CeBit, a huge conference in Hanover, Germany. The conference is so huge it is spread over 18 aircraft hanger sized buildings and there are busses to shuttle people around the conference as it takes at least 30 minutes to walk from one side of the conference to the other. I gave a talk at their \"Developer Zone\" which was a small stage in one of the huge buildings, with about 30 chairs lined up. Before I was introduced there was only a few people sitting, although by the time I had introduced myself it was standing room only (and quite a few people very slowly walking past). I recorded the presentation on a GoPro camera, which did a surprisingly good job of capturing the talk (I believe I used a separate microphone to capture the audio at a good quality).</p> <p> </p>"},{"location":"practicalli-team/#london-clojurians","title":"London Clojurians","text":"<p>Clojure dojo events and presentations</p> <p>ClojureX conference</p> <p>reClojure conferece</p> <p>Article: London Clojurians - a relatively brief history</p>"},{"location":"practicalli-team/#hack-the-tower","title":"Hack The Tower","text":"<p>Hack The Tower was a monthly practical developer event over 5 years, held in the Salesforce offices with food and drink sponsored by Salesforce (the event started in the Salesforce office of Tower 42, moving to the huge space in the Heron tower - eventually renamed to the Salesforce Tower)</p> Salesforce Tower controversy <p>There was a brief period where people were compliaining about Salesforce renaming the building after a company.</p> <p>Ironically, the original Heron tower name came from the Heron company that owned the building.</p> <p>The original office space was in Tower 42 which originally was the Nat West Tower, a bank in the UK. This building is quite unique architecture as the structure was divided vertically into 3 segments, representing the Nat West logo when looing at the buiding from above. The name was changed when the building was sold, renaming to Tower 42 as there are 42 floors in the building.</p> <p>After attending a highly enjoyable hack day at the Guardian office in London, organised by Robert Rees, I wanted to do more events like this.</p> <p>I had recently joined Salesforce (late 2012) and realised I could run a Saturday event from the Salesforce offices as they were not used at the weekend.</p> <p>I had no idea if people would turn up, so I created the event in the London Salesforce Developers, London Java Community, London Scala User Group and London Clojurians communities.</p> <p>The event premise was simple: work together to experiment with languages, libraries or even IoT (e.g. robots), learning more than you would do by working alone.</p> <p>After a few successful events, I started running a Clojure workshop as part of Hack The Tower. I would find interesting tutorials and libraries and spend the day live coding a Clojure project, with everyone else following on (and occasionally trying other ideas).</p> <p>Early workshops included setting up a Clojure development environment. Initially I encouraged the use of LightTable as the editor, as its instant feedback really helped understand if the code was correct as it was being typed.</p> <p>Once I discovered Spacemacs and added many of the Clojure specific key bindings, I created the Practicalli Spacemacs to help speed up the install setup and give people other options beyond LightTable.</p> <p>Early versions of the Practicalli books evolved from the lessons learned during these workshops.</p> <p>Hack The Tower (Hack Together London)</p> <p>Article: Hack The Tower 2013</p>"},{"location":"practicalli-team/#clojurebridge-london","title":"ClojureBridge London","text":"<p>Organised 12 ClojureBridge London events between 2014 to 2019, introducing Clojure to over 300 women and one extremely talented young girl (accompanied by her very supportive mother).</p> <p>Approximately half of the women attending were already using a programming language to some extent for work or their own projects. The rest of the attendees were learning a language for the first time.</p> <p>One of the most appreciated aspects of the event was the one-to-one ratio of students and mentors (at almost all events). The equal ratio allowed students to learn at their own pace and learn those aspects that were of most value to them.</p> <p>The event would not have been successful without the great number of volunteers that provided their own time for free. All the volunteers learned a great deal too, helping them understand areas they were less clear about and aspects of the language they could spend more time learning more deeply.</p> <p>ClojureBridge London Website</p>"},{"location":"practicalli-team/#more-workshops","title":"More workshops","text":"<p>Dev Winter and Dev Summer conferences in Cambridge</p> <p>Devoxx London</p> <p>Clojure and ClojureScript workshops</p>"},{"location":"practicalli-team/#100-days-of-code","title":"100 Days of Code","text":"<p>After working at Citi managing 6 teams building and deploying Clojure projects between 2017 and 2018, I took a break from commercial work to recharge my batteries and continue my journey into Clojure.</p> <p>I was inspired by the 100 days of code idea to spend the next 100 days working on Clojure challenges and projects. Each day I wrote a journal entry to consolidate the lessons learned that day, helping me ingrain the concepts and functions I was learning.</p> <p>As part of this learning effort I soon started a weekly live broadcast, sharing how to get set up in Clojure and solving Clojure challenges (e.g. 4EverClojure and Exercism)</p> <p>After 2 years of live broadcasts I had created over 100 hours of live coding in Clojure.</p> <p>YouTube: Learning Clojure with Practicalli</p> <p>Journal: 100 Days Of Clojure Code</p> <p>Clojurians Slack channel: 100DaysOfCode</p>"},{"location":"practicalli-team/#practicalli","title":"Practicalli","text":"<p>Initially using GitBook to self-publish books via GitHub pages, providing a few features to support code syntax highlighting, callouts and other features to help the reader consume the content effectively.</p> <p>At the end of 2022 all books were migrated to Material for MkDocs which provided a very professional look to the books and even more content presentation features (much better code syntax highlighting, collapseable admonitions, code block line highlighting and annotations)</p>"},{"location":"practicalli-team/#the-future","title":"The Future","text":"<p>John Connor, Terminator 3</p> <p>The future has not been written. There is no fate but what we make for ourselves</p> <p>The future of Practicalli is not written, although as long as I am able I will continue to evolve the content, update supporting projects and code examples.</p> <p>In 2024 there will be more content on more general aspects of Software Engineering, via the Practicalli Engineering Playbook.</p> <p>Rather than starting live broadcasts again, time will be made to create high quality screencasts. Some of these videos will replace the live broadcasts with updated content and others will include new content (clojure workflow with tools, building projects, code challenges, etc).</p> <p>Once important aspect I would like to challenge is a detailed guide to libraries available in the the Clojureverse. Whist there are some websites that list some of the libraries available, little or no context about their use and alternatives is provided.</p> <p>Suggestions as to what content and projects would be useful to the community is always welcome.</p> <p>Thank you Johnny.</p>"},{"location":"assets/images/social/","title":"Social Cards","text":"<p>Social Cards are visual previews of the website that are included when sending links via social media platforms.</p> <p>Material for MkDocs is configured to generate beautiful social cards automatically, using the colors, fonts and logos defined in <code>mkdocs.yml</code></p> <p>Generated images are stored in this directory.</p>"},{"location":"day-90---what-will-be-my-next-role/","title":"Day 90 - What will be my next role","text":"<p>Considering my options for my next role. There have been a lot of really interesting roles I have interviewed for. There is one that seems to require the widest use of my skills.</p> <ul> <li>https://github.com/practicalli/four-clojure/blob/master/src/four_clojure/011-maps-conj.clj</li> </ul>","tags":["clojure","4clojure"]},{"location":"day-90---what-will-be-my-next-role/#4clojure-challenge-11-conj-with-maps","title":"4Clojure Challenge #11 - conj with maps","text":"<p>Exploring the joining of maps and vectors into a map.</p> <p>Also explored some possible error conditions that can occur when using maps, such as incomplete pairs of keys and values.</p> <p>Design Journal: 4Clojure #11 - conj with maps</p> src/four_clojure/011-maps-conj.clj<pre><code>;; # 011 - Maps: conj\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n\n;; Difficulty: Elementary\n;; Topics:\n\n;; When operating on a map, the conj function returns a new map with one or more key-value pairs \"added\".\n\n;; (= {:a 1, :b 2, :c 3} (conj {:a 1} __ [:c 3]))\n\n\n;; Deconstruct the problem\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n\n;; Simply fill in a collection that contains the right values.\n\n;; Maps need to include values in pairs, a key and a value that the key is associated with.\n;; Maps can conj from values in a vector, so long as the vector contains key/value pairs\n\n;; So this expression works\n\n(conj {:a 1} [:b 2] [:c 3])\n;; => {:a 1, :b 2, :c 3}\n\n;; and of course using a map with a key value pair would also work\n\n(conj {:a 1} {:b 2} [:c 3])\n\n\n;; Using a vector that contains an a key without a value will cause and error.\n\n(conj {:a 1} [:b 2 :d] [:c 3])\n;; java.lang.IllegalArgumentException\n;; Vector arg to map conj must be a pair\n\n;; The same expression with a map this time does return something, which is surprising.\n;; Although evaluating it also throws a reader exception.\n;; This is because second map in the expression has a syntax error,\n;; {:b 2 :d} is not valid syntax.\n\n(conj {:a 1} {:b 2 :d} [:c 3])\n;; => [:c 3]\n;; clojure.lang.LispReader$ReaderException\n;; java.lang.RuntimeException: Unmatched delimiter: )\n\n\n;; Trying to construct a map using the hash-map function and an incorrect set of key value pairs\n;; also creates an error. However, this time its much clearer as to the error.\n(conj {:a 1} (hash-map :b 2 :d) [:c 3])\n\n(hash-map :b 2 :d)\n;; java.lang.IllegalArgumentException\n;; No value supplied for key: :d\n\n;; NOTE: The above code has been evaluated with Clojure 1.9. Version 1.10 may have improved error messages when using ill-formed maps.\n\n;; Answers summary\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n\n;; Simplest answers\n\n[:b 2]\n{:b 2}\n(hash-map :b 2)\n\n;; Overthought answers\n\n;; Least valuable answer\n</code></pre> <p>Thank you.</p> <p> Practical.li Website</p> <p> Practical.li GitHub Org practicalli-johnny profile</p> <p> @practicalli@clj.social @practical_li</p>","tags":["clojure","4clojure"]},{"location":"day-91---chasing-references-and-4clojure/","title":"Day 91 - Chasing references and 4Clojure","text":"<p>Chasing references for my next potential employers</p> <p>Quick write up about 4Clojure exercise #16 - Hello world.</p> <ul> <li>https://github.com/jr0cket/four-clojure/commit/639cf76e7901809413eb01f9c5a2f07187764ae0</li> </ul>","tags":["clojure"]},{"location":"day-91---chasing-references-and-4clojure/#4clojure-challenge-16-hello-world","title":"4Clojure challenge #16 Hello World","text":"<p>Discussing the <code>str</code> function to join values into a string.</p> <p>Also covering how to write a simple function definition with <code>fn</code> and call that function inline.</p> <p>For completeness, added the short form for a function definition using the reader macro <code>#()</code></p>","tags":["clojure"]},{"location":"day-91---chasing-references-and-4clojure/#job-hunting","title":"Job hunting","text":"<p>Very successful interviews with a company using data science to drive efficiencies in farming. The company processes a wide range of meteralogical and geological data to identify good locations for growing each kind of crop. Following up with guidance on how to manage the crop through its lifecycle, e.g. expected weather patterns, etc.</p> <p>I have asked for job references from Citi and Salesforce, although the replies are a little slow.</p> <p>Thank you.</p> <p> Practical.li Website</p> <p> Practical.li GitHub Org practicalli-johnny profile</p> <p> @practicalli@clj.social @practical_li</p>","tags":["clojure"]},{"location":"day-92---clojure-hack-day/","title":"Day 92 - Clojure Hack day","text":"<p>Clojure Hack day was quite a small event however it gave us a chance to work on our own projects. Worked with Mani on some basic Clojure skills. Als worked on building a simple ClojureScript React style website with our primary school student (accompanied by her mom)</p> <p>I also did a little more work with Scalable Vector Graphics, in the system monitor project I started a while ago.</p> <p>SkillsMatter were kind enough to invite us to join in the event, however, there was some issue with food and SkillsMatter did initially exclude the Clojure group although eventually we were included in the event again.</p> <ul> <li>https://github.com/jr0cket/webapp-status-monitor/commit/ce60f78c35ce737333c9b9b24b83caca6b49b596</li> </ul>","tags":["clojure"]},{"location":"day-92---clojure-hack-day/#service-monitor-project","title":"Service Monitor project","text":"<p>Work on the service monitor application and using SVG graphics</p> <p>Created a rough version of the CIDER logo using Clojure SVG (hiccup) sytax. Taking the HTML code for the logo, converted it to the Clojure SVG syntax.</p> <p>Thank you.</p> <p> Practical.li Website</p> <p> Practical.li GitHub Org practicalli-johnny profile</p> <p> @practicalli@clj.social @practical_li</p>","tags":["clojure"]},{"location":"day-93---clojure-study-group---clojurescript-reagent-website-with-svg/","title":"Day 93 - Clojure Study group - ClojureScript reagent website with SVG","text":"<p>Extremely tired today.</p> <p>Code from today</p> <ul> <li>https://github.com/practicalli/example-clojurescript-reagent-svg-website</li> </ul>","tags":["clojure"]},{"location":"day-93---clojure-study-group---clojurescript-reagent-website-with-svg/#simple-clojurescript-front-end-website-with-reagent","title":"Simple ClojureScript front end website with reagent","text":"<p>Walking through the basic concepts of building a front-end website using ClojureScript and reagent, a react-style library.</p> <p>Thank you.</p> <p> Practical.li Website</p> <p> Practical.li GitHub Org practicalli-johnny profile</p> <p> @practicalli@clj.social @practical_li</p>","tags":["clojure"]},{"location":"day-94---coaching-and-emacs-talk-at-linux-in-london/","title":"Day 94 - Coaching and Emacs talk at Linux in London","text":"<p>Cycled into London today on the Brompton and my Tannus tyres still going strong. I finally got a moment to clean them too.</p> <p>Another very productive coaching day in Wagamama today, covering the inside out approach to writing Clojure. I pushed 3 out of the 6 exercise we completed to Github.</p> <p>Cycled over to SkillsMatter to give (finish writing) my Emacs for your digital life talk for Linux in London community.</p>","tags":["clojure","4clojure"]},{"location":"day-94---coaching-and-emacs-talk-at-linux-in-london/#code-from-today","title":"Code from today","text":"<ul> <li>4Clojure #46</li> <li>4Clojure #47</li> <li>4Clojure #48</li> </ul>","tags":["clojure","4clojure"]},{"location":"day-94---coaching-and-emacs-talk-at-linux-in-london/#coaching-in-clojure-using-4clojurecom","title":"Coaching in Clojure using 4Clojure.com","text":"<p>Covered several Easy level challenges</p> <p>Discussed the thinking approach to solving 4Clojure challenges and problems in general. Breaking down problems into very simple parts, solving simple parts and then building them up to solve the larger problem. Much easier to spot errors and find code that does not quite work.</p> <p>Challenges in 4Clojure often ask for quite specific forms of result, e.g., return a set or a vector rather than a list.</p> <p>This can be a little distracting as many times its simply the values inside the form that are important and where the test is actually taking place.</p> <p>In extremely simplistic terms you can still think of all collections as a sequence, although everything but a list has extra symantics and features you can use.</p> <p>Challenges #46 to #51 were worked on during today's coaching session.</p>","tags":["clojure","4clojure"]},{"location":"day-94---coaching-and-emacs-talk-at-linux-in-london/#emacs-for-your-digital-life","title":"Emacs for your digital life","text":"<p>Presentation for the Linux in London meetup group. Lots of festive cheer, swag and I even won a reusable tea cup!</p> <p>The aim of the talk was to show off the advantages of Emacs, so I created my presentation using org-mode.</p> <p> </p> <p>Thank you.</p> <p> Practical.li Website</p> <p> Practical.li GitHub Org practicalli-johnny profile</p> <p> @practicalli@clj.social @practical_li</p>","tags":["clojure","4clojure"]},{"location":"day-95---ai-startup-team-lunch---4clojure-exercises/","title":"Day 95 - AI startup team lunch - 4Clojure exercises","text":"<p>Team lunch with the team I will be working with in the new year.</p> <p>The venue was a very basic restaurant but with nice food. There are some interesting dynamics in the team, so will need to figure out how to work with them.</p>","tags":["clojure","4clojure"]},{"location":"day-95---ai-startup-team-lunch---4clojure-exercises/#code-from-today","title":"Code from today","text":"<ul> <li>4Clojure #49 Split a sequence</li> </ul>","tags":["clojure","4clojure"]},{"location":"day-95---ai-startup-team-lunch---4clojure-exercises/#ai-startup-team-lunch","title":"AI Startup Team Lunch","text":"<p>Some awkwardness from the team as most people were meeting for the first time. I asked lots of questions and tried to make connections although it seems there was some tension in the group.</p>","tags":["clojure","4clojure"]},{"location":"day-95---ai-startup-team-lunch---4clojure-exercises/#4clojure-exercises","title":"4Clojure exercises","text":"<p>Carried on adding to the 4Clojure repository of solution write-ups. Discussing challenge #49 Split a sequence.</p> <p>There was a fairly easy solution using take and drop. However, with a little digging into the <code>clojure.core</code> the <code>juxt</code> function was a great way to show some abstraction over the drop and take.</p> <p>Thank you.</p> <p> Practical.li Website</p> <p> Practical.li GitHub Org practicalli-johnny profile</p> <p> @practicalli@clj.social @practical_li</p>","tags":["clojure","4clojure"]},{"location":"day-96---user-feedback-session--4clojure-exercises/","title":"Day 96 - User Feedback session & 4Clojure exercises","text":"<p>User feedback session for an interesting AI product client that I will be involved with in the new year.</p> <p>Sometimes listening is a challenge.</p>","tags":["clojure","4clojure"]},{"location":"day-96---user-feedback-session--4clojure-exercises/#ai-product-review","title":"AI product review","text":"<p>It was useful to hear from one of the users of the AI product by the company that I will work with next.</p> <p>However a lot of distraction came from the team, especially in random directions of discussions and unclear discussions about how the tool should be used.</p> <p>This seemed a little about face, as we should be focusing more on how the user is working and fitting the tool around them. The more training we need to give to the users, the greater barrier there would be to adoption.</p>","tags":["clojure","4clojure"]},{"location":"day-96---user-feedback-session--4clojure-exercises/#code-from-today","title":"Code from today","text":"<ul> <li>4Clojure exercises #50</li> </ul> <p>4Clojure 50: Split by type</p> <pre><code>;; Answers summary\n\ufffc\n\ufffc(fn [data]\n\ufffc (vals (group-by type data)))\n\ufffc\n\ufffc\n;; low golf score answer\n\ufffc\n\ufffc#(vals (group-by type %))\n</code></pre>","tags":["clojure","4clojure"]},{"location":"day-96---user-feedback-session--4clojure-exercises/#4clojure-exercises","title":"4Clojure exercises","text":"<p>I documented the solution to 4Clojure echallenge #50 whilst travelling on the train home from the meeting with the AI product client.</p> <p>Thank you.</p> <p> Practical.li Website</p> <p> Practical.li GitHub Org practicalli-johnny profile</p> <p> @practicalli@clj.social @practical_li</p>","tags":["clojure","4clojure"]},{"location":"day-97-planning-2019-and-4clojure/","title":"Day 97 Planning 2019 and 4Clojure","text":"<p>Planning activities for 2019, including ClojureBridge London events.</p> <ul> <li>4Clojure exercise #51</li> </ul>","tags":["clojure","4clojure"]},{"location":"day-97-planning-2019-and-4clojure/#4clojure-exercise-51-advanced-destructuring","title":"4Clojure exercise #51 - advanced destructuring","text":"<p>Another chance to read up about destructuring.</p> <p>Destructuring in Clojure - Clojure.org</p> <p>Destructuring is a great way to reduce the amount of code you need to write by using pattern matching.</p> <p>We use destructuring to define local names from data structures, both in <code>let</code> functions and function definitions.</p> <p>The challenge itself was fairly straight-forward, demonstrating a nested destructuring example.</p> <p>Thank you.</p> <p> Practical.li Website</p> <p> Practical.li GitHub Org practicalli-johnny profile</p> <p> @practicalli@clj.social @practical_li</p>","tags":["clojure","4clojure"]},{"location":"day-98-coaching-and-4clojure-53/","title":"Day 98: Coaching and 4Clojure 53","text":"<p>Continued coaching one of my regular students</p> <p>Took Poppy (one of my cats) to the vets for a checkup. Apart from a some plaque build Poppy is fine. More toothpaste and teeth cleaning for Poppy.</p> <p>Cycled into Wagamama Southbank for another coaching session, getting my teeth stuck into 4Clojure challenge #53, a tricky one eventually solved with <code>partition</code> and <code>partition-by</code>.</p> <p>4Clojure solution</p> <p>4Clojure #53 solution</p>","tags":["clojure","4clojure"]},{"location":"day-98-coaching-and-4clojure-53/#4clojure-53","title":"4Clojure #53","text":"<p>Ouch, exercise 53 was quite a tricky problem and very easy to get caught up in imperative thinking.</p> <p>Trying to do this using loop/recur and reduce approach became very complex and we didnt get that working in the end.</p> <p>I started a more functional approach along the right lines with partitioning up the data set so each combination of pairs could be compared to see if the second value was higher than the first.</p> <p>After some experiementing I realised <code>partition-by</code> could use a function that grouped the pairs until the pairs stopped increasing.</p> <p>This approach to partitioning put the data in to a shape that made it easier to process.</p> <p>Redundant data was removed and then the remaining partiions sorted by size, using <code>count</code> to find the largest continuous sequence.</p> <p>Then the resulting partitions needed to be flattened to get the right shape of data as a result.</p> <p>4Clojure Challenge 53 - Partition and Filter</p> <pre><code>;; Partition and Filter approach (medium abstraction)\n\ufffc\n\ufffc(fn [coll]\n\ufffc (let [a (partition-by #(apply < %) (partition 2 1 coll))\n\ufffc b (filter (fn [[[x1 x2]]] (< x1 x2)) a)\n\ufffc c (first (sort-by count > b))]\n\ufffc (concat (first c) (map last (rest c)))))\n</code></pre> <p>Design Journal - 4Clojure #53</p> <pre><code>(ns four-clojure.053-longest-increasing-sub-seq)\n\n;; #053 Longest increasing sub-sequence\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n\n;; Difficulty: Hard\n;; Topics: seqs\n\n;; Given a vector of integers, find the longest consecutive sub-sequence of increasing numbers. If two sub-sequences have the same length, use the one that occurs first. An increasing sub-sequence must have a length of 2 or greater to qualify.\n\n;; (= (__ [1 0 1 2 3 0 4 5]) [0 1 2 3])\n;; (= (__ [5 6 1 3 2 7]) [5 6])\n;; (= (__ [2 3 3 4 5]) [3 4 5])\n;; (= (__ [7 6 5 4]) [])\n\n\n;; Deconstruct the problem\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n\n;; This challenge took quite a bit of thinking about as its quite an\n;; imperative problem, which can easily lead to an imperative solution.\n\n;; Initial reading of the challenge suggests we iterate through the\n;; given collection values, keeping a record of each sub sequence as we go.\n\n;; This suggests we need to keep state not just for each sub-sequence\n;; but also keeping the value of the previous element as we find consecutive sub-sequences.\n\n;; By transforming the data to more relevantly shaped structures\n;; hopefully we can used simpler functions to create the desired results.\n\n\n;; Basic algorithm:\n;; Find the consecutive sub-sequences in a given collection\n\n;; e.g. [1 0 1 2 3 0 4 5] would contain [(1) (0 1 2 3) (0) (4 5)]\n\n;; Then find the longest sub-sequence\n\n\n;; REPL experiments\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n\n;; Taking a low abstraction approach with loop and recur\n\n;; Our function takes the collection to be processed as an argument.\n\n((fn longest-sub [collection]\n (loop\n ;; `temporary-sub` is the current sub-sequence being processed\n ;; `sub-collection` will contain the sub-sequences found\n ;; `remaining-collection` is used to iterate through the collection\n [temporary-sub []\n sub-collection []\n remaining-collection collection]\n\n (if (empty? remaining-collection)\n\n ;; If no more numbers in the collection, return the current sub-collection\n sub-collection\n\n ;; else if there are still numbers in the collection\n (recur\n ;; temporary-sub for building a sequence of consecutive numbers\n (cond\n (= temporary-sub []) [(first remaining-collection)]\n (= (inc (last temporary-sub)) (first remaining-collection)) (conj temporary-sub (first remaining-collection))\n (not= (inc (last temporary-sub)) (first remaining-collection)) [(first remaining-collection)])\n\n ;; sub-collection holds the largest sequence found so far\n (if (> (count temporary-sub) (count sub-collection))\n temporary-sub\n sub-collection)\n\n ;; remaining collection\n (rest remaining-collection)))))\n [1 0 1 2 3 0 4 5])\n\n;; passes the first two tests, but fails the third test. Returns [2 3] for the third test, instead of [3 4 5] because we drop out of the loop without checking if the temporary-sub is larger than the sub-collection.\n\n\n;; works for all tests except the last one...\n((fn longest-sub [collection]\n (loop\n ;; `temporary-sub` is the current sub-sequence being processed\n ;; `sub-collection` will contain the sub-sequences found\n ;; `remaining-collection` is used to iterate through the collection\n [temporary-sub []\n sub-collection []\n remaining-collection collection]\n\n ;; If no more numbers in the collection, return the current sub-collection\n (if (empty? remaining-collection)\n\n ;; As the temporary-sub value doesnt get compared until the recur call,\n ;; we need to evaluate which is bigger when processing the last value from the original collection.\n (if (> (count temporary-sub) (count sub-collection))\n temporary-sub\n sub-collection)\n\n ;; else if there are still numbers in the collection\n (recur\n ;; temporary-sub for building a sequence of consecutive numbers\n (cond\n (= temporary-sub []) [(first remaining-collection)]\n (= (inc (last temporary-sub)) (first remaining-collection)) (conj temporary-sub (first remaining-collection))\n (not= (inc (last temporary-sub)) (first remaining-collection)) [(first remaining-collection)])\n\n ;; sub-collection holds the largest sequence found so far\n (if (> (count temporary-sub) (count sub-collection))\n temporary-sub\n sub-collection)\n\n ;; remaining collection\n (rest remaining-collection)))))\n [2 3 3 4 5])\n\n\n((fn longest-sub [collection]\n (loop\n ;; `temporary-sub` is the current sub-sequence being processed\n ;; `sub-collection` will contain the sub-sequences found\n ;; `remaining-collection` is used to iterate through the collection\n [temporary-sub []\n sub-collection []\n remaining-collection collection]\n\n ;; If no more numbers in the collection, return the current sub-collection\n (if (empty? remaining-collection)\n\n ;; As the temporary-sub value doesnt get compared until the recur call,\n ;; we need to evaluate which is bigger when processing the last value from the original collection.\n ;; If all the sub-sequences are the same lenght, then we need to return an empty collection (as in the final test)\n (cond\n (> (count temporary-sub) (count sub-collection)) temporary-sub\n (> (count sub-collection) (count temporary-sub)) sub-collection\n (= 1 (count temporary-sub) (count sub-collection)) [])\n\n ;; else if there are still numbers in the collection\n (recur\n ;; temporary-sub for building a sequence of consecutive numbers\n (cond\n (= temporary-sub []) [(first remaining-collection)]\n (= (inc (last temporary-sub)) (first remaining-collection)) (conj temporary-sub (first remaining-collection))\n (not= (inc (last temporary-sub)) (first remaining-collection)) [(first remaining-collection)])\n\n ;; sub-collection holds the largest sequence found so far\n (if (> (count temporary-sub) (count sub-collection))\n temporary-sub\n sub-collection)\n\n ;; remaining collection\n (rest remaining-collection)))))\n [7 6 5 4])\n\n\n;; Whew... that was quite a lot of work and a lot of code for someone to maintain.\n\n;; Hopefully we can find some abstractions that will make this code much simpler to work with\n\n;; thinking through the algorithm again, a more functional approach would be something like:\n\n(let [sequence [1 0 1 2 3 0 4 5]]\n ;; divide into a growing sequence of numbers [[1] [1 0] [1 0 1 2]]\n ;; sort-by count\n ;; reverse\n ;; first\n )\n\n\n\n\n;; Solving #53 with partitioning and filters\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n;; Can we group the numbers together so they are grouped sequentially?\n\n;; Lets partition the first collection\n;; Partition into pairs, one step at a time,\n;; so each pair of numbers can be compared\n\n(partition 2 [1 0 1 2 3 0 4 5])\n;; => ((1 0) (1 2) (3 0) (4 5))\n\n(partition 2 1 [1 0 1 2 3 0 4 5])\n;; => ((1 0) (0 1) (1 2) (2 3) (3 0) (0 4) (4 5))\n\n;; We have a simple partition of the collection\n;; Now we can partition again using a function\n;; that compares values, so that we can again group by an increasing sequence\n\n;; We want to see which pair has the second number higher than the first\n;; so greater-than function is a simple test.\n;; We need to apply the greater-than function to each pair in the partitioned collection\n;; As each pair is in a collection then we need to map over each vector of tha tcollection\n\n(map #(apply < %) [[1 0] [0 1] [1 2]])\n;; => (false true true)\n\n;; So this gives us a promising looking function to partition with\n\n(partition-by #(apply < %)\n (partition 2 1 [1 0 1 2 3 0 4 5]))\n;; (((1 0))\n;; ((0 1) (1 2) (2 3)) ((3 0))\n;; ((0 4) (4 5)))\n\n;; we now have a collection that is partitioned where ever\n;; the second number of a piair was not greater than the first.\n\n;; We still have one pair that does not increase,\n;; so we can filter that out using another function\n\n(filter odd? [1 2 3 4 5])\n;; => (1 3 5)\n\n\n(filter\n (fn [[[number1 number2]]]\n (< number1 number2))\n (partition-by #(apply < %)\n (partition 2 1 [1 0 1 2 3 0 4 5])))\n;; => (((0 1) (1 2) (2 3))\n;; ((0 4) (4 5)))\n\n;; Now we only have two collections of pairs,\n;; each of which increases\n\n;; So we can just sort these collections by count,\n;; so the biggest collection is first\n;; then get the first one.\n\n(sort-by count >\n (filter\n (fn [[[number1 number2]]]\n (< number1 number2))\n (partition-by #(apply < %)\n (partition 2 1 [1 0 1 2 3 0 4 5]))))\n;; => (((0 1) (1 2) (2 3)) ((0 4) (4 5)))\n\n;; No change in the order of elements returned in this example,\n;; but it ensures we have the correct order.\n;; So lets get the first element\n\n(first\n (sort-by count >\n (filter\n (fn [[[number1 number2]]]\n (< number1 number2))\n (partition-by #(apply < %)\n (partition 2 1 [1 0 1 2 3 0 4 5])))))\n;; => ((0 1) (1 2) (2 3))\n\n\n;; So now we just need to combine our remaining collection to get the right shape.\n\n;; We cant just flatten, as we have extra values\n(flatten [[0 1] [1 2] [2 3]])\n;; => (0 1 1 2 2 3)\n\n\n;; If we take the first collection that contains a pair\n;; and add the last value from each of the following pairs\n;; then we will get the right result\n\n(concat\n (first [[0 1] [1 2] [2 3]])\n (map last (rest [[0 1] [1 2] [2 3]])))\n;; => (0 1 2 3)\n\n\n;; It would lead to a lot of repeated code to fit this around the function so far\n;; so using the let function will help\n\n\n((fn [coll]\n (let [partitioned (partition-by #(apply < %) (partition 2 1 coll))\n filtered (filter (fn [[[x1 x2]]] (< x1 x2)) partitioned)\n sorted (first (sort-by count > filtered))]\n (concat (first sorted) (map last (rest sorted)))))\n [1 0 1 2 3 0 4 5])\n;; => (0 1 2 3)\n\n\n\n;; Answers summary\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n\n;; Partition and Filter approach (medium abstraction)\n\n(fn [coll]\n (let [a (partition-by #(apply < %) (partition 2 1 coll))\n b (filter (fn [[[x1 x2]]] (< x1 x2)) a)\n c (first (sort-by count > b))]\n (concat (first c) (map last (rest c)))))\n\n\n\n;; loop recur approach (low level of abstraction)\n\n(fn longest-sub [collection]\n (loop\n ;; `temporary-sub` is the current sub-sequence being processed\n ;; `sub-collection` will contain the sub-sequences found\n ;; `remaining-collection` is used to iterate through the collection\n [temporary-sub []\n sub-collection []\n remaining-collection collection]\n\n ;; If no more numbers in the collection, return the current sub-collection\n (if (empty? remaining-collection)\n\n ;; As the temporary-sub value doesnt get compared until the recur call,\n ;; we need to evaluate which is bigger when processing the last value from the original collection.\n ;; If all the sub-sequences are the same lenght, then we need to return an empty collection (as in the final test)\n (cond\n (> (count temporary-sub) (count sub-collection)) temporary-sub\n (> (count sub-collection) (count temporary-sub)) sub-collection\n (= 1 (count temporary-sub) (count sub-collection)) [])\n\n ;; else if there are still numbers in the collection\n (recur\n ;; temporary-sub for building a sequence of consecutive numbers\n (cond\n (= temporary-sub []) [(first remaining-collection)]\n (= (inc (last temporary-sub)) (first remaining-collection)) (conj temporary-sub (first remaining-collection))\n (not= (inc (last temporary-sub)) (first remaining-collection)) [(first remaining-collection)])\n\n ;; sub-collection holds the largest sequence found so far\n (if (> (count temporary-sub) (count sub-collection))\n temporary-sub\n sub-collection)\n\n ;; remaining collection\n (rest remaining-collection)))))\n\n\n\n;; Interesting 4Clojure answers\n\n(fn [s]\n (->>\n (for [a (range (count s))\n b (range (inc a) (count s))]\n (subvec s a (inc b)))\n (filter #(apply < %))\n (sort-by count >)\n first\n vec))\n</code></pre> <p>Thank you.</p> <p> Practical.li Website</p> <p> Practical.li GitHub Org practicalli-johnny profile</p> <p> @practicalli@clj.social @practical_li</p>","tags":["clojure","4clojure"]},{"location":"day-100-4clojure/","title":"Day 100: 4Clojure","text":"<p>Walked through 4Clojure challenges number 16 to 22 in the Clojure virtual study group broadcast today.</p>","tags":["clojure","4clojure"]},{"location":"day-100-4clojure/#4clojure-code","title":"4Clojure Code","text":"<ul> <li>4Clojure #12</li> <li>4Clojure #13</li> <li>4Clojure #14</li> <li>4Clojure #15</li> </ul>","tags":["clojure","4clojure"]},{"location":"day-100-4clojure/#4clojure-writeup","title":"4Clojure writeup","text":"<p>Wrote up previous 4Clojure solutions #12 to #15</p> <p>Lots of fun with sequences and sequence related functions. Also included two exercises on defining your own functions.</p> <p>Thank you.</p> <p> Practical.li Website</p> <p> Practical.li GitHub Org practicalli-johnny profile</p> <p> @practicalli@clj.social @practical_li</p>","tags":["clojure","4clojure"]},{"location":"day-100-4clojure/","title":"Day 100: 4Clojure","text":"<p>100 days of code challenge completed. Was it worth it? Well yes, it got me coding almost every day, and overall I certainly achieved more than 100 hours of coding, more like several 100 hours of coding.</p> <p>I didnt do was work on a specific project every day, but that would have felt more like work and I enjoyed having a break from that routine.</p> <p>Will I do a 100 days of code challenge again? Not sure, its quite a hard thing to be consistent with. I will certainly keep a developer journal from now on as it has been very useful.</p> <p>4Clojure solution</p> <p>Write up of the 4Clojure exercises I covered in yesterdays Clojure study group broadcast.</p> <p>Popped out for a few essentials in the last day I am prepared to go shopping before the holidays :)</p> <ul> <li>4Clojure #17</li> <li>4Clojure #18</li> <li>4Clojure #19</li> <li>4Clojure #20</li> <li>4Clojure #21</li> <li>4Clojure #22</li> </ul>","tags":["clojure","4clojure"]},{"location":"day-100-4clojure/#4clojure-solutions-write-up","title":"4Clojure solutions write up","text":"<p>Continuing to write up a description on how I solved each 4Clojure exercise, explaining how I thought about the problem and different approaches possible.</p> <p>Today was a write up and elaboration on the exercises I covered in yesterdays Clojure study group broadcast.</p> <p>Thank you.</p> <p> Practical.li Website</p> <p> Practical.li GitHub Org practicalli-johnny profile</p> <p> @practicalli@clj.social @practical_li</p>","tags":["clojure","4clojure"]},{"location":"day-101-an-extra-day-of-code/","title":"Day 101: An extra day of code","text":"<p>Added more 4Clojure solutions</p> <p><code>def</code> supports a doc-string (I missed that ability previously).</p> <p>Emacs Window management when running tests in Cider with Spacemacs.</p> <p>The Logitech MX Ergo trackball mouse arrived today and it is so nice to use. Its a trackball so the mouse itself stays static on the desk avoiding the need to move my hand around and therefore reducing RSI. Using a trackball also means very little space is use. The trackball is tilted so the hand is in a natural and more comfortable position, the same position I configured with my tented Model01 keyboard.</p>","tags":["clojure","games"]},{"location":"day-101-an-extra-day-of-code/#clojure-core","title":"Clojure core","text":"<p>I finally noticed <code>def</code> supports a doc-string as with <code>defn</code>.</p> <p><code>ns</code> also supports a doc-string to define the overall purpose of the namespace</p> <p>Adding a string after the name in the <code>def</code> expression will be used as the docstring, assuming there is another value after the string (otherwise the name is bound to the string).</p>","tags":["clojure","games"]},{"location":"day-101-an-extra-day-of-code/#cider-tests-in-spacemacs","title":"Cider tests in Spacemacs","text":"<p><code>, t a</code> key binding in Spacemacs was used to run all tests for a Clojure project.</p> <p>The test report buffer is shown, replacing an existing buffer if the test buffer is not already showing. This is normal behaviour as I understand it. The test buffer should be the active window (has the cursor) so pressing q will quit the test report and show you the buffer that was in the window previously. If test report buffer is kept open in a window, then any new test report should always appear there.</p> <p>The Spacemacs Window Purpose layer could be used to modify the behaviour of the test report buffer placement and window positions for other kinds of buffer (not something I have tried yet)</p> <p>Thank you.</p> <p> Practical.li Website</p> <p> Practical.li GitHub Org practicalli-johnny profile</p> <p> @practicalli@clj.social @practical_li</p>","tags":["clojure","games"]},{"location":"day-106-tictactoe-for-virtual-study-group/","title":"Day 106: TicTacToe for Virtual Study Group","text":"<p>Walking through a video taking a functional approach to the Tic-Tac-Toe game for the Clojure study group.</p>","tags":["clojure","games"]},{"location":"day-106-tictactoe-for-virtual-study-group/#code-from-today","title":"Code from today","text":"<ul> <li>Uppercase player names</li> <li>Display board with a grid</li> <li>Refactor play-game to pure function</li> </ul>","tags":["clojure","games"]},{"location":"day-106-tictactoe-for-virtual-study-group/#functional-tic-tac-toe","title":"Functional Tic-Tac-Toe","text":"<p>Make changes to the design of the board and players to make the code easier to read than the original code in the video by Brian Wills.</p> <p>Refactor the <code>play-game</code> function to take <code>starting-board</code> and <code>player-sequence</code> as arguments rather than pulling in shared values (def). Passing arguments also means that <code>play-game</code> can be called with different board states, useful for testing especially if a computer opponent was added as an option to the game play.</p> <p>Refactor: play-game function</p> src/tictactoe_cli/core.clj<pre><code>(defn play-game\n \"The game loop.\n We iterate through the player sequence (alternate player turns)\n until there is a winner or the board is full.\"\n [starting-board player-sequence]\n (loop [board starting-board\n player-sequence player-sequence]\n (let [winner (winner? board)]\n (println \"Current board:\")\n (display-board board)\n (cond\n winner (println \"Player \" (player-name winner) \" wins!\")\n (full-board? board) (println \"The game is a draw.\")\n :else\n (recur\n (take-turn (first player-sequence) board)\n (rest player-sequence))))))\n\n(comment\n (play-game starting-board player-sequence))\n</code></pre> <p>It could be interesting to make an AI for both players and watch the output as a game progresses. A dynamic web page view of the game simulation could producing a simulation like that seen at the end of the War Games movie.</p> <p> </p> <p>Thank you.</p> <p> Practical.li Website</p> <p> Practical.li GitHub Org practicalli-johnny profile</p> <p> @practicalli@clj.social @practical_li</p>","tags":["clojure","games"]},{"location":"monthly-library-updates/","title":"Monthly library updates","text":"<p>The last monthly review of library dependency versions in Clojure CLI Config aliases for 2023</p>"},{"location":"monthly-library-updates/#practicalli-clojure-cli-config","title":"Practicalli Clojure CLI Config","text":"<p>Many GitHub repositories maintained by Practicalli include a Scheduled Version Check CI workflow, which reports newer versions of project library dependencies and GitHub actions. The CI workflow uses antq to check versions.</p> <p>Antq is used locally via the <code>:search/outdated</code> alias name in Clojure CLI Config to update the libraries which are configured as dependencies in each alias.</p> <p><code>oudated</code> is a task defined in the project <code>Makefile</code> that runs Clojure with the <code>:search/outdated</code> and writes the results to a file with the current date/time stamp.</p> <p>Run outdated task for a report new versions of on library dependencies</p> <pre><code>make outdated\n</code></pre> Makefile outdated task configuration <pre><code># Define file name for report with date/time stamp\nOUTDATED_FILE := outdated-$(shell date +%y-%m-%d-%T).org\n\noutdated: ## Check deps.edn & GitHub actions for new versions\n$(info --------- Search for outdated libraries ---------)\n- clojure -T:search/outdated > $(OUTDATED_FILE)\n</code></pre> <p>Make - Practicalli Engineering Playbook</p>"},{"location":"monthly-library-updates/#on-boarding","title":"On-boarding","text":"<p>A few magic codes and some help and I'm all signed up to Google Workspaces for the new role, so I have no excuse to avoid working on Monday :)</p> <p>I am actually quite excited about the new role, especially now I have the Keyboard.io keyboard wired up to the Mac laptop so I can type at speed again.</p>"},{"location":"monthly-library-updates/#debian-linux","title":"Debian Linux","text":"<p>Continuing with setup of Debian Linux on Lenovo Thinkpad with AMD chipset. Using trixie enabled the touchpad, so all the hardware is working except for the WiFi adaptor.</p> <p>Configured Zsh as the default shell with Power10k as the terminal prompt theme. Specific configuration is published in the practicalli/dotfiles repository</p>"},{"location":"monthly-library-updates/#blog-idea","title":"Blog idea","text":"<p>A summary of the tooling projects created and regularly maintained by Practicalli</p> <ul> <li>Clojure CLI Config aliases to extend the functionality with community tools (deps-new, antq, kaocha, etc from more than 30 other aliases)</li> <li>Project Templates to generate new production grade Clojure projects that support the Practicalli REPL workflow</li> <li>AstroNvim user config for Neovim</li> <li>Spacemacs user config for Emacs</li> </ul> Commonly used tools provides via Clojure CLI Config aliases <ul> <li><code>:project/create</code> - production grade templates for new projects, supporting the Practicalli Clojure REPL Reloaded workflow</li> <li><code>:repl/reloaded</code> - start a REPL process with nREPL server for Clojure editor connection, with REPL Reloaded tools (or <code>:dev/reloaded</code> for editor jack-in)</li> <li><code>:search/outdated</code> - report newer versions for library dependencies and GitHub actions</li> <li><code>:search/libraries</code> - find a fully qualified library name and current version (<code>clojure -X:deps find-versions</code> shows last 8 versions)</li> <li><code>:deploy/clojars</code> deploys libraries to Clojars.org using required signed approach</li> <li><code>:test/run</code> and <code>:test/watch</code> to run Kaocha test runner once or in watch mode</li> <li><code>:test/coverage</code> for a Cloverage report on unit test coverage in the project</li> <li><code>:repl/socket</code> and <code>:repl/socket-client</code> to run a socket REPL server and tubular socket REPL client</li> <li><code>:service/http</code> runs a nasus http server for local static files</li> <li><code>:performance/benchmark</code> to add Criterium library for running speed tests on expressions</li> <li><code>:performance/memory-meter</code> to measure memory usage by the Clojure project</li> </ul>"},{"location":"monthly-library-updates/#social-visits","title":"Social visits","text":"<p>Catch up with the neighbour who looks after my cats when away and I look after theirs. Making plans for cat sitting over the holidays.</p> <p>Thank you.</p> <p> Practical.li Website</p> <p> Practical.li GitHub Org practicalli-johnny profile</p> <p> @practicalli@clj.social @practical_li</p>"},{"location":"running-walking-coughing/","title":"Running walking coughing","text":"<p>Run Johnny Run... then have a sleepy day.</p>"},{"location":"running-walking-coughing/#health","title":"Health","text":"<p>Ran the first Park Run 5km event in about 3 years. I managed a time of 35 minutes and 26 seconds (although I did drop my water bottle right at the start).</p> <p>I ran part of the way. It was a mixture of run, jog, walk, jog, walk, stop to have a big cough, jog and final run to the end.</p> <p>Listened to 'Guns n Roses' first album to help with the motivation and managed to push hard at the end during 'Sweet Child O Mine'.</p> <p>Cycle club ride was cancelled today due to sub-zero temperatures overnight, increasing the risk of ice on the roads, especially the side roads often used on the various routes.</p> <p>I'll plan to do Park Run each time the cycling club ride is cancelled, as running should build up more stamina to help with hill climbs when cycling (my weakest part of cycling).</p>"},{"location":"running-walking-coughing/#debian-linux","title":"Debian Linux","text":"<p>Set up Zsh on the Lenovo AMD laptop using the prezto community configuration.</p> <p>The prezto configuration includes an option for fish shell style completion, showing the last matching command in full as a command is typed. This completion is a nice complement to the command line history.</p> <p>A nice dark powerline10k terminal prompt theme was defined and added to the practicalli/dotfiles repository.</p> <p>Thank you.</p> <p> Practical.li Website</p> <p> Practical.li GitHub Org practicalli-johnny profile</p> <p> @practicalli@clj.social @practical_li</p>"},{"location":"how-much-root-cause-analysis-to-do/","title":"How much root cause analysis to do?","text":"<p>Winter starts on Friday 22nd December, although its already much colder this year.</p> <p>Early to bed tonight as I start commercial work on Monday morning.</p>"},{"location":"how-much-root-cause-analysis-to-do/#mkdocs","title":"MkDocs","text":"<p>I havent been running the MkDocs server locally for the journal as the content is pretty straight forward. However, I was reminded this morning that its useful to catch little issues like a missing title for the post.</p> <p>If there are important things missing from the frontmatter of the post then MkDocs will fail to build.</p> <p>MkDocs error - title missing in post</p> <p>The <code>post_slugify</code> function in MkDocs takes a <code>post.title</code> and will generate an error if the title is empty. <pre><code>in _slugify_post\n return self.config.post_slugify(post.title, separator)\n File \"/usr/lib/python3/dist-packages/markdown/extensions/toc.py\", line 30, in slugify\n value = unicodedata.normalize('NFKD', value)\nTypeError: normalize() argument 2 must be str, not None\n</code></pre></p>"},{"location":"how-much-root-cause-analysis-to-do/#make-and-kitty-tweaks","title":"Make and Kitty tweaks","text":"<p>I have a Makefile task called <code>docs</code> that will run the MkDocs server locally and serve up the built web site. This runs very quickly, so there is little excuse not to run it.</p> <p>For convienience of opening the MkDocs site in the browser the MkDocs server runs on the same port for all of the practicalli books and journal website, (localhost:7777).</p> <p>It is important to ensuring only one instance of the MkDocs servier is running.</p> <p>Kitty terminal app has been configured to open a new terminal window in the same file path as the current tab. This provides a quick way to start the MkDocs server for a particular project, opening up a new tab alongside and running <code>make docs</code> (after ensuring other MkDocs severs have been stopped)</p> <p>Kitty - Open new tab in current file path</p> <p><pre><code># ---------------------------------------------------------\n# Key bindings\n\n# Open new tab in current window\nmap ctrl+shift+t launch --cwd=current --type=tab\n\n# ---------------------------------------------------------\n</code></pre> Practicalli Dotfiles - Kitty configuration</p>"},{"location":"how-much-root-cause-analysis-to-do/#neovim","title":"Neovim","text":"<p>Lazy package manager continues to impress in terms of user experience.</p> <p><code>SPC p a</code> in AstroNvim was used to update plugins with Lazy and format tools with Mason.</p> <p>There was an issue with LuaSnip update as Git detected local changes that were different to the commit history of LuaSnip it was cloning. Lazy package manager displayed a message on how to resolve it, by using <code>x</code> to remove the LuaSnip plugin and <code>I</code> to reinstall.</p> <p>This kind of Git issue rarely occurs, so having an inline help message if very helpful.</p> <p>Its assumed the root cause is some change to the LuaSnip commit history after the plugin was previously installed locally. Or something locally was added by Neovim. As the fix is very simple and fast to implement, there isnt much value in digging deeper unless this kind of issue occurs much more often.</p> <p>Thank you.</p> <p> Practical.li Website</p> <p> Practical.li GitHub Org practicalli-johnny profile</p> <p> @practicalli@clj.social @practical_li</p>"},{"location":"first-day-at-the-new-company/","title":"First day at the new company","text":"<p>How does it feel to be employed... wonderful.</p>"},{"location":"first-day-at-the-new-company/#on-boarding","title":"On-boarding","text":"<p>Meetings to introduce myself to the people I will be working with the most. Nice to see a few familiar faces from the London Clojure community.</p> <p>I had a very short start date so was given a temporary laptop to work on, although at the end of the day Apple delivered a new laptop to use. Luckily, most of the things setup on the original laptop carry over to the new one quite easily.</p> <p>The new laptop was enrolled to the company adminstration and the most recent Apple MacOXS update applied. These take the most time, so good to get them out of the way in the background.</p> <p>Using Notion.so which has a Daily Journal template to keep a work specific history of my thoughts and actions.</p> <p>I am sure there was an Emacs mode for Notion :)</p> <p>Thank you.</p> <p> Practical.li Website</p> <p> Practical.li GitHub Org practicalli-johnny profile</p> <p> @practicalli@clj.social @practical_li</p>"},{"location":"on-boarding-at-the-new-job/","title":"On-boarding at the new job","text":"<p>Balancing enthusiasm to be productive with learning enough first so as not to be dangerous</p>"},{"location":"on-boarding-at-the-new-job/#on-boarding-at-work","title":"On-boarding at work","text":"<p>Meeting more people and starting to understand more specifics about products and the way the company works.</p> <p>Re-discovering how to use a MacOSX laptop after decades of using Linux. I used a Mac at a company last year and occasionally during 2012-1017 whilst at Salesforce.</p> <p>The most noticable difference between Linux and MacOSX isthe <code>Command</code>+c/v/x for copy paste cut and using <code>Command</code> key for most things I would used <code>Ctrl</code>, but not everything. Swapping the keys would therefore not be effective. I am starting to get used to <code>Command</code> quicker this time around.</p> <p>The other big difference is the MacOSX window manager. It seems very mouse driven and all the Apple docs are very mouse focused. Coming from a Linux tiling window manager (i3) the MacOSX desktop seems very complex. The split window feature seemed promising, but it seems limited to two windows (one split). I am trying the stage manager feature which does remind me of one of the early compositors from Linux from a decade ago. Stage manager looks the least painful way to interact with multiple windows, but still seems mouse control heavy.</p> <p>Hopefully there are key bindings to control more of the MacOSX desktop and I can be more productive.</p> <p>People have suggested Rectangle as a way to have a more keyboard controlled experience with the MacOSX desktop.</p> <p>Thank you.</p> <p> Practical.li Website</p> <p> Practical.li GitHub Org practicalli-johnny profile</p> <p> @practicalli@clj.social @practical_li</p>"},{"location":"visiting-the-new-office/","title":"Visiting the new office","text":"<p>Party on dudes...</p>"},{"location":"visiting-the-new-office/#visiting-the-office","title":"Visiting the office","text":"<p>First trip into the company office. The first visit to any company office in over a year.</p> <p>Luckily I found some semi-respectable clothes to wear and was pleasently surprised that my nice trousers still fit.</p> <p>I joined in time to take part in the company dinner so this week is a great chance to meet lots of people in person and start building relationships.</p> <p>Thank you.</p> <p> Practical.li Website</p> <p> Practical.li GitHub Org practicalli-johnny profile</p> <p> @practicalli@clj.social @practical_li</p>"},{"location":"weekly-journal--neovide/","title":"Weekly journal & Neovide","text":"<p>The Practicalli journal will move to a weekly cadence now I have a full time job with Griffin Bank.</p> <p>I do write a daily journal for my activities in Griffin and will share information that is not sensitive or business valuable.</p>"},{"location":"weekly-journal--neovide/#engineering-manager","title":"Engineering Manager","text":"<p>I've completed my first week as engineering manager and there has been a lot to learn (and still a huge amount more to learn).</p> <p>I joined when we are reviewing working practices, which has given me an opportuntiy to contribute early on.</p> <p>As I am learning the business and development workflows, I am adding the occasional tweek to the already excellent docs, especially for onboarding engineers. I have sneaked in a few links to the Practicalli content too :)</p>"},{"location":"weekly-journal--neovide/#macosx-development-environment","title":"MacOSX Development environment","text":"<p>As I am setting up a Macbook Pro as the development machine I will have a chance to add any small differences between Linux and MacOSX when it comes to Clojure development.</p> <p>So far the Clojure development setup is almost identical to my Linux laptops, except for the use of Homebrew to install a few tools I would normally install via Debian packages</p> <ul> <li>Kitty, a fast terminal app with multiple session tabs</li> <li>Zsh and Prezto to optomise CLI commands, with fish-style completion enabled</li> <li>Neovim & AstroNvim for editing & coding, with Clojure LSP for live linting</li> <li>Emacs for all the things I havent learned to do in Neovim, e.g. Magit rebasing</li> <li>Java 21 (homebrew)</li> <li>Clojure</li> <li>Bazel build tool (this is new to me and looks very interesting)</li> </ul> <p>May of the development tools at Griffin are installed via a single script, so its quite simple to get going.</p>"},{"location":"weekly-journal--neovide/#neovide-gui-for-neovim","title":"Neovide GUI for Neovim","text":"<p> Neovide is a very nice and really fast GUI app on top of Neovim.</p> <p>I'll be using Neovide for the rest of December to see if its preferable to Neovim in a terminal (kitty).</p> <p>The initial reason to use Neovide seems mainly experiential, the cursor moves smoothly along and provides a pleasing visual effect when jumping around. I am assuming this will help keep track of the cursor when navigating larger code bases and text documents. There are other cursor effects which can be configured .</p>"},{"location":"weekly-journal--neovide/#neovide-install","title":"Neovide install","text":"<p>Neovide install was via a Linux AppImage from the GitHub release page for the project.</p> <p>The <code>guifont</code> option was set to define the font family and size specifically for Neovide</p> <p>Neovide guifont setting in AstroNvim</p> .config/astronvim-config/options.lua<pre><code>return {\n opt = {\n -- set to true or false etc.\n relativenumber = true, -- sets vim.opt.relativenumber\n number = true, -- sets vim.opt.number\n spell = false, -- sets vim.opt.spell\n signcolumn = \"auto\", -- sets vim.opt.signcolumn to auto\n wrap = true, -- sets vim.opt.wrap\n -- showtabline = 0, -- sets vim.opt.showtabline - zero hides tabs\n timeoutlen = 420,\n -- neovide font\n guifont = \"Fira Code:h16\",\n },\n</code></pre> <p>Neovide specific configuration can be added using a conditional block, checking the global value <code>vim.g.neovide</code></p> <p>Neovide specific configuration</p> <pre><code>if vim.g.neovide then\n -- add configuration only for Neovide\nend\n</code></pre>"},{"location":"weekly-journal--neovide/#run-neovide","title":"Run neovide","text":"<p>A shell alias called <code>neovide</code> that sets AstroNvim as the configuration and runs <code>neovide</code></p> <p>Neovide shell alias</p> .config/shell-aliases<pre><code># Neovide alias with AstroNvim configuration\nalias neovide=\"NVIM_APPNAME=astronvim neovide\"\n</code></pre>"},{"location":"weekly-journal--neovide/#remote-server-code","title":"Remote server code","text":"<p>Neovide seems useful when working with code on a remote server, especially if the server has limited graphical support.</p> <p>Neovim can be run in headless server mode using Unix sockets or TCP (ideally over an SSH connection for added security).</p> <p>Neovide can connect to Neovim and display richer information, e.g. syntax warnings, ligatures, etc.</p> Headless command for Neovim .local/bin/nvim-headless<pre><code>#!/usr/bin/env zsh\n\n# Start Neovim as a headless service for connection by GUI tools, e.g. Neovide\n\n# Set AstroNvim Configuration for Neovim\nexport NVIM_APPNAME=astronvim\n\n# Start Neovim listening over Unix socket\n$HOME/.local/bin/nvim --headless --listen /tmp/.nvim-instance.sock\n\n# Start Neovim listening over TCP - Less secure\n# nohup nvim --listen 127.0.0.1:6666 --headless </dev/null >/dev/null 2>&1 &\n</code></pre> Neovide command to connect to Neovim .local/bin/neovide-connect<pre><code>#!/usr/bin/env zsh\n\n# Connect Neovide to Neovim server\n\n# Connect over Unix sockets\n$HOME/.local/bin/neovide --server=/tmp/.nvim-instance.sock\n\n# Connect over TCP (less secure)\n# $HOME/.local/bin/neovide --server=localhost:6666\n</code></pre>"},{"location":"weekly-journal--neovide/#park-run","title":"Park Run","text":"<p>A very wet 5km park run today (although more preferable to a 4 hour cycle ride in the wet).</p> <p>I am still quite unfit when it comes to running and so continue to have a mixture of speed walking, jogging and running. I have been getting a fairly decent time with this combination.</p> <p>Today I did 5km in 35 minutes and 5 seconds, which is 20 seconds faster than last week (which had less wind and rain).</p> <p>I came 37th in my age group with an age-graded score of 42.42% (double the meaning of life). The age-graded score is a measure against world record running times for a specific age range, so it seems I wont be breaking any world records for a while :)</p> <p>Thank you.</p> <p> Practical.li Website</p> <p> Practical.li GitHub Org practicalli-johnny profile</p> <p> @practicalli@clj.social @practical_li</p>"},{"location":"neovim-updates-and-neovide/","title":"Neovim updates and Neovide","text":"<p>Enjoying the new role as there is so much to do that I can get involved with.</p> <p>Also enjoying Neovide GUI for Neovim, although its more convienient to simply run <code>astro</code> for Neovim in a terminal. When I am comfortable setting the base directory or working with multiple project, then Neovide will be more convienient to use.</p>"},{"location":"neovim-updates-and-neovide/#solo-ride","title":"Solo ride","text":"<p>Saturday was intended to be a club ride, although I didnt arrive at the starting point in time. I decided to do the level 3 ride by myself and perhaps catch up to the group. I did catch up with the group, outside the cafe at the end of the ride.</p> <p>I did have some minor mechanical issues, so did stop for about 10 minutes. I also confused the cycling computer for about 5 minutes by taking a wrong turn. So it seems likely that I would have been able to keep up with the level 3 group if I had arrived earlier.</p>"},{"location":"neovim-updates-and-neovide/#neovim","title":"Neovim","text":"<p>AstroNvim updates</p> <ul> <li>Gist-nvim create GitHub Gists from the current buffer (required GitHub CLI - <code>gh</code>)</li> <li>GitLinker.nvim generate links for files, including line ranges, for code shared on Git services, e.g. GitHub</li> </ul> <p>Practicalli AstroNvim user configuration updates</p> <ul> <li>add ignored words configuration for Alex lint tool</li> <li>add <code>set guifont = \"Fira Code:h16\"</code> in <code>options.lua</code> to set font family and size explicitly for Neovide</li> </ul> <p>Practicalli Neovim</p> <ul> <li>add install section for MacOSX with Homebrew and from Neovim Release page</li> <li>add install page for Neovide</li> </ul>"},{"location":"neovim-updates-and-neovide/#conjure-update","title":"Conjure update","text":"Conjure recent commit history <p><code>shell \u25cb conjure \uf016 clojure 4880144 Correct janet stdio module form name (9 days ago) ec71272 Set __name__ to __repl__ when setting up #540 (13 days ago) 84a1ba6 Merge branch 'sogaiu-janet-stdio' into develop (13 days ago) 2dd0976 Swap the nREPL *ns* back to the pre conjure.internal one after setup #539 (13 days ago) b9043b6 Default the nREPL Clojure context to user (13 days ago) 04ade4e Add a little example configuration section #541 (13 days ago) 02d07de Correct linguist-generated tag for Lua output (13 days ago) 19c46d5 Support Guile results that lack an assignment (like display) (13 days ago) 9b027d8 Swap guile dev dir to .nvim.fnl and add display example (13 days ago) 58da81f Cast lines to string when appending to the log (13 days ago) 83e5610 Sync sponsors! <3 thank you so much to everyone who supports this, even a tiny bit (13 days ago) 08834ed Swap the nREPL *ns* back to the pre conjure.internal one after setup #539 (13 days ago) e910e33 Default the nREPL Clojure context to user (13 days ago) 641d263 Add a little example configuration section #541 (13 days ago) 10e951f Correct linguist-generated tag for Lua output (13 days ago) af8a3da Support Guile results that lack an assignment (like display) (2 weeks ago) befd4e7 Swap guile dev dir to .nvim.fnl and add display example (2 weeks ago) 6c70271 Cast lines to string when appending to the log (2 weeks ago) ba21ef7 Sync sponsors! <3 thank you so much to everyone who supports this, even a tiny bit (2 weeks ago) 5036ec7 Add a stdio based janet client (7 weeks ago) cb86d46 Only send the Conjure client name once the Janet/netrepl REPL is connected #532 (8 weeks ago) d687f52 Don't set the conn in the janet state until it's connected (8 weeks ago) 2eb9682 Integrate #mapping#enable_defaults into every client (8 weeks ago) 79d54e4 Apply mapping#enable_defaults to clojure (8 weeks ago) e37e9f2 Compile config.lua, remove a print (8 weeks ago) fbdcd9b Add a g:conjure#mapping#enable_defaults flag which keeps the mapping code but removes the defaults #533 (8 weeks ago) 2df49cb Apply patch to janet from #532, fixing paths on Windows (8 weeks ago) 28b61dc Sync sponsors (tyvm @axvr!) (8 weeks ago) bf5a393 Make HUD zindex configurable and default to 1 (was 10) (10 weeks ago)</code></p> Neogit commit updates <pre><code>\u25cb neogit \uea86 User AstroGitFile \uf11c <leader>gnk \uf11c <leader>gs \uf11c <leader>gnt \uf11c <leader>gnc \uf11c <leader>gnd\n 49755ff Merge pull request #1043 from NeogitOrg/fix/popup-mappings (17 minutes ago)\n c6cb986 Use nil check instead of metatable. (19 minutes ago)\n 69fb64c Merge pull request #1039 from ttytm/fix/abort (3 hours ago)\n 4221b79 Merge pull request #1040 from ttytm/fix/type-defs (3 hours ago)\n 41281bc Fix type definitions (4 hours ago)\n 7ecf75a Fix close abort (4 hours ago)\n a6a7ec0 Update README.md (7 hours ago)\n 6ae788e Merge pull request #1038 from NeogitOrg/upgrade/editor-commands (8 hours ago)\n da7c378 Breaking! Remove option `disable_commit_confirmation`. You can now just use a dedicated \"Submit\" and \"Abort\" action if you don't want a confirmation. (8 hours ago)\n 6bdff60 Ensure all editors have same filesystem layout (8 hours ago)\n a33a691 Add config for commit_editor mappings (8 hours ago)\n 362c7a9 Ensure on_unload callback is called the same thing in all editors (8 hours ago)\n d171ca9 Rework how commit editor handles closing/saving/aborting (8 hours ago)\n 0932542 Merge pull request #1033 from NeogitOrg/mappable-rebase-keys (9 hours ago)\n 1990f97 cleanup (9 hours ago)\n 6a75ae9 Set metatable to handle NOP keys (10 hours ago)\n 86ad252 Lint (21 hours ago)\n f02f3d7 Merge pull request #1036 from NeogitOrg/fix/branch/revision (21 hours ago)\n 1207e96 Fix: Can't prefix heads/, remotes/, tags/ and expect things to work (21 hours ago)\n b14b86e When doing interactive rebase, and aborting, don't show a scary message. Be nicer. (22 hours ago)\n 2e5f285 Validate rebase editor mappings (22 hours ago)\n 7860697 Add help message in rebase buffer (22 hours ago)\n c2b7493 Use norm! to prevent issues with user maps (22 hours ago)\n 385aac7 Remove comment - only return the changed string, not number of changes here (22 hours ago)\n ee80acd Pull in max_length util function (22 hours ago)\n 473a79b Lint (2 days ago)\n dbf457c Use user mappings for rebase editor; add moveup, movedown, submit, abort (2 days ago)\n 9224a1a Add rebase editor commands to config for user mappings (2 days ago)\n 0ae5548 Neogit.client can now exit(1) to signify an aborted commit. (2 days ago)\n 1177aaa Use buffer:write (2 days ago)\n 29c5c58 Add buffer:write method (2 days ago)\n d6f21d8 Merge pull request #1030 from gollth/remote-popup (2 days ago)\n 0917973 Remote Popups in {Commit, Log, Reflog} Views (2 days ago)\n a13aa47 Merge pull request #1026 from NeogitOrg/fix/reset-to-tags (3 days ago)\n 7b86103 Allow resetting to tags, and use full ref names to prevent colission between tags/branches with same name. (3 days ago)\n 92b3a3c Merge pull request #1025 from NeogitOrg/checkout-tags (3 days ago)\n 7a96186 Allow checking out tags from b b (3 days ago)\n a74a25e Merge pull request #1022 from NeogitOrg/CKolkey-patch-1 (3 days ago)\n 8f38d8f Merge pull request #1023 from NeogitOrg/enhancement/filter-commit-diffs (3 days ago)\n be7751a lint (3 days ago)\n 932ee81 Pass item filter into log view, so it can be used to filter commits opened, so they only show diff's for filtered files. (3 days ago)\n b0dd97f Remove notification from commit view init (3 days ago)\n 4f5b7bd Update README.md (3 days ago)\n 7782058 Merge pull request #1021 from NeogitOrg/fix/auto-fetch-remotes (3 days ago)\n 8956302 Merge branch 'master' into fix/auto-fetch-remotes (3 days ago)\n 735d618 When fetching after checkout, repo state isn't updated. Need to check upstream manually. (3 days ago)\n a2361d2 Merge pull request #810 from NeogitOrg/auto-fetch-remotes (4 days ago)\n 275451a Update config.lua (4 days ago)\n 86636d0 Set default for fetch_after_checkout to false for now (4 days ago)\n d7990c3 Merge pull request #1012 from NeogitOrg/fixup/log (4 days ago)\n 17eb869 Merge pull request #1013 from NeogitOrg/enhancement/rebase-buffer (4 days ago)\n 568cbcb Fix tests (4 days ago)\n 857c948 Capture OID more robustly (4 days ago)\n 06e3ee8 Add documentation for rebase todo commands (4 days ago)\n 54dd6fb Add commands to rebase buffer (4 days ago)\n 066f92a Allow specifying 'kind' for commit buffer (4 days ago)\n 657c13d Reorder log popup switches, and use '-' instead of '=' (4 days ago)\n 38a62b3 Merge pull request #1011 from NeogitOrg/fix/rebase-root (4 days ago)\n 98d3064 Lint comment (4 days ago)\n 232c105 Needed for rebase (4 days ago)\n 08a8b5e Hide git remote calls (4 days ago)\n c9156f6 When --root argument is passed to git.rebase.interactively, remove the commit hash from the command. (4 days ago)\n 0cdc73e Merge pull request #1010 from NeogitOrg/delete-notification-message (5 days ago)\n 8d0a596 Delete notification message after it's done (5 days ago)\n 9e3c959 Merge pull request #1009 from NeogitOrg/CKolkey-patch-1 (5 days ago)\n d0424cf Update README.md (5 days ago)\n cebebcd Merge pull request #1008 from NeogitOrg/fix/git-command-history (6 days ago)\n e2d5ba0 Stdout, then stderr (6 days ago)\n 58c11c6 Always show error for interactive commands (6 days ago)\n a1afd4a Make failed process warnings easier to read (6 days ago)\n 748adcf Always show both stdout and stderr in git command history (6 days ago)\n d391a07 Merge branch 'master' into auto-fetch-remotes (6 days ago)\n 6be6676 Merge pull request #1007 from NeogitOrg/fix/selene-CI (6 days ago)\n 6844b3e empty (6 days ago)\n 81ec2d5 Add stylua version (6 days ago)\n badc33c Change cache (6 days ago)\n cd6bf5c test push (6 days ago)\n 946b65b ENV, not OUTPUT (6 days ago)\n 4e7fcfd fix cache key (6 days ago)\n 2f4b5d3 Use up-to-date rust toolchain (6 days ago)\n 2f8e06c Store env var (6 days ago)\n ca75650 modify selene save set (6 days ago)\n f3953df Merge pull request #1006 from NeogitOrg/fix/watcher-scheduler (6 days ago)\n 6e034cf Call scheduler first so the cli call doesn't crash when invoked via watcher (6 days ago)\n 8ff18e2 Use new error api (6 days ago)\n 32ed239 Merge branch 'master' into auto-fetch-remotes (6 days ago)\n 37d5d9f Merge pull request #1005 from NeogitOrg/async-refresh-2 (6 days ago)\n 443ad6b Move cursor restoration logic to after fn (6 days ago)\n cf97109 cleanup (6 days ago)\n 110b8ac Wait on status to finish refreshing (6 days ago)\n 59d7680 Reimplement partial refreshing (6 days ago)\n bebb153 Pass nil when partial refreshing doesn't apply (6 days ago)\n 9fbc8b4 Rewrite repo to use callback when refreshing. Removes partial refreshing for now (6 days ago)\n 92d7ecb Use callback when rendering status buffer - restore cursor location in callback, if it was stored (6 days ago)\n 857adae Merge pull request #1004 from NeogitOrg/actions-api-internal-args (8 days ago)\n 7ac1e3d Merge branch 'master' into actions-api-internal-args (8 days ago)\n 506f14a lint (8 days ago)\n 4a5cc7e Pause watcher while executing action (8 days ago)\n 68ed281 Don't refresh for these little files (8 days ago)\n 47e7dd3 Remove debounce from watcher - this would mess up the semaphore locking the status buffer from repainting. (8 days ago)\n 11f6840 Polish (8 days ago)\n 9686ce1 Hide this too (8 days ago)\n 225902e Revert 1 commits (8 days ago)\n e0296cb comment out watcher (revert me) (8 days ago)\n 0ddf77d Hide fs-tree calls (8 days ago)\n 481a866 Hide rev-parse calls (8 days ago)\n f4877cb Status is always needed, so call it here (8 days ago)\n 541724a Include branch lib (8 days ago)\n 5811135 Remove comment (8 days ago)\n 3961d73 Format (8 days ago)\n 1ed5062 Move branch refresh into branch lib (8 days ago)\n dbf9271 Use loop instead of fn (8 days ago)\n c84894d Use cli (8 days ago)\n 761e9be Merge pull request #1003 from NeogitOrg/actions-api-internal-args (8 days ago)\n ffe9295 Change remove_item_from_table to return true if it removed the item(s) (8 days ago)\n 3ad0f61 Add support for internal args to .action() api (8 days ago)\n 6d445e4 Merge pull request #1000 from NeogitOrg/fix/on-error-for-new-repo (9 days ago)\n ead172f Fix on_error when opening in a non-git directory (9 days ago)\n d0ed65e Merge pull request #880 from NeogitOrg/Expand-default-args (9 days ago)\n 34de2a2 No reason to call this over and over, it's always the same thing (9 days ago)\n a1fec2e Merge branch 'master' into Expand-default-args (9 days ago)\n 3488b9c Merge pull request #998 from NeogitOrg/fix/dont-trim-commit (9 days ago)\n c20d795 Allow opting out of trimming stdout (9 days ago)\n 8b9bd5c Escape properly (9 days ago)\n 547bea3 Revert 1 commits (9 days ago)\n d9abf38 Fix bug in pattern escape: need to handle %'s before anything else (9 days ago)\n 5828770 This is a default setting (9 days ago)\n 5628fb4 Use pattern escape for string (9 days ago)\n 3191500 Merge branch 'master' into Expand-default-args (10 days ago)\n dd288fa Merge pull request #967 from NeogitOrg/hide-from-git-history (10 days ago)\n f32d186 Hide more things and lint (10 days ago)\n 5f1c7b7 Fix process spec (10 days ago)\n 10dadd9 Change log level from error to warn (10 days ago)\n 4048119 Lint (10 days ago)\n 5133b1c Simplify error handling - always pass callback (10 days ago)\n 34d80e3 Centralize calling of :trim() (10 days ago)\n e024521 Don't double notify on error (10 days ago)\n 5a1eced Rename \"ignore_code\" to \"ignore_error\" (10 days ago)\n ec9aa05 Merge branch 'master' into hide-from-git-history (10 days ago)\n 0b5876c Merge pull request #997 from NeogitOrg/cleanup/parallel (10 days ago)\n f4fba7c Remove unused require (10 days ago)\n 48ca87f Remove unused \"job\" code (10 days ago)\n f94beff Remove unused \"parallel builder\" code (10 days ago)\n 03c278b Merge pull request #995 from NeogitOrg/fix/status-refreshing (10 days ago)\n cbfb897 Nil check buffer (10 days ago)\n 987eeda Don't need CLI (10 days ago)\n 245f882 Merge branch 'master' into fix/status-refreshing (10 days ago)\n 3ac3215 Merge pull request #996 from NeogitOrg/fix/cursor-placement-in-status (10 days ago)\n 8364cca Log watcher as refresh source (10 days ago)\n 2d55cf1 Cleanup status refresh logic (10 days ago)\n b3c0446 Use vim.api instead of vim.fn to set cursor position (10 days ago)\n e0b9687 Merge pull request #993 from NeogitOrg/fix/reschedule (11 days ago)\n 40f4ec4 Need to schedule here - breaks when opening commit editor otherwise (11 days ago)\n 62cc708 Merge pull request #875 from NeogitOrg/fix/restore-cursor-location (11 days ago)\n ade6dc5 Merge branch 'master' into fix/restore-cursor-location (11 days ago)\n 119b4fb Merge pull request #930 from GCBallesteros/add-commit-navigation (11 days ago)\n 15bf3f9 Merge branch 'master' into hide-from-git-history (12 days ago)\n f59b0e9 Merge pull request #992 from NeogitOrg/rebase-a-subset (12 days ago)\n 66e31fb Add git rebase --edit-todo command to rebase popup (12 days ago)\n 7abd392 Fix rebase popup rebase-merge options (12 days ago)\n 8ef9780 notes (12 days ago)\n e855762 Expand branch docs (12 days ago)\n e21c391 Add rebase popup help (12 days ago)\n daa7b9f Merge pull request #991 from NeogitOrg/fix/missing-status-hint-mappings (12 days ago)\n 6cbed41 Check both status and popup maps for hints (12 days ago)\n 9dce695 Cleanup rebase module (2 weeks ago)\n d12bc48 Rename rebase onto lib function (2 weeks ago)\n 1accbba Add action: Rebase Subset (2 weeks ago)\n 468f545 lint (3 weeks ago)\n 539e78f Add default opts (3 weeks ago)\n 7035226 Added another arg (3 weeks ago)\n 5515206 Merge branch 'master' into hide-from-git-history (3 weeks ago)\n 22e4322 Lint (3 weeks ago)\n d03f81b Hide all calls in git.files lib (3 weeks ago)\n b20bd95 Hide more background calls. (3 weeks ago)\n cde49bb Replace builder style call with an option passed into call() or call_sync() (3 weeks ago)\n 3b2f5aa Pass opts to call() and call_sync() - replace \"ignoring_exit_code\" with option on call/call_sync (3 weeks ago)\n 4ce821b lint (3 weeks ago)\n d08d723 Update cli lib to allow hiding cli commands executed from git history buffer (3 weeks ago)\n fbf5fa8 Hide some internal state building commands from displayed git history (3 weeks ago)\n 3c52bb1 Allow git.log.list() to be called but hidden, since it's used for some internal state building (3 weeks ago)\n 7b99857 Move constants up a scope (3 weeks ago)\n 243b712 Filter hidden git commands from history buffer (3 weeks ago)\n f3668de Remove unused code for \"parallel builder\" (3 weeks ago)\n 2ecb1a8 Cleanup (3 weeks ago)\n a6f363d Use direct CLI call here so we don't stack too much behaviour (3 weeks ago)\n 287abae Merge branch 'master' into auto-fetch-remotes (3 weeks ago)\n 63c3738 Feat: Jump to file with `<CR>` on the CommitView (5 weeks ago)\n 7756191 Expand default args to match Magit (experiment) (10 weeks ago)\n 31f24cb Formatting (2 months ago)\n 758d263 These don't seem to do anything (2 months ago)\n 75e4085 Properly store/restore cursor location. It seems that close() gets called twice, so put in a lockout to prevent that. (2 months ago)\n 806267c Auto-fetch functions (3 months ago)\n 328bb3e Extract to git lib (3 months ago)\n b6bed92 Add config (3 months ago)\n</code></pre> <p>Thank you.</p> <p> Practical.li Website</p> <p> Practical.li GitHub Org practicalli-johnny profile</p> <p> @practicalli@clj.social @practical_li</p>"},{"location":"practicalli-work-over-the-winter-break/","title":"Practicalli work over the winter break","text":"<p>The company I work for takes a break over the winter, so I have some time to spend on Practicalli content.</p>"},{"location":"practicalli-work-over-the-winter-break/#practicalli-work","title":"Practicalli work","text":"<p>Work for Practicalli that is at the top of my very long TODO list :)</p> <ul> <li>DONE: Advising on and researching for Arqivist project</li> <li>DOING: Git Signing article - Engineering Playbook</li> <li>Add ssh key to RangerOne and GKar laptops</li> <li>Git config enhancements - practicalli/dotfiles</li> <li>Neovim, Conjure & Portal video</li> <li>More content on using Neovim - Practicalli Neovim</li> <li>API with Clojure, Reitit, Swagger, mulog and http-kit - Practicalli Clojure Web Services</li> <li>AWS accounts with IAM Identity Center - Practicalli Engineering Playbook</li> <li>Check for costs once AWS free tier ends</li> <li>just tool, an enhanced version of make (can pass arguments to tasks) - review and add to Practicalli Engineering Playbook</li> <li>article: practicalli in 2023 - summary of work and projects</li> </ul>"},{"location":"practicalli-work-over-the-winter-break/#configure-git-ssh-signing","title":"Configure Git & SSH signing","text":"<p>The main development laptop used had an RSA type SSH key. ED25519 is now generally recommended, so a new key was generated with a long passphrase.</p> <pre><code>ssh-keygen -t ed25519 -C \"engineering@practical.li\"\n</code></pre> <p>ssh-keygen command output</p> ssh-keygen command output<pre><code>\u276f ssh-keygen -t ed25519 -C \"engineering@practical.li\"\nGenerating public/private ed25519 key pair.\nEnter file in which to save the key (/home/practicalli/.ssh/id_ed25519):\nEnter passphrase (empty for no passphrase):\nEnter same passphrase again:\nYour identification has been saved in /home/practicalli/.ssh/id_ed25519\nYour public key has been saved in /home/practicalli/.ssh/id_ed25519.pub\nThe key fingerprint is:\nSHA256:***********************/******************* engineering@practical.li\nThe key's randomart image is:\n+--[ED25519 256]--+\n...\n+----[SHA256]-----+\n</code></pre> <p>The passphrase of the SSH key was added to the Debian key ring using the <code>ssh-add</code> command, which prompts for the passphrase used when creating the key.</p> <pre><code>ssh-add ~/.ssh/id_ed25519\n</code></pre> <p>ssh-add command output</p> <pre><code>\u276f ssh-add ~/.ssh/id_ed25519\nEnter passphrase for id_ed25519:\nIdentity added: id_ed25519 (engineering@practical.li)\n</code></pre> <p>SSH Config for MacOSX</p> <p>Edit the SSH configuration, <code>~/.ssh/config</code>, and configure SSH to use the operating system keychain for the passphrase.</p> <pre><code>Host github.com\n AddKeysToAgent yes\n UseKeychain yes\n IdentityFile ~/.ssh/id_ed25519\n</code></pre> <p>This configuration does not seem neccessary (or correct) for Linux</p> <p>Run git commands to configure Git to use SSH signing for commits and tags. Or edit the Git client configuration, <code>~/.config/git/config</code></p> <pre><code>git config --global gpg.format ssh && \\\ngit config --global user.signingkey $HOME/.ssh/id_ed25519.pub && \\\ngit config --global commit.gpgsign true && \\\ngit config --global tag.gpgsign true && \\\ngit config gpg.ssh.allowedSignersFile \"$HOME/.config/git/allowed-signatures\"\n</code></pre> <p>Added the new SSH key to my GitHub account twice, onces as an authorisation key and second as a signing key.</p> <p>The public key was copied by opening in neovim and yanking the line, y y</p> <p>Opened GitHub Settings > SSH and GPG keys page and selected New SSH key</p> <p>Created an authorisation and signing key.</p> <p>Now I can push signed commits to GitHub</p> <p>All Practicalli Commits signed</p> <p>From now on, all commits to Practicalli repositories will be signed.</p> <p>I'm still considering if I should enforce other contributors to sign their work. I think I will mandate all code contributions be signed. Any contributions via the GitHub website should be signed.</p> <p>So it makes sense to ask all contributions that will be merged to also be signed.</p>"},{"location":"practicalli-work-over-the-winter-break/#audacity-for-audio-fun","title":"Audacity for audio fun","text":"<p>Audacity is an excellent tool for sound editing and effects, e.g. editing podcasts and creating sounds overlays for screencasts</p> <p>Install audacity and supporting libraries using Debian packages</p> <p>Install Audacity via Debian Package Manager</p> <pre><code>apt install audacity ffmpeg lame pavucontrol\n</code></pre> <p>When recording sound from the desktop, Pulse Audio should be set to the monitor for the default sound device, e.g. speakers and headphones.</p> <p>Run Audacity and Click the microphone icon for Recording. Choose Start silent monitor</p> <p>Start Pulse Audio Volume Control from desktop launcher. Select Recording tab. Select drop-down of available audio devices and choose the monitor for speakers and headphones.</p> <p>Start recording in Audacity and play the desktop audio. Waveforms should be displayed in Audacity to indicate that sounds are being detected and recorded.</p> <p>Ensure a sufficient amount of hard drive space is available when recording the desktop sound as the recorded uncompressed by default.</p> <p>Press the stop button. Use audacity tools to edit the sound and export it to a file or save the whole sound sample as an audacity project.</p> <p>Codecs such as Opus can be used to compress the sound file to a few percent of their original size without noticeable quality loss.</p> <p>Create a shell script wrapper around these codec tools to use a consistent codec configuration, e.g. convert-to-opus</p> <p>Zsh script to convert Wav files to Opus</p> <pre><code>#!/usr/bin/zsh\n\nfor x in *.wav ; do\n ffmpeg -i \"$x\" -b:a 96k -c:a libopus \"${x:r}\".opus\ndone\n</code></pre>"},{"location":"practicalli-work-over-the-winter-break/#health","title":"Health","text":"<p>A reasonably warm 84km club ride for the time of year, completed in 3.5 hours on Saturday.</p> <p>This was the first time I had tried the close riding with a group, swapping the front rider every few minutes. I found it unnatural and constraining for most of the ride. I enjoyed it when I was either at the front where I wouldnt need to slow down when decending. Or I would drop back a little from the group so I didnt have to ride the breaks down hill, as my bicycle seems to freewheel faster than the other bikes in the group (it is supposed to be an Aero bike, so it seems like that aero works).</p> <p>I was tired once I got home after the ride, although had enough engergy to make brown rice with beetroot powder and walnut pieces. I didnt need to have a big sleep</p> <p>A walk on Sunday for an hour helped streatch my legs. Walking is a good way to recover from the ride.</p> <p>I joined the local 5 km park run event on December 25h and manage a time of 34 minutes and 34 seconds, although the run on Strava it was 33 minutes and 59 seconds.</p> <p>Thank you.</p> <p> Practical.li Website</p> <p> Practical.li GitHub Org practicalli-johnny profile</p> <p> @practicalli@clj.social @practical_li</p>"},{"location":"end-of-line-for-2023/","title":"End of line... for 2023","text":"<p>My personal plans for 2024 are not set in stone, but I would like to relocate to the countryside by the summer.</p> <p>Predictions for 2024:</p> <ul> <li>the year of the AI lawsuits as more companies and individuals realise they content has been used to train AI models without permission or recompense.</li> <li>Anthropocene is declared a new geographic era in the history of the earth, marking the significant change humanity has made to the planet (not for the good).</li> </ul>"},{"location":"end-of-line-for-2023/#wikipedia-sponsorship","title":"Wikipedia sponsorship","text":"<p>Now I am working again I've started contributing financially to the Wikipedia project. Previously I have donated one-off payments, although this time its a monthly donation.</p> <p>I use Wikipedia extensively for work so its only right that I give some financial support when I am able.</p>"},{"location":"end-of-line-for-2023/#git","title":"Git","text":"<p>Included files will use relative path from the current config file being read, if the full path is not used</p> <p><code>**/</code> in front of <code>gitdir</code> file path if it does not start with <code>~</code>, <code>/</code> or <code>./</code></p> <p>ignore, commit templates, and allowed-signatures files seem to need the full path on MacOSX or can be defined relative to the home directory using tilde <code>~</code> expansion, e.g. <code>~/.config/git/ignore</code></p> <p>Practicalli Dotfiles - Git config examples</p>"},{"location":"end-of-line-for-2023/#neovim","title":"Neovim","text":"<p>Creating scripts for two Neovim videos</p> <ul> <li>Install and basic use</li> <li>Clojure development with Neovim and Conjure</li> </ul> <p>Switching to Neovide desktop UI for Neovim after testing out the project switching feature using Telescope. Using the project switching tool means I can launch Neovide from the operating system desktop launcher.</p> <p>Neovide was configured using a <code>neovide</code> shell alias to run with the AstroNvim configuration, in the same way as the <code>astro</code> alias does.</p> <p><code>SPC f p</code> in Neovim lists all the projects Neovim is aware of (I assume that are previously opened). Selecting a project prompts to choose a file via the telescope narrowing search dialog.</p> <p>The project root directory is correctly setup so that all tools work with respect to the current project.</p> <p>Using Neovide in this way makes Neovim feel more like the experience I am accustom to with Emacs (although runs fast and smooth all the time).</p> <p>Neovide super smooth cursor movement</p> <p>I am so enamoured by the smoothness of the cursor movement in Neovide. Its a simple thing, but as I am looking at the screen when touch typing I feel so connected to the editor. Its like my soul is pouring out onto the screen in front of me.</p> <p>Neovim in the terminal is just as fast, but doent have the smooth glide of the cursor in exactly the same way that Neovide does.</p> <p>Maybe this will be a short term crush, but its a simple thing that makes me very happy.</p>"},{"location":"end-of-line-for-2023/#health","title":"Health","text":"<p>A hilly 65km cycle ride on Thursday to burn-off some winter solstace calories. A good time of 2 hours 48 minutes at an average speed of 23.2km per hour.</p> <p>Gave the bike a nice shower to clean it up after the muddy Thursday ride.</p> <p>Club or solo ride on Saturday, depending if there is a nice level 4 group to join.</p> <p>Park run new years day tomorrow, aiming for 35 minutes or less.</p> <p>Subscribed to Spotify using a free 3 month plan and work email address. Will use account to identify instrumental music to focus during work and to unwind after work.</p>"},{"location":"end-of-line-for-2023/#misc","title":"Misc","text":"<p>The title of this post is an homage to the original Tron movie.</p> <p>Thank you.</p> <p> Practical.li Website</p> <p> Practical.li GitHub Org practicalli-johnny profile</p> <p> @practicalli@clj.social @practical_li</p>"},{"location":"planing-practicalli-2024/","title":"Planing Practicalli 2024","text":"<p>How could the community help people find relevant and quality libraries to use for their own development projects?</p>"},{"location":"planing-practicalli-2024/#clojurists-together-submission","title":"Clojurists Together Submission","text":"<p>Finding what libraries are available for Clojure is predominantly an internet search. There is a lack of central advice as to which of the many libraries available libraries to use and inconsistent opinions often provided.</p> <p>Whilst there are many commonly used libraries, there are many commonly used alternatives. There are numerous questions in the Clojurians Slack regarding libraries, from those new to Clojure and those more experienced.</p>"},{"location":"planing-practicalli-2024/#project-goal","title":"Project Goal","text":"<p>The Practicalli \"Which Clojure Library\" project would provide a consistent way to find and understand the purpose of Clojure libraries. Each library description would be based on commercial and community experiences, not rely on unfiltered social media content. The community would be able to update aspects of each library description to keep the information as relevant as possible.</p>"},{"location":"planing-practicalli-2024/#major-features","title":"Major Features","text":"<ul> <li>search for libraries by topic, e.g. web server, routing, html template, etc</li> <li>consistent information for each library (integration with Git for common project information)</li> <li>provide rationale, characteristics and usefulness of each project</li> <li>common stacks and describe their benefits and constraints (in a consistent way)</li> <li>link to the major libraries that compose the stack</li> </ul> <p>The first phase of the project would provide a website that included the most commonly used libraries, each with a comprehensive description of their purpose and related libraries / stacks.</p> <p>mkdocks- Which Libraries Project - GitHub issue</p> <p>Thank you.</p> <p> Practical.li Website</p> <p> Practical.li GitHub Org practicalli-johnny profile</p> <p> @practicalli@clj.social @practical_li</p>"},{"location":"debian-linux-migration/","title":"Debian Linux migration","text":"<p>Enjoying Debian Linux and freedom from Snaps</p>"},{"location":"debian-linux-migration/#post-install","title":"Post install","text":"<p>TODO: see <code>debian-post-install.md</code> file on Londo laptop</p>"},{"location":"debian-linux-migration/#nordvpn-nordpass","title":"NordVPN & Nordpass","text":"<p>NordVPN installs via a script</p> <p>Nordpass for Linux is only available as a snap, so using the website version.</p> <p>Requested to Nord support that an AppImage package for Nordpass is provided as it does not need all the mechanism of a snap.</p> <p>TODO: investigate if there is a firefox plugin for nordpass that doesnt require a separate install (doesnt seem to be the case unfortunately)</p>"},{"location":"debian-linux-migration/#adminsitration-account","title":"Adminsitration Account","text":"<p>A root user account is created during initial Debian Linux installation, prompting for the root password.</p> <p><code>su -</code> is used to change from the normal user login to the root account, allowing for package updates and other Adminsitrative commands to be run.</p> <pre><code>su -\n</code></pre> <p>Enter the root password when prompted.</p> <p>Carry out administrative tasks as required and type <code>exit</code> to leave the root account and return to the user account.</p> <p>Dedicated terminal console</p> <p>Use a dedicated terminal session when undertaking many administrative tasks by login in as root once. Terminal appls like Kitty) can open multiple tabs, so one of the tabs can be used to <code>su -</code> to the root account.</p> <p> Kitty Terminal - Practicalli Engineering Playbook</p> <p>Thank you.</p> <p> Practical.li Website</p> <p> Practical.li GitHub Org practicalli-johnny profile</p> <p> @practicalli@clj.social @practical_li</p>"},{"location":"continuing-the-move-to-debian-linux/","title":"Continuing the move to Debian Linux","text":"<p>Organising my laptop collection is a fascinating journey down a long history of laptops, many of which I had forgotten about. Most of the laptops still work and run new versions of Linux pretty well.</p> <p>I really enjoyed using the EzePc laptops as they were so easy to carry around to all the community events I used to go to. Although they would have benefited from a nice Atreus keyboard from Keyboard.io.</p> <p>Debian is very useful for older i686 to i386 cpu based hardware. Firefox-esr is the only browser that seems to still support these older chipsets.</p>"},{"location":"continuing-the-move-to-debian-linux/#new-journal","title":"New Journal","text":"<p>Use Material for MkDocs blog feature to create a rich experience for journal entries written in markdown.</p> <p>Practicalli Journal</p> <p>The journal will match the appearance of other Practicalli content and therefore have a light and dark theme built in.</p> <p>Older developer journal content will be added to the new journal to make it easier to find and consume this content, e.g. practicalli-johnny/developer-journal and practicalli-johnny/100-days-of-code</p> <p>Consider creating a 100 Days of Clojure guide to those new to learning Clojure</p>"},{"location":"continuing-the-move-to-debian-linux/#practicalli-org-github","title":"Practicalli Org .github","text":"<p>Updated Practicalli GitHub org with default repository healthcheck files</p> <ul> <li>Creative Commons License</li> <li>Code Of Conduct</li> <li>Funding with GitHub Sponsors</li> <li>Pull request templates</li> </ul> <p>All repositories within the Practicalli Org on GitHub will use these defaults unless they provide their own, e.g. within a <code>.github</code> directory.</p> <p>Updated the Practicalli Org profile defined in the <code>.github</code> repository, updating the Clojure REPL workflow images and practicalli logo.</p> <p>Using the .github repository - FreeCodeCamp</p>"},{"location":"continuing-the-move-to-debian-linux/#github-stats","title":"GitHub stats","text":"<p>Reached 366 consecutive days of commits on the <code>practicalli-john</code> GitHub account.</p> <p>Added a <code>.gitattributes</code> configuration to some repositories reporting a different or irrelevant repository language. GitHub uses</p> <p>Linguist troubleshooting: Repo language incorrectly detected</p> <p>GitHub Linguist Overrides</p> <p>GitHub Linguist languages supported</p>"},{"location":"continuing-the-move-to-debian-linux/#debian","title":"Debian","text":"<p>Spending the rest of 2023 moving over to Debian to compare the experience to Ubuntu.</p> <p>One main driver for the switch is the every growing use of Snaps for major parts of Ubuntu, rather than the more efficient debian packages.</p> <p>Snaps can make it easier for maintainers of applications and libraries.</p> <p>However, there is always at least 2 versions of a snap installed and as a snap is self-contained its install is typically larger. Snaps such as firefox have also had a noticable impact on performance, especially when starting the application. I am also concerned that a snap would be using more RAM memory as it is loading its own version of all its libraries into memory.</p> <p>Debian has stayed with the highly reliable and efficient <code>deb</code> package format for everything.</p> <p>Debian is 99% of all the things I like about Ubuntu already.</p>"},{"location":"continuing-the-move-to-debian-linux/#copy-files-using-sftp","title":"Copy files using sftp","text":"<p>Requires <code>openssh-server</code> on the system that will be connected to.</p> <p>Requires <code>ssh</code> package on the system that will connect to the Openssh-server (not installed on Debian by default).</p> <p>Connect to a user account on a remote system</p> <pre><code>sftp://192.168.0.200/home/remote-username\n</code></pre>"},{"location":"continuing-the-move-to-debian-linux/#separate-admin-account","title":"Separate admin account","text":"<p>Debian creates a proper <code>root</code> account with password during the initial install, e.g. from the net.iso. The root account is expected to be used to install packages and other administrative tasks, so the user account created is not added to a sudo list to carry out administration.</p> <p>Ubuntu adds the user account created during initial install to the sudo list, which is a little more convenient but also increases the risk of security breaches if the sudo package is ever compromised. If a user password is discovered or account otherwise compromised, then any administration task can be carried out.</p> <p>The debian approach does require remembering two passwords, one for the daily user account and one for root administration account. However, the root password could be added to a secure password manager, e.g. NordPass or 1Password.</p> <p>Thank you.</p> <p> Practical.li Website</p> <p> Practical.li GitHub Org practicalli-johnny profile</p> <p> @practicalli@clj.social @practical_li</p>"},{"location":"onboarding-to-a-new-role-hacking-clojure--neovim/","title":"Onboarding to a new role, hacking Clojure & Neovim","text":"<p>Nervous excitement about starting a new role and hopeful I dont mess it up.</p> <p>Enjoying writing a regular practicalli again, which is something I missed when not working.</p>"},{"location":"onboarding-to-a-new-role-hacking-clojure--neovim/#the-arqivist","title":"The Arqivist","text":"<p>I've been contributing to The Arqivist open source project, used to back up Slack channels.</p> <p>Another person was interested in collaborating but had a few issues getting started. The README was updated and an additional <code>:dev/env</code> alias added to <code>deps.edn</code> configuration if a contributor is not using the Practicalli Clojure CLI Config</p> <p>PR93 dev: update hack locally details for starting a REPL</p>"},{"location":"onboarding-to-a-new-role-hacking-clojure--neovim/#mulog-custom-transformations","title":"Mulog Custom transformations","text":"<p>Discussing the Arqivist project, a question arose about hiding sensitive data in logs during production whilst still seeing them during development, e.g anonymise sensitive data</p> <p>Mulog has custom transformations which can be used to pre-process each event before the publisher dispatches the event.</p> <p>The mulog maintainer created the where project to define Human readable conditions to filter data.</p> <p>where is a DSL for powerful predicate functions</p> <pre><code>(mulog/start-publisher!\n {:type :console\n :pretty? true\n :transform\n (partial filter (where :mulog/event-name :in? [:secret/db-connection :secret/api-key]))})\n</code></pre> <p>In a donut-party/system config, a production config would include the <code>:transform</code> and the dev config would not include the <code>:transform</code></p>"},{"location":"onboarding-to-a-new-role-hacking-clojure--neovim/#neovim","title":"Neovim","text":"<p>How to navigate Clojure code using AstorNvim was asked in the Clojurians Slack channel.</p> <ul> <li><code>g d</code> jumps to definitions, including let bindings and function args</li> <li><code>SPC l s</code> shows symbols in telescope popup</li> <li><code>SPC l S</code> shows symbols in a new buffer</li> <li><code>S-(</code> and <code>S-(</code> to traverse code</li> </ul> <p>Neovim commands to investigate further</p> <ul> <li><code>:help path</code> and the related topics (gf, :find, etc.)</li> <li><code>:help include</code> and related commands ([i, :isearch)</li> <li><code>:help define</code> and related commands (esp. :help include-search)</li> <li><code>:help gd</code> and related commands</li> <li><code>:help Explore</code> and related commands</li> <li><code>:help usr_22</code> has a good introduction</li> </ul> <p>Clojurians Slack - navigating code in neovim discussion</p> <p>Neovim plugin: nvim-treesitter-sexp</p> <p>Evalaute the nvim-treesitter-sexp plugin with the Practialli AstorNvim User configuration and see if it is a valuable way to navigate Clojure expressions.</p> plugins/clojure.lua<pre><code>return {\n {\n \"PaterJason/nvim-treesitter-sexp\",\n ft = { \"clojure\", \"fennel\", \"janet\" },\n opts = {\n -- configuration:\n -- https://github.com/PaterJason/nvim-treesitter-sexp#configuration\n enabled = true,\n set_cursor = true,\n keymaps = {\n commands = {\n promote_elem = \"<LocalLeader>kO\",\n promote_form = \"<LocalLeader>ko\",\n splice = \"<LocalLeader>k@\",\n },\n motions = {},\n textobjects = {},\n },\n },\n },\n}\n</code></pre> <p>If the plugin is successful, add it to the AstroNvim Community Clojure pack</p>"},{"location":"onboarding-to-a-new-role-hacking-clojure--neovim/#new-role","title":"New role","text":"<p>I'm starting a new role (references allowing) as an Engineering Manager at a very nice Fintech company.</p> <p>I've signed a contract and started completing the inital onboarding forms. Hopefully the people I have put as references have positive things to say about me and the company is satisfied.</p> <p>Part of the onboarding is to select a laptop to use. As the company is in a regulated industry, they use MacBook Pro for their engineers. I did get a choice of 14\" or 16\" display and which keyboard layout I preferred.</p> <p>My previous experience with MacBook was mared by the elusive <code>#</code> character, so I opted for the International English Keyboard layout</p> <p>MacBook Keyboard layouts visualised</p> <p>MacBook Keyboard guide</p> <p>Thank you.</p> <p> Practical.li Website</p> <p> Practical.li GitHub Org practicalli-johnny profile</p> <p> @practicalli@clj.social @practical_li</p>"},{"location":"practicalli-email/","title":"Practicalli Email","text":"<p>Making a note of why things are set up are useful so you dont delete anything important!</p>"},{"location":"practicalli-email/#practicalli-email-address","title":"Practicalli Email address","text":"<p>The Practical.li domain is managed via Gandi domain name service.</p> <p>Recieving emails from @practical.li addresses is manged by Gandi Email forwarding, each @practical.li email is mapped to a GMail email account.</p> <p>Gandi also provided a free mailbox and SMTP service, although from November 2023 this is only a commercial servce.</p> <p>The Gandi mailbox was used to send emails from @practical.li addresses, although Gandi are only providing this as a paid service. I had forgotten why I had a mailbox with them as all the mail is forwared to GMail. Once I deleted the Gandi mailbox and send an email with a @practical.li email address I quickly remembered...</p> <p>I would rather use the sponsorship money to support writing content for Practicalli rather than speding it on services.</p> <p>Luckily I found many articles on using Gmail SMTP server for applications and this includes GMail when using a different domain. This is also much simpler to maintain and understand what it is used for.</p> <p>Create a Google account app password</p> <p>Open myaccount.google.com > Security > 2-Step Verification > App passwords</p> <p>Save app password in password manager as it will not be shown again.</p> <p>Google account will confirm it was the correct user creating the app password, via an email and notification on the users android phone.</p> <p>Sign in with app password - Google Account Help</p> <p>The Google account App Password is used to send @practical.li emails via Google <code>smtp.gmail.com</code> server.</p> <p>The Google account name and password cannot be used as that approach also requires a 2-factor token</p> <p>Add another email account in Gmail</p> <p>Open Gmail > Settings > Accounts and Import</p> <p>Enter Name and Email address for the new email</p> <p>Ensure Treat as an alias is ticked</p> <p>Click Next Step>></p> <p>Configure the SMTP server with the Google Mail host</p> <p>SMTP: server smtp.gmail.com</p> <p>Username: Google account user name something@gmail.com</p> <p>Password: App password (not the gmail login password)</p> <p>Assuming the credentials are correct, Gmail will send a confirmation email to verify the new email address</p> <p>To add your email address, click on the link in the confirmation email in Gmail Inbox.</p> <p>Send Emails from different address or alias - Gmail help</p> <p>If the email is not recieved, visit the Gmail > Settings > Accounts and Import and select veryify on the new email address</p>"},{"location":"practicalli-email/#debian-migration","title":"Debian Migration","text":"<p>Backing up a Lenovo laptop to get ready to install Debian Linux.</p> <p>Backup Asus Eze PC 900 and installed Debian Linux using i386 net iso image.</p> <p>Thank you.</p> <p> Practical.li Website</p> <p> Practical.li GitHub Org practicalli-johnny profile</p> <p> @practicalli@clj.social @practical_li</p>"},{"location":"neovim-search-replace--debian-drm/","title":"Neovim search replace & Debian DRM","text":"<p>What are the options for search and replace text in Neovim?</p> <p>Sometimes error messages are missleading...</p>"},{"location":"neovim-search-replace--debian-drm/#neovim-search-and-replace","title":"Neovim Search and Replace","text":"<p>Known options</p> <ul> <li><code>g m A</code> will match text under curor allowing in-place editing with visual-multi plugin</li> <li><code>:%substitue</code> vim-style search and replace (I find this fiddley and not reliable, although could be user errror)</li> <li>Clojure LSP for symbols, etc.</li> </ul> <p>Use a visual select to search and replace, with confirmation</p> <p>Note: <code>'<,'></code> is automatically included when in visual mode and <code>:</code> is pressed to start a command</p> <pre><code>:'<,'>s/search-text/replace-text/gc\n</code></pre> <p>Previous slack discussions - 3 November 2022</p>"},{"location":"neovim-search-replace--debian-drm/#cdo-neovim-command","title":":cdo neovim command","text":"<p>Telescope can generate a quickfix list, showing the results of pattern matches across the current project files. Then use search and replace on the quickfix list to make changes across the project.</p> <p>Space f w search for a word across a project</p> <p>Ctrl q opens the quickfix list</p> <p>Use <code>:cdo</code> command to search and replace in the quickfix list</p> <pre><code>:cdo %s/current-pattern/new-pattern/g\n</code></pre> <p>Including the <code>c</code> option to confirm each replacement (using a noice popup when using Practicalli AstroNvim-config)</p> <p>Practicalli Neovim search-replace pages update with lessons learned today</p>"},{"location":"neovim-search-replace--debian-drm/#debian-linux","title":"Debian Linux","text":"<p>Firefox ESR has DRM disabled by default, so streaming video sites like Amazon Prime and Netflix will show errors</p> <p>Enable DRM for streaming video sites</p> <p>Open Settings > General</p> <p>Scroll down to Play DRM Content option and ensure it is checked.</p> <p>Amazon Prime shows an error describing how to enable the Widevine Content Decryption Module, however this plugin will not show in the <code>about:plugins</code> until the Settings > General > Play DRM Content option is checked.</p> <p>Thank you.</p> <p> Practical.li Website</p> <p> Practical.li GitHub Org practicalli-johnny profile</p> <p> @practicalli@clj.social @practical_li</p>"},{"location":"cycling-in-the-cold/","title":"Cycling in the cold","text":"<p>Even in the cold the countryside is beautiful.</p>"},{"location":"cycling-in-the-cold/#cycling","title":"Cycling","text":"<p>A level 4 ride with the Bigfoot Cycling Club, covering 80km in 3 hours 36 minutes.</p> <p>Wrapped up warm with multiple layers:</p> <ul> <li>Spatz base layer & Spatz winter base layer</li> <li>La Passion merino jersy</li> <li>Spatz 4 season jacket</li> <li>merino gloves, thick wooly gloves, La passion cycling gloves (to avoid wear on wolly gloves)</li> <li>Spatz toe covers and woolie booly socks</li> </ul>"},{"location":"cycling-in-the-cold/#neovim-quickfix","title":"Neovim Quickfix","text":"<p>A little more research into understanding the Neovim quickfix mode.</p> <p>Lots of notes that need organising when I'm not really sleepy from cycling.</p> <p>Thank you.</p> <p> Practical.li Website</p> <p> Practical.li GitHub Org practicalli-johnny profile</p> <p> @practicalli@clj.social @practical_li</p>"},{"location":"neovim-basics/","title":"Neovim basics","text":"<p>Feeling good from a deep sleep thanks to a good cycle ride.</p> <p>Filling in some gaps in my Neovim knowledge</p>"},{"location":"neovim-basics/#neovim","title":"Neovim","text":"<p>Updating navigation page with quickfix, jumplist and changelist information</p> <ul> <li>Neovim navigation commands</li> </ul> <p>Added modes and key bindings to enter and leave modes.</p> <p>Added command language keys, including verbs, modifiers and text objects</p> <p>Still some organising to do around the basics of neovim (and a few more things to learn)</p> <ul> <li>Multi-modal Editing</li> </ul> <p>Interesting articles:</p> <p>Global Find and Replace in Neovim</p> <p>Thank you.</p> <p> Practical.li Website</p> <p> Practical.li GitHub Org practicalli-johnny profile</p> <p> @practicalli@clj.social @practical_li</p>"},{"location":"discussing-new-role-expectations/","title":"Discussing new role expectations","text":"<p>Learning a little more about the responsibilities and expectations of the new role, which seems very much as expected.</p>"},{"location":"discussing-new-role-expectations/#meeting-new-manager","title":"Meeting new manager","text":"<p>I'm joining the platform team of a very lovely company I have wanted to work with for a while. Start date is Monday 4th December.</p> <p>I will have lots to learn when I join, especially how to use MacOSX desktop again. Using a Mac will be an opportunity to add any extra steps needed to support the Clojure workflow for MacOSX, although apart from the install I am sure its all the same as Linxu. BSD and Linux are incredibly similar (except for licensing).</p> <p>I'll add general MacOSX tips for engineers to the Practicalli Engineering Playbook - OS section as I learn (or remember) them.</p> <p>TODO: would be great to find a tiling window manager for MacOSX</p>"},{"location":"discussing-new-role-expectations/#neovim","title":"Neovim","text":"<p>Alex is a linter for text that help write in a neutral way and avoid potentially offensive words. An <code>alexrc.yaml</code> can specify words to ignore. Wrapping a word in 'single quotes' also seems to instruct Alex to ignore it.</p> <p>Another practice website for Vim and Emacs key bindings with Short-cut Foo</p> <p>I found Short-cut Foo a good way to practice how well you know the key bindings and helped me remember H M and L for jumping the cursor to the top, middle or bottom of the current window view.</p> <p>TODO: add Short-cut foo to Practicalli Neovim</p>"},{"location":"discussing-new-role-expectations/#fun-with-parcels","title":"Fun with parcels","text":"<p>I ordered a BeYou chair many years ago as part of a kick-starter and part of it has arrived. Unfortunately its only the base for the chair. The chair itself seems to have been collected by DHL 11 days ago, but is delayed for some unspecified reason.</p> <p>I sold two packages worth of book and DVD's on WeBuyBooks about a month ago which were collected pretty quickly by Evri. The following week Evri delivered one of the packages back to me instead of their intended destination.</p> <p>Now I have a pending order with WeBuyBooks which cannot complete until they get the other package.</p> <p>Contacting WeBuyBooks I was told to contact Evri. Using the Evri help and support via a live chat I was informed that as the delay is over 5 days then I should contact WeBuyBooks. I contacted WeBuyBooks again and they have now arranged for another collection.</p> <p>I have more luck with MusicMagpie and Ziffit, although prices for each book, CD, DVD and game can vary quite a lot over each of the three services.</p> <p>I get a laptop for use at the new company, so am also waiting for that to be delivered.</p> <p>There are lots more things to sell and give away, so will be having another push to unused books, CDs and DVDs this week.</p> <p>I have plenty of parcel tape for my tape 'gun' and plenty of empty cardboard boxes, so boxing things up is covered.</p> <p>Thank you.</p> <p> Practical.li Website</p> <p> Practical.li GitHub Org practicalli-johnny profile</p> <p> @practicalli@clj.social @practical_li</p>"},{"location":"health-and-new-chair/","title":"Health and new chair","text":"<p>The BeYou chair is being delivered today, will it live up to my expectations?</p>"},{"location":"health-and-new-chair/#socks-socks-socks","title":"Socks Socks Socks","text":"<p>My feet were the coldest part of myself when cycling at the weekend, so a visit to the Feetus website resulted in new socks on the way.</p> <p>Injinji liner socks will go underneth new long socks, both toe-socks to reduce blisters and they can be warn with my Vibram \"five-fingers\" shoes on long winter walks.</p> <p>As an extra treat, Injinji Ultra Compression toe socks to help with recovery after cycling.</p>"},{"location":"health-and-new-chair/#health-tests","title":"Health tests","text":"<p>A two and a half hour round trip walk to the hospital for another blood test. There are closer places to get tested, although they did not have dates available before starting work. Its a good excuse to get some exercise. Results should be available early next week.</p> <p>Covid in 2021 & 2022 contributed to diabeates (high blood sugar levels) and hyperthyroidism (low B12 levels). Due to very limited ability to do exercise and get out of the house during those years I also had high triglyceride levels and lower vitamin D levels.</p> <p>The biggest concern was the blood oxygen levels of 93-95% during the more intense covid reactions. Practicing breathing seems to be helping generally and whilst cycling.</p> <p>Regular walking at the start of 2023 and 50-80km weekend rides from August should have made signficant improvements, assuming there are no other underlying conditions. I am certainly feeling my most healthy since 2019 (although some aches from all the exercise).</p> <p>Previous exercise routines during 2022 had reduced blood glucose and triglyceride levels close to normal levels, until another couple of covid infections.</p> <p>For the last 3 years I've had the yearly flu vacination and get the Covid vacination as often as the United Kingdom government allow (which is only once a year now and really not enough). This year I also had the one-off pnemonia vacination</p>"},{"location":"health-and-new-chair/#beyou-chair","title":"BeYou chair","text":"<p>After two and a half years I have a new office chair. I backed the BeYou Transforming chair on Tuesday, 15 Jun 2021 and today the chair arrived.</p> <p>Assembling the chair was really simple and there is a good video guide. The main part of the chair is reasuringly heavy, indicating that the chair will be quite durable.</p> <p>I now sit on an angled backrest whilst kneeling on the main chair, as in the picture. I'm finding the chair very comfortable so will have to ensure the cats dont steal it away from me.</p> <p>Before Covid I used to stand all day when working, this helped with posture and burned a few extra calories too. I will mix standing with sitting in the BeYou chair, assuming the cats allow it.</p> <p>Will the BeYou chair be worth the cost? Only time will tell, but so far its a very positive start and the cat has already market it as their teritory.</p>"},{"location":"health-and-new-chair/#freecycle","title":"Freecycle","text":"<p>Donating my existing office chair on Freecycle tomorrow, hopefully it will find a new home. I must have had the chair about 15 years and it was still very comfortable.</p> <p>The gas cylinder to raise the chair stopped working a few years ago (one reason to by a new chair). A spacer was fitted to the chair to keep it in a maximum hight to extend its life. Replacing or refilling the gas cylinder can be expensive and not always guaranteed to work.</p> <p>I'll hunt through the house tomorrow to see if there are other items to donate.</p> <p>Thank you.</p> <p> Practical.li Website</p> <p> Practical.li GitHub Org practicalli-johnny profile</p> <p> @practicalli@clj.social @practical_li</p>"},{"location":"lightening-my-life/","title":"Lightening my life","text":"<p>Feeling the space I've made after rearranging the office space and uncluttering more belongings</p> <p>The cat has taken over my new BeYou chair, despite providing an even nicer space for her to sit. My cats are a regular reminder that change cannot be forced.</p>"},{"location":"lightening-my-life/#rearranging-office-space","title":"Rearranging office space","text":"<p>Even though I have multiple monitors and laptops in the boxy room that is my home office, rearranging a few items has really maximised the space. I have plenty of room for the laptop I will used for the new company I will work for.</p> <p>ThingyClub mounting arms are used for monitors and laptops to minimise desk space use, especially for the LG 34\" ultra-wide monitor used as a second monitor.</p> <p>Keyboard.io is used as an external keyboard, using a USB switch to toggle attachement to work and personal laptop. A Logitech bluetooth trackball is used for the few times I need a mouse, although only really for browsers and video editing.</p> <p>The keyboard and trackball rest on a Grandma Shark bamboo wood laptop desk that sits on top of a corner shaped office desk to create a standing desk position.</p> <p>The BeYou chair kneeling position is ideal for the same the standing desk position the Grandma Shark desk provides.</p> <p>NOTE: when I was ill with Covid I used the Grandma Shark desk in bed to be able to do a little bit of work in-between sleeping and coughing.</p>"},{"location":"lightening-my-life/#recycling","title":"Recycling","text":"<p>The freecycle website is very convienient to find a new life for unwanted items. It seems to be a more useful service during the warmer months, as more recently people are saying they are interested in items but then not turning up.</p> <p>A have a small collection of items that hopefully I can give away before starting the new job next week.</p>"},{"location":"lightening-my-life/#more-parcel-madness","title":"More parcel madness","text":"<p>Evri (formerly Hermes) delivery service continue to meet my very low expectations and completely failed to turn up today, saying they couldnt get access to the property. No one knocked or rang the front door, so either they didnt turn up or went to the wrong location.</p> <p>I am not planning on using WeBuyBooks again and will stick with MusicMagpie (who use DHL) and Zwifit (local collection lockers) for future book, DVD and video game sales.</p>"},{"location":"lightening-my-life/#neovim-astronvim-update","title":"Neovim AstroNvim update","text":"<p>Update AstroNvim to 3.39.0 from within AstroNvim, using <code>SPC p A</code>.</p> <p><code>SPC p v</code> to show the AstroNvim version as a notification.</p> <p>Using the Practicalli Astronvim-config the notification level used for AstroNvim version is not shown and but can be seen in the notification history.</p> <p><code>SPC f n</code> to see the notification history and the output of AstroNvim version.</p> Updates from AstroNvim v3.39.0 <pre><code> \u25cf alpha-nvim 14.8ms \udb82\udcb1 alpha \uf121 astronvim.autocmds\n 29074ee DirChanged keymaps (21 hours ago)\n\n \u25cb astrocommunity\n e984f31 docs(rust): add guide on how to format with clippy (#649) (2 days ago)\n\n \u25cb friendly-snippets \uf487 LuaSnip\n 53d3df2 add-xml-tag-go-snippet (#377) (3 days ago)\n 9e99f7d Updated edge framework snippets (#378) (3 days ago)\n 068b165 changed c++ cout to a more efficient and polyvalent snippet (#381) (3 days ago)\n 83c54cd fix: django rest view snippets (#383) (3 days ago)\n\n \u25cb neogit \uf11c <leader>gs \uf11c <leader>gnt \uf11c <leader>gnc \uf11c <leader>gnd \uf11c <leader>gnk \uea86 User AstroGitFile\n bb538f1 Merge pull request #980 from gollth/merge-help-popups (6 hours ago)\n c87a51e Revert \"CHANGE: Allow to open help popup from commit, log, reflog views\" (7 hours ago)\n 2d2a98f FIX: Add `fetch` popup keybind to reflow in visual mode (8 hours ago)\n f0864be CHANGE: Allow to open help popup from commit, log, reflog views (8 hours ago)\n d408aed CHANGE: Allow to open merge popup from commit, log, reflog views (8 hours ago)\n 763948a Merge pull request #948 from NeogitOrg/flog-graph (20 hours ago)\n 69ca013 Update readme (20 hours ago)\n 273027a Only show \"--color\" switch when rendering ASCII graph (20 hours ago)\n ce47476 Flog -> Unicode (20 hours ago)\n e1a0a9d Allow configuring graph style (20 hours ago)\n 961a9af Merge pull request #974 from gollth/fix-head-log-graph (21 hours ago)\n b3d7a01 FIX: Properly highlight remote only branches (29 hours ago)\n 6d92f47 FIX: Properly render HEAD with `NeogitBranchHead` highlight group (29 hours ago)\n 76a400a Merge pull request #976 from NeogitOrg/CKolkey-patch-1 (31 hours ago)\n b464b8a Update README.md (31 hours ago)\n 7eccfc4 Formatting, gsub (9 days ago)\n d3dbebb Change the author color highlight (10 days ago)\n 8a1f7cc Formatting (10 days ago)\n c9cad0a Replace commit.description in favor of subject/body (10 days ago)\n 1b63c04 Use git lib entrypoint (11 days ago)\n 7a3dea2 Use new field (11 days ago)\n f22f074 WIP flog graph (12 days ago)\n b7b9a83 Use builtin function to escape string (12 days ago)\n b23bb99 Escape escape characters (12 days ago)\n d56e1ca Need to wrap this so we can concatenate the result (12 days ago)\n 975a0d4 Cleanup (12 days ago)\n 158d8b0 Annotations (12 days ago)\n 14bae65 Parse log output as JSON (12 days ago)\n\n \u25cb nvim-lspconfig \uebc7 Neoconf \uea86 User AstroFile\n 39546f7 fix(typos_lsp): use configuration file for root detection #2918 (29 hours ago)\n daaf00a docs: update server_configurations.md skip-checks: true (3 days ago)\n c6a62c7 chore(emmet_language_server): remove languages with emmet bundled by their language server (#2914) (3 days ago)\n e4a56ad perf: reduce an unnecessary function call #2913 (3 days ago)\n\n \u25cf nvim-treesitter 11.95ms \u2714 build\n 8f16c39 feat(make): highlight phony prerequisites as functions (7 hours ago)\n fb101ed feat(make): give targets the function highlight (7 hours ago)\n 10432e6 parsers: add tree-sitter-slang (9 hours ago)\n b04f990 Update parsers: css, facility, foam, wing (10 hours ago)\n bf982eb feat: add facility (24 hours ago)\n 582a92e Update parsers: erlang, wing (33 hours ago)\n ba588ee fix(cpp): remove `@field` for identifiers with `_` prefix (#5731) (2 days ago)\n b8fbd13 Update README (2 days ago)\n 8189d91 astro: add custom component highlighting (#5728) (2 days ago)\n 482a2f1 Fix robot parser metadata in parsers.lua (2 days ago)\n b056e42 Update README (3 days ago)\n 52b25c9 fixup: parser requires generate (ABI) (3 days ago)\n de51978 fixup: lint (3 days ago)\n 274370e fixup: use any-of instead of vim-match (3 days ago)\n 1e74c34 feat: add angular parser and queries (3 days ago)\n 9d91101 twig queries: add combined injections (#5721) (3 days ago)\n eafc0c2 Update parsers: swift, wing (3 days ago)\n d8a7182 Update parsers: dtd, ssh_config, wing, xml (4 days ago)\n 649d137 Update parsers: erlang, ssh_config, wing (5 days ago)\n 71bdf97 feat(hocon): add fold query (#5710) (6 days ago)\n 6d45b34 Update parsers: sql, wing (6 days ago)\n\n \u25cb nvim-web-devicons\n 5efb8bd ci: use vim-colortemplate tarball rather than git clone (#347) (3 days ago)\n e034579 feat: add .luaurc and luau colours (#346) (3 days ago)\n 7b1c4a8 feat: update fnl icons (#345) (3 days ago)\n 3fe528b ci: pre-commit uses make (#344) (3 days ago)\n\n \u25cb rest.nvim \uebc7 RestNvimPreview \uebc7 RestNvimLast \uebc7 RestNvim \uf11c <leader>rr \uf11c <leader>r \uf016 json \uf016 http\n \u25cb SchemaStore.nvim\n 54a4ea1 Update SchemaStore catalog (4 days ago)\n c2c6bd2 Update SchemaStore catalog (5 days ago)\n\n \u25cb telescope.nvim \uebc7 Telescope \uf487 nvim-neoclip.lua \uf487 telescope-file-browser.nvim\n</code></pre> <p>Thank you.</p> <p> Practical.li Website</p> <p> Practical.li GitHub Org practicalli-johnny profile</p> <p> @practicalli@clj.social @practical_li</p>"},{"location":"updating-my-identity/","title":"Updating my identity","text":"<p>Security is very important but can be a challenge to usability.</p>"},{"location":"updating-my-identity/#security-verses-usability","title":"Security verses usability","text":"<p>Using a password manager is really effective, so long as it actually saves the password generated.</p> <p>Creating a new Google workplace account can be a real challenge if you dont know the password the password generator created for you, especially when the organisation requires 2-Factor authorisation and that has not been set up due to not knowing the password.</p>"},{"location":"updating-my-identity/#flexiana-prototype-review","title":"Flexiana prototype review","text":"<p>Ela Nazari arranged a review of a potential new product for team leads, managers and CEOs to give a team and individual performance tool, using data from various sources. There seems a lot of potential there, compared to poking around GitHub for stats.</p> <p>Hopefully I gave them lots of useful feedback during the session.</p>"},{"location":"updating-my-identity/#consistent-identity","title":"Consistent identity","text":"<p>For greater discoverability and to avoid confusion it is very useful to have a consistent identity through all your internet presence.</p> <p>I noticed that I had some variation, so I've updated my GitHub and Slack profiles to use the same name, Practicalli Johnny.</p> <p>An interesting consequence of changing the GitHub name is that all GitHub pages within repositories of the account are rebuilt. I assume due to the name being part of the URL to access the site.</p> <p>Changing the GitHub account name doesnt affect Organisations that account participates in as the name doesnt change.</p> <p>GitHub sponsorship seems unaffected by changing the GitHub account name.</p> <p>The <code>practicalli-john</code> repository used to define an extended GitHub profile had to be renamed to match the change in account name, to practicalli-johnny/practicalli-johnny</p> <p>Practicalli Johnny GitHub profile</p>"},{"location":"updating-my-identity/#neovim","title":"Neovim","text":"<p>Set Neovim 0.9 as the minimum recommeded version in the Practicalli Neovim book and updated laptops, tablet and smartphone to use Neovim 0.9.4</p>"},{"location":"updating-my-identity/#debian-and-java","title":"Debian and Java","text":"<p>Sofware updates today listed security updates for Java OpenJDK packages and I notices I still had several versions of those packages installed (11 and 17).</p> <p>Time to remove Java 11 and use Java 21 as the default (keeping 17 for a little longer as a fall-back version).</p> <p>Removing Java 11</p> <pre><code>apt remove --purge openjdk-11-jdk:amd64 openjdk-11-jdk-headless:amd64 openjdk-11-jre:amd64\n</code></pre> <p><code>openjdk-11-source</code> package was not installed on my system</p> <p>Add Java 21</p> <pre><code>apt install openjdk-21-jdk\n</code></pre> <p><code>openjdk-11-source</code> package was not installed on my system</p> <p>OpenJDK 21 Debian package availability</p> <p>Debian trixie (testing) includes openjdk-21-* packages</p> <p>Ubuntu 23.04 (lunar) and 23.10 (manic) include openjdk-21-* packages</p>"},{"location":"updating-my-identity/#using-debian-testing","title":"Using Debian Testing","text":"<p>Installing a laptop with Debian from scratch and using trixie (testing) version, which includes Java 21 and many updated packages.</p> <p>After the install, edit <code>/etc/apt/sources.list</code> and replace all the instances of <code>bookworm</code> with <code>trixie</code></p> <p>Debian documentation recommends a full upgrade after making such a change</p> <p>Debian Linux full upgrade</p> <pre><code>apt full-upgrade\n</code></pre> <p>Debian Linux - changing to testing or unstable</p> <p>Continuing with Debian Linux install on Thinkpad with AMD chipset, using trixie (current testing) as the distribution verion.</p> <p>Thank you.</p> <p> Practical.li Website</p> <p> Practical.li GitHub Org practicalli-johnny profile</p> <p> @practicalli@clj.social @practical_li</p>"},{"location":"its-april-fool/","title":"Its April Fool","text":"<p>Adding SSH keys to the YubiKey hardware security key provides convenience of SSH key use, especially when required for multiple computers.</p> <p>Using a YubiKey to keep a single SSH key pair removes the need to generate a key pair for each computer.</p> <p>Using one SSH key avoids the need for multiple entries in the allowed-signatures file to check locally that a commit has been signed.</p>","tags":["neovim","astronvim","git"]},{"location":"its-april-fool/#git-signed-commits-local-verification","title":"Git Signed commits - local verification","text":"<p>Practicalli has several computers (including smartphone and tablet) where commits are made from using an editor or command line tools.</p> <p>An <code>allowed-signatures</code> file is used to check locally that a commit has been signed with a known SSH key and this is copied across all computers.</p> <p>Viewing a commit in an editor or via the Git CLI will check the signatures in <code>allowed-signatures</code> and ensure report if the commit signing key is known</p> <p>Git log show signatures</p> <pre><code>git log --show-signature\n</code></pre> <p>comments in allowed-signatures file</p> <p>The <code>allowed-signatures</code> file can include <code>#</code> comment lines.</p> .config/git/allowed-signatures<pre><code># ---------------------------------------------------------\n# Allowed SSH keys for Git commit signing\n#\n# - Used locally to check commits are signed by a known key\n# - no space allowed after comment - invalid key error\n# ---------------------------------------------------------\n# RangerOne\nengineering@practical.li ssh-ed25519 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx engineering@practical.li\n</code></pre> <p>No blank lines allowed after comment lines</p> <p>If there is a blank line after any comment line, then an <code>invalid key</code> error is reported. </p>","tags":["neovim","astronvim","git"]},{"location":"its-april-fool/#astronvim-4-released","title":"AstroNvim 4 released","text":"<p>The version 4 release is a significant change to AstroNvim, the configuration provided in AstroNvim 3 into their own plugins.</p> <ul> <li>astrocore.lua</li> <li>astrolsp.lua</li> <li>astroui.lua</li> </ul> <p>AstroNvim 4 is now a user configuration that pulls in the core AstroNvim plugins. This approach provides a single configuration that is simple to install, configure and extend.</p> <p>To get started, fork the AstroNvim 4 user template repository to your own GitHub repository.</p> <p>Alternatively, use the Practicalli AstroNvim user config repository, which is a fork of the AstroNvim user template, adding Clojure and other nice tools automatically.</p>","tags":["neovim","astronvim","git"]},{"location":"its-april-fool/#creating-practicalli-astronvim-user-config","title":"Creating Practicalli astronvim-user-config","text":"<p>After a few days experimentation with AstroNvim 4 there are still some changes being made and potential for the AstroNvim user configuration to be altered.</p> <p>Therefore a goal of the Practicalli astronvim-user-config is to minimise the changes to the original user template.</p>","tags":["neovim","astronvim","git"]},{"location":"its-april-fool/#userlua","title":"user.lua","text":"<p><code>lua/plugins/user.lua</code> contains several examples of adding and overriding existing plugins.</p> <p>Rather than change this file, I created separate config files in <code>lua/plugins/</code> directory. Each new file contains a line that can disable the configuration</p> <p>Instruct Neovim to ignore config</p> <p>Add the following to the start of a configuration file to return an empty table, {}, ignoring any other configuration in that file.</p> <pre><code>if true then return {} end -- WARN: REMOVE THIS LINE TO ACTIVATE THIS FILE\n</code></pre>","tags":["neovim","astronvim","git"]},{"location":"its-april-fool/#practicallilua","title":"practicalli.lua","text":"<p>Configuration that contains my own personal preferences, which can easily be disabled by removing the comment on the <code>if</code> statement line.</p> <ul> <li>add custom practicalli logo for startup</li> <li>add better-escape with <code>fd</code> key binding, <code>jk</code> is the AstroNvim default</li> </ul>","tags":["neovim","astronvim","git"]},{"location":"its-april-fool/#lsp-conflict","title":"LSP conflict","text":"<p>When initially enabling the <code>plugins/user.lua</code> configuration, the Noice plugin added via an AstroNvim Community import in <code>lua/community.lua</code> started reporting a conflict error.</p> <p>LSP signature help conflict reported by noice plugin</p> <pre><code>`vim.lsp.handlers[\"textDocument/signatureHelp\"]` has been overwritten by another plugin?\n\n Either disable the other plugin or set `config.lsp.signature.enabled = false` in your **Noice** config.\n - plugin: nvim\n - file: /tmp/.mount_nvimRUiD7m/usr/share/nvim/runtime/lua/vim/lsp.lua\n - line: 2318\n</code></pre> <p>The root of the conflict was the Discord \"andweeb/presence.nvim\" plugin, which included configuration to set a lsp handler</p> <p>Presence plugin sets LSP signature help</p> lua/plugins/user.lua<pre><code> \"andweeb/presence.nvim\",\n {\n \"ray-x/lsp_signature.nvim\",\n event = \"BufRead\",\n config = function() require(\"lsp_signature\").setup() end,\n },\n</code></pre> <p>The Discord plugin is not required so the plugin configuration was commented in <code>lua/plugins/user.lua</code></p> <p>Should both plugins been needed, then the Noice plugin warning can be managed by disabling its LSP signature</p> <p>Disable Noice LSP Signature</p> <pre><code> {\n \"folke/noice.nvim\",\n event = \"VeryLazy\",\n dependencies = { \"MunifTanjim/nui.nvim\" },\n opts = function(_, opts)\n local utils = require \"astrocore\"\n return utils.extend_tbl(opts, {\n lsp = {\n -- override markdown rendering so that **cmp** and other plugins use **Treesitter**\n override = {\n [\"vim.lsp.util.convert_input_to_markdown_lines\"] = true,\n [\"vim.lsp.util.stylize_markdown\"] = true,\n [\"cmp.entry.get_documentation\"] = true,\n },\n -- config.lsp.signature.enabled = false\n -- signature = {\n -- enabled = false,\n -- },\n },\n presets = {\n bottom_search = true, -- use a classic bottom cmdline for search\n command_palette = true, -- position the cmdline and popupmenu together\n long_message_to_split = true, -- long messages will be sent to a split\n inc_rename = utils.is_available \"inc-rename.nvim\", -- enables an input dialog for inc-rename.nvim\n lsp_doc_border = true, -- add a border to hover docs and signature help\n },\n })\n end,\n },\n</code></pre>","tags":["neovim","astronvim","git"]},{"location":"its-april-fool/#neovim-options","title":"Neovim options","text":"<p>Space u w to toggle text wrap, which I find useful for Markdown and other content file types.</p> <p>Vim options set in astrocore plugin</p> <p>Set <code>wrap</code> to true in <code>lua/plugins/astrocore.lua</code> lua/plugins/astrocore.lua<pre><code> -- vim options can be configured here\n options = {\n opt = { -- vim.opt.<key>\n relativenumber = true, -- sets vim.opt.relativenumber\n number = true, -- sets vim.opt.number\n spell = true, -- sets vim.opt.spell\n signcolumn = \"auto\", -- sets vim.opt.signcolumn to auto\n wrap = true, -- sets vim.opt.wrap\n guifont = \"Fira Code:h16\", -- neovide font family & size\n },\n</code></pre></p>","tags":["neovim","astronvim","git"]},{"location":"its-april-fool/#neo-tree-config","title":"Neo-tree config","text":"<p><code>H</code> in Neotree to toggle hidden files and directories</p> <p>Looking at the Neo-tree config examples, hidden files can be configured to show in the tree view using a different style, e.g a very subtle colour</p> Configure Neo-tree hidden files <p>A configuration to try <pre><code>return {\n \"nvim-neo-tree/neo-tree.nvim\",\n config = function ()\n require(\"neo-tree\").setup({\n filesystem = {\n filtered_items = {\n visible = true, -- when true, they will just be displayed differently than normal items\n hide_dotfiles = false,\n hide_gitignored = true,\n hide_hidden = true, -- only works on Windows for hidden files/directories\n hide_by_name = {\n --\"node_modules\"\n },\n hide_by_pattern = { -- uses glob style patterns\n --\"*.meta\",\n --\"*/src/*/tsconfig.json\",\n },\n always_show = { -- remains visible even if other settings would normally hide it\n --\".gitignored\",\n },\n never_show = { -- remains hidden even if visible is toggled to true, this overrides always_show\n --\".DS_Store\",\n --\"thumbs.db\"\n },\n never_show_by_pattern = { -- uses glob style patterns\n --\".null-ls_*\",\n },\n },\n },\n })\n end\n}\n</code></pre></p>","tags":["neovim","astronvim","git"]},{"location":"its-april-fool/#ssh-key-and-yubikey","title":"SSH key and YubiKey","text":"<p>Use the ,,, key type to create an SSH key pair that will be resident on a FIDO2 supporting hardware key, e.g. a recent YubiKey</p> <p>Generate a FIDO2 Compliant resident key</p> <pre><code>ssh-keygen -t ed25519-sk -O resident -C \"email-name@domain.com\"\n</code></pre> <p><code>-O resident</code> indicates the key should be stored on the FIDO authenticator.</p> <p>Resident key is easier to import to a new computer as they can be loaded directly from the hardware security key using <code>ssh-add -K</code> or <code>ssh-keygen -K</code>.</p> <p><code>-K</code> option loads resident keys from a FIDO authenticator.</p> <p>For ssh-add, resident keys are downloaded from a FIDO authenticator. Public and private key files are written to the current directory for each downloaded key. If multiple FIDO authenticators are attached, keys will be downloaded from the first touched authenticator. See the FIDO AUTHENTICATOR section for more information.</p> <p>TODO: Review wich YubiKey variants are FIDO2 compatible</p> <p>Thank you.</p> <p> Practical.li Website</p> <p> Practical.li GitHub Org practicalli-johnny profile</p> <p> @practicalli@clj.social @practical_li</p>","tags":["neovim","astronvim","git"]},{"location":"warmer-weather/","title":"Warmer weather","text":"<p>Practicalli AstroNvim User Config changed to be as additive as possible, leaving the template as unchanged as possible.</p> <p>The sunnier weather is a boots to motivation, although its still very windy. At least I can get into the garden without sinking.</p> <p>Another Saturday morning ride, a tough experience although not completely exhausted afterward.</p>","tags":["clojure","neovim","astronvim"]},{"location":"warmer-weather/#astronvim-example-config","title":"AstroNvim example config","text":"<p>A really nice addition to AstroNvim 4 is the use of a conditional check at the start of configuration files. This conditional check provides a simple way to disable or activate the configuration in a specific file.</p> <p>Rather than significantly edit the existing AstroNvim template configuration, additional files in <code>lua/plugins/</code> can be added and easily enabled or disabled, making the configuration more widely usable.</p> <p>By avoiding changes to the original template configuration, it is far simpler to update the Practicalli AstroNvim User Config with enhancements from the AstroNvim template.</p> <p>Activate configuration statement</p> <pre><code>if true then return {} end -- WARN: REMOVE THIS LINE TO ACTIVATE THIS FILE\n</code></pre> Add or Override Plugin and configuration lua/plugins/example-config.lua<pre><code>return {\n {\n \"domain/project-name\",\n -- lazy = true, -- true: load at startup, false: load on filetype\n filetype = { \"language\", \"*.fileextension\" },\n dependencies = {\n \"AstroNvim/astrocore\",\n opts = {\n options = {\n -- configure general options: vim.opt.<key>\n g = {\n -- configure global vim variables: vim.g\n },\n },\n mappings = {\n n = {\n -- normal mode key bindings\n -- setting a mapping to false will disable it\n -- [\"<esc>\"] = false,\n },\n t = {\n -- terminal? mode key bindings\n },\n v = {\n -- visual mode key bindings\n },\n },\n },\n },\n },\n}\n</code></pre>","tags":["clojure","neovim","astronvim"]},{"location":"warmer-weather/#astronvim-clojure-config","title":"AstroNvim Clojure config","text":"<p><code>nvim-treesitter-sexp</code> neovim plugin is a lua rewrite of the commonly used vim-sexp vim plugin.</p> <p><code>nvim-treesitter-sexp</code> is easier to configure with the lazy package manager.</p> <p>Default key map is provided with the <code>nvim-treesitter-sexp</code>, although keys can be disabled using the <code>ops = {keymaps = {commands = {command_name = false,}}}</code>. I tried providing alternative key mappings using this section but that did not seem to work.</p> <p>Using the standard approach to key maps worked well, so a set of alternate key maps were provided.</p> Alternative SPC k key map for nvim-treesitter-sexp <pre><code> {\n \"PaterJason/nvim-treesitter-sexp\",\n filetype = [\"clojure\"],\n dependencies = {\n \"AstroNvim/astrocore\",\n opts = {\n mappings = {\n n = {\n -- Additional Which-key key bindings for nvim-treesitter-sexp\n [\"<leader>k\"] = { name = \"Structural Editing\" },\n [\"<leader>kE\"] = { \"<cmd>TSSexp swap_prev_elem<cr>\", desc = \"Swap Previous Element\" },\n [\"<leader>ke\"] = { \"<cmd>TSSexp swap_next_elem<cr>\", desc = \"Swap Previous Element\" },\n [\"<leader>kF\"] = { \"<cmd>TSSexp swap_prev_form<cr>\", desc = \"Swap Previous Form\" },\n [\"<leader>kf\"] = { \"<cmd>TSSexp swap_next_form<cr>\", desc = \"Swap Previous Form\" },\n [\"<leader>kk\"] = { \"<cmd>TSSexp promote_elem<cr>\", desc = \"Promote Element\" },\n [\"<leader>kr\"] = { \"<cmd>TSSexp promote_form<cr>\", desc = \"Promote Form\" },\n [\"<leader>k@\"] = { \"<cmd>TSSexp splice<cr>\", desc = \"Splice\" },\n [\"<leader>kS\"] = { \"<cmd>TSSexp slurp_left<cr>\", desc = \"Slurp Left\" },\n [\"<leader>ks\"] = { \"<cmd>TSSexp slurp_right<cr>\", desc = \"Slurp Right\" },\n [\"<leader>kB\"] = { \"<cmd>TSSexp barf_left<cr>\", desc = \"Barf Left\" },\n [\"<leader>kb\"] = { \"<cmd>TSSexp barf_right<cr>\", desc = \"Barf Right\" },\n [\"<leader>kI\"] = { \"<cmd>TSSexp barf_right<cr>\", desc = \"Insert Head\" },\n [\"<leader>ki\"] = { \"<cmd>TSSexp barf_right<cr>\", desc = \"Insert Tail\" },\n },\n t = {\n -- terminal? mode key bindings\n },\n v = {\n -- visual mode key bindings\n },\n },\n },\n },\n },\n</code></pre> <p>Using a common Space k menu for they key bindings simplifies the discovery of commands.</p> <p>nvim-treesitter-sexp config with alternate key mappings</p> lua/plugins/clojure.clj<pre><code> {\n \"PaterJason/nvim-treesitter-sexp\",\n filetype = lisp_dialects,\n dependencies = {\n \"AstroNvim/astrocore\",\n opts = {\n -- configuration:\n -- https://github.com/PaterJason/nvim-treesitter-sexp#configuration\n enabled = false,\n -- -- Set to false to disable individual keymaps\n set_cursor = true,\n -- keymaps = {\n -- Default key bindings - set to false to disable\n -- commands = {\n -- swap_prev_elem = \"<e\",\n -- swap_next_elem = \">e\",\n -- swap_prev_form = \"<f\",\n -- swap_next_form = \">f\",\n -- promote_elem = \"<LocalLeader>O\",\n -- promote_form = \"<LocalLeader>o\",\n -- splice = \"<LocalLeader>@\",\n -- slurp_left = \"<(\",\n -- slurp_right = \">)\",\n -- barf_left = \">(\",\n -- barf_right = \"<)\",\n -- insert_head = \"<I\",\n -- insert_tail = \">I\",\n -- },\n -- motions = {\n -- form_start = \"(\",\n -- form_end = \")\",\n -- prev_elem = \"[e\",\n -- next_elem = \"]e\",\n -- prev_elem_end = \"[E\",\n -- next_elem_end = \"]E\",\n -- prev_top_level = \"[[\",\n -- next_top_level = \"]]\",\n -- },\n -- textobjects = {\n -- inner_elem = \"ie\",\n -- outer_elem = \"ae\",\n -- inner_form = \"if\",\n -- outer_form = \"af\",\n -- inner_top_level = \"iF\",\n -- outer_top_level = \"aF\",\n -- },\n -- },\n options = {\n g = {},\n },\n mappings = {\n n = {\n -- Additional Which-key key bindings for nvim-treesitter-sexp\n [\"<leader>k\"] = { name = \"Structural Editing\" },\n [\"<leader>kE\"] = { \"<cmd>TSSexp swap_prev_elem<cr>\", desc = \"Swap Previous Element\" },\n [\"<leader>ke\"] = { \"<cmd>TSSexp swap_next_elem<cr>\", desc = \"Swap Previous Element\" },\n [\"<leader>kF\"] = { \"<cmd>TSSexp swap_prev_form<cr>\", desc = \"Swap Previous Form\" },\n [\"<leader>kf\"] = { \"<cmd>TSSexp swap_next_form<cr>\", desc = \"Swap Previous Form\" },\n [\"<leader>kk\"] = { \"<cmd>TSSexp promote_elem<cr>\", desc = \"Promote Element\" },\n [\"<leader>kr\"] = { \"<cmd>TSSexp promote_form<cr>\", desc = \"Promote Form\" },\n [\"<leader>k@\"] = { \"<cmd>TSSexp splice<cr>\", desc = \"Splice\" },\n [\"<leader>kS\"] = { \"<cmd>TSSexp slurp_left<cr>\", desc = \"Slurp Left\" },\n [\"<leader>ks\"] = { \"<cmd>TSSexp slurp_right<cr>\", desc = \"Slurp Right\" },\n [\"<leader>kB\"] = { \"<cmd>TSSexp barf_left<cr>\", desc = \"Barf Left\" },\n [\"<leader>kb\"] = { \"<cmd>TSSexp barf_right<cr>\", desc = \"Barf Right\" },\n [\"<leader>kI\"] = { \"<cmd>TSSexp barf_right<cr>\", desc = \"Insert Head\" },\n [\"<leader>ki\"] = { \"<cmd>TSSexp barf_right<cr>\", desc = \"Insert Tail\" },\n },\n t = {\n -- terminal? mode key bindings\n },\n v = {\n -- visual mode key bindings\n },\n },\n },\n },\n },\n</code></pre> <p>Thank you.</p> <p> Practical.li Website</p> <p> Practical.li GitHub Org practicalli-johnny profile</p> <p> @practicalli@clj.social @practical_li</p>","tags":["clojure","neovim","astronvim"]},{"location":"practicalli-project-template-updates/","title":"Practicalli Project Template updates","text":"<p>Adding some nice little improvements to the Practicalli Project Templates</p>","tags":["clojure"]},{"location":"practicalli-project-template-updates/#practicalli-project-template","title":"Practicalli Project template","text":"<p>Noticed an issue was raised that highlighted the docker caching was not correct. Initially it seemed I was not using an appropriate alias to cache the project aliases.</p> <p>Revised command to Prepare library dependencies</p> <pre><code>clojure -P && clojure -P -X:build\n</code></pre> <p>After adding a revised command, there were still dependencies being downloaded during the <code>make dist</code> phase, where tools.built creates the uberjar.</p>","tags":["clojure"]},{"location":"practicalli-project-template-updates/#neovim","title":"Neovim","text":"<p>Update shell aliases for the new AstroNvim 4 configuration.</p> <p><code>astro4</code> added whist testing the new version of AstroNvim.</p> <p><code>astro</code> changed to point to new AstroNvim version 4 user configuration by Practicalli once it was functionally comparable to AstroNvim version 3 user config by Practicalli.</p> <p>Example</p> <pre><code># ------------------------------------------\n# Neovim Aliases for multiple configurations\nalias astro=\"NVIM_APPNAME=astronvim nvim\"\nalias astro4=\"NVIM_APPNAME=astronvim4 nvim\"\nalias astro=\"NVIM_APPNAME=astronvim4 nvim\"\nalias astrotemplate=\"NVIM_APPNAME=astronvim-template nvim\"\nalias kickstart=\"NVIM_APPNAME=kickstart-nvim nvim\"\nalias cajus=\"NVIM_APPNAME=cajus nvim\"\nalias neovim-config=\"NVIM_APPNAME=neovim-config nvim\"\n\n# Neovide alias with AstroNvim configuration\nalias neovide=\"NVIM_APPNAME=astronvim neovide\"\nalias neovide=\"NVIM_APPNAME=astronvim4 neovide\"\n# ------------------------------------------\n</code></pre> <p>Thank you.</p> <p> Practical.li Website</p> <p> Practical.li GitHub Org practicalli-johnny profile</p> <p> @practicalli@clj.social @practical_li</p>","tags":["clojure"]},{"location":"500-commit-streak-on-github/","title":"500 Commit Streak on GitHub","text":"<p>500 day commit streak on GitHub reached today. This was legitimately achieved by doing a small amount of work each day.</p> <p>I am not actively coding and committing on a regular basis in my current role, so the large majority of these commits are for Practicalli or Open Source projects.</p> <p></p> <p>Continuing to simplify the Practicalli AstroNvim User Config, so changes from the AstroNvim template are in new files or in <code>community.lua</code>.</p> <p>The most visual opinionated changes are in <code>practicalli.lua</code>, such as dashboard logo and theme.</p> <p>Motivated to work on the Practicalli Sustainable Life book after joining a sustainability working group at the company.</p>","tags":["clojure"]},{"location":"500-commit-streak-on-github/#neovim","title":"Neovim","text":"<p> Practicalli User Config theme changes have been moved from <code>lua/plugins/astroui.lua</code> to <code>practicalli.lua</code> to minimise changes from the original AstroNvim template repository.</p> <p>Minimising changes in the AstroNvim template simplifies merging updates from the AstroNvim template repository, which are more likely due to AstroNvim 4 release being relatively recent.</p> <p>Using separate files where possible also allows everyone to easily customise their experience when using Practicalli User Config. By adding or removing a comment from the <code>if</code> statement, the specific configuration file can be included or excluded when Neovim loads the configuration.</p> <p>By essentially toggling one line in each file, a very minimal change is made and again makes merging changes between Practicalli configuration and anyone else configure much simpler.</p> <p>Comment if statement to include the configuration in the file</p> <pre><code>-- if true then return {} end -- WARN: REMOVE THIS LINE TO ACTIVATE THIS FILE\n</code></pre>","tags":["clojure"]},{"location":"500-commit-streak-on-github/#sustainability","title":"Sustainability","text":"<p>Joined a sustainability group within the company and will be co-chairing the group.</p> <p>Making milk from Hemp Seeds today, delicious. Reminds me I should update the : Practicalli Sustainable Life book to MkDocs and add a lot more content.</p> <p>My life is more sustainable that the average persons, although there is always more I can adapt to.</p> <p>Joining the group via work I can share my personal experiences with others to inspire them. I also aim to learn more about larger scoped initiatives and how the company can influence our potential partners and customers.</p>","tags":["clojure"]},{"location":"500-commit-streak-on-github/#well-being","title":"Well-being","text":"<p>Exercise through gardening. Digging up weeds in the garden so vegetables can be grown without interference.</p> <p>Planning wellness activities for the company off-site. Cycling along the coast on the first day and yoga on the second day.</p> <p>Saturday ride with the local cycling club. Lead a group of people along a 74km route with 1,018 meter hill climbing. First time up the large hill along Exedown road, which peaked at 17% on a sharp bend. No wonder I was quite tired by the end.</p> <p>Ordered a very large bag of sand so I could level the patio flag stones at the end of the garden. I'll be doing some planning to figure out how to level all the flag stones without having to keep moving the shed around.</p> <p>Thank you.</p> <p> Practical.li Website</p> <p> Practical.li GitHub Org practicalli-johnny profile</p> <p> @practicalli@clj.social @practical_li</p>","tags":["clojure"]},{"location":"http-message-signing-investigation/","title":"HTTP Message Signing investigation","text":"<p>API Security is typically managed by issuing a token for authentication. Only requests that include a valid token are processed, any requests with an expired or missing token are rejected. HTTP code 401 Unauthorised error message is returned for rejected requests.</p> <p>When dealing with very sensitive data and higher risk actions common in financial services, additional security mechanisms are required. So I have been looking at mTLS and HTTP Message Signatures (RFC9421) this week.</p> <p>Not going to be a productive week as I am full of flu. Given the time of year its most likely a variant of Covid. So far I've only had a headache, congested chest / nose / ears and some fatigue. Taking lots of paracetamol and drinking lots of water to try keep the inflammation at bay.</p> <p>Edit: I was mostly okay by the weekend, although still had a sore throat and coughing.</p>","tags":["clojure"]},{"location":"http-message-signing-investigation/#http-message-signatures","title":"HTTP Message Signatures","text":"<p>Investigating how to implements RFC9421 HTTP Message Signatures using Clojure.</p> <p>One aspect is choosing an algorithm for the private public key pair used to sign and validate a message. The ED25519 algorithm is recommended by GitHub for creating private public SSH keys to access their service. This seems a reasonable choice for HTTP Message Signatures.</p> <p>ED25519 is recommended as the safe choice for signing as it is a fast and efficient algorithm and has does not have the challenges of earlier algorithms.</p> <p>A Clojure library for comparing an ED25519 signature against a public key would reduce the work required to check a signed HTTP message is valid.</p> <p>If there are no other interesting libraries for validating signatures, then Bouncy Castle is a well known Java implementation and has some Clojure wrappers.</p>","tags":["clojure"]},{"location":"http-message-signing-investigation/#wellbeing","title":"Wellbeing","text":"<p>Managed a cycle ride with the local club on Saturday, was pushing hard to shake the last of the flu symptoms. I may have pushed a little too hard as I was exhausted for the rest of the weekend.</p> <p>Thank you.</p> <p> Practical.li Website</p> <p> Practical.li GitHub Org practicalli-johnny profile</p> <p> @practicalli@clj.social @practical_li</p>","tags":["clojure"]},{"location":"tetris-and-the-fall-of-the-ussr-and-neovim-conjure-menu/","title":"Tetris and the fall of the USSR (and Neovim Conjure menu)","text":"<p>Enjoyed watching the Tetris movie and wondered just how much was real and dramatised. Reading the background to the game it does seem the main thread of the movie is accurate, with perhaps some additional dramatic effect. It was a very enjoyable movie regardless.</p> <p>I do remember the break-up of the USSR when it happened, first with Gorbachev as leader and then Boris Yeltsin. Then the Oligarchs (super rich) moved in and supported a more draconian leader in Putin (assumingly so they could keep hold of all their money).</p> <p>I also remember Robert Maxwell as a disgraced billionaire that stole from his own company and mysteriously vanished from his luxury yacht.</p>","tags":["clojure","neovim"]},{"location":"tetris-and-the-fall-of-the-ussr-and-neovim-conjure-menu/#how-much-clojure-needs-to-be-known","title":"How much Clojure needs to be known","text":"<p>A person is joining my team and it leads to wondering what they should feel comfortable in regards Clojure and how best I can support them.</p> <p>I'm starting to identifying aspects of Clojure that would be beneficial to know well (not having to look them up), e.g. collections, sequences, map and reduce transformations, etc. The Clojure Cheatsheet provides a simple way to categorise the topics and functions of Clojure core namespace.</p> <p>Which parts of the Clojure Standard Library would be useful, e.g. clojure.spec.alpha, clojure.data.json, etc.</p>","tags":["clojure","neovim"]},{"location":"tetris-and-the-fall-of-the-ussr-and-neovim-conjure-menu/#neovim","title":"Neovim","text":"<p>Conjure may show an \"unknown REPL environment\" in the REPL log buffer when starting a new REPL session. This is usually a timeout in detecting the REPL due to its startup being a little overloaded.</p> <p><code>, s l</code> lists the current REPL sessions in the REPL log buffer.</p> <p>Conjure FAQ: unknown REPL environment</p> <p>Conjure does not provide names for the sub-menus the conjure commands are organised into. For example <code><localleader>e</code> has a group of key bindings related to evaluation, although when shown in which-key the <code><localleader>e</code> has the default label of prefix and is not very helpful.</p> <p>It was suggested in ticket # that Conjure add names for these groups. The project maintainer preferred to have these added to a personal Neovim configuration.</p> <p>Initially group names were added in the <code>lua/plugins/user-practicalli.lua</code> configuration, however, this meant that the names showed up regardless of the filetype of the current buffer. So if viewing a Lua file, the Conjure menu would still show.</p> <p>The <code>after/ftplugin/</code> directory is used to add filetype specific configuration, loaded each time a new filetype is switched too.</p> <p>The Conjure group names were moved to <code>after/ftplugin/clojure.lua</code> and now they only appear when the buffer is a <code>clojure</code> filetype, e.g. a <code>.clj</code>, <code>.cljs</code>, <code>.edn</code> file</p> <p>Practicalli Astro config - Clojure filetype plugin</p> after/ftplugin/clojure.lua<pre><code>-- Load after clojure filetype set\n\nlocal whichkey = require \"which-key\"\n\nreturn {\n {\n \"folke/which-key.nvim\",\n -- Load Conjure Groups only for Clojure filetypes\n whichkey.add {\n -- Conjure sub-menus\n { \"<LocalLeader>c\", group = \"Connect\" },\n { \"<LocalLeader>e\", group = \"Evaluate\" },\n { \"<LocalLeader>ec\", group = \"Comment\" },\n { \"<LocalLeader>g\", group = \"Go\" },\n { \"<LocalLeader>l\", group = \"Log\" },\n { \"<LocalLeader>r\", group = \"Refresh\" },\n { \"<LocalLeader>s\", group = \"Session\" },\n { \"<LocalLeader>t\", group = \"Test\" },\n { \"<LocalLeader>v\", group = \"Values\" },\n },\n },\n}\n</code></pre> <p>Thank you.</p> <p> Practical.li Website</p> <p> Practical.li GitHub Org practicalli-johnny profile</p> <p> @practicalli@clj.social @practical_li</p>","tags":["clojure","neovim"]},{"location":"clojure-specific-which-key-menu/","title":"Clojure specific Which-key menu","text":"<p>Whilst looking for a Neovim way to have language specific configuration, I discovered the <code>after/ftplugin</code> approach. This allows a configuration to be loaded when a buffer is switched to a specific language.</p> <p>Having used Spacemacs (Emacs) for many years I was used to having language mode specific menus, e.g. Clojure has many cider which-key bindings available which are defined in the Clojure major mode.</p> <p>I was curious how I could also do this with Neovim.</p> <p>Whist <code>autocmd</code> definitions can be used for filetype specific actions, there is also a seemingly simpler approach using configuration in <code>after/ftplugin/</code> directory, i.e. <code>after/ftplugin/clojure.lua</code> for the Clojure filetypes.</p> <p>The <code>after/ftplugin</code> approach is used to add meaningful names to the Conjure menus that display when pressing the local leader <code>,</code> to help with discoverability of commands.</p> after/ftplugin/clojure.lua<pre><code>-- Loaded after clojure filetype set in buffer\n\nlocal whichkey = require \"which-key\"\n\nreturn {\n {\n \"folke/which-key.nvim\",\n -- Load Conjure Groups only for Clojure filetypes\n whichkey.add {\n -- Conjure sub-menus\n { \"<LocalLeader>c\", group = \"Connect\" },\n { \"<LocalLeader>e\", group = \"Evaluate\" },\n { \"<LocalLeader>ec\", group = \"Comment\" },\n { \"<LocalLeader>g\", group = \"Go\" },\n { \"<LocalLeader>l\", group = \"Log\" },\n { \"<LocalLeader>r\", group = \"Refresh\" },\n { \"<LocalLeader>s\", group = \"Session\" },\n { \"<LocalLeader>t\", group = \"Test\" },\n { \"<LocalLeader>v\", group = \"Values\" },\n },\n },\n}\n</code></pre> <p>This should only show the menu when using the <code>localleader</code> when the current buffer is <code>clojure</code> filetype. It seems to work so far...</p> <p>Thank you.</p> <p> Practical.li Website</p> <p> Practical.li GitHub Org practicalli-johnny profile</p> <p> @practicalli@clj.social @practical_li</p>","tags":["neovim"]},{"location":"long-cold-winter/","title":"Long Cold Winter","text":"<p>Converted some audio files to Opus codec, which provides a really optimum compression and allows for relatively low bit rates and results in much smaller files with the same quality.</p> <p>Neovim upcoming changes</p> <ul> <li>neovim 0.11 has some breaking changes, so assume early in 2025</li> <li>astronvim v5 once neovim 0.11 released</li> <li> mason-tool-installer.nvim to simplify mason config in astronvim v5 - discussed in Atronvim Discord community. maston-tool-installer still uses the mason registry for tool versions.</li> </ul> <p>Starting to update my CV from recent commercial experiences, focusing on the areas of product, delivery and people.</p>","tags":["neovim","mason","codec","opus"]},{"location":"long-cold-winter/#neovim-and-clojure-lsp","title":"Neovim and Clojure LSP","text":"<p>Mason manages the installation of LSP servers, format and lint tools for Neovim.</p> <p>There is a Renovate GitHub App that keeps source code dependencies up to date. Mason registry uses renovate to bump its config to use the latest releases of each tool.</p> <p> PR #7896 bumps Clojure LSP to lates release in the Mason Registry.</p> <p> PR #7896 bump Clojure LSP to lates release - Mason Registry</p>","tags":["neovim","mason","codec","opus"]},{"location":"long-cold-winter/#converting-audio-with-ffmpeg","title":"converting audio with ffmpeg","text":"<p>The Opus codec has excellent compression ability and music and spoken word can be encoded in a relatively low bit rate.</p> <p>128k variable bit rate encoding provides near transparent encoding. libopus uses variable bit rate by default.</p> <p>Opus recommended bit rates are:</p> <ul> <li>Music: 96 to 128k (I use 96k)</li> <li>Audiobooks: 32k</li> </ul> <p>I had some books that were already encoded at 96k bit rate. Converting them to 32k bit rate reduced the file size by a third without any noticeable drop in quality.</p> <p>Using zsh pattern matching allows for a very simple script to convert multiple files in the current directory, saving them in a separate <code>32k</code> directory (otherwise the script may have converted all the new opus files it created).</p> <p>Convert Opus encoded files to 32k bit rate</p> <pre><code>#!/usr/bin/zsh\n\n# Convert Opus audio files to 32k bitrate\n# zsh specific parsing of current directory\n# converted files saved in `32k` directory\n\nfor x in *.opus ; do\n ffmpeg -i \"$x\" -b:a 32k -c:a libopus \"32k/${x:r}\".opus\ndone\n</code></pre> <p>Convert raw WAV files to Opus 96k bit rate</p> <pre><code>#!/usr/bin/zsh\n\n# Convert wav files to 96k bit rate Opus encoded files\n# zsh specific parsing of current directory\n\nfor x in *.wav ; do\n ffmpeg -i \"$x\" -b:a 96k -c:a libopus \"${x:r}\".opus\ndone\n</code></pre>","tags":["neovim","mason","codec","opus"]},{"location":"long-cold-winter/#book-list","title":"Book List","text":"<p>I have time to read and reread some of the physical books before I dispatch them to one of the book buying companies for a second chance at life.</p> <ul> <li>The Goal - Goldratt</li> <li>Critical Path - Goldratt</li> <li>Its Not Luck - Goldratt</li> <li>The Mythical Man Month (20th anniversary edition) - Fred Brooks</li> <li>Death March - Yourdon</li> <li>Agile Retrospectives (there is a 2nd edition to read)</li> </ul>","tags":["neovim","mason","codec","opus"]},{"location":"long-cold-winter/#notes-for-updating-my-cv","title":"Notes for updating my CV","text":"<p>Its time to update my CV based on the experiences of my last commercial engagement.</p> <p>Some advice from a trusted recruiter is to organise the experiences around Product, Delivery and People. This seems a sensible approach and should help me explore and communicate my experiences in a meaningful way.</p> <p>Product:</p> <ul> <li>working with product manager on priorities</li> <li>wrote pitches with a technical focus</li> <li>reviewed and where necessary refactor the pitch for engineers to consume</li> </ul> <p>Pitches could grow quite significantly during discovery, which could evolve over many months.</p> <p>Delivery:</p> <ul> <li>enhanced our ways of working, regular retrospectives,</li> <li>definition of DONE</li> <li>clearly defined milestones / Epics to know when</li> <li>UAT baked in often and early</li> <li> </li> </ul> <p>People:</p> <ul> <li>regular 1-2-1 sessions with notes, ensuring people felt safe to communicate their concerns</li> <li>empathising and sharing similar experiences</li> <li>career progression - mentored 3 of the team to promotion within the year, with a 4th to be promoted by moving to a more appropriate team (via a 4 month transition)</li> </ul>","tags":["neovim","mason","codec","opus"]},{"location":"long-cold-winter/#time-scoped-work-to-minimise-scope-creep-and-keep-focus-on-the-essentials","title":"time scoped work to minimise scope creep and keep focus on the essentials","text":"","tags":["neovim","mason","codec","opus"]},{"location":"long-cold-winter/#one-2-ones","title":"One 2 Ones","text":"<p>The 1-2-1 is a tool to build a trusted relationship between two people. There can be many challenges along the way and people need a way to discuss issues and feelings in a safe space.</p> <p>If one person is in positional power (or perceived that way), they should take extra care to be transparent and</p> <p>The first 1-2-1 session should establishing the expectations of each person involved regarding this type of meeting. These expectations may evolve over time, so should be regularly revisited.</p> <p>A checklist for the first meeting:</p> <ul> <li>capture expectations</li> <li>discuss preferences on meeting frequency</li> <li>establish note taking as a valuable practice</li> <li>start to capture specific actions and who note who is responsible for completing those actions</li> <li>start to establish trust</li> </ul> <p>1-2-1 aims:</p> <ul> <li>building an relationship with each person on the team</li> <li>encouraged them to make head space for challenges they faced and thinking how they could alleviate them</li> </ul> <p>One to One meeting - Practicalli Engineering Playbook</p>","tags":["neovim","mason","codec","opus"]},{"location":"long-cold-winter/#career-progression","title":"Career progression","text":"<p>If you believe you are ready and everyone already considers you at the next level, then it should be trivial to convey to management that a promotion is due.</p> <p>A bragging document is a self-organised history of achievements during work. The primary purpose is to identify if there are gaps that could be addressed that would prevent a promotion.</p>","tags":["neovim","mason","codec","opus"]},{"location":"long-cold-winter/#retrospective-notes","title":"Retrospective notes","text":"<p>Every team and every individual has the potential to enhance how they work</p> <p>Potential Purpose Goal</p> <p>Dont have to improve constantly, but a continual review of the situation (situational awareness) is important for growth</p> <p>Data points - automated processes - are they causing a constraint - do we understand how they work - are there optimisations that could be made - testing - is the test run time a constraint / blocker - can tests be continually run (watch for changes in specific tests or logical parts of the code base) - does test run time deter tests from always running</p> <ul> <li>was the current work more or less challenging than expected () - careful this doents get into a time aspect</li> </ul> <p>What we did well / should do more of - what makes us successful already - what helps us build on more success</p> <p>What didnt work so well / should do less of or stop - what slows us down or prevents success - do we know why we are doing these things (motivation / drivers)</p> <p>Thank you.</p> <p> Practical.li Website</p> <p> Practical.li GitHub Org practicalli-johnny profile</p> <p> @practicalli@clj.social @practical_li</p>","tags":["neovim","mason","codec","opus"]},{"location":"what-is-past-is-prologue/","title":"What is past is prologue","text":"<p>Quote</p> <p>If a technology was truly dead, no one would feel the need to talk about it on the internet</p>","tags":["leadership","appimage","debian","hyprland"]},{"location":"what-is-past-is-prologue/#dead-is-mainstream","title":"Dead is mainstream","text":"<p>When people state that some technology or practice is dead via the internet, it typically means that thing is the mainstream.</p> <p>If something was truely dead, no one would feel the need to talk about it as that topic would not relate to anyone.</p> <p>This technique is essentially click-bate and trying to persuade you to 'buy-in' to something else (usually for the profit of aother person)</p>","tags":["leadership","appimage","debian","hyprland"]},{"location":"what-is-past-is-prologue/#appimage","title":"Appimage","text":"<p>AppImage is way to package software for Linux which provides a universal executable. They are created, in a file ending <code>.AppImage</code>. Neovim no longer includes a Debian package with each new release, however, an AppImage is part of each release.</p> <p>An Appimage can be downloaded and made executable and run directly from the command line. This is enabled by FUSE libraries</p> <p>Install Fuse 2 on Debian</p> <pre><code>apt install libfuse2t64\n</code></pre> <p>NOTE: earlier versions of the package are called <code>libfuse2</code></p>","tags":["leadership","appimage","debian","hyprland"]},{"location":"what-is-past-is-prologue/#future-tiling-window-manager","title":"Future Tiling Window Manager","text":"<p>I have been experimenting with hyprland recently and its very fast experience but requires a lot of configuration and building software for Debian systems.</p> <p>miracle-wm is a tiling Wayland window manager built on top of canonical/Mir (libraries for building Wayland based shells).</p> <p>Wayland has the promise of being more than desktop eye candy, but there is still a lot of development required for everyone to easily adopt it.</p> <p>Tiling managers like hyprland and miricle-wm should provide a very fast and efficient desktop experience but there is still some maturity to gain when compared to Gnome, KDE and Regolith desktops.</p> <p>Thank you.</p> <p> Practical.li Website</p> <p> Practical.li GitHub Org practicalli-johnny profile</p> <p> @practicalli@clj.social @practical_li</p>","tags":["leadership","appimage","debian","hyprland"]},{"location":"finding-my-joy/","title":"Finding My Joy","text":"<p>In season 2, episode 2 of \"The Big Door Prize\" they talk about \"Finding your Joy\". This seems like an inspiring new years resolution, or at least a theme I should focus on for 2025.</p> <p>You only live one life and you should take time out to enjoy it. There were many aspects to 2024 that constrained my joy, so I will endeavour to may 2025 a most joyous year.</p> <p>Practicalli Updates:</p> <ul> <li>Clojure Data Inspector tools - overview and portal page updated</li> </ul>","tags":["clojure"]},{"location":"finding-my-joy/#github-statistics","title":"GitHub statistics","text":"<p>Earlier in 2024 I deleted many outdated repositories on GitHub that were not worth keeping. However, this did take off over 600 contributions from my total.</p> <p>At the end of last week my GitHub contributions broke the 15,000 total again.</p> <p></p> <p>I use the statistics only as a simple motivator to do something every day. Most days it is a small task or updating the current journal entry to capture new things learned that day.</p> <p>Github tracker offers statistics about a repository. I believe this is a community website and not an official GitHub website (as the logo uses a lower case h)</p> <p>Github tracker for Practicalli Clojure repository</p> <p>At the end of the year I'll generate some yearly statistics from GitHub.</p>","tags":["clojure"]},{"location":"finding-my-joy/#talk-idea-communication-improbable","title":"Talk Idea - Communication Improbable","text":"<p>A talk idea from many years ago, which seems very relevant today too.</p> <p>Talk Title: Communication Improbable</p> <p>Description:</p> <p>Given all the information we filter out and pass through our cognitive biases, its amazing we take notice of anyone. \u00a0 Covering why communication is such a monumental challenge, we give tangible practices & tips to increase the effectiveness of communication to your audience (whoever that may be)</p> <p>Abstract:</p> <p>Communicating with anyone is a major challenge when even the simplest idea can be misunderstood.\u00a0 By telling the stories across common situations we will help you develop your skills at effectively communicating.</p> <p>In our DevRel roles we need to get our message across to audiences large and small on subjects narrow and wide.\u00a0 Underpinning all this communications is a level of trust, so without developing a trusted relationship you are much less likely to be heard.</p> <p>There is a delicate balance of enthusiasm and pragmatism when talking to the developer community (or any community that gets too much hype on a regular basis).\u00a0 The way we talk is interpreted many different ways by our audiences internal cognitive biases, so a great deal of empathy and emotional quotient is required to get your message across.</p> <p>Putting the challenges an practices together, you will be able to greatly improve the effectiveness of your communication across different audiences.</p> <p>Notes:</p> <p>I was lucky enough to present the basics of this talk with Jessica Rose at Twilio Signal conference \u00a0and Salesforce Dreamforce.\u00a0 We both received lots of great feedback and I have taken this talk further based on those ideas.\u00a0 I've also make the content more specifically around the challenges faced by those in the DevRel community.</p> <p>This could be a keynote talk or just a usual 30 minute talk.</p> <p>Thank you.</p> <p> Practical.li Website</p> <p> Practical.li GitHub Org practicalli-johnny profile</p> <p> @practicalli@clj.social @practical_li</p>","tags":["clojure"]},{"location":"holiday-stuffing/","title":"Holiday stuffing","text":"<p>Feeling a little sick so binging on movies and shows on Apple TV+. On Monday afternoon Apple TV+ would not stream content (the play button disappeared) although I could browse the catalogue of shows. After several hours the play button came back, although contacting Apple support was quite pointless.</p> <p></p> <p>A relaxing week trying out some new vegetarian and vegan meals. Pieminister Mooless Moo pie is a plant based stake and ale pie, using jackfruit for the stake pieces. The pastry was lovely and crispy and the pie was very filling. The only downside to the pie for me was it was the taste and texture was too much like beef and I've never really liked that even when I did eat meat.</p> <p>New potatoes, Edamame, Spinach and Garden Peas complement the pie, along with some very thick Bisto Best Vegetable Gravy (I add way too many granules to make the gravy nice and thick).</p>","tags":["emacs","neovim"]},{"location":"holiday-stuffing/#emacs","title":"Emacs","text":"<p>After reinstalling the operating system on a computer a few months ago and only just realised I had not installed Emacs. An interesting sign that I have become very comfortable with Neovim.</p> <p>Debian testing includes the latest 29.4 release of Emacs.</p> <p>I followed the Practicalli Spacemacs install guide and confirmed it was still up to date.</p> <p>Emacs package information</p> <pre><code>root@gkar:~# apt show emacs\nPackage: emacs\nVersion: 1:29.4+1-4\nPriority: optional\nSection: editors\nMaintainer: Rob Browning <rlb@defaultvalue.org>\nInstalled-Size: 54.3 kB\nDepends: emacs-gtk (>= 1:27.1) | emacs-pgtk (>= 1:27.1) | emacs-lucid (>= 1:27.1) | emacs-nox (>= 1:27.1)\nHomepage: https://www.gnu.org/software/emacs/\nTag: devel::editor, role::dummy, role::metapackage, role::program,\n suite::emacs, suite::gnu, use::editing\nDownload-Size: 18.5 kB\nAPT-Sources: http://deb.debian.org/debian trixie/main amd64 Packages\nDescription: GNU Emacs editor (metapackage)\n GNU Emacs is the extensible self-documenting text editor.\n This is a metapackage that will always depend on the latest\n recommended Emacs variant (currently emacs-gtk).\n</code></pre> <p>Install Emacs Debian package and dependencies</p> <pre><code>root@gkar:~# apt install emacs\nThe following packages were automatically installed and are no longer required:\n libpaper1 linux-image-6.11.7-amd64\nUse 'apt autoremove' to remove them.\n\nInstalling:\n emacs\n\nInstalling dependencies:\n emacs-bin-common emacs-el gsasl-common install-info libgsasl18 libm17n-0 libntlm0 libtree-sitter0 m17n-db mailutils-common\n emacs-common emacs-gtk guile-3.0-libs libgccjit0 libgssglue1 libmailutils9t64 libotf1 libwebpdecoder3 mailutils\n\nSuggested packages:\n emacs-common-non-dfsg emacs-editing-major-modes m17n-docs mailutils-mh mailutils-doc\n\nSummary:\n Upgrading: 0, Installing: 20, Removing: 0, Not Upgrading: 16\n Download size: 63.6 MB\n Space needed: 253 MB / 11.0 GB available\n</code></pre> <p>The Emacs package recommends other supporting packages</p> Emacs core documentation <pre><code>root@gkar:~# apt show emacs-common-non-dfsg\nPackage: emacs-common-non-dfsg\nVersion: 1:29.4+1-1\nPriority: optional\nSection: non-free/editors\nSource: emacs-non-dfsg\nMaintainer: Rob Browning <rlb@defaultvalue.org>\nInstalled-Size: 5,322 kB\nDepends: dpkg (>= 1.15.4) | install-info\nConflicts: emacs21-common-non-dfsg, emacs22-common-non-dfsg, emacs23-common-non-dfsg, emacs24-common-non-dfsg, emacs25-common-non-dfsg\nBreaks: texinfo-doc-nonfree (<< 6.1.0-1)\nReplaces: texinfo-doc-nonfree (<< 6.1.0-1)\nDownload-Size: 5,251 kB\nAPT-Sources: http://deb.debian.org/debian trixie/non-free amd64 Packages\nDescription: GNU Emacs common non-DFSG items, including the core documentation\n This package includes the core Emacs documentation: the Emacs Info\n pages, the Emacs Lisp Reference Manual, and the Emacs Lisp Intro.\n</code></pre> Emacs editing modes <pre><code>root@gkar:~# apt show emacs-editing-major-modes\nPackage: emacs-editing-major-modes\nVersion: 1.1\nPriority: optional\nSection: editors\nSource: emacs-addons-metapackages\nMaintainer: Debian Emacsen team <debian-emacsen@lists.debian.org>\nInstalled-Size: 10.2 kB\nRecommends: elpa-agda2-mode, elpa-apache-mode, elpa-ats2-mode, elpa-bazel-mode, elpa-bison-mode, elpa-bpftrace-mode, elpa-caml, elpa-clojure-mode, elpa-cmake-mode, elpa-csv-mode, elpa-dart-mode, elpa-debian-el, elpa-dockerfile-mode, elpa-dpkg-dev-el, elpa-elm-mode, elpa-fountain-mode, elpa-git-modes, elpa-gitlab-ci-mode, elpa-gnuplot-mode, elpa-go-mode, elpa-graphviz-dot-mode, elpa-haskell-mode, elpa-inform-mode, elpa-jinja2-mode, elpa-js2-mode, elpa-kivy-mode, elpa-kotlin-mode, elpa-lua-mode, elpa-markdown-mode, elpa-matlab-mode, elpa-meson-mode, elpa-muttrc-mode, elpa-nginx-mode, elpa-org, elpa-php-mode, elpa-pip-requirements, elpa-protobuf-mode, elpa-puppet-mode, elpa-qml-mode, elpa-racket-mode, elpa-rust-mode, elpa-scala-mode, elpa-sml-mode, elpa-systemd, elpa-vala-mode, elpa-web-mode, elpa-yaml-mode, gettext-el\nDownload-Size: 2,608 B\nAPT-Sources: http://deb.debian.org/debian trixie/main amd64 Packages\nDescription: All editing major modes for Emacs\n This is a metapackage that recommends all Emacs major modes including\n programming modes, configuration file modes, etc. Installing this\n package enables Emacs to handle most well-known file formats for\n file-editing, while also providing the flexibility for a user to\n choose which they do or do not need.\n</code></pre>","tags":["emacs","neovim"]},{"location":"holiday-stuffing/#practicalli-astro","title":"Practicalli Astro","text":"<p>The 2024-12-17 release included configuration to use a locally installed Clojure LSP server, rather than allow mason to manage the install.</p> <p>The Mason Registry was updated to use the latest Clojure LSP server version, via PR7896. Usually the versions are automatically updated via the renovate GitHub action, although this time the PR did not pass the tests so was not automatically merged.</p> <p>The maintainer updated and merged the PR manually.</p> <p>Practicalli Astro was updated to comment the configuration that was added to <code>lua/plugins/user-practicalli.lua</code> to use a local install of Clojure LSP.</p>","tags":["emacs","neovim"]},{"location":"holiday-stuffing/#debian-tracker","title":"Debian Tracker","text":"<p>Tracker service indexes many types of files to enable discovery of files by other Gnome services and applications.</p> <ul> <li>desktop search</li> <li>Tag database for keyword tagging</li> <li>Extensible metadata database to add custom metadata to files, e.g. rhythmbox, gedit, etc.</li> <li>Store First Class Objects and the Gnome 3.0 Model</li> </ul> <p>NOTE: when actively using Gnome desktop and Gnome apps, disabling the tracker may reduce functionality</p>","tags":["emacs","neovim"]},{"location":"holiday-stuffing/#disable-the-tracker-service","title":"Disable the tracker service","text":"<p>The tracker service can be a significant drain on computer resources as it indexes files, especially when there have been a log of changes or for a newly installed system.</p> <p>The tracker has many dependencies, so its not easy to remove the <code>tracker-miner-fs-3</code> package when actively using the Gnome desktop.</p> <p>The recommended approach is to edit the <code>.desktop</code> files and add <code>Hidden=true</code> at the end of each tracker related file and reboot the operating system.</p> /etc/xdg/autostart/tracker-miner-fs-3.desktop<pre><code>[Desktop Entry]\nName=Tracker File System Miner\nComment=Crawls and processes files on the file system\nExec=/usr/libexec/tracker-miner-fs-3\nTerminal=false\nType=Application\nCategories=Utility;\nX-GNOME-Autostart-enabled=false\nX-GNOME-HiddenUnderSystemd=false\n# X-KDE-autostart-after=panel\nX-KDE-StartupNotify=false\nX-KDE-UniqueApplet=true\nNoDisplay=true\nOnlyShowIn=GNOME;KDE;XFCE;X-IVI;Unity;\nX-systemd-skip=true\nHidden=true\n</code></pre> <p>If adding \"Hiddent=true\" is not sufficient, then disable the services for all users by setting them to <code>/dev/null</code> using the <code>systemctl</code> command.</p> <pre><code>sudo systemctl --global mask tracker-miner-fs-3.service\nsudo systemctl --global mask tracker-xdg-portal-3.service\n</code></pre> <p>Remove the database of indexed files from each user account on the system</p> <pre><code>rm -rf $HOME/.cache/tracker*\n</code></pre>","tags":["emacs","neovim"]},{"location":"holiday-stuffing/#movie-reviews-this-week","title":"Movie reviews this week","text":"","tags":["emacs","neovim"]},{"location":"holiday-stuffing/#luck-2022","title":"Luck - 2022","text":"<p>Luck is a fun animated film. Sam is a very unlucky human who meets a very cute and lucky black cat called Bob, voiced by Sean Pegg. I wish I was as lucky as Bob the cat.</p> <p>Sam feeds Bob some food and finds Bob's lucky penny.</p> <p>Includes a nod to the Japanese obsession with the cat.</p> <p>Bob was sent to Section A113 which is an easter egg referencing the class room number used for character animation students as the California Institute of the Arts, where some of the Pixar team used to study.</p> <p>Apple TV+</p>","tags":["emacs","neovim"]},{"location":"holiday-stuffing/#wolfs","title":"Wolfs","text":"<p>Brad Pitt and George Clooney bouncing off each other perfectly. I really enjoyed this film and could watch again.</p> <p>Apple TV+</p>","tags":["emacs","neovim"]},{"location":"holiday-stuffing/#constellation","title":"Constellation","text":"<p>Naoomi Rapace leads a very intriguing space drama that centers around an experiment to find 'other states of matter' and the effectives of that experiment. Essentially what happens when your life splits and you start living in a world that is not quite your own.</p> <p>Thank you.</p> <p> Practical.li Website</p> <p> Practical.li GitHub Org practicalli-johnny profile</p> <p> @practicalli@clj.social @practical_li</p>","tags":["emacs","neovim"]},{"location":"a-new-dawn-a-new-day-its-a-new-life/","title":"A new dawn a new day its a new life","text":"<p>As we come to the end of 2025 I continue to contemplate what is next?</p> <p>Do I want to continue in the software engineering industry with its many systemic faults?</p> <p>Or should I branch out and do something completely different?</p> <p>80,000 hours is a guide to careers that have a positive impact on the world.</p> <p>My searching for a new home are currently focusing on the East coast of Scotland (which is dryer than London at the moment). Aberdeen (the granite city) has good support for cycling and a few cycle clubs in the area.</p> <p>Wired up my Playstation 4 and VR headset to start playing games again. During more severe covid symptoms I couldnt wear the VR headset as it put too much pressure on my head. From an hour of play today, the VR headset felt okay.</p> <p>I had a few quick games of Stardust and one surprisingly successful game of Polybius.</p>","tags":["neovim"]},{"location":"a-new-dawn-a-new-day-its-a-new-life/#neovim","title":"Neovim","text":"<p>Neovim 0.11.3 released.</p> <p>The nvim.appimage file was downloaded from the GitHub releases page, along with the SHA256 checksum.</p> <p>Check the integrity of the file download</p> <pre><code>sha256sum --check nvim.appimage.sha256sum\n</code></pre> <p>Set the <code>nvim.appimage</code> file to executable.</p> <pre><code>chmod a+x nvim.appimage\n</code></pre> <p>Move the nvim.appimage to the shared executable path to make available to all users, renaming to nvim.</p> <pre><code>sudo mv nvim.appimage /usr/local/bin/nvim\n</code></pre>","tags":["neovim"]},{"location":"a-new-dawn-a-new-day-its-a-new-life/#lsp-file-name-refactor","title":"LSP file name refactor","text":"<p>Astrocommunity has the <code>nvim-lsp-file-operations</code> plugin packaged, so taking it for a test drive to see if I can refactor filenames and update namespace names (and vice versa).</p> <p>Thank you.</p> <p> Practical.li Website</p> <p> Practical.li GitHub Org practicalli-johnny profile</p> <p> @practicalli@clj.social @practical_li</p>","tags":["neovim"]},{"location":"striving-toward-consistency/","title":"Striving toward consistency","text":"<p>Will feel good to have all Practicalli website content have a consisten look.</p> <p>Material for MkDocs really helps me convey information effectively (at least in my own view).</p> <p>Still have a few covid symptoms, but not as much this week. Usually only in the mornings.</p>"},{"location":"striving-toward-consistency/#migrate-practicalli","title":"Migrate Practical.li","text":"<p> Practical.li/blog has been moved to use Material for MkDocs and is working very well.</p> <p>As a blog can have pagest too, so it is possible to replace the Practical.li landing page with a blog webstite.</p> <p>So I plan to retire the Practical.li ClojureScript project that generated the current Practicalli landing page and replace it with MkDocs.</p> <p>The blog project using Material for MkDoc is being extended to include content from the current landing page. So far it looks very promising.</p>"},{"location":"striving-toward-consistency/#magit-show-signatures","title":"Magit show signatures","text":"<p>By default Magit status and log view does not show information about signed commits.</p> <p>Having used Neovim and Neogit, signed commits is shown by default and provides confidence that signing is working (its a recent approach, so continual feedback is very useful).</p> <p>Magit can show signature information, but its not immediately obvious how.</p> <ul> <li>l for log menu</li> <li>= S signed option</li> <li>l to show the commit log</li> </ul> <p>The Signed option highlights the shortend commit SHA value in green when a commit has been signed locally (SSH or Git).</p> <p>Commits singed-off via the GitHub website have the shortend commit SHA highlighted in red</p> <p>Enter on commit show the description, meta data and diff of the commit, but by default does not show if the commit is signed.</p> <ul> <li>D when viewing the commit details provides diff options menu</li> <li>= g</li> <li>w to update the current buffer and set signing to show as default</li> </ul> <p>Signed commits will show every time the commit details buffer is viewed.</p> <p>The format of the sign line in the commit details buffer would benefit from a line to separate it from the file changed list.</p> <p>Thank you.</p> <p> Practical.li Website</p> <p> Practical.li GitHub Org practicalli-johnny profile</p> <p> @practicalli@clj.social @practical_li</p>"},{"location":"the-editors-strike-back/","title":"The editors strike back","text":"<p>Interesting edge cases with evil-cleverparens and another question about choice of editor for complete beginners to programming.</p> <p>Covid strikes again. Wiped out by the end of the week.</p>"},{"location":"the-editors-strike-back/#clojure-cli-config","title":"Clojure CLI Config","text":"<p>Monthly update for libraries used in the Clojure CLI Config.</p> <p>Release: Clojure CLI Config</p>"},{"location":"the-editors-strike-back/#spacemacs","title":"Spacemacs","text":"<p>Some curious edge cases for evil-clever-parens where deleting within a hash-map leaves the hash-map unbalanced.</p> <p>This behaviour was found in Spacemacs although it could be another package or config causing the issue as the same edge cases are not present in vanilla Emacs.</p> <p>When modifying a hash-map with <code>evil-cp-delete-line</code> (<code>D</code> in Evil Normal state) the hash-map closing paren can be deleted and become unbalanced. This seems to happen either a flat hash-map or nested hash-map.</p> <p><code>evil-cp-delete-line</code> correctly keeps balance when the hash-map is surrounded by a different type of parens, eg. list or vector.</p> <p>Example</p> <pre><code>;; D deletes closing paren on first line - unbalanced, although dd does work as expected\n{:get {:handler :get-clojure}\n :name ::main}\n\n;; deletes closing paren - unbalanced\n{:get :clojure}\n\n;; delete anywhere in hash-map keeps balance\n[{:get :clojure}]\n\n;; delete anywhere leaves unbalanced\n{:get {:closure {:with ::clojure}}}\n\n;; delete within hash-map keeps parens balanced\n(clojure.pprint/pprint {:get :clojure})\n\n;; delete within hash-map keeps parens balanced\n(def data-analysis\n [{:get :clojure}])\n\n;; delete in vector keeps parens balanced\n[:get :clojure]\n\n;; delete in hash-map keeps parens balanced\n[:get {:clojure :repl}]\n</code></pre> <p>I did not find any issue from an initial review of the Spacemacs configuration and use of evil-cleverparens in the Spacemacs configuration.</p> <p>These seem edge cases to me anyway as I replace the value in the hash map rather than use line-delete with a value from a key value pair, as logically deleting only the value unbalances the semantics of the hash-maps itself.</p>"},{"location":"the-editors-strike-back/#editor-for-beginners","title":"Editor for Beginners","text":"<p>Which editor is the easiest for complete beginners to use for learning Clojure?</p> <p>This was a question this week in the Clojurians Slack community and there are always variations on the theme of which editor to use.</p>"},{"location":"the-editors-strike-back/#tooling-bias","title":"Tooling bias","text":"<p>It is very hard to see past our own biases when it comes to the tools we use every day. A deep connection is made to the editor of choice and becomes hard to overcome this affinity.</p> <p>We naturally want people to validate our own tooling choices by encouraging others to use the same editor.</p> <p>This kind of bias can be avoided by first acknoledging that it is ever present. Using several editors can also reduce some bias as well as providing a deeper understaning of the strenghths and constraints of each tool.</p> <p>Practicalli uses Neovim and Emacs regularly</p> <p>This blog and most new content is created using Neovim (with AstroNvim). However for most of the last decade the Practicalli content has been created with Emacs (with Spacemacs).</p>"},{"location":"the-editors-strike-back/#no-editor-or-development-experience","title":"No editor or development experience","text":"<p>Using a text editor that supports Clojure syntax highlighting is the simplest approach. Using a terminal REPL prompt to load files.</p> <p>My suggestion is Clojure Sublimed is less complicated than any other tools. Or Rebel Headline could be used for very small pieces of code. Or choose a tool that has very clear and accurate guides, so the beginner progress without getting stuck or requiring significant help from a teacher/mentor. The only editor / IDE that will feel simple to the learner is the one they become familiar with (or can be taught the essence of in a short space of time).</p> <p>IDEs will feel very complex because they have lots of features to distract & confuse someone with no context.</p> <p>Anyone guiding beginners will have experienced how distracting a large number of features can be, they quickly get in the way of learning (and teaching).</p>"},{"location":"the-editors-strike-back/#early-days-of-clojure","title":"Early days of Clojure","text":"<p>LightTable was first editor that really helped me feel comforatable with Clojure and REPL driven development.</p> <p>The editor was not perfect, but was extremely simple to use and provided really useful feedback as code was typed.</p> <p></p> <p>Unfortunately the LightTable editor was discontinued, even though there was an effort to revive it after the original maintainer passed.</p> <p>Thank you.</p> <p> Practical.li Website</p> <p> Practical.li GitHub Org practicalli-johnny profile</p> <p> @practicalli@clj.social @practical_li</p>"},{"location":"engineering-practices/","title":"Engineering Practices","text":"<p>Illness is all around. Around 12% of people in Germany are currenly ill through covid, flu or a stomach virus. I have some relatively mild symptoms this week.</p> <p>The hunt for a new place to live continues, investigating lots of facinating places in Scotland. Discovered an Ecopark with sustainably built housing. There is one house for sale and some new builds in the near future. Requested a build plan for the new build houses.</p>"},{"location":"engineering-practices/#practicalli-plans","title":"Practicalli plans","text":"<p>I'd like to focus more on engineering principles and practices this year, adding specific practice guides to the Practicalli Engineering Playbook.</p> <ul> <li>Kanban to visualise issues and understand how changes affect the team</li> <li>Decomposing large project into small pieces of work</li> <li>Working towards consistent delivery</li> <li>Behaviour Driven Development</li> <li>Combining Shape-up pitch documentation with effective persona and user stories</li> </ul>"},{"location":"engineering-practices/#health","title":"Health","text":"<p>Some covid symptoms this week, usually coughing in the morning and lost my voice a few times. More tired by the end of the week than I should be, so have been sleeping more at weekends rather than cycling or walking.</p> <p>Thank you.</p> <p> Practical.li Website</p> <p> Practical.li GitHub Org practicalli-johnny profile</p> <p> @practicalli@clj.social @practical_li</p>"},{"location":"alias-shell-that-updates-shell/","title":"Alias Shell that updates Shell","text":"<p>As this week is mosly tweaks for Zsh history, I've titled this journal entry to be a play on words from the Shakesphere play 'Alls well that ends well'.</p> <p>The <code>fd</code> built-in command for Zsh is a very effective way to keep the command history clean.</p>","tags":["clojure"]},{"location":"alias-shell-that-updates-shell/#zsh","title":"Zsh","text":"<p>Every command typed at the prompt will be added to the Zsh history. This provides a very efficient way to repeat commands.</p> <p>When an incorrect command is used the usefulness of the history can be deminished, as those incorrect commands are also part of the history.</p> <p>Rather than navigating the history and changing the command, use the buildin <code>fd</code> command to edit the Zsh history.</p> <p>The <code>fd</code> command is a simple tool to keep the Zsh history clean of incorrect commands. A specific command can be edited and changed by specifying its number in the history order. Or the whole history can be edited, especially useful if the command should be completely deleted.</p> <p>Avoid editing history directly</p> <p>Use <code>fd</code> command to edit the history to ensure the cache is up to date.</p> <p>Editing $HISTFILE Zsh history file directly will not remove the command from the history cache and will show when navigating histor until logging out of the shell session.</p>","tags":["clojure"]},{"location":"alias-shell-that-updates-shell/#engineering-playbook","title":"Engineering Playbook","text":"<p>Added shell alias examples to Practicalli Engineering Playbook.</p> <p>Rewrote the Deliberate Practiceoverview and reorganised Architecture and Code Kata pages as sub-sections.</p> <p>Thank you.</p> <p> Practical.li Website</p> <p> Practical.li GitHub Org practicalli-johnny profile</p> <p> @practicalli@clj.social @practical_li</p>","tags":["clojure"]},{"location":"a-new-year-a-new-me/","title":"A new year... a new me","text":"<p>Going back to work for a rest... from all the exercise of winter solstace</p> <p>Continuing to love using Neovide, although havent figured out how to use Neovide from the MacOSX launcher with AstroNvim. It works fine under Linux.</p>"},{"location":"a-new-year-a-new-me/#neovim","title":"Neovim","text":"<p>Created a simple video using some basics of Neovide with the AstroNvim configuration, with the aim to ensure the current OBS setup is working well.</p> <p>Published a short video on Practicalli YouTube channel to test the new OBS setup and see if any changes to the layout are required.</p> <p>Tested on Lenovo Android tablet and Pixel 2XL smartphone for text readability.</p> <p>Neovide test run video: Practicalli YouTube channel</p>"},{"location":"a-new-year-a-new-me/#neovide-on-macosx","title":"Neovide on MacOSX","text":"<p>I can launch Neovide using the Linux desktop launcher and it will pick up the shell alias I used to set AstroNvim as the configuration (NVIM_APPNAME).</p> <p>However, in MacOSX there doesnt seem to be a clear way to do this. There seem to be quite a few approaches, most of which turn out to be deprecated or removed from later versions of MacOSX.</p> <p>MacOSX doesnt seem to have a <code>~/.profile</code> file by default but I will create one and source the <code>shell-aliases</code> file I use to set command line aliases such as <code>astro</code> and <code>neovide</code> with AstroNvim config.</p>"},{"location":"a-new-year-a-new-me/#stats-for-2023","title":"Stats for 2023","text":"<p>I have managed to commit something every day for 2023. There is always plenty of work for Practicalli, so its usually easy to squeeze in a commit even on busy days.</p> <p>Tried GitHub Unwrapped which generates a video of some statistics from the given GitHub account name. Posted the resulting video on my LinkedIn account.</p> <p>GitHub Unwrapped LinkedIn post</p> <p>GitHub Profile has more representative stats</p> <p>The visualisations on the Practicalli-johnny GitHub profile are realistic representations of my activities.</p>"},{"location":"a-new-year-a-new-me/#clojure","title":"Clojure","text":"<p>Ran the latest Clojure CLI pre-release with the Practicalli Clojure CLI Config aliases. Had an issue with Cider-nrepl, though it seems to have been from a corrupted library download rather than the CLI version.</p> <p>Nuked the local maven directory, <code>.m2/repository</code>, to test out the Clojure CLI pre-release at downloading dependencies again and there were no more issues.</p> <p>Also tested the Clojure CLI with a directory containing an empty <code>deps.edn</code> file and was able to run the Rebel repl (<code>clojure -M:repl/rebel</code>) without any problems. This release treats an empty <code>deps.edn</code> file as if it contained a valid data structure, i.e. <code>{}</code>, an empty hash-map.</p>"},{"location":"a-new-year-a-new-me/#practicalli","title":"Practicalli","text":"<p>Monthly scheduled updates</p> <ul> <li>Clojure CLI Config library updates and CI actions</li> <li>Project Templates megalinter upload-artifact v4, setup-java v4 and using Java version 21,</li> </ul> <p>GitHub health check files are added to practicalli/.github repository and apply to all repositories in that organisation, unless they provide their own file.</p> <ul> <li><code>CONTRIBUTING.md</code> defines how to contribute to Practicalli</li> <li><code>FUNDING.yml</code> defines ways to sponsor Practicalli work</li> <li><code>LICENSE.md</code> Creative Commons Attribution Share-a-like license for all Practialli work</li> <li><code>SECURITY.md</code> how to raise security related issues</li> <li><code>SUPPORT.md</code> how to get support from Practicalli</li> <li><code>PULL_REQUEST_TEMPLATE</code></li> <li><code>clojure_code_contribution.md</code></li> <li><code>practicalli_book_contribution.md</code></li> </ul>"},{"location":"a-new-year-a-new-me/#debian","title":"Debian","text":"<p>The <code>ifconfig</code> command used to be the way to view the local network address of the computer in Linux. This command has been retired in favor of the <code>ip</code> command.</p> <p>Show the network addresses for the computer</p> <pre><code>ip address\n</code></pre> <p>The command may show one or more sections</p> <ul> <li><code>loopback</code></li> <li>ethernet cable, named similar to <code>enp0</code></li> <li>wifi adaptor, named similar to <code>wlp</code></li> <li>docker if the docker daemon is installed</li> </ul> Example output from ip address <pre><code>\u276f ip address\n1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000\n link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00\n inet 127.0.0.1/8 scope host lo\n valid_lft forever preferred_lft forever\n inet6 ::1/128 scope host\n valid_lft forever preferred_lft forever\n2: enp0s31f6: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000\n link/ether 48:2a:e3:6b:11:46 brd ff:ff:ff:ff:ff:ff\n inet 192.168.0.212/24 metric 100 brd 192.168.0.255 scope global dynamic enp0s31f6\n valid_lft 5155sec preferred_lft 5155sec\n inet6 fe80::4a2a:e3ff:fe6b:1146/64 scope link\n valid_lft forever preferred_lft forever\n3: wlp82s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000\n link/ether 60:f2:62:15:1f:53 brd ff:ff:ff:ff:ff:ff\n inet 192.168.0.191/24 brd 192.168.0.255 scope global dynamic noprefixroute wlp82s0\n valid_lft 6617sec preferred_lft 6617sec\n inet6 fe80::bf0a:872b:9380:fb98/64 scope link noprefixroute\n valid_lft forever preferred_lft forever\n4: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default\n link/ether 02:42:6e:e0:5f:c8 brd ff:ff:ff:ff:ff:ff\n inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0\n valid_lft forever preferred_lft forever\n</code></pre> <p>The <code>hostname</code> command can provide a simpler view of the network address</p> <p>Hostname interfaces</p> <pre><code>\u276f hostname -I\n192.168.0.212 192.168.0.191 172.17.0.1\n</code></pre>"},{"location":"a-new-year-a-new-me/#health","title":"Health","text":"<p>Over the Winter Solstace break I manage</p> <ul> <li>3 cycle rides, totaling over 215km and 2,500 meters climbing</li> <li>2 park runs, 5 km distance for each run, with a time of 34 minutes on 25th December and 33 minutes on 1st January 2024</li> </ul> <p>A few walks of around an hour each to streatch my legs.</p> <p>Started following some simple Pilates videos specifically designed to strengthen knees, which will be great for both cycling and running.</p> <p>As I am organising my work calendar this month, I will ensure there is time for exercise each day and get into a routine that includes walking, yoga and pilates.</p> <p>Thank you.</p> <p> Practical.li Website</p> <p> Practical.li GitHub Org practicalli-johnny profile</p> <p> @practicalli@clj.social @practical_li</p>"},{"location":"breaking-ground-on-the-new-year/","title":"Breaking ground on the new year","text":"<p>Rushing work is the slowest way to make progress.</p> <p>Exhausted after this week of work, so took a break from cycling and running. Lots of cat naps over the weekend.</p>"},{"location":"breaking-ground-on-the-new-year/#practicalli-spacemacs","title":"Practicalli Spacemacs","text":"<p>I'm using a mix of Spacemacs and Neovim on MacOSX for work, so am steadily adding tweaks in the few areas where there are differences. This is mostly how environment variables work (or dont work in the case of MacOSX for apps launched from the desktop launcher, e.g. spotlight).</p>"},{"location":"breaking-ground-on-the-new-year/#neovim","title":"Neovim","text":"<p>Updated AstroNvim to 3.41.0 using Astronvim config, <code>SPC p A</code>. Many small fixes and enhancements although didnt notice anything significantly impactful.</p> <p>Installed Neovim 0.9.5 by downloading the <code>nvim.appimage</code> from GitHub Releases page of Neovim repository.</p> <ul> <li>Copied the downloaded file to <code>.local/bin</code> and rename the file to include the version number, <code>nvim-0.9.5.appimage</code>. -</li> <li>Change the file to be executable, <code>chmod u+x nvim-0.9.5.appimage</code>.</li> <li>Updated the <code>.local/bin/nvim</code> symlink to point to the new version.</li> <li>ran <code>nvim</code> command to check neovim work without configuration</li> <li>ran <code>astro</code> command to chekc neovim works with AstroNvim configuration</li> </ul> <p>Upgraded successful.</p> <p>Noticed I had only been using Neovim 0.9.2 on one machine, so good time to upgrade.</p>"},{"location":"breaking-ground-on-the-new-year/#building-teams","title":"Building teams","text":"<p>It can be challenging joining a very busy team. Blalancing the need to minimise disruption of the existing teams work with taking the teams time to enable new people to have enough knowledge to start contributing.</p> <p>Identifying specific knowledge transfer topics and timeboxed meetings are an effective approach, especially when coupled with good documentation and architecture diagrams.</p>"},{"location":"breaking-ground-on-the-new-year/#macosx-environment-variables","title":"MacOSX environment variables","text":"<p>Finally found a working approach to running desktop apps that are configured with an environment variable, e.g. Neovide GUI for Neovim with the AstroNvim configuration and Emacs with a custom location (XDG) Spacemacs user configuration.</p> <p>The <code>launchctl</code> command can set an environment variable that will be used with GUI apps launched from the MacOSX spotlight (or similar desktop launchers).</p> <p>Neovide with Astronvim config</p> <pre><code>launchctl setenv NVIM_APPNAME astronvim\n</code></pre> <p>Emacs with Spacemacs config</p> <pre><code>launchctl setenv SPACEMACSDIR /User/practicalli/.config/spacemacs\n</code></pre> <p>Adding environment variables in the user <code>.profile</code> or <code>.zprofile</code> files did not make a difference, even after a reboot of MacOSX.</p>"},{"location":"breaking-ground-on-the-new-year/#github-statistics","title":"GitHub statistics","text":"<p>GitHub Wrapped is an online app that generates visualisation from contributions for a specific GitHub account.</p> <p></p>"},{"location":"breaking-ground-on-the-new-year/#github-trends","title":"GitHub Trends","text":"<p>GitHub Wrapped uses GitHub Trends which can be used to create a deep dive into the GitHub API to surface metrics about code contributions.</p> <p>GitHub Trends computes metrics based on your individual commits, rather than look at contributions to repositories.</p> <p>Generate insights on lines written by language, repository, and time. Easily embed dynamic images into your GitHub profile to share your statistics with the world.</p> <p>Create an account with GitHub Trends Then, paste this string into your Markdown content, substituting your username.</p> <p>Markdown Code for GitHub trends language view</p> <pre><code>[](https://githubtrends.io)\n</code></pre> <p>Communicate directly with Use the GitHub Trends API to create customize cards.</p> <p>Thank you.</p> <p> Practical.li Website</p> <p> Practical.li GitHub Org practicalli-johnny profile</p> <p> @practicalli@clj.social @practical_li</p>"},{"location":"start-of-a-long-journey/","title":"Start of a long journey","text":"<p>2024 feels like a long year that will happen very quickly</p>"},{"location":"start-of-a-long-journey/#emacs","title":"Emacs","text":"<p>Working through the Practicalli Spacemacs book and updating screenshots, key bindings with key board keys and generally improving content.</p>"},{"location":"start-of-a-long-journey/#practicalli","title":"Practicalli","text":"<p>Continuing to update repository health files by adding a Creative Commons license to all Practicalli repositories. Using the license text from Choose A Licence - Creative Commons SA 4.0</p> <p>Thank you.</p> <p> Practical.li Website</p> <p> Practical.li GitHub Org practicalli-johnny profile</p> <p> @practicalli@clj.social @practical_li</p>"},{"location":"quiet-before-the-storm/","title":"Quiet before the storm","text":"<p>Its not as windy as previous weeks, but there is another storm on its way.</p> <p>Feeling too tired for exercise over the weekend, need to pace myself at work a little better.</p> <p>Hopefully as the weather gets warmer or at least sunnier it will be easier to do more outside activities.</p>"},{"location":"quiet-before-the-storm/#practicalli-neovim","title":"Practicalli Neovim","text":"<p>Updating the section on basic use of Neovim, especially around register usage.</p> <p>Registers feel more useful in Neovim as there is no kill-ring history as provided by Spacemacs. The Neovim registers provides much more opportunities to save text in different registers, although the learning curve is steeper than cycling through kill-ring history in Spacemacs.</p> <p>Recent commits:</p> <ul> <li>basics: add register type summary</li> <li>basics: add visual line and block commands</li> <li>intro: add :help news to features page</li> <li>basics: creating a directory with telescope or commands</li> <li>intro: update conceptual REPL workflow image</li> </ul>"},{"location":"quiet-before-the-storm/#practicalli-blog","title":"Practicalli Blog","text":"<p>Continuing to migrate the Practicalli Blog, moving from Cryogen to Material for MkDocs.</p> <p>Cryogen is a very good tool for generating static sites for blogs, with relatively simple to modify templates. However, the templates are not as professional looking as those of Material with MkDocs in my humble opinion.</p> <p>Cryogen was not really designed for generating websites for the Practicalli books without some heavy modification. I would rather spend time creating the content than maintaining a bespoke tool.</p> <p>Migrating the articles to Material for MkDocs is mostly updating the header format for each article. However it also provides an opportunity to review and refine each article, improving the prose and using MkDocs features to improve the visual appeal of each post.</p> <p>Practicalli Blog usng Material for MkDocs</p>"},{"location":"quiet-before-the-storm/#entertainment","title":"Entertainment","text":"<p>Started watching \"See\" series on Apple.tv and its reasonably enjoyable. It is a good way to switch off from work whilst I nudge some Practicalli tickets to closed state.</p>"},{"location":"quiet-before-the-storm/#health","title":"Health","text":"<p>Feeling rough in the mornings, sore throat and lots of coughing. Occasionally feeling exhausted during the day, so need to adjust my pace each day and spread the work more throughout the day.</p> <p>Thank you.</p> <p> Practical.li Website</p> <p> Practical.li GitHub Org practicalli-johnny profile</p> <p> @practicalli@clj.social @practical_li</p>"},{"location":"no-one-is-omnipotent/","title":"No one is omnipotent","text":"<p>Understand what is the most valuable thing and focus on attaing it.</p> <p>Technical writing is a skill that regularly needs practice.</p>"},{"location":"no-one-is-omnipotent/#practicalli-blog","title":"Practicalli Blog","text":"<p>Rewriting many of the existing articles, to update content with newer approaches and to improve the prose of each article.</p>"},{"location":"no-one-is-omnipotent/#health","title":"Health","text":"<p>Felt good after the weekend cycle and recovery weekend.</p> <p>Started to feel rough on Tuesday and started taking maximum dose of paracetamol to fight-off inflamation symptoms.</p> <p>Unfortunately my health continues to degrade and I need a lot more rest at the moment.</p> <p>Thank you.</p> <p> Practical.li Website</p> <p> Practical.li GitHub Org practicalli-johnny profile</p> <p> @practicalli@clj.social @practical_li</p>"},{"location":"flexiana-interview/","title":"Flexiana Interview","text":"<p>I enjoyed the interview with Flexiana team this week, they are very friendly and it we had some very interesting discussions. I included my interview preparation notes which were mosty the same as shared in the video.</p> <p>A blip with Emacs 29.4 release stopped the which-key menu from showing when in a major mode. This affected both the leader and local leader key. Within a couple of hours the issue was resolved before I really figured out the cause. I installed Emacs 29.4 on Termux to replicate an issue that was reported in the #spacemacs channel of the Clojurians Community slack community.</p>","tags":["clojure"]},{"location":"flexiana-interview/#flexiana-interview","title":"Flexiana Interview","text":"<p>Flexiana inquired about an interview and I suggested they send through some questions they wanted to ask. It was a video interview and I find it very useful prepare for the questions so I know what I can say during the video call. Without questions up front it can take much longer to form my replies and is very easy to miss interesting things to say.</p> <p>I felt the call went very well and there was scope for some additional questions around Spacemacs. I also got in a mention of Neovim too.</p> <p>The interview will appear on the video Flexiana YouTube channel</p> <p>The questions and notes I made for the questions follow:</p>","tags":["clojure"]},{"location":"flexiana-interview/#how-did-you-transition-to-working-with-clojure","title":"How did you transition to working with Clojure?","text":"<p>I fell into Clojure by accident. I had attended a talk by Rick Hickey in London at SkillsMatter in 2009, but it took a while before I really understood why I would invest time in Clojure. The language did seem quite strange compared to what I was use too.</p> <p>I was developing an interested in functional programming at that time, as the Object Oriented design approach seemed to be less appropriate for some of the data intensive systems I was trying to model. I remembered how intriguing Haskell functional programming was from course at university and how I was starting to get a good grip of the language by the time the course ended, although more than a decade had passed since then.</p> <p>Scala was very popular at that time and I was friends with people organising the London Scala User Group. I wanted to organise a event where we could practice the language, so started a Scala code dojo event. Having never run such a code dojo event, I went to the London Cojurians code dojo events to see how it was done.</p> <p>After several months of going to the Clojure code dojo I woke up one day and felt I had 'got' Clojure. I had finally found a language and community that cared about simplicity and had a language that could easily represent that simplicity.</p> <p>It took many years to get my first commercial Clojure role, but learning Clojure through the community was very rewarding.</p> <p>I started an event called Hack The Tower in the Salesforce / Heroku offices, running once a month on a Saturday. People from the Java Scala and Clojure communities were invited and I organised them into groups to the could collaborate on projects or simply learn together. I started running an all day Clojure workshop as I discovered trying to lead others into Clojure was a great way to learn Clojure myself. Hack The Tower ran for 5 years, until I left Salesforce (and had no office or budget anymore).</p> <p>Eventually I was accepted for a commercial Clojure role in 2017 at Citi (large international finance institute) and since then have worked for a variety of startup companies using Clojure.</p>","tags":["clojure"]},{"location":"flexiana-interview/#are-you-an-active-clojure-developer-or-a-manager","title":"Are you an active Clojure developer or a manager?","text":"<p>I have been an active Clojure engineer commercially since Citi.</p> <p>After my health was significantly impacted by Covid I felt more useful by taking an engineering manager role. This is the role I currently have at Griffin.</p> <p>I write Clojure code for community projects, especially Practical.li. I can do this work at my own pace and to satisfy my own high code standards, without the pressure of deadlines.</p>","tags":["clojure"]},{"location":"flexiana-interview/#what-do-you-see-as-the-best-on-clojure","title":"What do you see as the best on Clojure?","text":"<p>Simplicity is the most important characteristic to me, both of the Clojure language itself and the design approach to building systems with Clojure.</p> <p>All other languages I've worked with try to model the complexity of the world, leading to complex systems that are very hard to maintain and extend.</p> <p>A simple approach to design creates code that is far easier to maintain and extend. A large number of code libraries can be combined to make a complex system whist still retaining the maintainability and extensibility of the code.</p> <p>Data as a central design tool is also incredibly important. A Data approach supports simplicity and helps break down complex requirements into simple models. When that data is immutable, then it is really easy to reason about the behaviour of code that is transforming that data.</p> <p>And the Clojure REPL is a unique experience I have never had with other languages. To instantly get feedback on what the code does or to quickly deconstruct code and evaluate its parts in a live environment has been invaluable for optimising learning.</p>","tags":["clojure"]},{"location":"flexiana-interview/#what-types-of-people-clojure-attracts","title":"What types of people Clojure attracts ?","text":"<p>In the early days of Clojure it was predominantly experienced Java engineers that wanted to do something different or saw the advantage of the simplicity of Clojure.</p> <p>Around 2013-14 ClojureScript really started to take off, widening the audience and also making front end development more accissible for engineers that only had back-end experience. Figwheel, Reagent and Reframe projects really help in the early days of ClojureScript.</p> <p>Over the last 5 years I have seen much more diversity in those using the language. I've met many people using Clojure as their first commercial programming language. There are many people from Data Science community using Clojure or Clojure / Python combinations.</p> <p>I believe Clojure is now seen as the general purpose language it truly is and a language that anyone can readily adopt.</p>","tags":["clojure"]},{"location":"flexiana-interview/#if-you-didnt-use-clojure-what-language-would-you-use","title":"If you didn't use Clojure what language would you use?","text":"<p>If I wasnt able to use Clojure I would look for a commercial role that didnt include coding. Or invest some time on open source Clojure projects and see if I could raise enough sponsorship that I would not need a commercial role. Or I could retire and live a very modest life.</p> <p>I am not aware of any programming language that has the emphasis on simplicity that I get with Clojure.</p> <p>Java is a great language for a career and will remain so for the foreseeable future, but feels very verbose after Clojure. Python has a lot of advantages for data science, although there are lots of Clojure projects too.</p>","tags":["clojure"]},{"location":"flexiana-interview/#important-skills-sought-when-assembling-an-engineering-team","title":"Important skills sought when assembling an engineering team?","text":"<p>Learning and communicating. Without these fundamental skills and motivation to want to apply them every day, then a team is only ever a collection of individuals and rarely excels.</p> <p>Learning is important as you are always creating something new, something that does not exist already (as if it existed already, why would you create it again). Team members need to appreciate that they can learn from anyone and everyone, no matter if they are technical or business focused or what level of experience they have.</p> <p>Communicating effectively is vital to avoid becoming your own silo. Actively communicating builds relationships within and outside the team and unless the company is only every 1 person, you need strong relationships to get anything significant done.</p>","tags":["clojure"]},{"location":"flexiana-interview/#what-are-your-current-personal-projects","title":"What are your current personal projects?","text":"<p>You have a long history of daily commits on GitHub, so what are the personal projects you currently work on ?</p> <p>I founded Practical.li</p> <p>I also write a journal capturing the thoughts, discoveries and activities each week. The journal helps to give me a sense of progress and supports self-motivation (I know I have done meaningful things and often surprise myself how much I have achieved).</p>","tags":["clojure"]},{"location":"flexiana-interview/#perspectives-gained-from-career-breaks","title":"Perspectives gained from career breaks ?","text":"<p>You had a career break where you worked as a courier, cycling about 100km per day. How did that experience impact your perspective on work and life?</p> <p>There is more to life than working, which is very easy to forget when your personal interests and work are very strongly aligned.</p> <p>Stepping away from the software industry also allowed a chance to reflect on what I really enjoyed and what value I could bring to a commercial company or open source project. In essence, stepping away for a year gave me perspective.</p> <p>There were some unexpected challenges being a cycle courier. Essentially each courier is continually solving the \"Travelling Salesman\" puzzle. The controller tells the courier which packages to collect and the courier has to decide when to deliver each parcel, as they are collecting more parcels. Typically a courier would have 5-10 parcels \"on-board\" at any time during the day, if they were to make enough money to live on.</p> <p>As a courier you are self-employed, so it gave me some insight into the world of finance and taxation.</p> <p>As it was difficult to make a comfortable amount of money as a cycle courier, it did make me appreciative of the good salaries that can be obtained as a software engineer.</p> <p>Thank you.</p> <p> Practical.li Website</p> <p> Practical.li GitHub Org practicalli-johnny profile</p> <p> @practicalli@clj.social @practical_li</p>","tags":["clojure"]},{"location":"monthly-library-updates-for-practicalli-projects/","title":"Monthly Library Updates for Practicalli Projects","text":"<p>Monthly updates for Practicalli projects, driven by a scheduled version GitHub workflow that uses antq to report on project library dependencies and GitHub action library versions.</p> <ul> <li>Release: Clojure CLI Config - 2024-07-07</li> <li>Release: Project Templates - 2024-07-07</li> </ul> <p>Which-key version 3 released, fixing localleader issue and providing a horizontal menu option.</p>","tags":["clojure"]},{"location":"monthly-library-updates-for-practicalli-projects/#neovim","title":"Neovim","text":"<p>Which-key version 3 released and resolves the issue with the <code>localleader</code> key mapping not working until after the <code>leader</code> key has been pressed.</p> <p>New layout options for placement of the menu. I find the vertical nature of the <code>helix</code> layout quicker to read than the horizontal <code>classic</code> or <code>modern</code> layouts.</p> <p>In AstroNvim, set the layout by adding a config for which-key to a user lua file, e.g. <code>lua/plugins/user-practicalli.lua</code></p> lua/plugins/user-practicalli.lua<pre><code> {\n \"folke/which-key.nvim\",\n opts = {\n ---@type false | \"classic\" | \"modern\" | \"helix\"\n preset = \"helix\",\n },\n },\n</code></pre> <p>Restart Neovim and the which-key will now show the new layout.</p>","tags":["clojure"]},{"location":"monthly-library-updates-for-practicalli-projects/#conjure-sub-menus","title":"Conjure sub-menus","text":"<p>I've raised an issue to add the conjure sub-menus via which-key.</p> <p>In the mean time, a quick hack has been added to the <code>lua/plugins/user-practicalli.lua</code> config (although only locally so far)</p> <pre><code>local whichkey = require \"which-key\"\n\n {\n \"folke/which-key.nvim\",\n opts = {\n ---@type false | \"classic\" | \"modern\" | \"helix\"\n preset = \"helix\",\n },\n\n -- Conjure sub-menus (not the ideal place)\n whichkey.add {\n { \"<localleader>c\", group = \"Connection\" }, -- group\n { \"<localleader>e\", group = \"Evaluation\" }, -- group\n { \"<localleader>l\", group = \"REPL Log\" }, -- group\n { \"<localleader>r\", group = \"Refresh\" }, -- group\n { \"<localleader>s\", group = \"REPL Session\" }, -- group\n { \"<localleader>t\", group = \"Test\" }, -- group\n { \"<localleader>v\", group = \"Values\" }, -- group\n },\n },\n</code></pre> <p>Thank you.</p> <p> Practical.li Website</p> <p> Practical.li GitHub Org practicalli-johnny profile</p> <p> @practicalli@clj.social @practical_li</p>","tags":["clojure"]},{"location":"montly-clojure-library-updates/","title":"Montly Clojure Library updates","text":"<p>Exploring the mysteries of the Bazel build tool at work. Whilst technically its a very powerful tool it really lacks a good developer experience.</p> <p>Its supposed to be a more powerful make, although ironically I use a <code>Makefile</code> so that Bazel is much easier to use.</p> <p>It could be an opportunity to use Babashka, but that would be more work than using a Makefile as I dont have much Babashka experience.</p>","tags":["clojure","bazel","make"]},{"location":"montly-clojure-library-updates/#clojure-cli-config","title":"Clojure CLI Config","text":"<p>Monthly library version updates, including newer versions of actions in the Quality Checks GitHub workflow</p> <p>Also updated the version of the Practicalli Project Templates in the <code>:project/create</code> alias. The templates have been updated to use <code>org.clojure/clojure</code> version <code>1.10.3</code>, which addresses security concerns (although very unlikely to be exploited).</p>","tags":["clojure","bazel","make"]},{"location":"montly-clojure-library-updates/#bazel","title":"Bazel","text":"<p>Bazel is a very powerful tool although not very user friendly. Bazel is described as a more powerful <code>make</code> tool, however, I have ended up using <code>make</code> to wrap many of the bazel commands to give a much more usable experience.</p> <p>Thank you.</p> <p> Practical.li Website</p> <p> Practical.li GitHub Org practicalli-johnny profile</p> <p> @practicalli@clj.social @practical_li</p>","tags":["clojure","bazel","make"]},{"location":"data-driven-components--neovim-updates/","title":"Data Driven Components & Neovim updates","text":"<p> Practicalli Astro config for Clojure development with Neovim initial release.</p> <p>Presented my experiences with Component libraries to London Clojurians this week, specifically comparing Integrant and Donut-party/system. I discussed my Service REPL workflow to show the benefits and constraints of these two libraries.</p> <p>For component libraries to work well, then code should be reloadable. There are a few parts of the Clojure language that do make it harder to reload code, (deftype, defrecord, etc), although I tend to avoid those parts anyway.</p> <p>Issues this week</p> <p> practicalli/astro:</p> <ul> <li>DONE search: find text pattern in specific files and file types</li> <li>DONE config: capitalise Leader & LocalLeader - vim convention</li> <li>DONE plugin: conjure sub-menu key labels in which-key version 3</li> <li>DONE plugin: spectre moved to search category in astrocommunity</li> <li>DONE plugin: better-escape.nvim rewrite required config change</li> </ul>","tags":["clojure","donut","integrant","neovim","astro"]},{"location":"data-driven-components--neovim-updates/#neovim","title":"Neovim","text":"<p>Once AstroNvim version 4 was release the Practicalli config was recreated from the new AstroNvim template (April 2024).</p> <p>After several months experimentation and testing of the new configuration, Practicalli Astro was officially released this week.</p>","tags":["clojure","donut","integrant","neovim","astro"]},{"location":"data-driven-components--neovim-updates/#london-clojurians","title":"London Clojurians","text":"<p>Sharing my experiences of using a REPL driven approach to Clojure services, including experiences of using Integrant and Donut-party/system libraries for managing the component parts of a service.</p> <ul> <li>Practicalli Clojure Web Services - Service REPL</li> <li>generated projects from the <code>:practicalli/service</code> template of Practicalli Project Templates</li> <li>Clojure API service managing components with an atom</li> <li>Clojure API service managing components with Integrant & Integrant REPL</li> <li>Clojure API service managing components with Donut-party/system</li> </ul> <p>Meld comparison of generated projects</p> <p>The projects purposely have a similar structure (after several refactor sessions) so should be easy to compare.</p> <p>TODO: add screenshots</p>","tags":["clojure","donut","integrant","neovim","astro"]},{"location":"data-driven-components--neovim-updates/#health-welbeing","title":"Health & Welbeing","text":"<p>Lots of cycling and walking this month.</p> <p>Cycle ride to Lehnam with some members of the local Bigfoot Cycling Club. 150km ride, ascending ...</p> <p>One rider had several punctures and only one tube of the right size. Several patches were applied to no success. I did have the opportunity to impart some skills when it came to removing and fitting a bicycle tyre with the group.</p> <p>Thank you.</p> <p> Practical.li Website</p> <p> Practical.li GitHub Org practicalli-johnny profile</p> <p> @practicalli@clj.social @practical_li</p>","tags":["clojure","donut","integrant","neovim","astro"]},{"location":"a-very-hot-week/","title":"A very hot week","text":"<p>Its a bit too hot for rational thought... and caught flu at the end of the week, so not much happened.</p> <p>Time for some project maintenance courtesy of the scheduled version GitHub workflow, run at the start of each month.</p> <p>Thank you.</p> <p> Practical.li Website</p> <p> Practical.li GitHub Org practicalli-johnny profile</p> <p> @practicalli@clj.social @practical_li</p>","tags":["clojure"]},{"location":"fixing-neovim-treesitter-breaking-changes/","title":"Fixing Neovim Treesitter breaking changes","text":"<p>The sun is out, the sky is blue... and I had the opportunity to understand some Neovim plugins a little more, in order to fix a breaking change with Neovim Treesitter support for Clojure.</p> <p>Pull Requests this week</p> <ul> <li>MERGED: #7 queries: clojure has-type? updated to kind-eq? for nvim-treesitter-sexp project</li> </ul>","tags":["neovim","astronvim","github","ssh"]},{"location":"fixing-neovim-treesitter-breaking-changes/#neovim","title":"Neovim","text":"<p>A breaking change in <code>nvim-treesitter</code> affects the <code>nvim-treesitter-sexp</code> plugin which provides paredit style structural editing for Clojure.</p> <p><code>nvim-treesitter</code> committed a change that requires queries to use <code>kind-eq?</code> rather than the previous <code>has-type?</code>.</p> <p>The breaking change only affected the queries for the Clojure language, all other languages supported by <code>nvim-treesitter-sexp</code> were unaffected.</p> <p>A quick solution would be to pin <code>nvim-treesitter</code> plugin to an earlier version, such as <code>v0.9.2</code> released on 19 January 2024</p> <p>Pin plugin to specific version</p> <pre><code> \"nvim-treesitter/nvim-treesitter\",\n version = \"0.9.2\",\n</code></pre> <p>A plugin can be pinned to its current version by adding <code>pin = true</code> to the plugin configuration. No further updates will e made to the package and avoids a known issue in an new release of that plugin.</p> <p>Pin plugin true</p> <pre><code> \"nvim-treesitter/nvim-treesitter\",\n pin = true,\n</code></pre> <p>The long term solution is to update <code>nvim-treesitter-sexp</code> to use the new <code>kind-eq</code> in its clojure query.</p> <p>Only one occurance of <code>has-type</code> was found in the nvim-treesitter-sexp source code.</p> <p>After forking the <code>nvim-treesitter-sexp</code> repository, the <code>has-type</code> line was changed to use <code>kind-eq</code> and the commit pushed to the fork.</p> <p>The local clone of Practicall Asto Config was updated to use the fork and branch used for the change</p> <p>Using Practicalli fork of nvim-treesitter-sexp</p> <pre><code> {\n -- \"PaterJason/nvim-treesitter-sexp\",\n \"practicalli-johnny/nvim-treesitter-sexp-fork\",\n branch = \"treesitter-has-type-to-kind-eq\",\n -- commit = \"\",\n dependencies = { \"nvim-treesitter/nvim-treesitter\" },\n ft = { \"clojure\", \"fennel\", \"janet\", \"query\" },\n cmd = \"TSSexp\",\n opts = {},\n },\n</code></pre> <p>Disabling the AstroNvim Clojure pack in the <code>lua/plugins/clojure.lua</code> by commenting the import line and running a Lazy plugin manager update, Space p U or <code>:Lazy update</code>, removed the <code>nvim-treesitter-sexp</code> plugin and replaced it with the Practicalli fork.</p> <p>With a few slurp and barf commands to test the simple change in the fork, it seems that change has fixed the error.</p> <p>Once the maintainer has merged the PR (or come up with a more appropriate fix), then I can revert back to the AstroNvim Community Clojure pack and simplify my config a little.</p>","tags":["neovim","astronvim","github","ssh"]},{"location":"fixing-neovim-treesitter-breaking-changes/#github","title":"GitHub","text":"<p>The GitHub keys page for an account lists all the authorisation and signing keys registered.</p> <p>Each key shows its unique SHA, rather than the key value, for security reasons.</p> <p>To identify if an SSH key is registered with GitHub, use the <code>ssh-keygen</code> command to show the SHA for public key file, <code>*.pub</code>.</p> <p>Show SHA of public key with ssh-keygen</p> <pre><code>ssh-keygen -lf ~/.ssh/key-name.pub\n</code></pre> <p>Copy the SHA value generated by the <code>ssh-keygen</code> command and search for that value on the GitHub keys page.</p> <p>Thank you.</p> <p> Practical.li Website</p> <p> Practical.li GitHub Org practicalli-johnny profile</p> <p> @practicalli@clj.social @practical_li</p>","tags":["neovim","astronvim","github","ssh"]},{"location":"neovim-on-termux-enhancements/","title":"Neovim on Termux enhancements","text":"<p>More Neovim updates and getting closer to a release of Practicalli Astro-config</p> <p>I have been using Neovim (and Emacs) on Termux, so I can code on my Android tablet or Android smart phone. I typically use an external keyboard (e.g. Keyboard.io Atreus or Model100), especially when considerable typing is involved.</p> <p>As the hardware and compilation tooling is different for Android Linux (compared to amd64 linux) the Clojure and Lua LSP language servers would not install via the Mason manager. As these two languages are in the top 3 languages I use, then it is a great boost to get these servers working locally and configuring Neovim to use them instead.</p> <p>I use the <code>date</code> command when I had a need to tweak the time on my Linux computer, saves launching the Settings app and using the mouse.</p> <p>Timezones made easy</p> <p>time.is makes figuring out timezones really simple. See the current time in any timezone across the world.</p> <p>time.is very useful for events where people attend from different timezones. Set the local time and share a link for others who will see the event time in their own timezone.</p>","tags":["neovim"]},{"location":"neovim-on-termux-enhancements/#neovim","title":"Neovim","text":"<p>I'm making some changes to the Practicalli AstroNvim configuration (AstroNvim4) over the next few days.</p> <p>All my personal Neovim & plugin options (and associated workflow biases) will only be in <code>lua/plugins/practicalli.lua</code>. With these options only in one file, anyone else using the configuration can easily disable them.</p> <p>I will encourage other users to create there own <code>lua/plugins/personal.lua</code> customisation so any changes from upstream will be easier to merge.</p> <p>The GitHub repository will be renamed to <code>practicalli/astro-config</code> which its much easier to write and say during screencasts. GitHub should redirect when pulling updates</p> <p>This week I will update Practicalli Neovim book install guide with new repo and further info on how to use the config effectively (especially with your own customisations)</p> <p>Then the first official release of the config will be created via GitHub releases.</p> <p>If I have time, there are lots of things to add to Practicalli Neovim book too (including a few more plugins I'm using in the config)</p>","tags":["neovim"]},{"location":"neovim-on-termux-enhancements/#neovim-and-termux","title":"Neovim and Termux","text":"<p>Neovim (and Emacs) run very well on Termux, the Android app that runs a user space Linux distribution. As its user space, the Android device does not need to be rooted, simply install the F-Droid Marketplace app and install its Termux application.</p> <p>Install Neovim & Clojure on Android</p> <p>Create an ultra-mobile Clojure development environment with Termux app.</p> <p>Ultra-mobile development environment with Android</p>","tags":["neovim"]},{"location":"neovim-on-termux-enhancements/#local-lsp-servers","title":"Local LSP servers","text":"<p>The LSP language servers for Clojure and Lua do not install via Mason.</p> <p>Clojure LSP server is not compiled for Android Linux, although the jar release does work.</p> <p>Lua language server is available as the <code>lua-language-server</code> Termux package.</p>","tags":["neovim"]},{"location":"neovim-on-termux-enhancements/#neovim-010x-not-available-yet","title":"Neovim 0.10.x not available yet","text":"<p>Pin neogit to <code>'v0.0.1'</code> as later versions of the project use Neovim 0.10.x specific API calls.</p> <p>Neogit will not setup if using a later version of the project with Neovim 0.9.x</p> <p>Pedantic Pinning packages with Lazy package manager</p> <p><code>'v0.0.1'</code> had to be used as a value with the <code>tag</code> keyword for the lazy plugin manager configuration.</p> <p>Using <code>\"v0.0.1\"</code> as the <code>tag</code> value failed to use that Git tag and the head was used instead.</p> <p>Its not clear why <code>tag</code> requires a value wrapped in <code>''</code> rather than <code>\"\"</code>. The Lua String Data Type is any sequence of zero or more characters surrounded by single quotes or double quotes.</p>","tags":["neovim"]},{"location":"neovim-on-termux-enhancements/#neovim-config-feedback-session","title":"Neovim Config feedback session","text":"<p>vim-jack-in opens in a Terminal console. The buffer should show as Terminal at the bottom bar</p> <p>Ctrl+\\ Ctrl+n to leave the Terminal mode, then g T or g t to switch to the source code tab (moving backward or forward through the tab pages)</p> <p>Would be useful to add a key mapping for terminal mode, so that <code>Esc</code> could be used instead.</p> <p>Related Clojurians Slack discussion</p>","tags":["neovim"]},{"location":"neovim-on-termux-enhancements/#linux-set-date-and-time-via-command-line","title":"Linux - set date and time via Command line","text":"<p>The date and time used by the Linux Operating System can be configured in the Settings app that comes with most Linux desktops, e.g. Regolith Linux, Gnome, KDE, etc. The settings app should also control if date/time is managed by a Network Time Protocol (NTP) server.</p> <p><code>date</code> will show the current date, time and timezone</p> <p><code>date</code> with the <code>-s</code> option sets the current time and date, or only the time if the date is not provided.</p> <p>Root Adminstration preveledges required to set date</p> <p><code>su -</code> or <code>sudo</code> is required to run the <code>date</code> and <code>timedatectl</code> commands</p> <p>Set Time and date</p> <pre><code>date -s '2024-05-18 20:32:00'\n</code></pre> <p>Set Time only</p> <pre><code>date -s '20:32:00'\n</code></pre> <p>The Linux Operating system may be using a Network Time Protocol (NTP) server to keep the date and time correct.</p> <p>Disable the NTP server update if the date is automatically being corrected to the current date and time.</p> <p>Disable NTP automatic date and time updates</p> <pre><code>timedatectl set-ntp false\n</code></pre> <p>Enable NTP automatic date and time updates</p> <pre><code>timedatectl set-ntp true\n</code></pre> <p>Thank you.</p> <p> Practical.li Website</p> <p> Practical.li GitHub Org practicalli-johnny profile</p> <p> @practicalli@clj.social @practical_li</p>","tags":["neovim"]},{"location":"conjure-lsp-bug--cycling-video-editing/","title":"Conjure LSP bug & Cycling video editing","text":"<p>Updated to Kitty 0.35.1 easily and switching between dark and light themes working instantly again.</p> <p>Diagnosed a 'new buffer' error with Conjure when using Neovim 0.9.0 and when opening a Clojure file, although everything works well in 0.10.0. EDIT: The maintainer added a fix to the <code>develop</code> branch for testing.</p> <p>#582 REVIEW: Conjure throws new Buffer error</p> <p>Video editing of footage taken by the front mounted camera on my bicycle. Advanced cycle training at Gravesend at the start of June. Bigfoot Cycling Club at Gravesent Cyclopark</p> <p>Took a few days away from the computer to work on the garden as its nice and sunny. A mostly sunny ride on Saturday around the Kent countryside.</p>","tags":["clojure","conjure","neovim","cycling"]},{"location":"conjure-lsp-bug--cycling-video-editing/#conjure-clojure-lsp","title":"Conjure & Clojure LSP","text":"<p>Language Server Protocol in Neovim is very good, although there are occasional breaking changes that plugin maintainers keep on top of.</p> <p>I migrated to Neovim 0.10.0 a few weeks after it was release and everything is working very well.</p> <p>A change in Conjure Clojure Plugin was made to disable diagnostics in the REPL log which included support for a breaking function name. There is now a fix in the <code>develop</code> release for Conjure that also supports Neovim 0.9.0.</p> <p>#582 Conjure throws new Buffer error</p>","tags":["clojure","conjure","neovim","cycling"]},{"location":"conjure-lsp-bug--cycling-video-editing/#neovim","title":"Neovim","text":"<p>Continuing to tidy up the AstroNvim configuration in practicalli/astro so all my plugin configuration overrides are within a specific file or <code>lua/plugins/user-practicalli.lua</code></p>","tags":["clojure","conjure","neovim","cycling"]},{"location":"conjure-lsp-bug--cycling-video-editing/#neogit","title":"Neogit","text":"<p>Moved Space g s which-key menu override to the central key mapping override config in <code>lua/plugins/user-practicalli.lua</code>, i.e. <code>[\"<leader>gs\"] = { \"<cmd>Neogit<cr>\", desc = \"Status (Neogit)\" },</code></p> <p>Move the neogit plugin config from <code>lua/community.lua</code> to <code>lua/plugins/user-practicalli.lua</code>.</p> <p>Added <code>graph_style = \"unicode\"</code> for elegantly rendered commit graphs (e.g. vim-flog)</p> <p>Cleaned up Neogit overrides</p> lua/plugins/user-practicalli.lua<pre><code> {\n \"NeogitOrg/neogit\",\n dependencies = {\n { \"nvim-lua/plenary.nvim\", \"sindrets/diffview.nvim\" },\n },\n opts = {\n disable_signs = true, -- duplicate signs if enabled\n graph_style = \"unicode\", -- elegant commit graph\n integrations = { diffview = true },\n },\n },\n</code></pre>","tags":["clojure","conjure","neovim","cycling"]},{"location":"conjure-lsp-bug--cycling-video-editing/#noice-and-notifications","title":"Noice and Notifications","text":"<p>Move Noice options to <code>lua/plugins/user-practicalli.lua</code>. It only has one option to set a boarder around LSP popups, e.g. Space l d diagnostics popup.</p> <p><code>nvim-notify</code> adds options to show message popups fro the bottom upward (less distracting to me), a quicker time-out for showing the message (Space f n to see notification history) and fewer message types, <code>level = 3</code>.</p> <pre><code> {\n \"noice.nvim\",\n opts = function(_, opts)\n local utils = require \"astrocore\"\n return utils.extend_tbl(opts, {\n presets = {\n lsp_doc_border = true, -- add a border to hover docs and signature help\n },\n })\n end,\n },\n -- nvim-notify controls how messages are displayed\n {\n \"rcarriga/nvim-notify\",\n opts = {\n top_down = false,\n timeout = 2000, -- shorter display duration, default 3000\n -- log messages level - default 5 (everything), 1 (minimum)\n level = 3,\n -- background_color = \"#000000\",\n },\n },\n</code></pre>","tags":["clojure","conjure","neovim","cycling"]},{"location":"conjure-lsp-bug--cycling-video-editing/#advanced-cycle-training","title":"Advanced Cycle Training","text":"<p>Bigfoot trip to Gravesend Cycle park for 3 hours of advanced cycle training. Activities include</p> <ul> <li>pursuit: lead rider cycles off to catch the pack from behind</li> <li>cornering: hitting the apex of the corner tight, using drops of handlebar to get really tight</li> <li>cornering in pairs: ensuring there is enough room for your partner</li> <li>cornering fast: solo cornering as fast as you can</li> <li>slalom: last rider weaves in between all riders in front, first solo and then as triple groups</li> <li>pacing: outer line of riders drop back whist inner line of riders take brief turns at front before joining outer line at front. Last rider in outer line joins inner line after call from last rider</li> </ul> <p>Video editing of the footage taken by the front mounted camera on my bicycle done using Blender video editing tool.</p> <p>Inkscape drawing tool was used to create section screens for the video, e.g. introduction slide and a slide for each activity. Inkscape slides are SVG images, exported to PNG images for use with Blender video editing.</p> <p> Bigfoot Cycling Club at Gravesent Cyclopark - 2 minute highlight</p> <p> Bigfoot Cycling Club at Gravesent Cyclopark - 6 minute highlight</p> <p>Bigfoot at Cyclopark - all activities</p>","tags":["clojure","conjure","neovim","cycling"]},{"location":"conjure-lsp-bug--cycling-video-editing/#saturday-cycle-ride","title":"Saturday Cycle ride","text":"<p>A 71km ride in the Kent countryside for 3 and a half hours. Starting off in cloudy weather turning steadily into really sunny ride, except for an impromptu hail storm for about 5 minutes.</p> <p>Strava: Club ride level 4 - 22 June 2024</p> <p>Thank you.</p> <p> Practical.li Website</p> <p> Practical.li GitHub Org practicalli-johnny profile</p> <p> @practicalli@clj.social @practical_li</p>","tags":["clojure","conjure","neovim","cycling"]},{"location":"updating-practicalli-neovim/","title":"Updating Practicalli Neovim","text":"<p>Practicalli Astro config is not very stable so its time to refactor the Practicalli Neovim book now that the Practicalli Astro configuration is established.</p>","tags":["neovim","astronvim"]},{"location":"updating-practicalli-neovim/#practicalli-neovim","title":"Practicalli Neovim","text":"<p>Updated the book introduction and install sections. Started enhancing the Neovim basics section.</p> <p>Thank you.</p> <p> Practical.li Website</p> <p> Practical.li GitHub Org practicalli-johnny profile</p> <p> @practicalli@clj.social @practical_li</p>","tags":["neovim","astronvim"]},{"location":"springing-back-into-life-slowly/","title":"Springing back into life slowly","text":"<p>The last month has been tough due to illness, although still managed to do a little work with Practicalli to keep me motivated (both for work and my own personal health)</p> <p>I though the Practicalli Project Templates had broken when I tried to create a new service project. It took me an hour or so to realise I had simply been using the command with the wrong argument, doh!</p>","tags":["clojure"]},{"location":"springing-back-into-life-slowly/#book-quality-and-workflow","title":"Book quality and workflow","text":"<p>Improvements have been made to the quality checks each of the Practicalli books undergow before publishing.</p> <p>These improvements are helping me maintain and improve the books, especially around avoiding broken links and images during refactor of the book content.</p> <p>Moving to the Material for MkDocs tool for building the books does produce a rich experience, improving the visual appeal, navigation and content presentation options.</p> <p>Material for MkDocs is subtly different in organising content with Markdown, so there are changes to link paths and callouts (admonitions) syntax is different too.</p> <p>Most of the screenshots and graphic design images have moved to a central practicalli/graphic-design repository. Initially the links to these images used the raw.githubusercontent.com domain, which did not always render the images efficiently and was a different domain to other GitHub links.</p> <p>Images from GitHub now use the direct URL to the resource (the same github.com domain as a link) and include the <code>?raw=true</code> option to indicate it should be shown as the raw image rather than withing the surrounding GitHub page.</p> Markdown code for GitHub raw image view<pre><code>\n</code></pre>","tags":["clojure"]},{"location":"springing-back-into-life-slowly/#tweak-github-language-detection","title":"Tweak GitHub language detection","text":"<p>The Practicalli repositories for the books are often labeled as HTML language, even thought they are written in Markdown.</p> <p>GitHub uses Linguist to understand the languages used. It seems Lingusta also includes the gh-branch when identifying languages.</p> <p>For a Practicalli book repository, Linguist is detecting the HTML generated from Markdown that is committed to the <code>gh-branch</code> and therefore considers HTML as the main language.</p> <p>Markdown override used for Practicalli Websites</p> .gitattributes<pre><code>docs/** linguist-detectable\n*.md linguist-detectable=true\n*.css linguist-detectable=false\n*.js linguist-detectable=false\n*.html linguist-detectable=false\n</code></pre> Language detection not immediately updated <p>It may take many minutes for GitHub to update the languages statistics on the repository page. Linguist will not report language statistics for repositories with over 10,000 committed files.</p>","tags":["clojure"]},{"location":"springing-back-into-life-slowly/#language-overrides","title":"Language Overrides","text":"<p>Linguist Overrides are configured via a <code>.gitattributes</code> file in the root of a project.</p> <p>Paths or languages can be excluded or included.</p> <p>File extensions can be classified as a specific (non default) language</p> <p>Markdown is detectable, ignore html, js and css languages</p> .gitattributes<pre><code>*.md linguist-detectable=true\n*.html linguist-detectable=false\n*.css linguist-detectable=false\n*.js linguist-detectable=false\n</code></pre> <p>Reclassify a language - HTML to Markdown</p> .gitattributes<pre><code>*.html linguist-language=Markdown\n</code></pre>","tags":["clojure"]},{"location":"springing-back-into-life-slowly/#ignore-vendor-paths","title":"Ignore vendor paths","text":"<p>Files and directories created by tools are termed 'vendor' by Linguist. These vendored paths are ignored by default.</p> <p>Move files and directories in one of these vendored directories for them to be ignored if checked into Git.</p> <p>Or set a specific directory as vendored in the current project using the <code>.gitattributes</code> file</p> <p>Ignore generated documentation</p> .gitattributes<pre><code>docs/** linguist-vendored\n</code></pre> <p>ignore all files</p> .gitattributes<pre><code>* linguist-vendored\n</code></pre> <p>Linguist - Vendor paths ignored</p> <p> Linguist docs - overrides</p> <p>Example .gitattribute overrides repository</p>","tags":["clojure"]},{"location":"springing-back-into-life-slowly/#secure-password-manager","title":"Secure password manager","text":"<p>I've been using NordVPN and NordPass for the last year and they provide a reliable service. Although recently the NordPass desktop app has stopped working on my Ubuntu 22.04 LTS Linux server.</p> <p>The NordPass app is okay) but has some constraints I dont really enjoy</p> <ul> <li>only available as a snap</li> <li>two approaches to browser extension, one that requires the desktop app to be installed</li> </ul> <p>Ideally I prefer a password manager entirely as a browser extension. If a desktop app does add value, then it should be available as widely used <code>.deb</code> package or at least an AppImage rather than snap package.</p> <p>For Debian and Ubuntu I have switched to the standalone extension for each browser:</p> <ul> <li>Chrome: NordPass stand-alone extension</li> <li>Firefox: NordPass Password manager & Digital Valut</li> </ul> <p>I am sure Snap is technically good, but I find the user experience poor.</p> <ul> <li>requires at least 2 versions of each package installed</li> <li>requires snapd running</li> <li>essentially means there are two package managers</li> </ul> <p>As Ubuntu seems to be delivering more of its desktop Linux distribution as snap packages, I've decided to go back to Debian Linux proper.</p>","tags":["clojure"]},{"location":"springing-back-into-life-slowly/#health","title":"Health","text":"<p>Further covid infection and lingering symptoms (exhaustion, coughing, swollen glands & general inflamation) has really slowed me down during February and early March.</p> <p>I seem to be on the road to 'normalcy' and hope to start exercising more throughout March.</p> <p>Unfortunately I was not quite ready to go for a cycle ride this weekend. It seems unlikely that I will be ready for the Kent Invicta Grimpeur 100 next weekend (9th March) or even the 50km version :( Each route includes some of the largest ascents in North Kent, including York Hill that reaches a 20% gradient towards the top.</p> <p>Thank you.</p> <p> Practical.li Website</p> <p> Practical.li GitHub Org practicalli-johnny profile</p> <p> @practicalli@clj.social @practical_li</p>","tags":["clojure"]},{"location":"having-a-donut-party-with-system-components/","title":"Having a Donut Party with system components","text":"<p>Not quite back to full health yet, so took it easy at the weekend.</p> <p>More work on restoring spare bicycles so I can sell them or otherwise find a good home.</p> <p>Continued the refactor of the Practicalli Service template, specifically refining the design of the system config and helper functions to support a development REPL workflow.</p>","tags":["clojure","repl-workflow","donut"]},{"location":"having-a-donut-party-with-system-components/#astronvim-update","title":"AstroNvim update","text":"<p>Space p A to update AstroNvim, version 3.44.2</p> AstroNvim update output <pre><code> Total: 80 plugins\n\n Breaking Changes (4)\n \u25cb astrocommunity\n c730a7e feat(grapple-nvim): better keymaps + add nvim-web-devicons dependency (#781) (9 days ago)\n bbd7f7f feat(pack): add Templ language pack (#780) (10 days ago)\n 30e8aae fix(grapple-nvim)!: update to Grapple v0.10.0 (#779) (10 days ago)\n 5f484ba docs(nix): Update README.md after LSP change (#778) (11 days ago)\n 5b45d23 docs(main): Add some contribution guidelines on documentation for the packs (#773) (2 weeks ago)\n 4351fd3 chore: move to `selene` for linting (2 weeks ago)\n d9751d3 docs: add sponsor link for AstroCommunity maintainer (2 weeks ago)\n 7e0cee4 docs(rust): Fix guide on how to use clippy instead of cargo check on save (#767) (2 weeks ago)\n f6a07ff fix(markdown-preview-nvim): yarn istead of npm (#770) (2 weeks ago)\n 1327177 docs(java): Add note about root pattern (#763) (3 weeks ago)\n\n \u25cb nvim-lspconfig \uebc7 Neoconf \uea86 User AstroFile\n e5e6002 docs: update server_configurations.md skip-checks: true (6 days ago)\n 6ae4776 feat: add config for some-sass-language-server (#3057) (6 days ago)\n d006e0c fix: lexical root directory config (#3055) (6 days ago)\n 9ad7021 docs: update server_configurations.md skip-checks: true (6 days ago)\n 48364fb docs(lua_ls): change suggested setup (6 days ago)\n b1fc956 docs: update server_configurations.md skip-checks: true (6 days ago)\n 28c5e77 feat: add configuration for Tabby ML (#3050) (6 days ago)\n a1c9b24 docs: update server_configurations.md skip-checks: true (7 days ago)\n 75ab4fa fix: allow terraform-ls to start properly (#3051) (#3053) (7 days ago)\n 534a255 docs: update server_configurations.md skip-checks: true (7 days ago)\n c9f387f docs: update documentation for Volar >= 2.0.0 (#3049) (7 days ago)\n 82a4b30 fix: update lua types to match latest nightly (#3048) (7 days ago)\n 7f5cf11 docs: update server_configurations.md skip-checks: true (8 days ago)\n 280ca49 fix(beancount): rename journalFile to journal_file (#3047) (8 days ago)\n b43d52a docs: update server_configurations.md skip-checks: true (8 days ago)\n bd2e75b docs: updated documentation for `harper-ls` (#3045) (8 days ago)\n 0b4cc60 docs: update server_configurations.md skip-checks: true (8 days ago)\n f6b8701 fix(css_variable_lsp): improve default settings (#3046) (8 days ago)\n c932a56 docs: update server_configurations.md skip-checks: true (8 days ago)\n 0959fc8 fix(css-variables): change - to _ in filename (#3044) (8 days ago)\n 083e36e docs: update server_configurations.md skip-checks: true (9 days ago)\n 6a62bc1 feat: add css-variables-language-server (#3042) (9 days ago)\n 32a82a0 docs: update server_configurations.md skip-checks: true (9 days ago)\n d23cb95 docs(terraformls): add docs on how to pass settings (#3040) (9 days ago)\n 2badbe5 docs: update server_configurations.md skip-checks: true (9 days ago)\n d4f4870 feat: add pico8-ls support (#3041) (9 days ago)\n 9553725 docs: update server_configurations.md skip-checks: true (12 days ago)\n 8ec68f7 feat: add markdown-oxide lsp (#3030) (12 days ago)\n daa8ae2 docs: update server_configurations.md skip-checks: true (12 days ago)\n 078410f feat: add delphilsp support (#3034) (12 days ago)\n 0ebcaed docs: update server_configurations.md skip-checks: true (12 days ago)\n 91d12df docs(veryl_ls): update url of verly_ls (#3037) (12 days ago)\n b1a11b0 fix(pyright): fix PyrightSetPythonPath command (#3032) (2 weeks ago)\n ec7d51a docs: update server_configurations.md skip-checks: true (2 weeks ago)\n ddfc22e fix(rust_analyzer): declare single file support (#3028) (2 weeks ago)\n 16029c2 docs: update server_configurations.md skip-checks: true (2 weeks ago)\n eb89b17 docs(lua_ls): add comment about additional libraries (#3029) (2 weeks ago)\n 60c3bd3 fix(bqnlsp): do not override user provided `cmd_env` (#3026) (2 weeks ago)\n b8751ff docs: update server_configurations.md skip-checks: true (2 weeks ago)\n d0a4176 fix: let core handle 'workspace/didChangeConfiguration' after init (#3023) (2 weeks ago)\n b22610c ci: clarify misleading comment from bot (2 weeks ago)\n 1015f07 docs: update server_configurations.md skip-checks: true (2 weeks ago)\n 6b264ff feat: add bqnlsp support (#3024) (2 weeks ago)\n d5b6d43 docs: update server_configurations.md skip-checks: true (3 weeks ago)\n 5831021 fix(purescript-language-server): add 'spago.yaml' to the list of root_patterns (#3022) (3 weeks ago)\n 6b9f4bb docs: update server_configurations.md skip-checks: true (3 weeks ago)\n 8b04820 fix: rename twig-language-server to twiggy-language-server (#3021) (3 weeks ago)\n 303f3b3 docs: update server_configurations.md skip-checks: true (3 weeks ago)\n 39bbea3 fix: twig-language-server cmd (#3019) (3 weeks ago)\n aa199c5 docs: update server_configurations.md skip-checks: true (3 weeks ago)\n 41406a7 feat: add gdshader-lsp support (#3018) (3 weeks ago)\n 1699ce1 docs: update server_configurations.md skip-checks: true (3 weeks ago)\n bdc29fe fix(ocaml): trigger by filetype, not language id (#3016) (3 weeks ago)\n d1bab4c docs: update server_configurations.md skip-checks: true (4 weeks ago)\n e2703ae fix(typos_lsp): update repository url (#3012) (4 weeks ago)\n 114bf18 docs: update server_configurations.md skip-checks: true (4 weeks ago)\n 946c58c feat(solidity_ls)!: switch to first-party npm package (#3011) (4 weeks ago)\n c656fe5 docs: update server_configurations.md skip-checks: true (4 weeks ago)\n 02c9b12 fix(quick_lint_js): enable for typescript (#3010) (4 weeks ago)\n ae91a30 docs: update server_configurations.md skip-checks: true (4 weeks ago)\n 56e40a7 feat(docker-compse-lsp): add more filetype into docker compse server(#3008) (4 weeks ago)\n 76251e8 docs: update server_configurations.md skip-checks: true (4 weeks ago)\n afb9339 fix(denols): add new deno.cache request implmention (#3007) (4 weeks ago)\n a367cab ci: bump JohnnyMorganz/stylua-action from 3 to 4 (4 weeks ago)\n\n \u25cf nvim-treesitter 14.29ms \uf487 rainbow-delimiters.nvim\n b781fd0 fix(c): improve doxygen comment matching (#6278) (4 hours ago)\n 488bec0 bot(lockfile): update arduino, beancount, ocaml, ocaml_interface (2 days ago)\n 7ff51f5 bot(lockfile): update swift, vim, wing (3 days ago)\n 5720531 bot(lockfile): update mlir, wing (3 days ago)\n b4553be fix(nickel): update highlights to grammar change (3 days ago)\n 9775d5d fix(luadoc): `@nospell` identifiers and keywords (4 days ago)\n a0f18ee feat(markdown): highlight link label delimiter (4 days ago)\n 51d7c36 bot(lockfile): update python, wing (5 days ago)\n c09932b bot(lockfile): update cue, gitcommit, wing (6 days ago)\n cc6b108 bot(lockfile): update gleam, php, php_only, swift, wing (7 days ago)\n 212b7a5 fix(angular): typo in capture name (#6249) (7 days ago)\n 70f0382 bot(lockfile): update puppet, swift, t32, wing (8 days ago)\n e479db6 fix(sourcepawn) update queries to grammar change (#6247) (8 days ago)\n 63ca90e feat(swift): add will/didSet indent (8 days ago)\n 3d08cdd fix(comment): remove duplicate 'FIXME' (8 days ago)\n 8a9bef9 bot(readme): update (8 days ago)\n 9e1f3c3 feat: add gotemplate and helm parser support (8 days ago)\n f8d4e5c bot(lockfile): update arduino, gpg, sourcepawn, ssh_config, vue, wing (8 days ago)\n 00bd760 feat(csharp): highlight excape sequences (#6229) (8 days ago)\n 533ad65 feat: map automake to make (8 days ago)\n 99ddf57 feat(highlights)!: enforce documented captures (#6232) (8 days ago)\n 22c5a0d ci: teach bot about conventional commits (9 days ago)\n e3e5ff4 Update README (9 days ago)\n ada920f feat(vue): switch to new parser (#6233) (9 days ago)\n a47540f Update parsers: vimdoc (10 days ago)\n cbaad19 Update parsers: sourcepawn (10 days ago)\n c2a2651 Update parsers: beancount, requirements, v, wing (11 days ago)\n 30a41f5 ci: bump create-pull-request to v6 (11 days ago)\n 3ad0e41 fix(astro): update to scanner rewrite (11 days ago)\n 8e349b1 feat(gitcommit): highlight overflow in commit body (11 days ago)\n 62b0bb4 feat(format): extra newline after modeline (11 days ago)\n 84daea5 Update parsers: angular, gitcommit, vimdoc, wing (11 days ago)\n 06b5fda feat: add support for gdshader (#6153) (11 days ago)\n 4349af8 Update parsers: chatito, gitattributes, gitcommit, gpg, groovy, hlsl, mermaid, pem, poe_filter, properties, pymanifest, requirements, ssh_config, udev, wing, xcompose (12 days ago)\n 4a8901b feat(beancount): refactor scanner to c (12 days ago)\n d2f58c0 Update parsers: dtd, gitattributes, hyprlang, tcl, wing, xml (12 days ago)\n c5b19f6 fix(typst): adapt queries to breaking parser update (12 days ago)\n 15d521c fix(purescript): comment out utf-8 char (12 days ago)\n 31d0648 Update parsers: angular, javascript, nim, perl, python, typst, wing (13 days ago)\n db12bd4 Update parsers: fidl, haskell, nickel, python, solidity, wing (2 weeks ago)\n 18aa5ae feat(c): local label highlights (2 weeks ago)\n fad40f2 Update parsers: arduino, php, php_only, wing (2 weeks ago)\n 6e2b56c feat(cooklang): update to scanner rewrite (2 weeks ago)\n 6f1f407 feat(rust): add more regex injection queries (2 weeks ago)\n ede5b46 Update parsers: gpg, properties, pymanifest, requirements, rust, ssh_config, swift, udev, v (2 weeks ago)\n 9896ef5 feat(gdscript): update parsers and queries. (#6176) (2 weeks ago)\n c06292f Update parsers: c, fennel, gitattributes, json, nim, pem, poe_filter, printf, readline, sourcepawn, wing, xcompose (2 weeks ago)\n adf7236 feat(nickel): adapt to scanner rewrite (2 weeks ago)\n e105b5e feat(properties): update parser & queries (2 weeks ago)\n e159a53 fix(fidl): remove requires_generate_from_grammar (2 weeks ago)\n f148c8a Update parsers: arduino, cmake, dtd, fidl, mlir, perl, slint, sourcepawn, wing, xml (3 weeks ago)\n 31641d7 feat(format-scripts): linewrap predicates (3 weeks ago)\n a29058f feat(faust): better highlighting of function calls, built-in variables, and member access (3 weeks ago)\n 9ecf980 Update README (3 weeks ago)\n a8d2b54 feat: add fidl parser (3 weeks ago)\n 19bf991 feat(c-sharp): add enum member declaration highlight query (3 weeks ago)\n 1398b1b Update parsers: cmake, dtd, faust, fennel, gdscript, html, lua, php, php_only, rust, sourcepawn, typst, vim, wing, xml (3 weeks ago)\n ebf0532 feat(chatito): update queries (3 weeks ago)\n ca46eb3 fix(highlights): highlight @type in phpdoc (3 weeks ago)\n 977d949 Update README (3 weeks ago)\n 7d1bab6 feat(fennel)!: switch to maintained parser (#6132) (3 weeks ago)\n 71ae32c docs(template): use builtin commands (3 weeks ago)\n d1484a1 feat: improve queries/muttrc/highlights.scm (3 weeks ago)\n 455f658 feat(query): indents that reflect the formatter (#6154) (3 weeks ago)\n 01cdcfb highlights(slang): add support for `where` (3 weeks ago)\n c4c1f51 Update parsers: cuda, dtd, gdscript, hlsl, readline, slang, sourcepawn, wing, xml (3 weeks ago)\n 6bd108a feat(typst): add raw block injections (3 weeks ago)\n 7eeb26e feat(ecma): folding for function arguments (3 weeks ago)\n d87074a Update parsers: gdscript, hlsplaylist, html, muttrc, wing, zathurarc (3 weeks ago)\n ea3dded fix(meson): adapt to renamed node (3 weeks ago)\n 1f6bd57 ci: remove mergify.yml as it's no longer used (3 weeks ago)\n 917d696 fix(scripts): add missing \\n for nested grouping (3 weeks ago)\n 4b27f87 fix(scripts): format-queries defaults to cwd (3 weeks ago)\n e04ce8b feat: add tmux parser (3 weeks ago)\n 5b3e986 ci: simplify cache key (3 weeks ago)\n 9bc2196 fix: typos (3 weeks ago)\n 3a7b5a9 feat(svelte)!: switch upstream parser (3 weeks ago)\n b3e53e9 Update parsers: c, cpp, elm, html, markdown, markdown_inline, swift, vimdoc (3 weeks ago)\n 4704d7a Update README (3 weeks ago)\n f857a96 fix(bass): revert to upstream parser (#6131) (3 weeks ago)\n d10e856 feat(beancount): add comment injection (3 weeks ago)\n 8e1df60 chore(puppet): update queries (3 weeks ago)\n fef26b5 fix(format): fix nested grouping indentation (#6128) (3 weeks ago)\n 5e4b657 fix(typst): add lockfile entry (3 weeks ago)\n 34cb6a4 Update README (3 weeks ago)\n 13e4e75 fix(typst): remove unneeded (blob) @markup.raw capture (3 weeks ago)\n 4640135 fix(typst): nest @markup.raw.block capture (3 weeks ago)\n 3f2f770 fix(typst): nest @variable.member highlight capture (3 weeks ago)\n bdff1ab style(typst): group fold clauses (3 weeks ago)\n 9772dd1 style(typst): merge @punctuation.bracket clauses (3 weeks ago)\n 097d6ff fix(typst): move comment query to the bottom (3 weeks ago)\n f85b205 style(typst): format queries (3 weeks ago)\n 06d575e fix(typst): prevent highlighting entire function calls (3 weeks ago)\n c76e7e2 fix(typst): correct highlight captures (3 weeks ago)\n b3847b9 feat(typst): add comment injection (3 weeks ago)\n 4cb1595 feat(typst): add #show to fold and indent queries (3 weeks ago)\n 2ba58a4 feat(typst): add highlight queries (3 weeks ago)\n ab3ec33 feat: add typst parser (3 weeks ago)\n 87bc770 style: format queries (3 weeks ago)\n c920b66 feat: add typst queries (3 weeks ago)\n 5d9e12c fix(bash): unordered concatenation highlights (3 weeks ago)\n f75a5b4 Update parsers: d, swift, wgsl_bevy (3 weeks ago)\n 42acc3f refactor(ecma): delimiter highlight consolidation (3 weeks ago)\n 17d68ac feat(rust): add doc comments (3 weeks ago)\n eb1914b feat(latex): more text func highlights (3 weeks ago)\n 47d013d Update parsers: c, javascript, rust, wing (3 weeks ago)\n 504fe10 feat(ecma): highlight label identifiers (3 weeks ago)\n 581e87b Update parsers: glsl, hlsl, hlsplaylist, muttrc, purescript, query, wing, zathurarc (4 weeks ago)\n d49a8f8 highlights(slang): add support for `associatedtype` (4 weeks ago)\n\n \u25cf rainbow-delimiters.nvim 14.77ms \uea86 VeryLazy\n cfc3f53 Fix name of busted shim in makefile (11 days ago)\n 4902de7 Rename busted shim (12 days ago)\n 2dd78f3 Fix Neovim shim for parallel runs (13 days ago)\n 64b7006 Update changelog (2 weeks ago)\n 5ec0504 fix(fennel)!: update queries to reflect new upstream parser (2 weeks ago)\n 161eb67 Add a shim for busted (3 weeks ago)\n 90bab50 Fix up 'clean' target in makefile (3 weeks ago)\n 4d2d3f9 Handle command-line arguments in shim (3 weeks ago)\n e03cdde Add Svelte support (3 weeks ago)\n df0a57a Maintain symlink only during test session (3 weeks ago)\n\n\n Updated (25)\n \u25cf alpha-nvim 7.88ms \udb82\udcb1 alpha \uf121 astronvim.autocmds\n 41283fb Fix: Close alpha after SessionLoadPost. (#267) (2 weeks ago)\n\n \u25cf astrotheme 0.6ms \uead3 start\n 6119b6b chore(main): release 3.4.0 (#110) (3 weeks ago)\n c20ca1b chore(build): auto-generate vimdoc (3 weeks ago)\n 1a16dac feat(todo-comments): add highlight support (#115) (3 weeks ago)\n b88c5c1 chore(build): auto-generate vimdoc (3 weeks ago)\n bb84325 feat(palette): rename `astromars-light` to `astrojupiter` (#114) (3 weeks ago)\n 42a7135 chore(build): auto-generate vimdoc (4 weeks ago)\n 8064465 fix: remove manual `blend` specifications (4 weeks ago)\n ade0b60 feat(palette): add back old `astrolight` as `astromars-light` (#112) (5 weeks ago)\n dffc812 feat(palette): align `astrolight` with `astrodark` (#109) (5 weeks ago)\n c2938b1 chore(build): auto-generate vimdoc (5 weeks ago)\n 7bc3bc6 fix(treesitter): fix spelling error on comment.warning (#113) (5 weeks ago)\n 84631e4 chore(build): auto-generate vimdoc (5 weeks ago)\n b42a494 feat(treesitter): change variable.memeber to link to property (#108) (5 weeks ago)\n 415d003 chore(build): auto-generate vimdoc (6 weeks ago)\n 8e5345e docs: update AstroNvim tagline (6 weeks ago)\n\n \u25cb ccc.nvim \uebc7 CccPick \uebc7 CccConvert \uebc7 CccHighlighterDisable \uebc7 CccHighlighterEnable \uebc7 CccHighlighterToggle \uf11c <leader>uC \uf11c <leader>zc \uf11c <leader>zp \uea86 InsertEnter \uea86 User AstroFile\n f3d9d31 fix: add validator of bufnr in update; because update calling is delayed by vim.schedule (4 days ago)\n 2ef48b4 first update at LspAttach (6 days ago)\n 3b25771 remove update_callback (6 days ago)\n cd0f8ff fix: avoid buf_request_all notify (6 days ago)\n 61b13d3 Remove extra file (7 days ago)\n db5907f Add requirements into doc (7 days ago)\n 4e79f59 Update requirements: neovim 0.9.0+ (7 days ago)\n 86299a4 fix: pattern.find should detect a null character (7 days ago)\n c8cfd0a Set highlight to ccc-ui (10 days ago)\n 37dd903 set namespace to window each time update (10 days ago)\n a170d44 off signcolumn (10 days ago)\n 5bbeb2e strict false (10 days ago)\n 56f2689 disable highlighter in ccc-ui (10 days ago)\n 325c398 Fix updating highlight in undo/redo; need to use vim.schedule() (10 days ago)\n fb740df prohibit a blank issue (11 days ago)\n 6b6782b update doc (11 days ago)\n 0ca30a4 doc: rename to cycle_input/output_mode (2 weeks ago)\n 5abfb71 Format with stylua (2 weeks ago)\n 36c25ef Refactor (#100) (2 weeks ago)\n 392ef06 fix: add type check to pattern.find (#102) (2 weeks ago)\n\n \u25cf everforest 0.22ms \uead3 start\n d8ce313 fix(tsx): import hl does not match js/ts (10 days ago)\n\n \u25cb friendly-snippets \uf487 LuaSnip\n dcd4a58 Remove some none (#409) (2 weeks ago)\n dbd45e9 add new snippet for vue (#404) (3 weeks ago)\n 00ac993 Add PureScript snippets (#401) (3 weeks ago)\n b4bc233 feat(ruby): add binding.break snippet (#403) (3 weeks ago)\n ad4fe8c feat(editorconfig): add editorconfig snippets (#392) (3 weeks ago)\n\n \u25cf kanagawa.nvim 0.05ms \uead3 start\n bfa818c Merge pull request #212 from champignoom/patch-1 (12 days ago)\n 582fe0a Update treesitter.lua, enable strikethrough and underline (12 days ago)\n\n \u25cf lazy.nvim 20.01ms \uf121 init.lua\n 83493db chore(main): release 10.17.0 (#1292) (4 days ago)\n a5ac169 chore(build): auto-generate vimdoc (4 days ago)\n 298bed1 fix: update to new treesitter capture groups (#1294) (4 days ago)\n d5c58bb fix(ui): remove a single space character from home title (#1309) (4 days ago)\n e1e8d2f chore(build): auto-generate vimdoc (4 days ago)\n 0694651 feat(loader): warn when maplocalleader is changed after init (#1326) (4 days ago)\n c96fc24 style: format (4 days ago)\n 5be95fe chore(build): auto-generate vimdoc (4 days ago)\n 5aea4e7 fix(types): fix incorrect LuaLS types (#1339) (4 days ago)\n aedcd79 chore(build): auto-generate vimdoc (7 weeks ago)\n 670a6fe fix(manage): better support for using the default colorscheme during install. See #1277 (7 weeks ago)\n\n \u25cb mason-null-ls.nvim \uebc7 NullLsInstall \uebc7 NullLsUninstall \uf487 null-ls.nvim\n e270134 chore(main): release 2.5.1 (#99) (12 days ago)\n 05385ea fix(docs): config requires `ignore_methods` field (#98) (12 days ago)\n\n \u25cb neo-tree.nvim \uebc7 Neotree\n 7f2ebde fix(deprecations): `wrap` was a window option (#1387) (2 days ago)\n bce4540 feat(nui): allow callbacks in nui input with option (#1372) (6 days ago)\n dcb63ab fix(renderer): fix cursor jumping (#1377) (6 days ago)\n 459c603 fix: skip normalizing empty file paths (#1363) (2 weeks ago)\n 7d3b020 fix(renderer): clean out edge cases of cursor.position.restore (#1355) (3 weeks ago)\n db178f4 fix: improve path escaping for commands on Windows (#1353) (4 weeks ago)\n\n \u25cb neogit \uf11c <leader>gnk \uf11c <leader>gs \uf11c <leader>gnt \uf11c <leader>gnc \uf11c <leader>gnd \uea86 User AstroGitFile\n 9c5b139 Merge pull request #1191 from ofseed/master (8 days ago)\n fe3b8f5 Merge pull request #1152 from Danielkonge/Danielkonge-patch-1 (8 days ago)\n 6f72f6d Merge pull request #1154 from PostCyberPunk/count (8 days ago)\n 944033b Modify postfix for finders (8 days ago)\n c637c13 Remove redundant prompt_prefix postfix (8 days ago)\n a8e667f Change default prompt_prefix value (8 days ago)\n 0d0879b Merge pull request #1185 from NeogitOrg/bugfix/tag-annotations (2 weeks ago)\n 8f74093 Do not always annotate tags unless specified. (2 weeks ago)\n 4075ca9 Merge pull request #1183 from NeogitOrg/make-dired-better (3 weeks ago)\n 22985e3 Bugfix: When choosing a directory with the default telescope sorter, do not select \"..\" if it's highlighted while there's something else written in the prompt. (3 weeks ago)\n 1eb9514 Update README.md (3 weeks ago)\n 02d4c1b Merge pull request #1181 from eternity74/fix-diffview (3 weeks ago)\n 6b4ec3a Fixed unwanted trim for file from diffview (3 weeks ago)\n b2916ea fix:rebase editor respect disable_line_numbers (5 weeks ago)\n b0415a0 fixup! feat:line_action count support (5 weeks ago)\n ddf8148 fix skipping \"edit\" (5 weeks ago)\n 9ce6ce4 feat:line_action count support (5 weeks ago)\n 8e74085 fix: typo in the kind type (6 weeks ago)\n\n \u25cb neovim-session-manager \uebc7 SessionManager \uea86 BufWritePost\n d8e1ba3 Update README.md (3 weeks ago)\n\n \u25cb nvim-autopairs \uea86 User AstroFile\n c6139ca docs: make improvements to readme (#435) (2 weeks ago)\n 1efb4f2 fix: don't add parentheses after bash/shell functions (#432) (2 weeks ago)\n 90f824d fix: use v:lua without parens (3 weeks ago)\n d4aef9d fix: conflict with vim-endwise fix #430 (3 weeks ago)\n 2e8a10c fix: avoid global variable usage (#426) (3 weeks ago)\n 00def01 docs: fix typo (#427) (3 weeks ago)\n\n \u25cf nvim-notify 1.67ms \udb82\udcb1 notify \uf487 noice.nvim\n 5371f4b fix(telescope): enable wrap on preview (#255) (3 weeks ago)\n 8836014 fix: improve correctness of neovim version checking (#259) (3 weeks ago)\n\n \u25cb nvim-spectre \uebc7 Spectre \uf11c <leader>ss \uf11c <leader>sw (x) \uf11c <leader>sf\n 3712ff0 style: reformat by stylua (3 weeks ago)\n 3e6da25 feat: add mapping yy to copy current line (3 weeks ago)\n\n \u25cf nvim-surround 1.45ms \uea86 VeryLazy\n \u25cf nvim-treesitter-textobjects 1.81ms \uf487 nvim-treesitter\n b7a0bfa docs: update queries in README (#578) (7 days ago)\n cf3d612 fix: nil index when swapping at first/last child (#577) (7 days ago)\n 3532f60 fix(fennel): update queries for the new grammar (#570) (8 days ago)\n 739da25 fix(swap): preserve swapped nodes' range metadata (#550) (8 days ago)\n 95933e7 docs: fix spelling (#563) (13 days ago)\n 7f00d94 docs: update queries in README (3 weeks ago)\n 1b39216 docs: update queries in README (3 weeks ago)\n b3af7c7 feat(bash): @parameter.inner for command arguments (3 weeks ago)\n 7bb0ada feat(readline): text objects for GNU Readline (3 weeks ago)\n\n \u25cb nvim-web-devicons\n 4adea17 fix: linux and other assorted dark colours (#408) (10 days ago)\n 69fb193 feat(#406): add set_icon_by_filetype (#407) (10 days ago)\n 0bb67ef feat(#192): :NvimWebDeviconsHiTest (#405) (2 weeks ago)\n 7a19449 feat: add checkhealth (#403) (2 weeks ago)\n 14ac588 feat: add nu (#401) (3 weeks ago)\n\n \u25cb octo.nvim \uf11c <leader>ghe7 \uf11c <leader>ghe8 \uf11c <leader>ghx \uf11c <leader>ghs \uf11c <leader>ghss \uf11c <leader>ghsf \uf11c <leader>ghsr \uf11c <leader>ghsd \uf11c <leader>ghsc \uf11c <leader>ghsp \uf11c <leader>gh \uf11c <leader>ghc \uf11c <leader>ghca \uf11c <leader>ghcd \uf11c <leader>ght \uf11c <leader>ghta \uf11c <leader>ghtd \uf11c <leader>ghi \uf11c <leader>ghic \uf11c <leader>ghir \uf11c <leader>ghil \uf11c <leader>ghiu \uf11c <leader>ghio \uf11c <leader>ghp \uf11c <leader>ghpp \uf11c <leader>ghpm \uf11c <leader>ghpmm \uf11c <leader>ghpms \uf11c <leader>ghpmd \uf11c <leader>ghpmr \uf11c <leader>ghpc \uf11c <leader>ghpn \uf11c <leader>ghpd \uf11c <leader>ghps \uf11c <leader>ghpr \uf11c <leader>ghpo \uf11c <leader>ghpu \uf11c <leader>ghpt \uf11c <leader>ghpl \uf11c <leader>ghr \uf11c <leader>ghrl \uf11c <leader>ghrf \uf11c <leader>ghro \uf11c <leader>ghru \uf11c <leader>gha \uf11c <leader>ghaa \uf11c <leader>ghar \uf11c <leader>ghap \uf11c <leader>ghl \uf11c <leader>ghla \uf11c <leader>ghlr \uf11c <leader>ghlc \uf11c <leader>ghe \uf11c <leader>ghe1 \uf11c <leader>ghe2 \uf11c <leader>ghe3 \uf11c <leader>ghe4 \uf11c <leader>ghe5 \uf11c <leader>ghe6\n 1e2376a Merge pull request #512 from jemag/fix-repo-browser (5 hours ago)\n 76d4a2e fix: use url for opening repo from Octo repo list (7 hours ago)\n b8fe290 Merge pull request #510 from sventec/doc-fix-duplicate-opts (8 hours ago)\n 4340775 fix: improper gh cli flag for repo browser (24 hours ago)\n 55f223f doc: remove duplicate options from readme (3 days ago)\n feae1e5 Merge pull request #499 from samjwillis97/master (3 weeks ago)\n 3d1ffd4 Shuffled whitespace (3 weeks ago)\n 481f93c Moved cmd not found error + changed message (3 weeks ago)\n aa1ddc9 Moved Github CLI command to a configuration. (3 weeks ago)\n\n \u25cb overseer.nvim \uebc7 OverseerClose \uebc7 OverseerToggle \uebc7 OverseerSaveBundle \uebc7 OverseerLoadBundle \uebc7 OverseerDeleteBundle \uebc7 OverseerRunCmd \uebc7 OverseerRun \uebc7 OverseerInfo \uebc7 OverseerBuild \uebc7 OverseerQuickAction \uebc7 OverseerTaskAction \uebc7 OverseerClearCache \uebc7 OverseerOpen\n b72f6d2 fix: remove calls to deprecated tbl_add_reverse_lookup (4 days ago)\n 4855aef fix: eslint and jshint problem matcher patterns (#260) (3 weeks ago)\n\n \u25cb rest.nvim \uebc7 RestNvimLast \uebc7 RestNvim \uebc7 RestNvimPreview \uf016 json \uf016 http \uf11c <leader>rr \uf11c <leader>r\n 1ddcc92 docs: improve Telescope extension doc (#293) (10 hours ago)\n b1c8447 Merge pull request #289 from rest-nvim/release-please--branches--main--components--rest.nvim (6 days ago)\n ea45dfa docs: add `ft` to `lazy.nvim` config example (#288) (6 days ago)\n e415a94 chore(main): release 1.2.0 (6 days ago)\n 8a0cf6d chore: autoformat with stylua (6 days ago)\n 2bb9570 feat: add pre-script configuration (#287) (6 days ago)\n c27a0bc Merge pull request #285 from lhanson/telescope-fd-gitignore (3 weeks ago)\n 16376c6 Find .gitignore'd .env files (3 weeks ago)\n\n \u25cb SchemaStore.nvim\n 8835555 Update SchemaStore catalog (7 days ago)\n d91daa5 Update SchemaStore catalog (8 days ago)\n ebe6fe2 Update SchemaStore catalog (10 days ago)\n f3a32e8 Update SchemaStore catalog (11 days ago)\n 9bc9a3a Update SchemaStore catalog (12 days ago)\n a93078f Update SchemaStore catalog (2 weeks ago)\n fac1359 Update SchemaStore catalog (2 weeks ago)\n 0358c7e Update SchemaStore catalog (3 weeks ago)\n 86dee56 Update SchemaStore catalog (3 weeks ago)\n adaca44 Update SchemaStore catalog (3 weeks ago)\n 12ff3ac Update README.md (3 weeks ago)\n ffaf412 Update README.md (3 weeks ago)\n 8440817 Update SchemaStore catalog (3 weeks ago)\n\n \u25cb smart-splits.nvim\n f6fcb79 fix(api): Rename function for consistency (7 days ago)\n 5c18899 feat(api): Add method to jump to previous window (7 days ago)\n 07fa44c Merge pull request #160 from Mr-Hypocrite/fix/wezterm-wsl (9 days ago)\n 324abc0 refactor: add default config for wezterm_cli_path if is_WSL func returns true unless it's provided in the config by user (9 days ago)\n 9f75734 chore: add annotation for is_WSL func (9 days ago)\n 9aa306a refactor: use wezterm_cli_path from config (10 days ago)\n d3bdca9 chore: change field name to wezterm_cli_path, add default / fallback wezterm_cli_path in local config (10 days ago)\n e00374f chore: move all utils associated to this context to mux utils, add a func to check for wezterm (10 days ago)\n 3e29e87 Merge branch 'master' into fix/wezterm-wsl (10 days ago)\n b26118d refactor: use wezterm_bin_path from config if present else use the fallback (10 days ago)\n 8bb1656 chore: add configuration opt for wezterm bin path (10 days ago)\n 40be526 refactor: change the way WSL environment is checked (10 days ago)\n 0cf7149 chore: Add .envrc to use flake.nix (10 days ago)\n 08ce46d Merge pull request #161 from mrjones2014/mrj/flake-maintenance (10 days ago)\n f8dc9b5 Merge branch 'master' into mrj/flake-maintenance (10 days ago)\n 181c77b chore: Install stylua and luacheck in flake.nix and setup tmux alias (10 days ago)\n e25e87d Merge branch 'master' into fix/wezterm-wsl (10 days ago)\n 1339ffe Merge pull request #159 from mrjones2014/mrj/158/non-zero-exit-code (11 days ago)\n 6e41903 fix: conditionally use wezterm.exe command if the environment is WSL (11 days ago)\n cac3db3 chore: add a check to detect WSL environment (11 days ago)\n 89a570a fix: Use jobstart with detach=true (12 days ago)\n a714522 fix(mux): Change `on_exit` to run on `VimLeavePre` instead of `VimLeave` (13 days ago)\n e1e1e6c Merge pull request #156 from mrjones2014/bot/vimdoc/master (3 weeks ago)\n fb1d8c6 chore: generated vimdoc (3 weeks ago)\n 1863c1b Merge pull request #155 from mrjones2014/mrj/tmux-performance (3 weeks ago)\n 8f76c49 docs: Update README.md (3 weeks ago)\n 9f96087 fix: fix typo in import (3 weeks ago)\n 57e0b9a feat: Add flake.nix with tmux config for testing (3 weeks ago)\n 6813e3f feat(mux): Faster tmux integration/mux initialization refactor (3 weeks ago)\n 159c482 refactor: move `are_we_wezterm()` function to mux.utils (3 weeks ago)\n 33c8507 Merge pull request #153 from mrjones2014/bot/vimdoc/master (3 weeks ago)\n bb4b2d5 chore: generated vimdoc (3 weeks ago)\n 5780c70 Merge pull request #152 from lucobellic/patch-1 (3 weeks ago)\n 1f307be docs: update README.md (3 weeks ago)\n\n \u25cb telescope-file-browser.nvim \uea86 User AstroFile\n 8839e3f fix(picker): reject non-dir path option (#363) (6 days ago)\n\n \u25cf telescope-fzf-native.nvim 0.21ms \u2714 build\n 9ef21b2 fix: OS detection logic to allow compiling with MYSYS cmake on Windows (#121) (6 days ago)\n\n \u25cb vim-visual-multi \uea86 User AstroFile\n</code></pre>","tags":["clojure","repl-workflow","donut"]},{"location":"having-a-donut-party-with-system-components/#practicalli-project-templates","title":"Practicalli Project Templates","text":"<p>Identified some refinements to the <code>practicalli/service</code> template, specifically with the <code>donut-party/system</code> configuration.</p> <p>REPL Workflow updates:</p> <ul> <li>comment mulog example log event and function to stop mulog publisher</li> <li>portal REPL helper functions in <code>dev/portal.clj</code> rather than <code>dev/user.clj</code></li> <li>update donut config when running via the REPL helper functions</li> </ul> <p>Service updates:</p> <ul> <li>service.clj: remove http-kit and mulog library requires (only required in <code>system.clj</code> file)</li> <li><code>system.clj</code>: moved mulog global context into dont config</li> </ul>","tags":["clojure","repl-workflow","donut"]},{"location":"having-a-donut-party-with-system-components/#donut-system-components","title":"Donut System components","text":"<p>donut-party/system library is a simple to use and reason about library for managing components that make up a service, e.g. logging, http server, request routing.</p> <p>The main system is defined as a Clojure hash-map, with specific keys to control the lifecycle of components</p> <ul> <li><code>::donut/start</code> key is bound to a function to start a particular component</li> <li><code>::donut/start</code> key is bound to a function to stop a running instance of the component (the instance created by <code>::donut/start</code>)</li> <li><code>::donut/config</code> is a hash-map of configuration values that can be passed to the <code>::donut/start</code> function (destructuring the relevant values into local names)</li> </ul>","tags":["clojure","repl-workflow","donut"]},{"location":"having-a-donut-party-with-system-components/#refactor-repl-workflow","title":"Refactor REPL workflow","text":"<p><code>donut.system.repl/start</code> is used to manage the system components as part of the REPL workflow.</p> <p>This function can be passed a donut named system to use a different configuration. The default named system is called <code>:donut.system/repl</code></p> <p>Practicall Service template sets the <code>:donut.system/repl</code> named system to use the configuration file for the service.</p> <p>Update main donut config with dev</p> <pre><code>(ns system-repl\n \"Tools for REPl workflow with Donut system components\"\n (:require\n [donut.system :as donut]\n [donut.system.repl :as donut-repl]\n [donut.system.repl.state :as donut-repl-state]\n [practicalli.gameboard.system :as system]))\n\n(defmethod donut/named-system :donut.system/repl\n [_] system/main)\n</code></pre> <p><code>donut.system/system</code> function updates the configuration defined by the named system with key values.</p> <p>In the Practicalli Service template, the <code>:app-env</code> key is updated with the value <code>\"dev\"</code></p> <p>Update main donut config with dev</p> <pre><code>(defn start\n \"Start system with donut, optionally passing a named system\"\n [] (donut-repl/start\n (donut/system :donut.system/repl\n {[:env :app-env] \"dev\"})))\n</code></pre>","tags":["clojure","repl-workflow","donut"]},{"location":"having-a-donut-party-with-system-components/#hammock-time","title":"Hammock time","text":"<p>After some hammock time the Donut REPL workflow code had a further refactor.</p> <p>To keep the configuration as simple as possible, the <code>main</code> configuration is used for all environments (production, staging, test, dev).</p> <p>Donut-party/system can create a named-system and provide overrides on top of another system, changing only the specific values needed for the new system.</p> <p>Pass an existing config or named system to the <code>donut/system</code> function, along with any values to override. A new system configuraiton is returned.</p> <p>Override the default donut.system/repl configuration</p> <pre><code>(donut/system :donut.system/repl\n {[:env :app-env] \"dev\"\n [:env :app-version] \"0.0.0-SNAPSHOT\"})\n</code></pre> <p>Creating a <code>:dev</code> named-system to support the development workflow would change the production configuration:</p> <ul> <li>changing the mulog publisher to output a pretty printed Clojure hash-map in dev (encoded into JSON for production)</li> <li>setting the application environment to dev (for parts of the system that may work differently in dev)</li> <li>overriding the http server options, i.e. <code>:join? false</code> to detach the REPL prompt from the server process after startup</li> </ul> <p>Refactor of service-repl namespace</p> <pre><code>;; ---------------------------------------------------------\n;; Donut named systems\n;; `:donut.system/repl` is default named system,\n;; bound to `{{top/ns}}.{{main/ns}}.system` configuration\n(defmethod donut/named-system :donut.system/repl\n [_] system/main)\n\n;; `dev` system, partially overriding main system configuration\n;; to support the development workflow\n(defmethod donut/named-system :dev\n [_] (donut/system :donut.system/repl\n {[:env :app-env] \"dev\"\n [:env :app-version] \"0.0.0-SNAPSHOT\"\n [:services :http-server ::donut/config :options :join?] false\n [:services :event-log-publisher ::donut/config]\n {:publisher {:type :console :pretty? true}}}))\n\n;; ---------------------------------------------------------\n\n;; ---------------------------------------------------------\n;; Donut REPL workflow helper functions\n\n(defn start\n \"Start services using a named-system configuration,\n use `:dev` named-system by default\"\n ([] (start :dev))\n ([named-system] (donut-repl/start named-system)))\n\n(defn stop\n \"Stop the currently running system\"\n [] (donut-repl/stop))\n\n(defn restart\n \"Restart the system with donut repl,\n Uses clojure.tools.namespace.repl to reload namespaces\n `(clojure.tools.namespace.repl/refresh :after 'donut.system.repl/start)`\"\n [] (donut-repl/restart))\n\n(defn system\n \"Return: fully qualified hash-map of system state\"\n [] donut-repl-state/system)\n;; ---------------------------------------------------------\n</code></pre> <p>Environment variables for ports and other things that may change between environments and deploys helps keep the configuration simple. Using juxt/aero is nice, but it adds a little more complexity to the configuration.</p>","tags":["clojure","repl-workflow","donut"]},{"location":"having-a-donut-party-with-system-components/#donut-practical-guide","title":"Donut practical guide","text":"<p>Update Practicalli Clojure Web Services guide on donut with recent lessons learned:</p> <p>The guide should include:</p> <ul> <li>overview</li> <li>add dependency</li> <li>defining a system configuration</li> <li>named-systems</li> <li>overriding values in a system configuration</li> <li>REPL workflow</li> <li>helper functions to start, stop & restart the system components. A system function to show the current value of the system should issues arise.</li> </ul> <p>juxt/aero</p> <ul> <li>consider using environment variables instead, especially if there is minimal difference between environments (prod, stage, test, dev)</li> </ul>","tags":["clojure","repl-workflow","donut"]},{"location":"having-a-donut-party-with-system-components/#clojure-essentials","title":"Clojure essentials","text":"<p>What are the essentials that any Clojure developer should know? Some initial thoughts:</p> <p>Syntax:</p> <ul> <li>define a custom function</li> <li>define a value using simple & complex values, anonymous and/or partial functions (or even a transducer)</li> <li>define a namespace and require libraries (when to use an alias and :refer)</li> <li>let for local names</li> <li>conditionals (if when cond some - and their variants)</li> <li>list, vector, hash-map and set data structures</li> <li>working with data structures (conj, get, into)</li> <li>generating & transforming data, e.g. map, reduce, partition, filter, group-by</li> <li>sequences and the basics of lazyness</li> <li>threading macro - flow and navigating paths to data</li> </ul> <p>Tooling and Workflow</p> <ul> <li>starting and configuring a REPL</li> <li>Clojure CLI configuration and aliases</li> <li>a REPL connected editor and evaluation options</li> <li>keeping a clean REPL state</li> <li>a test runner, e.g Kaocha</li> <li>data inspector, e.g. Portal (highly recommended)</li> <li>REPL reloaded Workflow (optional)</li> </ul> <p>Topics that can wait until there is a specific use case</p> <ul> <li>writing macros (unless designing an extension to the language)</li> <li>polymorphism (unless dispatching by custom types)</li> <li>Java interop (largely skipped as there are many wrapper libraries)</li> </ul>","tags":["clojure","repl-workflow","donut"]},{"location":"having-a-donut-party-with-system-components/#ubuntu-file-tracker","title":"Ubuntu file tracker","text":"<p>There is a file indexing package called <code>tracker-minder-fs</code> that can have a significant impact on the performance of even a high end computer.</p> <p>From the <code>apt show tracker-miner-fs -a</code> description:</p> <p>Description: metadata database, indexer and search tool - filesystem indexer. This package contains the tracker indexer for indexing your files and folders.</p> <p>Tracker is an advanced framework for first class objects with associated metadata and tags. It provides a one stop solution for all metadata, tags, shared object databases, search tools and indexing.</p> <p>Normally I would remove the package, however, it has dependencies from Ubuntu and Regolith desktop packages. These are meta packages, so it should be okay to remove them, so long as they do not remove all the other desktop related pacakges.</p> <p>Remove tracker minder package</p> <pre><code>sudo apt remove --purge tracker-miner-fs tracker-extract\n</code></pre> <p>I was concerned about removing <code>gnome-flashback</code> package, as I believe that provides the graphical login when starting Ubuntu with Regolight.</p> <p>Packages to be removed</p> <pre><code>The following packages will be REMOVED\n gnome-flashback* gnome-shell-extension-desktop-icons-ng* nautilus* nautilus-share* regolith-desktop*\n regolith-session-flashback* tracker-extract* tracker-miner-fs* ubuntu-desktop* ubuntu-desktop-minimal*\n</code></pre> <p>Hopefully in a newer version of Regolith desktop or using Debian Linux as the base of Regolith Linux will not include this overactive file indexer.</p> <p>Thank you.</p> <p> Practical.li Website</p> <p> Practical.li GitHub Org practicalli-johnny profile</p> <p> @practicalli@clj.social @practical_li</p>","tags":["clojure","repl-workflow","donut"]},{"location":"debian-linux-almost-everywhere/","title":"Debian Linux almost everywhere","text":"<p>Enjoying being back in Debian Linux world, with regolith desktop as the tiling window manager.</p> <p>I have several Lenovo laptops and all but one are now upgraded to Debian Linux, using the testing version of the distribution.</p> <p>The most significant difference with Debian Linux is the use of a separate root account for administration, rather than using <code>sudo</code> in Ubuntu Linux.</p>","tags":["clojure"]},{"location":"debian-linux-almost-everywhere/#debian-linux-with-regolith-desktop","title":"Debian Linux with Regolith Desktop","text":"<p>Download the ISO image from Debian.org. The default is the Net ISO which has the essential packages for Linux.</p> <p>Create a bootable USB drive with the ISO image, on Linux this can be achieved by a simple copy command</p> <p>Create bootable USB install for Debian Linux</p> <pre><code>cp debian-linux.iso /dev/sdb1\n</code></pre> <p><code>/dev/sda1</code> should be the main disk drive for the computer. Use <code>df</code> command to check which mount points are the USB drive and computer hard drive.</p> <p>Install Debian Linux from the Net ISO image by rebooting the computer. Most modern laptops have a boot selection menu that shows when pressing F12 ask the computer bios starts.</p> <p>Follow the Debain Linux installer prompts. At the end, select the Debian Desktop environmet. Its also recommended to install the OpenSSH server and recommended tools (selected by default).</p> <p>If the Debian Desktop task is not installed, then not enough packages are added by Regolith Desktop to run an X Window session. Also the Sway Wayland package has unmet dependencies.</p> <p>Reboot the computer after the install is complete.</p> <p>Login to Debian Linux and download the Regolith Desktop install script.</p> DownloadCopy from computer <pre><code>wget https://github.com/practicalli/dotfiles/regolith-desktop-install\n</code></pre> <pre><code>scp username@192.168.0.250:/home/practicalli/regolith-desktop-install .\n</code></pre> Regolith Desktop - single install script for Debian Linux <pre><code>apt install gpg && \\\nwget -qO - https://regolith-desktop.org/regolith.key | \\\ngpg --dearmor | tee /usr/share/keyrings/regolith-archive-keyring.gpg > /dev/null && \\\necho deb \"[arch=amd64 signed-by=/usr/share/keyrings/regolith-archive-keyring.gpg] \\\nhttps://regolith-desktop.org/release-3_1-debian-bookworm-amd64 bookworm main\" | \\\ntee /etc/apt/sources.list.d/regolith.list && \\\napt update && \\\napt install regolith-desktop regolith-session-flashback regolith-look-gruvbox\n</code></pre>","tags":["clojure"]},{"location":"debian-linux-almost-everywhere/#post-install","title":"Post install","text":"<p>Debian Linux installs a number of packages that I dont need, including Libre Office suite.</p> <p>Remove Libra Office</p> <pre><code>apt purge libreoffice*\n</code></pre> <p>Thank you.</p> <p> Practical.li Website</p> <p> Practical.li GitHub Org practicalli-johnny profile</p> <p> @practicalli@clj.social @practical_li</p>","tags":["clojure"]},{"location":"git-multiple-ssh-keys--neovim/","title":"Git Multiple SSH Keys & Neovim","text":"<p>A short week at work made even shorter by a company day to celebrate going live. A chance to unwind and reflect.</p> <p>Neovim 0.10 is planned for 1 May 2024. Plugins should be unafected, although actively developing plugins like Neogit are trying to used parts of the Neovim API. The parts of Neogit that use 0.10 api should be more efficient, although I assume there wont be a noticable difference in functionality.</p> <p>I will update Neovim to 0.10 when AstroNvim confirms it is working well with that release.</p>","tags":["clojure","git","neovim"]},{"location":"git-multiple-ssh-keys--neovim/#git-and-multiple-ssh-keys","title":"Git and Multiple SSH keys","text":"<p>Use the SSH config to define <code>Host</code> aliases for different GitHub accounts. Each host defines the hostname it will use for the connection.</p> <p>Multiple Host definitions</p> <pre><code>Host community\n HostName github.com\n IdentityFile ~/.ssh/community\n\nHost commercial\n HostName github.com\n IdentityFile ~/.ssh/commercial\n\nHost personal\n HostName github.com\n IdentityFile ~/.ssh/practicalli\n</code></pre> <p>Clone using personal Host alias</p> <pre><code>git clone git@personal:practicalli/clojure\n</code></pre> <p>The <code>practicalli</code> host alias is replaced by its <code>HostName</code> domain.</p> <p>Use Git clone aliases to simplify the command line</p> <p>Git Clone aliases</p> .config/git/config<pre><code>[url \"git@company:company-org/\"]\n insteadOf = c:\n\n[url \"git@engineering:practicalli/\"]\n insteadOf = p:\n</code></pre> <p>Clone using alias</p> <pre><code>git clone p:clojure\n</code></pre> <p>Use separate user accounts when there are significant differences between work, community and personal development environments</p>","tags":["clojure","git","neovim"]},{"location":"git-multiple-ssh-keys--neovim/#neogit-rebase","title":"Neogit rebase","text":"<p>Hopefully more rebase functions in Neogit.</p> AstroNvim new version <pre><code>\u25cb neogit \uea86 User AstroGitFile \uf11c <leader>gs \uf11c <leader>gnt \uf11c <leader>gnc \uf11c <leader>gnd \uf11c <leader>gnk\n 20ab5a6 Merge pull request #1213 from kjughx/rebase-drop\n d44bf7f Add test for rebase_drop\n 5185d91 Add rebase \"drop a commit\" to rebase\n 660d1f0 Use git.rev_parse.abbreviate_commit instead of abbreviated_size()\n 2ec7c25 Merge pull request #1211 from kjughx/rebase-modify\n 3d2aaec Update tests/specs/neogit/popups/rebase_spec.lua\n d20d16d Update lua/neogit/lib/git/log.lua\n c940678 Add tests for rebase_modify\n de6ecfb Fix existing unit tests for test_reword\n a5d5cc6 Add \"modify a commit\" to rebase\n 87b7fc6 Add helper function to get length of hash\n b195cf3 Merge pull request #1212 from NeogitOrg/backport-logging (4 hours ago)\n 9f9eb8e Spelling (4 hours ago)\n ffab01c Rename json -> record since it's not json anymore (4 hours ago)\n dd1de78 Update json spec (4 hours ago)\n 04dcfd0 Better parsing with fewer loops/allocations (4 hours ago)\n 78655a6 Use record separators instead of eval'ing the git output. (4 hours ago)\n c27fcb2 Handle multi-line commit messages by joining all lines, then re-splitting on the record separators. (4 hours ago)\n 7f3e0d3 Replace json parsing with string eval to lua tables. Having bug reports that we don't properly escape string fields, and this approach basically sidesteps all that. (4 hours ago)\n 10feeec Update README.md (11 hours ago)\n bf2a353 Update README.md (2 days ago)\n 4c29337 Merge pull request #1206 from NeogitOrg/CKolkey-patch-1 (2 days ago)\n 16aa16e Update README.md (2 days ago)\n</code></pre> <p>Thank you.</p> <p> Practical.li Website</p> <p> Practical.li GitHub Org practicalli-johnny profile</p> <p> @practicalli@clj.social @practical_li</p>","tags":["clojure","git","neovim"]},{"location":"gardening-in-the-mornings/","title":"Gardening in the mornings","text":"<p>A new month so time to update libraries across Practicalli projects.</p> <p>Bank holiday Monday and two personal holidays this week, so only two days at work and very few meetings, yay!. Time to prepare for the company offsite event next week and see how lightly I can pack.</p> <p>I made a big impact on upgrading the garden this week. All the paving stones at the end of the garden were levelled so the shed is no longer on a slope. A thick weed surpressing membrane was fitted underneath all the paving stones.</p> <p>The raised garden bed was be reworked by adjusting the top of the railway sleepers to be level to the top of the paving stones. This adds a nice clean line with the garden and makes maintenance in and around the garden easier. Weed surpressing membrane was added to the side and underneath of each sleeper. Spare wood panels was used to keep the membrane in plate and to also add more robustness to the sleepers.</p> <p>Most of the work was done in the early mornings as the weather was quite hot.</p>","tags":["clojure"]},{"location":"gardening-in-the-mornings/#practicalli-clojure-cli-config","title":"Practicalli Clojure CLI Config","text":"<p>Monthly library updates and published a new release. Used AstroNvim & Neovim to update the libraries, instead of the usual Emacs approach.</p> <p>A combination of search, highlight, jump and dot repeat commands were used to update the same version number of a specific library.</p> <p>/ followed by the library name to update to find the next occurrence, then ++dollar++ to jump to the end of the line and back a word to land on the string containing the version number.</p> <p># to highlight all matching version number values (hopefully the same number of occurrences that antq found to update)</p> <p>c w to change the current version value and type in the updated version.</p> <p>n jumps to next occurrence and N jumps to previous occurrence.</p> <p>. repeats the change word action using dot-repeat, updating the next (or previous) matching version to update.</p> <p>Jump through all library statements and dot-repeat to update all the versions.</p>","tags":["clojure"]},{"location":"gardening-in-the-mornings/#practicalli-web-services","title":"Practicalli Web Services","text":"<p>Generated a working Clojure API project from the <code>practicalli/service</code> template, using donut-party/system to manage the service components.</p> <pre><code>clojure -T:project/create :template practicalli/service :name practicalli/gameboard :component :donut\n</code></pre> <p>Pushed the code to practicalli/gameboard-donut to help others see how such a project is organised.</p>","tags":["clojure"]},{"location":"gardening-in-the-mornings/#neovim","title":"Neovim","text":"<p>Pressing / in insert mode causes Neovim to lock up, rather than showing completion for the file system path. Some testing is required to see what could be the cause.</p> <p>Test using the following</p> <ul> <li>run <code>nvim</code> without any config (check if this is a neovim bug or perhaps a missing feature)</li> <li>run <code>nvim</code> with the astro-template config (check if its any of my plugins that are causing the issue or if it also appears in the default AstroNvim config)</li> </ul> <p>Thank you.</p> <p> Practical.li Website</p> <p> Practical.li GitHub Org practicalli-johnny profile</p> <p> @practicalli@clj.social @practical_li</p>","tags":["clojure"]},{"location":"company-offsite-week/","title":"Company offsite week","text":"<p>Travelled for a work event in Portugal with a chance to meet people I work with face to face for the first time. It was a very enjoyable and also quite intensive event. I kept myself busy to help combat fatigue from travelling and manage a swim each morning and evening whilst I was at the hotel.</p> <p>I am accustom to working remotely since 2010, having worked for companies based outside of the UK. It is always very valuable to meet people face to face and can start or strengthen a relationship.</p>","tags":["neovim","astronvim"]},{"location":"company-offsite-week/#company-offsite","title":"Company Offsite","text":"<p>The first evening was a nice dinner after a quick and refreshing shower.</p> <p>A bracing swim in the mornings really helped give me energy for each day. Swimming was also a great way to minimise any feelings of travel. I took the opportunity to have at least 1 swim a day, with 2 swims on Tuesday.</p> <p>I was very sleepy on the taxi ride from the airport to the hotel on Monday. I slept on the flight the whole way back to the UK. I am not sure I even remember the take-off.</p> <p>Tuesday night was a relaxed evening where everyone could do there own activity.</p> <p>A few of use tried a co-operative card game called \"Hanabi\" which is also an example of a limited communication game. No one can see their own cards but can see everyone else's. Each player can either play a card, give a hint to a player or discard a card they hold. There is a limited number of hints available (tracked by tokens) and a use hint is reactivated if a card is played correctly.</p> <p>As there was a limit on communication, it was fascinating to see the body language and non-verbal communication of all the players.</p>","tags":["neovim","astronvim"]},{"location":"company-offsite-week/#neovim","title":"Neovim","text":"<p>Version 0.10.0 released.</p> <p>Downloaded the <code>nvim.appimage</code> file from the Neovim GitHub repository release page and copied to <code>~/.local/bin/nvim-0.10.0.appimage</code>. The <code>~/.local/bin/</code> directory is already on the operating system execution path.</p> <p>The Neovim roadmap gives an overview of the major features and changes in version 0.10.0.</p> <ul> <li>Default colorscheme</li> <li>LSP inlay hints</li> <li>TermRequest, TermResponse</li> <li>treesitter: builtin parsers for bash, markdown, python</li> <li>vim.iter</li> <li>vim.lpeg, vim.re, vim.glob, vim.base64</li> </ul> <p>Neovim 0.10.0 Changelog covers all breaking changes, new & changed features and deprecations.</p> <p>I am unclear if there are any major features I will notice. I am sure I will benefit from the large number of small improvements, even if I do not experience them directly.</p> <p>A bug that was annoying is now fixed. Typing <code>/</code> in insert mode for a markdown file was hanging neovim so badly that the process had to be killed. <code>/</code> in insert mode now shows the directory listing completion and no longer crashes Neovim.</p>","tags":["neovim","astronvim"]},{"location":"company-offsite-week/#astronvim","title":"AstroNvim","text":"<p>Astrocommunity packages were updated previously to work with AstroNvim 0.4 version.</p> <p>Many changes to AstroNvim plugins and Astrocommunity plugins have also been updated to ensure they support Neovim 0.10.0</p> <p>Thank you.</p> <p> Practical.li Website</p> <p> Practical.li GitHub Org practicalli-johnny profile</p> <p> @practicalli@clj.social @practical_li</p>","tags":["neovim","astronvim"]},{"location":"refactor-astronvim-clojure-pack/","title":"Refactor AstroNvim Clojure pack","text":"<p>Pull requests this week</p> <ul> <li> MERGED Add Clojure comment patterns to ts-comments.nvim</li> <li> MERGED Modularise Astrocommunity Clojure pack</li> <li> MERGED Update AstroNvim Cloure pack description & simplify examples</li> <li> MERGED Fix vim-visual-multi dependency name</li> </ul> <p>Total commits this week: 37</p> <p>Submitted a pull request to refactor the AstroNvim Community Clojure language pack which I contributed in June 2023.</p> <ul> <li>add nvim-treesitter-sexp plugin</li> <li>add example of disabling / configuring parinfer plugin</li> <li>add ts-comment.nvim to support <code>;;</code> and <code>;</code> comment characters</li> <li>remove autocmd from conjure plugin (no longer needed)</li> <li>remove most of the opinionated conjure configuration overrides, although still hiding the repl log buffer (HUD) by default as its nicer as a separate tab. Maybe if I can have it open by default as a tab, then I could live with having the HUD open on REPL startup (a nice way to check things are working)</li> </ul> <p>Still sleepy from travel to the company off-site last week and the cycle ride on Saturday. Although I did manage some work in the garden on Sunday.</p>","tags":["neovim"]},{"location":"refactor-astronvim-clojure-pack/#neovim","title":"Neovim","text":"<p>Refactor AstroNvim Community Clojure language pack with the help of the Astrocommunity team. All plugins have their own Astrocommunity plugin configuration separately and the Clojure pack composes those plugins, making the configuration far simpler.</p> <p>Updates to Conjure mean that the diagnostics no longer require an autocmd to disable them (currently in <code>dev</code>)</p> <p>Added Clojure comment patterns to the ts-comment.nvim plugin. That plugin now supports the <code>;;</code> style comment syntax that is traditionally used for line comments, as well as the <code>;</code> comment that is defined by the Clojure style guide as a post line comment</p> AstroNvim Community Clojure pack auto commands - no longer requred <p>This was the previous configuration for Conjure in the Clojure pack</p> <pre><code> {\n \"Olical/conjure\",\n -- load plugin on filetypes\n filetype = { \"clojure\" },\n dependencies = {\n \"AstroNvim/astrocore\",\n opts = {\n autocmds = { -- (1)!\n conjure_log_disable_lsp = {\n {\n event = \"BufNewFile\",\n pattern = { \"conjure-log-*\" },\n callback = function() vim.diagnostic.disable(0) end,\n desc = \"Conjure Log disable LSP diagnostics\",\n },\n {\n event = \"FileType\",\n pattern = { \"clojure\" },\n callback = function() vim.bo.commentstring = \";; %s\" end,\n desc = \"Lisp style line comment\",\n },\n },\n },\n options = {\n g = { -- (2)!\n [\"conjure#log#hud#width\"] = 1,\n [\"conjure#log#hud#enabled\"] = false, -- show log by default?\n [\"conjure#log#hud#anchor\"] = \"SE\",\n [\"conjure#log#botright\"] = true,\n [\"conjure#extract#context_header_lines\"] = 100,\n [\"conjure#eval#comment_prefix\"] = \";; \",\n [\"conjure#client#clojure#nrepl#connection#auto_repl#enabled\"] = false,\n [\"conjure#client#clojure#nrepl#connection#auto_repl#hidden\"] = true,\n [\"conjure#client#clojure#nrepl#connection#auto_repl#cmd\"] = nil,\n [\"conjure#client#clojure#nrepl#eval#auto_require\"] = false,\n [\"conjure#client#clojure#nrepl#test#runner\"] = \"kaocha\",\n },\n },\n },\n },\n },\n</code></pre> <ol> <li>autocmd config is no longer required, ts-comment.nvim is used instead</li> <li>global options overrides are to be reduced, with an example in Clojure pack readme showing how to override them</li> </ol> Treesitter Structured Editing with nvim-treesitter-sexp <p>A full example of nvim-treesitter-sexp configuration for AstroNvim</p> <pre><code> -- Treesitter structural editing\n -- - package provides normal mode key mappings\n -- - practicalli config adds which-key mappings\n {\n \"PaterJason/nvim-treesitter-sexp\",\n filetype = { \"clojure\" },\n dependencies = {\n \"AstroNvim/astrocore\",\n opts = {\n -- configuration & keymaps overrides:\n -- https://github.com/PaterJason/nvim-treesitter-sexp#configuration\n -- enabled = false,\n -- -- Set to false to disable individual keymaps\n -- set_cursor = true,\n -- keymaps = { -- (1)!\n -- Default key bindings - set to false to disable\n -- commands = {\n -- swap_prev_elem = \"<e\",\n swap_prev_elem = false,\n -- swap_next_elem = \">e\",\n -- swap_prev_form = \"<f\",\n -- swap_next_form = \">f\",\n -- promote_elem = \"<LocalLeader>O\",\n -- promote_form = \"<LocalLeader>o\",\n -- splice = \"<LocalLeader>@\",\n -- slurp_left = \"<(\",\n -- slurp_right = \">)\",\n -- barf_left = \">(\",\n -- barf_right = \"<)\",\n -- insert_head = \"<I\",\n -- insert_tail = \">I\",\n -- },\n -- motions = {\n -- form_start = \"(\",\n -- form_end = \")\",\n -- prev_elem = \"[e\",\n -- next_elem = \"]e\",\n -- prev_elem_end = \"[E\",\n -- next_elem_end = \"]E\",\n -- prev_top_level = \"[[\",\n -- next_top_level = \"]]\",\n -- },\n -- textobjects = {\n -- inner_elem = \"ie\",\n -- outer_elem = \"ae\",\n -- inner_form = \"if\",\n -- outer_form = \"af\",\n -- inner_top_level = \"iF\",\n -- outer_top_level = \"aF\",\n -- },\n -- },\n options = {\n g = {},\n },\n mappings = { -- (2)!\n n = {\n -- Additional Which-key key mappings for nvim-treesitter-sexp\n [\"<leader>k\"] = { name = \"Structural Editing\" },\n [\"<leader>kE\"] = { \"<cmd>TSSexp swap_prev_elem<cr>\", desc = \"Swap Previous Element\" },\n [\"<leader>ke\"] = { \"<cmd>TSSexp swap_next_elem<cr>\", desc = \"Swap Previous Element\" },\n [\"<leader>kF\"] = { \"<cmd>TSSexp swap_prev_form<cr>\", desc = \"Swap Previous Form\" },\n [\"<leader>kf\"] = { \"<cmd>TSSexp swap_next_form<cr>\", desc = \"Swap Previous Form\" },\n [\"<leader>kk\"] = { \"<cmd>TSSexp promote_elem<cr>\", desc = \"Promote Element\" },\n [\"<leader>kr\"] = { \"<cmd>TSSexp promote_form<cr>\", desc = \"Promote Form\" },\n [\"<leader>k@\"] = { \"<cmd>TSSexp splice<cr>\", desc = \"Splice\" },\n [\"<leader>kS\"] = { \"<cmd>TSSexp slurp_left<cr>\", desc = \"Slurp Left\" },\n [\"<leader>ks\"] = { \"<cmd>TSSexp slurp_right<cr>\", desc = \"Slurp Right\" },\n [\"<leader>kB\"] = { \"<cmd>TSSexp barf_left<cr>\", desc = \"Barf Left\" },\n [\"<leader>kb\"] = { \"<cmd>TSSexp barf_right<cr>\", desc = \"Barf Right\" },\n [\"<leader>kI\"] = { \"<cmd>TSSexp barf_right<cr>\", desc = \"Insert Head\" },\n [\"<leader>ki\"] = { \"<cmd>TSSexp barf_right<cr>\", desc = \"Insert Tail\" },\n },\n t = {\n -- terminal? mode key bindings\n },\n v = {\n -- visual mode key bindings\n },\n },\n },\n },\n },\n</code></pre> <ol> <li>Default keymaps can be disabled by setting the value to <code>false</code></li> <li>Designed keymaps for discoverability along the lines of Spacemacs Lisp Mode <code>SPC k</code>, although deemed superfluous as the default keymaps from the plugin felt more appropriate for Neovim</li> </ol> Refactor of AstroCommunity Clojure language pack <pre><code>-- ------------------------------------------\n-- Clojure language pack\n--\n-- clojure-lsp server via mason\n-- treesitter clojure parser\n-- ts-comment.nvim with `;;` and `;` support\n-- structured editing with parinfer and treesitter-sexp plugins\n-- REPL connected editor with Conjure plugin (log hidden by default)\n-- ------------------------------------------\nreturn {\n -- Clojure Language Server\n {\n \"williamboman/mason-lspconfig.nvim\",\n optional = true,\n opts = function(_, opts)\n opts.ensure_installed = require(\"astrocore\").list_insert_unique(opts.ensure_installed, { \"clojure_lsp\" })\n end,\n },\n {\n \"WhoIsSethDaniel/mason-tool-installer.nvim\",\n optional = true,\n opts = function(_, opts)\n opts.ensure_installed = require(\"astrocore\").list_insert_unique(opts.ensure_installed, { \"clojure-lsp\" })\n end,\n },\n -- Clojure parser\n {\n \"nvim-treesitter/nvim-treesitter\",\n optional = true,\n opts = function(_, opts)\n if opts.ensure_installed ~= \"all\" then\n opts.ensure_installed = require(\"astrocore\").list_insert_unique(opts.ensure_installed, { \"clojure\" })\n end\n end,\n },\n\n -- Comment support `;;` and `;` (requires nvim 0.10.0)\n -- first disable potential plugin clashes\n { \"numToStr/Comment.nvim\", enabled = false },\n { \"JoosepAlviste/nvim-ts-context-commentstring\", enabled = false },\n -- Add ts-comment.nvim with Clojure comment strings\n {\n \"folke/ts-comments.nvim\",\n filetype = { \"clojure\" },\n opts = {\n lang = {\n clojure = { \";; %s\", \"; %s\" }, --(1)!\n },\n },\n event = \"VeryLazy\",\n enabled = vim.fn.has \"nvim-0.10.0\" == 1,\n },\n\n -- Parinfer parens management for Clojure\n {\n \"gpanders/nvim-parinfer\",\n filetype = { \"clojure\" },\n dependencies = {\n \"AstroNvim/astrocore\",\n opts = {\n options = { g = {\n parinfer_force_balance = true,\n parinfer_comment_chars = \";;\",\n } },\n },\n },\n },\n\n -- Treesitter structural editing\n -- package provides normal mode key mappings\n {\n \"PaterJason/nvim-treesitter-sexp\",\n filetype = { \"clojure\" },\n dependencies = {\n \"AstroNvim/astrocore\",\n opts = {\n -- configuration & keymaps overrides:\n -- https://github.com/PaterJason/nvim-treesitter-sexp#configuration\n },\n },\n },\n\n -- Conjure plugin for Clojure REPL\n {\n \"Olical/conjure\",\n -- load plugin on filetypes\n filetype = { \"clojure\" },\n dependencies = {\n \"AstroNvim/astrocore\",\n opts = {\n options = {\n g = {\n [\"conjure#log#hud#enabled\"] = false, -- show REPL log by default?\n [\"conjure#extract#context_header_lines\"] = 100, -- lines to examine for ns form\n [\"conjure#eval#comment_prefix\"] = \";; \",\n },\n },\n },\n },\n },\n}\n</code></pre> <ol> <li>ts-comment.nvim clojure pattern was merged into the project by pull request #19 so this configuration is now redundant</li> </ol> <p>Thank you.</p> <p> Practical.li Website</p> <p> Practical.li GitHub Org practicalli-johnny profile</p> <p> @practicalli@clj.social @practical_li</p>","tags":["neovim"]},{"location":"multiple-ssh-keys-for-commercial-and-community-work/","title":"Multiple SSH keys for Commercial and Community work","text":"<p>Its easy to go down a rabbit hole of your own making when trying to make something complex work. Taking a step back allows for a much simpler approach to be considered.</p> <p>I realised there was a much simpler approach to managing multiple SSH keys, especially when one of those keys is for commercial work that requires Single Sign-On authorisation.</p>","tags":["git"]},{"location":"multiple-ssh-keys-for-commercial-and-community-work/#ssh-keys-git-client","title":"SSH Keys & Git client","text":"<p>There advantages to using separate SSH keys for work on commercial projects and open source projects.</p> <ul> <li>Increased security as only the SSH key with Single Sign-on (SSO) authorisation can send or receive data from the GitHub commercial Organisation. SSO authorisation should always be require for commercial projects.</li> <li>Increased tracability as signing commits with SSH keys has identity, the generated key and email address attached to the key via a comment when created, e.g. <code>ssh-keygen -t ed25519 -C \"email@domain.com\"</code></li> </ul> <p>Using multiple keys only requires a little extra configuration and helps keep a good separation between commercial and community work.</p> <p>Multiple Git Identities</p> <p>Configuration of a Git client for Multiple Git Identities can define a specific SSH key for a subset of projects, e.g. all projects under a <code>company-name</code> directory</p> <p>Practicalli recommends SSH keys for commit & tag signing as the configuration is simpler than PGP key signing</p>","tags":["git"]},{"location":"multiple-ssh-keys-for-commercial-and-community-work/#ssh-keys-github","title":"SSH Keys & GitHub","text":"<p>Multiple SSH keys can be used to push commits to a GitHub account by defining a host for each key in <code>$HOME/.ssh/config</code>.</p> <p>A host can have a name expressing its purpose, e.g. <code>Host practicalli</code>, <code>Host company-name</code>. Or a host can match all SSH calls with <code>Host *</code></p> <p>A host definition can be for the same service, e.g. <code>HostName github.com</code></p> <p>The URL in the git remote url should use the Host name rather than the service URL</p> <p>SSH Configuration with Multiple SSH keys</p> $HOME/.ssh/config<pre><code># ------------------------------------------\n# SSH Configuration - Practicalli\n#\n# - Remote Clojure Server nREPL connection\n# - Multiple SSH Keys for GitHub\n# ------------------------------------------\n\n# ------------------------------------------\n# Host Aliases for GitHub Multiple SSH keys\n# - HostName is used as connection domain\n\nHost community\n HostName github.com\n IdentityFile ~/.ssh/community\n\nHost commercial\n HostName github.com\n IdentityFile ~/.ssh/commercial\n\nHost engineering\n HostName github.com\n IdentityFile ~/.ssh/practicalli-engineering\n\nHost personal\n HostName github.com\n IdentityFile ~/.ssh/practicalli-johnny\n# ------------------------------------------\n\n# ------------------------------------------\n# MacOSX additional configuration\n\n# `UseKeyChain` required for MacOSX keychain access\n# Host company-name\n HostName github.com\n# AddKeysToAgent yes\n# UseKeychain yes\n# IdentityFile ~/.ssh/id_ed25519\n# ------------------------------------------\n</code></pre>","tags":["git"]},{"location":"multiple-ssh-keys-for-commercial-and-community-work/#sso-sign-on","title":"SSO sign-on","text":"<p>Using multiple Host definitions with SSH keys failed when a GitHub Organisation containing the repository requires Single Sign-on (SSO) authorisation.</p> <p>Setting the default host, <code>Host *</code> with the key that has SSO authorisation resolves this issue.</p> <p>SSH Configuration with Default Host</p> $HOME/.ssh/config<pre><code># ------------------------------------------\n# SSH Configuration - Practicalli\n# ------------------------------------------\n\n# ------------------------------------------\nHost *\n HostName github.com\n IdentityFile ~/.ssh/commercial\n\n# Host for Community key commented\n# Host engineering\n# HostName github.com\n# IdentityFile ~/.ssh/practicalli-engineering\n# ------------------------------------------\n</code></pre> <p>Assumption: Pushing can be done with any SSH Key added to GitHub account</p> <p>Once a commit has been signed by the relevant key, the identity is part of that commit.</p> <p>Using a different SSH key than was used to signed a commit does not change the commit. As long as an SSH key has been added to the GitHub account that has access, any key can be used.</p> <p>A specific key is only requred when the GitHub Organisation owning a repository requires a key to be SSO authorisation.</p>","tags":["git"]},{"location":"multiple-ssh-keys-for-commercial-and-community-work/#project-library-dependency-updates","title":"Project library dependency updates","text":"<ul> <li>Practicalli Sustainable Life</li> <li>Megalinter update-artifacts v4</li> <li>Practicalli Project Templates</li> <li>add <code>outdated</code> Makefile task from Clojure CLI Config project</li> <li>DeLaGuardo/setup-clojure 12.5</li> <li>actions/cache v4.0.2</li> <li>clj-kondo/clj-kondo 2024.05.24</li> <li>clojure/brew-install 1.11.3.1463</li> <li>greglook/cljstyle 0.16.626</li> <li>io.github.seancorfield/deps-new .7.1</li> <li>lambdaisland/kaocha 1.91.1392</li> <li>org.clojure/clojure 1.11.3</li> <li>org.clojure/clojure 1.11.3</li> </ul> <p>Thank you.</p> <p> Practical.li Website</p> <p> Practical.li GitHub Org practicalli-johnny profile</p> <p> @practicalli@clj.social @practical_li</p>","tags":["git"]},{"location":"the-wonderful-complexity-of-people/","title":"The wonderful complexity of people","text":"<p>A Tail of Two Cities - Charles Dickens</p> <p>It was the best of times, it was the worst of times.</p> <p>Johnny Stevenson (maybe others)</p> <p>People are wonderfully complex experiences</p> <p>My feelings of disappointed with my current commercial role are returning to the forefront of my mind. Many aspects of the role and company seem to be clear in peoples minds but not always effectively shared. I think I understand the role and then something else happens that makes me feel I don't. I believe something will need to change soon for the benefit of all.</p> <p>There have been a few highlights with the role, but I expected more of myself and the company. I do set high expectations for myself, although have learned to be more kind about what I can realistically achieve and 'which battles to fight' (figuratively speaking of course).</p> <p>During this engagement I have continually reset my expectations about what could be achieved and what I could realistically achieve. There are a couple of peers where there has been conflict without understanding of why I am seen as the cause. I have tried to explore but if people do have issues with me its not clearly being communicated to me.</p> <p>In hindsight, many opportunities to get support from my manger and peers were missed. Mostly as we had so many challenges to discuss and partly due to pressures of delivery.</p> <p>When a person doesn't have clarity around a problem then there is very little they can do to resolve or adapt.</p> <p>A self-reflection review is in progress and its is a good opportunity to take my own time to reflect on my current role and if its still the right fit for me.</p>","tags":["leadership"]},{"location":"the-wonderful-complexity-of-people/#challenges-at-work","title":"Challenges at work","text":"<p>I seem to have lost communication or trust with the team and its not clear why. I did carve out an on-boarding plan as my duties are required as an engineering manager. I told the team that there was a plan, but it seems they have other ideas about what to do. Ideas were welcome and requested as I formulated the plan, but then perhaps down to enthusiasm other team members started defining their own tasks without sharing them to me so I could plan around them.</p> <p>So its easy for me to start having doubts that about my relationship with the team and how much of this communication was often hidden from me. Was this done on purpose or was sharing these details with their engineering manager simply not considered.</p> <p>I have spent a year working with the team and as the \"Engineering Manager\" they did feel distant at times which I ascribed to the rather intense schedule of work. When I specifically reached out to the team, they were mostly happy to talk with me and steadily started to share their concerns. Some engineers did start pro-actively reaching out to me and allowing me to help them.</p> <p>It is very easy as an engineer to become insular and minimise interaction with others, especially when the environment is highly pressured or very fast paced. There can also be insecurity when talking to a perceived person of positional power, it happens to many of us.</p> <p>Thank you.</p> <p> Practical.li Website</p> <p> Practical.li GitHub Org practicalli-johnny profile</p> <p> @practicalli@clj.social @practical_li</p>","tags":["leadership"]},{"location":"the-king-is-probably-dead-long-live-the-king/","title":"The king is probably dead long live the king","text":"<p>Quote</p> <p>You are only a leader if people are willing to follow</p> <p>It has been hard to shake the concern that my current commercial role has not worked out, probably not really been working for quite a while in hindsight. Was it ever really working?</p> <p>Some aspects have greatly improved but there are some fundamental communication constraints that I really didn't understand the cause of (plenty of assumptions, but not enough communication or time to really address these challenges).</p> <p>There are the common systemic challenges that come from working at any startup that is working hard to establish itself as a long term sustainable business. This was a given. A new person coming into this environment that has been running for many years leaves a lot of context unknown and typically unspoken.</p> <p>I continued to try identify the causes throughout the week and trying to evaluate if there is any appetite and opportunity to address these within our typical schedule. It did feel that the more I tried to connect the quicker the feeling of connection slipped away.</p> <p>I believe my frustration and disappointment have been leaking out over the last month, which I am disappointed about as well.</p> <p>It is always a challenge for an engineering manager to identify where they can add value. For much of the current role I never seemed to connect with the team at a deep enough level. It is too easy to feel I am simply not needed by the team as the communication has been very limited. In once exceptional case, it was easy to feel my presence was simply not wanted.</p> <p>Tuesday I was really exhausted, partly because of the continued cough but also the concerns that I still wasn't able to break through to the team (especially if they feel unsafe to ask questions). I am not sleeping well and need to find energy to exercise more.</p> <p>Wednesday I made time for self-reflection as part of the company feedback initiative. I did struggle to quantify to myself what I had done. In hindsight I should have spend more time on this and consulted my journal, although I still feel I would come up short of my own lofty goals for the role.</p> <p>Friday was the end of my commercial current role.</p> <p>The title of this article is from the first episode of the first series of the Black Adder TV show. There were quite a few Shakepearean quotes used for comic effect.</p>","tags":["leadership"]},{"location":"the-king-is-probably-dead-long-live-the-king/#onboarding","title":"Onboarding","text":"<p>When someone new starts they are overflowing with enthusiasm. Having a clear plan helps balance that enthusiam with all the mundane tasks that should be done early, so they are not a continual distraction.</p> <p>In the months leading up to the new starter the team was asked for specific things they could work on. The team were very focused on the new feature so had little opportunity to think about this. This feature is complete and the team have more scope to support and pair with our new engineer.</p> <p>Even switching to time-boxed engineer priorities work seemed challenging, as the engineers are not used to considering what work is important to them.</p>","tags":["leadership"]},{"location":"the-king-is-probably-dead-long-live-the-king/#groundhog-day-for-movies-but-not-work","title":"Groundhog day for movies but not work","text":"<p>I love a good 'Groundhog day' homage in a movie or tv series</p> <p>When it comes to a groundhog experience at work, repeating mistakes that we had moved away from, it feels like a huge step backwards. Our current planned work feels like we are falling into older and more familiar patterns that didnt work well, especially rushing into new work without clearer definition. At least everyone is well aware of these challenges, although making them part of our default approach may take some time (especially under percieved timeline pressures).</p> <p>I am trying to push back and ensure we have clarity and time, only doing the essential work. This should avoid the kinds of problems experienced previously.</p> <p>Stargate SG-1 Episode </p> <p>An excellent exploration of the 'groundhog day' or time-loop effect was presented in the Stargate SG1 'Window of Opporunity' episode</p> <p>Two of the main characters become stuck in a time loop. Once they realise they are stuck they try everything they can think of to break out, all of which leading to failure. Eventually they decide to take a day off and enjoy themselves.</p> <p>Sometimes you need to step away from a challenge before you can start to resolve it.</p> <p>Thank you.</p> <p> Practical.li Website</p> <p> Practical.li GitHub Org practicalli-johnny profile</p> <p> @practicalli@clj.social @practical_li</p>","tags":["leadership"]},{"location":"practicalli-plans-for-the-rest-of-the-year/","title":"Practicalli plans for the rest of the year","text":"<p>Starting to plan work for the Practicalli content for the next 3 months.</p> <p>On the Practicalli GitHub Org, action log retention time was minimised to a week (from 90 days) as I don't need to wade through that history and it will save a bit of storage in the Cloud. I am surprised GitHub have such a high default for their free plans.</p> <p>Upgraded to a Dell 40 inch 5k2k monitor for work and it makes a huge difference. Its a beautiful monitor and it works really well with Linux and the tiling window of Regolith Desktop (i3).</p> <p>I am continuing my search for a new place to live, even further into the countryside with easy access to hiking and cycling activities.</p> <p>Although I am always thankful for an opportunity to work with a commercial company, I do feel the weight lifted from my shoulders now that relationship has concluded. Within hours I started to feel the return of much of the energy I have been lacking for the last few months.</p> <p>They do say a change is as good as a rest, so investing time in Practicalli content is giving me an energy boost.</p> <p></p>","tags":["practicalli","hardware","github"]},{"location":"practicalli-plans-for-the-rest-of-the-year/#practicalli-plans","title":"Practicalli Plans","text":"<p>Existing books</p> <ul> <li>review the main Practicalli books and make updates to examples, tools and libraries as required</li> </ul> <p>Practicalli Neovim</p> <ul> <li>more examples of common vim-editing approaches</li> <li>additional information to crafting your own configuration based on Practicalli Astro</li> <li>expand on Clojure workflow (debugging, data browsers, reloading, etc)</li> <li>research constraint to renaming namespaces with LSP</li> </ul> <p>Practicalli Clojure Service</p> <ul> <li>authentication (basic, api key, message signatures, etc)</li> <li>authorisation (permissions & roles)</li> <li>update examples to use Reitit & Reitit ring</li> </ul> <p>Long term projects</p> <ul> <li>clojure stack - guide to common libraries and trade-offs within Clojure, helping new and experienced engineers know what libraries to use and how to compose them together effectively</li> </ul> <p>Managing Content:</p> <ul> <li>Grafana dashboards for Megalinter across all Practicalli repositories</li> <li>Review design of Grafana dashboards and identify changes to enhance management of Practical.li content</li> </ul> <p>Geeking out</p> <ul> <li>New monitor and review</li> <li> Hyprland & Wayland on Debian Linux - advantages and constraints currently experienced. Wayland is fast but not all the apps I use are fully supported.</li> <li>Evaluating the Hyprland experience using ArchLinux. Hyprland is moving fast and is not a desktop experience like Regolith, so am experimenting with nwg-shell and all its tools to create a full desktop experience.</li> </ul>","tags":["practicalli","hardware","github"]},{"location":"practicalli-plans-for-the-rest-of-the-year/#hyprland-references","title":"Hyprland references","text":"<ul> <li>Install hyprland on Linux - Its FOSS</li> <li> JaKooLit/Arch-Hyprland Hyprland & Archlinux install script</li> <li> gaurav210233/simple-hyprland</li> </ul>","tags":["practicalli","hardware","github"]},{"location":"practicalli-plans-for-the-rest-of-the-year/#new-monitor","title":"New Monitor","text":"<p>To help manage the Practicalli workflow more effective I have invested in a larger monitor with a 5120x2160 resolution, known as a 5k2k monitor.</p> <p>Several 5k2k monitors were considered</p> <ul> <li> Dell U4025QW IPS Black panel, Thunderbolt, USB hub, Network KVM: YouTube Review, Text review</li> <li> Philips 40B1U6903CH W-LED panel, lots of ports, built-in webcam and hook for headphones</li> <li> LG 40wp95cp-w Nano IPS panel, limited number of ports</li> </ul> <p>The Dell monitor was the only monitor using an \"IPS Black\" panel, providing the closest color experience to an OLED monitor (without the challenges of OLED).</p> <p>The Dell monitor had lots of excellent reviews and a few extra touches that set it apart from the others.</p> <p>Lots more USB ports (A and C) which are available via the Thunderbolt ports (Thunderbolt is a USB-C port that also provides power).</p> <p>An Ethernet port connects the monitor the local network and will share that connection with any computer connected.</p> <p>The Thunderbolt (USB-C) port connects the monitor to the laptop, sharing the ethernet connection and any USB devices connected (Video Camera, External Mic, Model 100 Keyboard). The Thunderbolt port provides plenty of power to charge up the laptop too.</p> <p>Network KVM to control any computer on the local network (still have to try this).</p> <p> Scan.co.uk had a very good 1 day deal with 200 GBP, compared to the price anywhere else, so I took the plunge and I have no regrets so far.</p> <p>OLED not considered... yet</p> <p>OLED panels are excellent for a gaming monitor or where ever the screen pixels are in constant change (or black).</p> <p>There is a risk of burn-in when using an OLED panel for desktop productivity (coding, research, graphic design) as parts of the screen may not change all day (e.g. status bars, browser tabs, etc). OLED monitors should include software to mitigate the risk of burn-in, although these can be distracting.</p> <p>Third generation Quantum Dot OLED (QD-OLED) panels have greatly improved the text sharpness, especially on monitors with Pixels Per Inch (PPI) of 140 usually found on 4k and 5k monitors. For general use this text quality should be fine. QD-OLED would not be as sharp as an IPS monitor though, especially with an IPS Black panel.</p>","tags":["practicalli","hardware","github"]},{"location":"practicalli-plans-for-the-rest-of-the-year/#arm-mounting-monitors","title":"Arm Mounting Monitors","text":"<p>The Dell monitor provides a very sturdy stand with some mobility. Mounting on a sturdy arm gives greater flexibility in movement and positions available</p> <p>I already have Thingyclub mounting arms which can hold the weight of the Dell monitor, although the tension is close to the maximum. I also use arms to mount laptops, positioning the laptop screen relative to the monitor position. Mounting the laptops also makes more desk space. The Lenovo Thinkpad laptops fold out flat, so they take very little space</p> <p>A mechanical keyboard is used to drive the laptops, rather than their own keyboard. Practicalli uses Keyboard.io Model 100 keyboards.</p> <p> Secret Labs have excellent heavy duty monitor arms with optional handles to making it very easy to position the monitor (without touching the monitor itself). They also have some really high quality desks too. These are premium products with a price tag to match, so should be considered a long term investment.</p> <p> UltraArm also provide heavy duty monitor arms at a more modest price, although I havent carried out a comparison between the two products.</p> <p> Secret Labs Magnus Heavy Duty Monitor Arm</p> <p> Secret Labs Magnus Pro desk</p>","tags":["practicalli","hardware","github"]},{"location":"practicalli-plans-for-the-rest-of-the-year/#practicalli-blog-publishing-issue","title":"Practicalli Blog publishing issue","text":"<p>Material-MkDocs Issue 7725</p> <p>The GitHub action workflow use to publish the Practicalli blog websites started failing two days ago when <code>mkdocs-material</code> version 9.5.45 was release.</p> <p>Posts with only a date value started to fail the MkDocs build due to an issue with the <code>date:</code> format. Practically blog posts use the <code>yyyy-mm-dd</code> format without a time or timezone. When Material for MkDocs is comparing the date of the post with the current time an error occurs.</p> <p>I temporarily resolved the issue by explicitly configuring Python PIP to install <code>mkdocs-material</code> version 9.5.44 package in the GitHub Action workflow file.</p>","tags":["practicalli","hardware","github"]},{"location":"practicalli-plans-for-the-rest-of-the-year/#optimise-github-org-log-retention","title":"Optimise GitHub Org Log retention","text":"<p>The Practicalli Org settings default to a 90 day retention time for logs from actions. This is more time than required for Practicalli books and blogs contained in the Org. Its probably far too long for the Clojure projects too.</p> <p>The logs from the scheduled version action may be checked several days later, otherwise I typically on look at action logs on the same day they were run.</p> <p>The Org Actions settings for artifact and log retention are now set for a maxiumum of 7 days.</p> <p>I plan to reduce the action logs retention time even further for specific repositories, e.g. blogs and journals that are more frequently updated. Once the books are updated then I should be able to reduce the retention time for them too.</p> <p>Lower retention time for motivation</p> <p>The lower the retention time for action logs, the more encouragement I have to update library versions sooner ;)</p> <p>Thank you.</p> <p> Practical.li Website</p> <p> Practical.li GitHub Org practicalli-johnny profile</p> <p> @practicalli@clj.social @practical_li</p>","tags":["practicalli","hardware","github"]},{"location":"making-use-of-black-friday/","title":"Making use of Black Friday","text":"<p>Black Friday as a concept is confusing as it no longer has anything to do with a specific Friday and currently seems to cover at least 2 weeks of promotions. I did get some good prices even before Black Friday actually started.</p> <p>Adventures with SSD and NAS Versions kept me busy over the weekend, resurrecting an older NAS unit with Solid State Drives for a very quiet media storage device.</p>","tags":["network-attached-storage","solid-state-drive","thecus","network-file-system"]},{"location":"making-use-of-black-friday/#nas","title":"NAS","text":"<p>Resurected a Thecus N3200 Pro Network Attached Storage (NAS) unit and learned some new Linux commands and more about NFS along the way.</p> <p>The Thecus N3200 was previously used as storage for an Linux entertainment system powered by ..., connected to a normal TV. The Thecus had 3 x 3.5\" hard drives which gave up to 4TB if used in a RAID 5 configuration. The NAS was bought many many years ago so not the fastest by a long way, but it was fast enough to stream music and video from.</p> <p>There was some noise from the 3 hard drives it supported, although it was only heard when not playing something. The fan in the Thecus NAS was fairly quite, so the theory was that with SSD drives then the NAS should be very quite indeed.</p> <p>I bought 3 SSD drives to create a RAID 5 array in the Thecus NAS. I found the fanxiang 2TB SSD SATA III 6Gb/s 2.5\u2033 drives were at a reasonable price on Smile.amazon.co.uk. These SSD's had good reviews and it will be interesting to see how well they last.</p> <p>The fanxiang SSD are 2.5\" size, so a SABRENT 2.5\" to 3.5\" Internal Hard Drive Adapter Converter mounting Frame was used to fit them into the Thecus Nas.</p> <p>The Thecus NAS provides clip-in rails to fit the drives into the drive bay, with a thumbscrew on each rail to securely fit the drive without need for a tool (other than your finger and thumb).</p> <p>Using the Web console, it was very simple to create a RAID 5 array, although it did take more than a day to build the RAID 5 array, with all the parity checking.</p> <p>RAID 5 used as reliability of disks is an unknown</p> <p>Once the RAID array was build, then there was a handy utility to create a shared folder which could be exposed via NFS, allowing me to write and read files from the NAS.</p> <p>Create local directory for NFS share mount point</p> <pre><code>mkdir /media/Entertainment\n</code></pre> <p>As the Thecus N3200 Pro is quite old, there hasnt been a firmware upgrade in quite some time. Therefore the NAS only had NFS version 3 (NFS 4 is not common). This did prevent me from connecting with the usual NFS share commands. I found that adding the <code>vers=3</code> (or its alias <code>nfsvers=3</code>) as an nfs mount option made it all work nicely.</p> <p>Define mount points for NFS shares</p> /etc/fstab<pre><code>nas:/raid0/data/Ents /media/Entertainment nfs defaults,user,noauto,nfsvers=3,rsize=8192,wsize=8192,timeo=14,intr\n</code></pre> <p>Any changes to the <code>/etc/fstab</code> file should be reloaded using the <code>systemctl daemon-reload</code> command</p> <p>Reload fstab mount points</p> <pre><code>systemctl daemon-reload\n</code></pre> <p>In nautilus file explorer the mount points are shown, so clicking on them I could start adding my files and backing up my laptops.</p> <p>Thank you.</p> <p> Practical.li Website</p> <p> Practical.li GitHub Org practicalli-johnny profile</p> <p> @practicalli@clj.social @practical_li</p>","tags":["network-attached-storage","solid-state-drive","thecus","network-file-system"]},{"location":"practicalli-content-planning/","title":"Practicalli content planning","text":"<p>Hyprland promises to be a great experience but also a potential time drain, so will save most of the investigation and further configuration until the winter break (or if I need a little distraction of the new shiny for motivation).</p> <p>Taking two weeks off from work and have some time to work on Practicalli content.</p>","tags":["clojure","megalinter","neovim"]},{"location":"practicalli-content-planning/#megalinter","title":"Megalinter","text":"<p>Update Megalinter to version 8.1.0 to check if the API_REPORTER logs were pushed to the Practicalli Grafana dashboard.</p> <p>Use Megalinter 8.1.0 Documentation flavor in GitHub workflow</p> <pre><code> # MegaLinter Configuration\n - name: MegaLinter Run\n uses: oxsecurity/megalinter/flavors/documentation@v8.1.0\n</code></pre> <p></p>","tags":["clojure","megalinter","neovim"]},{"location":"practicalli-content-planning/#neovim","title":"Neovim","text":"<p>Video topics</p> <ul> <li>Install Neovim with Practicalli Astro, including how to override my own preferences</li> <li>REPL workflow, starting a REPL & connecting, using the REPL Log, connecting portal</li> <li>Git source code management with Neogit</li> </ul> <p>Thank you.</p> <p> Practical.li Website</p> <p> Practical.li GitHub Org practicalli-johnny profile</p> <p> @practicalli@clj.social @practical_li</p>","tags":["clojure","megalinter","neovim"]},{"location":"hacking-on-practicalli-content/","title":"Hacking on Practicalli content","text":"<p>I am enjoying my 2 week at home vacation (stay-cation) and have already completely rewired my desk, laptops, Monitors and NAS storage devices on the electronic standing desk. It feels a lot more organised and easier to find everything as everything has its place.</p> <p>Now I can focus on getting lots of Practicalli content done (as well as catch up with shows on Paramount+ and maybe a little Polybus on the Playstation4 VR headset)</p> <p>I am interested in switching to the Hyprland, although its changing fast so I dug out an older laptop and installed Arch Linux with Hyprland using the <code>archinstall</code> tool. Unfortunately the laptop I used doesnt seem to support Hyprland or something is missing from the install.</p> <p>I am taking a stay-cation as I am still recovering from Covid and the weather is also quite grim. I am getting out for walks each day and on Friday I completed a short cycle ride as it was nice and sunny outside. Unfortunately my chest started feeling like it was on fire a few minutes into the ride, so I slowed down and limited myself to 10km.</p> <p>I was feeling really sleepy after the ride, so I kept myself awake by sorting through the cardboard boxes in my attic. Many boxes made the ultimate sacrifice (for an uncluttered house) and went to the recycling service.</p>","tags":["neovim","practicalli"]},{"location":"hacking-on-practicalli-content/#practicalli","title":"Practicalli","text":"<p>Plans for content development for the next two weeks</p> <p>Neovim - using neotree to navigate - Backspace to navigate up the tree - Enter to navigate into a directory - . to set the current directory as root (so actions become relevant to the project, e.g. file and word searches)</p>","tags":["neovim","practicalli"]},{"location":"hacking-on-practicalli-content/#neovim-neogit","title":"Neovim - Neogit","text":"<p>Ensure the common git workflows are captured in Practicalli Neovim</p> <ul> <li>create local tracking branch for a remote branch</li> <li>stage lines, hunks and files</li> <li>commit & commit amend</li> <li>signed commits and showing the signature is good (locally and on GitHub)</li> <li>use rebase interactive to squash commits, e.g. some commits shouldnt be separate, managing commits that were not signed correctly.</li> <li>apply a patch file</li> </ul> <p>AstroNvim updates - neogit</p> <ul> <li>6837a5d Feature: Two new user commands, <code>:NeogitLog</code> and <code>:NeogitCommit</code> can now be used to show all log entries for a specified file, or range within a file, and NeogitCommit can be used to show a detailed commit view for a specified SHA/commitish value (2 days ago)</li> </ul>","tags":["neovim","practicalli"]},{"location":"hacking-on-practicalli-content/#hyprland","title":"Hyprland","text":"<p>Hyprland is a very appealing wayland compositor with dynamic tiling window manager. As Hpryland is a rapidly moving project, so using Arch Linux will be useful to follow along with the rapid updates.</p> <p>There is a useful video that simplifies the install and saves time reading of Arch Wiki that would otherwise be required.</p> <p>Hyprland failed to run after install</p> <p>I assume the laptop I installed Arch and Hyprland doesnt have the right hardware (video card) to run as its over 16 years old now.</p> <p>The laptop does run Gnome with wayland though.</p>","tags":["neovim","practicalli"]},{"location":"hacking-on-practicalli-content/#installing-arch","title":"Installing Arch","text":"<p>Arch Linux downloads page provides a magnetic link (opens in torrent client) or a <code>.torrent</code> file download.</p> <p>Either approach should see the 1.17GB Arch ISO download in a few minutes.</p> <p>Get a USB stick with 2GB or more memory and plug into the laptop that has the ISO image (make sure there is nothing important on the USB stick as it will be erased).</p> <p>Copy Arch ISO to USB Stick</p> <p>Show the name of the USB stick</p> <p><pre><code>ls -l /dev/disk/by-id/usb-*\n</code></pre> Copy the ISO image to the USB stick</p> <pre><code>dd bs=4M if=/home/practicalli/Downloads/archlinux-2024.10.01-x86_64.iso of=/dev/disk/by-id/usb-Generic_Flash_Disk_22F1D320-0:0 conv=fsync oflag=direct status=progress\n</code></pre> Output of dd command <pre><code>1166016512 bytes (1.2 GB, 1.1 GiB) copied, 96 s, 12.1 MB/s\n279+1 records in\n279+1 records out\n1173389312 bytes (1.2 GB, 1.1 GiB) copied, 96.724 s, 12.1 MB/s\n</code></pre> <p>Insert the USB stick in the computer to install Arch Linux upon and switch that computer on.</p> <p>The Arch Linux splash screen shows, Enter to start installing. Once finished, a minimal Linux OS is ready to use.</p>","tags":["neovim","practicalli"]},{"location":"hacking-on-practicalli-content/#configure-arch","title":"Configure Arch","text":"<p>There is a long and quite dull installation guide for Arch which would be of interest if you do not already know Linux.</p> <p>The quicker approach is to use the Arch install command</p> <p>Install Arch packages and Hyperland</p> <pre><code>archinstall\n</code></pre> <ul> <li>Archinstall language: English (default)</li> <li>Mirrors: United Kingdom</li> <li>Locales: uk, en_GB, UTF-8</li> <li>Disk configuration > Partition: use best-effort > Select computer drive > Select filesystem kind: ext4 > separate home partition: no</li> <li>Root password: set</li> <li>User account: added practicalli</li> <li>Profile: Desktop > Hyprland</li> </ul> <p>Select install and sit back for a few minutes</p> <p>Arch install prompts about chroot into the newly installed system, e.g. to install additional packages or configure stuff.</p>","tags":["neovim","practicalli"]},{"location":"hacking-on-practicalli-content/#hardware","title":"Hardware","text":"<p>The buttons on my Logitec MX Ergo trackball were not working so well, so I investigated replacing the switches.</p> <p>Michael Stapelberg has a nice guide to replacing the default buttons with Kailh GM 8.0 switches, which are described as 'ultra high life'. Replacing the switches does require soldering.</p> <p>For now, I ensure I keep a decent charge in the Logitec MX Ergo trackball which seems to help greatly.</p> <p>Thank you.</p> <p> Practical.li Website</p> <p> Practical.li GitHub Org practicalli-johnny profile</p> <p> @practicalli@clj.social @practical_li</p>","tags":["neovim","practicalli"]},{"location":"holiday-in-paramout-plus/","title":"Holiday in Paramout Plus","text":"<p>After being ill for most of the week I am finally starting to enjoying my second week of holiday, binging on some Paramount+ and having a lazy Sunday enjoying the extra hour in bed after the end of summer time.</p> <p>Updating Practicalli Journal and Clojure CLI Config repositories, fixing links and markdown issues from the Megalinter reports.</p> <p>Updating to Megalinter 0.8.1 GitHub action on Practicalli repositories as I work on them. The upgrade will include each repository in the Grafana dashboards for Practicalli projects.</p> <p>Issues</p> <ul> <li>DOING security: add clj-watson to clojure cli config</li> <li>DOING zsh environment varaibles not loading into jvm</li> </ul>","tags":["clojure"]},{"location":"holiday-in-paramout-plus/#clojure-cli-config","title":"Clojure CLI Config","text":"<p>Resolved all the issues reported by Megalinter.</p> <p>Updated the Megalinter config and workflows to the latest versions and common Practicalli configs.</p> <p>Installed markdown-table-formatter npm package globally to ensure all the markdown tables were correctly formatted.</p> <pre><code>npm install markdown-table-formatter -g\n</code></pre> <p>The README.md file containing the markdown tables was saved and any changes staged, so I could see exactly what the markdown-table-formatter tool fixed.</p> <pre><code>markdown-table-formatter README.md\n</code></pre> <p>All the markdown tables were updated and nicely formatted.</p> <p>NOTE: There is a <code>--check</code> option, but this did not give any details of what tables were not correctly formatted, so not a useful option in this case.</p>","tags":["clojure"]},{"location":"holiday-in-paramout-plus/#clj-watson","title":"clj-watson","text":"<p>clj-watson is a software composition analysis (SCA) tool, reporting on security vulnerabilities detected in the libraries used for a project.</p> <p>clj-watson scans for reported security vulnerabilities for library dependencies defined in the deps.edn file of a Clojure project. clj-watson also scans transitive library dependencies (library dependencies of each defined dependency)</p> <p>An <code>:security/nvd-scan</code> alias has been designed for Practicalli Clojure CLI Config.</p> <p>:security/nvd-scan alias design</p> <pre><code> ;; clj-holmes/clj-watson/\n ;; Request an API key from: https://nvd.nist.gov/developers/request-an-api-key\n ;; `CLJ_WATSON_NVD_API_KEY` set to API key value\n :security/nvd-scan\n {:replace-deps\n {io.github.clj-holmes/clj-watson {:git/tag \"v6.0.0\" :git/sha \"cb02879\"}}\n :main-opts [\"-m\" \"clj-watson.cli\" \"scan\"]}\n</code></pre> <p>The alias requires an API Key to access the NIST National Vulnerability Database (NVD).</p> <p><code>CLJ_WATSON_NVD_API_KEY</code> environment variable was set to the value of the API Key via the <code>.zshenv</code> file in my user account.</p> <p>Tested the <code>:security/nvd-scan</code> alias with the Practicalli Project Templates repository.</p> <p>Running the designed alias was not picking up the <code>CLJ_WATSON_NVD_API_KEY</code> environment variable</p> <p>Fails to find API Key</p> <pre><code>clojure -M:security/nvd-scan\n</code></pre> <p>Zsh configuration broken - not loading env vars correctly</p> <p>On one laptop the zsh configuration has a fault and environment variables are not being loaded when running <code>clojure</code>. The suggestion from the Clojure community was to ensure autoexport is set. <pre><code>setopt allexport && source ~/.zshenv\n</code></pre></p> <p>Defining the NIST API Key as part of the command successfully downloaded the database and scanned the library dependencies.</p> <p>Successfully finds key</p> <pre><code>CLJ_WATSON_NVD_API_KEY=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx clojure -M:security/nvd-scan\n</code></pre> <p>20 minutes to download the database</p> <p>On first run of the clj-watson tool, the NIST NVD database took 20 minutes and 32 seconds to download (on a very good Internet connection). Successive runs take about 10 seconds, although may be longer if there are substantial updates to the database.</p> <p>Added CLJ_WATSON_NVD_API_KEY to GitHub Secrets</p> <p>Practicalli GitHub Org is used to securely store API keys and other sensitive values. Secrets can be used by GitHub actions across any repository that is part of the Practicalli organisation.</p>","tags":["clojure"]},{"location":"holiday-in-paramout-plus/#neovim","title":"Neovim","text":"<p>The neogit graph view is now powered by gitgraph.nvim. There is a specific <code>graph_style</code> for the Kitty Terminal</p> <p>Neogit change history from Astro update</p> <pre><code> d523ae3 Add both flog style \"unicode\" graph and gitgraph style graph for kitty. (2 days ago)\n 3f82e30 Replace flog graph with gitgraph.nvim so we can support color (2 days ago)\n</code></pre> <p>Practicalli Astro - Astrocommunity plugin overrides - Neogit plugin</p> lua/plugins/user-practicalli.lua<pre><code> -- Neogit: astrocommunity.git.neogit\n {\n \"neogit\",\n dependencies = {\n { \"nvim-lua/plenary.nvim\", \"sindrets/diffview.nvim\" },\n },\n opts = {\n disable_signs = true, -- duplicate signs if enabled\n -- graph_style = \"unicode\", -- elegant commit graph\n graph_style = \"kitty\", -- elegant commit graph\n integrations = { diffview = true },\n },\n keys = {\n -- Neogit status - overrides stage hunk astronvim mapping\n { \"<leader>gs\", \"<cmd>Neogit<cr>\", desc = \"Status (Neogit)\" },\n },\n },\n</code></pre>","tags":["clojure"]},{"location":"holiday-in-paramout-plus/#tv-series","title":"TV Series","text":"<p>Star Trek Lower Desks provides a different and often quite silly experience of the world of Star Fleet. Catching up with season 3 this week.</p> <p>A Gentleman in Moscow is a moving Drama that covers some of the darkest times of the USSR. It provides a unique view of the peoples revolution and Stalin era from a person of privilege, adjusting to their new and revoltingly dark reality.</p> <p>The Castaways was okay, a nice distraction whilst fixing issues reported by Megalinter.</p> <p>Thank you.</p> <p> Practical.li Website</p> <p> Practical.li GitHub Org practicalli-johnny profile</p> <p> @practicalli@clj.social @practical_li</p>","tags":["clojure"]},{"location":"back-to-work/","title":"Back to work","text":"<p>Busy week at work getting ready for a new team member. I spent Friday afternoon building up a relationship and getting accustom to spending time working together. Several weeks of work had been done to get ready for the new starter.</p> <p>One of the interesting challenges for anyone starting a new job is to ensure too much enthusiasm doesnt lead to missing important steps. It will be a good first check-in with the new starter to see if they have been too enthusiastic or taken a more measured approach.</p> <p>Current issues</p> <ul> <li>DONE security: add clj-watson to clojure cli config</li> </ul>","tags":["clojure"]},{"location":"back-to-work/#clojure-cli-config","title":"Clojure CLI Config","text":"<p><code>:security/nvd-scan</code> and <code>:security/nvd-fix</code> aliases have been added to Practicalli Clojure CLI Config. Documentation on using these aliases still needs to be added.</p> <p>The first time one of these aliases is run, the NIST National Vulnerability Database is downloaded locally. This download can take a long time.</p> <p>clj-watson experiments in journal</p>","tags":["clojure"]},{"location":"back-to-work/#health","title":"Health","text":"<p>Back to work as Engineering Manager at Griffin for the platform team. Its a great team to work for and they delivered a really important security feature whilst I was away.</p> <p>My health is continuing to improve and I am aiming to complete a week of walking every day. My stats from the last blood test were not good, but not the worst they have been. Covid really impacts my health and I had very low blood oxygen last week which prevented ramping up my exercise routine.</p> <p>I continue to have a cough and tight lungs, but it does feel like the symptoms are easing and my motivation to exercise returning.</p> <p>Thank you.</p> <p> Practical.li Website</p> <p> Practical.li GitHub Org practicalli-johnny profile</p> <p> @practicalli@clj.social @practical_li</p>","tags":["clojure"]},{"location":"clojure-112-and-learn-clojure-book/","title":"Clojure 1.12 and Learn Clojure book","text":"<p>Work on Practicalli Learn Clojure book, a practical guide to getting comfortable working with Clojure. A full guide to using Clojure is in the Practicalli Clojure book.</p> <p>Added RSS feed for Journal, although I feel that all these blogs should be merged into the https://practical.li/blog site for a single collection or articles. The articles can be categorised to keep them separate.</p> <p>Health is still recovering from a little Covid symptoms. Took Monday off work and slept most of the day.</p>","tags":["clojure","practicalli"]},{"location":"clojure-112-and-learn-clojure-book/#clojure-112-release","title":"Clojure 1.12 release","text":"<p>Now that Clojure 1.12 has been released its time to update the Practicalli projects and guides to use 1.12 as the default version.</p> <p>The <code>add-libs</code> guides for hot loading libraries should be updated in Practicalli Clojure.</p> <p>The <code>user.clj</code> code for <code>add-libs</code> should be updated in Practicalli Project Templates</p> <p>Update Practicalli Clojure CLI Config to use newer versions of tools which have been updated to Clojure 1.12, e.g. deps-new.</p>","tags":["clojure","practicalli"]},{"location":"clojure-112-and-learn-clojure-book/#learn-clojure","title":"Learn Clojure","text":"<p>Practicalli Learn Clojure is a book to get you started with Clojure in a very practical way, for those curious about Clojure but haven't yet decided to go all in.</p> <ul> <li>Install (simplified)</li> <li>Using the REPL effectively</li> <li>a brief mention to using an editor and what features will beneifit</li> <li>Essential concepts</li> <li>comments, expressions (prefix notation), namespaces, simple data</li> <li>Writing and Evaluating code</li> <li>Writing and running tests</li> <li>Specifications & Generative testing</li> <li>Essential code styles & format tools</li> <li>Essential idioms</li> <li>Essential functions and namespaces from the Clojure Standard Library</li> <li>Challenges and day projects (can be completed in a day or less)</li> <li>Reference: Core principles (summary in introduction)</li> </ul> <p>The book will purposely avoid topics that are very rarely used, e.g. Macros, <code>deftypes</code>, <code>defrecords</code>, leiningen, community libraries, etc</p> <p>Should the reader want to go all in with Clojure, they should select the most appropriate book from the Practicalli Collection</p> <ul> <li>Practicalli Clojure - the full Clojure workflow</li> <li>Practicalli Clojure Web Services - production level projects build on reitit, reitit-ring, mutaana, jetty, mulog, etc.</li> <li>Practicalli ClojureScript - Pure ClojureScript projects figwheel (and little or no JavaScript packages or interop)</li> <li>Practicalli Neovim and Practicalli Spacemacs for editor specific guides</li> </ul> <p>Thank you.</p> <p> Practical.li Website</p> <p> Practical.li GitHub Org practicalli-johnny profile</p> <p> @practicalli@clj.social @practical_li</p>","tags":["clojure","practicalli"]},{"location":"megalinter-8-and-monthly-version-updates/","title":"Megalinter 8 and monthly version updates","text":"<p>Megalinter updates to version 8 using the megalinter runner tool, adding a Makefile task to simplify the command line (so I dont have to remember the command).</p> <p>Material for MkDocs provides a nice diff view using the <code>diff</code> language for a code block. Add or copy a diff into the code block, ensuring the <code>-</code> and <code>+</code> signs are included and the diff is automatically highlighted. See the Megalinter section of this post for an example.</p> <p>Feeling quite low the last few weeks, mostly due to continued Covid symptoms, low blood oxygen and lack of energy. Waking up I feel like I have experienced carbon dioxide poisoning (which I have experienced working on a mushroom farm). I am disorientated, dizzy and feel quite terrible.</p>","tags":["clojure"]},{"location":"megalinter-8-and-monthly-version-updates/#megalinter","title":"Megalinter","text":"<p>Megalinter runner now includes a tool to update a megalinter configuration file to use the latest version of Megalinter.</p> <pre><code>npx mega-linter-runner@latest --upgrade\n</code></pre> <p>To simplify using the command a <code>megalinter-update</code> task was added to the <code>Makefile</code> for the project.</p> <p>Megalinter update make task</p> <pre><code>megalinter-update: ## Update MegaLinter config to latest version\n $(info --------- MegaLinter Upgrade Config ---------)\n npx mega-linter-runner@latest --upgrade\n</code></pre> <p>The script updates the Megalinter GitHub workflow to use the latest version of the Megalinter action. The change respects if a specific flavour (e.g. java) of Megalinter was defined.</p> <p>Megalinter action in GitHub workflow</p> <pre><code> - name: MegaLinter Run\n id: ml\n ## latest release of major version\n- uses: oxsecurity/megalinter/flavors/java@v7\n+ uses: oxsecurity/megalinter/flavors/java@v8\n env:\n # ADD CUSTOM ENV VARIABLES OR DEFINE IN MEGALINTER_CONFIG file\n MEGALINTER_CONFIG: .github/config/megalinter.yaml\n</code></pre> <p>Links to the Megalinter documentation are also updated.</p> <p>The script updates <code>.gitignore</code> to exclude the <code>megalinter-reports/</code> directory. This change is not necessary for Practicalli projects as everything is ignored by default. Patterns in the <code>.gitignore</code> are added with the <code>!</code> prefix, allowing them to be included by Git.</p>","tags":["clojure"]},{"location":"megalinter-8-and-monthly-version-updates/#practicalli-project-templates","title":"Practicalli Project Templates","text":"<p>Each template configuration in Project Templates has their own megalinter workflow and configuration, so running the megalinter-runner upgrade tool is a good test.</p> <p>From the output of the script, all templates were updated successfully.</p> Megalinter runner upgrade script output <pre><code>\u276f make megalinter-upgrade\n--------- MegaLinter Upgrade Config ---------\nnpx mega-linter-runner@latest --upgrade\n\n .:oool' ,looo;\n .xNXNXl .dXNNXo.\n lXXXX0c. 'oKXXN0;\n .oKNXNX0kxdddddddoc,. .;lodddddddxk0XXXX0c\n .:kKXXXXXXXXXXXXNXX0dllx0XXXXXXXXXXXXXXXKd,\n .,cdkOOOOOOOO0KXXXXXXXXXXK0OOOOOOOkxo:'\n 'ckKXNNNXkc'\n ':::::;. .c0XX0l. .;::::;.\n 'xXXXXXx' :kx: ;OXXXXKd.\n .dKNNXXO; .. :0XXXXKl.\n .lKXXXX0: .lKXXXX0:\n :0XXXXKl. .dXXXXXk,\n ;kXXXXKd:cxXXXXXx'\n 'xXNXXXXXXXXXKo.\n .oKXXXXNXXX0l.\n .lKNNXNNXO:\n ,looool'\n\n==========================================================\n============= MegaLinter, by OX Security =============\n========= https://ox.security?ref=megalinter ===========\n==========================================================\n\n\u2714 This assistant will automatically upgrade your local files so you use MegaLinter v8\nPlease confirm to proceed :) \u2026 yes\nProcessing file resources/practicalli/mysql-compose.yaml\nProcessing file megalinter-reports/IDE-config/.hadolint.yaml\nProcessing file megalinter-reports/IDE-config/.grype.yaml\nProcessing file .github/workflows/scheduled-version-check.yaml\nProcessing file .github/workflows/quality-checks.yaml\nProcessing file .github/workflows/megalinter.yaml\n- Updating .github/workflows/megalinter.yaml with replacement /https:\\/\\/megalinter\\.github\\.io/gm -> https://oxsecurity.github.io/megalinter ...\n- Updating .github/workflows/megalinter.yaml with replacement /https:\\/\\/oxsecurity\\.github\\.io\\/megalinter/gm -> https://megalinter.io ...\n- Updating .github/workflows/megalinter.yaml with replacement /https:\\/\\/megalinter.io\\/configuration/gm -> https://megalinter.io/latest/config-file ...\n- Updating .github/workflows/megalinter.yaml with replacement /oxsecurity\\/megalinter\\/flavors\\/([a-z]*)@v7/gm -> oxsecurity/megalinter/flavors/$1@v8 ...\nUPDATED: .github/workflows/megalinter.yaml\nProcessing file .github/workflows/lint-review.yaml\nProcessing file .github/workflows/changelog-check.yaml\nProcessing file .github/config/megalinter.yaml\n- Updating .github/config/megalinter.yaml with replacement /https:\\/\\/oxsecurity\\.github\\.io\\/megalinter/gm -> https://megalinter.io ...\n- Updating .github/config/megalinter.yaml with replacement /https:\\/\\/megalinter.io\\/configuration/gm -> https://megalinter.io/latest/config-file ...\nUPDATED: .github/config/megalinter.yaml\nProcessing file resources/practicalli/service/root/swagger-compose.yaml\nProcessing file resources/practicalli/application/root/swagger-compose.yaml\nProcessing file resources/practicalli/application/root/compose.yaml\nProcessing file resources/practicalli/service/root/.github/FUNDING.yaml\nProcessing file resources/practicalli/landing_page/root/.github/FUNDING.yaml\nProcessing file resources/practicalli/application/root/.github/FUNDING.yaml\nProcessing file resources/practicalli/service/root/.github/workflows/scheduled-version-check.yaml\nProcessing file resources/practicalli/service/root/.github/workflows/quality-checks.yaml\nProcessing file resources/practicalli/service/root/.github/workflows/megalinter.yaml\n- Updating resources/practicalli/service/root/.github/workflows/megalinter.yaml with replacement /https:\\/\\/megalinter\\.github\\.io/gm -> https://oxsecurity.github.io/megalinter ...\n- Updating resources/practicalli/service/root/.github/workflows/megalinter.yaml with replacement /https:\\/\\/oxsecurity\\.github\\.io\\/megalinter/gm -> https://megalinter.io ...\n- Updating resources/practicalli/service/root/.github/workflows/megalinter.yaml with replacement /https:\\/\\/megalinter.io\\/configuration/gm -> https://megalinter.io/latest/config-file ...\n- Updating resources/practicalli/service/root/.github/workflows/megalinter.yaml with replacement /oxsecurity\\/megalinter\\/flavors\\/([a-z]*)@v7/gm -> oxsecurity/megalinter/flavors/$1@v8 ...\nUPDATED: resources/practicalli/service/root/.github/workflows/megalinter.yaml\nProcessing file resources/practicalli/service/root/.github/workflows/lint-review.yaml\nProcessing file resources/practicalli/service/root/.github/workflows/changelog-check.yaml\nProcessing file resources/practicalli/service/root/.github/config/megalinter.yaml\n- Updating resources/practicalli/service/root/.github/config/megalinter.yaml with replacement /https:\\/\\/oxsecurity\\.github\\.io\\/megalinter/gm -> https://megalinter.io ...\n- Updating resources/practicalli/service/root/.github/config/megalinter.yaml with replacement /https:\\/\\/megalinter.io\\/configuration/gm -> https://megalinter.io/latest/config-file ...\nUPDATED: resources/practicalli/service/root/.github/config/megalinter.yaml\nProcessing file resources/practicalli/minimal/root/.github/workflows/lint-review.yaml\nProcessing file resources/practicalli/landing_page/root/.github/workflows/scheduled-version-check.yaml\nProcessing file resources/practicalli/landing_page/root/.github/workflows/quality-checks.yaml\nProcessing file resources/practicalli/landing_page/root/.github/workflows/megalinter.yaml\n- Updating resources/practicalli/landing_page/root/.github/workflows/megalinter.yaml with replacement /https:\\/\\/megalinter\\.github\\.io/gm -> https://oxsecurity.github.io/megalinter ...\n- Updating resources/practicalli/landing_page/root/.github/workflows/megalinter.yaml with replacement /https:\\/\\/oxsecurity\\.github\\.io\\/megalinter/gm -> https://megalinter.io ...\n- Updating resources/practicalli/landing_page/root/.github/workflows/megalinter.yaml with replacement /https:\\/\\/megalinter.io\\/configuration/gm -> https://megalinter.io/latest/config-file ...\n- Updating resources/practicalli/landing_page/root/.github/workflows/megalinter.yaml with replacement /oxsecurity\\/megalinter\\/flavors\\/([a-z]*)@v7/gm -> oxsecurity/megalinter/flavors/$1@v8 ...\nUPDATED: resources/practicalli/landing_page/root/.github/workflows/megalinter.yaml\nProcessing file resources/practicalli/landing_page/root/.github/workflows/lint-review.yaml\nProcessing file resources/practicalli/landing_page/root/.github/workflows/changelog-check.yaml\nProcessing file resources/practicalli/landing_page/root/.github/config/megalinter.yaml\n- Updating resources/practicalli/landing_page/root/.github/config/megalinter.yaml with replacement /https:\\/\\/oxsecurity\\.github\\.io\\/megalinter/gm -> https://megalinter.io ...\n- Updating resources/practicalli/landing_page/root/.github/config/megalinter.yaml with replacement /https:\\/\\/megalinter.io\\/configuration/gm -> https://megalinter.io/latest/config-file ...\nUPDATED: resources/practicalli/landing_page/root/.github/config/megalinter.yaml\nProcessing file resources/practicalli/application/root/.github/workflows/scheduled-version-check.yaml\nProcessing file resources/practicalli/application/root/.github/workflows/quality-checks.yaml\nProcessing file resources/practicalli/application/root/.github/workflows/megalinter.yaml\n- Updating resources/practicalli/application/root/.github/workflows/megalinter.yaml with replacement /https:\\/\\/megalinter\\.github\\.io/gm -> https://oxsecurity.github.io/megalinter ...\n- Updating resources/practicalli/application/root/.github/workflows/megalinter.yaml with replacement /https:\\/\\/oxsecurity\\.github\\.io\\/megalinter/gm -> https://megalinter.io ...\n- Updating resources/practicalli/application/root/.github/workflows/megalinter.yaml with replacement /https:\\/\\/megalinter.io\\/configuration/gm -> https://megalinter.io/latest/config-file ...\n- Updating resources/practicalli/application/root/.github/workflows/megalinter.yaml with replacement /oxsecurity\\/megalinter\\/flavors\\/([a-z]*)@v7/gm -> oxsecurity/megalinter/flavors/$1@v8 ...\nUPDATED: resources/practicalli/application/root/.github/workflows/megalinter.yaml\nProcessing file resources/practicalli/application/root/.github/workflows/lint-review.yaml\nProcessing file resources/practicalli/application/root/.github/workflows/changelog-check.yaml\nProcessing file resources/practicalli/application/root/.github/config/megalinter.yaml\n- Updating resources/practicalli/application/root/.github/config/megalinter.yaml with replacement /https:\\/\\/oxsecurity\\.github\\.io\\/megalinter/gm -> https://megalinter.io ...\n- Updating resources/practicalli/application/root/.github/config/megalinter.yaml with replacement /https:\\/\\/megalinter.io\\/configuration/gm -> https://megalinter.io/latest/config-file ...\nUPDATED: resources/practicalli/application/root/.github/config/megalinter.yaml\nmega-linter-runner applied 24 replacements in 8 files.\nUpdated .gitignore file to exclude megalinter-reports from commits\n\nYou MegaLinter local configuration files has been updated !\nNow stage and commit updated files then push to see latest version of MegaLinter in action !\n\n\u2714 MegaLinter is now part of OX Security. -> https://www.ox.security/?ref=megalinter\n\nDo you want to try OX Security to secure your software supply chain security ? \u2026 no\n</code></pre> <p>Thank you.</p> <p> Practical.li Website</p> <p> Practical.li GitHub Org practicalli-johnny profile</p> <p> @practicalli@clj.social @practical_li</p>","tags":["clojure"]},{"location":"megalinter-grafana-dashboards/","title":"MegaLinter Grafana Dashboards","text":"<p>As Practicalli projects are being updated to Megalinter version 8 it seemed a good time to try the Megalinter API reporter to publish data to use with Grafana. A chance to learn more about creating Dashboards and if Grafana is any easier than DataDog.</p> <p>Megalinter not publishing logs on Grafana yet</p> <p>Unfortunately I havent been able to make the Megalinter API Reporter work with this journal project, Clojure CLI Config or a new megalinter-test project I created.</p> <p>Health is a little better after resting over the weekend, although still have lots of symptoms.</p> <p>Megalinter Grafana dashboard example project</p> <p> Practicalli Megalinter-Test</p> <p>NOTE: I am trying to diagnose why this project does not seem to be sending logs to Grafana.</p>","tags":["megalinter","grafana","dashboard","github","debian"]},{"location":"megalinter-grafana-dashboards/#github-profile","title":"GitHub Profile","text":"<p>Simple Icons CDN is used to include the icons for discussion and social media services such as GitHub Discussions, YouTube, Zulip, Slack and LinkedIn.</p> <p>I recently replaced the Twitter link & icon with that for my clj.social account on Mastodon.</p> <p>Simple Icons in GitHub profile</p> <pre><code><a href=\"https://youtube.com/practicalli\" target=\"blank\">\n <img height=\"64\" width=\"64\" src=\"https://cdn.simpleicons.org/youtube/crimson\" />\n</a>\n<a href=\"https://github.com/orgs/practicalli/discussions\" target=\"blank\">\n <img height=\"64\" width=\"64\" src=\"https://cdn.simpleicons.org/github/white\" />\n</a>\n<a href=\"https://clojurians.zulipchat.com/#narrow/stream/250781-practicalli\" target=\"blank\">\n <img height=\"64\" width=\"64\" src=\"https://cdn.simpleicons.org/zulip/green\" />\n</a>\n<a href=\"https://clojurians.slack.com/\" target=\"blank\">\n <img height=\"64\" width=\"64\" src=\"https://cdn.simpleicons.org/slack/firebrick\" />\n</a>\n<a href=\"https://clj.social/@practicalli\" target=\"blank\">\n <img height=\"64\" width=\"64\" src=\"https://cdn.simpleicons.org/mastodon/skyblue\" />\n</code></pre>","tags":["megalinter","grafana","dashboard","github","debian"]},{"location":"megalinter-grafana-dashboards/#debian","title":"Debian","text":"<p>The <code>date</code> command on Linux systems is used to show the system date or set a specific date and time. The system date can only be changed by the root account or accounts in the <code>sudo</code> group.</p> <p>When using the Gnome desktop the system date is automatically managed, keeping the date and time current.</p> <p>The <code>timedatectl</code> command is used to control automatic updating of the system time. This must be disabled to set the date and time to something other than the current.</p> <p>Disable automatic date-time</p> <pre><code>timedatectl set-ntp 0\n</code></pre> <p>When the timedateclt is disabled, then the <code>date</code> command can be used to set a specific date and or time.</p> <p>Set the date and time</p> <pre><code> date -s '2024-09-16 21:32:00'\n</code></pre> <p><code>date</code> command will show the current date, confirming that the OS system date was changed.</p> <p>Enable automatic date-time</p> <pre><code>timedatectl set-ntp 1\n</code></pre> <p>Linux used to use the ntp service which is available via the Debian <code>ntp</code> package, but not used by Gnome desktop</p>","tags":["megalinter","grafana","dashboard","github","debian"]},{"location":"megalinter-grafana-dashboards/#regolith","title":"Regolith","text":"<p>Unless a monitor has a KVM switch (or using KVM hardware) then Regolith will automatically change workspace arrangements when an external monitor is disconnected.</p> <pre><code>apt install regolith-i3-session\n</code></pre> <p>The swap focus i3 package seems to override the Super+. key binding that should otherwise be used to restore a window manager session.</p> <pre><code>apt remove --purge regolith-wm-swap-focus\n</code></pre> <p>Output - i3-swap-focus package should also be removed</p> <p>Output from apt remove command</p> <pre><code>The following package was automatically installed and is no longer required:\n i3-swap-focus\nUse 'apt autoremove' to remove it.\n\nREMOVING:\n regolith-wm-swap-focus*\n\nSummary:\n Upgrading: 0, Installing: 0, Removing: 1, Not Upgrading: 301\n Freed space: 17.4 kB\n\nContinue? [Y/n]\n(Reading database ... 198912 files and directories currently installed.)\nRemoving regolith-wm-swap-focus (4.11.6-1regolith-testing) ...\nroot@gkar:~# apt autoremove\nREMOVING:\n i3-swap-focus\n\nSummary:\n Upgrading: 0, Installing: 0, Removing: 1, Not Upgrading: 301\n Freed space: 27.6 kB\n\nContinue? [Y/n]\n(Reading database ... 198908 files and directories currently installed.)\nRemoving i3-swap-focus (0.4.3-1regolith-testing) ...\n</code></pre>","tags":["megalinter","grafana","dashboard","github","debian"]},{"location":"megalinter-grafana-dashboards/#grafana-dashboard-for-megalinter","title":"Grafana dashboard for megalinter","text":"<p>Megalinter can sent logs from linter runs to Grafana to visualise the result of runs.</p> <p>Grafana Cloud Free Tier provides 14 days of logs & metrics retention for 3 users. No credit card is required to sign up and the service is free forever.</p> <p>I signed up using my GitHub account and created the practicalli.grafana.net stack URL, using the <code>EU Germany</code> deployment region as its the closest to my geographical location.</p> <p>Now to add configuration to each of the Practicalli Projects</p> <p>Get the Loki logs service connection URL and user name</p> <p>Megalinter API Reporter - Loki log service</p> <pre><code>API_REPORTER_URL=https://logs-prod-012.grafana.net/loki/api/v1/push\nAPI_REPORTER_BASIC_AUTH_USERNAME=xxxxxx\n</code></pre> <p>Get the Prometheus metrics service connection URL and user name</p> <p>Megalinter API Reporter - Loki log service</p> <pre><code>API_REPORTER_METRICS_URL=https://influx-prod-24-prod-eu-west-2.grafana.net/api/v1/push/influx/write\nAPI_REPORTER_METRICS_BASIC_AUTH_USERNAME=xxxxxxx\n</code></pre>","tags":["megalinter","grafana","dashboard","github","debian"]},{"location":"megalinter-grafana-dashboards/#create-service-account","title":"Create Service account","text":"<p>Administration -> Users and Access -> Cloud Access Policies, then click on Create Access Policy</p> <p>Add token to the newly created policy and use the generated token value as the password value for the Loki logs and Prometheus metrics services password</p> <p>Passwords</p> <p>Megalinter API Reporter - Grafana service passwords</p> <pre><code>API_REPORTER_BASIC_AUTH_PASSWORD=glc_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=\nAPI_REPORTER_METRICS_BASIC_AUTH_PASSWORD=glc_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=\n</code></pre> <p>Add all environment variables to the GitHub repository that will publish megalinter statistics.</p> <p>Thought: can these be added as an Org secrets rather than Repository secrets (I dont see why not, its worth a try). It will save adding these environment variables to the 22 Practicalli projects that use MegaLinter</p> <p>Add these tokens to the Practicalli GitHub Org as Org secrets: organizations/practicalli/settings/secrets/actions</p> <p>Create New Organization secret, providing the environment variable as the name and url, username and token as the value respectively.</p> <p>The repository access could be all public repositories (no sensitive information in them or their logs) or to be suitably security paranoid use selected repositories and select each specific repository that should have access.</p>","tags":["megalinter","grafana","dashboard","github","debian"]},{"location":"megalinter-grafana-dashboards/#add-secrets-to-github-workflow","title":"Add secrets to GitHub workflow","text":"<p>MegaLinter GitHub workflow snippet</p> <pre><code>jobs:\n megalinter:\n name: MegaLinter\n runs-on: ubuntu-latest\n env:\n # Grafana Dashboard Connections - GitHub Organization secrets\n API_REPORTER: true\n API_REPORTER_URL: ${{ secrets.API_REPORTER_URL }}\n API_REPORTER_BASIC_AUTH_USERNAME: ${{ secrets.API_REPORTER_BASIC_AUTH_USERNAME }}\n API_REPORTER_BASIC_AUTH_PASSWORD: ${{ secrets.API_REPORTER_BASIC_AUTH_PASSWORD }}\n API_REPORTER_METRICS_URL: ${{ secrets.API_REPORTER_METRICS_URL }}\n API_REPORTER_METRICS_BASIC_AUTH_USERNAME: ${{ secrets.API_REPORTER_METRICS_BASIC_AUTH_USERNAME }}\n API_REPORTER_METRICS_BASIC_AUTH_PASSWORD: ${{ secrets.API_REPORTER_METRICS_BASIC_AUTH_PASSWORD }}\n API_REPORTER_DEBUG: false\n steps:\n - run: echo \"\ud83d\ude80 Job automatically triggered by ${{ github.event_name }}\"\n - run: echo \"\ud83d\udc27 Job running on ${{ runner.os }} server\"\n - run: echo \"\ud83d\udc19 Using ${{ github.ref }} branch from ${{ github.repository }} repository\"\n</code></pre> <p>After pushing changes to the Megalinter config, I do not see any data in the Grafana dashboards.</p> <p>TODO: how to tell if MegaLinter has actually pushed logs to Grafana? Or if there is an error with the configuration?</p> <p>See the content of the API notifications in execution logs, you can define API_REPORTER_DEBUG=true</p> <p>Megalinter Grafana dashboard example project</p> <p> Practicalli Megalinter-Test</p> <p>NOTE: I am trying to diagnose why this project does not seem to be sending logs to Grafana.</p> <p>Thank you.</p> <p> Practical.li Website</p> <p> Practical.li GitHub Org practicalli-johnny profile</p> <p> @practicalli@clj.social @practical_li</p>","tags":["megalinter","grafana","dashboard","github","debian"]},{"location":"here-comes-the-rain/","title":"Here Comes The Rain","text":"<p>Thunderstorms abound which will be good for the vegetables growing in my garden (beetroot, courgettes, parsnips and onions)</p>","tags":["clojure","debian"]},{"location":"here-comes-the-rain/#debian","title":"Debian","text":"<p>I use Regolith Desktop & Debian for all the Lenovo laptops I own. Regolith is keyboard driven and had numbered workspaces so I can easily organise multiple applications (terminal & neovim, firefox browsing, OBS, Inkscape, Blender, etc)</p> <p>X11 version of Regolith is used, although there was one annoyance. When sharing an external monitor and switching between laptops, the workspaces are moved to the laptop screen when the monitor is not showing the laptop output. Switching the monitor back to show the laptop screen leaves all the workspaces on the laptop display.</p> <p>In earlier versions of Regolith Desktop, using Super+, would save the layout and Super+. would restore the workspaces to the original displays.</p> <p>I have tried several approaches to make Regolith X11 work again, but with no success.</p> <p>Out of curiosity, I tried Regolith Wayland which uses the sway compositor. I was presently surprised that sway automatically restores the workspaces to the external monitor display when reconnecting after switching back from another source.</p> <p>There are some other issues using Wayland though, as some apps I use do not work</p> <ul> <li>Simple Screen Recorder for creating screencasts</li> </ul> <p>Thankfully, OBS now supports Wayland and seems to work quite well. Although I did get a little confused when asked to select the display to record as it now uses the mouse rather than selecting a display. Using the mouse to click on the display to record was easy to do, once I realised that is how the selection worked.</p> <p>I'll continue to test Regolith Sway for the next month and if there are benefits I will eventually switch all laptops to Regolith Wayland. It is possible to have both installed, so I can always switch between the two (logout required).</p>","tags":["clojure","debian"]},{"location":"here-comes-the-rain/#material-for-mkdocs","title":"Material for MkDocs","text":"<p>MkDocs provides a local server that is very useful for local development, especially when first starting with a new website and learning the various thems and components.</p> <p>Using the Python package manager will install the very latest version of Material for MkDocs.</p> <p>The plugins used by Practicalli with Material for MkDocs are fully supported when using Python Pip package manager within a virtual environment.</p> Debian Python PipDebian PipxDebian PackagesMacOSX Homebrew <p>Install Python Pip and the Python virtual environment packages via the Debian package manager:</p> <pre><code>apt install python3-pip python3-venv\n</code></pre> <p>Create and activate a python virtual environment</p> <pre><code>python -m venv ~/.local/venv/ && source ~/.local/venv/bin/activate\n</code></pre> <p>Use pip to install mkdocs-material along with the plugins used by the Practicalli site. The same plugins are also installed in the GitHub workflow.</p> <pre><code>pip install mkdocs-material mkdocs-callouts mkdocs-glightbox mkdocs-git-revision-date-localized-plugin mkdocs-redirects mkdocs-rss-plugin pillow cairosvg\n</code></pre> <p>Python Pip will not install packages outside of a manage environment (python virtual environment)</p> <p></p> <p>Using <code>pipx</code> will automatically create and manage a local environment</p> <p>Pipx install</p> <p>Install the python packages as root <pre><code>apt install python3-pip pipx\n</code></pre></p> <p>Install the materials for mkdocs as user account, e.g. practicalli <pre><code>pipx install mkdocs-material mkdocs-callouts mkdocs-glightbox mkdocs-git-revision-date-localized-plugin mkdocs-redirects mkdocs-rss-plugin pillow cairosvg --include-deps\n</code></pre></p> <p></p> <p>NOTE: Pipx approach did not seem to support using the RSS plugin</p> <p>Debian includes the <code>mkdocs-material</code> and mkdocs-material-extras<code>` packages are recent versions of Material for MkDocs,</code>9.5.18` at time of writing.</p> <p>Debian Packages</p> <pre><code>apt install mkdocs-material\n</code></pre> <p>NOTE: Debian packages approach did not seem to support using the RSS plugin</p> <p>Install the Python3 Pip package manager using brew (MacOSX)</p> <pre><code>brew install python@3.12\n</code></pre> <p>NOTE: Not tested yet</p>","tags":["clojure","debian"]},{"location":"here-comes-the-rain/#neovim-astronvim-updates","title":"Neovim - AstroNvim updates","text":"Initial <pre><code> Breaking Changes (1)\n \u25cf astrocommunity 0.03ms \uead3 start\n 2367b0e fix(ts-error-translator-nvim): add `ts_ls` to list of filetypes (5 hours ago)\n 785b833 fix(typescript): add `ts_ls` to list of typescript language servers (5 hours ago)\n a577479 fix(copilotchat-nvim): use custom prefix from astro core if defined (#1217) (2 days ago)\n ed63ebc revert(go): remove golangcilint as default linter (#1215) (3 days ago)\n 5b06dd4 feat(lua): only enable `selene` linting if `selene.toml` exists (3 days ago)\n b0ae1be feat(grug-far-nvim): add `mini.files` integration (3 days ago)\n d64a67e fix(grug-far-nvim): fix icon disabling (3 days ago)\n c8c6c6c fix(julia): add missing julia vs code extension defaults (3 days ago)\n 2467e24 feat(go): Add golangcilint as default linter (#1213) (3 days ago)\n 053f3d2 docs(rust): add instructions for setting `cargo check` globally (3 days ago)\n 8e6982b fix(grug-far-nvim): make `transient` a truly default option (3 days ago)\n 4ce0029 fix(grug-far-nvim): improve visual mode mapping (4 days ago)\n 2294ae8 fix(grug-far-nvim): fix typos in configuration (4 days ago)\n 8100fe5 feat(grug-far-nvim)!: add more features and align with recommended `spectre.nvim` mappings (#1212) (4 days ago)\n 408111c refactor(scala): use new `patch_func` helper function (4 days ago)\n ad0153f refactor(nvim-lint): use new `patch_func` utility (4 days ago)\n 895c28f docs(julia): add documentation for setting up a system image based julia language server (4 days ago)\n bcbad7e fix(julia): disable `missingrefs` linting as recommended by the vscode Julia extension (4 days ago)\n 323743a fix(grug-far-nvim): update deprecated function to new name (4 days ago)\n aa3ddb8 fix(vim-matchup): improve compatibility with `nvim-cmp` (5 days ago)\n fda1a1d fix(verilog): remove non-existent packages (5 days ago)\n 2197737 feat(neotest): respect `vim.g.icons_enabled` (5 days ago)\n d14b5c5 fix(neotest): `neodev` should not be a hard dependency (5 days ago)\n 9b7efc7 fix(dart): disable treesitter textobjects for Dart (#1211) (5 days ago)\n 84ecff9 feat(pack): add Harper (#1199) (8 days ago)\n 6f7ecaf fix(avante-nvim): update correct plug mappings (#1210) (8 days ago)\n 62e1768 fix(remote-sshfs-nvim): use function call result (#1208) (10 days ago)\n\n\n Updated (13)\n \u25cf astrocore 33.41ms \udb82\udcb1 astrocore \uf487 AstroNvim\n b2caf55 chore(main): release 1.9.0 (4 days ago)\n 97de158 chore(build): auto-generate vimdoc (4 days ago)\n e7d7a35 feat: add `patch_func` to monkey patch into an existing function (4 days ago)\n e32c4a9 chore(build): auto-generate vimdoc (4 days ago)\n 0eab12b ci: add lazy.lua for maintaining `opts_extend` configuration (4 days ago)\n 06c9acf chore(main): release 1.8.1 (6 days ago)\n f0af7af chore(build): auto-generate vimdoc (6 days ago)\n 2d19ef3 fix: remove non-public facing `json` module as it was merged upstream (6 days ago)\n\n \u25cf AstroNvim 0.07ms \uead3 start\n \u25cb astrotheme\n 8a3aca9 chore(main): release 4.5.1 (#146) (7 days ago)\n 143149a chore(extras): auto-generate extras (7 days ago)\n a7bdde1 fix(treesitter): improve comment and list highlights (7 days ago)\n 2e76cf0 chore(build): auto-generate vimdoc (8 days ago)\n bdb1f42 chore(main): release 4.5.0 (#145) (8 days ago)\n 39e970c chore(extras): auto-generate extras (8 days ago)\n ff845fb chore(build): auto-generate vimdoc (8 days ago)\n 4ef753c feat(treesitter): add `<?php ... ?>` highlights (#144) (8 days ago)\n\n \u25cb gist.nvim \uebc7 GistsList \uebc7 GistCreate \uebc7 GistCreateFromFile\n 9805432 docs(readme): added detail about editor (13 hours ago)\n\n \u25cb neo-tree.nvim \uebc7 Neotree\n a77af2e Check for nil state.tree (#1558) (7 days ago)\n 0774fa2 feat: add `icon.provider` option to components for full control (#1527) (3 weeks ago)\n 206241e feat: add options always_show_by_pattern (#1444) (4 months ago)\n 974bbd4 fix(popups): dont add spacing when the title is empty (#1488) (4 months ago)\n 29f7c21 docs(README): Delete `enable_normal_mode_for_inputs` from README example (#1482) (4 months ago)\n\n \u25cb neogit \uf11c <leader>gs \uebc7 Neogit \uea86 User AstroGitFile\n 9959b58 Merge pull request #1484 from NeogitOrg/cleanup-tcp (5 days ago)\n e7bbf0f Skip test in CI because I don't want to debug GHA failures right now. (5 days ago)\n 2bcd6b4 Allow for more leeway when attaching via tcp (5 days ago)\n e8a21d6 Small cleanup: (5 days ago)\n b11bb3a Merge pull request #1483 from jbradaric/master (5 days ago)\n ddfbc39 fix(#383): Make RPC work with tcp servers (5 days ago)\n e0a8674 Merge pull request #1481 from NeogitOrg/dont-open-diff-if-parent-is-floating (6 days ago)\n ce53ec2 Auto-disable showing diff if the commit editor is a float. (6 days ago)\n d43072e Merge pull request #1480 from NeogitOrg/spelling-option (6 days ago)\n aeabb33 Allow spell check to be user configurable (6 days ago)\n cfbdc88 Merge pull request #1478 from NeogitOrg/spell-for-commit-messages (8 days ago)\n a0427b3 Adds \"spell check\" to commit message buffer. (8 days ago)\n\n \u25cf noice.nvim 3.43ms \uea86 VeryLazy\n c1ba80c chore(main): release 4.5.1 (#951) (5 days ago)\n 86a4891 fix(hacks): dont close timer multiple times during exit (5 days ago)\n 16c946a chore(build): auto-generate docs (5 days ago)\n 3373ab5 fix(hacks): only redraw cursor when cmdline is active. Fixes #950. Fixes #937. Fixes #923 (5 days ago)\n 8c6a024 fix: dont redraw when exiting. Fixes #936. Fixes #921 (5 days ago)\n ae565e1 refactor: cleanup (5 days ago)\n\n \u25cf nvim-notify 1.58ms \udb82\udcb1 notify \uf487 noice.nvim\n fbef5d3 feat: add wrapped-default as render (#286) (30 hours ago)\n\n \u25cb octo.nvim \uebc7 Octo\n 955f0fd Merge pull request #606 from Hashino/master (9 days ago)\n b90bf21 style(stylua): formatted changed code with stylua (9 days ago)\n 337f8d0 fix(repo finding): considers cases where git repo has a trailing / (9 days ago)\n\n \u25cb SchemaStore.nvim\n efa0466 Update SchemaStore catalog (22 hours ago)\n 6e2af7e Update SchemaStore catalog (5 days ago)\n 1fc84f9 Update SchemaStore catalog (6 days ago)\n b45a031 Update SchemaStore catalog (6 days ago)\n e4540af Update SchemaStore catalog (7 days ago)\n bfe74ba Update SchemaStore catalog (10 days ago)\n\n \u25cb telescope-file-browser.nvim \uea86 User AstroFile\n \u25cb todo-comments.nvim \uebc7 TodoLocList \uebc7 TodoQuickFix \uebc7 TodoTrouble \uebc7 TodoTelescope \uea86 User AstroFile\n ae0a2af chore(main): release 1.4.0 (#313) (8 days ago)\n 1a67e20 chore(build): auto-generate docs (8 days ago)\n 76990a9 fix(config): select `fg` by maximizing contrast rather than check if a color is dark (#316) (8 days ago)\n 319c01b chore(build): auto-generate docs (3 weeks ago)\n 6d6cf47 feat(fzf): add fzf-lua support in Readme & add TodoFzfLua command (#312) (3 weeks ago)\n 8f45f35 chore(build): auto-generate docs (9 weeks ago)\n 5759a90 ci: update (9 weeks ago)\n 96fee09 chore(update): update repository (#300) (2 months ago)\n 337de2d chore(build): auto-generate docs (2 months ago)\n 340caf8 chore(update): update repository (#299) (2 months ago)\n d615675 chore(update): update repository (#298) (2 months ago)\n 763f37d chore(update): update repository (#297) (2 months ago)\n c57b74b chore(build): auto-generate docs (2 months ago)\n b166133 chore(update): update repository (#296) (2 months ago)\n\n \u25cf which-key.nvim 1.44ms \uead3 start\n fb07034 chore(main): release 3.13.3 (#835) (5 days ago)\n e6e9f77 chore(build): auto-generate docs (5 days ago)\n 6b023b4 fix(triggers): never attach when macro is recording / executing. Fixes #851. Fixes #822. Fixes #807 (5 days ago)\n bfec3d6 chore(build): auto-generate docs (3 weeks ago)\n e7b415c fix(config): disable wk by default for terminal mode (#825) (3 weeks ago)\n 2e36a3f chore(build): auto-generate docs (3 weeks ago)\n dafe27a fix(view): display actual scroll up/down keys in help (#821) (3 weeks ago)\n 946dddc docs: change 'explicitely' to 'explicitly' in docs (#804) (3 weeks ago)\n</code></pre> AstroNvim plugin update <pre><code> Breaking Changes (1)\n \u25cb dressing.nvim\n 1b7921e chore(master): release 3.0.0 (#164) (6 days ago)\n c5775a8 lint: stricter type checking (5 weeks ago)\n 6741f10 cleanup: remove warnings for using deprecated highlight groups (3 months ago)\n 374b51d cleanup: remove warning for deprecated \"anchor\" config option (3 months ago)\n cd895f5 refactor!: remove insert_only config option (3 months ago)\n\n\n Updated (7)\n \u25cf neoconf.nvim 2.53ms \uf487 nvim-lspconfig\n ec16c02 chore(build): auto-generate vimdoc, schemas and annotations (7 days ago)\n 5690945 chore(main): release 1.3.3 (#91) (8 days ago)\n c26f4dc chore(build): auto-generate docs (8 days ago)\n cdc15ee chore(build): auto-generated build files (8 days ago)\n 557f3e7 fix(basedpyright): add basedpyright schema (#90) (8 days ago)\n 559836d fix(schemas): `tsserver` renamed to `ts_ls` (#89) (8 days ago)\n 8c7f29f chore(build): auto-generate vimdoc, schemas and annotations (9 days ago)\n 3c9bb0e chore(build): auto-generate vimdoc, schemas and annotations (10 days ago)\n ce074ec chore(build): auto-generate vimdoc, schemas and annotations (12 days ago)\n 206f6c0 chore(build): auto-generate vimdoc, schemas and annotations (13 days ago)\n 37ef39f chore(build): auto-generate vimdoc, schemas and annotations (2 weeks ago)\n\n \u25cb nvim-autopairs \uea86 User AstroFile\n ffc139f feat(fast_wrap): add options for direct end_key use (#475) (8 days ago)\n\n \u25cf nvim-dap 29.15ms \uf487 mason-nvim-dap.nvim\n 90616ae Restore stopped state if goto errors (11 days ago)\n\n \u25cf nvim-lspconfig 2.81ms \udb82\udcb1 lspconfig.util \uf487 mason-lspconfig.nvim\n eb36e01 fix(ltex-ls): command fails on windows when using mason (#3305) (7 days ago)\n 46ce5fd chore: remove redundant flake-utils dependency; add nix-systems (8 days ago)\n 0d027de docs: update server_configurations.md skip-checks: true (10 days ago)\n 170c964 fix: sourcekit lsp filetypes (#3301) (10 days ago)\n bb682c1 docs: update server_configurations.md skip-checks: true (12 days ago)\n fbe3dc6 feat: add c3-lsp support (#3299) (12 days ago)\n d88ae66 docs: update server_configurations.md skip-checks: true (13 days ago)\n 97e72e3 feat: add daedalus-language-server support (#3259) (13 days ago)\n 8c45e72 fix(ci): luarocks unknown \"licence\" field (13 days ago)\n 056f569 docs: update server_configurations.md skip-checks: true (13 days ago)\n 436aad9 feat(ziggy): add ziggy and ziggy_schema support (#3296) (13 days ago)\n 5ac3e19 docs: update server_configurations.md skip-checks: true (2 weeks ago)\n e6b4dd9 feat(kcl): add kcl-language-server support (#3294) (2 weeks ago)\n\n \u25cf nvim-treesitter 15.4ms \uebc7 Lazy load\n 4d94c24 bot(lockfile): update d, http, nix (7 days ago)\n cad9ff2 feat(ruby): detect shebang directive (7 days ago)\n b9002f6 bot(lockfile): update apex, sflog, soql, sosl, swift (8 days ago)\n 5c42228 feat(apex): update parser and highlights (#7151) (8 days ago)\n b7160e8 bot(lockfile): update hurl, v (9 days ago)\n 399062d fix(lua): remove duplicate ellipsis highlight (9 days ago)\n 5833958 bot(lockfile): update r (10 days ago)\n e0338f2 bot(lockfile): update glsl, hlsl, scala, slang (11 days ago)\n 4af16a1 bot(lockfile): update gomod, latex, markdown, markdown_inline, perl, scala (12 days ago)\n 66a7655 feat(ruby): improve identifiers highlighting (12 days ago)\n b6a6d89 feat(gleam): add `@local.scope` capture for block (#7128) (12 days ago)\n d22166e ci: bump create-pull-request to v7 (13 days ago)\n 2871a4a bot(lockfile): update markdown, markdown_inline (13 days ago)\n 6a3c6a4 fix(rust): comment marker should not be `@operator` (#7135) (13 days ago)\n c436d45 Revert \"ci(update): bump create-pull-request to v7 and sign commits\" (2 weeks ago)\n c9003a3 ci(update): bump create-pull-request to v7 and sign commits (2 weeks ago)\n f8bbb82 bot(lockfile): update elixir, gleam, lua, markdown, markdown_inline, perl, scala, swift (2 weeks ago)\n 13ee7f8 feat(latex): capture conditionals (2 weeks ago)\n\n \u25cb nvim-web-devicons \uf487 octo.nvim\n 9154484 feat: add .prettierrc.{cjs,js,mjs} (#495) (11 days ago)\n\n \u25cb plenary.nvim \uf487 octo.nvim \uf487 telescope-file-browser.nvim \uf487 neogit\n 2d9b061 feat(json): add abliity to remove trailing commas while stripping comments (#613) (6 days ago)\n f4faa5a docs: fix typo in annotation for enable_recording (#620) (7 days ago)\n</code></pre> <p>Thank you.</p> <p> Practical.li Website</p> <p> Practical.li GitHub Org practicalli-johnny profile</p> <p> @practicalli@clj.social @practical_li</p>","tags":["clojure","debian"]},{"location":"linux-wayland-compositor--hyprland/","title":"Linux Wayland Compositor & Hyprland","text":"<p>A friend recommended Hyprland window manager which is similar to i3 window manager I currently used, but more optomised for the Wayland compositor.</p> <p>Practicalli currently uses Regolith Desktop, a complete Linux desktop that leverages Gnome and i3 tiling window manager.</p> <p>Regolith Desktop provides quite a rich experience using the <code>regolith-desktop</code> Debian package. I have not had much success with Regolith when running with Wayland (specifically Sway).</p> <p>Sway compositor is an implementation of wayland for i3 window manager. Some of my applications do not see to play nice with Sway (e.g. chromium browser scrolling, simplescreenrecorder cannot run on wayland).</p> <p>OBS did seem to work okay on wayland, given a sufficiently recent version.</p> <p>A friend recommended Hyprland, a tiling compositor that provides the latest Wayland features and lots of eye candy. Its pretty easy to setup on Debian, although there is much additional setup before it would be comparable to Regolith Desktop.</p> <p>Neovim Grug plugin is being considered as an alternative to the Spectre tool for search and replacing across a project.</p>","tags":["debian","hyprland","linux","neovim","slack"]},{"location":"linux-wayland-compositor--hyprland/#neovim-clojure-navigation","title":"Neovim Clojure navigation","text":"<p>Once I learned vim style commands and motions I quickly dropped much of the paredit style command, even before I tried parinfer. Parinfer is really simple and easily covers a lot of the sexp-tooling when writing Clojure code.</p> <p>Personally I find vim-style editing a bit simpler and easier to remember as I am using it for everything and not only one language. There are typically as many key combinations to press with a sexp library as there are with vim.</p> <p>There are a few manipulations I may still like the idea of, e.g. raise/promote a form or expression to refactor a nested expression to be the whole expression.</p> <p>I have https://github.com/PaterJason/nvim-treesitter-sexp plugin installed, but havent used it much. I use https://github.com/gpanders/nvim-parinfer plugin for parinfer enabled, in alignment mode, for all Clojure language buffers.</p>","tags":["debian","hyprland","linux","neovim","slack"]},{"location":"linux-wayland-compositor--hyprland/#neovim-searching","title":"Neovim Searching","text":"<p>For project wide search and replace, I currently use Spectre plugin via the Astrocommunity plugin. It works okay and has a usable UI.</p> <p>Grug looks interesting though, so time to try that at the weekend.</p> <p>AstroNvim version</p> <p><code>:Astroversion</code> to receive the current version as a notification.</p> <p>Space f n to view the notification that contains the version number, eg. <code>Version: *4.26.5*</code></p>","tags":["debian","hyprland","linux","neovim","slack"]},{"location":"linux-wayland-compositor--hyprland/#hyprland-on-debian","title":"Hyprland on Debian","text":"<p>Throughout the history of Linux (and Unix), X.org has been used as the power driving all desktops. More recently the Wayland compositor was developed to provide an alternative that catered for the way many desktops are used today.</p> <p>There has been a lot of work put into Wayland and although it still has some maturing to do, is generally considered stable for every day use.</p> <p>Hyprland is a wayland based tiling manager that has a focus on an engaging user experience (and looking very pretty too).</p> <p>Review wayland app recommendations</p> <p>Some well established apps and tools may not work quite so well with wayland yet. e.g. simplescreenrecorder.</p> <p>Hyperland utilities page recommends apps that work well with wayland (and hyprland)</p> <p>Debian packages required for a desktop environment based on Hyprland (this is a growing list)</p> <ul> <li>hyprland - dynamic tiling Wayland compositor</li> <li>hyprland-backgrounds</li> <li>hyprland-dbgsym - optional debug symbols for hyprland</li> <li>hyprland-dev - optional development files for Hyprland</li> <li>hyprland-protocols - wayland protocol extensions for Hyprland</li> <li>xdg-desktop-portal-hyprland - hyprland communicates with apps via D-Bus (XDG Portal backend)</li> <li>xdg-desktop-portal-hyprland-dbgsym - sid - debug symbols for xdg-desktop-portal-hyprland</li> <li>hyprpaper</li> </ul> <p>Optional: SDDM is a KDE based window manager that seems quite popular with Hyprland community. If SDDM is adopted then it seems appropriate to replace all Gnome tools currently used by Practicalli with their KDE equivalents.</p>","tags":["debian","hyprland","linux","neovim","slack"]},{"location":"linux-wayland-compositor--hyprland/#install-hyprland","title":"Install hyprland","text":"<p>I am using Debian Linux trixie (the next unrelease version of Debian). The hyprland packages are from the v0.41.2 release in June 25 and the latest hyperland version is v0.44.0 (released as I was writing this paragraph)</p> <p>Using the Debian packages will be simpler and quicker than compiling hyprland from source. As I am only evaluating Hyprland and havent committed to it, I will stick with the Debian packages.</p> <p>Install all hyprland Debian packages</p> <pre><code>apt install hyprland*\n</code></pre> <p>This install the packages:</p> <p>Logout of the desktop or restart Debian Linux.</p> Use Debian Linux testing version <p>Hyprland recommends using Debian Sid version for the latest versions. However, after searching through the Debian Packages website for hyprland, the versions of matching packages are the same in trixie(testing) as sid(unstable).</p> <p>There may be differences in versions of packages that the hyprland packages have as dependencies,</p> Building Hyprland for Debian Linux <p>drewfrif/debian-hyprland has several bash scripts for semi-automating the build and install of hyprland on Debian Linux.</p> <p>There are some personal preferences in those scripts that could be changed, but it seems a good basis for automating your own build and install for all the hyprland components.</p> <p>Hyprland v0.43.0 requires C++ 26 support, which is provided by <code>gcc</code> package version >=14. <code>gcc --version</code> reports 14.2.0 on Debian trixie, so all should be good</p> <pre><code>\u276f gcc --version\ngcc (Debian 14.2.0-3) 14.2.0\n</code></pre>","tags":["debian","hyprland","linux","neovim","slack"]},{"location":"linux-wayland-compositor--hyprland/#first-use","title":"First use","text":"<p>On the login screen, select the login account, then select hyprland using the cog in the right hand corner</p> <p>Enter the correct password to login with the hyprland desktop.</p> <p>A yellow information bar is displayed at the top of the screen showing an autogenerated configuration file location, e.g. <code>~/.config/hypr/hyprland.conf</code></p> <p>The information bar also described keybindings to start a terminal, Super q, (kitty is my Debian default terminal) and Super m to quit hyprland destkop</p> <p>Practicalli dotfiles & hyprland</p> <p>The autogenerated config file was moved to the Practicalli dotfiles repository.</p> <p>A symbolic link replaced the <code>~/.config/hypr/</code> directory, linking to the hypr directory in the local copy of the Practicalli dotfiles repository.</p> <pre><code>ln -s ~/projects/practicalli/dotfiles/hypr ~/.config/hypr\n</code></pre>","tags":["debian","hyprland","linux","neovim","slack"]},{"location":"linux-wayland-compositor--hyprland/#menu-app-launcher","title":"Menu app launcher","text":"<p>Although Regolith has Rofi, it doesnt seem to be available when using hyprland desktop.</p> <p>Options - install the rofi debian package - install one of the suggested app launcher on the hyprland wiki</p> <p>I tried <code>rofi</code> first as its familiar from Regolith desktop.</p> <pre><code>apt install rofi\n</code></pre> <p>There is a rofi-dev package, although assuming that is not needed if unless I build rofi extensions</p> <p>Rofi Wayland package should be used</p> <p>Either use wofi or the rofi-wayland project (Debian did not have a rofi-wayland package at time of writing)</p> <p>Update the hyprland config to launch rofi for the menu and use Super Space key binding (rather than Super R)</p> <p>Override key binding in Hyprland config</p> <pre><code># bind = $mainMod, R, exec, $menu\nbind = $mainMod, space, exec, $menu\n</code></pre> <p>The rofi guide suggests creating a configuration file</p> <p>Create a rofi directory in .config</p> <pre><code>mkdir -p ~/.config/rofi\n</code></pre> <p>The dump all the config options into a file. Most options are commented out.</p> <pre><code>rofi -dump-config > ~/.config/rofi/config.rasi\n</code></pre> <p>Switched to wofi menu</p> <p>wofi seemed to work much better (automatically floating window unlike rofi)</p>","tags":["debian","hyprland","linux","neovim","slack"]},{"location":"linux-wayland-compositor--hyprland/#apps-to-install","title":"Apps to install","text":"<p>waybar - the desktop status bar (TODO: tweak its config and learn from shared configs)</p>","tags":["debian","hyprland","linux","neovim","slack"]},{"location":"linux-wayland-compositor--hyprland/#configure-waybar","title":"Configure waybar","text":"<p>Create an appealing and rich desktop menu and status bar.</p> <p>Handcrafting a config</p> <p>Configure Waybar for Hyprland</p> <pre><code>\u276f cp -vr /etc/xdg/waybar ~/projects/practicalli/dotfiles/\n'/etc/xdg/waybar' -> '/home/practicalli/projects/practicalli/dotfiles/waybar'\n'/etc/xdg/waybar/config.jsonc' -> '/home/practicalli/projects/practicalli/dotfiles/waybar/config.jsonc'\n'/etc/xdg/waybar/style.css' -> '/home/practicalli/projects/practicalli/dotfiles/waybar/style.css'\n\u276f ln -s ~/projects/practicalli/dotfiles/waybar ~/.config/waybar\n</code></pre> <p>waybar uses font-awesome fonts for the icons</p> <pre><code># apt search font-awesome\nfonts-font-awesome/testing,now 5.0.10+really4.7.0~dfsg-4.1 all [installed,automatic]\n iconic font designed for use with Twitter Bootstrap\n\n# apt install fonts-font-awesome\n</code></pre> <p>To use the workspaces module, replace all the occurrences of <code>sway/workspaces</code> with <code>hyprland/workspaces</code>. Additionally replace all occurrences of <code>sway/mode</code> with <code>hyprland/submap</code></p>","tags":["debian","hyprland","linux","neovim","slack"]},{"location":"linux-wayland-compositor--hyprland/#nwg-shell","title":"nwg-shell","text":"<p>nwg-look is a GTK3 settings editor, I assume similar to the Appearance in control center with some Gnome Tweaks thrown in.</p> <p>Debian package install</p> <pre><code># apt install nwg-\nnwg-bar nwg-clipman nwg-displays nwg-hello nwg-look\nroot@gkar:/etc/apt/preferences.d# apt install nwg-*\nNote, selecting 'nwg-clipman' for glob 'nwg-*'\nNote, selecting 'nwg-displays' for glob 'nwg-*'\nNote, selecting 'nwg-hello' for glob 'nwg-*'\nNote, selecting 'nwg-look' for glob 'nwg-*'\nNote, selecting 'nwg-bar' for glob 'nwg-*'\nThe following package was automatically installed and is no longer required:\n libgspell-1-2\nUse 'apt autoremove' to remove it.\n\nInstalling:\n nwg-bar nwg-clipman nwg-displays nwg-hello nwg-look\n\nInstalling dependencies:\n cliphist gir1.2-gtklayershell-0.1 xcur2png\n\nSummary:\n Upgrading: 0, Installing: 8, Removing: 0, Not Upgrading: 0\n Download size: 4,636 kB\n Space needed: 13.2 MB / 1,220 MB available\n</code></pre> nwg-look settings output <pre><code>\u276f nwg-look\nINFO[0000] /home/practicalli/.config/nwg-look/config file not found, creating\nINFO[0000] lang: en_GB\nINFO[0000] >>> Loading basic lang from '/usr/share/nwg-look/langs/en_US.json'\nINFO[0000] >>> Parsing original /home/practicalli/.config/gtk-3.0/settings.ini\nINFO[0000] >>> Reading gsettings\nINFO[0000] gtk-theme: Gruvbox\nINFO[0000] icon-theme: Moka\nINFO[0000] font-name: Cousine Nerd Font 12\nINFO[0000] cursor-theme: Adwaita\nINFO[0000] cursor-size: 24\nINFO[0000] toolbar-style: both-horiz\nINFO[0000] toolbar-icons-size: large\nINFO[0000] font-hinting: slight\nINFO[0000] font-antialiasing: grayscale\nINFO[0000] font-rgba-order: rgb\nINFO[0000] text-scaling-factor: 1\nINFO[0000] color-scheme: prefer-dark\nINFO[0000] event-sounds: true\nINFO[0000] input-feedback-sounds: false\nINFO[0047] >>> Applying gsettings\nINFO[0047] >> org.gnome.desktop.interface\nINFO[0047] gtk-theme: Gruvbox OK\nINFO[0047] icon-theme: Faba OK\nINFO[0047] cursor-theme: Adwaita OK\nINFO[0047] cursor-size: 24 OK\nINFO[0047] font-name: Cousine Nerd Font 12 OK\nINFO[0047] font-hinting: slight OK\nINFO[0047] font-antialiasing: grayscale OK\nINFO[0047] font-rgba-order: rgb OK\nINFO[0047] text-scaling-factor: 1 OK\nINFO[0047] toolbar-style: both-horiz OK\nINFO[0047] toolbar-icons-size: large OK\nINFO[0047] color-scheme: prefer-dark OK\nINFO[0047] >> org.gnome.desktop.sound\nINFO[0047] event-sounds: true OK\nINFO[0047] input-feedback-sounds: false OK\nINFO[0047] >>> Backing up gsettings to /home/practicalli/.local/share/nwg-look\nINFO[0047] >>> Exporting /home/practicalli/.config/gtk-3.0/settings.ini\nINFO[0047] >>> Exporting /home/practicalli/.gtkrc-2.0\nWARN[0047] Couldn't find icons folder\nINFO[0047] >>> Exporting /home/practicalli/.config/xsettingsd/xsettingsd.conf\n</code></pre>","tags":["debian","hyprland","linux","neovim","slack"]},{"location":"linux-wayland-compositor--hyprland/#wayland-apps-and-tools-support","title":"Wayland apps and tools support","text":"<p>Practicalli tools that work well with wayland</p> <ul> <li>OBS - recent versions support wayland</li> <li>Inkscape - TODO</li> <li>Neovim - works in a terminal so doesnt really care</li> <li>Neovide - TODO</li> <li>Emacs - TODO</li> <li>The Gimp - TODO</li> <li>Firefox - seems okay</li> <li>Chrome - a delay when opening tabs or scrolling windows (regoligh & sway)</li> </ul>","tags":["debian","hyprland","linux","neovim","slack"]},{"location":"linux-wayland-compositor--hyprland/#install","title":"Install","text":"<p>Install the hyprland packages using <code>*</code> to glob match all the relevant packages.</p> <p>Install all hyprland Debian packages</p> <pre><code>apt install hyprland*\n</code></pre> <p>Once installed, either logout of the desktop session or restart Debian Linux.</p> <p>Hyprland should be an option on the login screen. Once an account has been selected, click the cog icon to select hyprland (TODO: check if this is available after installing the package - or if some config is required)</p> <p>Lots more packages are required</p> <p>Hyprland is a compositor and not a full desktop environment, so investigation required as to what additional wayland supported packages are required.</p>","tags":["debian","hyprland","linux","neovim","slack"]},{"location":"linux-wayland-compositor--hyprland/#configuration","title":"Configuration","text":"<p>Hyprland is described as easy to configure, but what actually is involved. Is it as simple as adding hyprland packages or do I need to edit a configuration file?</p> <p>Lets investigate... I didnt get far as hyprland is not a full desktop environment, so more research is required into what extra packages can be installed to have a more complete desktop experience.</p>","tags":["debian","hyprland","linux","neovim","slack"]},{"location":"linux-wayland-compositor--hyprland/#gotchas","title":"Gotchas","text":"<p>Super c will close the app in the active window. As I use this key binding a lot in MacOSX for copy paste, then I should rebind this close action to something else, e.g. Super Shift q is the keybinding from regolith and less likely to be pressed in error. Trying Super Shift x for now as there needs to be a key binding to quit Hyprland (logout and reboot do not work currently - shutdown does though)</p>","tags":["debian","hyprland","linux","neovim","slack"]},{"location":"linux-wayland-compositor--hyprland/#hyprland","title":"Hyprland","text":"<p>Root shell history</p> <pre><code>apt search hyprland\napt install hyprland*\n\ncd /etc/apt/\ncd preferences.d/\n\nhyprpm list\napt search hypr\napt show xdg-desktop-portal-hyprland\napt search wofi\napt show wofi-pass\napt show rofi\napt install rofi\n\napt show dolfin\napt show dolphin\napt install dolphin\napt install waybar\napt install hyprpaper\napt install wofi\napt show wayland-utils\napt install sway\napt show foot\napt install pavucontrol pamixer\napt install wdisplays\napt search hyprland\napt install xdg-desktop-portal-hyprland\napt install hyprland-backgrounds\nhyprctrl hyprpaper listloaded\napt search font-awesome\napt install fonts-font-awesome\napt search eww\napt install pipewire wireplumber\napt search nwg\n</code></pre>","tags":["debian","hyprland","linux","neovim","slack"]},{"location":"linux-wayland-compositor--hyprland/#material-for-mkdocs","title":"Material for MkDocs","text":"<p>Refining the experiments with installing Material for MkDocs on Debian Linux this week.</p> <p>Recap:</p> <ul> <li>Installing Material for MkDocs using Debian packages did work to a point, although there is no package for the RSS plugin (its relatively recent split from the main material-mkdocs package)</li> <li>Installing Material for MkDocs using python packages does cover all the plugins used by Practicalli books and websites.</li> <li>Debian issued warnings when using pip3 or pipx to install python packages outside of the Debian package system.</li> <li>Using a Python virtual environment is the recommended way to run Material for MkDocs (or any python libraries) on Debian Linux.</li> </ul> <p>A python virtual environment was created and then Material for MkDocs python packages were installed using Pip.</p> <p><code>python3-venv</code> package creates a Python virtual environment given a directory</p> <p>Create Python Virtual Environment</p> <pre><code>python3 -m venv ~/.local/venv/\n</code></pre> <p>Install Material for MkDocs using Python Packages</p> <pre><code>pip install mkdocs-material mkdocs-callouts mkdocs-glightbox mkdocs-git-revision-date-localized-plugin mkdocs-redirects mkdocs-rss-plugin pillow cairosvg\n</code></pre> <p>Run local server for Material for MkDocs</p> <pre><code>. ~/.local/venv/bin/activate; mkdocs build\n</code></pre> <p>Makefile task to run server</p> <pre><code># ------- Makefile Variables --------- #\nMKDOCS_SERVER := mkdocs serve --dev-addr localhost:7777\n# ------------------------------------ #\n\n# --- Documentation Generation ------ #\ndocs: ## Build and run mkdocs in local server (python venv)\n $(info --------- Mkdocs Local Server ---------)\n . ~/.local/venv/bin/activate; $(MKDOCS_SERVER)\n\ndocs-changed: ## Build only changed files and run mkdocs in local server (python venv)\n $(info --------- Mkdocs Local Server ---------)\n . ~/.local/venv/bin/activate; $(MKDOCS_SERVER) --dirtyreload\n\ndocs-build: ## Build mkdocs (python venv)\n $(info --------- Mkdocs Local Server ---------)\n . ~/.local/venv/bin/activate; mkdocs build\n# ------------------------------------ #\n</code></pre> Root shell history <pre><code>apt install python3-pipx\napt install python3-venv\napt install python3\npip3 install mkdocs-material==\"9.*\"\npipx install mkdocs-material==\"9.*\"\napt install python3-pipx\napt install pipx\npipx install mkdocs-material==\"9.*\"\npipx install mkdocs-material\npip install mkdocs-material==\"9.*\"\napt search material-mkdocs\napt install mkdocs-material mkdocs-material-extensions\npip\napt remove --purge mkdocs-material mkdocs-material-extensions\napt autoremove\napt install pipx\napt remove --purge pipx\napt autoremove\napt autoclean\napt install python3-venv\nexit\n</code></pre>","tags":["debian","hyprland","linux","neovim","slack"]},{"location":"linux-wayland-compositor--hyprland/#slack-for-debian","title":"Slack for Debian","text":"<p>Download the debian package from the slack webstite (there is a small link in the right corner to a .deb file)</p> <p>As the root user:</p> <pre><code>cd /home/practicalli/Downloads/\napt install ./slack-desktop-4.39.95-amd64.deb\n</code></pre> <p>Not that the deb file install complains about being installed by root account, but works anyway.</p> <p>Thank you.</p> <p> Practical.li Website</p> <p> Practical.li GitHub Org practicalli-johnny profile</p> <p> @practicalli@clj.social @practical_li</p>","tags":["debian","hyprland","linux","neovim","slack"]},{"location":"a-freezing-start-to-a-new-year/","title":"A freezing start to a new year","text":"<p>GitHub is currently rolling out a change to make Ubuntu 24.04 the default image when running a workflow on <code>ubuntu-latest</code>. As some packages have been removed to save space, then its prudent to give the Practicalli GitHub workflows a test on Ubuntu 24.04.</p> <p>Organising my digital music and audio books so they all fit nicely on my smart phone (using Opus audio format and VLC to play the music).</p> <p>Arch Linux recommends not using <code>pacman -Syu</code> to update all packages and today I experience why. I can no longer login to the desktop EDIT: this seems to be specific to the NWG-shell configuration, as the vanilla hyprland desktop does work.</p> <p>I assume this is a breaking change of hyprland that NWG-shell has not resolved. This is another reason to start again with hyprland and build my own config (although this will be a big time sink, so can wait).</p> <p>Its freezing temperatures outside in London, UK at the moment, so I am trying to get outside when the sun is still shining. The paths are slippy and so are the roads, so even if I felt up to cycling outside, then it could be quite tricky.</p>","tags":["archlinux","audacity","opus"]},{"location":"a-freezing-start-to-a-new-year/#github-ci-workflow","title":"GitHub CI Workflow","text":"<p> Practicalli GitHub workflows all run on the <code>ubuntu-latest</code> image</p> <p>GitHub workflow runs-on ubuntu-latest</p> <pre><code>jobs:\n changelog:\n name: Changelog Update Check\n runs-on: ubuntu-latest\n</code></pre> <p>Changing the workflow configuration to use <code>ubuntu-24.04</code> will change the image used to run the workflow, so I can test if each work flow works with the new default image.</p> <p>GitHub workflow runs-on ubuntu-latest</p> <pre><code>jobs:\n changelog:\n name: Changelog Update Check\n runs-on: ubuntu-latest\n</code></pre> <p>To publish the Practialli books using Material for MkDocs the setup-python GitHub action was used to install a version of python on the ubuntu-latest image.</p> <p>Reading through the software available on the ubuntu-24.04 image I noticed Python is already available. Therefor setup-python action is not required.</p> <p>Removing setup-python action from the workflow did save a few seconds in the run time of the publish-book.yaml workflow. Its not a huge difference, but I do publish a change to a book, blog or journal each day so every little time saving helps (quicker to publish and less compute & networking resources needed).</p>","tags":["archlinux","audacity","opus"]},{"location":"a-freezing-start-to-a-new-year/#arch-linux","title":"Arch Linux","text":"<p>Unless using a distribution like Manjaro then Arch Linux can require more maintenance than using a Debian package based distribution.</p> <p><code>pacman -Syu</code> command happily updated all my packages and after a reboot I cannot login to the desktop anymore. I assume this was some breaking change of hyprland that is causing the problem.</p> <p>Rather than use the Nwg ISO for a quicker Hyprland install, I will start from the ArchLinux ISO and at least I will have a clearer idea of what all the configuration files do and where problems could occur as Hyprland continues to evolve.</p>","tags":["archlinux","audacity","opus"]},{"location":"a-freezing-start-to-a-new-year/#digital-music","title":"Digital Music","text":"<p>I continue to organise my digital music and audio books with a bit of Audacity magic where editing is required.</p> <p> Audacity is an excellent linear audio editor available on all good Operating Systems. Audacity can export edited audio directly to an encoded file format, minimising the resources needed for laruge audio files. I export directly to the Opus audio format</p> <p> Opus audio format is very efficient so produces high quality sounds with very small file sizes. I have a very large library of music on my smart phone which I can access without an internet connection (saving battery life).</p> <p>Music is encoded at 96Kb/second and although not quite as good as Flac the Opus sounds indistinguishable even through the nicest headphones I have. Music encoded at 96Kb/second with variable bit rate are comparable to lossless formats.</p> <p>Audiobooks are encoded at 24 Kb/second for mono track sources and 32 Kb/second for stereo, which is perfectly good for any spoken word content and makes the files tiny (especially compared to WAV and FLAC).</p> <p> Opus recommended encoding bit rates</p> <p> Archive.org is a great source for Creative Commons and other open music. This week I'm listening to The Slip by Nine Inch Nails which was added to Archive.org by Trent Razor back in 2013.</p> <p>Archiving sounds</p> <p> Flac audio format is lossless so should be used for archived sounds that are going to be processed over and over again, to avoid generational losses in sound qualities from encoding to a lossy format.</p> <p>Thank you.</p> <p> Practical.li Website</p> <p> Practical.li GitHub Org practicalli-johnny profile</p> <p> @practicalli@clj.social @practical_li</p>","tags":["archlinux","audacity","opus"]},{"location":"learning-linux-like-its-1995/","title":"Learning Linux like its 1995","text":"<p>Using Arch Linux (for Hyprland experiments) takes me back to the mid 1990's when I was learning Linux from the ground up.</p> <p>At the end of 1994 I was installing Slackware Linux (from 82 floppy disks) and spending hours figuring out what to compile into the Linux kernel (before the days of dynamic loading). There was a huge amount to learn (usually without my own internet connection).</p> <p>Arch Linux wiki pages have a huge amount of information, showing all the possible options for every piece of software and service. This does present a dilemma of choice.</p> <p>Having experienced many years with Linux, I know many of the concepts and software associated with a Linux system. I dont need to read all the options, but do find myself scrolling a lot until I find something familiar (or simple).</p> <p>The goals for this month include</p> <ul> <li>documenting Neovim & Conjure workflow</li> <li>meaningful exercise every day (health permitting)</li> <li>bicycle ride (weather permitting)</li> <li>avoid Hyprland turning into a huge time sync (couch potato time only)</li> </ul> <p>My health took more of a knock this week as I am finding it very difficult to walk. I've had pain in my right hip for a couple of weeks and on Friday I started walking and felt a sharp pain. Every step with my right leg is painful and going up and down stairs is particularly painful.</p> <p>The hip pain coupled with my left knee pain significantly limiting my ability to exercise this week.</p> <p>Movies this week:</p> <ul> <li>Death on the Nile 1978 with Peter Ustinov as Hercule Poirot, including an all-star cast from the time including David Niven, Angela Landsbury and Betty Davis.</li> </ul>","tags":["clojure"]},{"location":"learning-linux-like-its-1995/#neovim","title":"Neovim","text":"<p>LSP Renaming of namespaces and filenames is the only feature I do not have working with Clojure LSP and Neovim. nvim-lspconfig supports Clojure but reports the following error when trying to rename a namespace name.</p> <pre><code>Error on prepareRename: Can't rename - client does not support file renames.\n</code></pre> <p>The nvim-lsp-file-operations plugin was used but with no success as yet (not sure why).</p>","tags":["clojure"]},{"location":"learning-linux-like-its-1995/#clojure-lsp-command-line","title":"clojure-lsp command line","text":"<p><code>clojure-lsp</code> is available on the command line path, so a command like this will change the namespace and the namespaces corresponding file name.</p> <p>Clojure LSP rename namespace via command line</p> <pre><code>clojure-lsp rename --from gameboard.gameboard.api.scoreboard --to practicalli.gameboard.api.scores\n</code></pre>","tags":["clojure"]},{"location":"learning-linux-like-its-1995/#hyprland","title":"Hyprland","text":"<p>Hyprland has already taken up a lot of time with getting the basics up and running. It will easily take weeks and most likely months to have a rich configuration with all the eye candy I have seen. Investing that kind of time is not valuable to me, but I would still like to have an engaing setup.</p> <p>There is much discussion about configuring Hyprland and lots of different community projects.</p> <pre><code>\u276f waybar\n\n(waybar:27164): Gtk-WARNING **: 23:35:32.704: Theme parsing error: gtk.css:6691:68: Invalid name of pseudo-class\n[2025-01-18 23:35:32.740] [info] Using configuration file /home/practicalli/.config/waybar/config.jsonc\n[2025-01-18 23:35:32.741] [error] Error parsing JSON: * Line 71, Column 18\n Syntax error: value, object or array expected.\n</code></pre> <p>The error seems related to the <code>\"icon-size\"</code> key which had the value <code>${i_task</code> which seems incomplete structure.</p> <p>Chaninging <code>\"icon-size\"</code> to a specific icon size seems to make waybar run (at least via the command line)</p> /home/practicalli/.config/waybar/config.jsonc<pre><code>\"wlr/taskbar\": {\n \"all-outputs\": true,\n \"active-first\": true,\n \"markup\": true,\n \"format\": \"{icon}\",\n \"rotate\": \"0\",\n // \"icon-size\": ${i_task\n \"icon-size\": \"8\"\n },\n</code></pre> <p>The <code>waybar</code> command in a terminal runs waybar okay, although there are some warnings to review.</p> <pre><code>\u276f waybar\n\n(waybar:27230): Gtk-WARNING **: 23:37:28.210: Theme parsing error: gtk.css:6691:68: Invalid name of pseudo-class\n[2025-01-18 23:37:28.246] [info] Using configuration file /home/practicalli/.config/waybar/config.jsonc\n[2025-01-18 23:37:28.250] [info] Unable to receive desktop appearance: GDBus.Error:org.freedesktop.DBus.Error.UnknownMethod: No such interface \u201corg.freedesktop.portal.Settings\u201d on object at path /org/freedesktop/portal/desktop\n[2025-01-18 23:37:28.250] [info] Using CSS file /home/practicalli/.config/waybar/style.css\n[2025-01-18 23:37:28.262] [info] Hyprland IPC starting\n[2025-01-18 23:37:28.263] [info] Loading persistent workspaces from Waybar config\n[2025-01-18 23:37:28.263] [info] Loading persistent workspaces from Hyprland workspace rules\n[2025-01-18 23:37:28.264] [warning] Can't open /dev/input/event0 (are you in the input group?): EACCES Permission denied\n[2025-01-18 23:37:28.264] [warning] Can't open /dev/input/event1 (are you in the input group?): EACCES Permission denied\n[2025-01-18 23:37:28.264] [warning] Can't open /dev/input/event2 (are you in the input group?): EACCES Permission denied\n[2025-01-18 23:37:28.264] [warning] Can't open /dev/input/event3 (are you in the input group?): EACCES Permission denied\n[2025-01-18 23:37:28.264] [warning] Can't open /dev/input/event4 (are you in the input group?): EACCES Permission denied\n[2025-01-18 23:37:28.264] [warning] Can't open /dev/input/event5 (are you in the input group?): EACCES Permission denied\n[2025-01-18 23:37:28.264] [warning] Can't open /dev/input/event6 (are you in the input group?): EACCES Permission denied\n[2025-01-18 23:37:28.264] [warning] Can't open /dev/input/event7 (are you in the input group?): EACCES Permission denied\n[2025-01-18 23:37:28.264] [warning] Can't open /dev/input/event8 (are you in the input group?): EACCES Permission denied\n[2025-01-18 23:37:28.264] [warning] Can't open /dev/input/event9 (are you in the input group?): EACCES Permission denied\n[2025-01-18 23:37:28.264] [warning] Can't open /dev/input/event10 (are you in the input group?): EACCES Permission denied\n[2025-01-18 23:37:28.264] [warning] Can't open /dev/input/mice (are you in the input group?): EACCES Permission denied\n[2025-01-18 23:37:28.264] [warning] Can't open /dev/input/mouse0 (are you in the input group?): EACCES Permission denied\n[2025-01-18 23:37:28.264] [warning] Can't open /dev/input/event11 (are you in the input group?): EACCES Permission denied\n[2025-01-18 23:37:28.264] [warning] Can't open /dev/input/mouse1 (are you in the input group?): EACCES Permission denied\n[2025-01-18 23:37:28.264] [warning] module keyboard-state: Disabling module \"keyboard-state\", Failed to find keyboard device: EACCES Permission denied\n[2025-01-18 23:37:28.488] [info] Bar configured (width: 1600, height: 30) for output: LVDS-1\n\n** (waybar:27230): WARNING **: 23:37:28.492: Status Notifier Item with bus name ':1.28' and object path '/org/ayatana/NotificationItem/udiskie' is already registered\n\n** (waybar:27230): WARNING **: 23:37:28.492: Status Notifier Item with bus name ':1.17' and object path '/org/ayatana/NotificationItem/nm_applet' is already registered\n[2025-01-18 23:37:28.497] [error] Item 'udiskie': Could not find an icon named 'drive-removable-media-usb-panel' and no pixmap given.\n</code></pre>","tags":["clojure"]},{"location":"learning-linux-like-its-1995/#add-user-to-input-group","title":"add user to input group","text":"<p>A user account can be added to a group using either <code>gpasswd</code> or <code>usermod</code></p> <p>Add user to existing group</p> <pre><code>\u276f sudo usermod -aG input practicalli\n[sudo] password for practicalli:\n</code></pre> <p></p>","tags":["clojure"]},{"location":"learning-linux-like-its-1995/#archlinux","title":"ArchLinux","text":"<p>Set the local time via the command line iusing the <code>timectrl</code> command</p> <p>ArchLinux uses an NTP server that automatically sets the local time from a remote server (at least after installing HyDE).</p> <p>To manually set the time with <code>timedatectl</code> the NTP server must be disabled first.</p> <p>Disable NTP server</p> <pre><code>timedatectl set-ntp false\n</code></pre> <p>Set the local time</p> <pre><code>timedatectl set-time \"2025-01-18 22:00:00\"\n</code></pre> <p>enable NTP server</p> <pre><code>timedatectl set-ntp true\n</code></pre> <p>Check current date</p> <pre><code>date\nSat Jan 18 10:00:09 PM UTC 2025\n</code></pre> timedatectl --help <pre><code>timedatectl [OPTIONS...] COMMAND ...\n\nQuery or change system time and date settings.\n\nCommands:\n status Show current time settings\n show Show properties of systemd-timedated\n set-time TIME Set system time\n set-timezone ZONE Set system time zone\n list-timezones Show known time zones\n set-local-rtc BOOL Control whether RTC is in local time\n set-ntp BOOL Enable or disable network time synchronization\n\nsystemd-timesyncd Commands:\n timesync-status Show status of systemd-timesyncd\n show-timesync Show properties of systemd-timesyncd\n ntp-servers INTERFACE SERVER\u2026\n Set the interface specific NTP servers\n revert INTERFACE Revert the interface specific NTP servers\n\nOptions:\n -h --help Show this help message\n --version Show package version\n --no-pager Do not pipe output into a pager\n --no-ask-password Do not prompt for password\n -H --host=[USER@]HOST Operate on remote host\n -M --machine=CONTAINER Operate on local container\n --adjust-system-clock Adjust system clock when changing local RTC mode\n --monitor Monitor status of systemd-timesyncd\n -p --property=NAME Show only properties by this name\n -a --all Show all properties, including empty ones\n --value When showing properties, only print the value\n -P NAME Equivalent to --value --property=NAME\n\nSee the timedatectl(1) man page for details.\n</code></pre> <p>Thank you.</p> <p> Practical.li Website</p> <p> Practical.li GitHub Org practicalli-johnny profile</p> <p> @practicalli@clj.social @practical_li</p>","tags":["clojure"]},{"location":"clojurists-together-q3---practicalli---update-1/","title":"Clojurists Together Q3 - Practicalli - Update 1","text":"<p>Continued support for Practicalli by Clojurists together is much appreciated and there are several hundred content ideas for the continued work.</p> <p>Highlights of the last two weeks includes:</p> <ul> <li>Live broadcasts - continuing the Banking on Clojure project with next.jdbc, H2 database and DBeaver.</li> <li>Database access and design for Banking on Clojure project</li> <li>Updated practicalli/clojure-cli-config repository to use Congnitect dev-tools for REBL and a way to configure CIDER to work with REBL - UPDATE: approach since deprecated in favour of Portal</li> <li>Test drive of Conjure, an impressive Clojure environment for Neovim</li> </ul>"},{"location":"clojurists-together-q3---practicalli---update-1/#clojure-webapps","title":"Clojure WebApps","text":"<p>Continuing the Banking on Clojure project as a major project, which started from the specifications created in Practicalli study group and will be expanded into a production grade web application.</p> <p>The application server system, UI, routing and initial handler have been defined and CircleCI used for system integration and generative testing, deploying to a staging environment on Heroku on successful builds.</p> <p>Currently adding content for database connectivity, database design and using next.jdbc and H2 for a development environment database.</p> <p>PostgreSQL provisioned using Heroku for staging and production database. Explored JDBC database connection strings, understanding well formed jdbc connection strings, very useful for working with Heroku environment variable for Postgres databases. Using different variations on the db-spec mapping for next.jdbc to minimise the number of environment variables to create.</p> <ul> <li>Design and create database tables</li> <li>Namespace design</li> <li>h2 Relational database and development tools for H2</li> <li>Relational databases - Managing connections</li> <li>Production dabase - Heroku Postgres</li> </ul> <p>Once the project is completed with compojure, other routing libraries (bidi, reitit) will be used to show a working comparison, communicating the different approaches taken in a practical way. The same will be done for component lifecycle libraries, eg. mount, integrant and component.</p> <p>Heroku only commercially available</p> <p>Heroku stopped providing user accounts with free compute credits, so either Heroku must be paid for or use an alternate approach to deployment in the cloud.</p>"},{"location":"clojurists-together-q3---practicalli---update-1/#clojure-depsedn","title":"Clojure deps.edn","text":"<p>Added new aliases and updated existing aliases</p> <ul> <li><code>:cognitect-rebl</code> and <code>:nrepl</code> updated to use the Cognitect dev-tools release for REBL, testing with latest version of CIDER.</li> <li><code>:database-h2</code> library dependency to separate the development environment database from staging and production deployment</li> <li><code>:outdated</code> unsing antq rather than depot (which is no longer under development) to manage dependency versions</li> </ul> <p>[Additional aliases added for lambdaisland/kaocha][https://github.com/practicalli/clojure-cli-config/blob/live/deps.edn#L318-L350] to support ClojureScript test runner, BDD style tests, code coverage and junit-xml reports for CI tools and wall-boards.</p>"},{"location":"clojurists-together-q3---practicalli---update-1/#practicalli-clojure","title":"Practicalli Clojure","text":"<p>Added several small projects to help people learn the basics of Clojure, many of which cover the concept of data transformation using the Clojure standard library.</p> <p>Added docs to use CIDER and Calva with REBL. UPDATE: replaced with Portal</p>"},{"location":"clojurists-together-q3---practicalli---update-1/#conjure-vim-tooling-for-clojure-development","title":"Conjure - vim tooling for Clojure development","text":"<p>Expanding the Clojure aware tools recommendations with Conjure, an excellent development environment for Neovim.</p> <p>Created a install walk through guide for Conjure that supports those new to Neovim (as I was) which will be added to the Clojure aware editors section in Practicalli Clojure. Also adding an example init.vim configuration that is documented and explains the purpose of the plugins included, supporting the adoption of the Conjure tool. (UPDATE: AstroNvim based Practicalli Astro configuration now used to configure Conjure for Practicalli)</p> <p>Planning a video of a REPL based workflow using Conjure (and all other editors) to show the tool in action and support effective.</p>"},{"location":"clojurists-together-project-update-5/","title":"Clojurists Together Project Update 5","text":"<p>Continuous integration and deployment was the main focus of this period, with some Clojure spec generative testing.</p> <p>Added Practicalli website and YouTube channel to the Clojure.org community resources.</p>"},{"location":"clojurists-together-project-update-5/#practicalli-study-group","title":"Practicalli study group","text":"<p>Continuing a tools theme by setting up continuous integration (CI) for Clojure projects. The CI service partially written in Clojure provides good support for Clojure projects. Building on CircleCI to deploy Clojure applications to the Cloud using the Heroku service.</p> <p>Broadcasts also cover using Kaocha generative test runner, both locally and on CircleCI</p> <ul> <li>077 - Continuous Integration - Clojure deps.edn and Leiningen projects</li> <li>78 - Continuous Integration - Clojure deps.edn projects and CircleCI</li> <li>079 - Continuous Integration - Deploying deps.edn project on Heroku via CirecleCI</li> </ul> <p>Content developed for Practicalli Clojure and Practicalli Clojure Webapps books.</p>"},{"location":"clojurists-together-project-update-5/#practicalli-clojure","title":"Practicalli Clojure","text":"<p>Created several guides for new and existent projects, using CircleCI as a continuous integration service. Kaocha is also used to run generative tests as well as unit tests.</p> <p>Created an introduction to CircleCI as a continuous integration service and identified and documented recommended docker images to use for Clojure deps.edn and Leinigen projects. The CircleCI examples are a little dated and includes only Leinginen project examples.</p> <p>Random Clojure Function project. Created a guide to develop a project that generates a random function from the namepaces available in the REPL or the functions from specified namespaces.</p> <p>Using the random Clojure function project, created a guide to develop a project with the help of CircleCI as the continuous integration service.</p> <p>Banking on Clojure Updated the banking-on-clojure project using a TDD approach with Clojure spec.</p> <p>Using Kaocha test runner run unit tests and Clojure spec generative tests locally and via CirceCI. Kaocha can run the same tests as clojure.spec.test.alpha/test function calls, without having to add code to the project. Adding the spect-check-plugin via the test.edn config did not run the generative tests, only the unit tests. Use the spec-test-check plugin to run the reports works when included as a command line flag.</p>"},{"location":"clojurists-together-project-update-5/#practicalli-clojure-webapps","title":"Practicalli Clojure Webapps","text":"<p>Created a guide to deploy a Clojure application via CirceCI onto Heroku. Think of Heroku as AWS without the cognitive load to use it, simply push source code to Heroku and it builds and deploys the resulting application.</p> <p>Updated the status monitor project to deps.edn to use as the basis for a guide to deploy Clojure applications via CircleCI to Heroku (a cloud platform as a service). The project takes a simple approach so the focus remains on the continuous integration pipeline.</p> <p>CircleCI has an Heroku Orb, providing common configuration for deploying to Heroku. The Heroku orb is used to deploy the project from its source code, building an uberjar and running the application from that uberjar.</p> <p>Updated details of using postgresql with Clojure (documentation will be extended soon) and recommended next.java as a library to use for SQL.</p> <p>Simplified the overall navigation on the Practicalli Clojure Webapps book.</p> <p>Heroku only commercially available</p> <p>Heroku stopped providing user accounts with free compute credits, so either Heroku must be paid for or use an alternate approach to deployment in the cloud.</p>"},{"location":"clojurists-together-project-update-5/#practicalli-spacemacs","title":"Practicalli Spacemacs","text":"<p>Rewrite of the switch to develop page, using in-page tabs to simplify the guide into the two different approaches.</p>"},{"location":"clojurists-together-project-update-5/#hacking-on-spacemacs","title":"Hacking on Spacemacs","text":"<p>Added key bindings to refactor namespace forms in clojure-mode</p> <p><code>\"ran\" 'clojure-insert-ns-form</code> <code>\"raN\" 'clojure-insert-ns-form-at-point</code> <code>\"rsn\" 'clojure-sort-ns</code></p> <p>Updated practicalli/.spacemacs.d repository with doom modeline configuration, providing a very clean and simple UI experience for Emacs whilst still providing the most useful information.</p>"},{"location":"practicalli-project-update-6/","title":"Practicalli Project Update 6","text":"<p>Started series called Banking on Clojure to cover application servers, sql and relational databases. This will cover the full development and deployment workflow, including clojure.spec for specifications and generative testing.</p> <p>Added more tools to practicalli/clojure-cli-config</p> <p>Add anchors to all sub-headings across all books, making content easier to navigate by enabling navigation to specific sections in a page. This helps keep relevant information together on one page and reference a specific section from other pages.</p>"},{"location":"practicalli-project-update-6/#practicalli-clojure-webapp","title":"Practicalli Clojure WebApp","text":"<p>Started a section on Application servers, covering approaches to server configuration and server start/stop/reload.</p> <p>Started a section on Databases that will initially cover H2 and Postgresql relational databases, using Sql with next.jdbc</p> <p>Created Banking on Clojure WebApp content for the live broadcasts and book. The project uses CircleCI for continuous integration and Heroku pipelines for deployment to staging and production.</p>"},{"location":"practicalli-project-update-6/#practicalli-clojure","title":"Practicalli Clojure","text":"<p>Configure REPL startup using <code>dev/user.clj</code> file and <code>:dev</code> alias in practicalli/clojure-cli-config configuration. Added examples of requiring namespaces and starting component lifecycle services at REPL starup added to Practicalli Clojure book.</p> <p>Add section on data browser tools, extending REBL and Clojure Inspector with new projects Reveal and Portal.</p>"},{"location":"practicalli-project-update-6/#practicalliclojure-cli-config","title":"practicalli/clojure-cli-config","text":"<p>Identified main purpose of the practicalli/clojure-cli-config project, to provide a large set of meaningful and consistently named aliases that would be available in all projects and less likely to be over-ridden by project specific deps.edn configuration.</p> <p>Any experimental or alpha state tools are clearly marked as 'experimental - used at own risk' to set clear expectations.</p> <p>Updated libraries used in aliases are using their fully qualified names, e.g. cider/cider-nrepl as this will be required for future versions of the Clojure CLI tool.</p> <p>Added Google Storage mirrors for Maven Central for Americas, Asia and Europe to library repository configuration. Also added a community mirror in Asia (China) for Clojars.</p> <p>Recent alias additions include - <code>:dev</code> - include the <code>/dev/ path to configure REPL startup with a /dev/user.clj file -</code>rebel-nrepl<code>- run rebel REPL with nrepl connection for editor connections (eg. CIDER, Calva) -</code>:nrebl<code>- REBL data browser on nREPL connection (e.g. CIDER, Calva) -</code>:deploy-locally<code>to add a jar to _/.m2 directory -</code>:deploy-clojars<code>to deploy a jar on clojars.org -</code>:deploy-clojars-signed<code>to sign and deploy a jar on clojars.org -</code>:carve<code>- a new project to carve out unused vars in code -</code>:repl-reveal` - a REPL with data browser</p>"},{"location":"practicalli-project-update-6/#practicalli-spacemacs","title":"Practicalli Spacemacs","text":"<p>Add Emacs profiler use to the Spacemacs troubleshooting guide</p>"},{"location":"practicalli-project-update-6/#pull-requests","title":"Pull requests","text":"<ul> <li>carve - fixed alias in docs</li> </ul>"},{"location":"practicalli-project-update-3/","title":"Practicalli Project Update 3","text":"<p>Continued with Practicalli Clojure updates and weekly broadcasts covering Clojure spec and generative testing. </p> <p>Also updates on Practicalli Spacemacs, including a move to doom modeline theme for a clean and modern look to Spacemacs.</p> <p>I was still feeling the affects of illness for some of this period, but steadily improving.</p>"},{"location":"practicalli-project-update-3/#practicalli-study-group","title":"Practicalli Study Group","text":"<p>Designing specifications for an online bank and basic generative testing video added to the Practicall Clojure Spec playlist</p>"},{"location":"practicalli-project-update-3/#practicalli-clojure-updates","title":"Practicalli Clojure Updates","text":"<p>Adding content and videos to the Introducing Spec section of the book, providing live code examples via klipse enabling the reader to interact with the specs and functions in the Practicalli Clojure book website.</p> <p>Spec is introduced by showing how it can be used in the REPL and added to project, with the leveraging-spec project containing many different examples.</p> <p>Divided the Spec section into Spec data, that covers how the use of predicates, literals and custom functions as specifications along with the core functions to verify data agains specs (conform, valid?, explain).</p> <p>Expanded on Getting Started section, converting to Clojure CLI and tools.deps. Examples on using Clojure CLI tools to evaluate functions, load files and run applications.</p> <p>Added details on configuring tools.deps and how to define and use multiple aliases. Provided a collection of aliases for community tools, jcenter clojars mirror and how to use a local Artifactory instance.</p> <p>Added section rebel readline for a feature rich command line REPL, including install, customisation and major features.</p> <p>Configure REPL starutup for Clojure CLI projects, examples of using <code>dev/user.clj</code> to require namespaces, call functions and manage component lifecycle services (mount, component, integrant, etc.).</p>"},{"location":"practicalli-project-update-3/#clojure-depsedn-updates","title":"Clojure deps.edn updates","text":"<ul> <li>Using REBL from Emacs CIDER using nREBL middleware, alias and configuration</li> <li>Add example of a local Artifatory instance for a repository provider</li> <li><code>:dev</code> alias - used to configure the Clojure repl automatically on startup by evaluating the content of <code>dev/user.clj</code></li> <li>Update of dependency versions in the <code>deps.edn</code> file with depot</li> <li>Update unit testing aliases, add separate expectation aliases.</li> <li><code>:test-path</code> alias - enable Emacs CIDER and other tools to add the test directory to the classpath</li> </ul>"},{"location":"practicalli-project-update-3/#practicalli-spacemacs-updates","title":"Practicalli Spacemacs Updates","text":"<p>Added page on calling component lifecycle services when refreshing the REPL from CIDER.</p> <p>Updated practicalli/spacemacs.d to use doom modeline and doom-gruvbox-light theme to give a modern and clean look to Spacemacs.</p> <p></p>"},{"location":"practicalli-project-update-4/","title":"Practicalli Project Update 4","text":"<p>After the broadcasts on Clojure spec, moving on to more tooling centric topics. Starting with Unit test runners for Clojure CLI tool and preparing a series on continuous integration, packaging and deployment.</p> <p>Flu symptoms have finally eased, so planning video tutorials in the later part of the sponsorship.</p>"},{"location":"practicalli-project-update-4/#practicalli-study-group","title":"Practicalli Study Group","text":"<p>Wrap up of Clojure spec series of 5 broad, sharing my experiences with spec along with feedback from many others in the community.</p> <p>Broadcast on unit testing and test runners, focusing on Cognitect Labs test runner and Koacha from Lambda Island.</p>"},{"location":"practicalli-project-update-4/#practicalli-clojure","title":"Practicalli Clojure","text":"<p>Updated and extended the Getting Started section, using rebel readline for the command line REPL UI. Added sections on configuriong Clojure CLI and provided a wide range of community tools and other useful aliases.</p> <p>Wrote a new section on Clojure Spec and generative testing, covering how to design specifications (composite vs hierachical). Also discussed organising specifications and how they fit into a project and along side Test Driven Development (TDD) and REPL drive development (RDD).</p> <p>Wrote section on Regular Expressions in Clojure. Added regular expressions for common string patterns, such as passwords, email addresses, etc.</p> <p>Extended the Unit Testing section to cover useful practices with clojure.test library, refactor is assertions with are to work over data sets.</p> <p>Added test runner section covering Cognitect Labs test runner and configuring categories of tests. Started a section on kaocha covering the basic use and configuration. This section to be extended as more projects are used with kaocha.</p> <p>Configured git template to use live branch as the default branch name. The word master has never made any sense as a term in a distributed version control system.</p> <p>Added <code>:test-runner-cljs</code> alias to practicalli/clojure-cli-config for the cljs-test-runner from Olical. A test runner inspired by Cognitect Labs test runner for Clojure.</p> <p>Discussion regarding some defacto approaches and conventions for Clojure tools.deps projects, especially around the idea of naming of aliases. The practicalli/clojure-cli-config repository is an example of how 30+ aliases could be defined to provide the most common tooling for all tools.deps projects.</p>"},{"location":"practicalli-project-update-4/#practicalli-clojurescript","title":"Practicalli ClojureScript","text":"<p>Clarified the introduction to the ClojureScript book status and surfaced the work that remains current and functional. This content includes and several reagent based projects, building and deploying a ClojureScript website for ClojureBridge and creating a TicTacToe game with Scalable Vector Graphics.</p> <p>Depreciated content developed several years ago, as much has changed in the ClojureScript world since then. The older content is still available and will be updated during July 2020 and onward.</p>"},{"location":"practicalli-project-update-4/#practicalli-spacemacs","title":"Practicalli Spacemacs","text":"<p>Using CIDER test runner in Spacemacs with Clojure CLI projects. Covering the Spacemacs specific key bindings, and how to configure the CIDER test runner in Spacemacs.</p> <p>Hint on turning off custom themes to get the classic Emacs look. The theme called default looks the same as classic Emacs.</p> <p>Created a reference sheet for CIDER configuration variables, as there is no overall reference.</p> <p>Using .dir-locals.el for project specific configuration.</p>"},{"location":"practicalli-project-update-4/#spacemacs-pull-requests","title":"Spacemacs Pull Requests","text":"<p>Refactor applications menu key bindings to create more room for key bindings and improve mnemonic keybinding use. Sub menus added using the layer categories of the packages any existing key bindings originate from.</p>"},{"location":"practicalli-project-update-1/","title":"Practicalli Project Update 1","text":"<p>Unfortunately illness caught up with me towards the end of this period, but otherwise I have been busy with the weeekly broadcasts and improvements to the Practicalli Clojure book, updating the install guides to Clojure CLI tools and repl driven development sections.</p>"},{"location":"practicalli-project-update-1/#practicalli-study-group","title":"Practicalli Study Group","text":"<p>The weekly live broadcasts continue, finalizing the data science series and starting a new series on <code>clojure.spec</code></p>"},{"location":"practicalli-project-update-1/#visualising-data-science","title":"Visualising data science","text":"<p>Concluded the series of 7 live broadcasts on Visualising data science.</p> <p>The series started with extraction of data from various sources and how to transform data into more relevant structures for the task required. Initially using ascii-graph to visualize data in the REPL before moving on to create a professional looking dashboard usings Oz and Bulma CSS framework.</p> <p>The dashboard project was developed around the continually changing coronavirus data available in the UK. The broadcasts has several examples of how to deal with things when the data format changes (which it did several times).</p> <p>The later broadcasts includes tips and examples on how to refactor a project as it grows.</p>"},{"location":"practicalli-project-update-1/#introduction-to-clojurespecalpha","title":"Introduction to clojure.spec.alpha","text":"<p>Started a new video series covering how to use spec in the REPL and with Clojure projects</p> <p>Initially covering the foundation functions of the <code>clojure.spec.alpha</code> library and why its called alpha. practicalli/leveraging-spec project was created, covering Clojure predicates, spec/conform, spec/valid?, literal values (Clojure sets), the spec registry, fully qualified namespaces, map literal syntax, spec/def and spec/explain.</p> <p>Started a spec for an online bank account that will be used in further episodes of the series.</p>"},{"location":"practicalli-project-update-1/#practicalli-clojure","title":"Practicalli Clojure","text":"<p>Continued to migrate the book to Clojure CLI tools and deps.edn projects. The overall book content design is being refactored.</p> <p>Update install guide to use Java 11 and added more editor options to the install guides, including NeoVim Conjure and Atom.io Chlorine.</p> <p>Updated the practicalli/clojure-cli-config repository with also contains a collection of commonly used aliases. This repository greatly simplifies the installation of Clojure CLI tooling.</p> <p>Started creating transcripts for videos. Creating transcripts first helps increase the quality of videos created and reduces the amount of effort required post processing videos.</p> <p>Added basic introduction to spec which will be expanded as Practicalli study group video series continues</p>"},{"location":"practicalli-project-update-1/#practicalli-spacemacs","title":"Practicalli Spacemacs","text":"<p>Supported the community with issues on Spacemacs gitter and #spacemacs channel of Clojurians Slack.</p>"},{"location":"practicalli-project-update-1/#practicalli-clojure-webapps","title":"Practicalli Clojure WebApps","text":"<p>Refactor overall book content design for Practicalli Clojure WebApps - plan to extend the scope of the book.</p>"},{"location":"practicalli-project-update-2/","title":"Practicalli Project Update 2","text":"<p>Unfortunately I was ill for most of this period, so not as much achieved this time. I am (and always intended to) extending the work passed the Clojurists Together sponsor period.</p>"},{"location":"practicalli-project-update-2/#summary","title":"Summary","text":"<p>Continuing the weekly broadcasts on Clojure spec, a topic that will be added to the Practicalli Clojure book.</p> <p>Added GitHub issues / PR shields for each book on the website to make tracking and contributing more convenient.</p> <p>Pages on how to use Magit forge to list and create issues and pull requests as well as fork repositories on GitHib, all from within Spacemacs (Emacs).</p>"},{"location":"practicalli-project-update-2/#practicalli-website","title":"Practicalli Website","text":"<p>Added Shields for each book with links to content ideas and pull requests on the respective repositories. Aids in the tracking of book progress and providing another way for others to contribute.</p> <p>Added YouTube playlists to the Practicalli website to make specific video content easier to find.</p> <p>Updated the Creative commons license notice on the front pages of all books and GitHub README files, ensuring compliance with the Software Freedom Conservancy.</p> <p>Add favicon to each book website</p>"},{"location":"practicalli-project-update-2/#practicalli-study-group","title":"Practicalli Study Group","text":"<p>Continuing the new series on <code>clojure.spec.alpha</code>, this time comparing function definition validation with <code>:pre</code> / <code>:post</code> conditions and spec <code>fdef</code>.</p> <ul> <li>072 - Clojure Spec - Part 2 validation with :pre & :post and spec fdef</li> </ul>"},{"location":"practicalli-project-update-2/#practicalli-spacemacs","title":"Practicalli Spacemacs","text":"<p>Several updates on using the Magit client</p> <p>Guide on using Magit Forge to list and create issues and pull requests on GitHub, including forking remote repositories on GitHub.</p> <p>Updated and tested the Magit Forge configuration page</p> <p>Add page on how to staging changes with Magit, including the scope of changes that can be selected, from multiple files, hunks or individual lines.</p> <p>Video to how to update an existing pull request added to the contributing section, to complement the existing video showing how to contribute a pull request to Spacemacs (which can be used for any other project).</p> <p>Practicalli Spacemacs playlist updated with related Spacemacs videos from jr0cket channel.</p> <p>Supported the community with issues on Spacemacs gitter and #spacemacs channel of Clojurians Slack.</p>"},{"location":"practicalli-project-update-2/#practicalli-clojure-webapps","title":"Practicalli Clojure WebApps","text":"<p>Add the high level plan to extend the book contents to the Clojure WebApps book, along with project ideas to implement.</p> <p>Updated the cover of the book to use the new Practicalli ClojureWebApps book banner</p> <p>Improvements to various content sections based on feedback from the community.</p> <ul> <li>Updated webapps overview with additional project links</li> <li>Completely revised the introduction to sets and hash-maps</li> <li>Improved descriptions for the ring introduction, creating a project, creating a webserver, defining handlers, compojure defroutes and using the let function</li> <li>Clarified use of Heroku for deploying applications</li> </ul>"},{"location":"practicalli-project-update-6/","title":"Practicalli Project Update 6","text":"<p>A range of updates, new content and tool reviews and testing. Reviewed 75 solutions for 44 students on Exercism.io over the last two week, adding that advice and code walk-throughs to the Practicalli Clojure book.</p> <p>Several high-quality REPL driven development videos will be released soon, awaiting some final editing and post processing.</p>"},{"location":"practicalli-project-update-6/#practicalli-study-group","title":"Practicalli Study Group","text":"<p>Continued solving Exercism.io challenges for the Live broadcasts, with a request to specifically do the Spiral Matrix challenge * 090 - Code challenges - Exercism.io Space-Age challenge * 091 - Code challenges - Exercism.io Spiral Matrix challenge</p>"},{"location":"practicalli-project-update-6/#practicalli-clojure","title":"Practicalli Clojure","text":"<p>Add SpaceVim to Clojure Editors in book now the Clojure command line bug is fixed. Continued adding REPL driven development approaches to solving Exercism.io challenges.</p> <p>Launch Portal data navigator with any REPL using <code>:env/dev</code> and <code>:inspect/portal-cli</code> aliases. The REPL automatically evaluates the <code>dev/user.clj</code> source code file to require portal, open the portal window and add portal as a <code>tap></code> source</p> <p>+New sections * Exercism.io bob challenge - walking through two alternative solutions * SpaceVim and vim-fireplace install guide - including clj-kondo * SpaceVim and vim-fireplace user guide - a quick guide to get started.</p> <p>Updated * Portal - auto-start portal on REPL startup * Clojure CLI tools version used with CircleCI and updating scripts to use latest Clojure CLI tools release and -M flag with aliases. * nrepl and cider aliases for the Reveal data visualization tool (Reveal deprecated)</p>"},{"location":"practicalli-project-update-6/#practicalli-clojure-cli-config","title":"Practicalli clojure-cli-config","text":"<p>Updates and fixes to the user level configuration for Clojure CLI projects. Added clj-kondo as a GitHub action to lint all pull requests and commits, ensuring aliases are in a good state.</p> <ul> <li>Alternative REPLs: socket server and prepl aliases</li> <li><code>:inspect/reveal-nrepl</code> to run an nREPL server with Reveal data visualization</li> <li><code>:inspect/reveal-light-nrepl</code> a light theme version with a 32 point Ubuntu Mono font useful for demos and HiDPI screens</li> <li><code>:inspect/reveal-nrepl-cider</code> CIDER specific libraries and middleware configuration with <code>:inspect/reveal-light-nrepl-cider</code> as a light version</li> <li><code>:test/cognitect-precompile</code> alias to compile tests before running Cognitect Labs test runner</li> <li>Monthly update of library versions for all aliases using <code>:project/outdated</code> alias</li> <li><code>community/zulip-event</code> to add community event to zulip chat</li> <li><code>test/cloverage</code> add clojure exec options for cloverage (#8)</li> <li><code>:inspect/reveal-nrepl</code> and <code>:inspect/reveal-light-nrepl</code> Cider specific aliases for Reveal data browser</li> </ul>"},{"location":"practicalli-project-update-6/#practicalli-data-science","title":"Practicalli Data Science","text":"<p>Created a new (alpha state) book to provide practical guides to using Clojure tools and libraries to build applications in a data science context. Working with the SciCloj community to raise awareness of what is possible in this space and as I grow my understanding it will be captured in the Practicalli Data Science book.</p> <ul> <li>Notespace section - created a simple demo of the Notespace data science journal tool for Clojure, combined with Portal to help browse large data sets.</li> </ul>"},{"location":"practicalli-project-update-6/#practicalli-clojurescript","title":"Practicalli ClojureScript","text":"<p>Updated to new Practicalli theme and put all project content first, moving overview and design content to the reference section. The book will focus on figwheel-main, reagent and ClojureScript for the next quarter.</p>"},{"location":"practicalli-project-update-6/#practicalli-spacemacs","title":"Practicalli Spacemacs","text":"<p>Update Clojure documentation section to show Clojure and Java documentation functions, including how to navigate to source code and specifications from help.</p>"},{"location":"practicalli-project-update-6/#hacking-cider","title":"Hacking CIDER","text":"<ul> <li>PR #2926 - Tip to evaluate namespace before documentation lookup - added to Practicalli Spacemacs instead.</li> </ul>"},{"location":"practicalli-project-update-4/","title":"Practicalli Project Update 4","text":"<p>Creating more recorded video content around REPL driven development of high quality, improving speed of editing with Blender.org as well as better script writing and delivery practice.</p> <p>Represented Clojure at the JVMWars 2020 online meetup, giving a short presentation which included a brief demo of REPL driven development.</p>"},{"location":"practicalli-project-update-4/#practicalli-study-group","title":"Practicalli Study Group","text":"<p>Refactored the data-access code into <code>practicalli.data.*</code> namespaces to make each namespace have a specific aim. Identified generic functions to reduce repetition in the code.</p> <p>Added unit test fixture (setup/teardown) to create and delete the H2 database on the fly, using functions in the <code>handler-helper</code> namespace.</p> <ul> <li>086 - Banking On Clojure - Part7 - Refactor data-access namespaces and fix the build on CircleCI</li> </ul>"},{"location":"practicalli-project-update-4/#practicalli-clojure","title":"Practicalli Clojure","text":"<p>New sections and Pages: - Unit testing selectors - Unit testing fixtures</p> <p>New page on the use of test selectors to organise tests and run test suites more effectively. Included examples for LambdaIsland kaocha, Spacemacs, Cider and Cognitect labs test runners.</p> <p>New page on fixtures for unit tests, with example fixture functions and configuration on when to run fixtures for testing.</p>"},{"location":"practicalli-project-update-4/#screencasts","title":"Screencasts","text":"<ul> <li>Clojure REPL driven development with Rebel Readline</li> <li>Clojure projects with the REPL</li> <li>Cloure REPL driven development - a simple example</li> </ul> <p>Updated Cognitect REBL install procedure, local maven install no longer required (Edit: since removed from the book).</p> <p>Updated Conjure configuration and documentation</p>"},{"location":"practicalli-project-update-4/#screencast-video-editing","title":"Screencast Video Editing","text":"<p>Learned how to use Blender.org for Video editing which proved to be much more efficient that previous tools used. This will help produce a higher quality of videos for the new series on Clojure CLI tools and REPL driven development.</p>"},{"location":"practicalli-project-update-4/#practicalli-clojure-depsedn-configuration","title":"Practicalli Clojure deps.edn configuration","text":"<p>Minor updates to the practicalli/clojure-cli-config user level configuration for Clojure CLI tools. This configuration is alsor recommeded by seancorfield/dot-clojure personal configuration</p> <ul> <li>inspect/rebl - link added to updated install requirements</li> <li>updated library versions for: clj-new and depstar update</li> <li>title and alias sub-section in mini table of contents</li> <li>merge project related aliases into one section</li> </ul>"},{"location":"practicalli-project-update-4/#practicalli-spacemacs","title":"Practicalli Spacemacs","text":"<p>Changes to the practicalli/spacemacs.d configuration for Spacemacs.</p> <ul> <li>renamed Git branch to live (update your remote urls)</li> <li>recommending Emacs 27.1 as its the current stable version and it supports ligatures (stylized character pairs).</li> <li>added unicode ligature support (no need for ligature configuration in dotspacemacs/user-config as it built into the unicode layer)</li> <li>Switched to using Fira code font as this has ligature support</li> <li>Updated the doom modeline theme for a nice minimal look without loosing any important information</li> <li>Added font rendering optimizations</li> </ul> <p>Several custom snippets added to the practicalli/spacemacs.d: deprecated and design journal banners, rich code block with clj-kondo ignore duplicate</p>"},{"location":"practicalli-project-update-5/","title":"Practicalli Project Update 5","text":"<p>A range of updates, new content and tool reviews and testing. Helping lots of students on Exercism in the last week.</p>"},{"location":"practicalli-project-update-5/#practicalli-study-group","title":"Practicalli Study Group","text":"<p>Getting back to some important basics of Clojure, walking through several Exercism.io coding challenges (to support mentoring efforts there).</p> <ul> <li>089 - Code challenges - Regular Expressions to solve Bob challenge on Exercism.io</li> <li>088 - Code challenges - Encoding and decoding</li> <li>087 - Clojure CLI tools - Practicalli Clojure deps.edn configuration and a tour of community tools</li> </ul>"},{"location":"practicalli-project-update-5/#practicalli-clojure","title":"Practicalli Clojure","text":"<p>Reviewed the Introduction and Getting Started sections, improving the flow and providing a solid introduction to Clojure.</p> <p>New sections * Using Clojure CLI tools - common tasks - with accompanying broadcast * Code Analysis - install and configuring clj-kondo * Neovim and Conjure install and Conjure user guide](https://practical.li/clojure/clojure-editors/) - Update: moved to Practicalli Neovim</p> <p>Updated Clojure CLI tools version used with CircleCI and updating scripts to use -M flag with aliases.</p> <p>Evaluated Spacevim to see if it should be added to the recommended Clojure aware editors. An issue was found running the Clojure CLI tools REPL on Linux, along with a quick fix. Although the configuration of vim packages is excellent and a very impressive overall experience. the Clojure environment is very basic and would welcome modernizing. Ideally adding Conjure to SpaceVim would produce an excellent development experience.</p>"},{"location":"practicalli-project-update-5/#practicalli-clojure-cli-config","title":"Practicalli clojure-cli-config","text":"<p>Updates and fixes to the user level configuration for Clojure CLI projects</p> <ul> <li>Add <code>:middleware/cider-clj</code> and <code>:middleware/cider-clj-refactor</code> aliases to allow connections to a running REPL from Cider (and should also work for Calva).</li> <li>practicalli/live middleware/clojure-clj-refactor: add documentation</li> <li>Clojure CLI config precedence - added graphic</li> <li>Added Common development tasks</li> <li>kaocha test runner: fix for 1.0.700 release</li> <li>Update group-id of <code>deps-deploy</code> (#3)</li> </ul>"},{"location":"practicalli-project-update-5/#practicalli-spacemacs","title":"Practicalli Spacemacs","text":"<p>New content: * Running specific test groups with test selectors</p> <p>Updated content: * Line numbers - visual, relative and absolute styles * Repeating searches and scrolling through search pattern history</p>"},{"location":"practicalli-project-update-5/#cider-issue","title":"Cider issue","text":"<p>Investigated bug with Emacs Cider and the new Clojure CLI tools <code>-M</code> alias flag. Cider modeled Clojure CLI tools support on the approach for Leinigen and this resulted in the -A alias flag occurring out of position. The clojure command does work this way, only since the <code>-M</code> flag has been introduced that the issue became visible. The fix organises the arguments in the correct position * Issue: Clojure CLI command parameters order incorrect * PR: jack-in: move Clojure-cli parameter global-opts after -Sdeps</p> <p>Hacking on CIDER live broadcast to evolve the way cider-jack-in manages aliases. Covers basic elisp print line style debugging and how to hack on the live Cider code running in Emacs.</p>"},{"location":"practicalli-project-update-5/#clojure-cli-support-for-other-tools","title":"Clojure CLI support for other tools","text":"<p>Reviewed Clojure CLI support for other Clojure aware editors recommended and raised issues and fixes.</p>"},{"location":"practicalli-project-update-5/#calva-issue","title":"Calva issue","text":"<p>Calva only seems to allow the use of <code>-A</code> flag when using its jack-in feature, so issue #826 raised for awareness of the change in Clojure CLI tools.</p>"},{"location":"practicalli-project-update-5/#spacevim-issue","title":"Spacevim issue","text":"<p>Spacevim fails to run the REPL using Command Line tools on Unix systems, picking up the wrong executable name. Suggested a quick hack to fix the issue to help the community create a suitable fix in vimscript.</p> <p>Thank you.</p> <p> Practical.li Website</p> <p> Practical.li GitHub Org practicalli-johnny profile</p> <p> @practicalli@clj.social @practical_li</p>"},{"location":"practicalli-project-update-2/","title":"Practicalli Project Update 2","text":"<p>Invested time to understand the changes coming to the Clojure CLI tools and understand the opportunities that Clojure exec (<code>:exec-fn</code> & <code>:exec-args</code>) brings to aliases. These changes provided a catalyst to start redesigning the aliases used in practicalli/clojure-cli-config.</p>"},{"location":"practicalli-project-update-2/#practicalli-study-group","title":"Practicalli Study Group","text":"<p>Continuing the Banking on Clojure project, especially around database access. The database schema was refined along with improved approaches to creating database schema, using transactional updates and ensuring connections are closed. The next.jdbc friendly functions were explored and a CRUD approach implemented.</p> <ul> <li> 082 - Banking On Clojure - Part3 - next.jdbc for SQL in Clojure</li> <li> 083 - Banking On Clojure - Part4 - Updating data in the database</li> </ul> <p>Next steps will be to use Clojure spec for generative testing with the database, add connection pooling and using lifecycle management libraries.</p>"},{"location":"practicalli-project-update-2/#practicalli-webapps","title":"Practicalli WebApps","text":"<p>Updated sections on H2 Database and Banking on Clojure</p> <ul> <li>Design and Create Database Tables</li> <li>Defining Database Queries - different approaches</li> <li>Create database records</li> <li>Read Database Records</li> <li>Update Records in the database</li> <li>Delete Records in the database</li> </ul>"},{"location":"practicalli-project-update-2/#practicalli-clojure","title":"Practicalli Clojure","text":"<p>Added core principles for writing effective unit tests in Clojure. Included project configuration examples of unit tests for Leiningen and Clojure CLI tools.</p> <p>Included example configuration for Emacs CIDER test runner and link to the test runner configurations in practicalli/clojure-cli-config.</p>"},{"location":"practicalli-project-update-2/#clojure-cli-config","title":"Clojure CLI Config","text":"<p>Created a draft guide to changes in the next release of the Clojue CLI tools, to understand the significance of the changes it introduces. The <code>-X</code> flag for executing a function with EDN arguments (hash-map arguments) has already been introduced and the new release depreciates the generic <code>-A</code> alias in favor of <code>-M</code>. In the long term using the <code>-X</code> flag with functions that take a structured argument looks to be an excellent approach.</p> <p>Started a redesign of practicalli/clojure-cli-config using qualified keywords for alias names. The Library repositories keyword, <code>:mvn/repos</code>, is already qualified, so this redesign brings the aliases in line with that style. The alias keywords are prepended with names to communicate the category of purpose for each alias, e.g. repl, project, env, lib, inspect, build, deploy.</p> <p>As part of the redesign, the new flags introduced with Clojure CLI tools, <code>-M</code> and <code>-X</code>, are used. The <code>-X</code> flag is the preferred Clojure command line flag to use for the aliases, where the library supports executing a function from the library that takes a hash-map of arguments. Otherwise <code>-M</code> flag replaces <code>-A</code> flag and continues to use <code>clojure.main</code> to call the <code>-main</code> function of the given main namespace.</p> <p>Add project/check to give detailed report on compilation issues for a project</p> <p>UPDATE: all aliases in Practicalli CLI Config use fully qualified names.</p>"},{"location":"practicalli-project-update-2/#practicalli-spacemacs","title":"Practicalli Spacemacs","text":"<p>Resolved simple bug fixes raised by the community.</p> <p>Thank you.</p> <p> Practical.li Website</p> <p> Practical.li GitHub Org practicalli-johnny profile</p> <p> @practicalli@clj.social @practical_li</p>"},{"location":"practicalli-project-update-3/","title":"Practicalli Project Update 3","text":"<p>Continuing the Live broadcasts covering the developmment of the Banking on Clojure web application. - 084 - Banking On Clojure - Part5 - Generated database records from clojure.spec - 085 - Banking On Clojure - Part6 - Refactor database schema, specs and namespaces</p>"},{"location":"practicalli-project-update-3/#practicalli-clojure","title":"Practicalli Clojure","text":"<p>New sections and Pages: * Coding Challenges section * Unit testing fixtures</p> <p>Added Code Challenges section, covering the Clojure challenges available in 4Clojure.com, Exercism.io, CodwWars.com, ClojureScript Koans and Advent of Code.</p> <p>A quick guide to using each of the Code challenge websites was provided and tips to using them effectively.</p> <p>GitHub code repositories for the Practicalli 4Clojure guides, codewars-guides and exercism-guides were included, along with the 4Clojure guides video playlist which walks through the solution to over 60 challenges and different approaches to solving them.</p> <p>Several 4Clojure and Exercism challenges have been added as solution walk-through, showing the design thinking behind the solution in the website. More of these will be converted from the solution code repositories as time allows, along with a video showing the REPL driven development experience.</p> <p>Added Unit testing fixtures page with examples from Banking on Clojure project. Also mentioned test selectors as a way to organize slower fixtures.</p> <p>Started creating project templates for use with clj-new, to create deps.edn projects useful for beginners and experienced developers alike. A section on writing your own custom templates will be added to the Practicalli Clojure book in October.</p> <p>Continuing to create scripts for video screencasts for a series on the Clojure CLI tools, covering the usage from the latest release (1.10.1.697). The series will convey the developer experience and common practices.</p> <p>Continue testing Clojure CLI pre-release and enhancing the aliases in practicalli/clojure-cli-config, no issues found so far.</p>"},{"location":"practicalli-project-update-3/#clojure-webapps","title":"Clojure WebApps","text":"<p>Redesign the database schema and clojure.spec specifications to simplify the use of generative testing with specifications and in general make the specifications easier to work with.</p> <p>Using generative testing with the database. Specifications are used to generate random data to test the database CRUD functions, validating the results of those functions against clojure specs.</p> <p>Added code to create and delete the development database which is called from fixture functions within the handler-helper-test namepace. The tests now run successfully via the CirceCI service.</p> <p>Using kaocha profiles to configure different behavior in the development environment and when running on the CI server, specifically file change watcher and test output.</p>"},{"location":"practicalli-project-update-3/#practicalli-spacemacs","title":"Practicalli Spacemacs","text":"<p>Now Emacs 27 is the default, trying out Ligature support in Emacs. Added the unicode layer with variables to include ligatures. Initially switching to the Fira code font which contains a wide range of ligatures in the font already.</p> <p>Will try the Ligaturizer project to add Fira Code ligatures to the Ubuntu Mono font, the preferred font used by Practicalli.</p>"},{"location":"practicalli-project-spring-2023/","title":"Practicalli Project Spring 2023","text":"<p>Due to covid illness during 2022 the planned work has been spread over late 2022 - early 2023.</p>"},{"location":"practicalli-project-spring-2023/#general-tasks","title":"General tasks","text":"<ul> <li>upgraded all Practicalli books to MkDocs for book generation, using Material for MkDocs theme for enhanced content engagement</li> <li>Updated Practical.li website to list all book, identifying those still under development</li> <li>Monthly updates of Practicalli Clojure CLI Config aliases to support the Practicalli books</li> <li>Practicalli Organisation Profile on GitHub to help surface the books and video content available</li> <li> <p>Improved Practicalli logo for light and dark theme support</p> </li> <li> <p>GitHub Issue activity</p> </li> <li>All GitHub activity</li> </ul> <p>Contributions to other open source projects</p> <ul> <li>Spacemacs Command log layer - add keycast bindings show keys in Emacs header / tab bar and modeline to support Practicalli Screencasts</li> <li>Spacemacs Git layer - add toggle draft PR key binding show keys in Emacs header / tab bar and modeline to support Practicalli Screencasts</li> <li>mulog documentation - add Reitit ring handler middleware example for logging requestst and responses</li> <li>Update Emacs Docs for Portal</li> </ul>"},{"location":"practicalli-project-spring-2023/#practicalli-clojure","title":"Practicalli Clojure","text":"<ul> <li>Packaging Clojure projects with tools build</li> <li>Practicalli Project Templates for seancorfield/deps-new project, including Dockerfile, Makefile, code quality check & megalinter GitHub workflows</li> <li>Major book re-write to focus on Clojure CLI and a REPL Reloaded workflow<ul> <li>REPL reloaded and associated aliases created in Practicalli Clojure CLI Config</li> <li>Intro to Clojure CLI, how to use and define aliases, exec options</li> <li>practicalli approach to designing aliases, discussing composability focused design</li> <li>refactor and update Clojure Editor section - creating several new books</li> </ul> </li> <li>Simplify practicall/clojure-cli-config<ul> <li>add <code>:repl/reloaded</code> & <code>:dev/reloaded</code> aliases to support REPL Reloaded workflow</li> <li>remove unused aliases to the deps-deprecated.edn file</li> </ul> </li> <li>using Make for a consistent command line experience across projects</li> <li>Format clojure code - cljstyle, cljfmt, eastwood, kibit</li> </ul>"},{"location":"practicalli-project-spring-2023/#new-book-engineering-playbook","title":"New Book: Engineering Playbook","text":"<p>Specific guides (plays) to common software engineering tasks covering a range of practices and tools</p> <ul> <li>Architecture</li> <li>C4 code driven architecture diagrams and Structurizr tool</li> <li>Practicalli FinTech risk system with Data Science Modelling example architecture</li> <li>Build tools</li> <li>Make universal build automation tool</li> <li>Code Quality</li> <li>MegaLinter local runner and GitHub Workflow - providing a wide range of lint tools for code and configuration files</li> <li>Clojure quality tools - format, syntax and idiom checks (clj-kondo, cljstye, cljfmt, zprint)</li> <li>Command Line tools</li> <li>kitty terminal - fast and feature rich GPU based terminal emulator</li> <li>Continuous Integration</li> <li>Common GitHub actions</li> <li>Example GitHub workflows used in production</li> </ul>"},{"location":"practicalli-project-spring-2023/#practicalli-clojure-web-services","title":"Practicalli Clojure Web Services","text":"<ul> <li>Service REPL Workfow added, including</li> <li>Aero parsing of system configuration and tag literals</li> <li>Integrant REPL for a repl reloaded workflow when building clojure services</li> <li>Integrant to manage system components at Clojure Service runtime</li> <li>GitHub template for a Clojure project including tools.build, format tools configuration, Makefile task automation, Dockerfile and REPL reloaded user namespace</li> <li>Practicalli Service template for seancorfield/deps-new project with http-kit, reitit, mulog, including Dockerfile, Makefile, code quality check & megalinter GitHub workflows</li> </ul>"},{"location":"practicalli-project-spring-2023/#new-book-practicall-vspacecode","title":"New Book: Practicall VSpaceCode","text":"<p>Started a guide to using VSpaceCode for clojure development, bringing VS Code, Calva and vim-style editing together as an effective tool.</p> <p>Key bindings for Calva were submitted and merged to VSpaceCode</p> <p>Additional settings and key bindings were created to enhance the experience.</p>"},{"location":"practicalli-project-spring-2023/#blog-posts","title":"Blog posts","text":"<p>New articles:</p> <ul> <li>Create deps-new templates for Clojure CLI projects</li> <li>Build Emacs from source on Ubuntu Linux</li> <li>London Clojurians Community - a relatively brief history</li> <li>Build and run Clojure with Multi-stage Dockerfile<ul> <li>practicalli/clojure-app-template Dockerfile comprehensive multistage Dockerfile example</li> </ul> </li> <li>Make Clojure development tasks simple and consistent - Update: moved to Practicalli Engineering Playbook - Make<ul> <li> practicalli/clojure-app-template Makefile</li> </ul> </li> <li>ClojureScript workflow with Clojure CLI tools and Figwheel-main</li> <li>Adopting FreeDesktop.org XDG standard for development tools</li> <li>Building Emacs 28 on Ubuntu Linux</li> <li>Java 17 JDK for Clojure development</li> </ul> <p>Updates:</p> <ul> <li>update: rewrite Clojure CLI understanding aliases</li> <li>clarify: extra-deps description updated</li> <li>update: Article build run clojure with multistage dockerfile</li> </ul>"},{"location":"archive/2025/","title":"2025","text":""},{"location":"archive/2024/","title":"2024","text":""},{"location":"archive/2023/","title":"2023","text":""},{"location":"archive/2020/","title":"2020","text":""},{"location":"archive/2018/","title":"2018","text":""},{"location":"category/practicalli/","title":"practicalli","text":""},{"location":"category/hardware/","title":"hardware","text":""},{"location":"category/clojure/","title":"clojure","text":""},{"location":"category/neovim/","title":"neovim","text":""},{"location":"category/debian/","title":"debian","text":""},{"location":"category/clojurists-together/","title":"clojurists-together","text":""},{"location":"category/100daysofcode/","title":"100daysofcode","text":""},{"location":"page/2/","title":"Journal","text":""},{"location":"page/3/","title":"Journal","text":""},{"location":"page/4/","title":"Journal","text":""},{"location":"page/5/","title":"Journal","text":""},{"location":"page/6/","title":"Journal","text":""},{"location":"page/7/","title":"Journal","text":""},{"location":"page/8/","title":"Journal","text":""},{"location":"page/9/","title":"Journal","text":""},{"location":"page/10/","title":"Journal","text":""},{"location":"page/11/","title":"Journal","text":""},{"location":"archive/2024/page/2/","title":"2024","text":""},{"location":"archive/2024/page/3/","title":"2024","text":""},{"location":"archive/2024/page/4/","title":"2024","text":""},{"location":"archive/2024/page/5/","title":"2024","text":""},{"location":"archive/2024/page/6/","title":"2024","text":""},{"location":"archive/2023/page/2/","title":"2023","text":""},{"location":"archive/2023/page/3/","title":"2023","text":""},{"location":"archive/2020/page/2/","title":"2020","text":""},{"location":"archive/2018/page/2/","title":"2018","text":""},{"location":"category/100daysofcode/page/2/","title":"100daysofcode","text":""},{"location":"category/clojurists-together/page/2/","title":"clojurists-together","text":""},{"location":"category/practicalli/page/2/","title":"practicalli","text":""},{"location":"category/practicalli/page/3/","title":"practicalli","text":""},{"location":"category/practicalli/page/4/","title":"practicalli","text":""},{"location":"category/practicalli/page/5/","title":"practicalli","text":""},{"location":"category/practicalli/page/6/","title":"practicalli","text":""},{"location":"category/practicalli/page/7/","title":"practicalli","text":""},{"location":"category/practicalli/page/8/","title":"practicalli","text":""}]} \ No newline at end of file +{"config":{"lang":["en"],"separator":"[\\s\\-]+","pipeline":["stopWordFilter"]},"docs":[{"location":"","title":"Journal","text":"<p>A journal of thoughts and experiences from commercial work and community projects powered by Material for MkDocs</p> <p>Practical.li provides free online books covering practical guides to Clojure programming and development workflows. Practicalli Engineering Playbook contains specific guides across the full spectrum of software development.</p> <p></p> <p>All sponsorship funds are used to support the continued development of Practicalli series of books and videos, although most work is done at personal expense and time.</p> <p>Thanks to Cognitect, Nubank and sponsors from the Clojure community for your continued support</p>"},{"location":"practicalli-team/","title":"Practicalli team","text":"<p>Practicalli was created in 2019 by Johnny Stevenson as an idea born from the years spent learning Clojure in the community. I consider Practicalli a team effort as it relies on feedback and questions from the wider Clojure community, as well as the legion of libraries that have been created.</p> <p>My interest in Clojure was accidental at first but eventually became a passion it is hard to live without.</p> <p>The work created by Practicalli initially focused on learning the language, its idioms and common libraries. The work has broadened to include commercial experiences gained with Clojure since 2017.</p> <p>Although the published content is the sole effort of one person, it would not have been possible by the vast amount of work created by Cognitect and the Clojure community.</p> <p>I thank Bruce Durling for starting my journey into Clojure and the 100's of people I've met in person and online from the community that have motivated and inspired me.</p> <p>Practicalli Journal weekly updates</p> <p>Updates to Practicalli and general learning experiences are published in weekly articles on the Practicalli Journal website</p>"},{"location":"practicalli-team/#accidental-clojure","title":"Accidental Clojure","text":"<p>Over a decade of of Java development, including lots of Enterprise Java, Object Oriented databases and Corba integration work, I was looking for something to invigerate my career.</p> <p>I had a great appreciation for the Java platform but the project work seemed to be very similar and some challenges didnt seem to fit the Object Oriented approach so well.</p> <p>Scala programming language was making a lot of noise and was viewed as a useful way to start adoptiong a functional style of programming.</p> Haskel studied at University <p>A module on the Haskel language whist studying Software Engineering had planted the seed of functional programming and a declarative approach to writing code.</p> <p>Although Haskel as a language was an interesting option to take, the haskel ecosystem was not as widespread as Java and was seen as a far bigger jump. There was a limited understanding of job opportunities using Haskel, certainly compared to Java and Scala.</p> <p>I volunteered to start running a practical community event to practice Scala together. I attended the Python and Clojure dojo events to see how to run an event for Scala.</p> <p>After finding a company willing to host (and more importantly provide pizza and drinks) I started running a monthly Scala dojo.</p> <p>I kept going to the Clojure dojo as it was a very welcoming group and I was also facinated and highly confused by the language itself.</p> <p>During the first year of Clojure dojo events I slowly became very attached to the simplicity of solutions that could be created with language (even though I did strugle to understand the language as I wasnt dedicating enough time to learn it).</p> <p>I was also attracted by the thought of using Emacs for development, an editor that felt less complicated and heavyweight compared to IntelliJ used by most people for Java and Scala.</p> <p>Startup & compilation speed challenges</p> <p>IntelliJ has a very powerful indexing capability, however, for Scala it was indexing Java and Scala standard libraries which did add a few minutes when starting a projects.</p> <p>The Scala compiler in its early days did take some time to complete. As all the code was required to compile before running, then the feedback time during development was a bit of a constraint.</p> <p>Tooling optomisations and faster laptops did make things better during the first year, although still in a different time frame compared to the instant feedback with Clojure.</p>"},{"location":"practicalli-team/#conference-talks","title":"Conference talks","text":"<p>To focus my efforts to learn Clojure and share my enthusiasm, I started submitting talk proposals for conferences. An additional benefit was to go to the conferences for free.</p> <p>JAX London accepted my first Clojure talk proposal. I was very nervous giving the first talk and was still struggling to explain some of the concepts. However, the audience was very supportive in general.</p> <p>One person sat right at the front of the audience started to heckle me half way through. They wanted 'real world' examples of Clojure even though the talk was advertised as a simple introduction. Out of frustration I replied, \"this isnt the real world, its JAX London\". The audience laught out quite loudly, exept for the heckler who I think became more annoyed.</p> <p>I learned a lot about what I didnt understand about Clojure and undeterred I worked on creating better talks.</p> <p>I was hired by Atlassian as an Enginner and product ambassador (developer relations) which gave me a chance to present talks at conferences all over Europe.</p> <p>The talk I enjoyed the most was at JavaDays in Sofia, Bulgaria. I had moved away from slides and simply walked through live code examples, evaluating the code so the audience could see the REPL workflow as well as seeing the code in action.</p> <p>Working at Salesforce I was also encouraged to submit talks to conferences (as well as present with other community members at Salesforce specific events). I would submit talks and workshops on Salesforce and Clojure topics to double the chance of being accepted. Almost all conferences accepted Clojure talks over the Salesforce talks, although CodeMotion Rome did accept a Salesforce workshop as well as a Clojure talk.</p> <p>The most sureal environment I gave a Clojure talk at was CeBit, a huge conference in Hanover, Germany. The conference is so huge it is spread over 18 aircraft hanger sized buildings and there are busses to shuttle people around the conference as it takes at least 30 minutes to walk from one side of the conference to the other. I gave a talk at their \"Developer Zone\" which was a small stage in one of the huge buildings, with about 30 chairs lined up. Before I was introduced there was only a few people sitting, although by the time I had introduced myself it was standing room only (and quite a few people very slowly walking past). I recorded the presentation on a GoPro camera, which did a surprisingly good job of capturing the talk (I believe I used a separate microphone to capture the audio at a good quality).</p> <p> </p>"},{"location":"practicalli-team/#london-clojurians","title":"London Clojurians","text":"<p>Clojure dojo events and presentations</p> <p>ClojureX conference</p> <p>reClojure conferece</p> <p>Article: London Clojurians - a relatively brief history</p>"},{"location":"practicalli-team/#hack-the-tower","title":"Hack The Tower","text":"<p>Hack The Tower was a monthly practical developer event over 5 years, held in the Salesforce offices with food and drink sponsored by Salesforce (the event started in the Salesforce office of Tower 42, moving to the huge space in the Heron tower - eventually renamed to the Salesforce Tower)</p> Salesforce Tower controversy <p>There was a brief period where people were compliaining about Salesforce renaming the building after a company.</p> <p>Ironically, the original Heron tower name came from the Heron company that owned the building.</p> <p>The original office space was in Tower 42 which originally was the Nat West Tower, a bank in the UK. This building is quite unique architecture as the structure was divided vertically into 3 segments, representing the Nat West logo when looing at the buiding from above. The name was changed when the building was sold, renaming to Tower 42 as there are 42 floors in the building.</p> <p>After attending a highly enjoyable hack day at the Guardian office in London, organised by Robert Rees, I wanted to do more events like this.</p> <p>I had recently joined Salesforce (late 2012) and realised I could run a Saturday event from the Salesforce offices as they were not used at the weekend.</p> <p>I had no idea if people would turn up, so I created the event in the London Salesforce Developers, London Java Community, London Scala User Group and London Clojurians communities.</p> <p>The event premise was simple: work together to experiment with languages, libraries or even IoT (e.g. robots), learning more than you would do by working alone.</p> <p>After a few successful events, I started running a Clojure workshop as part of Hack The Tower. I would find interesting tutorials and libraries and spend the day live coding a Clojure project, with everyone else following on (and occasionally trying other ideas).</p> <p>Early workshops included setting up a Clojure development environment. Initially I encouraged the use of LightTable as the editor, as its instant feedback really helped understand if the code was correct as it was being typed.</p> <p>Once I discovered Spacemacs and added many of the Clojure specific key bindings, I created the Practicalli Spacemacs to help speed up the install setup and give people other options beyond LightTable.</p> <p>Early versions of the Practicalli books evolved from the lessons learned during these workshops.</p> <p>Hack The Tower (Hack Together London)</p> <p>Article: Hack The Tower 2013</p>"},{"location":"practicalli-team/#clojurebridge-london","title":"ClojureBridge London","text":"<p>Organised 12 ClojureBridge London events between 2014 to 2019, introducing Clojure to over 300 women and one extremely talented young girl (accompanied by her very supportive mother).</p> <p>Approximately half of the women attending were already using a programming language to some extent for work or their own projects. The rest of the attendees were learning a language for the first time.</p> <p>One of the most appreciated aspects of the event was the one-to-one ratio of students and mentors (at almost all events). The equal ratio allowed students to learn at their own pace and learn those aspects that were of most value to them.</p> <p>The event would not have been successful without the great number of volunteers that provided their own time for free. All the volunteers learned a great deal too, helping them understand areas they were less clear about and aspects of the language they could spend more time learning more deeply.</p> <p>ClojureBridge London Website</p>"},{"location":"practicalli-team/#more-workshops","title":"More workshops","text":"<p>Dev Winter and Dev Summer conferences in Cambridge</p> <p>Devoxx London</p> <p>Clojure and ClojureScript workshops</p>"},{"location":"practicalli-team/#100-days-of-code","title":"100 Days of Code","text":"<p>After working at Citi managing 6 teams building and deploying Clojure projects between 2017 and 2018, I took a break from commercial work to recharge my batteries and continue my journey into Clojure.</p> <p>I was inspired by the 100 days of code idea to spend the next 100 days working on Clojure challenges and projects. Each day I wrote a journal entry to consolidate the lessons learned that day, helping me ingrain the concepts and functions I was learning.</p> <p>As part of this learning effort I soon started a weekly live broadcast, sharing how to get set up in Clojure and solving Clojure challenges (e.g. 4EverClojure and Exercism)</p> <p>After 2 years of live broadcasts I had created over 100 hours of live coding in Clojure.</p> <p>YouTube: Learning Clojure with Practicalli</p> <p>Journal: 100 Days Of Clojure Code</p> <p>Clojurians Slack channel: 100DaysOfCode</p>"},{"location":"practicalli-team/#practicalli","title":"Practicalli","text":"<p>Initially using GitBook to self-publish books via GitHub pages, providing a few features to support code syntax highlighting, callouts and other features to help the reader consume the content effectively.</p> <p>At the end of 2022 all books were migrated to Material for MkDocs which provided a very professional look to the books and even more content presentation features (much better code syntax highlighting, collapseable admonitions, code block line highlighting and annotations)</p>"},{"location":"practicalli-team/#the-future","title":"The Future","text":"<p>John Connor, Terminator 3</p> <p>The future has not been written. There is no fate but what we make for ourselves</p> <p>The future of Practicalli is not written, although as long as I am able I will continue to evolve the content, update supporting projects and code examples.</p> <p>In 2024 there will be more content on more general aspects of Software Engineering, via the Practicalli Engineering Playbook.</p> <p>Rather than starting live broadcasts again, time will be made to create high quality screencasts. Some of these videos will replace the live broadcasts with updated content and others will include new content (clojure workflow with tools, building projects, code challenges, etc).</p> <p>Once important aspect I would like to challenge is a detailed guide to libraries available in the the Clojureverse. Whist there are some websites that list some of the libraries available, little or no context about their use and alternatives is provided.</p> <p>Suggestions as to what content and projects would be useful to the community is always welcome.</p> <p>Thank you Johnny.</p>"},{"location":"assets/images/social/","title":"Social Cards","text":"<p>Social Cards are visual previews of the website that are included when sending links via social media platforms.</p> <p>Material for MkDocs is configured to generate beautiful social cards automatically, using the colors, fonts and logos defined in <code>mkdocs.yml</code></p> <p>Generated images are stored in this directory.</p>"},{"location":"day-90---what-will-be-my-next-role/","title":"Day 90 - What will be my next role","text":"<p>Considering my options for my next role. There have been a lot of really interesting roles I have interviewed for. There is one that seems to require the widest use of my skills.</p> <ul> <li>https://github.com/practicalli/four-clojure/blob/master/src/four_clojure/011-maps-conj.clj</li> </ul>","tags":["clojure","4clojure"]},{"location":"day-90---what-will-be-my-next-role/#4clojure-challenge-11-conj-with-maps","title":"4Clojure Challenge #11 - conj with maps","text":"<p>Exploring the joining of maps and vectors into a map.</p> <p>Also explored some possible error conditions that can occur when using maps, such as incomplete pairs of keys and values.</p> <p>Design Journal: 4Clojure #11 - conj with maps</p> src/four_clojure/011-maps-conj.clj<pre><code>;; # 011 - Maps: conj\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n\n;; Difficulty: Elementary\n;; Topics:\n\n;; When operating on a map, the conj function returns a new map with one or more key-value pairs \"added\".\n\n;; (= {:a 1, :b 2, :c 3} (conj {:a 1} __ [:c 3]))\n\n\n;; Deconstruct the problem\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n\n;; Simply fill in a collection that contains the right values.\n\n;; Maps need to include values in pairs, a key and a value that the key is associated with.\n;; Maps can conj from values in a vector, so long as the vector contains key/value pairs\n\n;; So this expression works\n\n(conj {:a 1} [:b 2] [:c 3])\n;; => {:a 1, :b 2, :c 3}\n\n;; and of course using a map with a key value pair would also work\n\n(conj {:a 1} {:b 2} [:c 3])\n\n\n;; Using a vector that contains an a key without a value will cause and error.\n\n(conj {:a 1} [:b 2 :d] [:c 3])\n;; java.lang.IllegalArgumentException\n;; Vector arg to map conj must be a pair\n\n;; The same expression with a map this time does return something, which is surprising.\n;; Although evaluating it also throws a reader exception.\n;; This is because second map in the expression has a syntax error,\n;; {:b 2 :d} is not valid syntax.\n\n(conj {:a 1} {:b 2 :d} [:c 3])\n;; => [:c 3]\n;; clojure.lang.LispReader$ReaderException\n;; java.lang.RuntimeException: Unmatched delimiter: )\n\n\n;; Trying to construct a map using the hash-map function and an incorrect set of key value pairs\n;; also creates an error. However, this time its much clearer as to the error.\n(conj {:a 1} (hash-map :b 2 :d) [:c 3])\n\n(hash-map :b 2 :d)\n;; java.lang.IllegalArgumentException\n;; No value supplied for key: :d\n\n;; NOTE: The above code has been evaluated with Clojure 1.9. Version 1.10 may have improved error messages when using ill-formed maps.\n\n;; Answers summary\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n\n;; Simplest answers\n\n[:b 2]\n{:b 2}\n(hash-map :b 2)\n\n;; Overthought answers\n\n;; Least valuable answer\n</code></pre> <p>Thank you.</p> <p> Practical.li Website</p> <p> Practical.li GitHub Org practicalli-johnny profile</p> <p> @practicalli@clj.social @practical_li</p>","tags":["clojure","4clojure"]},{"location":"day-91---chasing-references-and-4clojure/","title":"Day 91 - Chasing references and 4Clojure","text":"<p>Chasing references for my next potential employers</p> <p>Quick write up about 4Clojure exercise #16 - Hello world.</p> <ul> <li>https://github.com/jr0cket/four-clojure/commit/639cf76e7901809413eb01f9c5a2f07187764ae0</li> </ul>","tags":["clojure"]},{"location":"day-91---chasing-references-and-4clojure/#4clojure-challenge-16-hello-world","title":"4Clojure challenge #16 Hello World","text":"<p>Discussing the <code>str</code> function to join values into a string.</p> <p>Also covering how to write a simple function definition with <code>fn</code> and call that function inline.</p> <p>For completeness, added the short form for a function definition using the reader macro <code>#()</code></p>","tags":["clojure"]},{"location":"day-91---chasing-references-and-4clojure/#job-hunting","title":"Job hunting","text":"<p>Very successful interviews with a company using data science to drive efficiencies in farming. The company processes a wide range of meteralogical and geological data to identify good locations for growing each kind of crop. Following up with guidance on how to manage the crop through its lifecycle, e.g. expected weather patterns, etc.</p> <p>I have asked for job references from Citi and Salesforce, although the replies are a little slow.</p> <p>Thank you.</p> <p> Practical.li Website</p> <p> Practical.li GitHub Org practicalli-johnny profile</p> <p> @practicalli@clj.social @practical_li</p>","tags":["clojure"]},{"location":"day-92---clojure-hack-day/","title":"Day 92 - Clojure Hack day","text":"<p>Clojure Hack day was quite a small event however it gave us a chance to work on our own projects. Worked with Mani on some basic Clojure skills. Als worked on building a simple ClojureScript React style website with our primary school student (accompanied by her mom)</p> <p>I also did a little more work with Scalable Vector Graphics, in the system monitor project I started a while ago.</p> <p>SkillsMatter were kind enough to invite us to join in the event, however, there was some issue with food and SkillsMatter did initially exclude the Clojure group although eventually we were included in the event again.</p> <ul> <li>https://github.com/jr0cket/webapp-status-monitor/commit/ce60f78c35ce737333c9b9b24b83caca6b49b596</li> </ul>","tags":["clojure"]},{"location":"day-92---clojure-hack-day/#service-monitor-project","title":"Service Monitor project","text":"<p>Work on the service monitor application and using SVG graphics</p> <p>Created a rough version of the CIDER logo using Clojure SVG (hiccup) sytax. Taking the HTML code for the logo, converted it to the Clojure SVG syntax.</p> <p>Thank you.</p> <p> Practical.li Website</p> <p> Practical.li GitHub Org practicalli-johnny profile</p> <p> @practicalli@clj.social @practical_li</p>","tags":["clojure"]},{"location":"day-93---clojure-study-group---clojurescript-reagent-website-with-svg/","title":"Day 93 - Clojure Study group - ClojureScript reagent website with SVG","text":"<p>Extremely tired today.</p> <p>Code from today</p> <ul> <li>https://github.com/practicalli/example-clojurescript-reagent-svg-website</li> </ul>","tags":["clojure"]},{"location":"day-93---clojure-study-group---clojurescript-reagent-website-with-svg/#simple-clojurescript-front-end-website-with-reagent","title":"Simple ClojureScript front end website with reagent","text":"<p>Walking through the basic concepts of building a front-end website using ClojureScript and reagent, a react-style library.</p> <p>Thank you.</p> <p> Practical.li Website</p> <p> Practical.li GitHub Org practicalli-johnny profile</p> <p> @practicalli@clj.social @practical_li</p>","tags":["clojure"]},{"location":"day-94---coaching-and-emacs-talk-at-linux-in-london/","title":"Day 94 - Coaching and Emacs talk at Linux in London","text":"<p>Cycled into London today on the Brompton and my Tannus tyres still going strong. I finally got a moment to clean them too.</p> <p>Another very productive coaching day in Wagamama today, covering the inside out approach to writing Clojure. I pushed 3 out of the 6 exercise we completed to Github.</p> <p>Cycled over to SkillsMatter to give (finish writing) my Emacs for your digital life talk for Linux in London community.</p>","tags":["clojure","4clojure"]},{"location":"day-94---coaching-and-emacs-talk-at-linux-in-london/#code-from-today","title":"Code from today","text":"<ul> <li>4Clojure #46</li> <li>4Clojure #47</li> <li>4Clojure #48</li> </ul>","tags":["clojure","4clojure"]},{"location":"day-94---coaching-and-emacs-talk-at-linux-in-london/#coaching-in-clojure-using-4clojurecom","title":"Coaching in Clojure using 4Clojure.com","text":"<p>Covered several Easy level challenges</p> <p>Discussed the thinking approach to solving 4Clojure challenges and problems in general. Breaking down problems into very simple parts, solving simple parts and then building them up to solve the larger problem. Much easier to spot errors and find code that does not quite work.</p> <p>Challenges in 4Clojure often ask for quite specific forms of result, e.g., return a set or a vector rather than a list.</p> <p>This can be a little distracting as many times its simply the values inside the form that are important and where the test is actually taking place.</p> <p>In extremely simplistic terms you can still think of all collections as a sequence, although everything but a list has extra symantics and features you can use.</p> <p>Challenges #46 to #51 were worked on during today's coaching session.</p>","tags":["clojure","4clojure"]},{"location":"day-94---coaching-and-emacs-talk-at-linux-in-london/#emacs-for-your-digital-life","title":"Emacs for your digital life","text":"<p>Presentation for the Linux in London meetup group. Lots of festive cheer, swag and I even won a reusable tea cup!</p> <p>The aim of the talk was to show off the advantages of Emacs, so I created my presentation using org-mode.</p> <p> </p> <p>Thank you.</p> <p> Practical.li Website</p> <p> Practical.li GitHub Org practicalli-johnny profile</p> <p> @practicalli@clj.social @practical_li</p>","tags":["clojure","4clojure"]},{"location":"day-95---ai-startup-team-lunch---4clojure-exercises/","title":"Day 95 - AI startup team lunch - 4Clojure exercises","text":"<p>Team lunch with the team I will be working with in the new year.</p> <p>The venue was a very basic restaurant but with nice food. There are some interesting dynamics in the team, so will need to figure out how to work with them.</p>","tags":["clojure","4clojure"]},{"location":"day-95---ai-startup-team-lunch---4clojure-exercises/#code-from-today","title":"Code from today","text":"<ul> <li>4Clojure #49 Split a sequence</li> </ul>","tags":["clojure","4clojure"]},{"location":"day-95---ai-startup-team-lunch---4clojure-exercises/#ai-startup-team-lunch","title":"AI Startup Team Lunch","text":"<p>Some awkwardness from the team as most people were meeting for the first time. I asked lots of questions and tried to make connections although it seems there was some tension in the group.</p>","tags":["clojure","4clojure"]},{"location":"day-95---ai-startup-team-lunch---4clojure-exercises/#4clojure-exercises","title":"4Clojure exercises","text":"<p>Carried on adding to the 4Clojure repository of solution write-ups. Discussing challenge #49 Split a sequence.</p> <p>There was a fairly easy solution using take and drop. However, with a little digging into the <code>clojure.core</code> the <code>juxt</code> function was a great way to show some abstraction over the drop and take.</p> <p>Thank you.</p> <p> Practical.li Website</p> <p> Practical.li GitHub Org practicalli-johnny profile</p> <p> @practicalli@clj.social @practical_li</p>","tags":["clojure","4clojure"]},{"location":"day-96---user-feedback-session--4clojure-exercises/","title":"Day 96 - User Feedback session & 4Clojure exercises","text":"<p>User feedback session for an interesting AI product client that I will be involved with in the new year.</p> <p>Sometimes listening is a challenge.</p>","tags":["clojure","4clojure"]},{"location":"day-96---user-feedback-session--4clojure-exercises/#ai-product-review","title":"AI product review","text":"<p>It was useful to hear from one of the users of the AI product by the company that I will work with next.</p> <p>However a lot of distraction came from the team, especially in random directions of discussions and unclear discussions about how the tool should be used.</p> <p>This seemed a little about face, as we should be focusing more on how the user is working and fitting the tool around them. The more training we need to give to the users, the greater barrier there would be to adoption.</p>","tags":["clojure","4clojure"]},{"location":"day-96---user-feedback-session--4clojure-exercises/#code-from-today","title":"Code from today","text":"<ul> <li>4Clojure exercises #50</li> </ul> <p>4Clojure 50: Split by type</p> <pre><code>;; Answers summary\n\ufffc\n\ufffc(fn [data]\n\ufffc (vals (group-by type data)))\n\ufffc\n\ufffc\n;; low golf score answer\n\ufffc\n\ufffc#(vals (group-by type %))\n</code></pre>","tags":["clojure","4clojure"]},{"location":"day-96---user-feedback-session--4clojure-exercises/#4clojure-exercises","title":"4Clojure exercises","text":"<p>I documented the solution to 4Clojure echallenge #50 whilst travelling on the train home from the meeting with the AI product client.</p> <p>Thank you.</p> <p> Practical.li Website</p> <p> Practical.li GitHub Org practicalli-johnny profile</p> <p> @practicalli@clj.social @practical_li</p>","tags":["clojure","4clojure"]},{"location":"day-97-planning-2019-and-4clojure/","title":"Day 97 Planning 2019 and 4Clojure","text":"<p>Planning activities for 2019, including ClojureBridge London events.</p> <ul> <li>4Clojure exercise #51</li> </ul>","tags":["clojure","4clojure"]},{"location":"day-97-planning-2019-and-4clojure/#4clojure-exercise-51-advanced-destructuring","title":"4Clojure exercise #51 - advanced destructuring","text":"<p>Another chance to read up about destructuring.</p> <p>Destructuring in Clojure - Clojure.org</p> <p>Destructuring is a great way to reduce the amount of code you need to write by using pattern matching.</p> <p>We use destructuring to define local names from data structures, both in <code>let</code> functions and function definitions.</p> <p>The challenge itself was fairly straight-forward, demonstrating a nested destructuring example.</p> <p>Thank you.</p> <p> Practical.li Website</p> <p> Practical.li GitHub Org practicalli-johnny profile</p> <p> @practicalli@clj.social @practical_li</p>","tags":["clojure","4clojure"]},{"location":"day-98-coaching-and-4clojure-53/","title":"Day 98: Coaching and 4Clojure 53","text":"<p>Continued coaching one of my regular students</p> <p>Took Poppy (one of my cats) to the vets for a checkup. Apart from a some plaque build Poppy is fine. More toothpaste and teeth cleaning for Poppy.</p> <p>Cycled into Wagamama Southbank for another coaching session, getting my teeth stuck into 4Clojure challenge #53, a tricky one eventually solved with <code>partition</code> and <code>partition-by</code>.</p> <p>4Clojure solution</p> <p>4Clojure #53 solution</p>","tags":["clojure","4clojure"]},{"location":"day-98-coaching-and-4clojure-53/#4clojure-53","title":"4Clojure #53","text":"<p>Ouch, exercise 53 was quite a tricky problem and very easy to get caught up in imperative thinking.</p> <p>Trying to do this using loop/recur and reduce approach became very complex and we didnt get that working in the end.</p> <p>I started a more functional approach along the right lines with partitioning up the data set so each combination of pairs could be compared to see if the second value was higher than the first.</p> <p>After some experiementing I realised <code>partition-by</code> could use a function that grouped the pairs until the pairs stopped increasing.</p> <p>This approach to partitioning put the data in to a shape that made it easier to process.</p> <p>Redundant data was removed and then the remaining partiions sorted by size, using <code>count</code> to find the largest continuous sequence.</p> <p>Then the resulting partitions needed to be flattened to get the right shape of data as a result.</p> <p>4Clojure Challenge 53 - Partition and Filter</p> <pre><code>;; Partition and Filter approach (medium abstraction)\n\ufffc\n\ufffc(fn [coll]\n\ufffc (let [a (partition-by #(apply < %) (partition 2 1 coll))\n\ufffc b (filter (fn [[[x1 x2]]] (< x1 x2)) a)\n\ufffc c (first (sort-by count > b))]\n\ufffc (concat (first c) (map last (rest c)))))\n</code></pre> <p>Design Journal - 4Clojure #53</p> <pre><code>(ns four-clojure.053-longest-increasing-sub-seq)\n\n;; #053 Longest increasing sub-sequence\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n\n;; Difficulty: Hard\n;; Topics: seqs\n\n;; Given a vector of integers, find the longest consecutive sub-sequence of increasing numbers. If two sub-sequences have the same length, use the one that occurs first. An increasing sub-sequence must have a length of 2 or greater to qualify.\n\n;; (= (__ [1 0 1 2 3 0 4 5]) [0 1 2 3])\n;; (= (__ [5 6 1 3 2 7]) [5 6])\n;; (= (__ [2 3 3 4 5]) [3 4 5])\n;; (= (__ [7 6 5 4]) [])\n\n\n;; Deconstruct the problem\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n\n;; This challenge took quite a bit of thinking about as its quite an\n;; imperative problem, which can easily lead to an imperative solution.\n\n;; Initial reading of the challenge suggests we iterate through the\n;; given collection values, keeping a record of each sub sequence as we go.\n\n;; This suggests we need to keep state not just for each sub-sequence\n;; but also keeping the value of the previous element as we find consecutive sub-sequences.\n\n;; By transforming the data to more relevantly shaped structures\n;; hopefully we can used simpler functions to create the desired results.\n\n\n;; Basic algorithm:\n;; Find the consecutive sub-sequences in a given collection\n\n;; e.g. [1 0 1 2 3 0 4 5] would contain [(1) (0 1 2 3) (0) (4 5)]\n\n;; Then find the longest sub-sequence\n\n\n;; REPL experiments\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n\n;; Taking a low abstraction approach with loop and recur\n\n;; Our function takes the collection to be processed as an argument.\n\n((fn longest-sub [collection]\n (loop\n ;; `temporary-sub` is the current sub-sequence being processed\n ;; `sub-collection` will contain the sub-sequences found\n ;; `remaining-collection` is used to iterate through the collection\n [temporary-sub []\n sub-collection []\n remaining-collection collection]\n\n (if (empty? remaining-collection)\n\n ;; If no more numbers in the collection, return the current sub-collection\n sub-collection\n\n ;; else if there are still numbers in the collection\n (recur\n ;; temporary-sub for building a sequence of consecutive numbers\n (cond\n (= temporary-sub []) [(first remaining-collection)]\n (= (inc (last temporary-sub)) (first remaining-collection)) (conj temporary-sub (first remaining-collection))\n (not= (inc (last temporary-sub)) (first remaining-collection)) [(first remaining-collection)])\n\n ;; sub-collection holds the largest sequence found so far\n (if (> (count temporary-sub) (count sub-collection))\n temporary-sub\n sub-collection)\n\n ;; remaining collection\n (rest remaining-collection)))))\n [1 0 1 2 3 0 4 5])\n\n;; passes the first two tests, but fails the third test. Returns [2 3] for the third test, instead of [3 4 5] because we drop out of the loop without checking if the temporary-sub is larger than the sub-collection.\n\n\n;; works for all tests except the last one...\n((fn longest-sub [collection]\n (loop\n ;; `temporary-sub` is the current sub-sequence being processed\n ;; `sub-collection` will contain the sub-sequences found\n ;; `remaining-collection` is used to iterate through the collection\n [temporary-sub []\n sub-collection []\n remaining-collection collection]\n\n ;; If no more numbers in the collection, return the current sub-collection\n (if (empty? remaining-collection)\n\n ;; As the temporary-sub value doesnt get compared until the recur call,\n ;; we need to evaluate which is bigger when processing the last value from the original collection.\n (if (> (count temporary-sub) (count sub-collection))\n temporary-sub\n sub-collection)\n\n ;; else if there are still numbers in the collection\n (recur\n ;; temporary-sub for building a sequence of consecutive numbers\n (cond\n (= temporary-sub []) [(first remaining-collection)]\n (= (inc (last temporary-sub)) (first remaining-collection)) (conj temporary-sub (first remaining-collection))\n (not= (inc (last temporary-sub)) (first remaining-collection)) [(first remaining-collection)])\n\n ;; sub-collection holds the largest sequence found so far\n (if (> (count temporary-sub) (count sub-collection))\n temporary-sub\n sub-collection)\n\n ;; remaining collection\n (rest remaining-collection)))))\n [2 3 3 4 5])\n\n\n((fn longest-sub [collection]\n (loop\n ;; `temporary-sub` is the current sub-sequence being processed\n ;; `sub-collection` will contain the sub-sequences found\n ;; `remaining-collection` is used to iterate through the collection\n [temporary-sub []\n sub-collection []\n remaining-collection collection]\n\n ;; If no more numbers in the collection, return the current sub-collection\n (if (empty? remaining-collection)\n\n ;; As the temporary-sub value doesnt get compared until the recur call,\n ;; we need to evaluate which is bigger when processing the last value from the original collection.\n ;; If all the sub-sequences are the same lenght, then we need to return an empty collection (as in the final test)\n (cond\n (> (count temporary-sub) (count sub-collection)) temporary-sub\n (> (count sub-collection) (count temporary-sub)) sub-collection\n (= 1 (count temporary-sub) (count sub-collection)) [])\n\n ;; else if there are still numbers in the collection\n (recur\n ;; temporary-sub for building a sequence of consecutive numbers\n (cond\n (= temporary-sub []) [(first remaining-collection)]\n (= (inc (last temporary-sub)) (first remaining-collection)) (conj temporary-sub (first remaining-collection))\n (not= (inc (last temporary-sub)) (first remaining-collection)) [(first remaining-collection)])\n\n ;; sub-collection holds the largest sequence found so far\n (if (> (count temporary-sub) (count sub-collection))\n temporary-sub\n sub-collection)\n\n ;; remaining collection\n (rest remaining-collection)))))\n [7 6 5 4])\n\n\n;; Whew... that was quite a lot of work and a lot of code for someone to maintain.\n\n;; Hopefully we can find some abstractions that will make this code much simpler to work with\n\n;; thinking through the algorithm again, a more functional approach would be something like:\n\n(let [sequence [1 0 1 2 3 0 4 5]]\n ;; divide into a growing sequence of numbers [[1] [1 0] [1 0 1 2]]\n ;; sort-by count\n ;; reverse\n ;; first\n )\n\n\n\n\n;; Solving #53 with partitioning and filters\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n;; Can we group the numbers together so they are grouped sequentially?\n\n;; Lets partition the first collection\n;; Partition into pairs, one step at a time,\n;; so each pair of numbers can be compared\n\n(partition 2 [1 0 1 2 3 0 4 5])\n;; => ((1 0) (1 2) (3 0) (4 5))\n\n(partition 2 1 [1 0 1 2 3 0 4 5])\n;; => ((1 0) (0 1) (1 2) (2 3) (3 0) (0 4) (4 5))\n\n;; We have a simple partition of the collection\n;; Now we can partition again using a function\n;; that compares values, so that we can again group by an increasing sequence\n\n;; We want to see which pair has the second number higher than the first\n;; so greater-than function is a simple test.\n;; We need to apply the greater-than function to each pair in the partitioned collection\n;; As each pair is in a collection then we need to map over each vector of tha tcollection\n\n(map #(apply < %) [[1 0] [0 1] [1 2]])\n;; => (false true true)\n\n;; So this gives us a promising looking function to partition with\n\n(partition-by #(apply < %)\n (partition 2 1 [1 0 1 2 3 0 4 5]))\n;; (((1 0))\n;; ((0 1) (1 2) (2 3)) ((3 0))\n;; ((0 4) (4 5)))\n\n;; we now have a collection that is partitioned where ever\n;; the second number of a piair was not greater than the first.\n\n;; We still have one pair that does not increase,\n;; so we can filter that out using another function\n\n(filter odd? [1 2 3 4 5])\n;; => (1 3 5)\n\n\n(filter\n (fn [[[number1 number2]]]\n (< number1 number2))\n (partition-by #(apply < %)\n (partition 2 1 [1 0 1 2 3 0 4 5])))\n;; => (((0 1) (1 2) (2 3))\n;; ((0 4) (4 5)))\n\n;; Now we only have two collections of pairs,\n;; each of which increases\n\n;; So we can just sort these collections by count,\n;; so the biggest collection is first\n;; then get the first one.\n\n(sort-by count >\n (filter\n (fn [[[number1 number2]]]\n (< number1 number2))\n (partition-by #(apply < %)\n (partition 2 1 [1 0 1 2 3 0 4 5]))))\n;; => (((0 1) (1 2) (2 3)) ((0 4) (4 5)))\n\n;; No change in the order of elements returned in this example,\n;; but it ensures we have the correct order.\n;; So lets get the first element\n\n(first\n (sort-by count >\n (filter\n (fn [[[number1 number2]]]\n (< number1 number2))\n (partition-by #(apply < %)\n (partition 2 1 [1 0 1 2 3 0 4 5])))))\n;; => ((0 1) (1 2) (2 3))\n\n\n;; So now we just need to combine our remaining collection to get the right shape.\n\n;; We cant just flatten, as we have extra values\n(flatten [[0 1] [1 2] [2 3]])\n;; => (0 1 1 2 2 3)\n\n\n;; If we take the first collection that contains a pair\n;; and add the last value from each of the following pairs\n;; then we will get the right result\n\n(concat\n (first [[0 1] [1 2] [2 3]])\n (map last (rest [[0 1] [1 2] [2 3]])))\n;; => (0 1 2 3)\n\n\n;; It would lead to a lot of repeated code to fit this around the function so far\n;; so using the let function will help\n\n\n((fn [coll]\n (let [partitioned (partition-by #(apply < %) (partition 2 1 coll))\n filtered (filter (fn [[[x1 x2]]] (< x1 x2)) partitioned)\n sorted (first (sort-by count > filtered))]\n (concat (first sorted) (map last (rest sorted)))))\n [1 0 1 2 3 0 4 5])\n;; => (0 1 2 3)\n\n\n\n;; Answers summary\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n\n;; Partition and Filter approach (medium abstraction)\n\n(fn [coll]\n (let [a (partition-by #(apply < %) (partition 2 1 coll))\n b (filter (fn [[[x1 x2]]] (< x1 x2)) a)\n c (first (sort-by count > b))]\n (concat (first c) (map last (rest c)))))\n\n\n\n;; loop recur approach (low level of abstraction)\n\n(fn longest-sub [collection]\n (loop\n ;; `temporary-sub` is the current sub-sequence being processed\n ;; `sub-collection` will contain the sub-sequences found\n ;; `remaining-collection` is used to iterate through the collection\n [temporary-sub []\n sub-collection []\n remaining-collection collection]\n\n ;; If no more numbers in the collection, return the current sub-collection\n (if (empty? remaining-collection)\n\n ;; As the temporary-sub value doesnt get compared until the recur call,\n ;; we need to evaluate which is bigger when processing the last value from the original collection.\n ;; If all the sub-sequences are the same lenght, then we need to return an empty collection (as in the final test)\n (cond\n (> (count temporary-sub) (count sub-collection)) temporary-sub\n (> (count sub-collection) (count temporary-sub)) sub-collection\n (= 1 (count temporary-sub) (count sub-collection)) [])\n\n ;; else if there are still numbers in the collection\n (recur\n ;; temporary-sub for building a sequence of consecutive numbers\n (cond\n (= temporary-sub []) [(first remaining-collection)]\n (= (inc (last temporary-sub)) (first remaining-collection)) (conj temporary-sub (first remaining-collection))\n (not= (inc (last temporary-sub)) (first remaining-collection)) [(first remaining-collection)])\n\n ;; sub-collection holds the largest sequence found so far\n (if (> (count temporary-sub) (count sub-collection))\n temporary-sub\n sub-collection)\n\n ;; remaining collection\n (rest remaining-collection)))))\n\n\n\n;; Interesting 4Clojure answers\n\n(fn [s]\n (->>\n (for [a (range (count s))\n b (range (inc a) (count s))]\n (subvec s a (inc b)))\n (filter #(apply < %))\n (sort-by count >)\n first\n vec))\n</code></pre> <p>Thank you.</p> <p> Practical.li Website</p> <p> Practical.li GitHub Org practicalli-johnny profile</p> <p> @practicalli@clj.social @practical_li</p>","tags":["clojure","4clojure"]},{"location":"day-100-4clojure/","title":"Day 100: 4Clojure","text":"<p>Walked through 4Clojure challenges number 16 to 22 in the Clojure virtual study group broadcast today.</p>","tags":["clojure","4clojure"]},{"location":"day-100-4clojure/#4clojure-code","title":"4Clojure Code","text":"<ul> <li>4Clojure #12</li> <li>4Clojure #13</li> <li>4Clojure #14</li> <li>4Clojure #15</li> </ul>","tags":["clojure","4clojure"]},{"location":"day-100-4clojure/#4clojure-writeup","title":"4Clojure writeup","text":"<p>Wrote up previous 4Clojure solutions #12 to #15</p> <p>Lots of fun with sequences and sequence related functions. Also included two exercises on defining your own functions.</p> <p>Thank you.</p> <p> Practical.li Website</p> <p> Practical.li GitHub Org practicalli-johnny profile</p> <p> @practicalli@clj.social @practical_li</p>","tags":["clojure","4clojure"]},{"location":"day-100-4clojure/","title":"Day 100: 4Clojure","text":"<p>100 days of code challenge completed. Was it worth it? Well yes, it got me coding almost every day, and overall I certainly achieved more than 100 hours of coding, more like several 100 hours of coding.</p> <p>I didnt do was work on a specific project every day, but that would have felt more like work and I enjoyed having a break from that routine.</p> <p>Will I do a 100 days of code challenge again? Not sure, its quite a hard thing to be consistent with. I will certainly keep a developer journal from now on as it has been very useful.</p> <p>4Clojure solution</p> <p>Write up of the 4Clojure exercises I covered in yesterdays Clojure study group broadcast.</p> <p>Popped out for a few essentials in the last day I am prepared to go shopping before the holidays :)</p> <ul> <li>4Clojure #17</li> <li>4Clojure #18</li> <li>4Clojure #19</li> <li>4Clojure #20</li> <li>4Clojure #21</li> <li>4Clojure #22</li> </ul>","tags":["clojure","4clojure"]},{"location":"day-100-4clojure/#4clojure-solutions-write-up","title":"4Clojure solutions write up","text":"<p>Continuing to write up a description on how I solved each 4Clojure exercise, explaining how I thought about the problem and different approaches possible.</p> <p>Today was a write up and elaboration on the exercises I covered in yesterdays Clojure study group broadcast.</p> <p>Thank you.</p> <p> Practical.li Website</p> <p> Practical.li GitHub Org practicalli-johnny profile</p> <p> @practicalli@clj.social @practical_li</p>","tags":["clojure","4clojure"]},{"location":"day-101-an-extra-day-of-code/","title":"Day 101: An extra day of code","text":"<p>Added more 4Clojure solutions</p> <p><code>def</code> supports a doc-string (I missed that ability previously).</p> <p>Emacs Window management when running tests in Cider with Spacemacs.</p> <p>The Logitech MX Ergo trackball mouse arrived today and it is so nice to use. Its a trackball so the mouse itself stays static on the desk avoiding the need to move my hand around and therefore reducing RSI. Using a trackball also means very little space is use. The trackball is tilted so the hand is in a natural and more comfortable position, the same position I configured with my tented Model01 keyboard.</p>","tags":["clojure","games"]},{"location":"day-101-an-extra-day-of-code/#clojure-core","title":"Clojure core","text":"<p>I finally noticed <code>def</code> supports a doc-string as with <code>defn</code>.</p> <p><code>ns</code> also supports a doc-string to define the overall purpose of the namespace</p> <p>Adding a string after the name in the <code>def</code> expression will be used as the docstring, assuming there is another value after the string (otherwise the name is bound to the string).</p>","tags":["clojure","games"]},{"location":"day-101-an-extra-day-of-code/#cider-tests-in-spacemacs","title":"Cider tests in Spacemacs","text":"<p><code>, t a</code> key binding in Spacemacs was used to run all tests for a Clojure project.</p> <p>The test report buffer is shown, replacing an existing buffer if the test buffer is not already showing. This is normal behaviour as I understand it. The test buffer should be the active window (has the cursor) so pressing q will quit the test report and show you the buffer that was in the window previously. If test report buffer is kept open in a window, then any new test report should always appear there.</p> <p>The Spacemacs Window Purpose layer could be used to modify the behaviour of the test report buffer placement and window positions for other kinds of buffer (not something I have tried yet)</p> <p>Thank you.</p> <p> Practical.li Website</p> <p> Practical.li GitHub Org practicalli-johnny profile</p> <p> @practicalli@clj.social @practical_li</p>","tags":["clojure","games"]},{"location":"day-106-tictactoe-for-virtual-study-group/","title":"Day 106: TicTacToe for Virtual Study Group","text":"<p>Walking through a video taking a functional approach to the Tic-Tac-Toe game for the Clojure study group.</p>","tags":["clojure","games"]},{"location":"day-106-tictactoe-for-virtual-study-group/#code-from-today","title":"Code from today","text":"<ul> <li>Uppercase player names</li> <li>Display board with a grid</li> <li>Refactor play-game to pure function</li> </ul>","tags":["clojure","games"]},{"location":"day-106-tictactoe-for-virtual-study-group/#functional-tic-tac-toe","title":"Functional Tic-Tac-Toe","text":"<p>Make changes to the design of the board and players to make the code easier to read than the original code in the video by Brian Wills.</p> <p>Refactor the <code>play-game</code> function to take <code>starting-board</code> and <code>player-sequence</code> as arguments rather than pulling in shared values (def). Passing arguments also means that <code>play-game</code> can be called with different board states, useful for testing especially if a computer opponent was added as an option to the game play.</p> <p>Refactor: play-game function</p> src/tictactoe_cli/core.clj<pre><code>(defn play-game\n \"The game loop.\n We iterate through the player sequence (alternate player turns)\n until there is a winner or the board is full.\"\n [starting-board player-sequence]\n (loop [board starting-board\n player-sequence player-sequence]\n (let [winner (winner? board)]\n (println \"Current board:\")\n (display-board board)\n (cond\n winner (println \"Player \" (player-name winner) \" wins!\")\n (full-board? board) (println \"The game is a draw.\")\n :else\n (recur\n (take-turn (first player-sequence) board)\n (rest player-sequence))))))\n\n(comment\n (play-game starting-board player-sequence))\n</code></pre> <p>It could be interesting to make an AI for both players and watch the output as a game progresses. A dynamic web page view of the game simulation could producing a simulation like that seen at the end of the War Games movie.</p> <p> </p> <p>Thank you.</p> <p> Practical.li Website</p> <p> Practical.li GitHub Org practicalli-johnny profile</p> <p> @practicalli@clj.social @practical_li</p>","tags":["clojure","games"]},{"location":"monthly-library-updates/","title":"Monthly library updates","text":"<p>The last monthly review of library dependency versions in Clojure CLI Config aliases for 2023</p>"},{"location":"monthly-library-updates/#practicalli-clojure-cli-config","title":"Practicalli Clojure CLI Config","text":"<p>Many GitHub repositories maintained by Practicalli include a Scheduled Version Check CI workflow, which reports newer versions of project library dependencies and GitHub actions. The CI workflow uses antq to check versions.</p> <p>Antq is used locally via the <code>:search/outdated</code> alias name in Clojure CLI Config to update the libraries which are configured as dependencies in each alias.</p> <p><code>oudated</code> is a task defined in the project <code>Makefile</code> that runs Clojure with the <code>:search/outdated</code> and writes the results to a file with the current date/time stamp.</p> <p>Run outdated task for a report new versions of on library dependencies</p> <pre><code>make outdated\n</code></pre> Makefile outdated task configuration <pre><code># Define file name for report with date/time stamp\nOUTDATED_FILE := outdated-$(shell date +%y-%m-%d-%T).org\n\noutdated: ## Check deps.edn & GitHub actions for new versions\n$(info --------- Search for outdated libraries ---------)\n- clojure -T:search/outdated > $(OUTDATED_FILE)\n</code></pre> <p>Make - Practicalli Engineering Playbook</p>"},{"location":"monthly-library-updates/#on-boarding","title":"On-boarding","text":"<p>A few magic codes and some help and I'm all signed up to Google Workspaces for the new role, so I have no excuse to avoid working on Monday :)</p> <p>I am actually quite excited about the new role, especially now I have the Keyboard.io keyboard wired up to the Mac laptop so I can type at speed again.</p>"},{"location":"monthly-library-updates/#debian-linux","title":"Debian Linux","text":"<p>Continuing with setup of Debian Linux on Lenovo Thinkpad with AMD chipset. Using trixie enabled the touchpad, so all the hardware is working except for the WiFi adaptor.</p> <p>Configured Zsh as the default shell with Power10k as the terminal prompt theme. Specific configuration is published in the practicalli/dotfiles repository</p>"},{"location":"monthly-library-updates/#blog-idea","title":"Blog idea","text":"<p>A summary of the tooling projects created and regularly maintained by Practicalli</p> <ul> <li>Clojure CLI Config aliases to extend the functionality with community tools (deps-new, antq, kaocha, etc from more than 30 other aliases)</li> <li>Project Templates to generate new production grade Clojure projects that support the Practicalli REPL workflow</li> <li>AstroNvim user config for Neovim</li> <li>Spacemacs user config for Emacs</li> </ul> Commonly used tools provides via Clojure CLI Config aliases <ul> <li><code>:project/create</code> - production grade templates for new projects, supporting the Practicalli Clojure REPL Reloaded workflow</li> <li><code>:repl/reloaded</code> - start a REPL process with nREPL server for Clojure editor connection, with REPL Reloaded tools (or <code>:dev/reloaded</code> for editor jack-in)</li> <li><code>:search/outdated</code> - report newer versions for library dependencies and GitHub actions</li> <li><code>:search/libraries</code> - find a fully qualified library name and current version (<code>clojure -X:deps find-versions</code> shows last 8 versions)</li> <li><code>:deploy/clojars</code> deploys libraries to Clojars.org using required signed approach</li> <li><code>:test/run</code> and <code>:test/watch</code> to run Kaocha test runner once or in watch mode</li> <li><code>:test/coverage</code> for a Cloverage report on unit test coverage in the project</li> <li><code>:repl/socket</code> and <code>:repl/socket-client</code> to run a socket REPL server and tubular socket REPL client</li> <li><code>:service/http</code> runs a nasus http server for local static files</li> <li><code>:performance/benchmark</code> to add Criterium library for running speed tests on expressions</li> <li><code>:performance/memory-meter</code> to measure memory usage by the Clojure project</li> </ul>"},{"location":"monthly-library-updates/#social-visits","title":"Social visits","text":"<p>Catch up with the neighbour who looks after my cats when away and I look after theirs. Making plans for cat sitting over the holidays.</p> <p>Thank you.</p> <p> Practical.li Website</p> <p> Practical.li GitHub Org practicalli-johnny profile</p> <p> @practicalli@clj.social @practical_li</p>"},{"location":"running-walking-coughing/","title":"Running walking coughing","text":"<p>Run Johnny Run... then have a sleepy day.</p>"},{"location":"running-walking-coughing/#health","title":"Health","text":"<p>Ran the first Park Run 5km event in about 3 years. I managed a time of 35 minutes and 26 seconds (although I did drop my water bottle right at the start).</p> <p>I ran part of the way. It was a mixture of run, jog, walk, jog, walk, stop to have a big cough, jog and final run to the end.</p> <p>Listened to 'Guns n Roses' first album to help with the motivation and managed to push hard at the end during 'Sweet Child O Mine'.</p> <p>Cycle club ride was cancelled today due to sub-zero temperatures overnight, increasing the risk of ice on the roads, especially the side roads often used on the various routes.</p> <p>I'll plan to do Park Run each time the cycling club ride is cancelled, as running should build up more stamina to help with hill climbs when cycling (my weakest part of cycling).</p>"},{"location":"running-walking-coughing/#debian-linux","title":"Debian Linux","text":"<p>Set up Zsh on the Lenovo AMD laptop using the prezto community configuration.</p> <p>The prezto configuration includes an option for fish shell style completion, showing the last matching command in full as a command is typed. This completion is a nice complement to the command line history.</p> <p>A nice dark powerline10k terminal prompt theme was defined and added to the practicalli/dotfiles repository.</p> <p>Thank you.</p> <p> Practical.li Website</p> <p> Practical.li GitHub Org practicalli-johnny profile</p> <p> @practicalli@clj.social @practical_li</p>"},{"location":"how-much-root-cause-analysis-to-do/","title":"How much root cause analysis to do?","text":"<p>Winter starts on Friday 22nd December, although its already much colder this year.</p> <p>Early to bed tonight as I start commercial work on Monday morning.</p>"},{"location":"how-much-root-cause-analysis-to-do/#mkdocs","title":"MkDocs","text":"<p>I havent been running the MkDocs server locally for the journal as the content is pretty straight forward. However, I was reminded this morning that its useful to catch little issues like a missing title for the post.</p> <p>If there are important things missing from the frontmatter of the post then MkDocs will fail to build.</p> <p>MkDocs error - title missing in post</p> <p>The <code>post_slugify</code> function in MkDocs takes a <code>post.title</code> and will generate an error if the title is empty. <pre><code>in _slugify_post\n return self.config.post_slugify(post.title, separator)\n File \"/usr/lib/python3/dist-packages/markdown/extensions/toc.py\", line 30, in slugify\n value = unicodedata.normalize('NFKD', value)\nTypeError: normalize() argument 2 must be str, not None\n</code></pre></p>"},{"location":"how-much-root-cause-analysis-to-do/#make-and-kitty-tweaks","title":"Make and Kitty tweaks","text":"<p>I have a Makefile task called <code>docs</code> that will run the MkDocs server locally and serve up the built web site. This runs very quickly, so there is little excuse not to run it.</p> <p>For convienience of opening the MkDocs site in the browser the MkDocs server runs on the same port for all of the practicalli books and journal website, (localhost:7777).</p> <p>It is important to ensuring only one instance of the MkDocs servier is running.</p> <p>Kitty terminal app has been configured to open a new terminal window in the same file path as the current tab. This provides a quick way to start the MkDocs server for a particular project, opening up a new tab alongside and running <code>make docs</code> (after ensuring other MkDocs severs have been stopped)</p> <p>Kitty - Open new tab in current file path</p> <p><pre><code># ---------------------------------------------------------\n# Key bindings\n\n# Open new tab in current window\nmap ctrl+shift+t launch --cwd=current --type=tab\n\n# ---------------------------------------------------------\n</code></pre> Practicalli Dotfiles - Kitty configuration</p>"},{"location":"how-much-root-cause-analysis-to-do/#neovim","title":"Neovim","text":"<p>Lazy package manager continues to impress in terms of user experience.</p> <p><code>SPC p a</code> in AstroNvim was used to update plugins with Lazy and format tools with Mason.</p> <p>There was an issue with LuaSnip update as Git detected local changes that were different to the commit history of LuaSnip it was cloning. Lazy package manager displayed a message on how to resolve it, by using <code>x</code> to remove the LuaSnip plugin and <code>I</code> to reinstall.</p> <p>This kind of Git issue rarely occurs, so having an inline help message if very helpful.</p> <p>Its assumed the root cause is some change to the LuaSnip commit history after the plugin was previously installed locally. Or something locally was added by Neovim. As the fix is very simple and fast to implement, there isnt much value in digging deeper unless this kind of issue occurs much more often.</p> <p>Thank you.</p> <p> Practical.li Website</p> <p> Practical.li GitHub Org practicalli-johnny profile</p> <p> @practicalli@clj.social @practical_li</p>"},{"location":"first-day-at-the-new-company/","title":"First day at the new company","text":"<p>How does it feel to be employed... wonderful.</p>"},{"location":"first-day-at-the-new-company/#on-boarding","title":"On-boarding","text":"<p>Meetings to introduce myself to the people I will be working with the most. Nice to see a few familiar faces from the London Clojure community.</p> <p>I had a very short start date so was given a temporary laptop to work on, although at the end of the day Apple delivered a new laptop to use. Luckily, most of the things setup on the original laptop carry over to the new one quite easily.</p> <p>The new laptop was enrolled to the company adminstration and the most recent Apple MacOXS update applied. These take the most time, so good to get them out of the way in the background.</p> <p>Using Notion.so which has a Daily Journal template to keep a work specific history of my thoughts and actions.</p> <p>I am sure there was an Emacs mode for Notion :)</p> <p>Thank you.</p> <p> Practical.li Website</p> <p> Practical.li GitHub Org practicalli-johnny profile</p> <p> @practicalli@clj.social @practical_li</p>"},{"location":"on-boarding-at-the-new-job/","title":"On-boarding at the new job","text":"<p>Balancing enthusiasm to be productive with learning enough first so as not to be dangerous</p>"},{"location":"on-boarding-at-the-new-job/#on-boarding-at-work","title":"On-boarding at work","text":"<p>Meeting more people and starting to understand more specifics about products and the way the company works.</p> <p>Re-discovering how to use a MacOSX laptop after decades of using Linux. I used a Mac at a company last year and occasionally during 2012-1017 whilst at Salesforce.</p> <p>The most noticable difference between Linux and MacOSX isthe <code>Command</code>+c/v/x for copy paste cut and using <code>Command</code> key for most things I would used <code>Ctrl</code>, but not everything. Swapping the keys would therefore not be effective. I am starting to get used to <code>Command</code> quicker this time around.</p> <p>The other big difference is the MacOSX window manager. It seems very mouse driven and all the Apple docs are very mouse focused. Coming from a Linux tiling window manager (i3) the MacOSX desktop seems very complex. The split window feature seemed promising, but it seems limited to two windows (one split). I am trying the stage manager feature which does remind me of one of the early compositors from Linux from a decade ago. Stage manager looks the least painful way to interact with multiple windows, but still seems mouse control heavy.</p> <p>Hopefully there are key bindings to control more of the MacOSX desktop and I can be more productive.</p> <p>People have suggested Rectangle as a way to have a more keyboard controlled experience with the MacOSX desktop.</p> <p>Thank you.</p> <p> Practical.li Website</p> <p> Practical.li GitHub Org practicalli-johnny profile</p> <p> @practicalli@clj.social @practical_li</p>"},{"location":"visiting-the-new-office/","title":"Visiting the new office","text":"<p>Party on dudes...</p>"},{"location":"visiting-the-new-office/#visiting-the-office","title":"Visiting the office","text":"<p>First trip into the company office. The first visit to any company office in over a year.</p> <p>Luckily I found some semi-respectable clothes to wear and was pleasently surprised that my nice trousers still fit.</p> <p>I joined in time to take part in the company dinner so this week is a great chance to meet lots of people in person and start building relationships.</p> <p>Thank you.</p> <p> Practical.li Website</p> <p> Practical.li GitHub Org practicalli-johnny profile</p> <p> @practicalli@clj.social @practical_li</p>"},{"location":"weekly-journal--neovide/","title":"Weekly journal & Neovide","text":"<p>The Practicalli journal will move to a weekly cadence now I have a full time job with Griffin Bank.</p> <p>I do write a daily journal for my activities in Griffin and will share information that is not sensitive or business valuable.</p>"},{"location":"weekly-journal--neovide/#engineering-manager","title":"Engineering Manager","text":"<p>I've completed my first week as engineering manager and there has been a lot to learn (and still a huge amount more to learn).</p> <p>I joined when we are reviewing working practices, which has given me an opportuntiy to contribute early on.</p> <p>As I am learning the business and development workflows, I am adding the occasional tweek to the already excellent docs, especially for onboarding engineers. I have sneaked in a few links to the Practicalli content too :)</p>"},{"location":"weekly-journal--neovide/#macosx-development-environment","title":"MacOSX Development environment","text":"<p>As I am setting up a Macbook Pro as the development machine I will have a chance to add any small differences between Linux and MacOSX when it comes to Clojure development.</p> <p>So far the Clojure development setup is almost identical to my Linux laptops, except for the use of Homebrew to install a few tools I would normally install via Debian packages</p> <ul> <li>Kitty, a fast terminal app with multiple session tabs</li> <li>Zsh and Prezto to optomise CLI commands, with fish-style completion enabled</li> <li>Neovim & AstroNvim for editing & coding, with Clojure LSP for live linting</li> <li>Emacs for all the things I havent learned to do in Neovim, e.g. Magit rebasing</li> <li>Java 21 (homebrew)</li> <li>Clojure</li> <li>Bazel build tool (this is new to me and looks very interesting)</li> </ul> <p>May of the development tools at Griffin are installed via a single script, so its quite simple to get going.</p>"},{"location":"weekly-journal--neovide/#neovide-gui-for-neovim","title":"Neovide GUI for Neovim","text":"<p> Neovide is a very nice and really fast GUI app on top of Neovim.</p> <p>I'll be using Neovide for the rest of December to see if its preferable to Neovim in a terminal (kitty).</p> <p>The initial reason to use Neovide seems mainly experiential, the cursor moves smoothly along and provides a pleasing visual effect when jumping around. I am assuming this will help keep track of the cursor when navigating larger code bases and text documents. There are other cursor effects which can be configured .</p>"},{"location":"weekly-journal--neovide/#neovide-install","title":"Neovide install","text":"<p>Neovide install was via a Linux AppImage from the GitHub release page for the project.</p> <p>The <code>guifont</code> option was set to define the font family and size specifically for Neovide</p> <p>Neovide guifont setting in AstroNvim</p> .config/astronvim-config/options.lua<pre><code>return {\n opt = {\n -- set to true or false etc.\n relativenumber = true, -- sets vim.opt.relativenumber\n number = true, -- sets vim.opt.number\n spell = false, -- sets vim.opt.spell\n signcolumn = \"auto\", -- sets vim.opt.signcolumn to auto\n wrap = true, -- sets vim.opt.wrap\n -- showtabline = 0, -- sets vim.opt.showtabline - zero hides tabs\n timeoutlen = 420,\n -- neovide font\n guifont = \"Fira Code:h16\",\n },\n</code></pre> <p>Neovide specific configuration can be added using a conditional block, checking the global value <code>vim.g.neovide</code></p> <p>Neovide specific configuration</p> <pre><code>if vim.g.neovide then\n -- add configuration only for Neovide\nend\n</code></pre>"},{"location":"weekly-journal--neovide/#run-neovide","title":"Run neovide","text":"<p>A shell alias called <code>neovide</code> that sets AstroNvim as the configuration and runs <code>neovide</code></p> <p>Neovide shell alias</p> .config/shell-aliases<pre><code># Neovide alias with AstroNvim configuration\nalias neovide=\"NVIM_APPNAME=astronvim neovide\"\n</code></pre>"},{"location":"weekly-journal--neovide/#remote-server-code","title":"Remote server code","text":"<p>Neovide seems useful when working with code on a remote server, especially if the server has limited graphical support.</p> <p>Neovim can be run in headless server mode using Unix sockets or TCP (ideally over an SSH connection for added security).</p> <p>Neovide can connect to Neovim and display richer information, e.g. syntax warnings, ligatures, etc.</p> Headless command for Neovim .local/bin/nvim-headless<pre><code>#!/usr/bin/env zsh\n\n# Start Neovim as a headless service for connection by GUI tools, e.g. Neovide\n\n# Set AstroNvim Configuration for Neovim\nexport NVIM_APPNAME=astronvim\n\n# Start Neovim listening over Unix socket\n$HOME/.local/bin/nvim --headless --listen /tmp/.nvim-instance.sock\n\n# Start Neovim listening over TCP - Less secure\n# nohup nvim --listen 127.0.0.1:6666 --headless </dev/null >/dev/null 2>&1 &\n</code></pre> Neovide command to connect to Neovim .local/bin/neovide-connect<pre><code>#!/usr/bin/env zsh\n\n# Connect Neovide to Neovim server\n\n# Connect over Unix sockets\n$HOME/.local/bin/neovide --server=/tmp/.nvim-instance.sock\n\n# Connect over TCP (less secure)\n# $HOME/.local/bin/neovide --server=localhost:6666\n</code></pre>"},{"location":"weekly-journal--neovide/#park-run","title":"Park Run","text":"<p>A very wet 5km park run today (although more preferable to a 4 hour cycle ride in the wet).</p> <p>I am still quite unfit when it comes to running and so continue to have a mixture of speed walking, jogging and running. I have been getting a fairly decent time with this combination.</p> <p>Today I did 5km in 35 minutes and 5 seconds, which is 20 seconds faster than last week (which had less wind and rain).</p> <p>I came 37th in my age group with an age-graded score of 42.42% (double the meaning of life). The age-graded score is a measure against world record running times for a specific age range, so it seems I wont be breaking any world records for a while :)</p> <p>Thank you.</p> <p> Practical.li Website</p> <p> Practical.li GitHub Org practicalli-johnny profile</p> <p> @practicalli@clj.social @practical_li</p>"},{"location":"neovim-updates-and-neovide/","title":"Neovim updates and Neovide","text":"<p>Enjoying the new role as there is so much to do that I can get involved with.</p> <p>Also enjoying Neovide GUI for Neovim, although its more convienient to simply run <code>astro</code> for Neovim in a terminal. When I am comfortable setting the base directory or working with multiple project, then Neovide will be more convienient to use.</p>"},{"location":"neovim-updates-and-neovide/#solo-ride","title":"Solo ride","text":"<p>Saturday was intended to be a club ride, although I didnt arrive at the starting point in time. I decided to do the level 3 ride by myself and perhaps catch up to the group. I did catch up with the group, outside the cafe at the end of the ride.</p> <p>I did have some minor mechanical issues, so did stop for about 10 minutes. I also confused the cycling computer for about 5 minutes by taking a wrong turn. So it seems likely that I would have been able to keep up with the level 3 group if I had arrived earlier.</p>"},{"location":"neovim-updates-and-neovide/#neovim","title":"Neovim","text":"<p>AstroNvim updates</p> <ul> <li>Gist-nvim create GitHub Gists from the current buffer (required GitHub CLI - <code>gh</code>)</li> <li>GitLinker.nvim generate links for files, including line ranges, for code shared on Git services, e.g. GitHub</li> </ul> <p>Practicalli AstroNvim user configuration updates</p> <ul> <li>add ignored words configuration for Alex lint tool</li> <li>add <code>set guifont = \"Fira Code:h16\"</code> in <code>options.lua</code> to set font family and size explicitly for Neovide</li> </ul> <p>Practicalli Neovim</p> <ul> <li>add install section for MacOSX with Homebrew and from Neovim Release page</li> <li>add install page for Neovide</li> </ul>"},{"location":"neovim-updates-and-neovide/#conjure-update","title":"Conjure update","text":"Conjure recent commit history <p><code>shell \u25cb conjure \uf016 clojure 4880144 Correct janet stdio module form name (9 days ago) ec71272 Set __name__ to __repl__ when setting up #540 (13 days ago) 84a1ba6 Merge branch 'sogaiu-janet-stdio' into develop (13 days ago) 2dd0976 Swap the nREPL *ns* back to the pre conjure.internal one after setup #539 (13 days ago) b9043b6 Default the nREPL Clojure context to user (13 days ago) 04ade4e Add a little example configuration section #541 (13 days ago) 02d07de Correct linguist-generated tag for Lua output (13 days ago) 19c46d5 Support Guile results that lack an assignment (like display) (13 days ago) 9b027d8 Swap guile dev dir to .nvim.fnl and add display example (13 days ago) 58da81f Cast lines to string when appending to the log (13 days ago) 83e5610 Sync sponsors! <3 thank you so much to everyone who supports this, even a tiny bit (13 days ago) 08834ed Swap the nREPL *ns* back to the pre conjure.internal one after setup #539 (13 days ago) e910e33 Default the nREPL Clojure context to user (13 days ago) 641d263 Add a little example configuration section #541 (13 days ago) 10e951f Correct linguist-generated tag for Lua output (13 days ago) af8a3da Support Guile results that lack an assignment (like display) (2 weeks ago) befd4e7 Swap guile dev dir to .nvim.fnl and add display example (2 weeks ago) 6c70271 Cast lines to string when appending to the log (2 weeks ago) ba21ef7 Sync sponsors! <3 thank you so much to everyone who supports this, even a tiny bit (2 weeks ago) 5036ec7 Add a stdio based janet client (7 weeks ago) cb86d46 Only send the Conjure client name once the Janet/netrepl REPL is connected #532 (8 weeks ago) d687f52 Don't set the conn in the janet state until it's connected (8 weeks ago) 2eb9682 Integrate #mapping#enable_defaults into every client (8 weeks ago) 79d54e4 Apply mapping#enable_defaults to clojure (8 weeks ago) e37e9f2 Compile config.lua, remove a print (8 weeks ago) fbdcd9b Add a g:conjure#mapping#enable_defaults flag which keeps the mapping code but removes the defaults #533 (8 weeks ago) 2df49cb Apply patch to janet from #532, fixing paths on Windows (8 weeks ago) 28b61dc Sync sponsors (tyvm @axvr!) (8 weeks ago) bf5a393 Make HUD zindex configurable and default to 1 (was 10) (10 weeks ago)</code></p> Neogit commit updates <pre><code>\u25cb neogit \uea86 User AstroGitFile \uf11c <leader>gnk \uf11c <leader>gs \uf11c <leader>gnt \uf11c <leader>gnc \uf11c <leader>gnd\n 49755ff Merge pull request #1043 from NeogitOrg/fix/popup-mappings (17 minutes ago)\n c6cb986 Use nil check instead of metatable. (19 minutes ago)\n 69fb64c Merge pull request #1039 from ttytm/fix/abort (3 hours ago)\n 4221b79 Merge pull request #1040 from ttytm/fix/type-defs (3 hours ago)\n 41281bc Fix type definitions (4 hours ago)\n 7ecf75a Fix close abort (4 hours ago)\n a6a7ec0 Update README.md (7 hours ago)\n 6ae788e Merge pull request #1038 from NeogitOrg/upgrade/editor-commands (8 hours ago)\n da7c378 Breaking! Remove option `disable_commit_confirmation`. You can now just use a dedicated \"Submit\" and \"Abort\" action if you don't want a confirmation. (8 hours ago)\n 6bdff60 Ensure all editors have same filesystem layout (8 hours ago)\n a33a691 Add config for commit_editor mappings (8 hours ago)\n 362c7a9 Ensure on_unload callback is called the same thing in all editors (8 hours ago)\n d171ca9 Rework how commit editor handles closing/saving/aborting (8 hours ago)\n 0932542 Merge pull request #1033 from NeogitOrg/mappable-rebase-keys (9 hours ago)\n 1990f97 cleanup (9 hours ago)\n 6a75ae9 Set metatable to handle NOP keys (10 hours ago)\n 86ad252 Lint (21 hours ago)\n f02f3d7 Merge pull request #1036 from NeogitOrg/fix/branch/revision (21 hours ago)\n 1207e96 Fix: Can't prefix heads/, remotes/, tags/ and expect things to work (21 hours ago)\n b14b86e When doing interactive rebase, and aborting, don't show a scary message. Be nicer. (22 hours ago)\n 2e5f285 Validate rebase editor mappings (22 hours ago)\n 7860697 Add help message in rebase buffer (22 hours ago)\n c2b7493 Use norm! to prevent issues with user maps (22 hours ago)\n 385aac7 Remove comment - only return the changed string, not number of changes here (22 hours ago)\n ee80acd Pull in max_length util function (22 hours ago)\n 473a79b Lint (2 days ago)\n dbf457c Use user mappings for rebase editor; add moveup, movedown, submit, abort (2 days ago)\n 9224a1a Add rebase editor commands to config for user mappings (2 days ago)\n 0ae5548 Neogit.client can now exit(1) to signify an aborted commit. (2 days ago)\n 1177aaa Use buffer:write (2 days ago)\n 29c5c58 Add buffer:write method (2 days ago)\n d6f21d8 Merge pull request #1030 from gollth/remote-popup (2 days ago)\n 0917973 Remote Popups in {Commit, Log, Reflog} Views (2 days ago)\n a13aa47 Merge pull request #1026 from NeogitOrg/fix/reset-to-tags (3 days ago)\n 7b86103 Allow resetting to tags, and use full ref names to prevent colission between tags/branches with same name. (3 days ago)\n 92b3a3c Merge pull request #1025 from NeogitOrg/checkout-tags (3 days ago)\n 7a96186 Allow checking out tags from b b (3 days ago)\n a74a25e Merge pull request #1022 from NeogitOrg/CKolkey-patch-1 (3 days ago)\n 8f38d8f Merge pull request #1023 from NeogitOrg/enhancement/filter-commit-diffs (3 days ago)\n be7751a lint (3 days ago)\n 932ee81 Pass item filter into log view, so it can be used to filter commits opened, so they only show diff's for filtered files. (3 days ago)\n b0dd97f Remove notification from commit view init (3 days ago)\n 4f5b7bd Update README.md (3 days ago)\n 7782058 Merge pull request #1021 from NeogitOrg/fix/auto-fetch-remotes (3 days ago)\n 8956302 Merge branch 'master' into fix/auto-fetch-remotes (3 days ago)\n 735d618 When fetching after checkout, repo state isn't updated. Need to check upstream manually. (3 days ago)\n a2361d2 Merge pull request #810 from NeogitOrg/auto-fetch-remotes (4 days ago)\n 275451a Update config.lua (4 days ago)\n 86636d0 Set default for fetch_after_checkout to false for now (4 days ago)\n d7990c3 Merge pull request #1012 from NeogitOrg/fixup/log (4 days ago)\n 17eb869 Merge pull request #1013 from NeogitOrg/enhancement/rebase-buffer (4 days ago)\n 568cbcb Fix tests (4 days ago)\n 857c948 Capture OID more robustly (4 days ago)\n 06e3ee8 Add documentation for rebase todo commands (4 days ago)\n 54dd6fb Add commands to rebase buffer (4 days ago)\n 066f92a Allow specifying 'kind' for commit buffer (4 days ago)\n 657c13d Reorder log popup switches, and use '-' instead of '=' (4 days ago)\n 38a62b3 Merge pull request #1011 from NeogitOrg/fix/rebase-root (4 days ago)\n 98d3064 Lint comment (4 days ago)\n 232c105 Needed for rebase (4 days ago)\n 08a8b5e Hide git remote calls (4 days ago)\n c9156f6 When --root argument is passed to git.rebase.interactively, remove the commit hash from the command. (4 days ago)\n 0cdc73e Merge pull request #1010 from NeogitOrg/delete-notification-message (5 days ago)\n 8d0a596 Delete notification message after it's done (5 days ago)\n 9e3c959 Merge pull request #1009 from NeogitOrg/CKolkey-patch-1 (5 days ago)\n d0424cf Update README.md (5 days ago)\n cebebcd Merge pull request #1008 from NeogitOrg/fix/git-command-history (6 days ago)\n e2d5ba0 Stdout, then stderr (6 days ago)\n 58c11c6 Always show error for interactive commands (6 days ago)\n a1afd4a Make failed process warnings easier to read (6 days ago)\n 748adcf Always show both stdout and stderr in git command history (6 days ago)\n d391a07 Merge branch 'master' into auto-fetch-remotes (6 days ago)\n 6be6676 Merge pull request #1007 from NeogitOrg/fix/selene-CI (6 days ago)\n 6844b3e empty (6 days ago)\n 81ec2d5 Add stylua version (6 days ago)\n badc33c Change cache (6 days ago)\n cd6bf5c test push (6 days ago)\n 946b65b ENV, not OUTPUT (6 days ago)\n 4e7fcfd fix cache key (6 days ago)\n 2f4b5d3 Use up-to-date rust toolchain (6 days ago)\n 2f8e06c Store env var (6 days ago)\n ca75650 modify selene save set (6 days ago)\n f3953df Merge pull request #1006 from NeogitOrg/fix/watcher-scheduler (6 days ago)\n 6e034cf Call scheduler first so the cli call doesn't crash when invoked via watcher (6 days ago)\n 8ff18e2 Use new error api (6 days ago)\n 32ed239 Merge branch 'master' into auto-fetch-remotes (6 days ago)\n 37d5d9f Merge pull request #1005 from NeogitOrg/async-refresh-2 (6 days ago)\n 443ad6b Move cursor restoration logic to after fn (6 days ago)\n cf97109 cleanup (6 days ago)\n 110b8ac Wait on status to finish refreshing (6 days ago)\n 59d7680 Reimplement partial refreshing (6 days ago)\n bebb153 Pass nil when partial refreshing doesn't apply (6 days ago)\n 9fbc8b4 Rewrite repo to use callback when refreshing. Removes partial refreshing for now (6 days ago)\n 92d7ecb Use callback when rendering status buffer - restore cursor location in callback, if it was stored (6 days ago)\n 857adae Merge pull request #1004 from NeogitOrg/actions-api-internal-args (8 days ago)\n 7ac1e3d Merge branch 'master' into actions-api-internal-args (8 days ago)\n 506f14a lint (8 days ago)\n 4a5cc7e Pause watcher while executing action (8 days ago)\n 68ed281 Don't refresh for these little files (8 days ago)\n 47e7dd3 Remove debounce from watcher - this would mess up the semaphore locking the status buffer from repainting. (8 days ago)\n 11f6840 Polish (8 days ago)\n 9686ce1 Hide this too (8 days ago)\n 225902e Revert 1 commits (8 days ago)\n e0296cb comment out watcher (revert me) (8 days ago)\n 0ddf77d Hide fs-tree calls (8 days ago)\n 481a866 Hide rev-parse calls (8 days ago)\n f4877cb Status is always needed, so call it here (8 days ago)\n 541724a Include branch lib (8 days ago)\n 5811135 Remove comment (8 days ago)\n 3961d73 Format (8 days ago)\n 1ed5062 Move branch refresh into branch lib (8 days ago)\n dbf9271 Use loop instead of fn (8 days ago)\n c84894d Use cli (8 days ago)\n 761e9be Merge pull request #1003 from NeogitOrg/actions-api-internal-args (8 days ago)\n ffe9295 Change remove_item_from_table to return true if it removed the item(s) (8 days ago)\n 3ad0f61 Add support for internal args to .action() api (8 days ago)\n 6d445e4 Merge pull request #1000 from NeogitOrg/fix/on-error-for-new-repo (9 days ago)\n ead172f Fix on_error when opening in a non-git directory (9 days ago)\n d0ed65e Merge pull request #880 from NeogitOrg/Expand-default-args (9 days ago)\n 34de2a2 No reason to call this over and over, it's always the same thing (9 days ago)\n a1fec2e Merge branch 'master' into Expand-default-args (9 days ago)\n 3488b9c Merge pull request #998 from NeogitOrg/fix/dont-trim-commit (9 days ago)\n c20d795 Allow opting out of trimming stdout (9 days ago)\n 8b9bd5c Escape properly (9 days ago)\n 547bea3 Revert 1 commits (9 days ago)\n d9abf38 Fix bug in pattern escape: need to handle %'s before anything else (9 days ago)\n 5828770 This is a default setting (9 days ago)\n 5628fb4 Use pattern escape for string (9 days ago)\n 3191500 Merge branch 'master' into Expand-default-args (10 days ago)\n dd288fa Merge pull request #967 from NeogitOrg/hide-from-git-history (10 days ago)\n f32d186 Hide more things and lint (10 days ago)\n 5f1c7b7 Fix process spec (10 days ago)\n 10dadd9 Change log level from error to warn (10 days ago)\n 4048119 Lint (10 days ago)\n 5133b1c Simplify error handling - always pass callback (10 days ago)\n 34d80e3 Centralize calling of :trim() (10 days ago)\n e024521 Don't double notify on error (10 days ago)\n 5a1eced Rename \"ignore_code\" to \"ignore_error\" (10 days ago)\n ec9aa05 Merge branch 'master' into hide-from-git-history (10 days ago)\n 0b5876c Merge pull request #997 from NeogitOrg/cleanup/parallel (10 days ago)\n f4fba7c Remove unused require (10 days ago)\n 48ca87f Remove unused \"job\" code (10 days ago)\n f94beff Remove unused \"parallel builder\" code (10 days ago)\n 03c278b Merge pull request #995 from NeogitOrg/fix/status-refreshing (10 days ago)\n cbfb897 Nil check buffer (10 days ago)\n 987eeda Don't need CLI (10 days ago)\n 245f882 Merge branch 'master' into fix/status-refreshing (10 days ago)\n 3ac3215 Merge pull request #996 from NeogitOrg/fix/cursor-placement-in-status (10 days ago)\n 8364cca Log watcher as refresh source (10 days ago)\n 2d55cf1 Cleanup status refresh logic (10 days ago)\n b3c0446 Use vim.api instead of vim.fn to set cursor position (10 days ago)\n e0b9687 Merge pull request #993 from NeogitOrg/fix/reschedule (11 days ago)\n 40f4ec4 Need to schedule here - breaks when opening commit editor otherwise (11 days ago)\n 62cc708 Merge pull request #875 from NeogitOrg/fix/restore-cursor-location (11 days ago)\n ade6dc5 Merge branch 'master' into fix/restore-cursor-location (11 days ago)\n 119b4fb Merge pull request #930 from GCBallesteros/add-commit-navigation (11 days ago)\n 15bf3f9 Merge branch 'master' into hide-from-git-history (12 days ago)\n f59b0e9 Merge pull request #992 from NeogitOrg/rebase-a-subset (12 days ago)\n 66e31fb Add git rebase --edit-todo command to rebase popup (12 days ago)\n 7abd392 Fix rebase popup rebase-merge options (12 days ago)\n 8ef9780 notes (12 days ago)\n e855762 Expand branch docs (12 days ago)\n e21c391 Add rebase popup help (12 days ago)\n daa7b9f Merge pull request #991 from NeogitOrg/fix/missing-status-hint-mappings (12 days ago)\n 6cbed41 Check both status and popup maps for hints (12 days ago)\n 9dce695 Cleanup rebase module (2 weeks ago)\n d12bc48 Rename rebase onto lib function (2 weeks ago)\n 1accbba Add action: Rebase Subset (2 weeks ago)\n 468f545 lint (3 weeks ago)\n 539e78f Add default opts (3 weeks ago)\n 7035226 Added another arg (3 weeks ago)\n 5515206 Merge branch 'master' into hide-from-git-history (3 weeks ago)\n 22e4322 Lint (3 weeks ago)\n d03f81b Hide all calls in git.files lib (3 weeks ago)\n b20bd95 Hide more background calls. (3 weeks ago)\n cde49bb Replace builder style call with an option passed into call() or call_sync() (3 weeks ago)\n 3b2f5aa Pass opts to call() and call_sync() - replace \"ignoring_exit_code\" with option on call/call_sync (3 weeks ago)\n 4ce821b lint (3 weeks ago)\n d08d723 Update cli lib to allow hiding cli commands executed from git history buffer (3 weeks ago)\n fbf5fa8 Hide some internal state building commands from displayed git history (3 weeks ago)\n 3c52bb1 Allow git.log.list() to be called but hidden, since it's used for some internal state building (3 weeks ago)\n 7b99857 Move constants up a scope (3 weeks ago)\n 243b712 Filter hidden git commands from history buffer (3 weeks ago)\n f3668de Remove unused code for \"parallel builder\" (3 weeks ago)\n 2ecb1a8 Cleanup (3 weeks ago)\n a6f363d Use direct CLI call here so we don't stack too much behaviour (3 weeks ago)\n 287abae Merge branch 'master' into auto-fetch-remotes (3 weeks ago)\n 63c3738 Feat: Jump to file with `<CR>` on the CommitView (5 weeks ago)\n 7756191 Expand default args to match Magit (experiment) (10 weeks ago)\n 31f24cb Formatting (2 months ago)\n 758d263 These don't seem to do anything (2 months ago)\n 75e4085 Properly store/restore cursor location. It seems that close() gets called twice, so put in a lockout to prevent that. (2 months ago)\n 806267c Auto-fetch functions (3 months ago)\n 328bb3e Extract to git lib (3 months ago)\n b6bed92 Add config (3 months ago)\n</code></pre> <p>Thank you.</p> <p> Practical.li Website</p> <p> Practical.li GitHub Org practicalli-johnny profile</p> <p> @practicalli@clj.social @practical_li</p>"},{"location":"practicalli-work-over-the-winter-break/","title":"Practicalli work over the winter break","text":"<p>The company I work for takes a break over the winter, so I have some time to spend on Practicalli content.</p>"},{"location":"practicalli-work-over-the-winter-break/#practicalli-work","title":"Practicalli work","text":"<p>Work for Practicalli that is at the top of my very long TODO list :)</p> <ul> <li>DONE: Advising on and researching for Arqivist project</li> <li>DOING: Git Signing article - Engineering Playbook</li> <li>Add ssh key to RangerOne and GKar laptops</li> <li>Git config enhancements - practicalli/dotfiles</li> <li>Neovim, Conjure & Portal video</li> <li>More content on using Neovim - Practicalli Neovim</li> <li>API with Clojure, Reitit, Swagger, mulog and http-kit - Practicalli Clojure Web Services</li> <li>AWS accounts with IAM Identity Center - Practicalli Engineering Playbook</li> <li>Check for costs once AWS free tier ends</li> <li>just tool, an enhanced version of make (can pass arguments to tasks) - review and add to Practicalli Engineering Playbook</li> <li>article: practicalli in 2023 - summary of work and projects</li> </ul>"},{"location":"practicalli-work-over-the-winter-break/#configure-git-ssh-signing","title":"Configure Git & SSH signing","text":"<p>The main development laptop used had an RSA type SSH key. ED25519 is now generally recommended, so a new key was generated with a long passphrase.</p> <pre><code>ssh-keygen -t ed25519 -C \"engineering@practical.li\"\n</code></pre> <p>ssh-keygen command output</p> ssh-keygen command output<pre><code>\u276f ssh-keygen -t ed25519 -C \"engineering@practical.li\"\nGenerating public/private ed25519 key pair.\nEnter file in which to save the key (/home/practicalli/.ssh/id_ed25519):\nEnter passphrase (empty for no passphrase):\nEnter same passphrase again:\nYour identification has been saved in /home/practicalli/.ssh/id_ed25519\nYour public key has been saved in /home/practicalli/.ssh/id_ed25519.pub\nThe key fingerprint is:\nSHA256:***********************/******************* engineering@practical.li\nThe key's randomart image is:\n+--[ED25519 256]--+\n...\n+----[SHA256]-----+\n</code></pre> <p>The passphrase of the SSH key was added to the Debian key ring using the <code>ssh-add</code> command, which prompts for the passphrase used when creating the key.</p> <pre><code>ssh-add ~/.ssh/id_ed25519\n</code></pre> <p>ssh-add command output</p> <pre><code>\u276f ssh-add ~/.ssh/id_ed25519\nEnter passphrase for id_ed25519:\nIdentity added: id_ed25519 (engineering@practical.li)\n</code></pre> <p>SSH Config for MacOSX</p> <p>Edit the SSH configuration, <code>~/.ssh/config</code>, and configure SSH to use the operating system keychain for the passphrase.</p> <pre><code>Host github.com\n AddKeysToAgent yes\n UseKeychain yes\n IdentityFile ~/.ssh/id_ed25519\n</code></pre> <p>This configuration does not seem neccessary (or correct) for Linux</p> <p>Run git commands to configure Git to use SSH signing for commits and tags. Or edit the Git client configuration, <code>~/.config/git/config</code></p> <pre><code>git config --global gpg.format ssh && \\\ngit config --global user.signingkey $HOME/.ssh/id_ed25519.pub && \\\ngit config --global commit.gpgsign true && \\\ngit config --global tag.gpgsign true && \\\ngit config gpg.ssh.allowedSignersFile \"$HOME/.config/git/allowed-signatures\"\n</code></pre> <p>Added the new SSH key to my GitHub account twice, onces as an authorisation key and second as a signing key.</p> <p>The public key was copied by opening in neovim and yanking the line, y y</p> <p>Opened GitHub Settings > SSH and GPG keys page and selected New SSH key</p> <p>Created an authorisation and signing key.</p> <p>Now I can push signed commits to GitHub</p> <p>All Practicalli Commits signed</p> <p>From now on, all commits to Practicalli repositories will be signed.</p> <p>I'm still considering if I should enforce other contributors to sign their work. I think I will mandate all code contributions be signed. Any contributions via the GitHub website should be signed.</p> <p>So it makes sense to ask all contributions that will be merged to also be signed.</p>"},{"location":"practicalli-work-over-the-winter-break/#audacity-for-audio-fun","title":"Audacity for audio fun","text":"<p>Audacity is an excellent tool for sound editing and effects, e.g. editing podcasts and creating sounds overlays for screencasts</p> <p>Install audacity and supporting libraries using Debian packages</p> <p>Install Audacity via Debian Package Manager</p> <pre><code>apt install audacity ffmpeg lame pavucontrol\n</code></pre> <p>When recording sound from the desktop, Pulse Audio should be set to the monitor for the default sound device, e.g. speakers and headphones.</p> <p>Run Audacity and Click the microphone icon for Recording. Choose Start silent monitor</p> <p>Start Pulse Audio Volume Control from desktop launcher. Select Recording tab. Select drop-down of available audio devices and choose the monitor for speakers and headphones.</p> <p>Start recording in Audacity and play the desktop audio. Waveforms should be displayed in Audacity to indicate that sounds are being detected and recorded.</p> <p>Ensure a sufficient amount of hard drive space is available when recording the desktop sound as the recorded uncompressed by default.</p> <p>Press the stop button. Use audacity tools to edit the sound and export it to a file or save the whole sound sample as an audacity project.</p> <p>Codecs such as Opus can be used to compress the sound file to a few percent of their original size without noticeable quality loss.</p> <p>Create a shell script wrapper around these codec tools to use a consistent codec configuration, e.g. convert-to-opus</p> <p>Zsh script to convert Wav files to Opus</p> <pre><code>#!/usr/bin/zsh\n\nfor x in *.wav ; do\n ffmpeg -i \"$x\" -b:a 96k -c:a libopus \"${x:r}\".opus\ndone\n</code></pre>"},{"location":"practicalli-work-over-the-winter-break/#health","title":"Health","text":"<p>A reasonably warm 84km club ride for the time of year, completed in 3.5 hours on Saturday.</p> <p>This was the first time I had tried the close riding with a group, swapping the front rider every few minutes. I found it unnatural and constraining for most of the ride. I enjoyed it when I was either at the front where I wouldnt need to slow down when decending. Or I would drop back a little from the group so I didnt have to ride the breaks down hill, as my bicycle seems to freewheel faster than the other bikes in the group (it is supposed to be an Aero bike, so it seems like that aero works).</p> <p>I was tired once I got home after the ride, although had enough engergy to make brown rice with beetroot powder and walnut pieces. I didnt need to have a big sleep</p> <p>A walk on Sunday for an hour helped streatch my legs. Walking is a good way to recover from the ride.</p> <p>I joined the local 5 km park run event on December 25h and manage a time of 34 minutes and 34 seconds, although the run on Strava it was 33 minutes and 59 seconds.</p> <p>Thank you.</p> <p> Practical.li Website</p> <p> Practical.li GitHub Org practicalli-johnny profile</p> <p> @practicalli@clj.social @practical_li</p>"},{"location":"end-of-line-for-2023/","title":"End of line... for 2023","text":"<p>My personal plans for 2024 are not set in stone, but I would like to relocate to the countryside by the summer.</p> <p>Predictions for 2024:</p> <ul> <li>the year of the AI lawsuits as more companies and individuals realise they content has been used to train AI models without permission or recompense.</li> <li>Anthropocene is declared a new geographic era in the history of the earth, marking the significant change humanity has made to the planet (not for the good).</li> </ul>"},{"location":"end-of-line-for-2023/#wikipedia-sponsorship","title":"Wikipedia sponsorship","text":"<p>Now I am working again I've started contributing financially to the Wikipedia project. Previously I have donated one-off payments, although this time its a monthly donation.</p> <p>I use Wikipedia extensively for work so its only right that I give some financial support when I am able.</p>"},{"location":"end-of-line-for-2023/#git","title":"Git","text":"<p>Included files will use relative path from the current config file being read, if the full path is not used</p> <p><code>**/</code> in front of <code>gitdir</code> file path if it does not start with <code>~</code>, <code>/</code> or <code>./</code></p> <p>ignore, commit templates, and allowed-signatures files seem to need the full path on MacOSX or can be defined relative to the home directory using tilde <code>~</code> expansion, e.g. <code>~/.config/git/ignore</code></p> <p>Practicalli Dotfiles - Git config examples</p>"},{"location":"end-of-line-for-2023/#neovim","title":"Neovim","text":"<p>Creating scripts for two Neovim videos</p> <ul> <li>Install and basic use</li> <li>Clojure development with Neovim and Conjure</li> </ul> <p>Switching to Neovide desktop UI for Neovim after testing out the project switching feature using Telescope. Using the project switching tool means I can launch Neovide from the operating system desktop launcher.</p> <p>Neovide was configured using a <code>neovide</code> shell alias to run with the AstroNvim configuration, in the same way as the <code>astro</code> alias does.</p> <p><code>SPC f p</code> in Neovim lists all the projects Neovim is aware of (I assume that are previously opened). Selecting a project prompts to choose a file via the telescope narrowing search dialog.</p> <p>The project root directory is correctly setup so that all tools work with respect to the current project.</p> <p>Using Neovide in this way makes Neovim feel more like the experience I am accustom to with Emacs (although runs fast and smooth all the time).</p> <p>Neovide super smooth cursor movement</p> <p>I am so enamoured by the smoothness of the cursor movement in Neovide. Its a simple thing, but as I am looking at the screen when touch typing I feel so connected to the editor. Its like my soul is pouring out onto the screen in front of me.</p> <p>Neovim in the terminal is just as fast, but doent have the smooth glide of the cursor in exactly the same way that Neovide does.</p> <p>Maybe this will be a short term crush, but its a simple thing that makes me very happy.</p>"},{"location":"end-of-line-for-2023/#health","title":"Health","text":"<p>A hilly 65km cycle ride on Thursday to burn-off some winter solstace calories. A good time of 2 hours 48 minutes at an average speed of 23.2km per hour.</p> <p>Gave the bike a nice shower to clean it up after the muddy Thursday ride.</p> <p>Club or solo ride on Saturday, depending if there is a nice level 4 group to join.</p> <p>Park run new years day tomorrow, aiming for 35 minutes or less.</p> <p>Subscribed to Spotify using a free 3 month plan and work email address. Will use account to identify instrumental music to focus during work and to unwind after work.</p>"},{"location":"end-of-line-for-2023/#misc","title":"Misc","text":"<p>The title of this post is an homage to the original Tron movie.</p> <p>Thank you.</p> <p> Practical.li Website</p> <p> Practical.li GitHub Org practicalli-johnny profile</p> <p> @practicalli@clj.social @practical_li</p>"},{"location":"planing-practicalli-2024/","title":"Planing Practicalli 2024","text":"<p>How could the community help people find relevant and quality libraries to use for their own development projects?</p>"},{"location":"planing-practicalli-2024/#clojurists-together-submission","title":"Clojurists Together Submission","text":"<p>Finding what libraries are available for Clojure is predominantly an internet search. There is a lack of central advice as to which of the many libraries available libraries to use and inconsistent opinions often provided.</p> <p>Whilst there are many commonly used libraries, there are many commonly used alternatives. There are numerous questions in the Clojurians Slack regarding libraries, from those new to Clojure and those more experienced.</p>"},{"location":"planing-practicalli-2024/#project-goal","title":"Project Goal","text":"<p>The Practicalli \"Which Clojure Library\" project would provide a consistent way to find and understand the purpose of Clojure libraries. Each library description would be based on commercial and community experiences, not rely on unfiltered social media content. The community would be able to update aspects of each library description to keep the information as relevant as possible.</p>"},{"location":"planing-practicalli-2024/#major-features","title":"Major Features","text":"<ul> <li>search for libraries by topic, e.g. web server, routing, html template, etc</li> <li>consistent information for each library (integration with Git for common project information)</li> <li>provide rationale, characteristics and usefulness of each project</li> <li>common stacks and describe their benefits and constraints (in a consistent way)</li> <li>link to the major libraries that compose the stack</li> </ul> <p>The first phase of the project would provide a website that included the most commonly used libraries, each with a comprehensive description of their purpose and related libraries / stacks.</p> <p>mkdocks- Which Libraries Project - GitHub issue</p> <p>Thank you.</p> <p> Practical.li Website</p> <p> Practical.li GitHub Org practicalli-johnny profile</p> <p> @practicalli@clj.social @practical_li</p>"},{"location":"debian-linux-migration/","title":"Debian Linux migration","text":"<p>Enjoying Debian Linux and freedom from Snaps</p>"},{"location":"debian-linux-migration/#post-install","title":"Post install","text":"<p>TODO: see <code>debian-post-install.md</code> file on Londo laptop</p>"},{"location":"debian-linux-migration/#nordvpn-nordpass","title":"NordVPN & Nordpass","text":"<p>NordVPN installs via a script</p> <p>Nordpass for Linux is only available as a snap, so using the website version.</p> <p>Requested to Nord support that an AppImage package for Nordpass is provided as it does not need all the mechanism of a snap.</p> <p>TODO: investigate if there is a firefox plugin for nordpass that doesnt require a separate install (doesnt seem to be the case unfortunately)</p>"},{"location":"debian-linux-migration/#adminsitration-account","title":"Adminsitration Account","text":"<p>A root user account is created during initial Debian Linux installation, prompting for the root password.</p> <p><code>su -</code> is used to change from the normal user login to the root account, allowing for package updates and other Adminsitrative commands to be run.</p> <pre><code>su -\n</code></pre> <p>Enter the root password when prompted.</p> <p>Carry out administrative tasks as required and type <code>exit</code> to leave the root account and return to the user account.</p> <p>Dedicated terminal console</p> <p>Use a dedicated terminal session when undertaking many administrative tasks by login in as root once. Terminal appls like Kitty) can open multiple tabs, so one of the tabs can be used to <code>su -</code> to the root account.</p> <p> Kitty Terminal - Practicalli Engineering Playbook</p> <p>Thank you.</p> <p> Practical.li Website</p> <p> Practical.li GitHub Org practicalli-johnny profile</p> <p> @practicalli@clj.social @practical_li</p>"},{"location":"continuing-the-move-to-debian-linux/","title":"Continuing the move to Debian Linux","text":"<p>Organising my laptop collection is a fascinating journey down a long history of laptops, many of which I had forgotten about. Most of the laptops still work and run new versions of Linux pretty well.</p> <p>I really enjoyed using the EzePc laptops as they were so easy to carry around to all the community events I used to go to. Although they would have benefited from a nice Atreus keyboard from Keyboard.io.</p> <p>Debian is very useful for older i686 to i386 cpu based hardware. Firefox-esr is the only browser that seems to still support these older chipsets.</p>"},{"location":"continuing-the-move-to-debian-linux/#new-journal","title":"New Journal","text":"<p>Use Material for MkDocs blog feature to create a rich experience for journal entries written in markdown.</p> <p>Practicalli Journal</p> <p>The journal will match the appearance of other Practicalli content and therefore have a light and dark theme built in.</p> <p>Older developer journal content will be added to the new journal to make it easier to find and consume this content, e.g. practicalli-johnny/developer-journal and practicalli-johnny/100-days-of-code</p> <p>Consider creating a 100 Days of Clojure guide to those new to learning Clojure</p>"},{"location":"continuing-the-move-to-debian-linux/#practicalli-org-github","title":"Practicalli Org .github","text":"<p>Updated Practicalli GitHub org with default repository healthcheck files</p> <ul> <li>Creative Commons License</li> <li>Code Of Conduct</li> <li>Funding with GitHub Sponsors</li> <li>Pull request templates</li> </ul> <p>All repositories within the Practicalli Org on GitHub will use these defaults unless they provide their own, e.g. within a <code>.github</code> directory.</p> <p>Updated the Practicalli Org profile defined in the <code>.github</code> repository, updating the Clojure REPL workflow images and practicalli logo.</p> <p>Using the .github repository - FreeCodeCamp</p>"},{"location":"continuing-the-move-to-debian-linux/#github-stats","title":"GitHub stats","text":"<p>Reached 366 consecutive days of commits on the <code>practicalli-john</code> GitHub account.</p> <p>Added a <code>.gitattributes</code> configuration to some repositories reporting a different or irrelevant repository language. GitHub uses</p> <p>Linguist troubleshooting: Repo language incorrectly detected</p> <p>GitHub Linguist Overrides</p> <p>GitHub Linguist languages supported</p>"},{"location":"continuing-the-move-to-debian-linux/#debian","title":"Debian","text":"<p>Spending the rest of 2023 moving over to Debian to compare the experience to Ubuntu.</p> <p>One main driver for the switch is the every growing use of Snaps for major parts of Ubuntu, rather than the more efficient debian packages.</p> <p>Snaps can make it easier for maintainers of applications and libraries.</p> <p>However, there is always at least 2 versions of a snap installed and as a snap is self-contained its install is typically larger. Snaps such as firefox have also had a noticable impact on performance, especially when starting the application. I am also concerned that a snap would be using more RAM memory as it is loading its own version of all its libraries into memory.</p> <p>Debian has stayed with the highly reliable and efficient <code>deb</code> package format for everything.</p> <p>Debian is 99% of all the things I like about Ubuntu already.</p>"},{"location":"continuing-the-move-to-debian-linux/#copy-files-using-sftp","title":"Copy files using sftp","text":"<p>Requires <code>openssh-server</code> on the system that will be connected to.</p> <p>Requires <code>ssh</code> package on the system that will connect to the Openssh-server (not installed on Debian by default).</p> <p>Connect to a user account on a remote system</p> <pre><code>sftp://192.168.0.200/home/remote-username\n</code></pre>"},{"location":"continuing-the-move-to-debian-linux/#separate-admin-account","title":"Separate admin account","text":"<p>Debian creates a proper <code>root</code> account with password during the initial install, e.g. from the net.iso. The root account is expected to be used to install packages and other administrative tasks, so the user account created is not added to a sudo list to carry out administration.</p> <p>Ubuntu adds the user account created during initial install to the sudo list, which is a little more convenient but also increases the risk of security breaches if the sudo package is ever compromised. If a user password is discovered or account otherwise compromised, then any administration task can be carried out.</p> <p>The debian approach does require remembering two passwords, one for the daily user account and one for root administration account. However, the root password could be added to a secure password manager, e.g. NordPass or 1Password.</p> <p>Thank you.</p> <p> Practical.li Website</p> <p> Practical.li GitHub Org practicalli-johnny profile</p> <p> @practicalli@clj.social @practical_li</p>"},{"location":"onboarding-to-a-new-role-hacking-clojure--neovim/","title":"Onboarding to a new role, hacking Clojure & Neovim","text":"<p>Nervous excitement about starting a new role and hopeful I dont mess it up.</p> <p>Enjoying writing a regular practicalli again, which is something I missed when not working.</p>"},{"location":"onboarding-to-a-new-role-hacking-clojure--neovim/#the-arqivist","title":"The Arqivist","text":"<p>I've been contributing to The Arqivist open source project, used to back up Slack channels.</p> <p>Another person was interested in collaborating but had a few issues getting started. The README was updated and an additional <code>:dev/env</code> alias added to <code>deps.edn</code> configuration if a contributor is not using the Practicalli Clojure CLI Config</p> <p>PR93 dev: update hack locally details for starting a REPL</p>"},{"location":"onboarding-to-a-new-role-hacking-clojure--neovim/#mulog-custom-transformations","title":"Mulog Custom transformations","text":"<p>Discussing the Arqivist project, a question arose about hiding sensitive data in logs during production whilst still seeing them during development, e.g anonymise sensitive data</p> <p>Mulog has custom transformations which can be used to pre-process each event before the publisher dispatches the event.</p> <p>The mulog maintainer created the where project to define Human readable conditions to filter data.</p> <p>where is a DSL for powerful predicate functions</p> <pre><code>(mulog/start-publisher!\n {:type :console\n :pretty? true\n :transform\n (partial filter (where :mulog/event-name :in? [:secret/db-connection :secret/api-key]))})\n</code></pre> <p>In a donut-party/system config, a production config would include the <code>:transform</code> and the dev config would not include the <code>:transform</code></p>"},{"location":"onboarding-to-a-new-role-hacking-clojure--neovim/#neovim","title":"Neovim","text":"<p>How to navigate Clojure code using AstorNvim was asked in the Clojurians Slack channel.</p> <ul> <li><code>g d</code> jumps to definitions, including let bindings and function args</li> <li><code>SPC l s</code> shows symbols in telescope popup</li> <li><code>SPC l S</code> shows symbols in a new buffer</li> <li><code>S-(</code> and <code>S-(</code> to traverse code</li> </ul> <p>Neovim commands to investigate further</p> <ul> <li><code>:help path</code> and the related topics (gf, :find, etc.)</li> <li><code>:help include</code> and related commands ([i, :isearch)</li> <li><code>:help define</code> and related commands (esp. :help include-search)</li> <li><code>:help gd</code> and related commands</li> <li><code>:help Explore</code> and related commands</li> <li><code>:help usr_22</code> has a good introduction</li> </ul> <p>Clojurians Slack - navigating code in neovim discussion</p> <p>Neovim plugin: nvim-treesitter-sexp</p> <p>Evalaute the nvim-treesitter-sexp plugin with the Practialli AstorNvim User configuration and see if it is a valuable way to navigate Clojure expressions.</p> plugins/clojure.lua<pre><code>return {\n {\n \"PaterJason/nvim-treesitter-sexp\",\n ft = { \"clojure\", \"fennel\", \"janet\" },\n opts = {\n -- configuration:\n -- https://github.com/PaterJason/nvim-treesitter-sexp#configuration\n enabled = true,\n set_cursor = true,\n keymaps = {\n commands = {\n promote_elem = \"<LocalLeader>kO\",\n promote_form = \"<LocalLeader>ko\",\n splice = \"<LocalLeader>k@\",\n },\n motions = {},\n textobjects = {},\n },\n },\n },\n}\n</code></pre> <p>If the plugin is successful, add it to the AstroNvim Community Clojure pack</p>"},{"location":"onboarding-to-a-new-role-hacking-clojure--neovim/#new-role","title":"New role","text":"<p>I'm starting a new role (references allowing) as an Engineering Manager at a very nice Fintech company.</p> <p>I've signed a contract and started completing the inital onboarding forms. Hopefully the people I have put as references have positive things to say about me and the company is satisfied.</p> <p>Part of the onboarding is to select a laptop to use. As the company is in a regulated industry, they use MacBook Pro for their engineers. I did get a choice of 14\" or 16\" display and which keyboard layout I preferred.</p> <p>My previous experience with MacBook was mared by the elusive <code>#</code> character, so I opted for the International English Keyboard layout</p> <p>MacBook Keyboard layouts visualised</p> <p>MacBook Keyboard guide</p> <p>Thank you.</p> <p> Practical.li Website</p> <p> Practical.li GitHub Org practicalli-johnny profile</p> <p> @practicalli@clj.social @practical_li</p>"},{"location":"practicalli-email/","title":"Practicalli Email","text":"<p>Making a note of why things are set up are useful so you dont delete anything important!</p>"},{"location":"practicalli-email/#practicalli-email-address","title":"Practicalli Email address","text":"<p>The Practical.li domain is managed via Gandi domain name service.</p> <p>Recieving emails from @practical.li addresses is manged by Gandi Email forwarding, each @practical.li email is mapped to a GMail email account.</p> <p>Gandi also provided a free mailbox and SMTP service, although from November 2023 this is only a commercial servce.</p> <p>The Gandi mailbox was used to send emails from @practical.li addresses, although Gandi are only providing this as a paid service. I had forgotten why I had a mailbox with them as all the mail is forwared to GMail. Once I deleted the Gandi mailbox and send an email with a @practical.li email address I quickly remembered...</p> <p>I would rather use the sponsorship money to support writing content for Practicalli rather than speding it on services.</p> <p>Luckily I found many articles on using Gmail SMTP server for applications and this includes GMail when using a different domain. This is also much simpler to maintain and understand what it is used for.</p> <p>Create a Google account app password</p> <p>Open myaccount.google.com > Security > 2-Step Verification > App passwords</p> <p>Save app password in password manager as it will not be shown again.</p> <p>Google account will confirm it was the correct user creating the app password, via an email and notification on the users android phone.</p> <p>Sign in with app password - Google Account Help</p> <p>The Google account App Password is used to send @practical.li emails via Google <code>smtp.gmail.com</code> server.</p> <p>The Google account name and password cannot be used as that approach also requires a 2-factor token</p> <p>Add another email account in Gmail</p> <p>Open Gmail > Settings > Accounts and Import</p> <p>Enter Name and Email address for the new email</p> <p>Ensure Treat as an alias is ticked</p> <p>Click Next Step>></p> <p>Configure the SMTP server with the Google Mail host</p> <p>SMTP: server smtp.gmail.com</p> <p>Username: Google account user name something@gmail.com</p> <p>Password: App password (not the gmail login password)</p> <p>Assuming the credentials are correct, Gmail will send a confirmation email to verify the new email address</p> <p>To add your email address, click on the link in the confirmation email in Gmail Inbox.</p> <p>Send Emails from different address or alias - Gmail help</p> <p>If the email is not recieved, visit the Gmail > Settings > Accounts and Import and select veryify on the new email address</p>"},{"location":"practicalli-email/#debian-migration","title":"Debian Migration","text":"<p>Backing up a Lenovo laptop to get ready to install Debian Linux.</p> <p>Backup Asus Eze PC 900 and installed Debian Linux using i386 net iso image.</p> <p>Thank you.</p> <p> Practical.li Website</p> <p> Practical.li GitHub Org practicalli-johnny profile</p> <p> @practicalli@clj.social @practical_li</p>"},{"location":"neovim-search-replace--debian-drm/","title":"Neovim search replace & Debian DRM","text":"<p>What are the options for search and replace text in Neovim?</p> <p>Sometimes error messages are missleading...</p>"},{"location":"neovim-search-replace--debian-drm/#neovim-search-and-replace","title":"Neovim Search and Replace","text":"<p>Known options</p> <ul> <li><code>g m A</code> will match text under curor allowing in-place editing with visual-multi plugin</li> <li><code>:%substitue</code> vim-style search and replace (I find this fiddley and not reliable, although could be user errror)</li> <li>Clojure LSP for symbols, etc.</li> </ul> <p>Use a visual select to search and replace, with confirmation</p> <p>Note: <code>'<,'></code> is automatically included when in visual mode and <code>:</code> is pressed to start a command</p> <pre><code>:'<,'>s/search-text/replace-text/gc\n</code></pre> <p>Previous slack discussions - 3 November 2022</p>"},{"location":"neovim-search-replace--debian-drm/#cdo-neovim-command","title":":cdo neovim command","text":"<p>Telescope can generate a quickfix list, showing the results of pattern matches across the current project files. Then use search and replace on the quickfix list to make changes across the project.</p> <p>Space f w search for a word across a project</p> <p>Ctrl q opens the quickfix list</p> <p>Use <code>:cdo</code> command to search and replace in the quickfix list</p> <pre><code>:cdo %s/current-pattern/new-pattern/g\n</code></pre> <p>Including the <code>c</code> option to confirm each replacement (using a noice popup when using Practicalli AstroNvim-config)</p> <p>Practicalli Neovim search-replace pages update with lessons learned today</p>"},{"location":"neovim-search-replace--debian-drm/#debian-linux","title":"Debian Linux","text":"<p>Firefox ESR has DRM disabled by default, so streaming video sites like Amazon Prime and Netflix will show errors</p> <p>Enable DRM for streaming video sites</p> <p>Open Settings > General</p> <p>Scroll down to Play DRM Content option and ensure it is checked.</p> <p>Amazon Prime shows an error describing how to enable the Widevine Content Decryption Module, however this plugin will not show in the <code>about:plugins</code> until the Settings > General > Play DRM Content option is checked.</p> <p>Thank you.</p> <p> Practical.li Website</p> <p> Practical.li GitHub Org practicalli-johnny profile</p> <p> @practicalli@clj.social @practical_li</p>"},{"location":"cycling-in-the-cold/","title":"Cycling in the cold","text":"<p>Even in the cold the countryside is beautiful.</p>"},{"location":"cycling-in-the-cold/#cycling","title":"Cycling","text":"<p>A level 4 ride with the Bigfoot Cycling Club, covering 80km in 3 hours 36 minutes.</p> <p>Wrapped up warm with multiple layers:</p> <ul> <li>Spatz base layer & Spatz winter base layer</li> <li>La Passion merino jersy</li> <li>Spatz 4 season jacket</li> <li>merino gloves, thick wooly gloves, La passion cycling gloves (to avoid wear on wolly gloves)</li> <li>Spatz toe covers and woolie booly socks</li> </ul>"},{"location":"cycling-in-the-cold/#neovim-quickfix","title":"Neovim Quickfix","text":"<p>A little more research into understanding the Neovim quickfix mode.</p> <p>Lots of notes that need organising when I'm not really sleepy from cycling.</p> <p>Thank you.</p> <p> Practical.li Website</p> <p> Practical.li GitHub Org practicalli-johnny profile</p> <p> @practicalli@clj.social @practical_li</p>"},{"location":"neovim-basics/","title":"Neovim basics","text":"<p>Feeling good from a deep sleep thanks to a good cycle ride.</p> <p>Filling in some gaps in my Neovim knowledge</p>"},{"location":"neovim-basics/#neovim","title":"Neovim","text":"<p>Updating navigation page with quickfix, jumplist and changelist information</p> <ul> <li>Neovim navigation commands</li> </ul> <p>Added modes and key bindings to enter and leave modes.</p> <p>Added command language keys, including verbs, modifiers and text objects</p> <p>Still some organising to do around the basics of neovim (and a few more things to learn)</p> <ul> <li>Multi-modal Editing</li> </ul> <p>Interesting articles:</p> <p>Global Find and Replace in Neovim</p> <p>Thank you.</p> <p> Practical.li Website</p> <p> Practical.li GitHub Org practicalli-johnny profile</p> <p> @practicalli@clj.social @practical_li</p>"},{"location":"discussing-new-role-expectations/","title":"Discussing new role expectations","text":"<p>Learning a little more about the responsibilities and expectations of the new role, which seems very much as expected.</p>"},{"location":"discussing-new-role-expectations/#meeting-new-manager","title":"Meeting new manager","text":"<p>I'm joining the platform team of a very lovely company I have wanted to work with for a while. Start date is Monday 4th December.</p> <p>I will have lots to learn when I join, especially how to use MacOSX desktop again. Using a Mac will be an opportunity to add any extra steps needed to support the Clojure workflow for MacOSX, although apart from the install I am sure its all the same as Linxu. BSD and Linux are incredibly similar (except for licensing).</p> <p>I'll add general MacOSX tips for engineers to the Practicalli Engineering Playbook - OS section as I learn (or remember) them.</p> <p>TODO: would be great to find a tiling window manager for MacOSX</p>"},{"location":"discussing-new-role-expectations/#neovim","title":"Neovim","text":"<p>Alex is a linter for text that help write in a neutral way and avoid potentially offensive words. An <code>alexrc.yaml</code> can specify words to ignore. Wrapping a word in 'single quotes' also seems to instruct Alex to ignore it.</p> <p>Another practice website for Vim and Emacs key bindings with Short-cut Foo</p> <p>I found Short-cut Foo a good way to practice how well you know the key bindings and helped me remember H M and L for jumping the cursor to the top, middle or bottom of the current window view.</p> <p>TODO: add Short-cut foo to Practicalli Neovim</p>"},{"location":"discussing-new-role-expectations/#fun-with-parcels","title":"Fun with parcels","text":"<p>I ordered a BeYou chair many years ago as part of a kick-starter and part of it has arrived. Unfortunately its only the base for the chair. The chair itself seems to have been collected by DHL 11 days ago, but is delayed for some unspecified reason.</p> <p>I sold two packages worth of book and DVD's on WeBuyBooks about a month ago which were collected pretty quickly by Evri. The following week Evri delivered one of the packages back to me instead of their intended destination.</p> <p>Now I have a pending order with WeBuyBooks which cannot complete until they get the other package.</p> <p>Contacting WeBuyBooks I was told to contact Evri. Using the Evri help and support via a live chat I was informed that as the delay is over 5 days then I should contact WeBuyBooks. I contacted WeBuyBooks again and they have now arranged for another collection.</p> <p>I have more luck with MusicMagpie and Ziffit, although prices for each book, CD, DVD and game can vary quite a lot over each of the three services.</p> <p>I get a laptop for use at the new company, so am also waiting for that to be delivered.</p> <p>There are lots more things to sell and give away, so will be having another push to unused books, CDs and DVDs this week.</p> <p>I have plenty of parcel tape for my tape 'gun' and plenty of empty cardboard boxes, so boxing things up is covered.</p> <p>Thank you.</p> <p> Practical.li Website</p> <p> Practical.li GitHub Org practicalli-johnny profile</p> <p> @practicalli@clj.social @practical_li</p>"},{"location":"health-and-new-chair/","title":"Health and new chair","text":"<p>The BeYou chair is being delivered today, will it live up to my expectations?</p>"},{"location":"health-and-new-chair/#socks-socks-socks","title":"Socks Socks Socks","text":"<p>My feet were the coldest part of myself when cycling at the weekend, so a visit to the Feetus website resulted in new socks on the way.</p> <p>Injinji liner socks will go underneth new long socks, both toe-socks to reduce blisters and they can be warn with my Vibram \"five-fingers\" shoes on long winter walks.</p> <p>As an extra treat, Injinji Ultra Compression toe socks to help with recovery after cycling.</p>"},{"location":"health-and-new-chair/#health-tests","title":"Health tests","text":"<p>A two and a half hour round trip walk to the hospital for another blood test. There are closer places to get tested, although they did not have dates available before starting work. Its a good excuse to get some exercise. Results should be available early next week.</p> <p>Covid in 2021 & 2022 contributed to diabeates (high blood sugar levels) and hyperthyroidism (low B12 levels). Due to very limited ability to do exercise and get out of the house during those years I also had high triglyceride levels and lower vitamin D levels.</p> <p>The biggest concern was the blood oxygen levels of 93-95% during the more intense covid reactions. Practicing breathing seems to be helping generally and whilst cycling.</p> <p>Regular walking at the start of 2023 and 50-80km weekend rides from August should have made signficant improvements, assuming there are no other underlying conditions. I am certainly feeling my most healthy since 2019 (although some aches from all the exercise).</p> <p>Previous exercise routines during 2022 had reduced blood glucose and triglyceride levels close to normal levels, until another couple of covid infections.</p> <p>For the last 3 years I've had the yearly flu vacination and get the Covid vacination as often as the United Kingdom government allow (which is only once a year now and really not enough). This year I also had the one-off pnemonia vacination</p>"},{"location":"health-and-new-chair/#beyou-chair","title":"BeYou chair","text":"<p>After two and a half years I have a new office chair. I backed the BeYou Transforming chair on Tuesday, 15 Jun 2021 and today the chair arrived.</p> <p>Assembling the chair was really simple and there is a good video guide. The main part of the chair is reasuringly heavy, indicating that the chair will be quite durable.</p> <p>I now sit on an angled backrest whilst kneeling on the main chair, as in the picture. I'm finding the chair very comfortable so will have to ensure the cats dont steal it away from me.</p> <p>Before Covid I used to stand all day when working, this helped with posture and burned a few extra calories too. I will mix standing with sitting in the BeYou chair, assuming the cats allow it.</p> <p>Will the BeYou chair be worth the cost? Only time will tell, but so far its a very positive start and the cat has already market it as their teritory.</p>"},{"location":"health-and-new-chair/#freecycle","title":"Freecycle","text":"<p>Donating my existing office chair on Freecycle tomorrow, hopefully it will find a new home. I must have had the chair about 15 years and it was still very comfortable.</p> <p>The gas cylinder to raise the chair stopped working a few years ago (one reason to by a new chair). A spacer was fitted to the chair to keep it in a maximum hight to extend its life. Replacing or refilling the gas cylinder can be expensive and not always guaranteed to work.</p> <p>I'll hunt through the house tomorrow to see if there are other items to donate.</p> <p>Thank you.</p> <p> Practical.li Website</p> <p> Practical.li GitHub Org practicalli-johnny profile</p> <p> @practicalli@clj.social @practical_li</p>"},{"location":"lightening-my-life/","title":"Lightening my life","text":"<p>Feeling the space I've made after rearranging the office space and uncluttering more belongings</p> <p>The cat has taken over my new BeYou chair, despite providing an even nicer space for her to sit. My cats are a regular reminder that change cannot be forced.</p>"},{"location":"lightening-my-life/#rearranging-office-space","title":"Rearranging office space","text":"<p>Even though I have multiple monitors and laptops in the boxy room that is my home office, rearranging a few items has really maximised the space. I have plenty of room for the laptop I will used for the new company I will work for.</p> <p>ThingyClub mounting arms are used for monitors and laptops to minimise desk space use, especially for the LG 34\" ultra-wide monitor used as a second monitor.</p> <p>Keyboard.io is used as an external keyboard, using a USB switch to toggle attachement to work and personal laptop. A Logitech bluetooth trackball is used for the few times I need a mouse, although only really for browsers and video editing.</p> <p>The keyboard and trackball rest on a Grandma Shark bamboo wood laptop desk that sits on top of a corner shaped office desk to create a standing desk position.</p> <p>The BeYou chair kneeling position is ideal for the same the standing desk position the Grandma Shark desk provides.</p> <p>NOTE: when I was ill with Covid I used the Grandma Shark desk in bed to be able to do a little bit of work in-between sleeping and coughing.</p>"},{"location":"lightening-my-life/#recycling","title":"Recycling","text":"<p>The freecycle website is very convienient to find a new life for unwanted items. It seems to be a more useful service during the warmer months, as more recently people are saying they are interested in items but then not turning up.</p> <p>A have a small collection of items that hopefully I can give away before starting the new job next week.</p>"},{"location":"lightening-my-life/#more-parcel-madness","title":"More parcel madness","text":"<p>Evri (formerly Hermes) delivery service continue to meet my very low expectations and completely failed to turn up today, saying they couldnt get access to the property. No one knocked or rang the front door, so either they didnt turn up or went to the wrong location.</p> <p>I am not planning on using WeBuyBooks again and will stick with MusicMagpie (who use DHL) and Zwifit (local collection lockers) for future book, DVD and video game sales.</p>"},{"location":"lightening-my-life/#neovim-astronvim-update","title":"Neovim AstroNvim update","text":"<p>Update AstroNvim to 3.39.0 from within AstroNvim, using <code>SPC p A</code>.</p> <p><code>SPC p v</code> to show the AstroNvim version as a notification.</p> <p>Using the Practicalli Astronvim-config the notification level used for AstroNvim version is not shown and but can be seen in the notification history.</p> <p><code>SPC f n</code> to see the notification history and the output of AstroNvim version.</p> Updates from AstroNvim v3.39.0 <pre><code> \u25cf alpha-nvim 14.8ms \udb82\udcb1 alpha \uf121 astronvim.autocmds\n 29074ee DirChanged keymaps (21 hours ago)\n\n \u25cb astrocommunity\n e984f31 docs(rust): add guide on how to format with clippy (#649) (2 days ago)\n\n \u25cb friendly-snippets \uf487 LuaSnip\n 53d3df2 add-xml-tag-go-snippet (#377) (3 days ago)\n 9e99f7d Updated edge framework snippets (#378) (3 days ago)\n 068b165 changed c++ cout to a more efficient and polyvalent snippet (#381) (3 days ago)\n 83c54cd fix: django rest view snippets (#383) (3 days ago)\n\n \u25cb neogit \uf11c <leader>gs \uf11c <leader>gnt \uf11c <leader>gnc \uf11c <leader>gnd \uf11c <leader>gnk \uea86 User AstroGitFile\n bb538f1 Merge pull request #980 from gollth/merge-help-popups (6 hours ago)\n c87a51e Revert \"CHANGE: Allow to open help popup from commit, log, reflog views\" (7 hours ago)\n 2d2a98f FIX: Add `fetch` popup keybind to reflow in visual mode (8 hours ago)\n f0864be CHANGE: Allow to open help popup from commit, log, reflog views (8 hours ago)\n d408aed CHANGE: Allow to open merge popup from commit, log, reflog views (8 hours ago)\n 763948a Merge pull request #948 from NeogitOrg/flog-graph (20 hours ago)\n 69ca013 Update readme (20 hours ago)\n 273027a Only show \"--color\" switch when rendering ASCII graph (20 hours ago)\n ce47476 Flog -> Unicode (20 hours ago)\n e1a0a9d Allow configuring graph style (20 hours ago)\n 961a9af Merge pull request #974 from gollth/fix-head-log-graph (21 hours ago)\n b3d7a01 FIX: Properly highlight remote only branches (29 hours ago)\n 6d92f47 FIX: Properly render HEAD with `NeogitBranchHead` highlight group (29 hours ago)\n 76a400a Merge pull request #976 from NeogitOrg/CKolkey-patch-1 (31 hours ago)\n b464b8a Update README.md (31 hours ago)\n 7eccfc4 Formatting, gsub (9 days ago)\n d3dbebb Change the author color highlight (10 days ago)\n 8a1f7cc Formatting (10 days ago)\n c9cad0a Replace commit.description in favor of subject/body (10 days ago)\n 1b63c04 Use git lib entrypoint (11 days ago)\n 7a3dea2 Use new field (11 days ago)\n f22f074 WIP flog graph (12 days ago)\n b7b9a83 Use builtin function to escape string (12 days ago)\n b23bb99 Escape escape characters (12 days ago)\n d56e1ca Need to wrap this so we can concatenate the result (12 days ago)\n 975a0d4 Cleanup (12 days ago)\n 158d8b0 Annotations (12 days ago)\n 14bae65 Parse log output as JSON (12 days ago)\n\n \u25cb nvim-lspconfig \uebc7 Neoconf \uea86 User AstroFile\n 39546f7 fix(typos_lsp): use configuration file for root detection #2918 (29 hours ago)\n daaf00a docs: update server_configurations.md skip-checks: true (3 days ago)\n c6a62c7 chore(emmet_language_server): remove languages with emmet bundled by their language server (#2914) (3 days ago)\n e4a56ad perf: reduce an unnecessary function call #2913 (3 days ago)\n\n \u25cf nvim-treesitter 11.95ms \u2714 build\n 8f16c39 feat(make): highlight phony prerequisites as functions (7 hours ago)\n fb101ed feat(make): give targets the function highlight (7 hours ago)\n 10432e6 parsers: add tree-sitter-slang (9 hours ago)\n b04f990 Update parsers: css, facility, foam, wing (10 hours ago)\n bf982eb feat: add facility (24 hours ago)\n 582a92e Update parsers: erlang, wing (33 hours ago)\n ba588ee fix(cpp): remove `@field` for identifiers with `_` prefix (#5731) (2 days ago)\n b8fbd13 Update README (2 days ago)\n 8189d91 astro: add custom component highlighting (#5728) (2 days ago)\n 482a2f1 Fix robot parser metadata in parsers.lua (2 days ago)\n b056e42 Update README (3 days ago)\n 52b25c9 fixup: parser requires generate (ABI) (3 days ago)\n de51978 fixup: lint (3 days ago)\n 274370e fixup: use any-of instead of vim-match (3 days ago)\n 1e74c34 feat: add angular parser and queries (3 days ago)\n 9d91101 twig queries: add combined injections (#5721) (3 days ago)\n eafc0c2 Update parsers: swift, wing (3 days ago)\n d8a7182 Update parsers: dtd, ssh_config, wing, xml (4 days ago)\n 649d137 Update parsers: erlang, ssh_config, wing (5 days ago)\n 71bdf97 feat(hocon): add fold query (#5710) (6 days ago)\n 6d45b34 Update parsers: sql, wing (6 days ago)\n\n \u25cb nvim-web-devicons\n 5efb8bd ci: use vim-colortemplate tarball rather than git clone (#347) (3 days ago)\n e034579 feat: add .luaurc and luau colours (#346) (3 days ago)\n 7b1c4a8 feat: update fnl icons (#345) (3 days ago)\n 3fe528b ci: pre-commit uses make (#344) (3 days ago)\n\n \u25cb rest.nvim \uebc7 RestNvimPreview \uebc7 RestNvimLast \uebc7 RestNvim \uf11c <leader>rr \uf11c <leader>r \uf016 json \uf016 http\n \u25cb SchemaStore.nvim\n 54a4ea1 Update SchemaStore catalog (4 days ago)\n c2c6bd2 Update SchemaStore catalog (5 days ago)\n\n \u25cb telescope.nvim \uebc7 Telescope \uf487 nvim-neoclip.lua \uf487 telescope-file-browser.nvim\n</code></pre> <p>Thank you.</p> <p> Practical.li Website</p> <p> Practical.li GitHub Org practicalli-johnny profile</p> <p> @practicalli@clj.social @practical_li</p>"},{"location":"updating-my-identity/","title":"Updating my identity","text":"<p>Security is very important but can be a challenge to usability.</p>"},{"location":"updating-my-identity/#security-verses-usability","title":"Security verses usability","text":"<p>Using a password manager is really effective, so long as it actually saves the password generated.</p> <p>Creating a new Google workplace account can be a real challenge if you dont know the password the password generator created for you, especially when the organisation requires 2-Factor authorisation and that has not been set up due to not knowing the password.</p>"},{"location":"updating-my-identity/#flexiana-prototype-review","title":"Flexiana prototype review","text":"<p>Ela Nazari arranged a review of a potential new product for team leads, managers and CEOs to give a team and individual performance tool, using data from various sources. There seems a lot of potential there, compared to poking around GitHub for stats.</p> <p>Hopefully I gave them lots of useful feedback during the session.</p>"},{"location":"updating-my-identity/#consistent-identity","title":"Consistent identity","text":"<p>For greater discoverability and to avoid confusion it is very useful to have a consistent identity through all your internet presence.</p> <p>I noticed that I had some variation, so I've updated my GitHub and Slack profiles to use the same name, Practicalli Johnny.</p> <p>An interesting consequence of changing the GitHub name is that all GitHub pages within repositories of the account are rebuilt. I assume due to the name being part of the URL to access the site.</p> <p>Changing the GitHub account name doesnt affect Organisations that account participates in as the name doesnt change.</p> <p>GitHub sponsorship seems unaffected by changing the GitHub account name.</p> <p>The <code>practicalli-john</code> repository used to define an extended GitHub profile had to be renamed to match the change in account name, to practicalli-johnny/practicalli-johnny</p> <p>Practicalli Johnny GitHub profile</p>"},{"location":"updating-my-identity/#neovim","title":"Neovim","text":"<p>Set Neovim 0.9 as the minimum recommeded version in the Practicalli Neovim book and updated laptops, tablet and smartphone to use Neovim 0.9.4</p>"},{"location":"updating-my-identity/#debian-and-java","title":"Debian and Java","text":"<p>Sofware updates today listed security updates for Java OpenJDK packages and I notices I still had several versions of those packages installed (11 and 17).</p> <p>Time to remove Java 11 and use Java 21 as the default (keeping 17 for a little longer as a fall-back version).</p> <p>Removing Java 11</p> <pre><code>apt remove --purge openjdk-11-jdk:amd64 openjdk-11-jdk-headless:amd64 openjdk-11-jre:amd64\n</code></pre> <p><code>openjdk-11-source</code> package was not installed on my system</p> <p>Add Java 21</p> <pre><code>apt install openjdk-21-jdk\n</code></pre> <p><code>openjdk-11-source</code> package was not installed on my system</p> <p>OpenJDK 21 Debian package availability</p> <p>Debian trixie (testing) includes openjdk-21-* packages</p> <p>Ubuntu 23.04 (lunar) and 23.10 (manic) include openjdk-21-* packages</p>"},{"location":"updating-my-identity/#using-debian-testing","title":"Using Debian Testing","text":"<p>Installing a laptop with Debian from scratch and using trixie (testing) version, which includes Java 21 and many updated packages.</p> <p>After the install, edit <code>/etc/apt/sources.list</code> and replace all the instances of <code>bookworm</code> with <code>trixie</code></p> <p>Debian documentation recommends a full upgrade after making such a change</p> <p>Debian Linux full upgrade</p> <pre><code>apt full-upgrade\n</code></pre> <p>Debian Linux - changing to testing or unstable</p> <p>Continuing with Debian Linux install on Thinkpad with AMD chipset, using trixie (current testing) as the distribution verion.</p> <p>Thank you.</p> <p> Practical.li Website</p> <p> Practical.li GitHub Org practicalli-johnny profile</p> <p> @practicalli@clj.social @practical_li</p>"},{"location":"its-april-fool/","title":"Its April Fool","text":"<p>Adding SSH keys to the YubiKey hardware security key provides convenience of SSH key use, especially when required for multiple computers.</p> <p>Using a YubiKey to keep a single SSH key pair removes the need to generate a key pair for each computer.</p> <p>Using one SSH key avoids the need for multiple entries in the allowed-signatures file to check locally that a commit has been signed.</p>","tags":["neovim","astronvim","git"]},{"location":"its-april-fool/#git-signed-commits-local-verification","title":"Git Signed commits - local verification","text":"<p>Practicalli has several computers (including smartphone and tablet) where commits are made from using an editor or command line tools.</p> <p>An <code>allowed-signatures</code> file is used to check locally that a commit has been signed with a known SSH key and this is copied across all computers.</p> <p>Viewing a commit in an editor or via the Git CLI will check the signatures in <code>allowed-signatures</code> and ensure report if the commit signing key is known</p> <p>Git log show signatures</p> <pre><code>git log --show-signature\n</code></pre> <p>comments in allowed-signatures file</p> <p>The <code>allowed-signatures</code> file can include <code>#</code> comment lines.</p> .config/git/allowed-signatures<pre><code># ---------------------------------------------------------\n# Allowed SSH keys for Git commit signing\n#\n# - Used locally to check commits are signed by a known key\n# - no space allowed after comment - invalid key error\n# ---------------------------------------------------------\n# RangerOne\nengineering@practical.li ssh-ed25519 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx engineering@practical.li\n</code></pre> <p>No blank lines allowed after comment lines</p> <p>If there is a blank line after any comment line, then an <code>invalid key</code> error is reported. </p>","tags":["neovim","astronvim","git"]},{"location":"its-april-fool/#astronvim-4-released","title":"AstroNvim 4 released","text":"<p>The version 4 release is a significant change to AstroNvim, the configuration provided in AstroNvim 3 into their own plugins.</p> <ul> <li>astrocore.lua</li> <li>astrolsp.lua</li> <li>astroui.lua</li> </ul> <p>AstroNvim 4 is now a user configuration that pulls in the core AstroNvim plugins. This approach provides a single configuration that is simple to install, configure and extend.</p> <p>To get started, fork the AstroNvim 4 user template repository to your own GitHub repository.</p> <p>Alternatively, use the Practicalli AstroNvim user config repository, which is a fork of the AstroNvim user template, adding Clojure and other nice tools automatically.</p>","tags":["neovim","astronvim","git"]},{"location":"its-april-fool/#creating-practicalli-astronvim-user-config","title":"Creating Practicalli astronvim-user-config","text":"<p>After a few days experimentation with AstroNvim 4 there are still some changes being made and potential for the AstroNvim user configuration to be altered.</p> <p>Therefore a goal of the Practicalli astronvim-user-config is to minimise the changes to the original user template.</p>","tags":["neovim","astronvim","git"]},{"location":"its-april-fool/#userlua","title":"user.lua","text":"<p><code>lua/plugins/user.lua</code> contains several examples of adding and overriding existing plugins.</p> <p>Rather than change this file, I created separate config files in <code>lua/plugins/</code> directory. Each new file contains a line that can disable the configuration</p> <p>Instruct Neovim to ignore config</p> <p>Add the following to the start of a configuration file to return an empty table, {}, ignoring any other configuration in that file.</p> <pre><code>if true then return {} end -- WARN: REMOVE THIS LINE TO ACTIVATE THIS FILE\n</code></pre>","tags":["neovim","astronvim","git"]},{"location":"its-april-fool/#practicallilua","title":"practicalli.lua","text":"<p>Configuration that contains my own personal preferences, which can easily be disabled by removing the comment on the <code>if</code> statement line.</p> <ul> <li>add custom practicalli logo for startup</li> <li>add better-escape with <code>fd</code> key binding, <code>jk</code> is the AstroNvim default</li> </ul>","tags":["neovim","astronvim","git"]},{"location":"its-april-fool/#lsp-conflict","title":"LSP conflict","text":"<p>When initially enabling the <code>plugins/user.lua</code> configuration, the Noice plugin added via an AstroNvim Community import in <code>lua/community.lua</code> started reporting a conflict error.</p> <p>LSP signature help conflict reported by noice plugin</p> <pre><code>`vim.lsp.handlers[\"textDocument/signatureHelp\"]` has been overwritten by another plugin?\n\n Either disable the other plugin or set `config.lsp.signature.enabled = false` in your **Noice** config.\n - plugin: nvim\n - file: /tmp/.mount_nvimRUiD7m/usr/share/nvim/runtime/lua/vim/lsp.lua\n - line: 2318\n</code></pre> <p>The root of the conflict was the Discord \"andweeb/presence.nvim\" plugin, which included configuration to set a lsp handler</p> <p>Presence plugin sets LSP signature help</p> lua/plugins/user.lua<pre><code> \"andweeb/presence.nvim\",\n {\n \"ray-x/lsp_signature.nvim\",\n event = \"BufRead\",\n config = function() require(\"lsp_signature\").setup() end,\n },\n</code></pre> <p>The Discord plugin is not required so the plugin configuration was commented in <code>lua/plugins/user.lua</code></p> <p>Should both plugins been needed, then the Noice plugin warning can be managed by disabling its LSP signature</p> <p>Disable Noice LSP Signature</p> <pre><code> {\n \"folke/noice.nvim\",\n event = \"VeryLazy\",\n dependencies = { \"MunifTanjim/nui.nvim\" },\n opts = function(_, opts)\n local utils = require \"astrocore\"\n return utils.extend_tbl(opts, {\n lsp = {\n -- override markdown rendering so that **cmp** and other plugins use **Treesitter**\n override = {\n [\"vim.lsp.util.convert_input_to_markdown_lines\"] = true,\n [\"vim.lsp.util.stylize_markdown\"] = true,\n [\"cmp.entry.get_documentation\"] = true,\n },\n -- config.lsp.signature.enabled = false\n -- signature = {\n -- enabled = false,\n -- },\n },\n presets = {\n bottom_search = true, -- use a classic bottom cmdline for search\n command_palette = true, -- position the cmdline and popupmenu together\n long_message_to_split = true, -- long messages will be sent to a split\n inc_rename = utils.is_available \"inc-rename.nvim\", -- enables an input dialog for inc-rename.nvim\n lsp_doc_border = true, -- add a border to hover docs and signature help\n },\n })\n end,\n },\n</code></pre>","tags":["neovim","astronvim","git"]},{"location":"its-april-fool/#neovim-options","title":"Neovim options","text":"<p>Space u w to toggle text wrap, which I find useful for Markdown and other content file types.</p> <p>Vim options set in astrocore plugin</p> <p>Set <code>wrap</code> to true in <code>lua/plugins/astrocore.lua</code> lua/plugins/astrocore.lua<pre><code> -- vim options can be configured here\n options = {\n opt = { -- vim.opt.<key>\n relativenumber = true, -- sets vim.opt.relativenumber\n number = true, -- sets vim.opt.number\n spell = true, -- sets vim.opt.spell\n signcolumn = \"auto\", -- sets vim.opt.signcolumn to auto\n wrap = true, -- sets vim.opt.wrap\n guifont = \"Fira Code:h16\", -- neovide font family & size\n },\n</code></pre></p>","tags":["neovim","astronvim","git"]},{"location":"its-april-fool/#neo-tree-config","title":"Neo-tree config","text":"<p><code>H</code> in Neotree to toggle hidden files and directories</p> <p>Looking at the Neo-tree config examples, hidden files can be configured to show in the tree view using a different style, e.g a very subtle colour</p> Configure Neo-tree hidden files <p>A configuration to try <pre><code>return {\n \"nvim-neo-tree/neo-tree.nvim\",\n config = function ()\n require(\"neo-tree\").setup({\n filesystem = {\n filtered_items = {\n visible = true, -- when true, they will just be displayed differently than normal items\n hide_dotfiles = false,\n hide_gitignored = true,\n hide_hidden = true, -- only works on Windows for hidden files/directories\n hide_by_name = {\n --\"node_modules\"\n },\n hide_by_pattern = { -- uses glob style patterns\n --\"*.meta\",\n --\"*/src/*/tsconfig.json\",\n },\n always_show = { -- remains visible even if other settings would normally hide it\n --\".gitignored\",\n },\n never_show = { -- remains hidden even if visible is toggled to true, this overrides always_show\n --\".DS_Store\",\n --\"thumbs.db\"\n },\n never_show_by_pattern = { -- uses glob style patterns\n --\".null-ls_*\",\n },\n },\n },\n })\n end\n}\n</code></pre></p>","tags":["neovim","astronvim","git"]},{"location":"its-april-fool/#ssh-key-and-yubikey","title":"SSH key and YubiKey","text":"<p>Use the ,,, key type to create an SSH key pair that will be resident on a FIDO2 supporting hardware key, e.g. a recent YubiKey</p> <p>Generate a FIDO2 Compliant resident key</p> <pre><code>ssh-keygen -t ed25519-sk -O resident -C \"email-name@domain.com\"\n</code></pre> <p><code>-O resident</code> indicates the key should be stored on the FIDO authenticator.</p> <p>Resident key is easier to import to a new computer as they can be loaded directly from the hardware security key using <code>ssh-add -K</code> or <code>ssh-keygen -K</code>.</p> <p><code>-K</code> option loads resident keys from a FIDO authenticator.</p> <p>For ssh-add, resident keys are downloaded from a FIDO authenticator. Public and private key files are written to the current directory for each downloaded key. If multiple FIDO authenticators are attached, keys will be downloaded from the first touched authenticator. See the FIDO AUTHENTICATOR section for more information.</p> <p>TODO: Review wich YubiKey variants are FIDO2 compatible</p> <p>Thank you.</p> <p> Practical.li Website</p> <p> Practical.li GitHub Org practicalli-johnny profile</p> <p> @practicalli@clj.social @practical_li</p>","tags":["neovim","astronvim","git"]},{"location":"warmer-weather/","title":"Warmer weather","text":"<p>Practicalli AstroNvim User Config changed to be as additive as possible, leaving the template as unchanged as possible.</p> <p>The sunnier weather is a boots to motivation, although its still very windy. At least I can get into the garden without sinking.</p> <p>Another Saturday morning ride, a tough experience although not completely exhausted afterward.</p>","tags":["clojure","neovim","astronvim"]},{"location":"warmer-weather/#astronvim-example-config","title":"AstroNvim example config","text":"<p>A really nice addition to AstroNvim 4 is the use of a conditional check at the start of configuration files. This conditional check provides a simple way to disable or activate the configuration in a specific file.</p> <p>Rather than significantly edit the existing AstroNvim template configuration, additional files in <code>lua/plugins/</code> can be added and easily enabled or disabled, making the configuration more widely usable.</p> <p>By avoiding changes to the original template configuration, it is far simpler to update the Practicalli AstroNvim User Config with enhancements from the AstroNvim template.</p> <p>Activate configuration statement</p> <pre><code>if true then return {} end -- WARN: REMOVE THIS LINE TO ACTIVATE THIS FILE\n</code></pre> Add or Override Plugin and configuration lua/plugins/example-config.lua<pre><code>return {\n {\n \"domain/project-name\",\n -- lazy = true, -- true: load at startup, false: load on filetype\n filetype = { \"language\", \"*.fileextension\" },\n dependencies = {\n \"AstroNvim/astrocore\",\n opts = {\n options = {\n -- configure general options: vim.opt.<key>\n g = {\n -- configure global vim variables: vim.g\n },\n },\n mappings = {\n n = {\n -- normal mode key bindings\n -- setting a mapping to false will disable it\n -- [\"<esc>\"] = false,\n },\n t = {\n -- terminal? mode key bindings\n },\n v = {\n -- visual mode key bindings\n },\n },\n },\n },\n },\n}\n</code></pre>","tags":["clojure","neovim","astronvim"]},{"location":"warmer-weather/#astronvim-clojure-config","title":"AstroNvim Clojure config","text":"<p><code>nvim-treesitter-sexp</code> neovim plugin is a lua rewrite of the commonly used vim-sexp vim plugin.</p> <p><code>nvim-treesitter-sexp</code> is easier to configure with the lazy package manager.</p> <p>Default key map is provided with the <code>nvim-treesitter-sexp</code>, although keys can be disabled using the <code>ops = {keymaps = {commands = {command_name = false,}}}</code>. I tried providing alternative key mappings using this section but that did not seem to work.</p> <p>Using the standard approach to key maps worked well, so a set of alternate key maps were provided.</p> Alternative SPC k key map for nvim-treesitter-sexp <pre><code> {\n \"PaterJason/nvim-treesitter-sexp\",\n filetype = [\"clojure\"],\n dependencies = {\n \"AstroNvim/astrocore\",\n opts = {\n mappings = {\n n = {\n -- Additional Which-key key bindings for nvim-treesitter-sexp\n [\"<leader>k\"] = { name = \"Structural Editing\" },\n [\"<leader>kE\"] = { \"<cmd>TSSexp swap_prev_elem<cr>\", desc = \"Swap Previous Element\" },\n [\"<leader>ke\"] = { \"<cmd>TSSexp swap_next_elem<cr>\", desc = \"Swap Previous Element\" },\n [\"<leader>kF\"] = { \"<cmd>TSSexp swap_prev_form<cr>\", desc = \"Swap Previous Form\" },\n [\"<leader>kf\"] = { \"<cmd>TSSexp swap_next_form<cr>\", desc = \"Swap Previous Form\" },\n [\"<leader>kk\"] = { \"<cmd>TSSexp promote_elem<cr>\", desc = \"Promote Element\" },\n [\"<leader>kr\"] = { \"<cmd>TSSexp promote_form<cr>\", desc = \"Promote Form\" },\n [\"<leader>k@\"] = { \"<cmd>TSSexp splice<cr>\", desc = \"Splice\" },\n [\"<leader>kS\"] = { \"<cmd>TSSexp slurp_left<cr>\", desc = \"Slurp Left\" },\n [\"<leader>ks\"] = { \"<cmd>TSSexp slurp_right<cr>\", desc = \"Slurp Right\" },\n [\"<leader>kB\"] = { \"<cmd>TSSexp barf_left<cr>\", desc = \"Barf Left\" },\n [\"<leader>kb\"] = { \"<cmd>TSSexp barf_right<cr>\", desc = \"Barf Right\" },\n [\"<leader>kI\"] = { \"<cmd>TSSexp barf_right<cr>\", desc = \"Insert Head\" },\n [\"<leader>ki\"] = { \"<cmd>TSSexp barf_right<cr>\", desc = \"Insert Tail\" },\n },\n t = {\n -- terminal? mode key bindings\n },\n v = {\n -- visual mode key bindings\n },\n },\n },\n },\n },\n</code></pre> <p>Using a common Space k menu for they key bindings simplifies the discovery of commands.</p> <p>nvim-treesitter-sexp config with alternate key mappings</p> lua/plugins/clojure.clj<pre><code> {\n \"PaterJason/nvim-treesitter-sexp\",\n filetype = lisp_dialects,\n dependencies = {\n \"AstroNvim/astrocore\",\n opts = {\n -- configuration:\n -- https://github.com/PaterJason/nvim-treesitter-sexp#configuration\n enabled = false,\n -- -- Set to false to disable individual keymaps\n set_cursor = true,\n -- keymaps = {\n -- Default key bindings - set to false to disable\n -- commands = {\n -- swap_prev_elem = \"<e\",\n -- swap_next_elem = \">e\",\n -- swap_prev_form = \"<f\",\n -- swap_next_form = \">f\",\n -- promote_elem = \"<LocalLeader>O\",\n -- promote_form = \"<LocalLeader>o\",\n -- splice = \"<LocalLeader>@\",\n -- slurp_left = \"<(\",\n -- slurp_right = \">)\",\n -- barf_left = \">(\",\n -- barf_right = \"<)\",\n -- insert_head = \"<I\",\n -- insert_tail = \">I\",\n -- },\n -- motions = {\n -- form_start = \"(\",\n -- form_end = \")\",\n -- prev_elem = \"[e\",\n -- next_elem = \"]e\",\n -- prev_elem_end = \"[E\",\n -- next_elem_end = \"]E\",\n -- prev_top_level = \"[[\",\n -- next_top_level = \"]]\",\n -- },\n -- textobjects = {\n -- inner_elem = \"ie\",\n -- outer_elem = \"ae\",\n -- inner_form = \"if\",\n -- outer_form = \"af\",\n -- inner_top_level = \"iF\",\n -- outer_top_level = \"aF\",\n -- },\n -- },\n options = {\n g = {},\n },\n mappings = {\n n = {\n -- Additional Which-key key bindings for nvim-treesitter-sexp\n [\"<leader>k\"] = { name = \"Structural Editing\" },\n [\"<leader>kE\"] = { \"<cmd>TSSexp swap_prev_elem<cr>\", desc = \"Swap Previous Element\" },\n [\"<leader>ke\"] = { \"<cmd>TSSexp swap_next_elem<cr>\", desc = \"Swap Previous Element\" },\n [\"<leader>kF\"] = { \"<cmd>TSSexp swap_prev_form<cr>\", desc = \"Swap Previous Form\" },\n [\"<leader>kf\"] = { \"<cmd>TSSexp swap_next_form<cr>\", desc = \"Swap Previous Form\" },\n [\"<leader>kk\"] = { \"<cmd>TSSexp promote_elem<cr>\", desc = \"Promote Element\" },\n [\"<leader>kr\"] = { \"<cmd>TSSexp promote_form<cr>\", desc = \"Promote Form\" },\n [\"<leader>k@\"] = { \"<cmd>TSSexp splice<cr>\", desc = \"Splice\" },\n [\"<leader>kS\"] = { \"<cmd>TSSexp slurp_left<cr>\", desc = \"Slurp Left\" },\n [\"<leader>ks\"] = { \"<cmd>TSSexp slurp_right<cr>\", desc = \"Slurp Right\" },\n [\"<leader>kB\"] = { \"<cmd>TSSexp barf_left<cr>\", desc = \"Barf Left\" },\n [\"<leader>kb\"] = { \"<cmd>TSSexp barf_right<cr>\", desc = \"Barf Right\" },\n [\"<leader>kI\"] = { \"<cmd>TSSexp barf_right<cr>\", desc = \"Insert Head\" },\n [\"<leader>ki\"] = { \"<cmd>TSSexp barf_right<cr>\", desc = \"Insert Tail\" },\n },\n t = {\n -- terminal? mode key bindings\n },\n v = {\n -- visual mode key bindings\n },\n },\n },\n },\n },\n</code></pre> <p>Thank you.</p> <p> Practical.li Website</p> <p> Practical.li GitHub Org practicalli-johnny profile</p> <p> @practicalli@clj.social @practical_li</p>","tags":["clojure","neovim","astronvim"]},{"location":"practicalli-project-template-updates/","title":"Practicalli Project Template updates","text":"<p>Adding some nice little improvements to the Practicalli Project Templates</p>","tags":["clojure"]},{"location":"practicalli-project-template-updates/#practicalli-project-template","title":"Practicalli Project template","text":"<p>Noticed an issue was raised that highlighted the docker caching was not correct. Initially it seemed I was not using an appropriate alias to cache the project aliases.</p> <p>Revised command to Prepare library dependencies</p> <pre><code>clojure -P && clojure -P -X:build\n</code></pre> <p>After adding a revised command, there were still dependencies being downloaded during the <code>make dist</code> phase, where tools.built creates the uberjar.</p>","tags":["clojure"]},{"location":"practicalli-project-template-updates/#neovim","title":"Neovim","text":"<p>Update shell aliases for the new AstroNvim 4 configuration.</p> <p><code>astro4</code> added whist testing the new version of AstroNvim.</p> <p><code>astro</code> changed to point to new AstroNvim version 4 user configuration by Practicalli once it was functionally comparable to AstroNvim version 3 user config by Practicalli.</p> <p>Example</p> <pre><code># ------------------------------------------\n# Neovim Aliases for multiple configurations\nalias astro=\"NVIM_APPNAME=astronvim nvim\"\nalias astro4=\"NVIM_APPNAME=astronvim4 nvim\"\nalias astro=\"NVIM_APPNAME=astronvim4 nvim\"\nalias astrotemplate=\"NVIM_APPNAME=astronvim-template nvim\"\nalias kickstart=\"NVIM_APPNAME=kickstart-nvim nvim\"\nalias cajus=\"NVIM_APPNAME=cajus nvim\"\nalias neovim-config=\"NVIM_APPNAME=neovim-config nvim\"\n\n# Neovide alias with AstroNvim configuration\nalias neovide=\"NVIM_APPNAME=astronvim neovide\"\nalias neovide=\"NVIM_APPNAME=astronvim4 neovide\"\n# ------------------------------------------\n</code></pre> <p>Thank you.</p> <p> Practical.li Website</p> <p> Practical.li GitHub Org practicalli-johnny profile</p> <p> @practicalli@clj.social @practical_li</p>","tags":["clojure"]},{"location":"500-commit-streak-on-github/","title":"500 Commit Streak on GitHub","text":"<p>500 day commit streak on GitHub reached today. This was legitimately achieved by doing a small amount of work each day.</p> <p>I am not actively coding and committing on a regular basis in my current role, so the large majority of these commits are for Practicalli or Open Source projects.</p> <p></p> <p>Continuing to simplify the Practicalli AstroNvim User Config, so changes from the AstroNvim template are in new files or in <code>community.lua</code>.</p> <p>The most visual opinionated changes are in <code>practicalli.lua</code>, such as dashboard logo and theme.</p> <p>Motivated to work on the Practicalli Sustainable Life book after joining a sustainability working group at the company.</p>","tags":["clojure"]},{"location":"500-commit-streak-on-github/#neovim","title":"Neovim","text":"<p> Practicalli User Config theme changes have been moved from <code>lua/plugins/astroui.lua</code> to <code>practicalli.lua</code> to minimise changes from the original AstroNvim template repository.</p> <p>Minimising changes in the AstroNvim template simplifies merging updates from the AstroNvim template repository, which are more likely due to AstroNvim 4 release being relatively recent.</p> <p>Using separate files where possible also allows everyone to easily customise their experience when using Practicalli User Config. By adding or removing a comment from the <code>if</code> statement, the specific configuration file can be included or excluded when Neovim loads the configuration.</p> <p>By essentially toggling one line in each file, a very minimal change is made and again makes merging changes between Practicalli configuration and anyone else configure much simpler.</p> <p>Comment if statement to include the configuration in the file</p> <pre><code>-- if true then return {} end -- WARN: REMOVE THIS LINE TO ACTIVATE THIS FILE\n</code></pre>","tags":["clojure"]},{"location":"500-commit-streak-on-github/#sustainability","title":"Sustainability","text":"<p>Joined a sustainability group within the company and will be co-chairing the group.</p> <p>Making milk from Hemp Seeds today, delicious. Reminds me I should update the : Practicalli Sustainable Life book to MkDocs and add a lot more content.</p> <p>My life is more sustainable that the average persons, although there is always more I can adapt to.</p> <p>Joining the group via work I can share my personal experiences with others to inspire them. I also aim to learn more about larger scoped initiatives and how the company can influence our potential partners and customers.</p>","tags":["clojure"]},{"location":"500-commit-streak-on-github/#well-being","title":"Well-being","text":"<p>Exercise through gardening. Digging up weeds in the garden so vegetables can be grown without interference.</p> <p>Planning wellness activities for the company off-site. Cycling along the coast on the first day and yoga on the second day.</p> <p>Saturday ride with the local cycling club. Lead a group of people along a 74km route with 1,018 meter hill climbing. First time up the large hill along Exedown road, which peaked at 17% on a sharp bend. No wonder I was quite tired by the end.</p> <p>Ordered a very large bag of sand so I could level the patio flag stones at the end of the garden. I'll be doing some planning to figure out how to level all the flag stones without having to keep moving the shed around.</p> <p>Thank you.</p> <p> Practical.li Website</p> <p> Practical.li GitHub Org practicalli-johnny profile</p> <p> @practicalli@clj.social @practical_li</p>","tags":["clojure"]},{"location":"http-message-signing-investigation/","title":"HTTP Message Signing investigation","text":"<p>API Security is typically managed by issuing a token for authentication. Only requests that include a valid token are processed, any requests with an expired or missing token are rejected. HTTP code 401 Unauthorised error message is returned for rejected requests.</p> <p>When dealing with very sensitive data and higher risk actions common in financial services, additional security mechanisms are required. So I have been looking at mTLS and HTTP Message Signatures (RFC9421) this week.</p> <p>Not going to be a productive week as I am full of flu. Given the time of year its most likely a variant of Covid. So far I've only had a headache, congested chest / nose / ears and some fatigue. Taking lots of paracetamol and drinking lots of water to try keep the inflammation at bay.</p> <p>Edit: I was mostly okay by the weekend, although still had a sore throat and coughing.</p>","tags":["clojure"]},{"location":"http-message-signing-investigation/#http-message-signatures","title":"HTTP Message Signatures","text":"<p>Investigating how to implements RFC9421 HTTP Message Signatures using Clojure.</p> <p>One aspect is choosing an algorithm for the private public key pair used to sign and validate a message. The ED25519 algorithm is recommended by GitHub for creating private public SSH keys to access their service. This seems a reasonable choice for HTTP Message Signatures.</p> <p>ED25519 is recommended as the safe choice for signing as it is a fast and efficient algorithm and has does not have the challenges of earlier algorithms.</p> <p>A Clojure library for comparing an ED25519 signature against a public key would reduce the work required to check a signed HTTP message is valid.</p> <p>If there are no other interesting libraries for validating signatures, then Bouncy Castle is a well known Java implementation and has some Clojure wrappers.</p>","tags":["clojure"]},{"location":"http-message-signing-investigation/#wellbeing","title":"Wellbeing","text":"<p>Managed a cycle ride with the local club on Saturday, was pushing hard to shake the last of the flu symptoms. I may have pushed a little too hard as I was exhausted for the rest of the weekend.</p> <p>Thank you.</p> <p> Practical.li Website</p> <p> Practical.li GitHub Org practicalli-johnny profile</p> <p> @practicalli@clj.social @practical_li</p>","tags":["clojure"]},{"location":"tetris-and-the-fall-of-the-ussr-and-neovim-conjure-menu/","title":"Tetris and the fall of the USSR (and Neovim Conjure menu)","text":"<p>Enjoyed watching the Tetris movie and wondered just how much was real and dramatised. Reading the background to the game it does seem the main thread of the movie is accurate, with perhaps some additional dramatic effect. It was a very enjoyable movie regardless.</p> <p>I do remember the break-up of the USSR when it happened, first with Gorbachev as leader and then Boris Yeltsin. Then the Oligarchs (super rich) moved in and supported a more draconian leader in Putin (assumingly so they could keep hold of all their money).</p> <p>I also remember Robert Maxwell as a disgraced billionaire that stole from his own company and mysteriously vanished from his luxury yacht.</p>","tags":["clojure","neovim"]},{"location":"tetris-and-the-fall-of-the-ussr-and-neovim-conjure-menu/#how-much-clojure-needs-to-be-known","title":"How much Clojure needs to be known","text":"<p>A person is joining my team and it leads to wondering what they should feel comfortable in regards Clojure and how best I can support them.</p> <p>I'm starting to identifying aspects of Clojure that would be beneficial to know well (not having to look them up), e.g. collections, sequences, map and reduce transformations, etc. The Clojure Cheatsheet provides a simple way to categorise the topics and functions of Clojure core namespace.</p> <p>Which parts of the Clojure Standard Library would be useful, e.g. clojure.spec.alpha, clojure.data.json, etc.</p>","tags":["clojure","neovim"]},{"location":"tetris-and-the-fall-of-the-ussr-and-neovim-conjure-menu/#neovim","title":"Neovim","text":"<p>Conjure may show an \"unknown REPL environment\" in the REPL log buffer when starting a new REPL session. This is usually a timeout in detecting the REPL due to its startup being a little overloaded.</p> <p><code>, s l</code> lists the current REPL sessions in the REPL log buffer.</p> <p>Conjure FAQ: unknown REPL environment</p> <p>Conjure does not provide names for the sub-menus the conjure commands are organised into. For example <code><localleader>e</code> has a group of key bindings related to evaluation, although when shown in which-key the <code><localleader>e</code> has the default label of prefix and is not very helpful.</p> <p>It was suggested in ticket # that Conjure add names for these groups. The project maintainer preferred to have these added to a personal Neovim configuration.</p> <p>Initially group names were added in the <code>lua/plugins/user-practicalli.lua</code> configuration, however, this meant that the names showed up regardless of the filetype of the current buffer. So if viewing a Lua file, the Conjure menu would still show.</p> <p>The <code>after/ftplugin/</code> directory is used to add filetype specific configuration, loaded each time a new filetype is switched too.</p> <p>The Conjure group names were moved to <code>after/ftplugin/clojure.lua</code> and now they only appear when the buffer is a <code>clojure</code> filetype, e.g. a <code>.clj</code>, <code>.cljs</code>, <code>.edn</code> file</p> <p>Practicalli Astro config - Clojure filetype plugin</p> after/ftplugin/clojure.lua<pre><code>-- Load after clojure filetype set\n\nlocal whichkey = require \"which-key\"\n\nreturn {\n {\n \"folke/which-key.nvim\",\n -- Load Conjure Groups only for Clojure filetypes\n whichkey.add {\n -- Conjure sub-menus\n { \"<LocalLeader>c\", group = \"Connect\" },\n { \"<LocalLeader>e\", group = \"Evaluate\" },\n { \"<LocalLeader>ec\", group = \"Comment\" },\n { \"<LocalLeader>g\", group = \"Go\" },\n { \"<LocalLeader>l\", group = \"Log\" },\n { \"<LocalLeader>r\", group = \"Refresh\" },\n { \"<LocalLeader>s\", group = \"Session\" },\n { \"<LocalLeader>t\", group = \"Test\" },\n { \"<LocalLeader>v\", group = \"Values\" },\n },\n },\n}\n</code></pre> <p>Thank you.</p> <p> Practical.li Website</p> <p> Practical.li GitHub Org practicalli-johnny profile</p> <p> @practicalli@clj.social @practical_li</p>","tags":["clojure","neovim"]},{"location":"clojure-specific-which-key-menu/","title":"Clojure specific Which-key menu","text":"<p>Whilst looking for a Neovim way to have language specific configuration, I discovered the <code>after/ftplugin</code> approach. This allows a configuration to be loaded when a buffer is switched to a specific language.</p> <p>Having used Spacemacs (Emacs) for many years I was used to having language mode specific menus, e.g. Clojure has many cider which-key bindings available which are defined in the Clojure major mode.</p> <p>I was curious how I could also do this with Neovim.</p> <p>Whist <code>autocmd</code> definitions can be used for filetype specific actions, there is also a seemingly simpler approach using configuration in <code>after/ftplugin/</code> directory, i.e. <code>after/ftplugin/clojure.lua</code> for the Clojure filetypes.</p> <p>The <code>after/ftplugin</code> approach is used to add meaningful names to the Conjure menus that display when pressing the local leader <code>,</code> to help with discoverability of commands.</p> after/ftplugin/clojure.lua<pre><code>-- Loaded after clojure filetype set in buffer\n\nlocal whichkey = require \"which-key\"\n\nreturn {\n {\n \"folke/which-key.nvim\",\n -- Load Conjure Groups only for Clojure filetypes\n whichkey.add {\n -- Conjure sub-menus\n { \"<LocalLeader>c\", group = \"Connect\" },\n { \"<LocalLeader>e\", group = \"Evaluate\" },\n { \"<LocalLeader>ec\", group = \"Comment\" },\n { \"<LocalLeader>g\", group = \"Go\" },\n { \"<LocalLeader>l\", group = \"Log\" },\n { \"<LocalLeader>r\", group = \"Refresh\" },\n { \"<LocalLeader>s\", group = \"Session\" },\n { \"<LocalLeader>t\", group = \"Test\" },\n { \"<LocalLeader>v\", group = \"Values\" },\n },\n },\n}\n</code></pre> <p>This should only show the menu when using the <code>localleader</code> when the current buffer is <code>clojure</code> filetype. It seems to work so far...</p> <p>Thank you.</p> <p> Practical.li Website</p> <p> Practical.li GitHub Org practicalli-johnny profile</p> <p> @practicalli@clj.social @practical_li</p>","tags":["neovim"]},{"location":"long-cold-winter/","title":"Long Cold Winter","text":"<p>Converted some audio files to Opus codec, which provides a really optimum compression and allows for relatively low bit rates and results in much smaller files with the same quality.</p> <p>Neovim upcoming changes</p> <ul> <li>neovim 0.11 has some breaking changes, so assume early in 2025</li> <li>astronvim v5 once neovim 0.11 released</li> <li> mason-tool-installer.nvim to simplify mason config in astronvim v5 - discussed in Atronvim Discord community. maston-tool-installer still uses the mason registry for tool versions.</li> </ul> <p>Starting to update my CV from recent commercial experiences, focusing on the areas of product, delivery and people.</p>","tags":["neovim","mason","codec","opus"]},{"location":"long-cold-winter/#neovim-and-clojure-lsp","title":"Neovim and Clojure LSP","text":"<p>Mason manages the installation of LSP servers, format and lint tools for Neovim.</p> <p>There is a Renovate GitHub App that keeps source code dependencies up to date. Mason registry uses renovate to bump its config to use the latest releases of each tool.</p> <p> PR #7896 bumps Clojure LSP to lates release in the Mason Registry.</p> <p> PR #7896 bump Clojure LSP to lates release - Mason Registry</p>","tags":["neovim","mason","codec","opus"]},{"location":"long-cold-winter/#converting-audio-with-ffmpeg","title":"converting audio with ffmpeg","text":"<p>The Opus codec has excellent compression ability and music and spoken word can be encoded in a relatively low bit rate.</p> <p>128k variable bit rate encoding provides near transparent encoding. libopus uses variable bit rate by default.</p> <p>Opus recommended bit rates are:</p> <ul> <li>Music: 96 to 128k (I use 96k)</li> <li>Audiobooks: 32k</li> </ul> <p>I had some books that were already encoded at 96k bit rate. Converting them to 32k bit rate reduced the file size by a third without any noticeable drop in quality.</p> <p>Using zsh pattern matching allows for a very simple script to convert multiple files in the current directory, saving them in a separate <code>32k</code> directory (otherwise the script may have converted all the new opus files it created).</p> <p>Convert Opus encoded files to 32k bit rate</p> <pre><code>#!/usr/bin/zsh\n\n# Convert Opus audio files to 32k bitrate\n# zsh specific parsing of current directory\n# converted files saved in `32k` directory\n\nfor x in *.opus ; do\n ffmpeg -i \"$x\" -b:a 32k -c:a libopus \"32k/${x:r}\".opus\ndone\n</code></pre> <p>Convert raw WAV files to Opus 96k bit rate</p> <pre><code>#!/usr/bin/zsh\n\n# Convert wav files to 96k bit rate Opus encoded files\n# zsh specific parsing of current directory\n\nfor x in *.wav ; do\n ffmpeg -i \"$x\" -b:a 96k -c:a libopus \"${x:r}\".opus\ndone\n</code></pre>","tags":["neovim","mason","codec","opus"]},{"location":"long-cold-winter/#book-list","title":"Book List","text":"<p>I have time to read and reread some of the physical books before I dispatch them to one of the book buying companies for a second chance at life.</p> <ul> <li>The Goal - Goldratt</li> <li>Critical Path - Goldratt</li> <li>Its Not Luck - Goldratt</li> <li>The Mythical Man Month (20th anniversary edition) - Fred Brooks</li> <li>Death March - Yourdon</li> <li>Agile Retrospectives (there is a 2nd edition to read)</li> </ul>","tags":["neovim","mason","codec","opus"]},{"location":"long-cold-winter/#notes-for-updating-my-cv","title":"Notes for updating my CV","text":"<p>Its time to update my CV based on the experiences of my last commercial engagement.</p> <p>Some advice from a trusted recruiter is to organise the experiences around Product, Delivery and People. This seems a sensible approach and should help me explore and communicate my experiences in a meaningful way.</p> <p>Product:</p> <ul> <li>working with product manager on priorities</li> <li>wrote pitches with a technical focus</li> <li>reviewed and where necessary refactor the pitch for engineers to consume</li> </ul> <p>Pitches could grow quite significantly during discovery, which could evolve over many months.</p> <p>Delivery:</p> <ul> <li>enhanced our ways of working, regular retrospectives,</li> <li>definition of DONE</li> <li>clearly defined milestones / Epics to know when</li> <li>UAT baked in often and early</li> <li> </li> </ul> <p>People:</p> <ul> <li>regular 1-2-1 sessions with notes, ensuring people felt safe to communicate their concerns</li> <li>empathising and sharing similar experiences</li> <li>career progression - mentored 3 of the team to promotion within the year, with a 4th to be promoted by moving to a more appropriate team (via a 4 month transition)</li> </ul>","tags":["neovim","mason","codec","opus"]},{"location":"long-cold-winter/#time-scoped-work-to-minimise-scope-creep-and-keep-focus-on-the-essentials","title":"time scoped work to minimise scope creep and keep focus on the essentials","text":"","tags":["neovim","mason","codec","opus"]},{"location":"long-cold-winter/#one-2-ones","title":"One 2 Ones","text":"<p>The 1-2-1 is a tool to build a trusted relationship between two people. There can be many challenges along the way and people need a way to discuss issues and feelings in a safe space.</p> <p>If one person is in positional power (or perceived that way), they should take extra care to be transparent and</p> <p>The first 1-2-1 session should establishing the expectations of each person involved regarding this type of meeting. These expectations may evolve over time, so should be regularly revisited.</p> <p>A checklist for the first meeting:</p> <ul> <li>capture expectations</li> <li>discuss preferences on meeting frequency</li> <li>establish note taking as a valuable practice</li> <li>start to capture specific actions and who note who is responsible for completing those actions</li> <li>start to establish trust</li> </ul> <p>1-2-1 aims:</p> <ul> <li>building an relationship with each person on the team</li> <li>encouraged them to make head space for challenges they faced and thinking how they could alleviate them</li> </ul> <p>One to One meeting - Practicalli Engineering Playbook</p>","tags":["neovim","mason","codec","opus"]},{"location":"long-cold-winter/#career-progression","title":"Career progression","text":"<p>If you believe you are ready and everyone already considers you at the next level, then it should be trivial to convey to management that a promotion is due.</p> <p>A bragging document is a self-organised history of achievements during work. The primary purpose is to identify if there are gaps that could be addressed that would prevent a promotion.</p>","tags":["neovim","mason","codec","opus"]},{"location":"long-cold-winter/#retrospective-notes","title":"Retrospective notes","text":"<p>Every team and every individual has the potential to enhance how they work</p> <p>Potential Purpose Goal</p> <p>Dont have to improve constantly, but a continual review of the situation (situational awareness) is important for growth</p> <p>Data points - automated processes - are they causing a constraint - do we understand how they work - are there optimisations that could be made - testing - is the test run time a constraint / blocker - can tests be continually run (watch for changes in specific tests or logical parts of the code base) - does test run time deter tests from always running</p> <ul> <li>was the current work more or less challenging than expected () - careful this doents get into a time aspect</li> </ul> <p>What we did well / should do more of - what makes us successful already - what helps us build on more success</p> <p>What didnt work so well / should do less of or stop - what slows us down or prevents success - do we know why we are doing these things (motivation / drivers)</p> <p>Thank you.</p> <p> Practical.li Website</p> <p> Practical.li GitHub Org practicalli-johnny profile</p> <p> @practicalli@clj.social @practical_li</p>","tags":["neovim","mason","codec","opus"]},{"location":"what-is-past-is-prologue/","title":"What is past is prologue","text":"<p>Quote</p> <p>If a technology was truly dead, no one would feel the need to talk about it on the internet</p>","tags":["leadership","appimage","debian","hyprland"]},{"location":"what-is-past-is-prologue/#dead-is-mainstream","title":"Dead is mainstream","text":"<p>When people state that some technology or practice is dead via the internet, it typically means that thing is the mainstream.</p> <p>If something was truely dead, no one would feel the need to talk about it as that topic would not relate to anyone.</p> <p>This technique is essentially click-bate and trying to persuade you to 'buy-in' to something else (usually for the profit of aother person)</p>","tags":["leadership","appimage","debian","hyprland"]},{"location":"what-is-past-is-prologue/#appimage","title":"Appimage","text":"<p>AppImage is way to package software for Linux which provides a universal executable. They are created, in a file ending <code>.AppImage</code>. Neovim no longer includes a Debian package with each new release, however, an AppImage is part of each release.</p> <p>An Appimage can be downloaded and made executable and run directly from the command line. This is enabled by FUSE libraries</p> <p>Install Fuse 2 on Debian</p> <pre><code>apt install libfuse2t64\n</code></pre> <p>NOTE: earlier versions of the package are called <code>libfuse2</code></p>","tags":["leadership","appimage","debian","hyprland"]},{"location":"what-is-past-is-prologue/#future-tiling-window-manager","title":"Future Tiling Window Manager","text":"<p>I have been experimenting with hyprland recently and its very fast experience but requires a lot of configuration and building software for Debian systems.</p> <p>miracle-wm is a tiling Wayland window manager built on top of canonical/Mir (libraries for building Wayland based shells).</p> <p>Wayland has the promise of being more than desktop eye candy, but there is still a lot of development required for everyone to easily adopt it.</p> <p>Tiling managers like hyprland and miricle-wm should provide a very fast and efficient desktop experience but there is still some maturity to gain when compared to Gnome, KDE and Regolith desktops.</p> <p>Thank you.</p> <p> Practical.li Website</p> <p> Practical.li GitHub Org practicalli-johnny profile</p> <p> @practicalli@clj.social @practical_li</p>","tags":["leadership","appimage","debian","hyprland"]},{"location":"finding-my-joy/","title":"Finding My Joy","text":"<p>In season 2, episode 2 of \"The Big Door Prize\" they talk about \"Finding your Joy\". This seems like an inspiring new years resolution, or at least a theme I should focus on for 2025.</p> <p>You only live one life and you should take time out to enjoy it. There were many aspects to 2024 that constrained my joy, so I will endeavour to may 2025 a most joyous year.</p> <p>Practicalli Updates:</p> <ul> <li>Clojure Data Inspector tools - overview and portal page updated</li> </ul>","tags":["clojure"]},{"location":"finding-my-joy/#github-statistics","title":"GitHub statistics","text":"<p>Earlier in 2024 I deleted many outdated repositories on GitHub that were not worth keeping. However, this did take off over 600 contributions from my total.</p> <p>At the end of last week my GitHub contributions broke the 15,000 total again.</p> <p></p> <p>I use the statistics only as a simple motivator to do something every day. Most days it is a small task or updating the current journal entry to capture new things learned that day.</p> <p>Github tracker offers statistics about a repository. I believe this is a community website and not an official GitHub website (as the logo uses a lower case h)</p> <p>Github tracker for Practicalli Clojure repository</p> <p>At the end of the year I'll generate some yearly statistics from GitHub.</p>","tags":["clojure"]},{"location":"finding-my-joy/#talk-idea-communication-improbable","title":"Talk Idea - Communication Improbable","text":"<p>A talk idea from many years ago, which seems very relevant today too.</p> <p>Talk Title: Communication Improbable</p> <p>Description:</p> <p>Given all the information we filter out and pass through our cognitive biases, its amazing we take notice of anyone. \u00a0 Covering why communication is such a monumental challenge, we give tangible practices & tips to increase the effectiveness of communication to your audience (whoever that may be)</p> <p>Abstract:</p> <p>Communicating with anyone is a major challenge when even the simplest idea can be misunderstood.\u00a0 By telling the stories across common situations we will help you develop your skills at effectively communicating.</p> <p>In our DevRel roles we need to get our message across to audiences large and small on subjects narrow and wide.\u00a0 Underpinning all this communications is a level of trust, so without developing a trusted relationship you are much less likely to be heard.</p> <p>There is a delicate balance of enthusiasm and pragmatism when talking to the developer community (or any community that gets too much hype on a regular basis).\u00a0 The way we talk is interpreted many different ways by our audiences internal cognitive biases, so a great deal of empathy and emotional quotient is required to get your message across.</p> <p>Putting the challenges an practices together, you will be able to greatly improve the effectiveness of your communication across different audiences.</p> <p>Notes:</p> <p>I was lucky enough to present the basics of this talk with Jessica Rose at Twilio Signal conference \u00a0and Salesforce Dreamforce.\u00a0 We both received lots of great feedback and I have taken this talk further based on those ideas.\u00a0 I've also make the content more specifically around the challenges faced by those in the DevRel community.</p> <p>This could be a keynote talk or just a usual 30 minute talk.</p> <p>Thank you.</p> <p> Practical.li Website</p> <p> Practical.li GitHub Org practicalli-johnny profile</p> <p> @practicalli@clj.social @practical_li</p>","tags":["clojure"]},{"location":"holiday-stuffing/","title":"Holiday stuffing","text":"<p>Feeling a little sick so binging on movies and shows on Apple TV+. On Monday afternoon Apple TV+ would not stream content (the play button disappeared) although I could browse the catalogue of shows. After several hours the play button came back, although contacting Apple support was quite pointless.</p> <p></p> <p>A relaxing week trying out some new vegetarian and vegan meals. Pieminister Mooless Moo pie is a plant based stake and ale pie, using jackfruit for the stake pieces. The pastry was lovely and crispy and the pie was very filling. The only downside to the pie for me was it was the taste and texture was too much like beef and I've never really liked that even when I did eat meat.</p> <p>New potatoes, Edamame, Spinach and Garden Peas complement the pie, along with some very thick Bisto Best Vegetable Gravy (I add way too many granules to make the gravy nice and thick).</p>","tags":["emacs","neovim"]},{"location":"holiday-stuffing/#emacs","title":"Emacs","text":"<p>After reinstalling the operating system on a computer a few months ago and only just realised I had not installed Emacs. An interesting sign that I have become very comfortable with Neovim.</p> <p>Debian testing includes the latest 29.4 release of Emacs.</p> <p>I followed the Practicalli Spacemacs install guide and confirmed it was still up to date.</p> <p>Emacs package information</p> <pre><code>root@gkar:~# apt show emacs\nPackage: emacs\nVersion: 1:29.4+1-4\nPriority: optional\nSection: editors\nMaintainer: Rob Browning <rlb@defaultvalue.org>\nInstalled-Size: 54.3 kB\nDepends: emacs-gtk (>= 1:27.1) | emacs-pgtk (>= 1:27.1) | emacs-lucid (>= 1:27.1) | emacs-nox (>= 1:27.1)\nHomepage: https://www.gnu.org/software/emacs/\nTag: devel::editor, role::dummy, role::metapackage, role::program,\n suite::emacs, suite::gnu, use::editing\nDownload-Size: 18.5 kB\nAPT-Sources: http://deb.debian.org/debian trixie/main amd64 Packages\nDescription: GNU Emacs editor (metapackage)\n GNU Emacs is the extensible self-documenting text editor.\n This is a metapackage that will always depend on the latest\n recommended Emacs variant (currently emacs-gtk).\n</code></pre> <p>Install Emacs Debian package and dependencies</p> <pre><code>root@gkar:~# apt install emacs\nThe following packages were automatically installed and are no longer required:\n libpaper1 linux-image-6.11.7-amd64\nUse 'apt autoremove' to remove them.\n\nInstalling:\n emacs\n\nInstalling dependencies:\n emacs-bin-common emacs-el gsasl-common install-info libgsasl18 libm17n-0 libntlm0 libtree-sitter0 m17n-db mailutils-common\n emacs-common emacs-gtk guile-3.0-libs libgccjit0 libgssglue1 libmailutils9t64 libotf1 libwebpdecoder3 mailutils\n\nSuggested packages:\n emacs-common-non-dfsg emacs-editing-major-modes m17n-docs mailutils-mh mailutils-doc\n\nSummary:\n Upgrading: 0, Installing: 20, Removing: 0, Not Upgrading: 16\n Download size: 63.6 MB\n Space needed: 253 MB / 11.0 GB available\n</code></pre> <p>The Emacs package recommends other supporting packages</p> Emacs core documentation <pre><code>root@gkar:~# apt show emacs-common-non-dfsg\nPackage: emacs-common-non-dfsg\nVersion: 1:29.4+1-1\nPriority: optional\nSection: non-free/editors\nSource: emacs-non-dfsg\nMaintainer: Rob Browning <rlb@defaultvalue.org>\nInstalled-Size: 5,322 kB\nDepends: dpkg (>= 1.15.4) | install-info\nConflicts: emacs21-common-non-dfsg, emacs22-common-non-dfsg, emacs23-common-non-dfsg, emacs24-common-non-dfsg, emacs25-common-non-dfsg\nBreaks: texinfo-doc-nonfree (<< 6.1.0-1)\nReplaces: texinfo-doc-nonfree (<< 6.1.0-1)\nDownload-Size: 5,251 kB\nAPT-Sources: http://deb.debian.org/debian trixie/non-free amd64 Packages\nDescription: GNU Emacs common non-DFSG items, including the core documentation\n This package includes the core Emacs documentation: the Emacs Info\n pages, the Emacs Lisp Reference Manual, and the Emacs Lisp Intro.\n</code></pre> Emacs editing modes <pre><code>root@gkar:~# apt show emacs-editing-major-modes\nPackage: emacs-editing-major-modes\nVersion: 1.1\nPriority: optional\nSection: editors\nSource: emacs-addons-metapackages\nMaintainer: Debian Emacsen team <debian-emacsen@lists.debian.org>\nInstalled-Size: 10.2 kB\nRecommends: elpa-agda2-mode, elpa-apache-mode, elpa-ats2-mode, elpa-bazel-mode, elpa-bison-mode, elpa-bpftrace-mode, elpa-caml, elpa-clojure-mode, elpa-cmake-mode, elpa-csv-mode, elpa-dart-mode, elpa-debian-el, elpa-dockerfile-mode, elpa-dpkg-dev-el, elpa-elm-mode, elpa-fountain-mode, elpa-git-modes, elpa-gitlab-ci-mode, elpa-gnuplot-mode, elpa-go-mode, elpa-graphviz-dot-mode, elpa-haskell-mode, elpa-inform-mode, elpa-jinja2-mode, elpa-js2-mode, elpa-kivy-mode, elpa-kotlin-mode, elpa-lua-mode, elpa-markdown-mode, elpa-matlab-mode, elpa-meson-mode, elpa-muttrc-mode, elpa-nginx-mode, elpa-org, elpa-php-mode, elpa-pip-requirements, elpa-protobuf-mode, elpa-puppet-mode, elpa-qml-mode, elpa-racket-mode, elpa-rust-mode, elpa-scala-mode, elpa-sml-mode, elpa-systemd, elpa-vala-mode, elpa-web-mode, elpa-yaml-mode, gettext-el\nDownload-Size: 2,608 B\nAPT-Sources: http://deb.debian.org/debian trixie/main amd64 Packages\nDescription: All editing major modes for Emacs\n This is a metapackage that recommends all Emacs major modes including\n programming modes, configuration file modes, etc. Installing this\n package enables Emacs to handle most well-known file formats for\n file-editing, while also providing the flexibility for a user to\n choose which they do or do not need.\n</code></pre>","tags":["emacs","neovim"]},{"location":"holiday-stuffing/#practicalli-astro","title":"Practicalli Astro","text":"<p>The 2024-12-17 release included configuration to use a locally installed Clojure LSP server, rather than allow mason to manage the install.</p> <p>The Mason Registry was updated to use the latest Clojure LSP server version, via PR7896. Usually the versions are automatically updated via the renovate GitHub action, although this time the PR did not pass the tests so was not automatically merged.</p> <p>The maintainer updated and merged the PR manually.</p> <p>Practicalli Astro was updated to comment the configuration that was added to <code>lua/plugins/user-practicalli.lua</code> to use a local install of Clojure LSP.</p>","tags":["emacs","neovim"]},{"location":"holiday-stuffing/#debian-tracker","title":"Debian Tracker","text":"<p>Tracker service indexes many types of files to enable discovery of files by other Gnome services and applications.</p> <ul> <li>desktop search</li> <li>Tag database for keyword tagging</li> <li>Extensible metadata database to add custom metadata to files, e.g. rhythmbox, gedit, etc.</li> <li>Store First Class Objects and the Gnome 3.0 Model</li> </ul> <p>NOTE: when actively using Gnome desktop and Gnome apps, disabling the tracker may reduce functionality</p>","tags":["emacs","neovim"]},{"location":"holiday-stuffing/#disable-the-tracker-service","title":"Disable the tracker service","text":"<p>The tracker service can be a significant drain on computer resources as it indexes files, especially when there have been a log of changes or for a newly installed system.</p> <p>The tracker has many dependencies, so its not easy to remove the <code>tracker-miner-fs-3</code> package when actively using the Gnome desktop.</p> <p>The recommended approach is to edit the <code>.desktop</code> files and add <code>Hidden=true</code> at the end of each tracker related file and reboot the operating system.</p> /etc/xdg/autostart/tracker-miner-fs-3.desktop<pre><code>[Desktop Entry]\nName=Tracker File System Miner\nComment=Crawls and processes files on the file system\nExec=/usr/libexec/tracker-miner-fs-3\nTerminal=false\nType=Application\nCategories=Utility;\nX-GNOME-Autostart-enabled=false\nX-GNOME-HiddenUnderSystemd=false\n# X-KDE-autostart-after=panel\nX-KDE-StartupNotify=false\nX-KDE-UniqueApplet=true\nNoDisplay=true\nOnlyShowIn=GNOME;KDE;XFCE;X-IVI;Unity;\nX-systemd-skip=true\nHidden=true\n</code></pre> <p>If adding \"Hiddent=true\" is not sufficient, then disable the services for all users by setting them to <code>/dev/null</code> using the <code>systemctl</code> command.</p> <pre><code>sudo systemctl --global mask tracker-miner-fs-3.service\nsudo systemctl --global mask tracker-xdg-portal-3.service\n</code></pre> <p>Remove the database of indexed files from each user account on the system</p> <pre><code>rm -rf $HOME/.cache/tracker*\n</code></pre>","tags":["emacs","neovim"]},{"location":"holiday-stuffing/#movie-reviews-this-week","title":"Movie reviews this week","text":"","tags":["emacs","neovim"]},{"location":"holiday-stuffing/#luck-2022","title":"Luck - 2022","text":"<p>Luck is a fun animated film. Sam is a very unlucky human who meets a very cute and lucky black cat called Bob, voiced by Sean Pegg. I wish I was as lucky as Bob the cat.</p> <p>Sam feeds Bob some food and finds Bob's lucky penny.</p> <p>Includes a nod to the Japanese obsession with the cat.</p> <p>Bob was sent to Section A113 which is an easter egg referencing the class room number used for character animation students as the California Institute of the Arts, where some of the Pixar team used to study.</p> <p>Apple TV+</p>","tags":["emacs","neovim"]},{"location":"holiday-stuffing/#wolfs","title":"Wolfs","text":"<p>Brad Pitt and George Clooney bouncing off each other perfectly. I really enjoyed this film and could watch again.</p> <p>Apple TV+</p>","tags":["emacs","neovim"]},{"location":"holiday-stuffing/#constellation","title":"Constellation","text":"<p>Naoomi Rapace leads a very intriguing space drama that centers around an experiment to find 'other states of matter' and the effectives of that experiment. Essentially what happens when your life splits and you start living in a world that is not quite your own.</p> <p>Thank you.</p> <p> Practical.li Website</p> <p> Practical.li GitHub Org practicalli-johnny profile</p> <p> @practicalli@clj.social @practical_li</p>","tags":["emacs","neovim"]},{"location":"a-new-dawn-a-new-day-its-a-new-life/","title":"A new dawn a new day its a new life","text":"<p>As we come to the end of 2025 I continue to contemplate what is next?</p> <p>Do I want to continue in the software engineering industry with its many systemic faults?</p> <p>Or should I branch out and do something completely different?</p> <p>80,000 hours is a guide to careers that have a positive impact on the world.</p> <p>My searching for a new home are currently focusing on the East coast of Scotland (which is dryer than London at the moment). Aberdeen (the granite city) has good support for cycling and a few cycle clubs in the area.</p> <p>Wired up my Playstation 4 and VR headset to start playing games again. During more severe covid symptoms I couldnt wear the VR headset as it put too much pressure on my head. From an hour of play today, the VR headset felt okay.</p> <p>I had a few quick games of Stardust and one surprisingly successful game of Polybius.</p>","tags":["neovim"]},{"location":"a-new-dawn-a-new-day-its-a-new-life/#neovim","title":"Neovim","text":"<p>Neovim 0.11.3 released.</p> <p>The nvim.appimage file was downloaded from the GitHub releases page, along with the SHA256 checksum.</p> <p>Check the integrity of the file download</p> <pre><code>sha256sum --check nvim.appimage.sha256sum\n</code></pre> <p>Set the <code>nvim.appimage</code> file to executable.</p> <pre><code>chmod a+x nvim.appimage\n</code></pre> <p>Move the nvim.appimage to the shared executable path to make available to all users, renaming to nvim.</p> <pre><code>sudo mv nvim.appimage /usr/local/bin/nvim\n</code></pre>","tags":["neovim"]},{"location":"a-new-dawn-a-new-day-its-a-new-life/#lsp-file-name-refactor","title":"LSP file name refactor","text":"<p>Astrocommunity has the <code>nvim-lsp-file-operations</code> plugin packaged, so taking it for a test drive to see if I can refactor filenames and update namespace names (and vice versa).</p> <p>Thank you.</p> <p> Practical.li Website</p> <p> Practical.li GitHub Org practicalli-johnny profile</p> <p> @practicalli@clj.social @practical_li</p>","tags":["neovim"]},{"location":"striving-toward-consistency/","title":"Striving toward consistency","text":"<p>Will feel good to have all Practicalli website content have a consisten look.</p> <p>Material for MkDocs really helps me convey information effectively (at least in my own view).</p> <p>Still have a few covid symptoms, but not as much this week. Usually only in the mornings.</p>"},{"location":"striving-toward-consistency/#migrate-practicalli","title":"Migrate Practical.li","text":"<p> Practical.li/blog has been moved to use Material for MkDocs and is working very well.</p> <p>As a blog can have pagest too, so it is possible to replace the Practical.li landing page with a blog webstite.</p> <p>So I plan to retire the Practical.li ClojureScript project that generated the current Practicalli landing page and replace it with MkDocs.</p> <p>The blog project using Material for MkDoc is being extended to include content from the current landing page. So far it looks very promising.</p>"},{"location":"striving-toward-consistency/#magit-show-signatures","title":"Magit show signatures","text":"<p>By default Magit status and log view does not show information about signed commits.</p> <p>Having used Neovim and Neogit, signed commits is shown by default and provides confidence that signing is working (its a recent approach, so continual feedback is very useful).</p> <p>Magit can show signature information, but its not immediately obvious how.</p> <ul> <li>l for log menu</li> <li>= S signed option</li> <li>l to show the commit log</li> </ul> <p>The Signed option highlights the shortend commit SHA value in green when a commit has been signed locally (SSH or Git).</p> <p>Commits singed-off via the GitHub website have the shortend commit SHA highlighted in red</p> <p>Enter on commit show the description, meta data and diff of the commit, but by default does not show if the commit is signed.</p> <ul> <li>D when viewing the commit details provides diff options menu</li> <li>= g</li> <li>w to update the current buffer and set signing to show as default</li> </ul> <p>Signed commits will show every time the commit details buffer is viewed.</p> <p>The format of the sign line in the commit details buffer would benefit from a line to separate it from the file changed list.</p> <p>Thank you.</p> <p> Practical.li Website</p> <p> Practical.li GitHub Org practicalli-johnny profile</p> <p> @practicalli@clj.social @practical_li</p>"},{"location":"the-editors-strike-back/","title":"The editors strike back","text":"<p>Interesting edge cases with evil-cleverparens and another question about choice of editor for complete beginners to programming.</p> <p>Covid strikes again. Wiped out by the end of the week.</p>"},{"location":"the-editors-strike-back/#clojure-cli-config","title":"Clojure CLI Config","text":"<p>Monthly update for libraries used in the Clojure CLI Config.</p> <p>Release: Clojure CLI Config</p>"},{"location":"the-editors-strike-back/#spacemacs","title":"Spacemacs","text":"<p>Some curious edge cases for evil-clever-parens where deleting within a hash-map leaves the hash-map unbalanced.</p> <p>This behaviour was found in Spacemacs although it could be another package or config causing the issue as the same edge cases are not present in vanilla Emacs.</p> <p>When modifying a hash-map with <code>evil-cp-delete-line</code> (<code>D</code> in Evil Normal state) the hash-map closing paren can be deleted and become unbalanced. This seems to happen either a flat hash-map or nested hash-map.</p> <p><code>evil-cp-delete-line</code> correctly keeps balance when the hash-map is surrounded by a different type of parens, eg. list or vector.</p> <p>Example</p> <pre><code>;; D deletes closing paren on first line - unbalanced, although dd does work as expected\n{:get {:handler :get-clojure}\n :name ::main}\n\n;; deletes closing paren - unbalanced\n{:get :clojure}\n\n;; delete anywhere in hash-map keeps balance\n[{:get :clojure}]\n\n;; delete anywhere leaves unbalanced\n{:get {:closure {:with ::clojure}}}\n\n;; delete within hash-map keeps parens balanced\n(clojure.pprint/pprint {:get :clojure})\n\n;; delete within hash-map keeps parens balanced\n(def data-analysis\n [{:get :clojure}])\n\n;; delete in vector keeps parens balanced\n[:get :clojure]\n\n;; delete in hash-map keeps parens balanced\n[:get {:clojure :repl}]\n</code></pre> <p>I did not find any issue from an initial review of the Spacemacs configuration and use of evil-cleverparens in the Spacemacs configuration.</p> <p>These seem edge cases to me anyway as I replace the value in the hash map rather than use line-delete with a value from a key value pair, as logically deleting only the value unbalances the semantics of the hash-maps itself.</p>"},{"location":"the-editors-strike-back/#editor-for-beginners","title":"Editor for Beginners","text":"<p>Which editor is the easiest for complete beginners to use for learning Clojure?</p> <p>This was a question this week in the Clojurians Slack community and there are always variations on the theme of which editor to use.</p>"},{"location":"the-editors-strike-back/#tooling-bias","title":"Tooling bias","text":"<p>It is very hard to see past our own biases when it comes to the tools we use every day. A deep connection is made to the editor of choice and becomes hard to overcome this affinity.</p> <p>We naturally want people to validate our own tooling choices by encouraging others to use the same editor.</p> <p>This kind of bias can be avoided by first acknoledging that it is ever present. Using several editors can also reduce some bias as well as providing a deeper understaning of the strenghths and constraints of each tool.</p> <p>Practicalli uses Neovim and Emacs regularly</p> <p>This blog and most new content is created using Neovim (with AstroNvim). However for most of the last decade the Practicalli content has been created with Emacs (with Spacemacs).</p>"},{"location":"the-editors-strike-back/#no-editor-or-development-experience","title":"No editor or development experience","text":"<p>Using a text editor that supports Clojure syntax highlighting is the simplest approach. Using a terminal REPL prompt to load files.</p> <p>My suggestion is Clojure Sublimed is less complicated than any other tools. Or Rebel Headline could be used for very small pieces of code. Or choose a tool that has very clear and accurate guides, so the beginner progress without getting stuck or requiring significant help from a teacher/mentor. The only editor / IDE that will feel simple to the learner is the one they become familiar with (or can be taught the essence of in a short space of time).</p> <p>IDEs will feel very complex because they have lots of features to distract & confuse someone with no context.</p> <p>Anyone guiding beginners will have experienced how distracting a large number of features can be, they quickly get in the way of learning (and teaching).</p>"},{"location":"the-editors-strike-back/#early-days-of-clojure","title":"Early days of Clojure","text":"<p>LightTable was first editor that really helped me feel comforatable with Clojure and REPL driven development.</p> <p>The editor was not perfect, but was extremely simple to use and provided really useful feedback as code was typed.</p> <p></p> <p>Unfortunately the LightTable editor was discontinued, even though there was an effort to revive it after the original maintainer passed.</p> <p>Thank you.</p> <p> Practical.li Website</p> <p> Practical.li GitHub Org practicalli-johnny profile</p> <p> @practicalli@clj.social @practical_li</p>"},{"location":"engineering-practices/","title":"Engineering Practices","text":"<p>Illness is all around. Around 12% of people in Germany are currenly ill through covid, flu or a stomach virus. I have some relatively mild symptoms this week.</p> <p>The hunt for a new place to live continues, investigating lots of facinating places in Scotland. Discovered an Ecopark with sustainably built housing. There is one house for sale and some new builds in the near future. Requested a build plan for the new build houses.</p>"},{"location":"engineering-practices/#practicalli-plans","title":"Practicalli plans","text":"<p>I'd like to focus more on engineering principles and practices this year, adding specific practice guides to the Practicalli Engineering Playbook.</p> <ul> <li>Kanban to visualise issues and understand how changes affect the team</li> <li>Decomposing large project into small pieces of work</li> <li>Working towards consistent delivery</li> <li>Behaviour Driven Development</li> <li>Combining Shape-up pitch documentation with effective persona and user stories</li> </ul>"},{"location":"engineering-practices/#health","title":"Health","text":"<p>Some covid symptoms this week, usually coughing in the morning and lost my voice a few times. More tired by the end of the week than I should be, so have been sleeping more at weekends rather than cycling or walking.</p> <p>Thank you.</p> <p> Practical.li Website</p> <p> Practical.li GitHub Org practicalli-johnny profile</p> <p> @practicalli@clj.social @practical_li</p>"},{"location":"alias-shell-that-updates-shell/","title":"Alias Shell that updates Shell","text":"<p>As this week is mosly tweaks for Zsh history, I've titled this journal entry to be a play on words from the Shakesphere play 'Alls well that ends well'.</p> <p>The <code>fd</code> built-in command for Zsh is a very effective way to keep the command history clean.</p>","tags":["clojure"]},{"location":"alias-shell-that-updates-shell/#zsh","title":"Zsh","text":"<p>Every command typed at the prompt will be added to the Zsh history. This provides a very efficient way to repeat commands.</p> <p>When an incorrect command is used the usefulness of the history can be deminished, as those incorrect commands are also part of the history.</p> <p>Rather than navigating the history and changing the command, use the buildin <code>fd</code> command to edit the Zsh history.</p> <p>The <code>fd</code> command is a simple tool to keep the Zsh history clean of incorrect commands. A specific command can be edited and changed by specifying its number in the history order. Or the whole history can be edited, especially useful if the command should be completely deleted.</p> <p>Avoid editing history directly</p> <p>Use <code>fd</code> command to edit the history to ensure the cache is up to date.</p> <p>Editing $HISTFILE Zsh history file directly will not remove the command from the history cache and will show when navigating histor until logging out of the shell session.</p>","tags":["clojure"]},{"location":"alias-shell-that-updates-shell/#engineering-playbook","title":"Engineering Playbook","text":"<p>Added shell alias examples to Practicalli Engineering Playbook.</p> <p>Rewrote the Deliberate Practiceoverview and reorganised Architecture and Code Kata pages as sub-sections.</p> <p>Thank you.</p> <p> Practical.li Website</p> <p> Practical.li GitHub Org practicalli-johnny profile</p> <p> @practicalli@clj.social @practical_li</p>","tags":["clojure"]},{"location":"a-new-year-a-new-me/","title":"A new year... a new me","text":"<p>Going back to work for a rest... from all the exercise of winter solstace</p> <p>Continuing to love using Neovide, although havent figured out how to use Neovide from the MacOSX launcher with AstroNvim. It works fine under Linux.</p>"},{"location":"a-new-year-a-new-me/#neovim","title":"Neovim","text":"<p>Created a simple video using some basics of Neovide with the AstroNvim configuration, with the aim to ensure the current OBS setup is working well.</p> <p>Published a short video on Practicalli YouTube channel to test the new OBS setup and see if any changes to the layout are required.</p> <p>Tested on Lenovo Android tablet and Pixel 2XL smartphone for text readability.</p> <p>Neovide test run video: Practicalli YouTube channel</p>"},{"location":"a-new-year-a-new-me/#neovide-on-macosx","title":"Neovide on MacOSX","text":"<p>I can launch Neovide using the Linux desktop launcher and it will pick up the shell alias I used to set AstroNvim as the configuration (NVIM_APPNAME).</p> <p>However, in MacOSX there doesnt seem to be a clear way to do this. There seem to be quite a few approaches, most of which turn out to be deprecated or removed from later versions of MacOSX.</p> <p>MacOSX doesnt seem to have a <code>~/.profile</code> file by default but I will create one and source the <code>shell-aliases</code> file I use to set command line aliases such as <code>astro</code> and <code>neovide</code> with AstroNvim config.</p>"},{"location":"a-new-year-a-new-me/#stats-for-2023","title":"Stats for 2023","text":"<p>I have managed to commit something every day for 2023. There is always plenty of work for Practicalli, so its usually easy to squeeze in a commit even on busy days.</p> <p>Tried GitHub Unwrapped which generates a video of some statistics from the given GitHub account name. Posted the resulting video on my LinkedIn account.</p> <p>GitHub Unwrapped LinkedIn post</p> <p>GitHub Profile has more representative stats</p> <p>The visualisations on the Practicalli-johnny GitHub profile are realistic representations of my activities.</p>"},{"location":"a-new-year-a-new-me/#clojure","title":"Clojure","text":"<p>Ran the latest Clojure CLI pre-release with the Practicalli Clojure CLI Config aliases. Had an issue with Cider-nrepl, though it seems to have been from a corrupted library download rather than the CLI version.</p> <p>Nuked the local maven directory, <code>.m2/repository</code>, to test out the Clojure CLI pre-release at downloading dependencies again and there were no more issues.</p> <p>Also tested the Clojure CLI with a directory containing an empty <code>deps.edn</code> file and was able to run the Rebel repl (<code>clojure -M:repl/rebel</code>) without any problems. This release treats an empty <code>deps.edn</code> file as if it contained a valid data structure, i.e. <code>{}</code>, an empty hash-map.</p>"},{"location":"a-new-year-a-new-me/#practicalli","title":"Practicalli","text":"<p>Monthly scheduled updates</p> <ul> <li>Clojure CLI Config library updates and CI actions</li> <li>Project Templates megalinter upload-artifact v4, setup-java v4 and using Java version 21,</li> </ul> <p>GitHub health check files are added to practicalli/.github repository and apply to all repositories in that organisation, unless they provide their own file.</p> <ul> <li><code>CONTRIBUTING.md</code> defines how to contribute to Practicalli</li> <li><code>FUNDING.yml</code> defines ways to sponsor Practicalli work</li> <li><code>LICENSE.md</code> Creative Commons Attribution Share-a-like license for all Practialli work</li> <li><code>SECURITY.md</code> how to raise security related issues</li> <li><code>SUPPORT.md</code> how to get support from Practicalli</li> <li><code>PULL_REQUEST_TEMPLATE</code></li> <li><code>clojure_code_contribution.md</code></li> <li><code>practicalli_book_contribution.md</code></li> </ul>"},{"location":"a-new-year-a-new-me/#debian","title":"Debian","text":"<p>The <code>ifconfig</code> command used to be the way to view the local network address of the computer in Linux. This command has been retired in favor of the <code>ip</code> command.</p> <p>Show the network addresses for the computer</p> <pre><code>ip address\n</code></pre> <p>The command may show one or more sections</p> <ul> <li><code>loopback</code></li> <li>ethernet cable, named similar to <code>enp0</code></li> <li>wifi adaptor, named similar to <code>wlp</code></li> <li>docker if the docker daemon is installed</li> </ul> Example output from ip address <pre><code>\u276f ip address\n1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000\n link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00\n inet 127.0.0.1/8 scope host lo\n valid_lft forever preferred_lft forever\n inet6 ::1/128 scope host\n valid_lft forever preferred_lft forever\n2: enp0s31f6: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000\n link/ether 48:2a:e3:6b:11:46 brd ff:ff:ff:ff:ff:ff\n inet 192.168.0.212/24 metric 100 brd 192.168.0.255 scope global dynamic enp0s31f6\n valid_lft 5155sec preferred_lft 5155sec\n inet6 fe80::4a2a:e3ff:fe6b:1146/64 scope link\n valid_lft forever preferred_lft forever\n3: wlp82s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000\n link/ether 60:f2:62:15:1f:53 brd ff:ff:ff:ff:ff:ff\n inet 192.168.0.191/24 brd 192.168.0.255 scope global dynamic noprefixroute wlp82s0\n valid_lft 6617sec preferred_lft 6617sec\n inet6 fe80::bf0a:872b:9380:fb98/64 scope link noprefixroute\n valid_lft forever preferred_lft forever\n4: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default\n link/ether 02:42:6e:e0:5f:c8 brd ff:ff:ff:ff:ff:ff\n inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0\n valid_lft forever preferred_lft forever\n</code></pre> <p>The <code>hostname</code> command can provide a simpler view of the network address</p> <p>Hostname interfaces</p> <pre><code>\u276f hostname -I\n192.168.0.212 192.168.0.191 172.17.0.1\n</code></pre>"},{"location":"a-new-year-a-new-me/#health","title":"Health","text":"<p>Over the Winter Solstace break I manage</p> <ul> <li>3 cycle rides, totaling over 215km and 2,500 meters climbing</li> <li>2 park runs, 5 km distance for each run, with a time of 34 minutes on 25th December and 33 minutes on 1st January 2024</li> </ul> <p>A few walks of around an hour each to streatch my legs.</p> <p>Started following some simple Pilates videos specifically designed to strengthen knees, which will be great for both cycling and running.</p> <p>As I am organising my work calendar this month, I will ensure there is time for exercise each day and get into a routine that includes walking, yoga and pilates.</p> <p>Thank you.</p> <p> Practical.li Website</p> <p> Practical.li GitHub Org practicalli-johnny profile</p> <p> @practicalli@clj.social @practical_li</p>"},{"location":"breaking-ground-on-the-new-year/","title":"Breaking ground on the new year","text":"<p>Rushing work is the slowest way to make progress.</p> <p>Exhausted after this week of work, so took a break from cycling and running. Lots of cat naps over the weekend.</p>"},{"location":"breaking-ground-on-the-new-year/#practicalli-spacemacs","title":"Practicalli Spacemacs","text":"<p>I'm using a mix of Spacemacs and Neovim on MacOSX for work, so am steadily adding tweaks in the few areas where there are differences. This is mostly how environment variables work (or dont work in the case of MacOSX for apps launched from the desktop launcher, e.g. spotlight).</p>"},{"location":"breaking-ground-on-the-new-year/#neovim","title":"Neovim","text":"<p>Updated AstroNvim to 3.41.0 using Astronvim config, <code>SPC p A</code>. Many small fixes and enhancements although didnt notice anything significantly impactful.</p> <p>Installed Neovim 0.9.5 by downloading the <code>nvim.appimage</code> from GitHub Releases page of Neovim repository.</p> <ul> <li>Copied the downloaded file to <code>.local/bin</code> and rename the file to include the version number, <code>nvim-0.9.5.appimage</code>. -</li> <li>Change the file to be executable, <code>chmod u+x nvim-0.9.5.appimage</code>.</li> <li>Updated the <code>.local/bin/nvim</code> symlink to point to the new version.</li> <li>ran <code>nvim</code> command to check neovim work without configuration</li> <li>ran <code>astro</code> command to chekc neovim works with AstroNvim configuration</li> </ul> <p>Upgraded successful.</p> <p>Noticed I had only been using Neovim 0.9.2 on one machine, so good time to upgrade.</p>"},{"location":"breaking-ground-on-the-new-year/#building-teams","title":"Building teams","text":"<p>It can be challenging joining a very busy team. Blalancing the need to minimise disruption of the existing teams work with taking the teams time to enable new people to have enough knowledge to start contributing.</p> <p>Identifying specific knowledge transfer topics and timeboxed meetings are an effective approach, especially when coupled with good documentation and architecture diagrams.</p>"},{"location":"breaking-ground-on-the-new-year/#macosx-environment-variables","title":"MacOSX environment variables","text":"<p>Finally found a working approach to running desktop apps that are configured with an environment variable, e.g. Neovide GUI for Neovim with the AstroNvim configuration and Emacs with a custom location (XDG) Spacemacs user configuration.</p> <p>The <code>launchctl</code> command can set an environment variable that will be used with GUI apps launched from the MacOSX spotlight (or similar desktop launchers).</p> <p>Neovide with Astronvim config</p> <pre><code>launchctl setenv NVIM_APPNAME astronvim\n</code></pre> <p>Emacs with Spacemacs config</p> <pre><code>launchctl setenv SPACEMACSDIR /User/practicalli/.config/spacemacs\n</code></pre> <p>Adding environment variables in the user <code>.profile</code> or <code>.zprofile</code> files did not make a difference, even after a reboot of MacOSX.</p>"},{"location":"breaking-ground-on-the-new-year/#github-statistics","title":"GitHub statistics","text":"<p>GitHub Wrapped is an online app that generates visualisation from contributions for a specific GitHub account.</p> <p></p>"},{"location":"breaking-ground-on-the-new-year/#github-trends","title":"GitHub Trends","text":"<p>GitHub Wrapped uses GitHub Trends which can be used to create a deep dive into the GitHub API to surface metrics about code contributions.</p> <p>GitHub Trends computes metrics based on your individual commits, rather than look at contributions to repositories.</p> <p>Generate insights on lines written by language, repository, and time. Easily embed dynamic images into your GitHub profile to share your statistics with the world.</p> <p>Create an account with GitHub Trends Then, paste this string into your Markdown content, substituting your username.</p> <p>Markdown Code for GitHub trends language view</p> <pre><code>[](https://githubtrends.io)\n</code></pre> <p>Communicate directly with Use the GitHub Trends API to create customize cards.</p> <p>Thank you.</p> <p> Practical.li Website</p> <p> Practical.li GitHub Org practicalli-johnny profile</p> <p> @practicalli@clj.social @practical_li</p>"},{"location":"start-of-a-long-journey/","title":"Start of a long journey","text":"<p>2024 feels like a long year that will happen very quickly</p>"},{"location":"start-of-a-long-journey/#emacs","title":"Emacs","text":"<p>Working through the Practicalli Spacemacs book and updating screenshots, key bindings with key board keys and generally improving content.</p>"},{"location":"start-of-a-long-journey/#practicalli","title":"Practicalli","text":"<p>Continuing to update repository health files by adding a Creative Commons license to all Practicalli repositories. Using the license text from Choose A Licence - Creative Commons SA 4.0</p> <p>Thank you.</p> <p> Practical.li Website</p> <p> Practical.li GitHub Org practicalli-johnny profile</p> <p> @practicalli@clj.social @practical_li</p>"},{"location":"quiet-before-the-storm/","title":"Quiet before the storm","text":"<p>Its not as windy as previous weeks, but there is another storm on its way.</p> <p>Feeling too tired for exercise over the weekend, need to pace myself at work a little better.</p> <p>Hopefully as the weather gets warmer or at least sunnier it will be easier to do more outside activities.</p>"},{"location":"quiet-before-the-storm/#practicalli-neovim","title":"Practicalli Neovim","text":"<p>Updating the section on basic use of Neovim, especially around register usage.</p> <p>Registers feel more useful in Neovim as there is no kill-ring history as provided by Spacemacs. The Neovim registers provides much more opportunities to save text in different registers, although the learning curve is steeper than cycling through kill-ring history in Spacemacs.</p> <p>Recent commits:</p> <ul> <li>basics: add register type summary</li> <li>basics: add visual line and block commands</li> <li>intro: add :help news to features page</li> <li>basics: creating a directory with telescope or commands</li> <li>intro: update conceptual REPL workflow image</li> </ul>"},{"location":"quiet-before-the-storm/#practicalli-blog","title":"Practicalli Blog","text":"<p>Continuing to migrate the Practicalli Blog, moving from Cryogen to Material for MkDocs.</p> <p>Cryogen is a very good tool for generating static sites for blogs, with relatively simple to modify templates. However, the templates are not as professional looking as those of Material with MkDocs in my humble opinion.</p> <p>Cryogen was not really designed for generating websites for the Practicalli books without some heavy modification. I would rather spend time creating the content than maintaining a bespoke tool.</p> <p>Migrating the articles to Material for MkDocs is mostly updating the header format for each article. However it also provides an opportunity to review and refine each article, improving the prose and using MkDocs features to improve the visual appeal of each post.</p> <p>Practicalli Blog usng Material for MkDocs</p>"},{"location":"quiet-before-the-storm/#entertainment","title":"Entertainment","text":"<p>Started watching \"See\" series on Apple.tv and its reasonably enjoyable. It is a good way to switch off from work whilst I nudge some Practicalli tickets to closed state.</p>"},{"location":"quiet-before-the-storm/#health","title":"Health","text":"<p>Feeling rough in the mornings, sore throat and lots of coughing. Occasionally feeling exhausted during the day, so need to adjust my pace each day and spread the work more throughout the day.</p> <p>Thank you.</p> <p> Practical.li Website</p> <p> Practical.li GitHub Org practicalli-johnny profile</p> <p> @practicalli@clj.social @practical_li</p>"},{"location":"no-one-is-omnipotent/","title":"No one is omnipotent","text":"<p>Understand what is the most valuable thing and focus on attaing it.</p> <p>Technical writing is a skill that regularly needs practice.</p>"},{"location":"no-one-is-omnipotent/#practicalli-blog","title":"Practicalli Blog","text":"<p>Rewriting many of the existing articles, to update content with newer approaches and to improve the prose of each article.</p>"},{"location":"no-one-is-omnipotent/#health","title":"Health","text":"<p>Felt good after the weekend cycle and recovery weekend.</p> <p>Started to feel rough on Tuesday and started taking maximum dose of paracetamol to fight-off inflamation symptoms.</p> <p>Unfortunately my health continues to degrade and I need a lot more rest at the moment.</p> <p>Thank you.</p> <p> Practical.li Website</p> <p> Practical.li GitHub Org practicalli-johnny profile</p> <p> @practicalli@clj.social @practical_li</p>"},{"location":"flexiana-interview/","title":"Flexiana Interview","text":"<p>I enjoyed the interview with Flexiana team this week, they are very friendly and it we had some very interesting discussions. I included my interview preparation notes which were mosty the same as shared in the video.</p> <p>A blip with Emacs 29.4 release stopped the which-key menu from showing when in a major mode. This affected both the leader and local leader key. Within a couple of hours the issue was resolved before I really figured out the cause. I installed Emacs 29.4 on Termux to replicate an issue that was reported in the #spacemacs channel of the Clojurians Community slack community.</p>","tags":["clojure"]},{"location":"flexiana-interview/#flexiana-interview","title":"Flexiana Interview","text":"<p>Flexiana inquired about an interview and I suggested they send through some questions they wanted to ask. It was a video interview and I find it very useful prepare for the questions so I know what I can say during the video call. Without questions up front it can take much longer to form my replies and is very easy to miss interesting things to say.</p> <p>I felt the call went very well and there was scope for some additional questions around Spacemacs. I also got in a mention of Neovim too.</p> <p>The interview will appear on the video Flexiana YouTube channel</p> <p>The questions and notes I made for the questions follow:</p>","tags":["clojure"]},{"location":"flexiana-interview/#how-did-you-transition-to-working-with-clojure","title":"How did you transition to working with Clojure?","text":"<p>I fell into Clojure by accident. I had attended a talk by Rick Hickey in London at SkillsMatter in 2009, but it took a while before I really understood why I would invest time in Clojure. The language did seem quite strange compared to what I was use too.</p> <p>I was developing an interested in functional programming at that time, as the Object Oriented design approach seemed to be less appropriate for some of the data intensive systems I was trying to model. I remembered how intriguing Haskell functional programming was from course at university and how I was starting to get a good grip of the language by the time the course ended, although more than a decade had passed since then.</p> <p>Scala was very popular at that time and I was friends with people organising the London Scala User Group. I wanted to organise a event where we could practice the language, so started a Scala code dojo event. Having never run such a code dojo event, I went to the London Cojurians code dojo events to see how it was done.</p> <p>After several months of going to the Clojure code dojo I woke up one day and felt I had 'got' Clojure. I had finally found a language and community that cared about simplicity and had a language that could easily represent that simplicity.</p> <p>It took many years to get my first commercial Clojure role, but learning Clojure through the community was very rewarding.</p> <p>I started an event called Hack The Tower in the Salesforce / Heroku offices, running once a month on a Saturday. People from the Java Scala and Clojure communities were invited and I organised them into groups to the could collaborate on projects or simply learn together. I started running an all day Clojure workshop as I discovered trying to lead others into Clojure was a great way to learn Clojure myself. Hack The Tower ran for 5 years, until I left Salesforce (and had no office or budget anymore).</p> <p>Eventually I was accepted for a commercial Clojure role in 2017 at Citi (large international finance institute) and since then have worked for a variety of startup companies using Clojure.</p>","tags":["clojure"]},{"location":"flexiana-interview/#are-you-an-active-clojure-developer-or-a-manager","title":"Are you an active Clojure developer or a manager?","text":"<p>I have been an active Clojure engineer commercially since Citi.</p> <p>After my health was significantly impacted by Covid I felt more useful by taking an engineering manager role. This is the role I currently have at Griffin.</p> <p>I write Clojure code for community projects, especially Practical.li. I can do this work at my own pace and to satisfy my own high code standards, without the pressure of deadlines.</p>","tags":["clojure"]},{"location":"flexiana-interview/#what-do-you-see-as-the-best-on-clojure","title":"What do you see as the best on Clojure?","text":"<p>Simplicity is the most important characteristic to me, both of the Clojure language itself and the design approach to building systems with Clojure.</p> <p>All other languages I've worked with try to model the complexity of the world, leading to complex systems that are very hard to maintain and extend.</p> <p>A simple approach to design creates code that is far easier to maintain and extend. A large number of code libraries can be combined to make a complex system whist still retaining the maintainability and extensibility of the code.</p> <p>Data as a central design tool is also incredibly important. A Data approach supports simplicity and helps break down complex requirements into simple models. When that data is immutable, then it is really easy to reason about the behaviour of code that is transforming that data.</p> <p>And the Clojure REPL is a unique experience I have never had with other languages. To instantly get feedback on what the code does or to quickly deconstruct code and evaluate its parts in a live environment has been invaluable for optimising learning.</p>","tags":["clojure"]},{"location":"flexiana-interview/#what-types-of-people-clojure-attracts","title":"What types of people Clojure attracts ?","text":"<p>In the early days of Clojure it was predominantly experienced Java engineers that wanted to do something different or saw the advantage of the simplicity of Clojure.</p> <p>Around 2013-14 ClojureScript really started to take off, widening the audience and also making front end development more accissible for engineers that only had back-end experience. Figwheel, Reagent and Reframe projects really help in the early days of ClojureScript.</p> <p>Over the last 5 years I have seen much more diversity in those using the language. I've met many people using Clojure as their first commercial programming language. There are many people from Data Science community using Clojure or Clojure / Python combinations.</p> <p>I believe Clojure is now seen as the general purpose language it truly is and a language that anyone can readily adopt.</p>","tags":["clojure"]},{"location":"flexiana-interview/#if-you-didnt-use-clojure-what-language-would-you-use","title":"If you didn't use Clojure what language would you use?","text":"<p>If I wasnt able to use Clojure I would look for a commercial role that didnt include coding. Or invest some time on open source Clojure projects and see if I could raise enough sponsorship that I would not need a commercial role. Or I could retire and live a very modest life.</p> <p>I am not aware of any programming language that has the emphasis on simplicity that I get with Clojure.</p> <p>Java is a great language for a career and will remain so for the foreseeable future, but feels very verbose after Clojure. Python has a lot of advantages for data science, although there are lots of Clojure projects too.</p>","tags":["clojure"]},{"location":"flexiana-interview/#important-skills-sought-when-assembling-an-engineering-team","title":"Important skills sought when assembling an engineering team?","text":"<p>Learning and communicating. Without these fundamental skills and motivation to want to apply them every day, then a team is only ever a collection of individuals and rarely excels.</p> <p>Learning is important as you are always creating something new, something that does not exist already (as if it existed already, why would you create it again). Team members need to appreciate that they can learn from anyone and everyone, no matter if they are technical or business focused or what level of experience they have.</p> <p>Communicating effectively is vital to avoid becoming your own silo. Actively communicating builds relationships within and outside the team and unless the company is only every 1 person, you need strong relationships to get anything significant done.</p>","tags":["clojure"]},{"location":"flexiana-interview/#what-are-your-current-personal-projects","title":"What are your current personal projects?","text":"<p>You have a long history of daily commits on GitHub, so what are the personal projects you currently work on ?</p> <p>I founded Practical.li</p> <p>I also write a journal capturing the thoughts, discoveries and activities each week. The journal helps to give me a sense of progress and supports self-motivation (I know I have done meaningful things and often surprise myself how much I have achieved).</p>","tags":["clojure"]},{"location":"flexiana-interview/#perspectives-gained-from-career-breaks","title":"Perspectives gained from career breaks ?","text":"<p>You had a career break where you worked as a courier, cycling about 100km per day. How did that experience impact your perspective on work and life?</p> <p>There is more to life than working, which is very easy to forget when your personal interests and work are very strongly aligned.</p> <p>Stepping away from the software industry also allowed a chance to reflect on what I really enjoyed and what value I could bring to a commercial company or open source project. In essence, stepping away for a year gave me perspective.</p> <p>There were some unexpected challenges being a cycle courier. Essentially each courier is continually solving the \"Travelling Salesman\" puzzle. The controller tells the courier which packages to collect and the courier has to decide when to deliver each parcel, as they are collecting more parcels. Typically a courier would have 5-10 parcels \"on-board\" at any time during the day, if they were to make enough money to live on.</p> <p>As a courier you are self-employed, so it gave me some insight into the world of finance and taxation.</p> <p>As it was difficult to make a comfortable amount of money as a cycle courier, it did make me appreciative of the good salaries that can be obtained as a software engineer.</p> <p>Thank you.</p> <p> Practical.li Website</p> <p> Practical.li GitHub Org practicalli-johnny profile</p> <p> @practicalli@clj.social @practical_li</p>","tags":["clojure"]},{"location":"monthly-library-updates-for-practicalli-projects/","title":"Monthly Library Updates for Practicalli Projects","text":"<p>Monthly updates for Practicalli projects, driven by a scheduled version GitHub workflow that uses antq to report on project library dependencies and GitHub action library versions.</p> <ul> <li>Release: Clojure CLI Config - 2024-07-07</li> <li>Release: Project Templates - 2024-07-07</li> </ul> <p>Which-key version 3 released, fixing localleader issue and providing a horizontal menu option.</p>","tags":["clojure"]},{"location":"monthly-library-updates-for-practicalli-projects/#neovim","title":"Neovim","text":"<p>Which-key version 3 released and resolves the issue with the <code>localleader</code> key mapping not working until after the <code>leader</code> key has been pressed.</p> <p>New layout options for placement of the menu. I find the vertical nature of the <code>helix</code> layout quicker to read than the horizontal <code>classic</code> or <code>modern</code> layouts.</p> <p>In AstroNvim, set the layout by adding a config for which-key to a user lua file, e.g. <code>lua/plugins/user-practicalli.lua</code></p> lua/plugins/user-practicalli.lua<pre><code> {\n \"folke/which-key.nvim\",\n opts = {\n ---@type false | \"classic\" | \"modern\" | \"helix\"\n preset = \"helix\",\n },\n },\n</code></pre> <p>Restart Neovim and the which-key will now show the new layout.</p>","tags":["clojure"]},{"location":"monthly-library-updates-for-practicalli-projects/#conjure-sub-menus","title":"Conjure sub-menus","text":"<p>I've raised an issue to add the conjure sub-menus via which-key.</p> <p>In the mean time, a quick hack has been added to the <code>lua/plugins/user-practicalli.lua</code> config (although only locally so far)</p> <pre><code>local whichkey = require \"which-key\"\n\n {\n \"folke/which-key.nvim\",\n opts = {\n ---@type false | \"classic\" | \"modern\" | \"helix\"\n preset = \"helix\",\n },\n\n -- Conjure sub-menus (not the ideal place)\n whichkey.add {\n { \"<localleader>c\", group = \"Connection\" }, -- group\n { \"<localleader>e\", group = \"Evaluation\" }, -- group\n { \"<localleader>l\", group = \"REPL Log\" }, -- group\n { \"<localleader>r\", group = \"Refresh\" }, -- group\n { \"<localleader>s\", group = \"REPL Session\" }, -- group\n { \"<localleader>t\", group = \"Test\" }, -- group\n { \"<localleader>v\", group = \"Values\" }, -- group\n },\n },\n</code></pre> <p>Thank you.</p> <p> Practical.li Website</p> <p> Practical.li GitHub Org practicalli-johnny profile</p> <p> @practicalli@clj.social @practical_li</p>","tags":["clojure"]},{"location":"montly-clojure-library-updates/","title":"Montly Clojure Library updates","text":"<p>Exploring the mysteries of the Bazel build tool at work. Whilst technically its a very powerful tool it really lacks a good developer experience.</p> <p>Its supposed to be a more powerful make, although ironically I use a <code>Makefile</code> so that Bazel is much easier to use.</p> <p>It could be an opportunity to use Babashka, but that would be more work than using a Makefile as I dont have much Babashka experience.</p>","tags":["clojure","bazel","make"]},{"location":"montly-clojure-library-updates/#clojure-cli-config","title":"Clojure CLI Config","text":"<p>Monthly library version updates, including newer versions of actions in the Quality Checks GitHub workflow</p> <p>Also updated the version of the Practicalli Project Templates in the <code>:project/create</code> alias. The templates have been updated to use <code>org.clojure/clojure</code> version <code>1.10.3</code>, which addresses security concerns (although very unlikely to be exploited).</p>","tags":["clojure","bazel","make"]},{"location":"montly-clojure-library-updates/#bazel","title":"Bazel","text":"<p>Bazel is a very powerful tool although not very user friendly. Bazel is described as a more powerful <code>make</code> tool, however, I have ended up using <code>make</code> to wrap many of the bazel commands to give a much more usable experience.</p> <p>Thank you.</p> <p> Practical.li Website</p> <p> Practical.li GitHub Org practicalli-johnny profile</p> <p> @practicalli@clj.social @practical_li</p>","tags":["clojure","bazel","make"]},{"location":"data-driven-components--neovim-updates/","title":"Data Driven Components & Neovim updates","text":"<p> Practicalli Astro config for Clojure development with Neovim initial release.</p> <p>Presented my experiences with Component libraries to London Clojurians this week, specifically comparing Integrant and Donut-party/system. I discussed my Service REPL workflow to show the benefits and constraints of these two libraries.</p> <p>For component libraries to work well, then code should be reloadable. There are a few parts of the Clojure language that do make it harder to reload code, (deftype, defrecord, etc), although I tend to avoid those parts anyway.</p> <p>Issues this week</p> <p> practicalli/astro:</p> <ul> <li>DONE search: find text pattern in specific files and file types</li> <li>DONE config: capitalise Leader & LocalLeader - vim convention</li> <li>DONE plugin: conjure sub-menu key labels in which-key version 3</li> <li>DONE plugin: spectre moved to search category in astrocommunity</li> <li>DONE plugin: better-escape.nvim rewrite required config change</li> </ul>","tags":["clojure","donut","integrant","neovim","astro"]},{"location":"data-driven-components--neovim-updates/#neovim","title":"Neovim","text":"<p>Once AstroNvim version 4 was release the Practicalli config was recreated from the new AstroNvim template (April 2024).</p> <p>After several months experimentation and testing of the new configuration, Practicalli Astro was officially released this week.</p>","tags":["clojure","donut","integrant","neovim","astro"]},{"location":"data-driven-components--neovim-updates/#london-clojurians","title":"London Clojurians","text":"<p>Sharing my experiences of using a REPL driven approach to Clojure services, including experiences of using Integrant and Donut-party/system libraries for managing the component parts of a service.</p> <ul> <li>Practicalli Clojure Web Services - Service REPL</li> <li>generated projects from the <code>:practicalli/service</code> template of Practicalli Project Templates</li> <li>Clojure API service managing components with an atom</li> <li>Clojure API service managing components with Integrant & Integrant REPL</li> <li>Clojure API service managing components with Donut-party/system</li> </ul> <p>Meld comparison of generated projects</p> <p>The projects purposely have a similar structure (after several refactor sessions) so should be easy to compare.</p> <p>TODO: add screenshots</p>","tags":["clojure","donut","integrant","neovim","astro"]},{"location":"data-driven-components--neovim-updates/#health-welbeing","title":"Health & Welbeing","text":"<p>Lots of cycling and walking this month.</p> <p>Cycle ride to Lehnam with some members of the local Bigfoot Cycling Club. 150km ride, ascending ...</p> <p>One rider had several punctures and only one tube of the right size. Several patches were applied to no success. I did have the opportunity to impart some skills when it came to removing and fitting a bicycle tyre with the group.</p> <p>Thank you.</p> <p> Practical.li Website</p> <p> Practical.li GitHub Org practicalli-johnny profile</p> <p> @practicalli@clj.social @practical_li</p>","tags":["clojure","donut","integrant","neovim","astro"]},{"location":"a-very-hot-week/","title":"A very hot week","text":"<p>Its a bit too hot for rational thought... and caught flu at the end of the week, so not much happened.</p> <p>Time for some project maintenance courtesy of the scheduled version GitHub workflow, run at the start of each month.</p> <p>Thank you.</p> <p> Practical.li Website</p> <p> Practical.li GitHub Org practicalli-johnny profile</p> <p> @practicalli@clj.social @practical_li</p>","tags":["clojure"]},{"location":"fixing-neovim-treesitter-breaking-changes/","title":"Fixing Neovim Treesitter breaking changes","text":"<p>The sun is out, the sky is blue... and I had the opportunity to understand some Neovim plugins a little more, in order to fix a breaking change with Neovim Treesitter support for Clojure.</p> <p>Pull Requests this week</p> <ul> <li>MERGED: #7 queries: clojure has-type? updated to kind-eq? for nvim-treesitter-sexp project</li> </ul>","tags":["neovim","astronvim","github","ssh"]},{"location":"fixing-neovim-treesitter-breaking-changes/#neovim","title":"Neovim","text":"<p>A breaking change in <code>nvim-treesitter</code> affects the <code>nvim-treesitter-sexp</code> plugin which provides paredit style structural editing for Clojure.</p> <p><code>nvim-treesitter</code> committed a change that requires queries to use <code>kind-eq?</code> rather than the previous <code>has-type?</code>.</p> <p>The breaking change only affected the queries for the Clojure language, all other languages supported by <code>nvim-treesitter-sexp</code> were unaffected.</p> <p>A quick solution would be to pin <code>nvim-treesitter</code> plugin to an earlier version, such as <code>v0.9.2</code> released on 19 January 2024</p> <p>Pin plugin to specific version</p> <pre><code> \"nvim-treesitter/nvim-treesitter\",\n version = \"0.9.2\",\n</code></pre> <p>A plugin can be pinned to its current version by adding <code>pin = true</code> to the plugin configuration. No further updates will e made to the package and avoids a known issue in an new release of that plugin.</p> <p>Pin plugin true</p> <pre><code> \"nvim-treesitter/nvim-treesitter\",\n pin = true,\n</code></pre> <p>The long term solution is to update <code>nvim-treesitter-sexp</code> to use the new <code>kind-eq</code> in its clojure query.</p> <p>Only one occurance of <code>has-type</code> was found in the nvim-treesitter-sexp source code.</p> <p>After forking the <code>nvim-treesitter-sexp</code> repository, the <code>has-type</code> line was changed to use <code>kind-eq</code> and the commit pushed to the fork.</p> <p>The local clone of Practicall Asto Config was updated to use the fork and branch used for the change</p> <p>Using Practicalli fork of nvim-treesitter-sexp</p> <pre><code> {\n -- \"PaterJason/nvim-treesitter-sexp\",\n \"practicalli-johnny/nvim-treesitter-sexp-fork\",\n branch = \"treesitter-has-type-to-kind-eq\",\n -- commit = \"\",\n dependencies = { \"nvim-treesitter/nvim-treesitter\" },\n ft = { \"clojure\", \"fennel\", \"janet\", \"query\" },\n cmd = \"TSSexp\",\n opts = {},\n },\n</code></pre> <p>Disabling the AstroNvim Clojure pack in the <code>lua/plugins/clojure.lua</code> by commenting the import line and running a Lazy plugin manager update, Space p U or <code>:Lazy update</code>, removed the <code>nvim-treesitter-sexp</code> plugin and replaced it with the Practicalli fork.</p> <p>With a few slurp and barf commands to test the simple change in the fork, it seems that change has fixed the error.</p> <p>Once the maintainer has merged the PR (or come up with a more appropriate fix), then I can revert back to the AstroNvim Community Clojure pack and simplify my config a little.</p>","tags":["neovim","astronvim","github","ssh"]},{"location":"fixing-neovim-treesitter-breaking-changes/#github","title":"GitHub","text":"<p>The GitHub keys page for an account lists all the authorisation and signing keys registered.</p> <p>Each key shows its unique SHA, rather than the key value, for security reasons.</p> <p>To identify if an SSH key is registered with GitHub, use the <code>ssh-keygen</code> command to show the SHA for public key file, <code>*.pub</code>.</p> <p>Show SHA of public key with ssh-keygen</p> <pre><code>ssh-keygen -lf ~/.ssh/key-name.pub\n</code></pre> <p>Copy the SHA value generated by the <code>ssh-keygen</code> command and search for that value on the GitHub keys page.</p> <p>Thank you.</p> <p> Practical.li Website</p> <p> Practical.li GitHub Org practicalli-johnny profile</p> <p> @practicalli@clj.social @practical_li</p>","tags":["neovim","astronvim","github","ssh"]},{"location":"neovim-on-termux-enhancements/","title":"Neovim on Termux enhancements","text":"<p>More Neovim updates and getting closer to a release of Practicalli Astro-config</p> <p>I have been using Neovim (and Emacs) on Termux, so I can code on my Android tablet or Android smart phone. I typically use an external keyboard (e.g. Keyboard.io Atreus or Model100), especially when considerable typing is involved.</p> <p>As the hardware and compilation tooling is different for Android Linux (compared to amd64 linux) the Clojure and Lua LSP language servers would not install via the Mason manager. As these two languages are in the top 3 languages I use, then it is a great boost to get these servers working locally and configuring Neovim to use them instead.</p> <p>I use the <code>date</code> command when I had a need to tweak the time on my Linux computer, saves launching the Settings app and using the mouse.</p> <p>Timezones made easy</p> <p>time.is makes figuring out timezones really simple. See the current time in any timezone across the world.</p> <p>time.is very useful for events where people attend from different timezones. Set the local time and share a link for others who will see the event time in their own timezone.</p>","tags":["neovim"]},{"location":"neovim-on-termux-enhancements/#neovim","title":"Neovim","text":"<p>I'm making some changes to the Practicalli AstroNvim configuration (AstroNvim4) over the next few days.</p> <p>All my personal Neovim & plugin options (and associated workflow biases) will only be in <code>lua/plugins/practicalli.lua</code>. With these options only in one file, anyone else using the configuration can easily disable them.</p> <p>I will encourage other users to create there own <code>lua/plugins/personal.lua</code> customisation so any changes from upstream will be easier to merge.</p> <p>The GitHub repository will be renamed to <code>practicalli/astro-config</code> which its much easier to write and say during screencasts. GitHub should redirect when pulling updates</p> <p>This week I will update Practicalli Neovim book install guide with new repo and further info on how to use the config effectively (especially with your own customisations)</p> <p>Then the first official release of the config will be created via GitHub releases.</p> <p>If I have time, there are lots of things to add to Practicalli Neovim book too (including a few more plugins I'm using in the config)</p>","tags":["neovim"]},{"location":"neovim-on-termux-enhancements/#neovim-and-termux","title":"Neovim and Termux","text":"<p>Neovim (and Emacs) run very well on Termux, the Android app that runs a user space Linux distribution. As its user space, the Android device does not need to be rooted, simply install the F-Droid Marketplace app and install its Termux application.</p> <p>Install Neovim & Clojure on Android</p> <p>Create an ultra-mobile Clojure development environment with Termux app.</p> <p>Ultra-mobile development environment with Android</p>","tags":["neovim"]},{"location":"neovim-on-termux-enhancements/#local-lsp-servers","title":"Local LSP servers","text":"<p>The LSP language servers for Clojure and Lua do not install via Mason.</p> <p>Clojure LSP server is not compiled for Android Linux, although the jar release does work.</p> <p>Lua language server is available as the <code>lua-language-server</code> Termux package.</p>","tags":["neovim"]},{"location":"neovim-on-termux-enhancements/#neovim-010x-not-available-yet","title":"Neovim 0.10.x not available yet","text":"<p>Pin neogit to <code>'v0.0.1'</code> as later versions of the project use Neovim 0.10.x specific API calls.</p> <p>Neogit will not setup if using a later version of the project with Neovim 0.9.x</p> <p>Pedantic Pinning packages with Lazy package manager</p> <p><code>'v0.0.1'</code> had to be used as a value with the <code>tag</code> keyword for the lazy plugin manager configuration.</p> <p>Using <code>\"v0.0.1\"</code> as the <code>tag</code> value failed to use that Git tag and the head was used instead.</p> <p>Its not clear why <code>tag</code> requires a value wrapped in <code>''</code> rather than <code>\"\"</code>. The Lua String Data Type is any sequence of zero or more characters surrounded by single quotes or double quotes.</p>","tags":["neovim"]},{"location":"neovim-on-termux-enhancements/#neovim-config-feedback-session","title":"Neovim Config feedback session","text":"<p>vim-jack-in opens in a Terminal console. The buffer should show as Terminal at the bottom bar</p> <p>Ctrl+\\ Ctrl+n to leave the Terminal mode, then g T or g t to switch to the source code tab (moving backward or forward through the tab pages)</p> <p>Would be useful to add a key mapping for terminal mode, so that <code>Esc</code> could be used instead.</p> <p>Related Clojurians Slack discussion</p>","tags":["neovim"]},{"location":"neovim-on-termux-enhancements/#linux-set-date-and-time-via-command-line","title":"Linux - set date and time via Command line","text":"<p>The date and time used by the Linux Operating System can be configured in the Settings app that comes with most Linux desktops, e.g. Regolith Linux, Gnome, KDE, etc. The settings app should also control if date/time is managed by a Network Time Protocol (NTP) server.</p> <p><code>date</code> will show the current date, time and timezone</p> <p><code>date</code> with the <code>-s</code> option sets the current time and date, or only the time if the date is not provided.</p> <p>Root Adminstration preveledges required to set date</p> <p><code>su -</code> or <code>sudo</code> is required to run the <code>date</code> and <code>timedatectl</code> commands</p> <p>Set Time and date</p> <pre><code>date -s '2024-05-18 20:32:00'\n</code></pre> <p>Set Time only</p> <pre><code>date -s '20:32:00'\n</code></pre> <p>The Linux Operating system may be using a Network Time Protocol (NTP) server to keep the date and time correct.</p> <p>Disable the NTP server update if the date is automatically being corrected to the current date and time.</p> <p>Disable NTP automatic date and time updates</p> <pre><code>timedatectl set-ntp false\n</code></pre> <p>Enable NTP automatic date and time updates</p> <pre><code>timedatectl set-ntp true\n</code></pre> <p>Thank you.</p> <p> Practical.li Website</p> <p> Practical.li GitHub Org practicalli-johnny profile</p> <p> @practicalli@clj.social @practical_li</p>","tags":["neovim"]},{"location":"conjure-lsp-bug--cycling-video-editing/","title":"Conjure LSP bug & Cycling video editing","text":"<p>Updated to Kitty 0.35.1 easily and switching between dark and light themes working instantly again.</p> <p>Diagnosed a 'new buffer' error with Conjure when using Neovim 0.9.0 and when opening a Clojure file, although everything works well in 0.10.0. EDIT: The maintainer added a fix to the <code>develop</code> branch for testing.</p> <p>#582 REVIEW: Conjure throws new Buffer error</p> <p>Video editing of footage taken by the front mounted camera on my bicycle. Advanced cycle training at Gravesend at the start of June. Bigfoot Cycling Club at Gravesent Cyclopark</p> <p>Took a few days away from the computer to work on the garden as its nice and sunny. A mostly sunny ride on Saturday around the Kent countryside.</p>","tags":["clojure","conjure","neovim","cycling"]},{"location":"conjure-lsp-bug--cycling-video-editing/#conjure-clojure-lsp","title":"Conjure & Clojure LSP","text":"<p>Language Server Protocol in Neovim is very good, although there are occasional breaking changes that plugin maintainers keep on top of.</p> <p>I migrated to Neovim 0.10.0 a few weeks after it was release and everything is working very well.</p> <p>A change in Conjure Clojure Plugin was made to disable diagnostics in the REPL log which included support for a breaking function name. There is now a fix in the <code>develop</code> release for Conjure that also supports Neovim 0.9.0.</p> <p>#582 Conjure throws new Buffer error</p>","tags":["clojure","conjure","neovim","cycling"]},{"location":"conjure-lsp-bug--cycling-video-editing/#neovim","title":"Neovim","text":"<p>Continuing to tidy up the AstroNvim configuration in practicalli/astro so all my plugin configuration overrides are within a specific file or <code>lua/plugins/user-practicalli.lua</code></p>","tags":["clojure","conjure","neovim","cycling"]},{"location":"conjure-lsp-bug--cycling-video-editing/#neogit","title":"Neogit","text":"<p>Moved Space g s which-key menu override to the central key mapping override config in <code>lua/plugins/user-practicalli.lua</code>, i.e. <code>[\"<leader>gs\"] = { \"<cmd>Neogit<cr>\", desc = \"Status (Neogit)\" },</code></p> <p>Move the neogit plugin config from <code>lua/community.lua</code> to <code>lua/plugins/user-practicalli.lua</code>.</p> <p>Added <code>graph_style = \"unicode\"</code> for elegantly rendered commit graphs (e.g. vim-flog)</p> <p>Cleaned up Neogit overrides</p> lua/plugins/user-practicalli.lua<pre><code> {\n \"NeogitOrg/neogit\",\n dependencies = {\n { \"nvim-lua/plenary.nvim\", \"sindrets/diffview.nvim\" },\n },\n opts = {\n disable_signs = true, -- duplicate signs if enabled\n graph_style = \"unicode\", -- elegant commit graph\n integrations = { diffview = true },\n },\n },\n</code></pre>","tags":["clojure","conjure","neovim","cycling"]},{"location":"conjure-lsp-bug--cycling-video-editing/#noice-and-notifications","title":"Noice and Notifications","text":"<p>Move Noice options to <code>lua/plugins/user-practicalli.lua</code>. It only has one option to set a boarder around LSP popups, e.g. Space l d diagnostics popup.</p> <p><code>nvim-notify</code> adds options to show message popups fro the bottom upward (less distracting to me), a quicker time-out for showing the message (Space f n to see notification history) and fewer message types, <code>level = 3</code>.</p> <pre><code> {\n \"noice.nvim\",\n opts = function(_, opts)\n local utils = require \"astrocore\"\n return utils.extend_tbl(opts, {\n presets = {\n lsp_doc_border = true, -- add a border to hover docs and signature help\n },\n })\n end,\n },\n -- nvim-notify controls how messages are displayed\n {\n \"rcarriga/nvim-notify\",\n opts = {\n top_down = false,\n timeout = 2000, -- shorter display duration, default 3000\n -- log messages level - default 5 (everything), 1 (minimum)\n level = 3,\n -- background_color = \"#000000\",\n },\n },\n</code></pre>","tags":["clojure","conjure","neovim","cycling"]},{"location":"conjure-lsp-bug--cycling-video-editing/#advanced-cycle-training","title":"Advanced Cycle Training","text":"<p>Bigfoot trip to Gravesend Cycle park for 3 hours of advanced cycle training. Activities include</p> <ul> <li>pursuit: lead rider cycles off to catch the pack from behind</li> <li>cornering: hitting the apex of the corner tight, using drops of handlebar to get really tight</li> <li>cornering in pairs: ensuring there is enough room for your partner</li> <li>cornering fast: solo cornering as fast as you can</li> <li>slalom: last rider weaves in between all riders in front, first solo and then as triple groups</li> <li>pacing: outer line of riders drop back whist inner line of riders take brief turns at front before joining outer line at front. Last rider in outer line joins inner line after call from last rider</li> </ul> <p>Video editing of the footage taken by the front mounted camera on my bicycle done using Blender video editing tool.</p> <p>Inkscape drawing tool was used to create section screens for the video, e.g. introduction slide and a slide for each activity. Inkscape slides are SVG images, exported to PNG images for use with Blender video editing.</p> <p> Bigfoot Cycling Club at Gravesent Cyclopark - 2 minute highlight</p> <p> Bigfoot Cycling Club at Gravesent Cyclopark - 6 minute highlight</p> <p>Bigfoot at Cyclopark - all activities</p>","tags":["clojure","conjure","neovim","cycling"]},{"location":"conjure-lsp-bug--cycling-video-editing/#saturday-cycle-ride","title":"Saturday Cycle ride","text":"<p>A 71km ride in the Kent countryside for 3 and a half hours. Starting off in cloudy weather turning steadily into really sunny ride, except for an impromptu hail storm for about 5 minutes.</p> <p>Strava: Club ride level 4 - 22 June 2024</p> <p>Thank you.</p> <p> Practical.li Website</p> <p> Practical.li GitHub Org practicalli-johnny profile</p> <p> @practicalli@clj.social @practical_li</p>","tags":["clojure","conjure","neovim","cycling"]},{"location":"updating-practicalli-neovim/","title":"Updating Practicalli Neovim","text":"<p>Practicalli Astro config is not very stable so its time to refactor the Practicalli Neovim book now that the Practicalli Astro configuration is established.</p>","tags":["neovim","astronvim"]},{"location":"updating-practicalli-neovim/#practicalli-neovim","title":"Practicalli Neovim","text":"<p>Updated the book introduction and install sections. Started enhancing the Neovim basics section.</p> <p>Thank you.</p> <p> Practical.li Website</p> <p> Practical.li GitHub Org practicalli-johnny profile</p> <p> @practicalli@clj.social @practical_li</p>","tags":["neovim","astronvim"]},{"location":"springing-back-into-life-slowly/","title":"Springing back into life slowly","text":"<p>The last month has been tough due to illness, although still managed to do a little work with Practicalli to keep me motivated (both for work and my own personal health)</p> <p>I though the Practicalli Project Templates had broken when I tried to create a new service project. It took me an hour or so to realise I had simply been using the command with the wrong argument, doh!</p>","tags":["clojure"]},{"location":"springing-back-into-life-slowly/#book-quality-and-workflow","title":"Book quality and workflow","text":"<p>Improvements have been made to the quality checks each of the Practicalli books undergow before publishing.</p> <p>These improvements are helping me maintain and improve the books, especially around avoiding broken links and images during refactor of the book content.</p> <p>Moving to the Material for MkDocs tool for building the books does produce a rich experience, improving the visual appeal, navigation and content presentation options.</p> <p>Material for MkDocs is subtly different in organising content with Markdown, so there are changes to link paths and callouts (admonitions) syntax is different too.</p> <p>Most of the screenshots and graphic design images have moved to a central practicalli/graphic-design repository. Initially the links to these images used the raw.githubusercontent.com domain, which did not always render the images efficiently and was a different domain to other GitHub links.</p> <p>Images from GitHub now use the direct URL to the resource (the same github.com domain as a link) and include the <code>?raw=true</code> option to indicate it should be shown as the raw image rather than withing the surrounding GitHub page.</p> Markdown code for GitHub raw image view<pre><code>\n</code></pre>","tags":["clojure"]},{"location":"springing-back-into-life-slowly/#tweak-github-language-detection","title":"Tweak GitHub language detection","text":"<p>The Practicalli repositories for the books are often labeled as HTML language, even thought they are written in Markdown.</p> <p>GitHub uses Linguist to understand the languages used. It seems Lingusta also includes the gh-branch when identifying languages.</p> <p>For a Practicalli book repository, Linguist is detecting the HTML generated from Markdown that is committed to the <code>gh-branch</code> and therefore considers HTML as the main language.</p> <p>Markdown override used for Practicalli Websites</p> .gitattributes<pre><code>docs/** linguist-detectable\n*.md linguist-detectable=true\n*.css linguist-detectable=false\n*.js linguist-detectable=false\n*.html linguist-detectable=false\n</code></pre> Language detection not immediately updated <p>It may take many minutes for GitHub to update the languages statistics on the repository page. Linguist will not report language statistics for repositories with over 10,000 committed files.</p>","tags":["clojure"]},{"location":"springing-back-into-life-slowly/#language-overrides","title":"Language Overrides","text":"<p>Linguist Overrides are configured via a <code>.gitattributes</code> file in the root of a project.</p> <p>Paths or languages can be excluded or included.</p> <p>File extensions can be classified as a specific (non default) language</p> <p>Markdown is detectable, ignore html, js and css languages</p> .gitattributes<pre><code>*.md linguist-detectable=true\n*.html linguist-detectable=false\n*.css linguist-detectable=false\n*.js linguist-detectable=false\n</code></pre> <p>Reclassify a language - HTML to Markdown</p> .gitattributes<pre><code>*.html linguist-language=Markdown\n</code></pre>","tags":["clojure"]},{"location":"springing-back-into-life-slowly/#ignore-vendor-paths","title":"Ignore vendor paths","text":"<p>Files and directories created by tools are termed 'vendor' by Linguist. These vendored paths are ignored by default.</p> <p>Move files and directories in one of these vendored directories for them to be ignored if checked into Git.</p> <p>Or set a specific directory as vendored in the current project using the <code>.gitattributes</code> file</p> <p>Ignore generated documentation</p> .gitattributes<pre><code>docs/** linguist-vendored\n</code></pre> <p>ignore all files</p> .gitattributes<pre><code>* linguist-vendored\n</code></pre> <p>Linguist - Vendor paths ignored</p> <p> Linguist docs - overrides</p> <p>Example .gitattribute overrides repository</p>","tags":["clojure"]},{"location":"springing-back-into-life-slowly/#secure-password-manager","title":"Secure password manager","text":"<p>I've been using NordVPN and NordPass for the last year and they provide a reliable service. Although recently the NordPass desktop app has stopped working on my Ubuntu 22.04 LTS Linux server.</p> <p>The NordPass app is okay) but has some constraints I dont really enjoy</p> <ul> <li>only available as a snap</li> <li>two approaches to browser extension, one that requires the desktop app to be installed</li> </ul> <p>Ideally I prefer a password manager entirely as a browser extension. If a desktop app does add value, then it should be available as widely used <code>.deb</code> package or at least an AppImage rather than snap package.</p> <p>For Debian and Ubuntu I have switched to the standalone extension for each browser:</p> <ul> <li>Chrome: NordPass stand-alone extension</li> <li>Firefox: NordPass Password manager & Digital Valut</li> </ul> <p>I am sure Snap is technically good, but I find the user experience poor.</p> <ul> <li>requires at least 2 versions of each package installed</li> <li>requires snapd running</li> <li>essentially means there are two package managers</li> </ul> <p>As Ubuntu seems to be delivering more of its desktop Linux distribution as snap packages, I've decided to go back to Debian Linux proper.</p>","tags":["clojure"]},{"location":"springing-back-into-life-slowly/#health","title":"Health","text":"<p>Further covid infection and lingering symptoms (exhaustion, coughing, swollen glands & general inflamation) has really slowed me down during February and early March.</p> <p>I seem to be on the road to 'normalcy' and hope to start exercising more throughout March.</p> <p>Unfortunately I was not quite ready to go for a cycle ride this weekend. It seems unlikely that I will be ready for the Kent Invicta Grimpeur 100 next weekend (9th March) or even the 50km version :( Each route includes some of the largest ascents in North Kent, including York Hill that reaches a 20% gradient towards the top.</p> <p>Thank you.</p> <p> Practical.li Website</p> <p> Practical.li GitHub Org practicalli-johnny profile</p> <p> @practicalli@clj.social @practical_li</p>","tags":["clojure"]},{"location":"having-a-donut-party-with-system-components/","title":"Having a Donut Party with system components","text":"<p>Not quite back to full health yet, so took it easy at the weekend.</p> <p>More work on restoring spare bicycles so I can sell them or otherwise find a good home.</p> <p>Continued the refactor of the Practicalli Service template, specifically refining the design of the system config and helper functions to support a development REPL workflow.</p>","tags":["clojure","repl-workflow","donut"]},{"location":"having-a-donut-party-with-system-components/#astronvim-update","title":"AstroNvim update","text":"<p>Space p A to update AstroNvim, version 3.44.2</p> AstroNvim update output <pre><code> Total: 80 plugins\n\n Breaking Changes (4)\n \u25cb astrocommunity\n c730a7e feat(grapple-nvim): better keymaps + add nvim-web-devicons dependency (#781) (9 days ago)\n bbd7f7f feat(pack): add Templ language pack (#780) (10 days ago)\n 30e8aae fix(grapple-nvim)!: update to Grapple v0.10.0 (#779) (10 days ago)\n 5f484ba docs(nix): Update README.md after LSP change (#778) (11 days ago)\n 5b45d23 docs(main): Add some contribution guidelines on documentation for the packs (#773) (2 weeks ago)\n 4351fd3 chore: move to `selene` for linting (2 weeks ago)\n d9751d3 docs: add sponsor link for AstroCommunity maintainer (2 weeks ago)\n 7e0cee4 docs(rust): Fix guide on how to use clippy instead of cargo check on save (#767) (2 weeks ago)\n f6a07ff fix(markdown-preview-nvim): yarn istead of npm (#770) (2 weeks ago)\n 1327177 docs(java): Add note about root pattern (#763) (3 weeks ago)\n\n \u25cb nvim-lspconfig \uebc7 Neoconf \uea86 User AstroFile\n e5e6002 docs: update server_configurations.md skip-checks: true (6 days ago)\n 6ae4776 feat: add config for some-sass-language-server (#3057) (6 days ago)\n d006e0c fix: lexical root directory config (#3055) (6 days ago)\n 9ad7021 docs: update server_configurations.md skip-checks: true (6 days ago)\n 48364fb docs(lua_ls): change suggested setup (6 days ago)\n b1fc956 docs: update server_configurations.md skip-checks: true (6 days ago)\n 28c5e77 feat: add configuration for Tabby ML (#3050) (6 days ago)\n a1c9b24 docs: update server_configurations.md skip-checks: true (7 days ago)\n 75ab4fa fix: allow terraform-ls to start properly (#3051) (#3053) (7 days ago)\n 534a255 docs: update server_configurations.md skip-checks: true (7 days ago)\n c9f387f docs: update documentation for Volar >= 2.0.0 (#3049) (7 days ago)\n 82a4b30 fix: update lua types to match latest nightly (#3048) (7 days ago)\n 7f5cf11 docs: update server_configurations.md skip-checks: true (8 days ago)\n 280ca49 fix(beancount): rename journalFile to journal_file (#3047) (8 days ago)\n b43d52a docs: update server_configurations.md skip-checks: true (8 days ago)\n bd2e75b docs: updated documentation for `harper-ls` (#3045) (8 days ago)\n 0b4cc60 docs: update server_configurations.md skip-checks: true (8 days ago)\n f6b8701 fix(css_variable_lsp): improve default settings (#3046) (8 days ago)\n c932a56 docs: update server_configurations.md skip-checks: true (8 days ago)\n 0959fc8 fix(css-variables): change - to _ in filename (#3044) (8 days ago)\n 083e36e docs: update server_configurations.md skip-checks: true (9 days ago)\n 6a62bc1 feat: add css-variables-language-server (#3042) (9 days ago)\n 32a82a0 docs: update server_configurations.md skip-checks: true (9 days ago)\n d23cb95 docs(terraformls): add docs on how to pass settings (#3040) (9 days ago)\n 2badbe5 docs: update server_configurations.md skip-checks: true (9 days ago)\n d4f4870 feat: add pico8-ls support (#3041) (9 days ago)\n 9553725 docs: update server_configurations.md skip-checks: true (12 days ago)\n 8ec68f7 feat: add markdown-oxide lsp (#3030) (12 days ago)\n daa8ae2 docs: update server_configurations.md skip-checks: true (12 days ago)\n 078410f feat: add delphilsp support (#3034) (12 days ago)\n 0ebcaed docs: update server_configurations.md skip-checks: true (12 days ago)\n 91d12df docs(veryl_ls): update url of verly_ls (#3037) (12 days ago)\n b1a11b0 fix(pyright): fix PyrightSetPythonPath command (#3032) (2 weeks ago)\n ec7d51a docs: update server_configurations.md skip-checks: true (2 weeks ago)\n ddfc22e fix(rust_analyzer): declare single file support (#3028) (2 weeks ago)\n 16029c2 docs: update server_configurations.md skip-checks: true (2 weeks ago)\n eb89b17 docs(lua_ls): add comment about additional libraries (#3029) (2 weeks ago)\n 60c3bd3 fix(bqnlsp): do not override user provided `cmd_env` (#3026) (2 weeks ago)\n b8751ff docs: update server_configurations.md skip-checks: true (2 weeks ago)\n d0a4176 fix: let core handle 'workspace/didChangeConfiguration' after init (#3023) (2 weeks ago)\n b22610c ci: clarify misleading comment from bot (2 weeks ago)\n 1015f07 docs: update server_configurations.md skip-checks: true (2 weeks ago)\n 6b264ff feat: add bqnlsp support (#3024) (2 weeks ago)\n d5b6d43 docs: update server_configurations.md skip-checks: true (3 weeks ago)\n 5831021 fix(purescript-language-server): add 'spago.yaml' to the list of root_patterns (#3022) (3 weeks ago)\n 6b9f4bb docs: update server_configurations.md skip-checks: true (3 weeks ago)\n 8b04820 fix: rename twig-language-server to twiggy-language-server (#3021) (3 weeks ago)\n 303f3b3 docs: update server_configurations.md skip-checks: true (3 weeks ago)\n 39bbea3 fix: twig-language-server cmd (#3019) (3 weeks ago)\n aa199c5 docs: update server_configurations.md skip-checks: true (3 weeks ago)\n 41406a7 feat: add gdshader-lsp support (#3018) (3 weeks ago)\n 1699ce1 docs: update server_configurations.md skip-checks: true (3 weeks ago)\n bdc29fe fix(ocaml): trigger by filetype, not language id (#3016) (3 weeks ago)\n d1bab4c docs: update server_configurations.md skip-checks: true (4 weeks ago)\n e2703ae fix(typos_lsp): update repository url (#3012) (4 weeks ago)\n 114bf18 docs: update server_configurations.md skip-checks: true (4 weeks ago)\n 946c58c feat(solidity_ls)!: switch to first-party npm package (#3011) (4 weeks ago)\n c656fe5 docs: update server_configurations.md skip-checks: true (4 weeks ago)\n 02c9b12 fix(quick_lint_js): enable for typescript (#3010) (4 weeks ago)\n ae91a30 docs: update server_configurations.md skip-checks: true (4 weeks ago)\n 56e40a7 feat(docker-compse-lsp): add more filetype into docker compse server(#3008) (4 weeks ago)\n 76251e8 docs: update server_configurations.md skip-checks: true (4 weeks ago)\n afb9339 fix(denols): add new deno.cache request implmention (#3007) (4 weeks ago)\n a367cab ci: bump JohnnyMorganz/stylua-action from 3 to 4 (4 weeks ago)\n\n \u25cf nvim-treesitter 14.29ms \uf487 rainbow-delimiters.nvim\n b781fd0 fix(c): improve doxygen comment matching (#6278) (4 hours ago)\n 488bec0 bot(lockfile): update arduino, beancount, ocaml, ocaml_interface (2 days ago)\n 7ff51f5 bot(lockfile): update swift, vim, wing (3 days ago)\n 5720531 bot(lockfile): update mlir, wing (3 days ago)\n b4553be fix(nickel): update highlights to grammar change (3 days ago)\n 9775d5d fix(luadoc): `@nospell` identifiers and keywords (4 days ago)\n a0f18ee feat(markdown): highlight link label delimiter (4 days ago)\n 51d7c36 bot(lockfile): update python, wing (5 days ago)\n c09932b bot(lockfile): update cue, gitcommit, wing (6 days ago)\n cc6b108 bot(lockfile): update gleam, php, php_only, swift, wing (7 days ago)\n 212b7a5 fix(angular): typo in capture name (#6249) (7 days ago)\n 70f0382 bot(lockfile): update puppet, swift, t32, wing (8 days ago)\n e479db6 fix(sourcepawn) update queries to grammar change (#6247) (8 days ago)\n 63ca90e feat(swift): add will/didSet indent (8 days ago)\n 3d08cdd fix(comment): remove duplicate 'FIXME' (8 days ago)\n 8a9bef9 bot(readme): update (8 days ago)\n 9e1f3c3 feat: add gotemplate and helm parser support (8 days ago)\n f8d4e5c bot(lockfile): update arduino, gpg, sourcepawn, ssh_config, vue, wing (8 days ago)\n 00bd760 feat(csharp): highlight excape sequences (#6229) (8 days ago)\n 533ad65 feat: map automake to make (8 days ago)\n 99ddf57 feat(highlights)!: enforce documented captures (#6232) (8 days ago)\n 22c5a0d ci: teach bot about conventional commits (9 days ago)\n e3e5ff4 Update README (9 days ago)\n ada920f feat(vue): switch to new parser (#6233) (9 days ago)\n a47540f Update parsers: vimdoc (10 days ago)\n cbaad19 Update parsers: sourcepawn (10 days ago)\n c2a2651 Update parsers: beancount, requirements, v, wing (11 days ago)\n 30a41f5 ci: bump create-pull-request to v6 (11 days ago)\n 3ad0e41 fix(astro): update to scanner rewrite (11 days ago)\n 8e349b1 feat(gitcommit): highlight overflow in commit body (11 days ago)\n 62b0bb4 feat(format): extra newline after modeline (11 days ago)\n 84daea5 Update parsers: angular, gitcommit, vimdoc, wing (11 days ago)\n 06b5fda feat: add support for gdshader (#6153) (11 days ago)\n 4349af8 Update parsers: chatito, gitattributes, gitcommit, gpg, groovy, hlsl, mermaid, pem, poe_filter, properties, pymanifest, requirements, ssh_config, udev, wing, xcompose (12 days ago)\n 4a8901b feat(beancount): refactor scanner to c (12 days ago)\n d2f58c0 Update parsers: dtd, gitattributes, hyprlang, tcl, wing, xml (12 days ago)\n c5b19f6 fix(typst): adapt queries to breaking parser update (12 days ago)\n 15d521c fix(purescript): comment out utf-8 char (12 days ago)\n 31d0648 Update parsers: angular, javascript, nim, perl, python, typst, wing (13 days ago)\n db12bd4 Update parsers: fidl, haskell, nickel, python, solidity, wing (2 weeks ago)\n 18aa5ae feat(c): local label highlights (2 weeks ago)\n fad40f2 Update parsers: arduino, php, php_only, wing (2 weeks ago)\n 6e2b56c feat(cooklang): update to scanner rewrite (2 weeks ago)\n 6f1f407 feat(rust): add more regex injection queries (2 weeks ago)\n ede5b46 Update parsers: gpg, properties, pymanifest, requirements, rust, ssh_config, swift, udev, v (2 weeks ago)\n 9896ef5 feat(gdscript): update parsers and queries. (#6176) (2 weeks ago)\n c06292f Update parsers: c, fennel, gitattributes, json, nim, pem, poe_filter, printf, readline, sourcepawn, wing, xcompose (2 weeks ago)\n adf7236 feat(nickel): adapt to scanner rewrite (2 weeks ago)\n e105b5e feat(properties): update parser & queries (2 weeks ago)\n e159a53 fix(fidl): remove requires_generate_from_grammar (2 weeks ago)\n f148c8a Update parsers: arduino, cmake, dtd, fidl, mlir, perl, slint, sourcepawn, wing, xml (3 weeks ago)\n 31641d7 feat(format-scripts): linewrap predicates (3 weeks ago)\n a29058f feat(faust): better highlighting of function calls, built-in variables, and member access (3 weeks ago)\n 9ecf980 Update README (3 weeks ago)\n a8d2b54 feat: add fidl parser (3 weeks ago)\n 19bf991 feat(c-sharp): add enum member declaration highlight query (3 weeks ago)\n 1398b1b Update parsers: cmake, dtd, faust, fennel, gdscript, html, lua, php, php_only, rust, sourcepawn, typst, vim, wing, xml (3 weeks ago)\n ebf0532 feat(chatito): update queries (3 weeks ago)\n ca46eb3 fix(highlights): highlight @type in phpdoc (3 weeks ago)\n 977d949 Update README (3 weeks ago)\n 7d1bab6 feat(fennel)!: switch to maintained parser (#6132) (3 weeks ago)\n 71ae32c docs(template): use builtin commands (3 weeks ago)\n d1484a1 feat: improve queries/muttrc/highlights.scm (3 weeks ago)\n 455f658 feat(query): indents that reflect the formatter (#6154) (3 weeks ago)\n 01cdcfb highlights(slang): add support for `where` (3 weeks ago)\n c4c1f51 Update parsers: cuda, dtd, gdscript, hlsl, readline, slang, sourcepawn, wing, xml (3 weeks ago)\n 6bd108a feat(typst): add raw block injections (3 weeks ago)\n 7eeb26e feat(ecma): folding for function arguments (3 weeks ago)\n d87074a Update parsers: gdscript, hlsplaylist, html, muttrc, wing, zathurarc (3 weeks ago)\n ea3dded fix(meson): adapt to renamed node (3 weeks ago)\n 1f6bd57 ci: remove mergify.yml as it's no longer used (3 weeks ago)\n 917d696 fix(scripts): add missing \\n for nested grouping (3 weeks ago)\n 4b27f87 fix(scripts): format-queries defaults to cwd (3 weeks ago)\n e04ce8b feat: add tmux parser (3 weeks ago)\n 5b3e986 ci: simplify cache key (3 weeks ago)\n 9bc2196 fix: typos (3 weeks ago)\n 3a7b5a9 feat(svelte)!: switch upstream parser (3 weeks ago)\n b3e53e9 Update parsers: c, cpp, elm, html, markdown, markdown_inline, swift, vimdoc (3 weeks ago)\n 4704d7a Update README (3 weeks ago)\n f857a96 fix(bass): revert to upstream parser (#6131) (3 weeks ago)\n d10e856 feat(beancount): add comment injection (3 weeks ago)\n 8e1df60 chore(puppet): update queries (3 weeks ago)\n fef26b5 fix(format): fix nested grouping indentation (#6128) (3 weeks ago)\n 5e4b657 fix(typst): add lockfile entry (3 weeks ago)\n 34cb6a4 Update README (3 weeks ago)\n 13e4e75 fix(typst): remove unneeded (blob) @markup.raw capture (3 weeks ago)\n 4640135 fix(typst): nest @markup.raw.block capture (3 weeks ago)\n 3f2f770 fix(typst): nest @variable.member highlight capture (3 weeks ago)\n bdff1ab style(typst): group fold clauses (3 weeks ago)\n 9772dd1 style(typst): merge @punctuation.bracket clauses (3 weeks ago)\n 097d6ff fix(typst): move comment query to the bottom (3 weeks ago)\n f85b205 style(typst): format queries (3 weeks ago)\n 06d575e fix(typst): prevent highlighting entire function calls (3 weeks ago)\n c76e7e2 fix(typst): correct highlight captures (3 weeks ago)\n b3847b9 feat(typst): add comment injection (3 weeks ago)\n 4cb1595 feat(typst): add #show to fold and indent queries (3 weeks ago)\n 2ba58a4 feat(typst): add highlight queries (3 weeks ago)\n ab3ec33 feat: add typst parser (3 weeks ago)\n 87bc770 style: format queries (3 weeks ago)\n c920b66 feat: add typst queries (3 weeks ago)\n 5d9e12c fix(bash): unordered concatenation highlights (3 weeks ago)\n f75a5b4 Update parsers: d, swift, wgsl_bevy (3 weeks ago)\n 42acc3f refactor(ecma): delimiter highlight consolidation (3 weeks ago)\n 17d68ac feat(rust): add doc comments (3 weeks ago)\n eb1914b feat(latex): more text func highlights (3 weeks ago)\n 47d013d Update parsers: c, javascript, rust, wing (3 weeks ago)\n 504fe10 feat(ecma): highlight label identifiers (3 weeks ago)\n 581e87b Update parsers: glsl, hlsl, hlsplaylist, muttrc, purescript, query, wing, zathurarc (4 weeks ago)\n d49a8f8 highlights(slang): add support for `associatedtype` (4 weeks ago)\n\n \u25cf rainbow-delimiters.nvim 14.77ms \uea86 VeryLazy\n cfc3f53 Fix name of busted shim in makefile (11 days ago)\n 4902de7 Rename busted shim (12 days ago)\n 2dd78f3 Fix Neovim shim for parallel runs (13 days ago)\n 64b7006 Update changelog (2 weeks ago)\n 5ec0504 fix(fennel)!: update queries to reflect new upstream parser (2 weeks ago)\n 161eb67 Add a shim for busted (3 weeks ago)\n 90bab50 Fix up 'clean' target in makefile (3 weeks ago)\n 4d2d3f9 Handle command-line arguments in shim (3 weeks ago)\n e03cdde Add Svelte support (3 weeks ago)\n df0a57a Maintain symlink only during test session (3 weeks ago)\n\n\n Updated (25)\n \u25cf alpha-nvim 7.88ms \udb82\udcb1 alpha \uf121 astronvim.autocmds\n 41283fb Fix: Close alpha after SessionLoadPost. (#267) (2 weeks ago)\n\n \u25cf astrotheme 0.6ms \uead3 start\n 6119b6b chore(main): release 3.4.0 (#110) (3 weeks ago)\n c20ca1b chore(build): auto-generate vimdoc (3 weeks ago)\n 1a16dac feat(todo-comments): add highlight support (#115) (3 weeks ago)\n b88c5c1 chore(build): auto-generate vimdoc (3 weeks ago)\n bb84325 feat(palette): rename `astromars-light` to `astrojupiter` (#114) (3 weeks ago)\n 42a7135 chore(build): auto-generate vimdoc (4 weeks ago)\n 8064465 fix: remove manual `blend` specifications (4 weeks ago)\n ade0b60 feat(palette): add back old `astrolight` as `astromars-light` (#112) (5 weeks ago)\n dffc812 feat(palette): align `astrolight` with `astrodark` (#109) (5 weeks ago)\n c2938b1 chore(build): auto-generate vimdoc (5 weeks ago)\n 7bc3bc6 fix(treesitter): fix spelling error on comment.warning (#113) (5 weeks ago)\n 84631e4 chore(build): auto-generate vimdoc (5 weeks ago)\n b42a494 feat(treesitter): change variable.memeber to link to property (#108) (5 weeks ago)\n 415d003 chore(build): auto-generate vimdoc (6 weeks ago)\n 8e5345e docs: update AstroNvim tagline (6 weeks ago)\n\n \u25cb ccc.nvim \uebc7 CccPick \uebc7 CccConvert \uebc7 CccHighlighterDisable \uebc7 CccHighlighterEnable \uebc7 CccHighlighterToggle \uf11c <leader>uC \uf11c <leader>zc \uf11c <leader>zp \uea86 InsertEnter \uea86 User AstroFile\n f3d9d31 fix: add validator of bufnr in update; because update calling is delayed by vim.schedule (4 days ago)\n 2ef48b4 first update at LspAttach (6 days ago)\n 3b25771 remove update_callback (6 days ago)\n cd0f8ff fix: avoid buf_request_all notify (6 days ago)\n 61b13d3 Remove extra file (7 days ago)\n db5907f Add requirements into doc (7 days ago)\n 4e79f59 Update requirements: neovim 0.9.0+ (7 days ago)\n 86299a4 fix: pattern.find should detect a null character (7 days ago)\n c8cfd0a Set highlight to ccc-ui (10 days ago)\n 37dd903 set namespace to window each time update (10 days ago)\n a170d44 off signcolumn (10 days ago)\n 5bbeb2e strict false (10 days ago)\n 56f2689 disable highlighter in ccc-ui (10 days ago)\n 325c398 Fix updating highlight in undo/redo; need to use vim.schedule() (10 days ago)\n fb740df prohibit a blank issue (11 days ago)\n 6b6782b update doc (11 days ago)\n 0ca30a4 doc: rename to cycle_input/output_mode (2 weeks ago)\n 5abfb71 Format with stylua (2 weeks ago)\n 36c25ef Refactor (#100) (2 weeks ago)\n 392ef06 fix: add type check to pattern.find (#102) (2 weeks ago)\n\n \u25cf everforest 0.22ms \uead3 start\n d8ce313 fix(tsx): import hl does not match js/ts (10 days ago)\n\n \u25cb friendly-snippets \uf487 LuaSnip\n dcd4a58 Remove some none (#409) (2 weeks ago)\n dbd45e9 add new snippet for vue (#404) (3 weeks ago)\n 00ac993 Add PureScript snippets (#401) (3 weeks ago)\n b4bc233 feat(ruby): add binding.break snippet (#403) (3 weeks ago)\n ad4fe8c feat(editorconfig): add editorconfig snippets (#392) (3 weeks ago)\n\n \u25cf kanagawa.nvim 0.05ms \uead3 start\n bfa818c Merge pull request #212 from champignoom/patch-1 (12 days ago)\n 582fe0a Update treesitter.lua, enable strikethrough and underline (12 days ago)\n\n \u25cf lazy.nvim 20.01ms \uf121 init.lua\n 83493db chore(main): release 10.17.0 (#1292) (4 days ago)\n a5ac169 chore(build): auto-generate vimdoc (4 days ago)\n 298bed1 fix: update to new treesitter capture groups (#1294) (4 days ago)\n d5c58bb fix(ui): remove a single space character from home title (#1309) (4 days ago)\n e1e8d2f chore(build): auto-generate vimdoc (4 days ago)\n 0694651 feat(loader): warn when maplocalleader is changed after init (#1326) (4 days ago)\n c96fc24 style: format (4 days ago)\n 5be95fe chore(build): auto-generate vimdoc (4 days ago)\n 5aea4e7 fix(types): fix incorrect LuaLS types (#1339) (4 days ago)\n aedcd79 chore(build): auto-generate vimdoc (7 weeks ago)\n 670a6fe fix(manage): better support for using the default colorscheme during install. See #1277 (7 weeks ago)\n\n \u25cb mason-null-ls.nvim \uebc7 NullLsInstall \uebc7 NullLsUninstall \uf487 null-ls.nvim\n e270134 chore(main): release 2.5.1 (#99) (12 days ago)\n 05385ea fix(docs): config requires `ignore_methods` field (#98) (12 days ago)\n\n \u25cb neo-tree.nvim \uebc7 Neotree\n 7f2ebde fix(deprecations): `wrap` was a window option (#1387) (2 days ago)\n bce4540 feat(nui): allow callbacks in nui input with option (#1372) (6 days ago)\n dcb63ab fix(renderer): fix cursor jumping (#1377) (6 days ago)\n 459c603 fix: skip normalizing empty file paths (#1363) (2 weeks ago)\n 7d3b020 fix(renderer): clean out edge cases of cursor.position.restore (#1355) (3 weeks ago)\n db178f4 fix: improve path escaping for commands on Windows (#1353) (4 weeks ago)\n\n \u25cb neogit \uf11c <leader>gnk \uf11c <leader>gs \uf11c <leader>gnt \uf11c <leader>gnc \uf11c <leader>gnd \uea86 User AstroGitFile\n 9c5b139 Merge pull request #1191 from ofseed/master (8 days ago)\n fe3b8f5 Merge pull request #1152 from Danielkonge/Danielkonge-patch-1 (8 days ago)\n 6f72f6d Merge pull request #1154 from PostCyberPunk/count (8 days ago)\n 944033b Modify postfix for finders (8 days ago)\n c637c13 Remove redundant prompt_prefix postfix (8 days ago)\n a8e667f Change default prompt_prefix value (8 days ago)\n 0d0879b Merge pull request #1185 from NeogitOrg/bugfix/tag-annotations (2 weeks ago)\n 8f74093 Do not always annotate tags unless specified. (2 weeks ago)\n 4075ca9 Merge pull request #1183 from NeogitOrg/make-dired-better (3 weeks ago)\n 22985e3 Bugfix: When choosing a directory with the default telescope sorter, do not select \"..\" if it's highlighted while there's something else written in the prompt. (3 weeks ago)\n 1eb9514 Update README.md (3 weeks ago)\n 02d4c1b Merge pull request #1181 from eternity74/fix-diffview (3 weeks ago)\n 6b4ec3a Fixed unwanted trim for file from diffview (3 weeks ago)\n b2916ea fix:rebase editor respect disable_line_numbers (5 weeks ago)\n b0415a0 fixup! feat:line_action count support (5 weeks ago)\n ddf8148 fix skipping \"edit\" (5 weeks ago)\n 9ce6ce4 feat:line_action count support (5 weeks ago)\n 8e74085 fix: typo in the kind type (6 weeks ago)\n\n \u25cb neovim-session-manager \uebc7 SessionManager \uea86 BufWritePost\n d8e1ba3 Update README.md (3 weeks ago)\n\n \u25cb nvim-autopairs \uea86 User AstroFile\n c6139ca docs: make improvements to readme (#435) (2 weeks ago)\n 1efb4f2 fix: don't add parentheses after bash/shell functions (#432) (2 weeks ago)\n 90f824d fix: use v:lua without parens (3 weeks ago)\n d4aef9d fix: conflict with vim-endwise fix #430 (3 weeks ago)\n 2e8a10c fix: avoid global variable usage (#426) (3 weeks ago)\n 00def01 docs: fix typo (#427) (3 weeks ago)\n\n \u25cf nvim-notify 1.67ms \udb82\udcb1 notify \uf487 noice.nvim\n 5371f4b fix(telescope): enable wrap on preview (#255) (3 weeks ago)\n 8836014 fix: improve correctness of neovim version checking (#259) (3 weeks ago)\n\n \u25cb nvim-spectre \uebc7 Spectre \uf11c <leader>ss \uf11c <leader>sw (x) \uf11c <leader>sf\n 3712ff0 style: reformat by stylua (3 weeks ago)\n 3e6da25 feat: add mapping yy to copy current line (3 weeks ago)\n\n \u25cf nvim-surround 1.45ms \uea86 VeryLazy\n \u25cf nvim-treesitter-textobjects 1.81ms \uf487 nvim-treesitter\n b7a0bfa docs: update queries in README (#578) (7 days ago)\n cf3d612 fix: nil index when swapping at first/last child (#577) (7 days ago)\n 3532f60 fix(fennel): update queries for the new grammar (#570) (8 days ago)\n 739da25 fix(swap): preserve swapped nodes' range metadata (#550) (8 days ago)\n 95933e7 docs: fix spelling (#563) (13 days ago)\n 7f00d94 docs: update queries in README (3 weeks ago)\n 1b39216 docs: update queries in README (3 weeks ago)\n b3af7c7 feat(bash): @parameter.inner for command arguments (3 weeks ago)\n 7bb0ada feat(readline): text objects for GNU Readline (3 weeks ago)\n\n \u25cb nvim-web-devicons\n 4adea17 fix: linux and other assorted dark colours (#408) (10 days ago)\n 69fb193 feat(#406): add set_icon_by_filetype (#407) (10 days ago)\n 0bb67ef feat(#192): :NvimWebDeviconsHiTest (#405) (2 weeks ago)\n 7a19449 feat: add checkhealth (#403) (2 weeks ago)\n 14ac588 feat: add nu (#401) (3 weeks ago)\n\n \u25cb octo.nvim \uf11c <leader>ghe7 \uf11c <leader>ghe8 \uf11c <leader>ghx \uf11c <leader>ghs \uf11c <leader>ghss \uf11c <leader>ghsf \uf11c <leader>ghsr \uf11c <leader>ghsd \uf11c <leader>ghsc \uf11c <leader>ghsp \uf11c <leader>gh \uf11c <leader>ghc \uf11c <leader>ghca \uf11c <leader>ghcd \uf11c <leader>ght \uf11c <leader>ghta \uf11c <leader>ghtd \uf11c <leader>ghi \uf11c <leader>ghic \uf11c <leader>ghir \uf11c <leader>ghil \uf11c <leader>ghiu \uf11c <leader>ghio \uf11c <leader>ghp \uf11c <leader>ghpp \uf11c <leader>ghpm \uf11c <leader>ghpmm \uf11c <leader>ghpms \uf11c <leader>ghpmd \uf11c <leader>ghpmr \uf11c <leader>ghpc \uf11c <leader>ghpn \uf11c <leader>ghpd \uf11c <leader>ghps \uf11c <leader>ghpr \uf11c <leader>ghpo \uf11c <leader>ghpu \uf11c <leader>ghpt \uf11c <leader>ghpl \uf11c <leader>ghr \uf11c <leader>ghrl \uf11c <leader>ghrf \uf11c <leader>ghro \uf11c <leader>ghru \uf11c <leader>gha \uf11c <leader>ghaa \uf11c <leader>ghar \uf11c <leader>ghap \uf11c <leader>ghl \uf11c <leader>ghla \uf11c <leader>ghlr \uf11c <leader>ghlc \uf11c <leader>ghe \uf11c <leader>ghe1 \uf11c <leader>ghe2 \uf11c <leader>ghe3 \uf11c <leader>ghe4 \uf11c <leader>ghe5 \uf11c <leader>ghe6\n 1e2376a Merge pull request #512 from jemag/fix-repo-browser (5 hours ago)\n 76d4a2e fix: use url for opening repo from Octo repo list (7 hours ago)\n b8fe290 Merge pull request #510 from sventec/doc-fix-duplicate-opts (8 hours ago)\n 4340775 fix: improper gh cli flag for repo browser (24 hours ago)\n 55f223f doc: remove duplicate options from readme (3 days ago)\n feae1e5 Merge pull request #499 from samjwillis97/master (3 weeks ago)\n 3d1ffd4 Shuffled whitespace (3 weeks ago)\n 481f93c Moved cmd not found error + changed message (3 weeks ago)\n aa1ddc9 Moved Github CLI command to a configuration. (3 weeks ago)\n\n \u25cb overseer.nvim \uebc7 OverseerClose \uebc7 OverseerToggle \uebc7 OverseerSaveBundle \uebc7 OverseerLoadBundle \uebc7 OverseerDeleteBundle \uebc7 OverseerRunCmd \uebc7 OverseerRun \uebc7 OverseerInfo \uebc7 OverseerBuild \uebc7 OverseerQuickAction \uebc7 OverseerTaskAction \uebc7 OverseerClearCache \uebc7 OverseerOpen\n b72f6d2 fix: remove calls to deprecated tbl_add_reverse_lookup (4 days ago)\n 4855aef fix: eslint and jshint problem matcher patterns (#260) (3 weeks ago)\n\n \u25cb rest.nvim \uebc7 RestNvimLast \uebc7 RestNvim \uebc7 RestNvimPreview \uf016 json \uf016 http \uf11c <leader>rr \uf11c <leader>r\n 1ddcc92 docs: improve Telescope extension doc (#293) (10 hours ago)\n b1c8447 Merge pull request #289 from rest-nvim/release-please--branches--main--components--rest.nvim (6 days ago)\n ea45dfa docs: add `ft` to `lazy.nvim` config example (#288) (6 days ago)\n e415a94 chore(main): release 1.2.0 (6 days ago)\n 8a0cf6d chore: autoformat with stylua (6 days ago)\n 2bb9570 feat: add pre-script configuration (#287) (6 days ago)\n c27a0bc Merge pull request #285 from lhanson/telescope-fd-gitignore (3 weeks ago)\n 16376c6 Find .gitignore'd .env files (3 weeks ago)\n\n \u25cb SchemaStore.nvim\n 8835555 Update SchemaStore catalog (7 days ago)\n d91daa5 Update SchemaStore catalog (8 days ago)\n ebe6fe2 Update SchemaStore catalog (10 days ago)\n f3a32e8 Update SchemaStore catalog (11 days ago)\n 9bc9a3a Update SchemaStore catalog (12 days ago)\n a93078f Update SchemaStore catalog (2 weeks ago)\n fac1359 Update SchemaStore catalog (2 weeks ago)\n 0358c7e Update SchemaStore catalog (3 weeks ago)\n 86dee56 Update SchemaStore catalog (3 weeks ago)\n adaca44 Update SchemaStore catalog (3 weeks ago)\n 12ff3ac Update README.md (3 weeks ago)\n ffaf412 Update README.md (3 weeks ago)\n 8440817 Update SchemaStore catalog (3 weeks ago)\n\n \u25cb smart-splits.nvim\n f6fcb79 fix(api): Rename function for consistency (7 days ago)\n 5c18899 feat(api): Add method to jump to previous window (7 days ago)\n 07fa44c Merge pull request #160 from Mr-Hypocrite/fix/wezterm-wsl (9 days ago)\n 324abc0 refactor: add default config for wezterm_cli_path if is_WSL func returns true unless it's provided in the config by user (9 days ago)\n 9f75734 chore: add annotation for is_WSL func (9 days ago)\n 9aa306a refactor: use wezterm_cli_path from config (10 days ago)\n d3bdca9 chore: change field name to wezterm_cli_path, add default / fallback wezterm_cli_path in local config (10 days ago)\n e00374f chore: move all utils associated to this context to mux utils, add a func to check for wezterm (10 days ago)\n 3e29e87 Merge branch 'master' into fix/wezterm-wsl (10 days ago)\n b26118d refactor: use wezterm_bin_path from config if present else use the fallback (10 days ago)\n 8bb1656 chore: add configuration opt for wezterm bin path (10 days ago)\n 40be526 refactor: change the way WSL environment is checked (10 days ago)\n 0cf7149 chore: Add .envrc to use flake.nix (10 days ago)\n 08ce46d Merge pull request #161 from mrjones2014/mrj/flake-maintenance (10 days ago)\n f8dc9b5 Merge branch 'master' into mrj/flake-maintenance (10 days ago)\n 181c77b chore: Install stylua and luacheck in flake.nix and setup tmux alias (10 days ago)\n e25e87d Merge branch 'master' into fix/wezterm-wsl (10 days ago)\n 1339ffe Merge pull request #159 from mrjones2014/mrj/158/non-zero-exit-code (11 days ago)\n 6e41903 fix: conditionally use wezterm.exe command if the environment is WSL (11 days ago)\n cac3db3 chore: add a check to detect WSL environment (11 days ago)\n 89a570a fix: Use jobstart with detach=true (12 days ago)\n a714522 fix(mux): Change `on_exit` to run on `VimLeavePre` instead of `VimLeave` (13 days ago)\n e1e1e6c Merge pull request #156 from mrjones2014/bot/vimdoc/master (3 weeks ago)\n fb1d8c6 chore: generated vimdoc (3 weeks ago)\n 1863c1b Merge pull request #155 from mrjones2014/mrj/tmux-performance (3 weeks ago)\n 8f76c49 docs: Update README.md (3 weeks ago)\n 9f96087 fix: fix typo in import (3 weeks ago)\n 57e0b9a feat: Add flake.nix with tmux config for testing (3 weeks ago)\n 6813e3f feat(mux): Faster tmux integration/mux initialization refactor (3 weeks ago)\n 159c482 refactor: move `are_we_wezterm()` function to mux.utils (3 weeks ago)\n 33c8507 Merge pull request #153 from mrjones2014/bot/vimdoc/master (3 weeks ago)\n bb4b2d5 chore: generated vimdoc (3 weeks ago)\n 5780c70 Merge pull request #152 from lucobellic/patch-1 (3 weeks ago)\n 1f307be docs: update README.md (3 weeks ago)\n\n \u25cb telescope-file-browser.nvim \uea86 User AstroFile\n 8839e3f fix(picker): reject non-dir path option (#363) (6 days ago)\n\n \u25cf telescope-fzf-native.nvim 0.21ms \u2714 build\n 9ef21b2 fix: OS detection logic to allow compiling with MYSYS cmake on Windows (#121) (6 days ago)\n\n \u25cb vim-visual-multi \uea86 User AstroFile\n</code></pre>","tags":["clojure","repl-workflow","donut"]},{"location":"having-a-donut-party-with-system-components/#practicalli-project-templates","title":"Practicalli Project Templates","text":"<p>Identified some refinements to the <code>practicalli/service</code> template, specifically with the <code>donut-party/system</code> configuration.</p> <p>REPL Workflow updates:</p> <ul> <li>comment mulog example log event and function to stop mulog publisher</li> <li>portal REPL helper functions in <code>dev/portal.clj</code> rather than <code>dev/user.clj</code></li> <li>update donut config when running via the REPL helper functions</li> </ul> <p>Service updates:</p> <ul> <li>service.clj: remove http-kit and mulog library requires (only required in <code>system.clj</code> file)</li> <li><code>system.clj</code>: moved mulog global context into dont config</li> </ul>","tags":["clojure","repl-workflow","donut"]},{"location":"having-a-donut-party-with-system-components/#donut-system-components","title":"Donut System components","text":"<p>donut-party/system library is a simple to use and reason about library for managing components that make up a service, e.g. logging, http server, request routing.</p> <p>The main system is defined as a Clojure hash-map, with specific keys to control the lifecycle of components</p> <ul> <li><code>::donut/start</code> key is bound to a function to start a particular component</li> <li><code>::donut/start</code> key is bound to a function to stop a running instance of the component (the instance created by <code>::donut/start</code>)</li> <li><code>::donut/config</code> is a hash-map of configuration values that can be passed to the <code>::donut/start</code> function (destructuring the relevant values into local names)</li> </ul>","tags":["clojure","repl-workflow","donut"]},{"location":"having-a-donut-party-with-system-components/#refactor-repl-workflow","title":"Refactor REPL workflow","text":"<p><code>donut.system.repl/start</code> is used to manage the system components as part of the REPL workflow.</p> <p>This function can be passed a donut named system to use a different configuration. The default named system is called <code>:donut.system/repl</code></p> <p>Practicall Service template sets the <code>:donut.system/repl</code> named system to use the configuration file for the service.</p> <p>Update main donut config with dev</p> <pre><code>(ns system-repl\n \"Tools for REPl workflow with Donut system components\"\n (:require\n [donut.system :as donut]\n [donut.system.repl :as donut-repl]\n [donut.system.repl.state :as donut-repl-state]\n [practicalli.gameboard.system :as system]))\n\n(defmethod donut/named-system :donut.system/repl\n [_] system/main)\n</code></pre> <p><code>donut.system/system</code> function updates the configuration defined by the named system with key values.</p> <p>In the Practicalli Service template, the <code>:app-env</code> key is updated with the value <code>\"dev\"</code></p> <p>Update main donut config with dev</p> <pre><code>(defn start\n \"Start system with donut, optionally passing a named system\"\n [] (donut-repl/start\n (donut/system :donut.system/repl\n {[:env :app-env] \"dev\"})))\n</code></pre>","tags":["clojure","repl-workflow","donut"]},{"location":"having-a-donut-party-with-system-components/#hammock-time","title":"Hammock time","text":"<p>After some hammock time the Donut REPL workflow code had a further refactor.</p> <p>To keep the configuration as simple as possible, the <code>main</code> configuration is used for all environments (production, staging, test, dev).</p> <p>Donut-party/system can create a named-system and provide overrides on top of another system, changing only the specific values needed for the new system.</p> <p>Pass an existing config or named system to the <code>donut/system</code> function, along with any values to override. A new system configuraiton is returned.</p> <p>Override the default donut.system/repl configuration</p> <pre><code>(donut/system :donut.system/repl\n {[:env :app-env] \"dev\"\n [:env :app-version] \"0.0.0-SNAPSHOT\"})\n</code></pre> <p>Creating a <code>:dev</code> named-system to support the development workflow would change the production configuration:</p> <ul> <li>changing the mulog publisher to output a pretty printed Clojure hash-map in dev (encoded into JSON for production)</li> <li>setting the application environment to dev (for parts of the system that may work differently in dev)</li> <li>overriding the http server options, i.e. <code>:join? false</code> to detach the REPL prompt from the server process after startup</li> </ul> <p>Refactor of service-repl namespace</p> <pre><code>;; ---------------------------------------------------------\n;; Donut named systems\n;; `:donut.system/repl` is default named system,\n;; bound to `{{top/ns}}.{{main/ns}}.system` configuration\n(defmethod donut/named-system :donut.system/repl\n [_] system/main)\n\n;; `dev` system, partially overriding main system configuration\n;; to support the development workflow\n(defmethod donut/named-system :dev\n [_] (donut/system :donut.system/repl\n {[:env :app-env] \"dev\"\n [:env :app-version] \"0.0.0-SNAPSHOT\"\n [:services :http-server ::donut/config :options :join?] false\n [:services :event-log-publisher ::donut/config]\n {:publisher {:type :console :pretty? true}}}))\n\n;; ---------------------------------------------------------\n\n;; ---------------------------------------------------------\n;; Donut REPL workflow helper functions\n\n(defn start\n \"Start services using a named-system configuration,\n use `:dev` named-system by default\"\n ([] (start :dev))\n ([named-system] (donut-repl/start named-system)))\n\n(defn stop\n \"Stop the currently running system\"\n [] (donut-repl/stop))\n\n(defn restart\n \"Restart the system with donut repl,\n Uses clojure.tools.namespace.repl to reload namespaces\n `(clojure.tools.namespace.repl/refresh :after 'donut.system.repl/start)`\"\n [] (donut-repl/restart))\n\n(defn system\n \"Return: fully qualified hash-map of system state\"\n [] donut-repl-state/system)\n;; ---------------------------------------------------------\n</code></pre> <p>Environment variables for ports and other things that may change between environments and deploys helps keep the configuration simple. Using juxt/aero is nice, but it adds a little more complexity to the configuration.</p>","tags":["clojure","repl-workflow","donut"]},{"location":"having-a-donut-party-with-system-components/#donut-practical-guide","title":"Donut practical guide","text":"<p>Update Practicalli Clojure Web Services guide on donut with recent lessons learned:</p> <p>The guide should include:</p> <ul> <li>overview</li> <li>add dependency</li> <li>defining a system configuration</li> <li>named-systems</li> <li>overriding values in a system configuration</li> <li>REPL workflow</li> <li>helper functions to start, stop & restart the system components. A system function to show the current value of the system should issues arise.</li> </ul> <p>juxt/aero</p> <ul> <li>consider using environment variables instead, especially if there is minimal difference between environments (prod, stage, test, dev)</li> </ul>","tags":["clojure","repl-workflow","donut"]},{"location":"having-a-donut-party-with-system-components/#clojure-essentials","title":"Clojure essentials","text":"<p>What are the essentials that any Clojure developer should know? Some initial thoughts:</p> <p>Syntax:</p> <ul> <li>define a custom function</li> <li>define a value using simple & complex values, anonymous and/or partial functions (or even a transducer)</li> <li>define a namespace and require libraries (when to use an alias and :refer)</li> <li>let for local names</li> <li>conditionals (if when cond some - and their variants)</li> <li>list, vector, hash-map and set data structures</li> <li>working with data structures (conj, get, into)</li> <li>generating & transforming data, e.g. map, reduce, partition, filter, group-by</li> <li>sequences and the basics of lazyness</li> <li>threading macro - flow and navigating paths to data</li> </ul> <p>Tooling and Workflow</p> <ul> <li>starting and configuring a REPL</li> <li>Clojure CLI configuration and aliases</li> <li>a REPL connected editor and evaluation options</li> <li>keeping a clean REPL state</li> <li>a test runner, e.g Kaocha</li> <li>data inspector, e.g. Portal (highly recommended)</li> <li>REPL reloaded Workflow (optional)</li> </ul> <p>Topics that can wait until there is a specific use case</p> <ul> <li>writing macros (unless designing an extension to the language)</li> <li>polymorphism (unless dispatching by custom types)</li> <li>Java interop (largely skipped as there are many wrapper libraries)</li> </ul>","tags":["clojure","repl-workflow","donut"]},{"location":"having-a-donut-party-with-system-components/#ubuntu-file-tracker","title":"Ubuntu file tracker","text":"<p>There is a file indexing package called <code>tracker-minder-fs</code> that can have a significant impact on the performance of even a high end computer.</p> <p>From the <code>apt show tracker-miner-fs -a</code> description:</p> <p>Description: metadata database, indexer and search tool - filesystem indexer. This package contains the tracker indexer for indexing your files and folders.</p> <p>Tracker is an advanced framework for first class objects with associated metadata and tags. It provides a one stop solution for all metadata, tags, shared object databases, search tools and indexing.</p> <p>Normally I would remove the package, however, it has dependencies from Ubuntu and Regolith desktop packages. These are meta packages, so it should be okay to remove them, so long as they do not remove all the other desktop related pacakges.</p> <p>Remove tracker minder package</p> <pre><code>sudo apt remove --purge tracker-miner-fs tracker-extract\n</code></pre> <p>I was concerned about removing <code>gnome-flashback</code> package, as I believe that provides the graphical login when starting Ubuntu with Regolight.</p> <p>Packages to be removed</p> <pre><code>The following packages will be REMOVED\n gnome-flashback* gnome-shell-extension-desktop-icons-ng* nautilus* nautilus-share* regolith-desktop*\n regolith-session-flashback* tracker-extract* tracker-miner-fs* ubuntu-desktop* ubuntu-desktop-minimal*\n</code></pre> <p>Hopefully in a newer version of Regolith desktop or using Debian Linux as the base of Regolith Linux will not include this overactive file indexer.</p> <p>Thank you.</p> <p> Practical.li Website</p> <p> Practical.li GitHub Org practicalli-johnny profile</p> <p> @practicalli@clj.social @practical_li</p>","tags":["clojure","repl-workflow","donut"]},{"location":"debian-linux-almost-everywhere/","title":"Debian Linux almost everywhere","text":"<p>Enjoying being back in Debian Linux world, with regolith desktop as the tiling window manager.</p> <p>I have several Lenovo laptops and all but one are now upgraded to Debian Linux, using the testing version of the distribution.</p> <p>The most significant difference with Debian Linux is the use of a separate root account for administration, rather than using <code>sudo</code> in Ubuntu Linux.</p>","tags":["clojure"]},{"location":"debian-linux-almost-everywhere/#debian-linux-with-regolith-desktop","title":"Debian Linux with Regolith Desktop","text":"<p>Download the ISO image from Debian.org. The default is the Net ISO which has the essential packages for Linux.</p> <p>Create a bootable USB drive with the ISO image, on Linux this can be achieved by a simple copy command</p> <p>Create bootable USB install for Debian Linux</p> <pre><code>cp debian-linux.iso /dev/sdb1\n</code></pre> <p><code>/dev/sda1</code> should be the main disk drive for the computer. Use <code>df</code> command to check which mount points are the USB drive and computer hard drive.</p> <p>Install Debian Linux from the Net ISO image by rebooting the computer. Most modern laptops have a boot selection menu that shows when pressing F12 ask the computer bios starts.</p> <p>Follow the Debain Linux installer prompts. At the end, select the Debian Desktop environmet. Its also recommended to install the OpenSSH server and recommended tools (selected by default).</p> <p>If the Debian Desktop task is not installed, then not enough packages are added by Regolith Desktop to run an X Window session. Also the Sway Wayland package has unmet dependencies.</p> <p>Reboot the computer after the install is complete.</p> <p>Login to Debian Linux and download the Regolith Desktop install script.</p> DownloadCopy from computer <pre><code>wget https://github.com/practicalli/dotfiles/regolith-desktop-install\n</code></pre> <pre><code>scp username@192.168.0.250:/home/practicalli/regolith-desktop-install .\n</code></pre> Regolith Desktop - single install script for Debian Linux <pre><code>apt install gpg && \\\nwget -qO - https://regolith-desktop.org/regolith.key | \\\ngpg --dearmor | tee /usr/share/keyrings/regolith-archive-keyring.gpg > /dev/null && \\\necho deb \"[arch=amd64 signed-by=/usr/share/keyrings/regolith-archive-keyring.gpg] \\\nhttps://regolith-desktop.org/release-3_1-debian-bookworm-amd64 bookworm main\" | \\\ntee /etc/apt/sources.list.d/regolith.list && \\\napt update && \\\napt install regolith-desktop regolith-session-flashback regolith-look-gruvbox\n</code></pre>","tags":["clojure"]},{"location":"debian-linux-almost-everywhere/#post-install","title":"Post install","text":"<p>Debian Linux installs a number of packages that I dont need, including Libre Office suite.</p> <p>Remove Libra Office</p> <pre><code>apt purge libreoffice*\n</code></pre> <p>Thank you.</p> <p> Practical.li Website</p> <p> Practical.li GitHub Org practicalli-johnny profile</p> <p> @practicalli@clj.social @practical_li</p>","tags":["clojure"]},{"location":"git-multiple-ssh-keys--neovim/","title":"Git Multiple SSH Keys & Neovim","text":"<p>A short week at work made even shorter by a company day to celebrate going live. A chance to unwind and reflect.</p> <p>Neovim 0.10 is planned for 1 May 2024. Plugins should be unafected, although actively developing plugins like Neogit are trying to used parts of the Neovim API. The parts of Neogit that use 0.10 api should be more efficient, although I assume there wont be a noticable difference in functionality.</p> <p>I will update Neovim to 0.10 when AstroNvim confirms it is working well with that release.</p>","tags":["clojure","git","neovim"]},{"location":"git-multiple-ssh-keys--neovim/#git-and-multiple-ssh-keys","title":"Git and Multiple SSH keys","text":"<p>Use the SSH config to define <code>Host</code> aliases for different GitHub accounts. Each host defines the hostname it will use for the connection.</p> <p>Multiple Host definitions</p> <pre><code>Host community\n HostName github.com\n IdentityFile ~/.ssh/community\n\nHost commercial\n HostName github.com\n IdentityFile ~/.ssh/commercial\n\nHost personal\n HostName github.com\n IdentityFile ~/.ssh/practicalli\n</code></pre> <p>Clone using personal Host alias</p> <pre><code>git clone git@personal:practicalli/clojure\n</code></pre> <p>The <code>practicalli</code> host alias is replaced by its <code>HostName</code> domain.</p> <p>Use Git clone aliases to simplify the command line</p> <p>Git Clone aliases</p> .config/git/config<pre><code>[url \"git@company:company-org/\"]\n insteadOf = c:\n\n[url \"git@engineering:practicalli/\"]\n insteadOf = p:\n</code></pre> <p>Clone using alias</p> <pre><code>git clone p:clojure\n</code></pre> <p>Use separate user accounts when there are significant differences between work, community and personal development environments</p>","tags":["clojure","git","neovim"]},{"location":"git-multiple-ssh-keys--neovim/#neogit-rebase","title":"Neogit rebase","text":"<p>Hopefully more rebase functions in Neogit.</p> AstroNvim new version <pre><code>\u25cb neogit \uea86 User AstroGitFile \uf11c <leader>gs \uf11c <leader>gnt \uf11c <leader>gnc \uf11c <leader>gnd \uf11c <leader>gnk\n 20ab5a6 Merge pull request #1213 from kjughx/rebase-drop\n d44bf7f Add test for rebase_drop\n 5185d91 Add rebase \"drop a commit\" to rebase\n 660d1f0 Use git.rev_parse.abbreviate_commit instead of abbreviated_size()\n 2ec7c25 Merge pull request #1211 from kjughx/rebase-modify\n 3d2aaec Update tests/specs/neogit/popups/rebase_spec.lua\n d20d16d Update lua/neogit/lib/git/log.lua\n c940678 Add tests for rebase_modify\n de6ecfb Fix existing unit tests for test_reword\n a5d5cc6 Add \"modify a commit\" to rebase\n 87b7fc6 Add helper function to get length of hash\n b195cf3 Merge pull request #1212 from NeogitOrg/backport-logging (4 hours ago)\n 9f9eb8e Spelling (4 hours ago)\n ffab01c Rename json -> record since it's not json anymore (4 hours ago)\n dd1de78 Update json spec (4 hours ago)\n 04dcfd0 Better parsing with fewer loops/allocations (4 hours ago)\n 78655a6 Use record separators instead of eval'ing the git output. (4 hours ago)\n c27fcb2 Handle multi-line commit messages by joining all lines, then re-splitting on the record separators. (4 hours ago)\n 7f3e0d3 Replace json parsing with string eval to lua tables. Having bug reports that we don't properly escape string fields, and this approach basically sidesteps all that. (4 hours ago)\n 10feeec Update README.md (11 hours ago)\n bf2a353 Update README.md (2 days ago)\n 4c29337 Merge pull request #1206 from NeogitOrg/CKolkey-patch-1 (2 days ago)\n 16aa16e Update README.md (2 days ago)\n</code></pre> <p>Thank you.</p> <p> Practical.li Website</p> <p> Practical.li GitHub Org practicalli-johnny profile</p> <p> @practicalli@clj.social @practical_li</p>","tags":["clojure","git","neovim"]},{"location":"gardening-in-the-mornings/","title":"Gardening in the mornings","text":"<p>A new month so time to update libraries across Practicalli projects.</p> <p>Bank holiday Monday and two personal holidays this week, so only two days at work and very few meetings, yay!. Time to prepare for the company offsite event next week and see how lightly I can pack.</p> <p>I made a big impact on upgrading the garden this week. All the paving stones at the end of the garden were levelled so the shed is no longer on a slope. A thick weed surpressing membrane was fitted underneath all the paving stones.</p> <p>The raised garden bed was be reworked by adjusting the top of the railway sleepers to be level to the top of the paving stones. This adds a nice clean line with the garden and makes maintenance in and around the garden easier. Weed surpressing membrane was added to the side and underneath of each sleeper. Spare wood panels was used to keep the membrane in plate and to also add more robustness to the sleepers.</p> <p>Most of the work was done in the early mornings as the weather was quite hot.</p>","tags":["clojure"]},{"location":"gardening-in-the-mornings/#practicalli-clojure-cli-config","title":"Practicalli Clojure CLI Config","text":"<p>Monthly library updates and published a new release. Used AstroNvim & Neovim to update the libraries, instead of the usual Emacs approach.</p> <p>A combination of search, highlight, jump and dot repeat commands were used to update the same version number of a specific library.</p> <p>/ followed by the library name to update to find the next occurrence, then ++dollar++ to jump to the end of the line and back a word to land on the string containing the version number.</p> <p># to highlight all matching version number values (hopefully the same number of occurrences that antq found to update)</p> <p>c w to change the current version value and type in the updated version.</p> <p>n jumps to next occurrence and N jumps to previous occurrence.</p> <p>. repeats the change word action using dot-repeat, updating the next (or previous) matching version to update.</p> <p>Jump through all library statements and dot-repeat to update all the versions.</p>","tags":["clojure"]},{"location":"gardening-in-the-mornings/#practicalli-web-services","title":"Practicalli Web Services","text":"<p>Generated a working Clojure API project from the <code>practicalli/service</code> template, using donut-party/system to manage the service components.</p> <pre><code>clojure -T:project/create :template practicalli/service :name practicalli/gameboard :component :donut\n</code></pre> <p>Pushed the code to practicalli/gameboard-donut to help others see how such a project is organised.</p>","tags":["clojure"]},{"location":"gardening-in-the-mornings/#neovim","title":"Neovim","text":"<p>Pressing / in insert mode causes Neovim to lock up, rather than showing completion for the file system path. Some testing is required to see what could be the cause.</p> <p>Test using the following</p> <ul> <li>run <code>nvim</code> without any config (check if this is a neovim bug or perhaps a missing feature)</li> <li>run <code>nvim</code> with the astro-template config (check if its any of my plugins that are causing the issue or if it also appears in the default AstroNvim config)</li> </ul> <p>Thank you.</p> <p> Practical.li Website</p> <p> Practical.li GitHub Org practicalli-johnny profile</p> <p> @practicalli@clj.social @practical_li</p>","tags":["clojure"]},{"location":"company-offsite-week/","title":"Company offsite week","text":"<p>Travelled for a work event in Portugal with a chance to meet people I work with face to face for the first time. It was a very enjoyable and also quite intensive event. I kept myself busy to help combat fatigue from travelling and manage a swim each morning and evening whilst I was at the hotel.</p> <p>I am accustom to working remotely since 2010, having worked for companies based outside of the UK. It is always very valuable to meet people face to face and can start or strengthen a relationship.</p>","tags":["neovim","astronvim"]},{"location":"company-offsite-week/#company-offsite","title":"Company Offsite","text":"<p>The first evening was a nice dinner after a quick and refreshing shower.</p> <p>A bracing swim in the mornings really helped give me energy for each day. Swimming was also a great way to minimise any feelings of travel. I took the opportunity to have at least 1 swim a day, with 2 swims on Tuesday.</p> <p>I was very sleepy on the taxi ride from the airport to the hotel on Monday. I slept on the flight the whole way back to the UK. I am not sure I even remember the take-off.</p> <p>Tuesday night was a relaxed evening where everyone could do there own activity.</p> <p>A few of use tried a co-operative card game called \"Hanabi\" which is also an example of a limited communication game. No one can see their own cards but can see everyone else's. Each player can either play a card, give a hint to a player or discard a card they hold. There is a limited number of hints available (tracked by tokens) and a use hint is reactivated if a card is played correctly.</p> <p>As there was a limit on communication, it was fascinating to see the body language and non-verbal communication of all the players.</p>","tags":["neovim","astronvim"]},{"location":"company-offsite-week/#neovim","title":"Neovim","text":"<p>Version 0.10.0 released.</p> <p>Downloaded the <code>nvim.appimage</code> file from the Neovim GitHub repository release page and copied to <code>~/.local/bin/nvim-0.10.0.appimage</code>. The <code>~/.local/bin/</code> directory is already on the operating system execution path.</p> <p>The Neovim roadmap gives an overview of the major features and changes in version 0.10.0.</p> <ul> <li>Default colorscheme</li> <li>LSP inlay hints</li> <li>TermRequest, TermResponse</li> <li>treesitter: builtin parsers for bash, markdown, python</li> <li>vim.iter</li> <li>vim.lpeg, vim.re, vim.glob, vim.base64</li> </ul> <p>Neovim 0.10.0 Changelog covers all breaking changes, new & changed features and deprecations.</p> <p>I am unclear if there are any major features I will notice. I am sure I will benefit from the large number of small improvements, even if I do not experience them directly.</p> <p>A bug that was annoying is now fixed. Typing <code>/</code> in insert mode for a markdown file was hanging neovim so badly that the process had to be killed. <code>/</code> in insert mode now shows the directory listing completion and no longer crashes Neovim.</p>","tags":["neovim","astronvim"]},{"location":"company-offsite-week/#astronvim","title":"AstroNvim","text":"<p>Astrocommunity packages were updated previously to work with AstroNvim 0.4 version.</p> <p>Many changes to AstroNvim plugins and Astrocommunity plugins have also been updated to ensure they support Neovim 0.10.0</p> <p>Thank you.</p> <p> Practical.li Website</p> <p> Practical.li GitHub Org practicalli-johnny profile</p> <p> @practicalli@clj.social @practical_li</p>","tags":["neovim","astronvim"]},{"location":"refactor-astronvim-clojure-pack/","title":"Refactor AstroNvim Clojure pack","text":"<p>Pull requests this week</p> <ul> <li> MERGED Add Clojure comment patterns to ts-comments.nvim</li> <li> MERGED Modularise Astrocommunity Clojure pack</li> <li> MERGED Update AstroNvim Cloure pack description & simplify examples</li> <li> MERGED Fix vim-visual-multi dependency name</li> </ul> <p>Total commits this week: 37</p> <p>Submitted a pull request to refactor the AstroNvim Community Clojure language pack which I contributed in June 2023.</p> <ul> <li>add nvim-treesitter-sexp plugin</li> <li>add example of disabling / configuring parinfer plugin</li> <li>add ts-comment.nvim to support <code>;;</code> and <code>;</code> comment characters</li> <li>remove autocmd from conjure plugin (no longer needed)</li> <li>remove most of the opinionated conjure configuration overrides, although still hiding the repl log buffer (HUD) by default as its nicer as a separate tab. Maybe if I can have it open by default as a tab, then I could live with having the HUD open on REPL startup (a nice way to check things are working)</li> </ul> <p>Still sleepy from travel to the company off-site last week and the cycle ride on Saturday. Although I did manage some work in the garden on Sunday.</p>","tags":["neovim"]},{"location":"refactor-astronvim-clojure-pack/#neovim","title":"Neovim","text":"<p>Refactor AstroNvim Community Clojure language pack with the help of the Astrocommunity team. All plugins have their own Astrocommunity plugin configuration separately and the Clojure pack composes those plugins, making the configuration far simpler.</p> <p>Updates to Conjure mean that the diagnostics no longer require an autocmd to disable them (currently in <code>dev</code>)</p> <p>Added Clojure comment patterns to the ts-comment.nvim plugin. That plugin now supports the <code>;;</code> style comment syntax that is traditionally used for line comments, as well as the <code>;</code> comment that is defined by the Clojure style guide as a post line comment</p> AstroNvim Community Clojure pack auto commands - no longer requred <p>This was the previous configuration for Conjure in the Clojure pack</p> <pre><code> {\n \"Olical/conjure\",\n -- load plugin on filetypes\n filetype = { \"clojure\" },\n dependencies = {\n \"AstroNvim/astrocore\",\n opts = {\n autocmds = { -- (1)!\n conjure_log_disable_lsp = {\n {\n event = \"BufNewFile\",\n pattern = { \"conjure-log-*\" },\n callback = function() vim.diagnostic.disable(0) end,\n desc = \"Conjure Log disable LSP diagnostics\",\n },\n {\n event = \"FileType\",\n pattern = { \"clojure\" },\n callback = function() vim.bo.commentstring = \";; %s\" end,\n desc = \"Lisp style line comment\",\n },\n },\n },\n options = {\n g = { -- (2)!\n [\"conjure#log#hud#width\"] = 1,\n [\"conjure#log#hud#enabled\"] = false, -- show log by default?\n [\"conjure#log#hud#anchor\"] = \"SE\",\n [\"conjure#log#botright\"] = true,\n [\"conjure#extract#context_header_lines\"] = 100,\n [\"conjure#eval#comment_prefix\"] = \";; \",\n [\"conjure#client#clojure#nrepl#connection#auto_repl#enabled\"] = false,\n [\"conjure#client#clojure#nrepl#connection#auto_repl#hidden\"] = true,\n [\"conjure#client#clojure#nrepl#connection#auto_repl#cmd\"] = nil,\n [\"conjure#client#clojure#nrepl#eval#auto_require\"] = false,\n [\"conjure#client#clojure#nrepl#test#runner\"] = \"kaocha\",\n },\n },\n },\n },\n },\n</code></pre> <ol> <li>autocmd config is no longer required, ts-comment.nvim is used instead</li> <li>global options overrides are to be reduced, with an example in Clojure pack readme showing how to override them</li> </ol> Treesitter Structured Editing with nvim-treesitter-sexp <p>A full example of nvim-treesitter-sexp configuration for AstroNvim</p> <pre><code> -- Treesitter structural editing\n -- - package provides normal mode key mappings\n -- - practicalli config adds which-key mappings\n {\n \"PaterJason/nvim-treesitter-sexp\",\n filetype = { \"clojure\" },\n dependencies = {\n \"AstroNvim/astrocore\",\n opts = {\n -- configuration & keymaps overrides:\n -- https://github.com/PaterJason/nvim-treesitter-sexp#configuration\n -- enabled = false,\n -- -- Set to false to disable individual keymaps\n -- set_cursor = true,\n -- keymaps = { -- (1)!\n -- Default key bindings - set to false to disable\n -- commands = {\n -- swap_prev_elem = \"<e\",\n swap_prev_elem = false,\n -- swap_next_elem = \">e\",\n -- swap_prev_form = \"<f\",\n -- swap_next_form = \">f\",\n -- promote_elem = \"<LocalLeader>O\",\n -- promote_form = \"<LocalLeader>o\",\n -- splice = \"<LocalLeader>@\",\n -- slurp_left = \"<(\",\n -- slurp_right = \">)\",\n -- barf_left = \">(\",\n -- barf_right = \"<)\",\n -- insert_head = \"<I\",\n -- insert_tail = \">I\",\n -- },\n -- motions = {\n -- form_start = \"(\",\n -- form_end = \")\",\n -- prev_elem = \"[e\",\n -- next_elem = \"]e\",\n -- prev_elem_end = \"[E\",\n -- next_elem_end = \"]E\",\n -- prev_top_level = \"[[\",\n -- next_top_level = \"]]\",\n -- },\n -- textobjects = {\n -- inner_elem = \"ie\",\n -- outer_elem = \"ae\",\n -- inner_form = \"if\",\n -- outer_form = \"af\",\n -- inner_top_level = \"iF\",\n -- outer_top_level = \"aF\",\n -- },\n -- },\n options = {\n g = {},\n },\n mappings = { -- (2)!\n n = {\n -- Additional Which-key key mappings for nvim-treesitter-sexp\n [\"<leader>k\"] = { name = \"Structural Editing\" },\n [\"<leader>kE\"] = { \"<cmd>TSSexp swap_prev_elem<cr>\", desc = \"Swap Previous Element\" },\n [\"<leader>ke\"] = { \"<cmd>TSSexp swap_next_elem<cr>\", desc = \"Swap Previous Element\" },\n [\"<leader>kF\"] = { \"<cmd>TSSexp swap_prev_form<cr>\", desc = \"Swap Previous Form\" },\n [\"<leader>kf\"] = { \"<cmd>TSSexp swap_next_form<cr>\", desc = \"Swap Previous Form\" },\n [\"<leader>kk\"] = { \"<cmd>TSSexp promote_elem<cr>\", desc = \"Promote Element\" },\n [\"<leader>kr\"] = { \"<cmd>TSSexp promote_form<cr>\", desc = \"Promote Form\" },\n [\"<leader>k@\"] = { \"<cmd>TSSexp splice<cr>\", desc = \"Splice\" },\n [\"<leader>kS\"] = { \"<cmd>TSSexp slurp_left<cr>\", desc = \"Slurp Left\" },\n [\"<leader>ks\"] = { \"<cmd>TSSexp slurp_right<cr>\", desc = \"Slurp Right\" },\n [\"<leader>kB\"] = { \"<cmd>TSSexp barf_left<cr>\", desc = \"Barf Left\" },\n [\"<leader>kb\"] = { \"<cmd>TSSexp barf_right<cr>\", desc = \"Barf Right\" },\n [\"<leader>kI\"] = { \"<cmd>TSSexp barf_right<cr>\", desc = \"Insert Head\" },\n [\"<leader>ki\"] = { \"<cmd>TSSexp barf_right<cr>\", desc = \"Insert Tail\" },\n },\n t = {\n -- terminal? mode key bindings\n },\n v = {\n -- visual mode key bindings\n },\n },\n },\n },\n },\n</code></pre> <ol> <li>Default keymaps can be disabled by setting the value to <code>false</code></li> <li>Designed keymaps for discoverability along the lines of Spacemacs Lisp Mode <code>SPC k</code>, although deemed superfluous as the default keymaps from the plugin felt more appropriate for Neovim</li> </ol> Refactor of AstroCommunity Clojure language pack <pre><code>-- ------------------------------------------\n-- Clojure language pack\n--\n-- clojure-lsp server via mason\n-- treesitter clojure parser\n-- ts-comment.nvim with `;;` and `;` support\n-- structured editing with parinfer and treesitter-sexp plugins\n-- REPL connected editor with Conjure plugin (log hidden by default)\n-- ------------------------------------------\nreturn {\n -- Clojure Language Server\n {\n \"williamboman/mason-lspconfig.nvim\",\n optional = true,\n opts = function(_, opts)\n opts.ensure_installed = require(\"astrocore\").list_insert_unique(opts.ensure_installed, { \"clojure_lsp\" })\n end,\n },\n {\n \"WhoIsSethDaniel/mason-tool-installer.nvim\",\n optional = true,\n opts = function(_, opts)\n opts.ensure_installed = require(\"astrocore\").list_insert_unique(opts.ensure_installed, { \"clojure-lsp\" })\n end,\n },\n -- Clojure parser\n {\n \"nvim-treesitter/nvim-treesitter\",\n optional = true,\n opts = function(_, opts)\n if opts.ensure_installed ~= \"all\" then\n opts.ensure_installed = require(\"astrocore\").list_insert_unique(opts.ensure_installed, { \"clojure\" })\n end\n end,\n },\n\n -- Comment support `;;` and `;` (requires nvim 0.10.0)\n -- first disable potential plugin clashes\n { \"numToStr/Comment.nvim\", enabled = false },\n { \"JoosepAlviste/nvim-ts-context-commentstring\", enabled = false },\n -- Add ts-comment.nvim with Clojure comment strings\n {\n \"folke/ts-comments.nvim\",\n filetype = { \"clojure\" },\n opts = {\n lang = {\n clojure = { \";; %s\", \"; %s\" }, --(1)!\n },\n },\n event = \"VeryLazy\",\n enabled = vim.fn.has \"nvim-0.10.0\" == 1,\n },\n\n -- Parinfer parens management for Clojure\n {\n \"gpanders/nvim-parinfer\",\n filetype = { \"clojure\" },\n dependencies = {\n \"AstroNvim/astrocore\",\n opts = {\n options = { g = {\n parinfer_force_balance = true,\n parinfer_comment_chars = \";;\",\n } },\n },\n },\n },\n\n -- Treesitter structural editing\n -- package provides normal mode key mappings\n {\n \"PaterJason/nvim-treesitter-sexp\",\n filetype = { \"clojure\" },\n dependencies = {\n \"AstroNvim/astrocore\",\n opts = {\n -- configuration & keymaps overrides:\n -- https://github.com/PaterJason/nvim-treesitter-sexp#configuration\n },\n },\n },\n\n -- Conjure plugin for Clojure REPL\n {\n \"Olical/conjure\",\n -- load plugin on filetypes\n filetype = { \"clojure\" },\n dependencies = {\n \"AstroNvim/astrocore\",\n opts = {\n options = {\n g = {\n [\"conjure#log#hud#enabled\"] = false, -- show REPL log by default?\n [\"conjure#extract#context_header_lines\"] = 100, -- lines to examine for ns form\n [\"conjure#eval#comment_prefix\"] = \";; \",\n },\n },\n },\n },\n },\n}\n</code></pre> <ol> <li>ts-comment.nvim clojure pattern was merged into the project by pull request #19 so this configuration is now redundant</li> </ol> <p>Thank you.</p> <p> Practical.li Website</p> <p> Practical.li GitHub Org practicalli-johnny profile</p> <p> @practicalli@clj.social @practical_li</p>","tags":["neovim"]},{"location":"multiple-ssh-keys-for-commercial-and-community-work/","title":"Multiple SSH keys for Commercial and Community work","text":"<p>Its easy to go down a rabbit hole of your own making when trying to make something complex work. Taking a step back allows for a much simpler approach to be considered.</p> <p>I realised there was a much simpler approach to managing multiple SSH keys, especially when one of those keys is for commercial work that requires Single Sign-On authorisation.</p>","tags":["git"]},{"location":"multiple-ssh-keys-for-commercial-and-community-work/#ssh-keys-git-client","title":"SSH Keys & Git client","text":"<p>There advantages to using separate SSH keys for work on commercial projects and open source projects.</p> <ul> <li>Increased security as only the SSH key with Single Sign-on (SSO) authorisation can send or receive data from the GitHub commercial Organisation. SSO authorisation should always be require for commercial projects.</li> <li>Increased tracability as signing commits with SSH keys has identity, the generated key and email address attached to the key via a comment when created, e.g. <code>ssh-keygen -t ed25519 -C \"email@domain.com\"</code></li> </ul> <p>Using multiple keys only requires a little extra configuration and helps keep a good separation between commercial and community work.</p> <p>Multiple Git Identities</p> <p>Configuration of a Git client for Multiple Git Identities can define a specific SSH key for a subset of projects, e.g. all projects under a <code>company-name</code> directory</p> <p>Practicalli recommends SSH keys for commit & tag signing as the configuration is simpler than PGP key signing</p>","tags":["git"]},{"location":"multiple-ssh-keys-for-commercial-and-community-work/#ssh-keys-github","title":"SSH Keys & GitHub","text":"<p>Multiple SSH keys can be used to push commits to a GitHub account by defining a host for each key in <code>$HOME/.ssh/config</code>.</p> <p>A host can have a name expressing its purpose, e.g. <code>Host practicalli</code>, <code>Host company-name</code>. Or a host can match all SSH calls with <code>Host *</code></p> <p>A host definition can be for the same service, e.g. <code>HostName github.com</code></p> <p>The URL in the git remote url should use the Host name rather than the service URL</p> <p>SSH Configuration with Multiple SSH keys</p> $HOME/.ssh/config<pre><code># ------------------------------------------\n# SSH Configuration - Practicalli\n#\n# - Remote Clojure Server nREPL connection\n# - Multiple SSH Keys for GitHub\n# ------------------------------------------\n\n# ------------------------------------------\n# Host Aliases for GitHub Multiple SSH keys\n# - HostName is used as connection domain\n\nHost community\n HostName github.com\n IdentityFile ~/.ssh/community\n\nHost commercial\n HostName github.com\n IdentityFile ~/.ssh/commercial\n\nHost engineering\n HostName github.com\n IdentityFile ~/.ssh/practicalli-engineering\n\nHost personal\n HostName github.com\n IdentityFile ~/.ssh/practicalli-johnny\n# ------------------------------------------\n\n# ------------------------------------------\n# MacOSX additional configuration\n\n# `UseKeyChain` required for MacOSX keychain access\n# Host company-name\n HostName github.com\n# AddKeysToAgent yes\n# UseKeychain yes\n# IdentityFile ~/.ssh/id_ed25519\n# ------------------------------------------\n</code></pre>","tags":["git"]},{"location":"multiple-ssh-keys-for-commercial-and-community-work/#sso-sign-on","title":"SSO sign-on","text":"<p>Using multiple Host definitions with SSH keys failed when a GitHub Organisation containing the repository requires Single Sign-on (SSO) authorisation.</p> <p>Setting the default host, <code>Host *</code> with the key that has SSO authorisation resolves this issue.</p> <p>SSH Configuration with Default Host</p> $HOME/.ssh/config<pre><code># ------------------------------------------\n# SSH Configuration - Practicalli\n# ------------------------------------------\n\n# ------------------------------------------\nHost *\n HostName github.com\n IdentityFile ~/.ssh/commercial\n\n# Host for Community key commented\n# Host engineering\n# HostName github.com\n# IdentityFile ~/.ssh/practicalli-engineering\n# ------------------------------------------\n</code></pre> <p>Assumption: Pushing can be done with any SSH Key added to GitHub account</p> <p>Once a commit has been signed by the relevant key, the identity is part of that commit.</p> <p>Using a different SSH key than was used to signed a commit does not change the commit. As long as an SSH key has been added to the GitHub account that has access, any key can be used.</p> <p>A specific key is only requred when the GitHub Organisation owning a repository requires a key to be SSO authorisation.</p>","tags":["git"]},{"location":"multiple-ssh-keys-for-commercial-and-community-work/#project-library-dependency-updates","title":"Project library dependency updates","text":"<ul> <li>Practicalli Sustainable Life</li> <li>Megalinter update-artifacts v4</li> <li>Practicalli Project Templates</li> <li>add <code>outdated</code> Makefile task from Clojure CLI Config project</li> <li>DeLaGuardo/setup-clojure 12.5</li> <li>actions/cache v4.0.2</li> <li>clj-kondo/clj-kondo 2024.05.24</li> <li>clojure/brew-install 1.11.3.1463</li> <li>greglook/cljstyle 0.16.626</li> <li>io.github.seancorfield/deps-new .7.1</li> <li>lambdaisland/kaocha 1.91.1392</li> <li>org.clojure/clojure 1.11.3</li> <li>org.clojure/clojure 1.11.3</li> </ul> <p>Thank you.</p> <p> Practical.li Website</p> <p> Practical.li GitHub Org practicalli-johnny profile</p> <p> @practicalli@clj.social @practical_li</p>","tags":["git"]},{"location":"the-wonderful-complexity-of-people/","title":"The wonderful complexity of people","text":"<p>A Tail of Two Cities - Charles Dickens</p> <p>It was the best of times, it was the worst of times.</p> <p>Johnny Stevenson (maybe others)</p> <p>People are wonderfully complex experiences</p> <p>My feelings of disappointed with my current commercial role are returning to the forefront of my mind. Many aspects of the role and company seem to be clear in peoples minds but not always effectively shared. I think I understand the role and then something else happens that makes me feel I don't. I believe something will need to change soon for the benefit of all.</p> <p>There have been a few highlights with the role, but I expected more of myself and the company. I do set high expectations for myself, although have learned to be more kind about what I can realistically achieve and 'which battles to fight' (figuratively speaking of course).</p> <p>During this engagement I have continually reset my expectations about what could be achieved and what I could realistically achieve. There are a couple of peers where there has been conflict without understanding of why I am seen as the cause. I have tried to explore but if people do have issues with me its not clearly being communicated to me.</p> <p>In hindsight, many opportunities to get support from my manger and peers were missed. Mostly as we had so many challenges to discuss and partly due to pressures of delivery.</p> <p>When a person doesn't have clarity around a problem then there is very little they can do to resolve or adapt.</p> <p>A self-reflection review is in progress and its is a good opportunity to take my own time to reflect on my current role and if its still the right fit for me.</p>","tags":["leadership"]},{"location":"the-wonderful-complexity-of-people/#challenges-at-work","title":"Challenges at work","text":"<p>I seem to have lost communication or trust with the team and its not clear why. I did carve out an on-boarding plan as my duties are required as an engineering manager. I told the team that there was a plan, but it seems they have other ideas about what to do. Ideas were welcome and requested as I formulated the plan, but then perhaps down to enthusiasm other team members started defining their own tasks without sharing them to me so I could plan around them.</p> <p>So its easy for me to start having doubts that about my relationship with the team and how much of this communication was often hidden from me. Was this done on purpose or was sharing these details with their engineering manager simply not considered.</p> <p>I have spent a year working with the team and as the \"Engineering Manager\" they did feel distant at times which I ascribed to the rather intense schedule of work. When I specifically reached out to the team, they were mostly happy to talk with me and steadily started to share their concerns. Some engineers did start pro-actively reaching out to me and allowing me to help them.</p> <p>It is very easy as an engineer to become insular and minimise interaction with others, especially when the environment is highly pressured or very fast paced. There can also be insecurity when talking to a perceived person of positional power, it happens to many of us.</p> <p>Thank you.</p> <p> Practical.li Website</p> <p> Practical.li GitHub Org practicalli-johnny profile</p> <p> @practicalli@clj.social @practical_li</p>","tags":["leadership"]},{"location":"the-king-is-probably-dead-long-live-the-king/","title":"The king is probably dead long live the king","text":"<p>Quote</p> <p>You are only a leader if people are willing to follow</p> <p>It has been hard to shake the concern that my current commercial role has not worked out, probably not really been working for quite a while in hindsight. Was it ever really working?</p> <p>Some aspects have greatly improved but there are some fundamental communication constraints that I really didn't understand the cause of (plenty of assumptions, but not enough communication or time to really address these challenges).</p> <p>There are the common systemic challenges that come from working at any startup that is working hard to establish itself as a long term sustainable business. This was a given. A new person coming into this environment that has been running for many years leaves a lot of context unknown and typically unspoken.</p> <p>I continued to try identify the causes throughout the week and trying to evaluate if there is any appetite and opportunity to address these within our typical schedule. It did feel that the more I tried to connect the quicker the feeling of connection slipped away.</p> <p>I believe my frustration and disappointment have been leaking out over the last month, which I am disappointed about as well.</p> <p>It is always a challenge for an engineering manager to identify where they can add value. For much of the current role I never seemed to connect with the team at a deep enough level. It is too easy to feel I am simply not needed by the team as the communication has been very limited. In once exceptional case, it was easy to feel my presence was simply not wanted.</p> <p>Tuesday I was really exhausted, partly because of the continued cough but also the concerns that I still wasn't able to break through to the team (especially if they feel unsafe to ask questions). I am not sleeping well and need to find energy to exercise more.</p> <p>Wednesday I made time for self-reflection as part of the company feedback initiative. I did struggle to quantify to myself what I had done. In hindsight I should have spend more time on this and consulted my journal, although I still feel I would come up short of my own lofty goals for the role.</p> <p>Friday was the end of my commercial current role.</p> <p>The title of this article is from the first episode of the first series of the Black Adder TV show. There were quite a few Shakepearean quotes used for comic effect.</p>","tags":["leadership"]},{"location":"the-king-is-probably-dead-long-live-the-king/#onboarding","title":"Onboarding","text":"<p>When someone new starts they are overflowing with enthusiasm. Having a clear plan helps balance that enthusiam with all the mundane tasks that should be done early, so they are not a continual distraction.</p> <p>In the months leading up to the new starter the team was asked for specific things they could work on. The team were very focused on the new feature so had little opportunity to think about this. This feature is complete and the team have more scope to support and pair with our new engineer.</p> <p>Even switching to time-boxed engineer priorities work seemed challenging, as the engineers are not used to considering what work is important to them.</p>","tags":["leadership"]},{"location":"the-king-is-probably-dead-long-live-the-king/#groundhog-day-for-movies-but-not-work","title":"Groundhog day for movies but not work","text":"<p>I love a good 'Groundhog day' homage in a movie or tv series</p> <p>When it comes to a groundhog experience at work, repeating mistakes that we had moved away from, it feels like a huge step backwards. Our current planned work feels like we are falling into older and more familiar patterns that didnt work well, especially rushing into new work without clearer definition. At least everyone is well aware of these challenges, although making them part of our default approach may take some time (especially under percieved timeline pressures).</p> <p>I am trying to push back and ensure we have clarity and time, only doing the essential work. This should avoid the kinds of problems experienced previously.</p> <p>Stargate SG-1 Episode </p> <p>An excellent exploration of the 'groundhog day' or time-loop effect was presented in the Stargate SG1 'Window of Opporunity' episode</p> <p>Two of the main characters become stuck in a time loop. Once they realise they are stuck they try everything they can think of to break out, all of which leading to failure. Eventually they decide to take a day off and enjoy themselves.</p> <p>Sometimes you need to step away from a challenge before you can start to resolve it.</p> <p>Thank you.</p> <p> Practical.li Website</p> <p> Practical.li GitHub Org practicalli-johnny profile</p> <p> @practicalli@clj.social @practical_li</p>","tags":["leadership"]},{"location":"practicalli-plans-for-the-rest-of-the-year/","title":"Practicalli plans for the rest of the year","text":"<p>Starting to plan work for the Practicalli content for the next 3 months.</p> <p>On the Practicalli GitHub Org, action log retention time was minimised to a week (from 90 days) as I don't need to wade through that history and it will save a bit of storage in the Cloud. I am surprised GitHub have such a high default for their free plans.</p> <p>Upgraded to a Dell 40 inch 5k2k monitor for work and it makes a huge difference. Its a beautiful monitor and it works really well with Linux and the tiling window of Regolith Desktop (i3).</p> <p>I am continuing my search for a new place to live, even further into the countryside with easy access to hiking and cycling activities.</p> <p>Although I am always thankful for an opportunity to work with a commercial company, I do feel the weight lifted from my shoulders now that relationship has concluded. Within hours I started to feel the return of much of the energy I have been lacking for the last few months.</p> <p>They do say a change is as good as a rest, so investing time in Practicalli content is giving me an energy boost.</p> <p></p>","tags":["practicalli","hardware","github"]},{"location":"practicalli-plans-for-the-rest-of-the-year/#practicalli-plans","title":"Practicalli Plans","text":"<p>Existing books</p> <ul> <li>review the main Practicalli books and make updates to examples, tools and libraries as required</li> </ul> <p>Practicalli Neovim</p> <ul> <li>more examples of common vim-editing approaches</li> <li>additional information to crafting your own configuration based on Practicalli Astro</li> <li>expand on Clojure workflow (debugging, data browsers, reloading, etc)</li> <li>research constraint to renaming namespaces with LSP</li> </ul> <p>Practicalli Clojure Service</p> <ul> <li>authentication (basic, api key, message signatures, etc)</li> <li>authorisation (permissions & roles)</li> <li>update examples to use Reitit & Reitit ring</li> </ul> <p>Long term projects</p> <ul> <li>clojure stack - guide to common libraries and trade-offs within Clojure, helping new and experienced engineers know what libraries to use and how to compose them together effectively</li> </ul> <p>Managing Content:</p> <ul> <li>Grafana dashboards for Megalinter across all Practicalli repositories</li> <li>Review design of Grafana dashboards and identify changes to enhance management of Practical.li content</li> </ul> <p>Geeking out</p> <ul> <li>New monitor and review</li> <li> Hyprland & Wayland on Debian Linux - advantages and constraints currently experienced. Wayland is fast but not all the apps I use are fully supported.</li> <li>Evaluating the Hyprland experience using ArchLinux. Hyprland is moving fast and is not a desktop experience like Regolith, so am experimenting with nwg-shell and all its tools to create a full desktop experience.</li> </ul>","tags":["practicalli","hardware","github"]},{"location":"practicalli-plans-for-the-rest-of-the-year/#hyprland-references","title":"Hyprland references","text":"<ul> <li>Install hyprland on Linux - Its FOSS</li> <li> JaKooLit/Arch-Hyprland Hyprland & Archlinux install script</li> <li> gaurav210233/simple-hyprland</li> </ul>","tags":["practicalli","hardware","github"]},{"location":"practicalli-plans-for-the-rest-of-the-year/#new-monitor","title":"New Monitor","text":"<p>To help manage the Practicalli workflow more effective I have invested in a larger monitor with a 5120x2160 resolution, known as a 5k2k monitor.</p> <p>Several 5k2k monitors were considered</p> <ul> <li> Dell U4025QW IPS Black panel, Thunderbolt, USB hub, Network KVM: YouTube Review, Text review</li> <li> Philips 40B1U6903CH W-LED panel, lots of ports, built-in webcam and hook for headphones</li> <li> LG 40wp95cp-w Nano IPS panel, limited number of ports</li> </ul> <p>The Dell monitor was the only monitor using an \"IPS Black\" panel, providing the closest color experience to an OLED monitor (without the challenges of OLED).</p> <p>The Dell monitor had lots of excellent reviews and a few extra touches that set it apart from the others.</p> <p>Lots more USB ports (A and C) which are available via the Thunderbolt ports (Thunderbolt is a USB-C port that also provides power).</p> <p>An Ethernet port connects the monitor the local network and will share that connection with any computer connected.</p> <p>The Thunderbolt (USB-C) port connects the monitor to the laptop, sharing the ethernet connection and any USB devices connected (Video Camera, External Mic, Model 100 Keyboard). The Thunderbolt port provides plenty of power to charge up the laptop too.</p> <p>Network KVM to control any computer on the local network (still have to try this).</p> <p> Scan.co.uk had a very good 1 day deal with 200 GBP, compared to the price anywhere else, so I took the plunge and I have no regrets so far.</p> <p>OLED not considered... yet</p> <p>OLED panels are excellent for a gaming monitor or where ever the screen pixels are in constant change (or black).</p> <p>There is a risk of burn-in when using an OLED panel for desktop productivity (coding, research, graphic design) as parts of the screen may not change all day (e.g. status bars, browser tabs, etc). OLED monitors should include software to mitigate the risk of burn-in, although these can be distracting.</p> <p>Third generation Quantum Dot OLED (QD-OLED) panels have greatly improved the text sharpness, especially on monitors with Pixels Per Inch (PPI) of 140 usually found on 4k and 5k monitors. For general use this text quality should be fine. QD-OLED would not be as sharp as an IPS monitor though, especially with an IPS Black panel.</p>","tags":["practicalli","hardware","github"]},{"location":"practicalli-plans-for-the-rest-of-the-year/#arm-mounting-monitors","title":"Arm Mounting Monitors","text":"<p>The Dell monitor provides a very sturdy stand with some mobility. Mounting on a sturdy arm gives greater flexibility in movement and positions available</p> <p>I already have Thingyclub mounting arms which can hold the weight of the Dell monitor, although the tension is close to the maximum. I also use arms to mount laptops, positioning the laptop screen relative to the monitor position. Mounting the laptops also makes more desk space. The Lenovo Thinkpad laptops fold out flat, so they take very little space</p> <p>A mechanical keyboard is used to drive the laptops, rather than their own keyboard. Practicalli uses Keyboard.io Model 100 keyboards.</p> <p> Secret Labs have excellent heavy duty monitor arms with optional handles to making it very easy to position the monitor (without touching the monitor itself). They also have some really high quality desks too. These are premium products with a price tag to match, so should be considered a long term investment.</p> <p> UltraArm also provide heavy duty monitor arms at a more modest price, although I havent carried out a comparison between the two products.</p> <p> Secret Labs Magnus Heavy Duty Monitor Arm</p> <p> Secret Labs Magnus Pro desk</p>","tags":["practicalli","hardware","github"]},{"location":"practicalli-plans-for-the-rest-of-the-year/#practicalli-blog-publishing-issue","title":"Practicalli Blog publishing issue","text":"<p>Material-MkDocs Issue 7725</p> <p>The GitHub action workflow use to publish the Practicalli blog websites started failing two days ago when <code>mkdocs-material</code> version 9.5.45 was release.</p> <p>Posts with only a date value started to fail the MkDocs build due to an issue with the <code>date:</code> format. Practically blog posts use the <code>yyyy-mm-dd</code> format without a time or timezone. When Material for MkDocs is comparing the date of the post with the current time an error occurs.</p> <p>I temporarily resolved the issue by explicitly configuring Python PIP to install <code>mkdocs-material</code> version 9.5.44 package in the GitHub Action workflow file.</p>","tags":["practicalli","hardware","github"]},{"location":"practicalli-plans-for-the-rest-of-the-year/#optimise-github-org-log-retention","title":"Optimise GitHub Org Log retention","text":"<p>The Practicalli Org settings default to a 90 day retention time for logs from actions. This is more time than required for Practicalli books and blogs contained in the Org. Its probably far too long for the Clojure projects too.</p> <p>The logs from the scheduled version action may be checked several days later, otherwise I typically on look at action logs on the same day they were run.</p> <p>The Org Actions settings for artifact and log retention are now set for a maxiumum of 7 days.</p> <p>I plan to reduce the action logs retention time even further for specific repositories, e.g. blogs and journals that are more frequently updated. Once the books are updated then I should be able to reduce the retention time for them too.</p> <p>Lower retention time for motivation</p> <p>The lower the retention time for action logs, the more encouragement I have to update library versions sooner ;)</p> <p>Thank you.</p> <p> Practical.li Website</p> <p> Practical.li GitHub Org practicalli-johnny profile</p> <p> @practicalli@clj.social @practical_li</p>","tags":["practicalli","hardware","github"]},{"location":"making-use-of-black-friday/","title":"Making use of Black Friday","text":"<p>Black Friday as a concept is confusing as it no longer has anything to do with a specific Friday and currently seems to cover at least 2 weeks of promotions. I did get some good prices even before Black Friday actually started.</p> <p>Adventures with SSD and NAS Versions kept me busy over the weekend, resurrecting an older NAS unit with Solid State Drives for a very quiet media storage device.</p>","tags":["network-attached-storage","solid-state-drive","thecus","network-file-system"]},{"location":"making-use-of-black-friday/#nas","title":"NAS","text":"<p>Resurected a Thecus N3200 Pro Network Attached Storage (NAS) unit and learned some new Linux commands and more about NFS along the way.</p> <p>The Thecus N3200 was previously used as storage for an Linux entertainment system powered by ..., connected to a normal TV. The Thecus had 3 x 3.5\" hard drives which gave up to 4TB if used in a RAID 5 configuration. The NAS was bought many many years ago so not the fastest by a long way, but it was fast enough to stream music and video from.</p> <p>There was some noise from the 3 hard drives it supported, although it was only heard when not playing something. The fan in the Thecus NAS was fairly quite, so the theory was that with SSD drives then the NAS should be very quite indeed.</p> <p>I bought 3 SSD drives to create a RAID 5 array in the Thecus NAS. I found the fanxiang 2TB SSD SATA III 6Gb/s 2.5\u2033 drives were at a reasonable price on Smile.amazon.co.uk. These SSD's had good reviews and it will be interesting to see how well they last.</p> <p>The fanxiang SSD are 2.5\" size, so a SABRENT 2.5\" to 3.5\" Internal Hard Drive Adapter Converter mounting Frame was used to fit them into the Thecus Nas.</p> <p>The Thecus NAS provides clip-in rails to fit the drives into the drive bay, with a thumbscrew on each rail to securely fit the drive without need for a tool (other than your finger and thumb).</p> <p>Using the Web console, it was very simple to create a RAID 5 array, although it did take more than a day to build the RAID 5 array, with all the parity checking.</p> <p>RAID 5 used as reliability of disks is an unknown</p> <p>Once the RAID array was build, then there was a handy utility to create a shared folder which could be exposed via NFS, allowing me to write and read files from the NAS.</p> <p>Create local directory for NFS share mount point</p> <pre><code>mkdir /media/Entertainment\n</code></pre> <p>As the Thecus N3200 Pro is quite old, there hasnt been a firmware upgrade in quite some time. Therefore the NAS only had NFS version 3 (NFS 4 is not common). This did prevent me from connecting with the usual NFS share commands. I found that adding the <code>vers=3</code> (or its alias <code>nfsvers=3</code>) as an nfs mount option made it all work nicely.</p> <p>Define mount points for NFS shares</p> /etc/fstab<pre><code>nas:/raid0/data/Ents /media/Entertainment nfs defaults,user,noauto,nfsvers=3,rsize=8192,wsize=8192,timeo=14,intr\n</code></pre> <p>Any changes to the <code>/etc/fstab</code> file should be reloaded using the <code>systemctl daemon-reload</code> command</p> <p>Reload fstab mount points</p> <pre><code>systemctl daemon-reload\n</code></pre> <p>In nautilus file explorer the mount points are shown, so clicking on them I could start adding my files and backing up my laptops.</p> <p>Thank you.</p> <p> Practical.li Website</p> <p> Practical.li GitHub Org practicalli-johnny profile</p> <p> @practicalli@clj.social @practical_li</p>","tags":["network-attached-storage","solid-state-drive","thecus","network-file-system"]},{"location":"practicalli-content-planning/","title":"Practicalli content planning","text":"<p>Hyprland promises to be a great experience but also a potential time drain, so will save most of the investigation and further configuration until the winter break (or if I need a little distraction of the new shiny for motivation).</p> <p>Taking two weeks off from work and have some time to work on Practicalli content.</p>","tags":["clojure","megalinter","neovim"]},{"location":"practicalli-content-planning/#megalinter","title":"Megalinter","text":"<p>Update Megalinter to version 8.1.0 to check if the API_REPORTER logs were pushed to the Practicalli Grafana dashboard.</p> <p>Use Megalinter 8.1.0 Documentation flavor in GitHub workflow</p> <pre><code> # MegaLinter Configuration\n - name: MegaLinter Run\n uses: oxsecurity/megalinter/flavors/documentation@v8.1.0\n</code></pre> <p></p>","tags":["clojure","megalinter","neovim"]},{"location":"practicalli-content-planning/#neovim","title":"Neovim","text":"<p>Video topics</p> <ul> <li>Install Neovim with Practicalli Astro, including how to override my own preferences</li> <li>REPL workflow, starting a REPL & connecting, using the REPL Log, connecting portal</li> <li>Git source code management with Neogit</li> </ul> <p>Thank you.</p> <p> Practical.li Website</p> <p> Practical.li GitHub Org practicalli-johnny profile</p> <p> @practicalli@clj.social @practical_li</p>","tags":["clojure","megalinter","neovim"]},{"location":"hacking-on-practicalli-content/","title":"Hacking on Practicalli content","text":"<p>I am enjoying my 2 week at home vacation (stay-cation) and have already completely rewired my desk, laptops, Monitors and NAS storage devices on the electronic standing desk. It feels a lot more organised and easier to find everything as everything has its place.</p> <p>Now I can focus on getting lots of Practicalli content done (as well as catch up with shows on Paramount+ and maybe a little Polybus on the Playstation4 VR headset)</p> <p>I am interested in switching to the Hyprland, although its changing fast so I dug out an older laptop and installed Arch Linux with Hyprland using the <code>archinstall</code> tool. Unfortunately the laptop I used doesnt seem to support Hyprland or something is missing from the install.</p> <p>I am taking a stay-cation as I am still recovering from Covid and the weather is also quite grim. I am getting out for walks each day and on Friday I completed a short cycle ride as it was nice and sunny outside. Unfortunately my chest started feeling like it was on fire a few minutes into the ride, so I slowed down and limited myself to 10km.</p> <p>I was feeling really sleepy after the ride, so I kept myself awake by sorting through the cardboard boxes in my attic. Many boxes made the ultimate sacrifice (for an uncluttered house) and went to the recycling service.</p>","tags":["neovim","practicalli"]},{"location":"hacking-on-practicalli-content/#practicalli","title":"Practicalli","text":"<p>Plans for content development for the next two weeks</p> <p>Neovim - using neotree to navigate - Backspace to navigate up the tree - Enter to navigate into a directory - . to set the current directory as root (so actions become relevant to the project, e.g. file and word searches)</p>","tags":["neovim","practicalli"]},{"location":"hacking-on-practicalli-content/#neovim-neogit","title":"Neovim - Neogit","text":"<p>Ensure the common git workflows are captured in Practicalli Neovim</p> <ul> <li>create local tracking branch for a remote branch</li> <li>stage lines, hunks and files</li> <li>commit & commit amend</li> <li>signed commits and showing the signature is good (locally and on GitHub)</li> <li>use rebase interactive to squash commits, e.g. some commits shouldnt be separate, managing commits that were not signed correctly.</li> <li>apply a patch file</li> </ul> <p>AstroNvim updates - neogit</p> <ul> <li>6837a5d Feature: Two new user commands, <code>:NeogitLog</code> and <code>:NeogitCommit</code> can now be used to show all log entries for a specified file, or range within a file, and NeogitCommit can be used to show a detailed commit view for a specified SHA/commitish value (2 days ago)</li> </ul>","tags":["neovim","practicalli"]},{"location":"hacking-on-practicalli-content/#hyprland","title":"Hyprland","text":"<p>Hyprland is a very appealing wayland compositor with dynamic tiling window manager. As Hpryland is a rapidly moving project, so using Arch Linux will be useful to follow along with the rapid updates.</p> <p>There is a useful video that simplifies the install and saves time reading of Arch Wiki that would otherwise be required.</p> <p>Hyprland failed to run after install</p> <p>I assume the laptop I installed Arch and Hyprland doesnt have the right hardware (video card) to run as its over 16 years old now.</p> <p>The laptop does run Gnome with wayland though.</p>","tags":["neovim","practicalli"]},{"location":"hacking-on-practicalli-content/#installing-arch","title":"Installing Arch","text":"<p>Arch Linux downloads page provides a magnetic link (opens in torrent client) or a <code>.torrent</code> file download.</p> <p>Either approach should see the 1.17GB Arch ISO download in a few minutes.</p> <p>Get a USB stick with 2GB or more memory and plug into the laptop that has the ISO image (make sure there is nothing important on the USB stick as it will be erased).</p> <p>Copy Arch ISO to USB Stick</p> <p>Show the name of the USB stick</p> <p><pre><code>ls -l /dev/disk/by-id/usb-*\n</code></pre> Copy the ISO image to the USB stick</p> <pre><code>dd bs=4M if=/home/practicalli/Downloads/archlinux-2024.10.01-x86_64.iso of=/dev/disk/by-id/usb-Generic_Flash_Disk_22F1D320-0:0 conv=fsync oflag=direct status=progress\n</code></pre> Output of dd command <pre><code>1166016512 bytes (1.2 GB, 1.1 GiB) copied, 96 s, 12.1 MB/s\n279+1 records in\n279+1 records out\n1173389312 bytes (1.2 GB, 1.1 GiB) copied, 96.724 s, 12.1 MB/s\n</code></pre> <p>Insert the USB stick in the computer to install Arch Linux upon and switch that computer on.</p> <p>The Arch Linux splash screen shows, Enter to start installing. Once finished, a minimal Linux OS is ready to use.</p>","tags":["neovim","practicalli"]},{"location":"hacking-on-practicalli-content/#configure-arch","title":"Configure Arch","text":"<p>There is a long and quite dull installation guide for Arch which would be of interest if you do not already know Linux.</p> <p>The quicker approach is to use the Arch install command</p> <p>Install Arch packages and Hyperland</p> <pre><code>archinstall\n</code></pre> <ul> <li>Archinstall language: English (default)</li> <li>Mirrors: United Kingdom</li> <li>Locales: uk, en_GB, UTF-8</li> <li>Disk configuration > Partition: use best-effort > Select computer drive > Select filesystem kind: ext4 > separate home partition: no</li> <li>Root password: set</li> <li>User account: added practicalli</li> <li>Profile: Desktop > Hyprland</li> </ul> <p>Select install and sit back for a few minutes</p> <p>Arch install prompts about chroot into the newly installed system, e.g. to install additional packages or configure stuff.</p>","tags":["neovim","practicalli"]},{"location":"hacking-on-practicalli-content/#hardware","title":"Hardware","text":"<p>The buttons on my Logitec MX Ergo trackball were not working so well, so I investigated replacing the switches.</p> <p>Michael Stapelberg has a nice guide to replacing the default buttons with Kailh GM 8.0 switches, which are described as 'ultra high life'. Replacing the switches does require soldering.</p> <p>For now, I ensure I keep a decent charge in the Logitec MX Ergo trackball which seems to help greatly.</p> <p>Thank you.</p> <p> Practical.li Website</p> <p> Practical.li GitHub Org practicalli-johnny profile</p> <p> @practicalli@clj.social @practical_li</p>","tags":["neovim","practicalli"]},{"location":"holiday-in-paramout-plus/","title":"Holiday in Paramout Plus","text":"<p>After being ill for most of the week I am finally starting to enjoying my second week of holiday, binging on some Paramount+ and having a lazy Sunday enjoying the extra hour in bed after the end of summer time.</p> <p>Updating Practicalli Journal and Clojure CLI Config repositories, fixing links and markdown issues from the Megalinter reports.</p> <p>Updating to Megalinter 0.8.1 GitHub action on Practicalli repositories as I work on them. The upgrade will include each repository in the Grafana dashboards for Practicalli projects.</p> <p>Issues</p> <ul> <li>DOING security: add clj-watson to clojure cli config</li> <li>DOING zsh environment varaibles not loading into jvm</li> </ul>","tags":["clojure"]},{"location":"holiday-in-paramout-plus/#clojure-cli-config","title":"Clojure CLI Config","text":"<p>Resolved all the issues reported by Megalinter.</p> <p>Updated the Megalinter config and workflows to the latest versions and common Practicalli configs.</p> <p>Installed markdown-table-formatter npm package globally to ensure all the markdown tables were correctly formatted.</p> <pre><code>npm install markdown-table-formatter -g\n</code></pre> <p>The README.md file containing the markdown tables was saved and any changes staged, so I could see exactly what the markdown-table-formatter tool fixed.</p> <pre><code>markdown-table-formatter README.md\n</code></pre> <p>All the markdown tables were updated and nicely formatted.</p> <p>NOTE: There is a <code>--check</code> option, but this did not give any details of what tables were not correctly formatted, so not a useful option in this case.</p>","tags":["clojure"]},{"location":"holiday-in-paramout-plus/#clj-watson","title":"clj-watson","text":"<p>clj-watson is a software composition analysis (SCA) tool, reporting on security vulnerabilities detected in the libraries used for a project.</p> <p>clj-watson scans for reported security vulnerabilities for library dependencies defined in the deps.edn file of a Clojure project. clj-watson also scans transitive library dependencies (library dependencies of each defined dependency)</p> <p>An <code>:security/nvd-scan</code> alias has been designed for Practicalli Clojure CLI Config.</p> <p>:security/nvd-scan alias design</p> <pre><code> ;; clj-holmes/clj-watson/\n ;; Request an API key from: https://nvd.nist.gov/developers/request-an-api-key\n ;; `CLJ_WATSON_NVD_API_KEY` set to API key value\n :security/nvd-scan\n {:replace-deps\n {io.github.clj-holmes/clj-watson {:git/tag \"v6.0.0\" :git/sha \"cb02879\"}}\n :main-opts [\"-m\" \"clj-watson.cli\" \"scan\"]}\n</code></pre> <p>The alias requires an API Key to access the NIST National Vulnerability Database (NVD).</p> <p><code>CLJ_WATSON_NVD_API_KEY</code> environment variable was set to the value of the API Key via the <code>.zshenv</code> file in my user account.</p> <p>Tested the <code>:security/nvd-scan</code> alias with the Practicalli Project Templates repository.</p> <p>Running the designed alias was not picking up the <code>CLJ_WATSON_NVD_API_KEY</code> environment variable</p> <p>Fails to find API Key</p> <pre><code>clojure -M:security/nvd-scan\n</code></pre> <p>Zsh configuration broken - not loading env vars correctly</p> <p>On one laptop the zsh configuration has a fault and environment variables are not being loaded when running <code>clojure</code>. The suggestion from the Clojure community was to ensure autoexport is set. <pre><code>setopt allexport && source ~/.zshenv\n</code></pre></p> <p>Defining the NIST API Key as part of the command successfully downloaded the database and scanned the library dependencies.</p> <p>Successfully finds key</p> <pre><code>CLJ_WATSON_NVD_API_KEY=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx clojure -M:security/nvd-scan\n</code></pre> <p>20 minutes to download the database</p> <p>On first run of the clj-watson tool, the NIST NVD database took 20 minutes and 32 seconds to download (on a very good Internet connection). Successive runs take about 10 seconds, although may be longer if there are substantial updates to the database.</p> <p>Added CLJ_WATSON_NVD_API_KEY to GitHub Secrets</p> <p>Practicalli GitHub Org is used to securely store API keys and other sensitive values. Secrets can be used by GitHub actions across any repository that is part of the Practicalli organisation.</p>","tags":["clojure"]},{"location":"holiday-in-paramout-plus/#neovim","title":"Neovim","text":"<p>The neogit graph view is now powered by gitgraph.nvim. There is a specific <code>graph_style</code> for the Kitty Terminal</p> <p>Neogit change history from Astro update</p> <pre><code> d523ae3 Add both flog style \"unicode\" graph and gitgraph style graph for kitty. (2 days ago)\n 3f82e30 Replace flog graph with gitgraph.nvim so we can support color (2 days ago)\n</code></pre> <p>Practicalli Astro - Astrocommunity plugin overrides - Neogit plugin</p> lua/plugins/user-practicalli.lua<pre><code> -- Neogit: astrocommunity.git.neogit\n {\n \"neogit\",\n dependencies = {\n { \"nvim-lua/plenary.nvim\", \"sindrets/diffview.nvim\" },\n },\n opts = {\n disable_signs = true, -- duplicate signs if enabled\n -- graph_style = \"unicode\", -- elegant commit graph\n graph_style = \"kitty\", -- elegant commit graph\n integrations = { diffview = true },\n },\n keys = {\n -- Neogit status - overrides stage hunk astronvim mapping\n { \"<leader>gs\", \"<cmd>Neogit<cr>\", desc = \"Status (Neogit)\" },\n },\n },\n</code></pre>","tags":["clojure"]},{"location":"holiday-in-paramout-plus/#tv-series","title":"TV Series","text":"<p>Star Trek Lower Desks provides a different and often quite silly experience of the world of Star Fleet. Catching up with season 3 this week.</p> <p>A Gentleman in Moscow is a moving Drama that covers some of the darkest times of the USSR. It provides a unique view of the peoples revolution and Stalin era from a person of privilege, adjusting to their new and revoltingly dark reality.</p> <p>The Castaways was okay, a nice distraction whilst fixing issues reported by Megalinter.</p> <p>Thank you.</p> <p> Practical.li Website</p> <p> Practical.li GitHub Org practicalli-johnny profile</p> <p> @practicalli@clj.social @practical_li</p>","tags":["clojure"]},{"location":"back-to-work/","title":"Back to work","text":"<p>Busy week at work getting ready for a new team member. I spent Friday afternoon building up a relationship and getting accustom to spending time working together. Several weeks of work had been done to get ready for the new starter.</p> <p>One of the interesting challenges for anyone starting a new job is to ensure too much enthusiasm doesnt lead to missing important steps. It will be a good first check-in with the new starter to see if they have been too enthusiastic or taken a more measured approach.</p> <p>Current issues</p> <ul> <li>DONE security: add clj-watson to clojure cli config</li> </ul>","tags":["clojure"]},{"location":"back-to-work/#clojure-cli-config","title":"Clojure CLI Config","text":"<p><code>:security/nvd-scan</code> and <code>:security/nvd-fix</code> aliases have been added to Practicalli Clojure CLI Config. Documentation on using these aliases still needs to be added.</p> <p>The first time one of these aliases is run, the NIST National Vulnerability Database is downloaded locally. This download can take a long time.</p> <p>clj-watson experiments in journal</p>","tags":["clojure"]},{"location":"back-to-work/#health","title":"Health","text":"<p>Back to work as Engineering Manager at Griffin for the platform team. Its a great team to work for and they delivered a really important security feature whilst I was away.</p> <p>My health is continuing to improve and I am aiming to complete a week of walking every day. My stats from the last blood test were not good, but not the worst they have been. Covid really impacts my health and I had very low blood oxygen last week which prevented ramping up my exercise routine.</p> <p>I continue to have a cough and tight lungs, but it does feel like the symptoms are easing and my motivation to exercise returning.</p> <p>Thank you.</p> <p> Practical.li Website</p> <p> Practical.li GitHub Org practicalli-johnny profile</p> <p> @practicalli@clj.social @practical_li</p>","tags":["clojure"]},{"location":"clojure-112-and-learn-clojure-book/","title":"Clojure 1.12 and Learn Clojure book","text":"<p>Work on Practicalli Learn Clojure book, a practical guide to getting comfortable working with Clojure. A full guide to using Clojure is in the Practicalli Clojure book.</p> <p>Added RSS feed for Journal, although I feel that all these blogs should be merged into the https://practical.li/blog site for a single collection or articles. The articles can be categorised to keep them separate.</p> <p>Health is still recovering from a little Covid symptoms. Took Monday off work and slept most of the day.</p>","tags":["clojure","practicalli"]},{"location":"clojure-112-and-learn-clojure-book/#clojure-112-release","title":"Clojure 1.12 release","text":"<p>Now that Clojure 1.12 has been released its time to update the Practicalli projects and guides to use 1.12 as the default version.</p> <p>The <code>add-libs</code> guides for hot loading libraries should be updated in Practicalli Clojure.</p> <p>The <code>user.clj</code> code for <code>add-libs</code> should be updated in Practicalli Project Templates</p> <p>Update Practicalli Clojure CLI Config to use newer versions of tools which have been updated to Clojure 1.12, e.g. deps-new.</p>","tags":["clojure","practicalli"]},{"location":"clojure-112-and-learn-clojure-book/#learn-clojure","title":"Learn Clojure","text":"<p>Practicalli Learn Clojure is a book to get you started with Clojure in a very practical way, for those curious about Clojure but haven't yet decided to go all in.</p> <ul> <li>Install (simplified)</li> <li>Using the REPL effectively</li> <li>a brief mention to using an editor and what features will beneifit</li> <li>Essential concepts</li> <li>comments, expressions (prefix notation), namespaces, simple data</li> <li>Writing and Evaluating code</li> <li>Writing and running tests</li> <li>Specifications & Generative testing</li> <li>Essential code styles & format tools</li> <li>Essential idioms</li> <li>Essential functions and namespaces from the Clojure Standard Library</li> <li>Challenges and day projects (can be completed in a day or less)</li> <li>Reference: Core principles (summary in introduction)</li> </ul> <p>The book will purposely avoid topics that are very rarely used, e.g. Macros, <code>deftypes</code>, <code>defrecords</code>, leiningen, community libraries, etc</p> <p>Should the reader want to go all in with Clojure, they should select the most appropriate book from the Practicalli Collection</p> <ul> <li>Practicalli Clojure - the full Clojure workflow</li> <li>Practicalli Clojure Web Services - production level projects build on reitit, reitit-ring, mutaana, jetty, mulog, etc.</li> <li>Practicalli ClojureScript - Pure ClojureScript projects figwheel (and little or no JavaScript packages or interop)</li> <li>Practicalli Neovim and Practicalli Spacemacs for editor specific guides</li> </ul> <p>Thank you.</p> <p> Practical.li Website</p> <p> Practical.li GitHub Org practicalli-johnny profile</p> <p> @practicalli@clj.social @practical_li</p>","tags":["clojure","practicalli"]},{"location":"megalinter-8-and-monthly-version-updates/","title":"Megalinter 8 and monthly version updates","text":"<p>Megalinter updates to version 8 using the megalinter runner tool, adding a Makefile task to simplify the command line (so I dont have to remember the command).</p> <p>Material for MkDocs provides a nice diff view using the <code>diff</code> language for a code block. Add or copy a diff into the code block, ensuring the <code>-</code> and <code>+</code> signs are included and the diff is automatically highlighted. See the Megalinter section of this post for an example.</p> <p>Feeling quite low the last few weeks, mostly due to continued Covid symptoms, low blood oxygen and lack of energy. Waking up I feel like I have experienced carbon dioxide poisoning (which I have experienced working on a mushroom farm). I am disorientated, dizzy and feel quite terrible.</p>","tags":["clojure"]},{"location":"megalinter-8-and-monthly-version-updates/#megalinter","title":"Megalinter","text":"<p>Megalinter runner now includes a tool to update a megalinter configuration file to use the latest version of Megalinter.</p> <pre><code>npx mega-linter-runner@latest --upgrade\n</code></pre> <p>To simplify using the command a <code>megalinter-update</code> task was added to the <code>Makefile</code> for the project.</p> <p>Megalinter update make task</p> <pre><code>megalinter-update: ## Update MegaLinter config to latest version\n $(info --------- MegaLinter Upgrade Config ---------)\n npx mega-linter-runner@latest --upgrade\n</code></pre> <p>The script updates the Megalinter GitHub workflow to use the latest version of the Megalinter action. The change respects if a specific flavour (e.g. java) of Megalinter was defined.</p> <p>Megalinter action in GitHub workflow</p> <pre><code> - name: MegaLinter Run\n id: ml\n ## latest release of major version\n- uses: oxsecurity/megalinter/flavors/java@v7\n+ uses: oxsecurity/megalinter/flavors/java@v8\n env:\n # ADD CUSTOM ENV VARIABLES OR DEFINE IN MEGALINTER_CONFIG file\n MEGALINTER_CONFIG: .github/config/megalinter.yaml\n</code></pre> <p>Links to the Megalinter documentation are also updated.</p> <p>The script updates <code>.gitignore</code> to exclude the <code>megalinter-reports/</code> directory. This change is not necessary for Practicalli projects as everything is ignored by default. Patterns in the <code>.gitignore</code> are added with the <code>!</code> prefix, allowing them to be included by Git.</p>","tags":["clojure"]},{"location":"megalinter-8-and-monthly-version-updates/#practicalli-project-templates","title":"Practicalli Project Templates","text":"<p>Each template configuration in Project Templates has their own megalinter workflow and configuration, so running the megalinter-runner upgrade tool is a good test.</p> <p>From the output of the script, all templates were updated successfully.</p> Megalinter runner upgrade script output <pre><code>\u276f make megalinter-upgrade\n--------- MegaLinter Upgrade Config ---------\nnpx mega-linter-runner@latest --upgrade\n\n .:oool' ,looo;\n .xNXNXl .dXNNXo.\n lXXXX0c. 'oKXXN0;\n .oKNXNX0kxdddddddoc,. .;lodddddddxk0XXXX0c\n .:kKXXXXXXXXXXXXNXX0dllx0XXXXXXXXXXXXXXXKd,\n .,cdkOOOOOOOO0KXXXXXXXXXXK0OOOOOOOkxo:'\n 'ckKXNNNXkc'\n ':::::;. .c0XX0l. .;::::;.\n 'xXXXXXx' :kx: ;OXXXXKd.\n .dKNNXXO; .. :0XXXXKl.\n .lKXXXX0: .lKXXXX0:\n :0XXXXKl. .dXXXXXk,\n ;kXXXXKd:cxXXXXXx'\n 'xXNXXXXXXXXXKo.\n .oKXXXXNXXX0l.\n .lKNNXNNXO:\n ,looool'\n\n==========================================================\n============= MegaLinter, by OX Security =============\n========= https://ox.security?ref=megalinter ===========\n==========================================================\n\n\u2714 This assistant will automatically upgrade your local files so you use MegaLinter v8\nPlease confirm to proceed :) \u2026 yes\nProcessing file resources/practicalli/mysql-compose.yaml\nProcessing file megalinter-reports/IDE-config/.hadolint.yaml\nProcessing file megalinter-reports/IDE-config/.grype.yaml\nProcessing file .github/workflows/scheduled-version-check.yaml\nProcessing file .github/workflows/quality-checks.yaml\nProcessing file .github/workflows/megalinter.yaml\n- Updating .github/workflows/megalinter.yaml with replacement /https:\\/\\/megalinter\\.github\\.io/gm -> https://oxsecurity.github.io/megalinter ...\n- Updating .github/workflows/megalinter.yaml with replacement /https:\\/\\/oxsecurity\\.github\\.io\\/megalinter/gm -> https://megalinter.io ...\n- Updating .github/workflows/megalinter.yaml with replacement /https:\\/\\/megalinter.io\\/configuration/gm -> https://megalinter.io/latest/config-file ...\n- Updating .github/workflows/megalinter.yaml with replacement /oxsecurity\\/megalinter\\/flavors\\/([a-z]*)@v7/gm -> oxsecurity/megalinter/flavors/$1@v8 ...\nUPDATED: .github/workflows/megalinter.yaml\nProcessing file .github/workflows/lint-review.yaml\nProcessing file .github/workflows/changelog-check.yaml\nProcessing file .github/config/megalinter.yaml\n- Updating .github/config/megalinter.yaml with replacement /https:\\/\\/oxsecurity\\.github\\.io\\/megalinter/gm -> https://megalinter.io ...\n- Updating .github/config/megalinter.yaml with replacement /https:\\/\\/megalinter.io\\/configuration/gm -> https://megalinter.io/latest/config-file ...\nUPDATED: .github/config/megalinter.yaml\nProcessing file resources/practicalli/service/root/swagger-compose.yaml\nProcessing file resources/practicalli/application/root/swagger-compose.yaml\nProcessing file resources/practicalli/application/root/compose.yaml\nProcessing file resources/practicalli/service/root/.github/FUNDING.yaml\nProcessing file resources/practicalli/landing_page/root/.github/FUNDING.yaml\nProcessing file resources/practicalli/application/root/.github/FUNDING.yaml\nProcessing file resources/practicalli/service/root/.github/workflows/scheduled-version-check.yaml\nProcessing file resources/practicalli/service/root/.github/workflows/quality-checks.yaml\nProcessing file resources/practicalli/service/root/.github/workflows/megalinter.yaml\n- Updating resources/practicalli/service/root/.github/workflows/megalinter.yaml with replacement /https:\\/\\/megalinter\\.github\\.io/gm -> https://oxsecurity.github.io/megalinter ...\n- Updating resources/practicalli/service/root/.github/workflows/megalinter.yaml with replacement /https:\\/\\/oxsecurity\\.github\\.io\\/megalinter/gm -> https://megalinter.io ...\n- Updating resources/practicalli/service/root/.github/workflows/megalinter.yaml with replacement /https:\\/\\/megalinter.io\\/configuration/gm -> https://megalinter.io/latest/config-file ...\n- Updating resources/practicalli/service/root/.github/workflows/megalinter.yaml with replacement /oxsecurity\\/megalinter\\/flavors\\/([a-z]*)@v7/gm -> oxsecurity/megalinter/flavors/$1@v8 ...\nUPDATED: resources/practicalli/service/root/.github/workflows/megalinter.yaml\nProcessing file resources/practicalli/service/root/.github/workflows/lint-review.yaml\nProcessing file resources/practicalli/service/root/.github/workflows/changelog-check.yaml\nProcessing file resources/practicalli/service/root/.github/config/megalinter.yaml\n- Updating resources/practicalli/service/root/.github/config/megalinter.yaml with replacement /https:\\/\\/oxsecurity\\.github\\.io\\/megalinter/gm -> https://megalinter.io ...\n- Updating resources/practicalli/service/root/.github/config/megalinter.yaml with replacement /https:\\/\\/megalinter.io\\/configuration/gm -> https://megalinter.io/latest/config-file ...\nUPDATED: resources/practicalli/service/root/.github/config/megalinter.yaml\nProcessing file resources/practicalli/minimal/root/.github/workflows/lint-review.yaml\nProcessing file resources/practicalli/landing_page/root/.github/workflows/scheduled-version-check.yaml\nProcessing file resources/practicalli/landing_page/root/.github/workflows/quality-checks.yaml\nProcessing file resources/practicalli/landing_page/root/.github/workflows/megalinter.yaml\n- Updating resources/practicalli/landing_page/root/.github/workflows/megalinter.yaml with replacement /https:\\/\\/megalinter\\.github\\.io/gm -> https://oxsecurity.github.io/megalinter ...\n- Updating resources/practicalli/landing_page/root/.github/workflows/megalinter.yaml with replacement /https:\\/\\/oxsecurity\\.github\\.io\\/megalinter/gm -> https://megalinter.io ...\n- Updating resources/practicalli/landing_page/root/.github/workflows/megalinter.yaml with replacement /https:\\/\\/megalinter.io\\/configuration/gm -> https://megalinter.io/latest/config-file ...\n- Updating resources/practicalli/landing_page/root/.github/workflows/megalinter.yaml with replacement /oxsecurity\\/megalinter\\/flavors\\/([a-z]*)@v7/gm -> oxsecurity/megalinter/flavors/$1@v8 ...\nUPDATED: resources/practicalli/landing_page/root/.github/workflows/megalinter.yaml\nProcessing file resources/practicalli/landing_page/root/.github/workflows/lint-review.yaml\nProcessing file resources/practicalli/landing_page/root/.github/workflows/changelog-check.yaml\nProcessing file resources/practicalli/landing_page/root/.github/config/megalinter.yaml\n- Updating resources/practicalli/landing_page/root/.github/config/megalinter.yaml with replacement /https:\\/\\/oxsecurity\\.github\\.io\\/megalinter/gm -> https://megalinter.io ...\n- Updating resources/practicalli/landing_page/root/.github/config/megalinter.yaml with replacement /https:\\/\\/megalinter.io\\/configuration/gm -> https://megalinter.io/latest/config-file ...\nUPDATED: resources/practicalli/landing_page/root/.github/config/megalinter.yaml\nProcessing file resources/practicalli/application/root/.github/workflows/scheduled-version-check.yaml\nProcessing file resources/practicalli/application/root/.github/workflows/quality-checks.yaml\nProcessing file resources/practicalli/application/root/.github/workflows/megalinter.yaml\n- Updating resources/practicalli/application/root/.github/workflows/megalinter.yaml with replacement /https:\\/\\/megalinter\\.github\\.io/gm -> https://oxsecurity.github.io/megalinter ...\n- Updating resources/practicalli/application/root/.github/workflows/megalinter.yaml with replacement /https:\\/\\/oxsecurity\\.github\\.io\\/megalinter/gm -> https://megalinter.io ...\n- Updating resources/practicalli/application/root/.github/workflows/megalinter.yaml with replacement /https:\\/\\/megalinter.io\\/configuration/gm -> https://megalinter.io/latest/config-file ...\n- Updating resources/practicalli/application/root/.github/workflows/megalinter.yaml with replacement /oxsecurity\\/megalinter\\/flavors\\/([a-z]*)@v7/gm -> oxsecurity/megalinter/flavors/$1@v8 ...\nUPDATED: resources/practicalli/application/root/.github/workflows/megalinter.yaml\nProcessing file resources/practicalli/application/root/.github/workflows/lint-review.yaml\nProcessing file resources/practicalli/application/root/.github/workflows/changelog-check.yaml\nProcessing file resources/practicalli/application/root/.github/config/megalinter.yaml\n- Updating resources/practicalli/application/root/.github/config/megalinter.yaml with replacement /https:\\/\\/oxsecurity\\.github\\.io\\/megalinter/gm -> https://megalinter.io ...\n- Updating resources/practicalli/application/root/.github/config/megalinter.yaml with replacement /https:\\/\\/megalinter.io\\/configuration/gm -> https://megalinter.io/latest/config-file ...\nUPDATED: resources/practicalli/application/root/.github/config/megalinter.yaml\nmega-linter-runner applied 24 replacements in 8 files.\nUpdated .gitignore file to exclude megalinter-reports from commits\n\nYou MegaLinter local configuration files has been updated !\nNow stage and commit updated files then push to see latest version of MegaLinter in action !\n\n\u2714 MegaLinter is now part of OX Security. -> https://www.ox.security/?ref=megalinter\n\nDo you want to try OX Security to secure your software supply chain security ? \u2026 no\n</code></pre> <p>Thank you.</p> <p> Practical.li Website</p> <p> Practical.li GitHub Org practicalli-johnny profile</p> <p> @practicalli@clj.social @practical_li</p>","tags":["clojure"]},{"location":"megalinter-grafana-dashboards/","title":"MegaLinter Grafana Dashboards","text":"<p>As Practicalli projects are being updated to Megalinter version 8 it seemed a good time to try the Megalinter API reporter to publish data to use with Grafana. A chance to learn more about creating Dashboards and if Grafana is any easier than DataDog.</p> <p>Megalinter not publishing logs on Grafana yet</p> <p>Unfortunately I havent been able to make the Megalinter API Reporter work with this journal project, Clojure CLI Config or a new megalinter-test project I created.</p> <p>Health is a little better after resting over the weekend, although still have lots of symptoms.</p> <p>Megalinter Grafana dashboard example project</p> <p> Practicalli Megalinter-Test</p> <p>NOTE: I am trying to diagnose why this project does not seem to be sending logs to Grafana.</p>","tags":["megalinter","grafana","dashboard","github","debian"]},{"location":"megalinter-grafana-dashboards/#github-profile","title":"GitHub Profile","text":"<p>Simple Icons CDN is used to include the icons for discussion and social media services such as GitHub Discussions, YouTube, Zulip, Slack and LinkedIn.</p> <p>I recently replaced the Twitter link & icon with that for my clj.social account on Mastodon.</p> <p>Simple Icons in GitHub profile</p> <pre><code><a href=\"https://youtube.com/practicalli\" target=\"blank\">\n <img height=\"64\" width=\"64\" src=\"https://cdn.simpleicons.org/youtube/crimson\" />\n</a>\n<a href=\"https://github.com/orgs/practicalli/discussions\" target=\"blank\">\n <img height=\"64\" width=\"64\" src=\"https://cdn.simpleicons.org/github/white\" />\n</a>\n<a href=\"https://clojurians.zulipchat.com/#narrow/stream/250781-practicalli\" target=\"blank\">\n <img height=\"64\" width=\"64\" src=\"https://cdn.simpleicons.org/zulip/green\" />\n</a>\n<a href=\"https://clojurians.slack.com/\" target=\"blank\">\n <img height=\"64\" width=\"64\" src=\"https://cdn.simpleicons.org/slack/firebrick\" />\n</a>\n<a href=\"https://clj.social/@practicalli\" target=\"blank\">\n <img height=\"64\" width=\"64\" src=\"https://cdn.simpleicons.org/mastodon/skyblue\" />\n</code></pre>","tags":["megalinter","grafana","dashboard","github","debian"]},{"location":"megalinter-grafana-dashboards/#debian","title":"Debian","text":"<p>The <code>date</code> command on Linux systems is used to show the system date or set a specific date and time. The system date can only be changed by the root account or accounts in the <code>sudo</code> group.</p> <p>When using the Gnome desktop the system date is automatically managed, keeping the date and time current.</p> <p>The <code>timedatectl</code> command is used to control automatic updating of the system time. This must be disabled to set the date and time to something other than the current.</p> <p>Disable automatic date-time</p> <pre><code>timedatectl set-ntp 0\n</code></pre> <p>When the timedateclt is disabled, then the <code>date</code> command can be used to set a specific date and or time.</p> <p>Set the date and time</p> <pre><code> date -s '2024-09-16 21:32:00'\n</code></pre> <p><code>date</code> command will show the current date, confirming that the OS system date was changed.</p> <p>Enable automatic date-time</p> <pre><code>timedatectl set-ntp 1\n</code></pre> <p>Linux used to use the ntp service which is available via the Debian <code>ntp</code> package, but not used by Gnome desktop</p>","tags":["megalinter","grafana","dashboard","github","debian"]},{"location":"megalinter-grafana-dashboards/#regolith","title":"Regolith","text":"<p>Unless a monitor has a KVM switch (or using KVM hardware) then Regolith will automatically change workspace arrangements when an external monitor is disconnected.</p> <pre><code>apt install regolith-i3-session\n</code></pre> <p>The swap focus i3 package seems to override the Super+. key binding that should otherwise be used to restore a window manager session.</p> <pre><code>apt remove --purge regolith-wm-swap-focus\n</code></pre> <p>Output - i3-swap-focus package should also be removed</p> <p>Output from apt remove command</p> <pre><code>The following package was automatically installed and is no longer required:\n i3-swap-focus\nUse 'apt autoremove' to remove it.\n\nREMOVING:\n regolith-wm-swap-focus*\n\nSummary:\n Upgrading: 0, Installing: 0, Removing: 1, Not Upgrading: 301\n Freed space: 17.4 kB\n\nContinue? [Y/n]\n(Reading database ... 198912 files and directories currently installed.)\nRemoving regolith-wm-swap-focus (4.11.6-1regolith-testing) ...\nroot@gkar:~# apt autoremove\nREMOVING:\n i3-swap-focus\n\nSummary:\n Upgrading: 0, Installing: 0, Removing: 1, Not Upgrading: 301\n Freed space: 27.6 kB\n\nContinue? [Y/n]\n(Reading database ... 198908 files and directories currently installed.)\nRemoving i3-swap-focus (0.4.3-1regolith-testing) ...\n</code></pre>","tags":["megalinter","grafana","dashboard","github","debian"]},{"location":"megalinter-grafana-dashboards/#grafana-dashboard-for-megalinter","title":"Grafana dashboard for megalinter","text":"<p>Megalinter can sent logs from linter runs to Grafana to visualise the result of runs.</p> <p>Grafana Cloud Free Tier provides 14 days of logs & metrics retention for 3 users. No credit card is required to sign up and the service is free forever.</p> <p>I signed up using my GitHub account and created the practicalli.grafana.net stack URL, using the <code>EU Germany</code> deployment region as its the closest to my geographical location.</p> <p>Now to add configuration to each of the Practicalli Projects</p> <p>Get the Loki logs service connection URL and user name</p> <p>Megalinter API Reporter - Loki log service</p> <pre><code>API_REPORTER_URL=https://logs-prod-012.grafana.net/loki/api/v1/push\nAPI_REPORTER_BASIC_AUTH_USERNAME=xxxxxx\n</code></pre> <p>Get the Prometheus metrics service connection URL and user name</p> <p>Megalinter API Reporter - Loki log service</p> <pre><code>API_REPORTER_METRICS_URL=https://influx-prod-24-prod-eu-west-2.grafana.net/api/v1/push/influx/write\nAPI_REPORTER_METRICS_BASIC_AUTH_USERNAME=xxxxxxx\n</code></pre>","tags":["megalinter","grafana","dashboard","github","debian"]},{"location":"megalinter-grafana-dashboards/#create-service-account","title":"Create Service account","text":"<p>Administration -> Users and Access -> Cloud Access Policies, then click on Create Access Policy</p> <p>Add token to the newly created policy and use the generated token value as the password value for the Loki logs and Prometheus metrics services password</p> <p>Passwords</p> <p>Megalinter API Reporter - Grafana service passwords</p> <pre><code>API_REPORTER_BASIC_AUTH_PASSWORD=glc_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=\nAPI_REPORTER_METRICS_BASIC_AUTH_PASSWORD=glc_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=\n</code></pre> <p>Add all environment variables to the GitHub repository that will publish megalinter statistics.</p> <p>Thought: can these be added as an Org secrets rather than Repository secrets (I dont see why not, its worth a try). It will save adding these environment variables to the 22 Practicalli projects that use MegaLinter</p> <p>Add these tokens to the Practicalli GitHub Org as Org secrets: organizations/practicalli/settings/secrets/actions</p> <p>Create New Organization secret, providing the environment variable as the name and url, username and token as the value respectively.</p> <p>The repository access could be all public repositories (no sensitive information in them or their logs) or to be suitably security paranoid use selected repositories and select each specific repository that should have access.</p>","tags":["megalinter","grafana","dashboard","github","debian"]},{"location":"megalinter-grafana-dashboards/#add-secrets-to-github-workflow","title":"Add secrets to GitHub workflow","text":"<p>MegaLinter GitHub workflow snippet</p> <pre><code>jobs:\n megalinter:\n name: MegaLinter\n runs-on: ubuntu-latest\n env:\n # Grafana Dashboard Connections - GitHub Organization secrets\n API_REPORTER: true\n API_REPORTER_URL: ${{ secrets.API_REPORTER_URL }}\n API_REPORTER_BASIC_AUTH_USERNAME: ${{ secrets.API_REPORTER_BASIC_AUTH_USERNAME }}\n API_REPORTER_BASIC_AUTH_PASSWORD: ${{ secrets.API_REPORTER_BASIC_AUTH_PASSWORD }}\n API_REPORTER_METRICS_URL: ${{ secrets.API_REPORTER_METRICS_URL }}\n API_REPORTER_METRICS_BASIC_AUTH_USERNAME: ${{ secrets.API_REPORTER_METRICS_BASIC_AUTH_USERNAME }}\n API_REPORTER_METRICS_BASIC_AUTH_PASSWORD: ${{ secrets.API_REPORTER_METRICS_BASIC_AUTH_PASSWORD }}\n API_REPORTER_DEBUG: false\n steps:\n - run: echo \"\ud83d\ude80 Job automatically triggered by ${{ github.event_name }}\"\n - run: echo \"\ud83d\udc27 Job running on ${{ runner.os }} server\"\n - run: echo \"\ud83d\udc19 Using ${{ github.ref }} branch from ${{ github.repository }} repository\"\n</code></pre> <p>After pushing changes to the Megalinter config, I do not see any data in the Grafana dashboards.</p> <p>TODO: how to tell if MegaLinter has actually pushed logs to Grafana? Or if there is an error with the configuration?</p> <p>See the content of the API notifications in execution logs, you can define API_REPORTER_DEBUG=true</p> <p>Megalinter Grafana dashboard example project</p> <p> Practicalli Megalinter-Test</p> <p>NOTE: I am trying to diagnose why this project does not seem to be sending logs to Grafana.</p> <p>Thank you.</p> <p> Practical.li Website</p> <p> Practical.li GitHub Org practicalli-johnny profile</p> <p> @practicalli@clj.social @practical_li</p>","tags":["megalinter","grafana","dashboard","github","debian"]},{"location":"here-comes-the-rain/","title":"Here Comes The Rain","text":"<p>Thunderstorms abound which will be good for the vegetables growing in my garden (beetroot, courgettes, parsnips and onions)</p>","tags":["clojure","debian"]},{"location":"here-comes-the-rain/#debian","title":"Debian","text":"<p>I use Regolith Desktop & Debian for all the Lenovo laptops I own. Regolith is keyboard driven and had numbered workspaces so I can easily organise multiple applications (terminal & neovim, firefox browsing, OBS, Inkscape, Blender, etc)</p> <p>X11 version of Regolith is used, although there was one annoyance. When sharing an external monitor and switching between laptops, the workspaces are moved to the laptop screen when the monitor is not showing the laptop output. Switching the monitor back to show the laptop screen leaves all the workspaces on the laptop display.</p> <p>In earlier versions of Regolith Desktop, using Super+, would save the layout and Super+. would restore the workspaces to the original displays.</p> <p>I have tried several approaches to make Regolith X11 work again, but with no success.</p> <p>Out of curiosity, I tried Regolith Wayland which uses the sway compositor. I was presently surprised that sway automatically restores the workspaces to the external monitor display when reconnecting after switching back from another source.</p> <p>There are some other issues using Wayland though, as some apps I use do not work</p> <ul> <li>Simple Screen Recorder for creating screencasts</li> </ul> <p>Thankfully, OBS now supports Wayland and seems to work quite well. Although I did get a little confused when asked to select the display to record as it now uses the mouse rather than selecting a display. Using the mouse to click on the display to record was easy to do, once I realised that is how the selection worked.</p> <p>I'll continue to test Regolith Sway for the next month and if there are benefits I will eventually switch all laptops to Regolith Wayland. It is possible to have both installed, so I can always switch between the two (logout required).</p>","tags":["clojure","debian"]},{"location":"here-comes-the-rain/#material-for-mkdocs","title":"Material for MkDocs","text":"<p>MkDocs provides a local server that is very useful for local development, especially when first starting with a new website and learning the various thems and components.</p> <p>Using the Python package manager will install the very latest version of Material for MkDocs.</p> <p>The plugins used by Practicalli with Material for MkDocs are fully supported when using Python Pip package manager within a virtual environment.</p> Debian Python PipDebian PipxDebian PackagesMacOSX Homebrew <p>Install Python Pip and the Python virtual environment packages via the Debian package manager:</p> <pre><code>apt install python3-pip python3-venv\n</code></pre> <p>Create and activate a python virtual environment</p> <pre><code>python -m venv ~/.local/venv/ && source ~/.local/venv/bin/activate\n</code></pre> <p>Use pip to install mkdocs-material along with the plugins used by the Practicalli site. The same plugins are also installed in the GitHub workflow.</p> <pre><code>pip install mkdocs-material mkdocs-callouts mkdocs-glightbox mkdocs-git-revision-date-localized-plugin mkdocs-redirects mkdocs-rss-plugin pillow cairosvg\n</code></pre> <p>Python Pip will not install packages outside of a manage environment (python virtual environment)</p> <p></p> <p>Using <code>pipx</code> will automatically create and manage a local environment</p> <p>Pipx install</p> <p>Install the python packages as root <pre><code>apt install python3-pip pipx\n</code></pre></p> <p>Install the materials for mkdocs as user account, e.g. practicalli <pre><code>pipx install mkdocs-material mkdocs-callouts mkdocs-glightbox mkdocs-git-revision-date-localized-plugin mkdocs-redirects mkdocs-rss-plugin pillow cairosvg --include-deps\n</code></pre></p> <p></p> <p>NOTE: Pipx approach did not seem to support using the RSS plugin</p> <p>Debian includes the <code>mkdocs-material</code> and mkdocs-material-extras<code>` packages are recent versions of Material for MkDocs,</code>9.5.18` at time of writing.</p> <p>Debian Packages</p> <pre><code>apt install mkdocs-material\n</code></pre> <p>NOTE: Debian packages approach did not seem to support using the RSS plugin</p> <p>Install the Python3 Pip package manager using brew (MacOSX)</p> <pre><code>brew install python@3.12\n</code></pre> <p>NOTE: Not tested yet</p>","tags":["clojure","debian"]},{"location":"here-comes-the-rain/#neovim-astronvim-updates","title":"Neovim - AstroNvim updates","text":"Initial <pre><code> Breaking Changes (1)\n \u25cf astrocommunity 0.03ms \uead3 start\n 2367b0e fix(ts-error-translator-nvim): add `ts_ls` to list of filetypes (5 hours ago)\n 785b833 fix(typescript): add `ts_ls` to list of typescript language servers (5 hours ago)\n a577479 fix(copilotchat-nvim): use custom prefix from astro core if defined (#1217) (2 days ago)\n ed63ebc revert(go): remove golangcilint as default linter (#1215) (3 days ago)\n 5b06dd4 feat(lua): only enable `selene` linting if `selene.toml` exists (3 days ago)\n b0ae1be feat(grug-far-nvim): add `mini.files` integration (3 days ago)\n d64a67e fix(grug-far-nvim): fix icon disabling (3 days ago)\n c8c6c6c fix(julia): add missing julia vs code extension defaults (3 days ago)\n 2467e24 feat(go): Add golangcilint as default linter (#1213) (3 days ago)\n 053f3d2 docs(rust): add instructions for setting `cargo check` globally (3 days ago)\n 8e6982b fix(grug-far-nvim): make `transient` a truly default option (3 days ago)\n 4ce0029 fix(grug-far-nvim): improve visual mode mapping (4 days ago)\n 2294ae8 fix(grug-far-nvim): fix typos in configuration (4 days ago)\n 8100fe5 feat(grug-far-nvim)!: add more features and align with recommended `spectre.nvim` mappings (#1212) (4 days ago)\n 408111c refactor(scala): use new `patch_func` helper function (4 days ago)\n ad0153f refactor(nvim-lint): use new `patch_func` utility (4 days ago)\n 895c28f docs(julia): add documentation for setting up a system image based julia language server (4 days ago)\n bcbad7e fix(julia): disable `missingrefs` linting as recommended by the vscode Julia extension (4 days ago)\n 323743a fix(grug-far-nvim): update deprecated function to new name (4 days ago)\n aa3ddb8 fix(vim-matchup): improve compatibility with `nvim-cmp` (5 days ago)\n fda1a1d fix(verilog): remove non-existent packages (5 days ago)\n 2197737 feat(neotest): respect `vim.g.icons_enabled` (5 days ago)\n d14b5c5 fix(neotest): `neodev` should not be a hard dependency (5 days ago)\n 9b7efc7 fix(dart): disable treesitter textobjects for Dart (#1211) (5 days ago)\n 84ecff9 feat(pack): add Harper (#1199) (8 days ago)\n 6f7ecaf fix(avante-nvim): update correct plug mappings (#1210) (8 days ago)\n 62e1768 fix(remote-sshfs-nvim): use function call result (#1208) (10 days ago)\n\n\n Updated (13)\n \u25cf astrocore 33.41ms \udb82\udcb1 astrocore \uf487 AstroNvim\n b2caf55 chore(main): release 1.9.0 (4 days ago)\n 97de158 chore(build): auto-generate vimdoc (4 days ago)\n e7d7a35 feat: add `patch_func` to monkey patch into an existing function (4 days ago)\n e32c4a9 chore(build): auto-generate vimdoc (4 days ago)\n 0eab12b ci: add lazy.lua for maintaining `opts_extend` configuration (4 days ago)\n 06c9acf chore(main): release 1.8.1 (6 days ago)\n f0af7af chore(build): auto-generate vimdoc (6 days ago)\n 2d19ef3 fix: remove non-public facing `json` module as it was merged upstream (6 days ago)\n\n \u25cf AstroNvim 0.07ms \uead3 start\n \u25cb astrotheme\n 8a3aca9 chore(main): release 4.5.1 (#146) (7 days ago)\n 143149a chore(extras): auto-generate extras (7 days ago)\n a7bdde1 fix(treesitter): improve comment and list highlights (7 days ago)\n 2e76cf0 chore(build): auto-generate vimdoc (8 days ago)\n bdb1f42 chore(main): release 4.5.0 (#145) (8 days ago)\n 39e970c chore(extras): auto-generate extras (8 days ago)\n ff845fb chore(build): auto-generate vimdoc (8 days ago)\n 4ef753c feat(treesitter): add `<?php ... ?>` highlights (#144) (8 days ago)\n\n \u25cb gist.nvim \uebc7 GistsList \uebc7 GistCreate \uebc7 GistCreateFromFile\n 9805432 docs(readme): added detail about editor (13 hours ago)\n\n \u25cb neo-tree.nvim \uebc7 Neotree\n a77af2e Check for nil state.tree (#1558) (7 days ago)\n 0774fa2 feat: add `icon.provider` option to components for full control (#1527) (3 weeks ago)\n 206241e feat: add options always_show_by_pattern (#1444) (4 months ago)\n 974bbd4 fix(popups): dont add spacing when the title is empty (#1488) (4 months ago)\n 29f7c21 docs(README): Delete `enable_normal_mode_for_inputs` from README example (#1482) (4 months ago)\n\n \u25cb neogit \uf11c <leader>gs \uebc7 Neogit \uea86 User AstroGitFile\n 9959b58 Merge pull request #1484 from NeogitOrg/cleanup-tcp (5 days ago)\n e7bbf0f Skip test in CI because I don't want to debug GHA failures right now. (5 days ago)\n 2bcd6b4 Allow for more leeway when attaching via tcp (5 days ago)\n e8a21d6 Small cleanup: (5 days ago)\n b11bb3a Merge pull request #1483 from jbradaric/master (5 days ago)\n ddfbc39 fix(#383): Make RPC work with tcp servers (5 days ago)\n e0a8674 Merge pull request #1481 from NeogitOrg/dont-open-diff-if-parent-is-floating (6 days ago)\n ce53ec2 Auto-disable showing diff if the commit editor is a float. (6 days ago)\n d43072e Merge pull request #1480 from NeogitOrg/spelling-option (6 days ago)\n aeabb33 Allow spell check to be user configurable (6 days ago)\n cfbdc88 Merge pull request #1478 from NeogitOrg/spell-for-commit-messages (8 days ago)\n a0427b3 Adds \"spell check\" to commit message buffer. (8 days ago)\n\n \u25cf noice.nvim 3.43ms \uea86 VeryLazy\n c1ba80c chore(main): release 4.5.1 (#951) (5 days ago)\n 86a4891 fix(hacks): dont close timer multiple times during exit (5 days ago)\n 16c946a chore(build): auto-generate docs (5 days ago)\n 3373ab5 fix(hacks): only redraw cursor when cmdline is active. Fixes #950. Fixes #937. Fixes #923 (5 days ago)\n 8c6a024 fix: dont redraw when exiting. Fixes #936. Fixes #921 (5 days ago)\n ae565e1 refactor: cleanup (5 days ago)\n\n \u25cf nvim-notify 1.58ms \udb82\udcb1 notify \uf487 noice.nvim\n fbef5d3 feat: add wrapped-default as render (#286) (30 hours ago)\n\n \u25cb octo.nvim \uebc7 Octo\n 955f0fd Merge pull request #606 from Hashino/master (9 days ago)\n b90bf21 style(stylua): formatted changed code with stylua (9 days ago)\n 337f8d0 fix(repo finding): considers cases where git repo has a trailing / (9 days ago)\n\n \u25cb SchemaStore.nvim\n efa0466 Update SchemaStore catalog (22 hours ago)\n 6e2af7e Update SchemaStore catalog (5 days ago)\n 1fc84f9 Update SchemaStore catalog (6 days ago)\n b45a031 Update SchemaStore catalog (6 days ago)\n e4540af Update SchemaStore catalog (7 days ago)\n bfe74ba Update SchemaStore catalog (10 days ago)\n\n \u25cb telescope-file-browser.nvim \uea86 User AstroFile\n \u25cb todo-comments.nvim \uebc7 TodoLocList \uebc7 TodoQuickFix \uebc7 TodoTrouble \uebc7 TodoTelescope \uea86 User AstroFile\n ae0a2af chore(main): release 1.4.0 (#313) (8 days ago)\n 1a67e20 chore(build): auto-generate docs (8 days ago)\n 76990a9 fix(config): select `fg` by maximizing contrast rather than check if a color is dark (#316) (8 days ago)\n 319c01b chore(build): auto-generate docs (3 weeks ago)\n 6d6cf47 feat(fzf): add fzf-lua support in Readme & add TodoFzfLua command (#312) (3 weeks ago)\n 8f45f35 chore(build): auto-generate docs (9 weeks ago)\n 5759a90 ci: update (9 weeks ago)\n 96fee09 chore(update): update repository (#300) (2 months ago)\n 337de2d chore(build): auto-generate docs (2 months ago)\n 340caf8 chore(update): update repository (#299) (2 months ago)\n d615675 chore(update): update repository (#298) (2 months ago)\n 763f37d chore(update): update repository (#297) (2 months ago)\n c57b74b chore(build): auto-generate docs (2 months ago)\n b166133 chore(update): update repository (#296) (2 months ago)\n\n \u25cf which-key.nvim 1.44ms \uead3 start\n fb07034 chore(main): release 3.13.3 (#835) (5 days ago)\n e6e9f77 chore(build): auto-generate docs (5 days ago)\n 6b023b4 fix(triggers): never attach when macro is recording / executing. Fixes #851. Fixes #822. Fixes #807 (5 days ago)\n bfec3d6 chore(build): auto-generate docs (3 weeks ago)\n e7b415c fix(config): disable wk by default for terminal mode (#825) (3 weeks ago)\n 2e36a3f chore(build): auto-generate docs (3 weeks ago)\n dafe27a fix(view): display actual scroll up/down keys in help (#821) (3 weeks ago)\n 946dddc docs: change 'explicitely' to 'explicitly' in docs (#804) (3 weeks ago)\n</code></pre> AstroNvim plugin update <pre><code> Breaking Changes (1)\n \u25cb dressing.nvim\n 1b7921e chore(master): release 3.0.0 (#164) (6 days ago)\n c5775a8 lint: stricter type checking (5 weeks ago)\n 6741f10 cleanup: remove warnings for using deprecated highlight groups (3 months ago)\n 374b51d cleanup: remove warning for deprecated \"anchor\" config option (3 months ago)\n cd895f5 refactor!: remove insert_only config option (3 months ago)\n\n\n Updated (7)\n \u25cf neoconf.nvim 2.53ms \uf487 nvim-lspconfig\n ec16c02 chore(build): auto-generate vimdoc, schemas and annotations (7 days ago)\n 5690945 chore(main): release 1.3.3 (#91) (8 days ago)\n c26f4dc chore(build): auto-generate docs (8 days ago)\n cdc15ee chore(build): auto-generated build files (8 days ago)\n 557f3e7 fix(basedpyright): add basedpyright schema (#90) (8 days ago)\n 559836d fix(schemas): `tsserver` renamed to `ts_ls` (#89) (8 days ago)\n 8c7f29f chore(build): auto-generate vimdoc, schemas and annotations (9 days ago)\n 3c9bb0e chore(build): auto-generate vimdoc, schemas and annotations (10 days ago)\n ce074ec chore(build): auto-generate vimdoc, schemas and annotations (12 days ago)\n 206f6c0 chore(build): auto-generate vimdoc, schemas and annotations (13 days ago)\n 37ef39f chore(build): auto-generate vimdoc, schemas and annotations (2 weeks ago)\n\n \u25cb nvim-autopairs \uea86 User AstroFile\n ffc139f feat(fast_wrap): add options for direct end_key use (#475) (8 days ago)\n\n \u25cf nvim-dap 29.15ms \uf487 mason-nvim-dap.nvim\n 90616ae Restore stopped state if goto errors (11 days ago)\n\n \u25cf nvim-lspconfig 2.81ms \udb82\udcb1 lspconfig.util \uf487 mason-lspconfig.nvim\n eb36e01 fix(ltex-ls): command fails on windows when using mason (#3305) (7 days ago)\n 46ce5fd chore: remove redundant flake-utils dependency; add nix-systems (8 days ago)\n 0d027de docs: update server_configurations.md skip-checks: true (10 days ago)\n 170c964 fix: sourcekit lsp filetypes (#3301) (10 days ago)\n bb682c1 docs: update server_configurations.md skip-checks: true (12 days ago)\n fbe3dc6 feat: add c3-lsp support (#3299) (12 days ago)\n d88ae66 docs: update server_configurations.md skip-checks: true (13 days ago)\n 97e72e3 feat: add daedalus-language-server support (#3259) (13 days ago)\n 8c45e72 fix(ci): luarocks unknown \"licence\" field (13 days ago)\n 056f569 docs: update server_configurations.md skip-checks: true (13 days ago)\n 436aad9 feat(ziggy): add ziggy and ziggy_schema support (#3296) (13 days ago)\n 5ac3e19 docs: update server_configurations.md skip-checks: true (2 weeks ago)\n e6b4dd9 feat(kcl): add kcl-language-server support (#3294) (2 weeks ago)\n\n \u25cf nvim-treesitter 15.4ms \uebc7 Lazy load\n 4d94c24 bot(lockfile): update d, http, nix (7 days ago)\n cad9ff2 feat(ruby): detect shebang directive (7 days ago)\n b9002f6 bot(lockfile): update apex, sflog, soql, sosl, swift (8 days ago)\n 5c42228 feat(apex): update parser and highlights (#7151) (8 days ago)\n b7160e8 bot(lockfile): update hurl, v (9 days ago)\n 399062d fix(lua): remove duplicate ellipsis highlight (9 days ago)\n 5833958 bot(lockfile): update r (10 days ago)\n e0338f2 bot(lockfile): update glsl, hlsl, scala, slang (11 days ago)\n 4af16a1 bot(lockfile): update gomod, latex, markdown, markdown_inline, perl, scala (12 days ago)\n 66a7655 feat(ruby): improve identifiers highlighting (12 days ago)\n b6a6d89 feat(gleam): add `@local.scope` capture for block (#7128) (12 days ago)\n d22166e ci: bump create-pull-request to v7 (13 days ago)\n 2871a4a bot(lockfile): update markdown, markdown_inline (13 days ago)\n 6a3c6a4 fix(rust): comment marker should not be `@operator` (#7135) (13 days ago)\n c436d45 Revert \"ci(update): bump create-pull-request to v7 and sign commits\" (2 weeks ago)\n c9003a3 ci(update): bump create-pull-request to v7 and sign commits (2 weeks ago)\n f8bbb82 bot(lockfile): update elixir, gleam, lua, markdown, markdown_inline, perl, scala, swift (2 weeks ago)\n 13ee7f8 feat(latex): capture conditionals (2 weeks ago)\n\n \u25cb nvim-web-devicons \uf487 octo.nvim\n 9154484 feat: add .prettierrc.{cjs,js,mjs} (#495) (11 days ago)\n\n \u25cb plenary.nvim \uf487 octo.nvim \uf487 telescope-file-browser.nvim \uf487 neogit\n 2d9b061 feat(json): add abliity to remove trailing commas while stripping comments (#613) (6 days ago)\n f4faa5a docs: fix typo in annotation for enable_recording (#620) (7 days ago)\n</code></pre> <p>Thank you.</p> <p> Practical.li Website</p> <p> Practical.li GitHub Org practicalli-johnny profile</p> <p> @practicalli@clj.social @practical_li</p>","tags":["clojure","debian"]},{"location":"linux-wayland-compositor--hyprland/","title":"Linux Wayland Compositor & Hyprland","text":"<p>A friend recommended Hyprland window manager which is similar to i3 window manager I currently used, but more optomised for the Wayland compositor.</p> <p>Practicalli currently uses Regolith Desktop, a complete Linux desktop that leverages Gnome and i3 tiling window manager.</p> <p>Regolith Desktop provides quite a rich experience using the <code>regolith-desktop</code> Debian package. I have not had much success with Regolith when running with Wayland (specifically Sway).</p> <p>Sway compositor is an implementation of wayland for i3 window manager. Some of my applications do not see to play nice with Sway (e.g. chromium browser scrolling, simplescreenrecorder cannot run on wayland).</p> <p>OBS did seem to work okay on wayland, given a sufficiently recent version.</p> <p>A friend recommended Hyprland, a tiling compositor that provides the latest Wayland features and lots of eye candy. Its pretty easy to setup on Debian, although there is much additional setup before it would be comparable to Regolith Desktop.</p> <p>Neovim Grug plugin is being considered as an alternative to the Spectre tool for search and replacing across a project.</p>","tags":["debian","hyprland","linux","neovim","slack"]},{"location":"linux-wayland-compositor--hyprland/#neovim-clojure-navigation","title":"Neovim Clojure navigation","text":"<p>Once I learned vim style commands and motions I quickly dropped much of the paredit style command, even before I tried parinfer. Parinfer is really simple and easily covers a lot of the sexp-tooling when writing Clojure code.</p> <p>Personally I find vim-style editing a bit simpler and easier to remember as I am using it for everything and not only one language. There are typically as many key combinations to press with a sexp library as there are with vim.</p> <p>There are a few manipulations I may still like the idea of, e.g. raise/promote a form or expression to refactor a nested expression to be the whole expression.</p> <p>I have https://github.com/PaterJason/nvim-treesitter-sexp plugin installed, but havent used it much. I use https://github.com/gpanders/nvim-parinfer plugin for parinfer enabled, in alignment mode, for all Clojure language buffers.</p>","tags":["debian","hyprland","linux","neovim","slack"]},{"location":"linux-wayland-compositor--hyprland/#neovim-searching","title":"Neovim Searching","text":"<p>For project wide search and replace, I currently use Spectre plugin via the Astrocommunity plugin. It works okay and has a usable UI.</p> <p>Grug looks interesting though, so time to try that at the weekend.</p> <p>AstroNvim version</p> <p><code>:Astroversion</code> to receive the current version as a notification.</p> <p>Space f n to view the notification that contains the version number, eg. <code>Version: *4.26.5*</code></p>","tags":["debian","hyprland","linux","neovim","slack"]},{"location":"linux-wayland-compositor--hyprland/#hyprland-on-debian","title":"Hyprland on Debian","text":"<p>Throughout the history of Linux (and Unix), X.org has been used as the power driving all desktops. More recently the Wayland compositor was developed to provide an alternative that catered for the way many desktops are used today.</p> <p>There has been a lot of work put into Wayland and although it still has some maturing to do, is generally considered stable for every day use.</p> <p>Hyprland is a wayland based tiling manager that has a focus on an engaging user experience (and looking very pretty too).</p> <p>Review wayland app recommendations</p> <p>Some well established apps and tools may not work quite so well with wayland yet. e.g. simplescreenrecorder.</p> <p>Hyperland utilities page recommends apps that work well with wayland (and hyprland)</p> <p>Debian packages required for a desktop environment based on Hyprland (this is a growing list)</p> <ul> <li>hyprland - dynamic tiling Wayland compositor</li> <li>hyprland-backgrounds</li> <li>hyprland-dbgsym - optional debug symbols for hyprland</li> <li>hyprland-dev - optional development files for Hyprland</li> <li>hyprland-protocols - wayland protocol extensions for Hyprland</li> <li>xdg-desktop-portal-hyprland - hyprland communicates with apps via D-Bus (XDG Portal backend)</li> <li>xdg-desktop-portal-hyprland-dbgsym - sid - debug symbols for xdg-desktop-portal-hyprland</li> <li>hyprpaper</li> </ul> <p>Optional: SDDM is a KDE based window manager that seems quite popular with Hyprland community. If SDDM is adopted then it seems appropriate to replace all Gnome tools currently used by Practicalli with their KDE equivalents.</p>","tags":["debian","hyprland","linux","neovim","slack"]},{"location":"linux-wayland-compositor--hyprland/#install-hyprland","title":"Install hyprland","text":"<p>I am using Debian Linux trixie (the next unrelease version of Debian). The hyprland packages are from the v0.41.2 release in June 25 and the latest hyperland version is v0.44.0 (released as I was writing this paragraph)</p> <p>Using the Debian packages will be simpler and quicker than compiling hyprland from source. As I am only evaluating Hyprland and havent committed to it, I will stick with the Debian packages.</p> <p>Install all hyprland Debian packages</p> <pre><code>apt install hyprland*\n</code></pre> <p>This install the packages:</p> <p>Logout of the desktop or restart Debian Linux.</p> Use Debian Linux testing version <p>Hyprland recommends using Debian Sid version for the latest versions. However, after searching through the Debian Packages website for hyprland, the versions of matching packages are the same in trixie(testing) as sid(unstable).</p> <p>There may be differences in versions of packages that the hyprland packages have as dependencies,</p> Building Hyprland for Debian Linux <p>drewfrif/debian-hyprland has several bash scripts for semi-automating the build and install of hyprland on Debian Linux.</p> <p>There are some personal preferences in those scripts that could be changed, but it seems a good basis for automating your own build and install for all the hyprland components.</p> <p>Hyprland v0.43.0 requires C++ 26 support, which is provided by <code>gcc</code> package version >=14. <code>gcc --version</code> reports 14.2.0 on Debian trixie, so all should be good</p> <pre><code>\u276f gcc --version\ngcc (Debian 14.2.0-3) 14.2.0\n</code></pre>","tags":["debian","hyprland","linux","neovim","slack"]},{"location":"linux-wayland-compositor--hyprland/#first-use","title":"First use","text":"<p>On the login screen, select the login account, then select hyprland using the cog in the right hand corner</p> <p>Enter the correct password to login with the hyprland desktop.</p> <p>A yellow information bar is displayed at the top of the screen showing an autogenerated configuration file location, e.g. <code>~/.config/hypr/hyprland.conf</code></p> <p>The information bar also described keybindings to start a terminal, Super q, (kitty is my Debian default terminal) and Super m to quit hyprland destkop</p> <p>Practicalli dotfiles & hyprland</p> <p>The autogenerated config file was moved to the Practicalli dotfiles repository.</p> <p>A symbolic link replaced the <code>~/.config/hypr/</code> directory, linking to the hypr directory in the local copy of the Practicalli dotfiles repository.</p> <pre><code>ln -s ~/projects/practicalli/dotfiles/hypr ~/.config/hypr\n</code></pre>","tags":["debian","hyprland","linux","neovim","slack"]},{"location":"linux-wayland-compositor--hyprland/#menu-app-launcher","title":"Menu app launcher","text":"<p>Although Regolith has Rofi, it doesnt seem to be available when using hyprland desktop.</p> <p>Options - install the rofi debian package - install one of the suggested app launcher on the hyprland wiki</p> <p>I tried <code>rofi</code> first as its familiar from Regolith desktop.</p> <pre><code>apt install rofi\n</code></pre> <p>There is a rofi-dev package, although assuming that is not needed if unless I build rofi extensions</p> <p>Rofi Wayland package should be used</p> <p>Either use wofi or the rofi-wayland project (Debian did not have a rofi-wayland package at time of writing)</p> <p>Update the hyprland config to launch rofi for the menu and use Super Space key binding (rather than Super R)</p> <p>Override key binding in Hyprland config</p> <pre><code># bind = $mainMod, R, exec, $menu\nbind = $mainMod, space, exec, $menu\n</code></pre> <p>The rofi guide suggests creating a configuration file</p> <p>Create a rofi directory in .config</p> <pre><code>mkdir -p ~/.config/rofi\n</code></pre> <p>The dump all the config options into a file. Most options are commented out.</p> <pre><code>rofi -dump-config > ~/.config/rofi/config.rasi\n</code></pre> <p>Switched to wofi menu</p> <p>wofi seemed to work much better (automatically floating window unlike rofi)</p>","tags":["debian","hyprland","linux","neovim","slack"]},{"location":"linux-wayland-compositor--hyprland/#apps-to-install","title":"Apps to install","text":"<p>waybar - the desktop status bar (TODO: tweak its config and learn from shared configs)</p>","tags":["debian","hyprland","linux","neovim","slack"]},{"location":"linux-wayland-compositor--hyprland/#configure-waybar","title":"Configure waybar","text":"<p>Create an appealing and rich desktop menu and status bar.</p> <p>Handcrafting a config</p> <p>Configure Waybar for Hyprland</p> <pre><code>\u276f cp -vr /etc/xdg/waybar ~/projects/practicalli/dotfiles/\n'/etc/xdg/waybar' -> '/home/practicalli/projects/practicalli/dotfiles/waybar'\n'/etc/xdg/waybar/config.jsonc' -> '/home/practicalli/projects/practicalli/dotfiles/waybar/config.jsonc'\n'/etc/xdg/waybar/style.css' -> '/home/practicalli/projects/practicalli/dotfiles/waybar/style.css'\n\u276f ln -s ~/projects/practicalli/dotfiles/waybar ~/.config/waybar\n</code></pre> <p>waybar uses font-awesome fonts for the icons</p> <pre><code># apt search font-awesome\nfonts-font-awesome/testing,now 5.0.10+really4.7.0~dfsg-4.1 all [installed,automatic]\n iconic font designed for use with Twitter Bootstrap\n\n# apt install fonts-font-awesome\n</code></pre> <p>To use the workspaces module, replace all the occurrences of <code>sway/workspaces</code> with <code>hyprland/workspaces</code>. Additionally replace all occurrences of <code>sway/mode</code> with <code>hyprland/submap</code></p>","tags":["debian","hyprland","linux","neovim","slack"]},{"location":"linux-wayland-compositor--hyprland/#nwg-shell","title":"nwg-shell","text":"<p>nwg-look is a GTK3 settings editor, I assume similar to the Appearance in control center with some Gnome Tweaks thrown in.</p> <p>Debian package install</p> <pre><code># apt install nwg-\nnwg-bar nwg-clipman nwg-displays nwg-hello nwg-look\nroot@gkar:/etc/apt/preferences.d# apt install nwg-*\nNote, selecting 'nwg-clipman' for glob 'nwg-*'\nNote, selecting 'nwg-displays' for glob 'nwg-*'\nNote, selecting 'nwg-hello' for glob 'nwg-*'\nNote, selecting 'nwg-look' for glob 'nwg-*'\nNote, selecting 'nwg-bar' for glob 'nwg-*'\nThe following package was automatically installed and is no longer required:\n libgspell-1-2\nUse 'apt autoremove' to remove it.\n\nInstalling:\n nwg-bar nwg-clipman nwg-displays nwg-hello nwg-look\n\nInstalling dependencies:\n cliphist gir1.2-gtklayershell-0.1 xcur2png\n\nSummary:\n Upgrading: 0, Installing: 8, Removing: 0, Not Upgrading: 0\n Download size: 4,636 kB\n Space needed: 13.2 MB / 1,220 MB available\n</code></pre> nwg-look settings output <pre><code>\u276f nwg-look\nINFO[0000] /home/practicalli/.config/nwg-look/config file not found, creating\nINFO[0000] lang: en_GB\nINFO[0000] >>> Loading basic lang from '/usr/share/nwg-look/langs/en_US.json'\nINFO[0000] >>> Parsing original /home/practicalli/.config/gtk-3.0/settings.ini\nINFO[0000] >>> Reading gsettings\nINFO[0000] gtk-theme: Gruvbox\nINFO[0000] icon-theme: Moka\nINFO[0000] font-name: Cousine Nerd Font 12\nINFO[0000] cursor-theme: Adwaita\nINFO[0000] cursor-size: 24\nINFO[0000] toolbar-style: both-horiz\nINFO[0000] toolbar-icons-size: large\nINFO[0000] font-hinting: slight\nINFO[0000] font-antialiasing: grayscale\nINFO[0000] font-rgba-order: rgb\nINFO[0000] text-scaling-factor: 1\nINFO[0000] color-scheme: prefer-dark\nINFO[0000] event-sounds: true\nINFO[0000] input-feedback-sounds: false\nINFO[0047] >>> Applying gsettings\nINFO[0047] >> org.gnome.desktop.interface\nINFO[0047] gtk-theme: Gruvbox OK\nINFO[0047] icon-theme: Faba OK\nINFO[0047] cursor-theme: Adwaita OK\nINFO[0047] cursor-size: 24 OK\nINFO[0047] font-name: Cousine Nerd Font 12 OK\nINFO[0047] font-hinting: slight OK\nINFO[0047] font-antialiasing: grayscale OK\nINFO[0047] font-rgba-order: rgb OK\nINFO[0047] text-scaling-factor: 1 OK\nINFO[0047] toolbar-style: both-horiz OK\nINFO[0047] toolbar-icons-size: large OK\nINFO[0047] color-scheme: prefer-dark OK\nINFO[0047] >> org.gnome.desktop.sound\nINFO[0047] event-sounds: true OK\nINFO[0047] input-feedback-sounds: false OK\nINFO[0047] >>> Backing up gsettings to /home/practicalli/.local/share/nwg-look\nINFO[0047] >>> Exporting /home/practicalli/.config/gtk-3.0/settings.ini\nINFO[0047] >>> Exporting /home/practicalli/.gtkrc-2.0\nWARN[0047] Couldn't find icons folder\nINFO[0047] >>> Exporting /home/practicalli/.config/xsettingsd/xsettingsd.conf\n</code></pre>","tags":["debian","hyprland","linux","neovim","slack"]},{"location":"linux-wayland-compositor--hyprland/#wayland-apps-and-tools-support","title":"Wayland apps and tools support","text":"<p>Practicalli tools that work well with wayland</p> <ul> <li>OBS - recent versions support wayland</li> <li>Inkscape - TODO</li> <li>Neovim - works in a terminal so doesnt really care</li> <li>Neovide - TODO</li> <li>Emacs - TODO</li> <li>The Gimp - TODO</li> <li>Firefox - seems okay</li> <li>Chrome - a delay when opening tabs or scrolling windows (regoligh & sway)</li> </ul>","tags":["debian","hyprland","linux","neovim","slack"]},{"location":"linux-wayland-compositor--hyprland/#install","title":"Install","text":"<p>Install the hyprland packages using <code>*</code> to glob match all the relevant packages.</p> <p>Install all hyprland Debian packages</p> <pre><code>apt install hyprland*\n</code></pre> <p>Once installed, either logout of the desktop session or restart Debian Linux.</p> <p>Hyprland should be an option on the login screen. Once an account has been selected, click the cog icon to select hyprland (TODO: check if this is available after installing the package - or if some config is required)</p> <p>Lots more packages are required</p> <p>Hyprland is a compositor and not a full desktop environment, so investigation required as to what additional wayland supported packages are required.</p>","tags":["debian","hyprland","linux","neovim","slack"]},{"location":"linux-wayland-compositor--hyprland/#configuration","title":"Configuration","text":"<p>Hyprland is described as easy to configure, but what actually is involved. Is it as simple as adding hyprland packages or do I need to edit a configuration file?</p> <p>Lets investigate... I didnt get far as hyprland is not a full desktop environment, so more research is required into what extra packages can be installed to have a more complete desktop experience.</p>","tags":["debian","hyprland","linux","neovim","slack"]},{"location":"linux-wayland-compositor--hyprland/#gotchas","title":"Gotchas","text":"<p>Super c will close the app in the active window. As I use this key binding a lot in MacOSX for copy paste, then I should rebind this close action to something else, e.g. Super Shift q is the keybinding from regolith and less likely to be pressed in error. Trying Super Shift x for now as there needs to be a key binding to quit Hyprland (logout and reboot do not work currently - shutdown does though)</p>","tags":["debian","hyprland","linux","neovim","slack"]},{"location":"linux-wayland-compositor--hyprland/#hyprland","title":"Hyprland","text":"<p>Root shell history</p> <pre><code>apt search hyprland\napt install hyprland*\n\ncd /etc/apt/\ncd preferences.d/\n\nhyprpm list\napt search hypr\napt show xdg-desktop-portal-hyprland\napt search wofi\napt show wofi-pass\napt show rofi\napt install rofi\n\napt show dolfin\napt show dolphin\napt install dolphin\napt install waybar\napt install hyprpaper\napt install wofi\napt show wayland-utils\napt install sway\napt show foot\napt install pavucontrol pamixer\napt install wdisplays\napt search hyprland\napt install xdg-desktop-portal-hyprland\napt install hyprland-backgrounds\nhyprctrl hyprpaper listloaded\napt search font-awesome\napt install fonts-font-awesome\napt search eww\napt install pipewire wireplumber\napt search nwg\n</code></pre>","tags":["debian","hyprland","linux","neovim","slack"]},{"location":"linux-wayland-compositor--hyprland/#material-for-mkdocs","title":"Material for MkDocs","text":"<p>Refining the experiments with installing Material for MkDocs on Debian Linux this week.</p> <p>Recap:</p> <ul> <li>Installing Material for MkDocs using Debian packages did work to a point, although there is no package for the RSS plugin (its relatively recent split from the main material-mkdocs package)</li> <li>Installing Material for MkDocs using python packages does cover all the plugins used by Practicalli books and websites.</li> <li>Debian issued warnings when using pip3 or pipx to install python packages outside of the Debian package system.</li> <li>Using a Python virtual environment is the recommended way to run Material for MkDocs (or any python libraries) on Debian Linux.</li> </ul> <p>A python virtual environment was created and then Material for MkDocs python packages were installed using Pip.</p> <p><code>python3-venv</code> package creates a Python virtual environment given a directory</p> <p>Create Python Virtual Environment</p> <pre><code>python3 -m venv ~/.local/venv/\n</code></pre> <p>Install Material for MkDocs using Python Packages</p> <pre><code>pip install mkdocs-material mkdocs-callouts mkdocs-glightbox mkdocs-git-revision-date-localized-plugin mkdocs-redirects mkdocs-rss-plugin pillow cairosvg\n</code></pre> <p>Run local server for Material for MkDocs</p> <pre><code>. ~/.local/venv/bin/activate; mkdocs build\n</code></pre> <p>Makefile task to run server</p> <pre><code># ------- Makefile Variables --------- #\nMKDOCS_SERVER := mkdocs serve --dev-addr localhost:7777\n# ------------------------------------ #\n\n# --- Documentation Generation ------ #\ndocs: ## Build and run mkdocs in local server (python venv)\n $(info --------- Mkdocs Local Server ---------)\n . ~/.local/venv/bin/activate; $(MKDOCS_SERVER)\n\ndocs-changed: ## Build only changed files and run mkdocs in local server (python venv)\n $(info --------- Mkdocs Local Server ---------)\n . ~/.local/venv/bin/activate; $(MKDOCS_SERVER) --dirtyreload\n\ndocs-build: ## Build mkdocs (python venv)\n $(info --------- Mkdocs Local Server ---------)\n . ~/.local/venv/bin/activate; mkdocs build\n# ------------------------------------ #\n</code></pre> Root shell history <pre><code>apt install python3-pipx\napt install python3-venv\napt install python3\npip3 install mkdocs-material==\"9.*\"\npipx install mkdocs-material==\"9.*\"\napt install python3-pipx\napt install pipx\npipx install mkdocs-material==\"9.*\"\npipx install mkdocs-material\npip install mkdocs-material==\"9.*\"\napt search material-mkdocs\napt install mkdocs-material mkdocs-material-extensions\npip\napt remove --purge mkdocs-material mkdocs-material-extensions\napt autoremove\napt install pipx\napt remove --purge pipx\napt autoremove\napt autoclean\napt install python3-venv\nexit\n</code></pre>","tags":["debian","hyprland","linux","neovim","slack"]},{"location":"linux-wayland-compositor--hyprland/#slack-for-debian","title":"Slack for Debian","text":"<p>Download the debian package from the slack webstite (there is a small link in the right corner to a .deb file)</p> <p>As the root user:</p> <pre><code>cd /home/practicalli/Downloads/\napt install ./slack-desktop-4.39.95-amd64.deb\n</code></pre> <p>Not that the deb file install complains about being installed by root account, but works anyway.</p> <p>Thank you.</p> <p> Practical.li Website</p> <p> Practical.li GitHub Org practicalli-johnny profile</p> <p> @practicalli@clj.social @practical_li</p>","tags":["debian","hyprland","linux","neovim","slack"]},{"location":"a-freezing-start-to-a-new-year/","title":"A freezing start to a new year","text":"<p>GitHub is currently rolling out a change to make Ubuntu 24.04 the default image when running a workflow on <code>ubuntu-latest</code>. As some packages have been removed to save space, then its prudent to give the Practicalli GitHub workflows a test on Ubuntu 24.04.</p> <p>Organising my digital music and audio books so they all fit nicely on my smart phone (using Opus audio format and VLC to play the music).</p> <p>Arch Linux recommends not using <code>pacman -Syu</code> to update all packages and today I experience why. I can no longer login to the desktop EDIT: this seems to be specific to the NWG-shell configuration, as the vanilla hyprland desktop does work.</p> <p>I assume this is a breaking change of hyprland that NWG-shell has not resolved. This is another reason to start again with hyprland and build my own config (although this will be a big time sink, so can wait).</p> <p>Its freezing temperatures outside in London, UK at the moment, so I am trying to get outside when the sun is still shining. The paths are slippy and so are the roads, so even if I felt up to cycling outside, then it could be quite tricky.</p>","tags":["archlinux","audacity","opus"]},{"location":"a-freezing-start-to-a-new-year/#github-ci-workflow","title":"GitHub CI Workflow","text":"<p> Practicalli GitHub workflows all run on the <code>ubuntu-latest</code> image</p> <p>GitHub workflow runs-on ubuntu-latest</p> <pre><code>jobs:\n changelog:\n name: Changelog Update Check\n runs-on: ubuntu-latest\n</code></pre> <p>Changing the workflow configuration to use <code>ubuntu-24.04</code> will change the image used to run the workflow, so I can test if each work flow works with the new default image.</p> <p>GitHub workflow runs-on ubuntu-latest</p> <pre><code>jobs:\n changelog:\n name: Changelog Update Check\n runs-on: ubuntu-latest\n</code></pre> <p>To publish the Practialli books using Material for MkDocs the setup-python GitHub action was used to install a version of python on the ubuntu-latest image.</p> <p>Reading through the software available on the ubuntu-24.04 image I noticed Python is already available. Therefor setup-python action is not required.</p> <p>Removing setup-python action from the workflow did save a few seconds in the run time of the publish-book.yaml workflow. Its not a huge difference, but I do publish a change to a book, blog or journal each day so every little time saving helps (quicker to publish and less compute & networking resources needed).</p>","tags":["archlinux","audacity","opus"]},{"location":"a-freezing-start-to-a-new-year/#arch-linux","title":"Arch Linux","text":"<p>Unless using a distribution like Manjaro then Arch Linux can require more maintenance than using a Debian package based distribution.</p> <p><code>pacman -Syu</code> command happily updated all my packages and after a reboot I cannot login to the desktop anymore. I assume this was some breaking change of hyprland that is causing the problem.</p> <p>Rather than use the Nwg ISO for a quicker Hyprland install, I will start from the ArchLinux ISO and at least I will have a clearer idea of what all the configuration files do and where problems could occur as Hyprland continues to evolve.</p>","tags":["archlinux","audacity","opus"]},{"location":"a-freezing-start-to-a-new-year/#digital-music","title":"Digital Music","text":"<p>I continue to organise my digital music and audio books with a bit of Audacity magic where editing is required.</p> <p> Audacity is an excellent linear audio editor available on all good Operating Systems. Audacity can export edited audio directly to an encoded file format, minimising the resources needed for laruge audio files. I export directly to the Opus audio format</p> <p> Opus audio format is very efficient so produces high quality sounds with very small file sizes. I have a very large library of music on my smart phone which I can access without an internet connection (saving battery life).</p> <p>Music is encoded at 96Kb/second and although not quite as good as Flac the Opus sounds indistinguishable even through the nicest headphones I have. Music encoded at 96Kb/second with variable bit rate are comparable to lossless formats.</p> <p>Audiobooks are encoded at 24 Kb/second for mono track sources and 32 Kb/second for stereo, which is perfectly good for any spoken word content and makes the files tiny (especially compared to WAV and FLAC).</p> <p> Opus recommended encoding bit rates</p> <p> Archive.org is a great source for Creative Commons and other open music. This week I'm listening to The Slip by Nine Inch Nails which was added to Archive.org by Trent Razor back in 2013.</p> <p>Archiving sounds</p> <p> Flac audio format is lossless so should be used for archived sounds that are going to be processed over and over again, to avoid generational losses in sound qualities from encoding to a lossy format.</p> <p>Thank you.</p> <p> Practical.li Website</p> <p> Practical.li GitHub Org practicalli-johnny profile</p> <p> @practicalli@clj.social @practical_li</p>","tags":["archlinux","audacity","opus"]},{"location":"learning-linux-like-its-1995/","title":"Learning Linux like its 1995","text":"<p>Using Arch Linux (for Hyprland experiments) takes me back to the mid 1990's when I was learning Linux from the ground up.</p> <p>At the end of 1994 I was installing Slackware Linux (from 82 floppy disks) and spending hours figuring out what to compile into the Linux kernel (before the days of dynamic loading). There was a huge amount to learn (usually without my own internet connection).</p> <p>Arch Linux wiki pages have a huge amount of information, showing all the possible options for every piece of software and service. This does present a dilemma of choice.</p> <p>Having experienced many years with Linux, I know many of the concepts and software associated with a Linux system. I dont need to read all the options, but do find myself scrolling a lot until I find something familiar (or simple).</p> <p>The goals for this month include</p> <ul> <li>documenting Neovim & Conjure workflow</li> <li>meaningful exercise every day (health permitting)</li> <li>bicycle ride (weather permitting)</li> <li>avoid Hyprland turning into a huge time sync (couch potato time only)</li> </ul> <p>My health took more of a knock this week as I am finding it very difficult to walk. I've had pain in my right hip for a couple of weeks and on Friday I started walking and felt a sharp pain. Every step with my right leg is painful and going up and down stairs is particularly painful.</p> <p>The hip pain coupled with my left knee pain significantly limiting my ability to exercise this week.</p> <p>Movies this week:</p> <ul> <li>Death on the Nile 1978 with Peter Ustinov as Hercule Poirot, including an all-star cast from the time including David Niven, Angela Landsbury and Betty Davis.</li> </ul>","tags":["clojure"]},{"location":"learning-linux-like-its-1995/#neovim","title":"Neovim","text":"<p>LSP Renaming of namespaces and filenames is the only feature I do not have working with Clojure LSP and Neovim. nvim-lspconfig supports Clojure but reports the following error when trying to rename a namespace name.</p> <pre><code>Error on prepareRename: Can't rename - client does not support file renames.\n</code></pre> <p>The nvim-lsp-file-operations plugin was used but with no success as yet (not sure why).</p>","tags":["clojure"]},{"location":"learning-linux-like-its-1995/#clojure-lsp-command-line","title":"clojure-lsp command line","text":"<p><code>clojure-lsp</code> is available on the command line path, so a command like this will change the namespace and the namespaces corresponding file name.</p> <p>Clojure LSP rename namespace via command line</p> <pre><code>clojure-lsp rename --from gameboard.gameboard.api.scoreboard --to practicalli.gameboard.api.scores\n</code></pre>","tags":["clojure"]},{"location":"learning-linux-like-its-1995/#hyprland","title":"Hyprland","text":"<p>Hyprland has already taken up a lot of time with getting the basics up and running. It will easily take weeks and most likely months to have a rich configuration with all the eye candy I have seen. Investing that kind of time is not valuable to me, but I would still like to have an engaing setup.</p> <p>There is much discussion about configuring Hyprland and lots of different community projects.</p> <pre><code>\u276f waybar\n\n(waybar:27164): Gtk-WARNING **: 23:35:32.704: Theme parsing error: gtk.css:6691:68: Invalid name of pseudo-class\n[2025-01-18 23:35:32.740] [info] Using configuration file /home/practicalli/.config/waybar/config.jsonc\n[2025-01-18 23:35:32.741] [error] Error parsing JSON: * Line 71, Column 18\n Syntax error: value, object or array expected.\n</code></pre> <p>The error seems related to the <code>\"icon-size\"</code> key which had the value <code>${i_task</code> which seems incomplete structure.</p> <p>Chaninging <code>\"icon-size\"</code> to a specific icon size seems to make waybar run (at least via the command line)</p> /home/practicalli/.config/waybar/config.jsonc<pre><code>\"wlr/taskbar\": {\n \"all-outputs\": true,\n \"active-first\": true,\n \"markup\": true,\n \"format\": \"{icon}\",\n \"rotate\": \"0\",\n // \"icon-size\": ${i_task #(1)\n \"icon-size\": \"8\"\n },\n</code></pre> <ol> <li>icon-size line seems incomplete, commented and replaced with a fixed value</li> </ol> <p>The <code>waybar</code> command in a terminal runs waybar okay, although there are some warnings to review.</p> <pre><code>\u276f waybar\n\n(waybar:27230): Gtk-WARNING **: 23:37:28.210: Theme parsing error: gtk.css:6691:68: Invalid name of pseudo-class\n[2025-01-18 23:37:28.246] [info] Using configuration file /home/practicalli/.config/waybar/config.jsonc\n[2025-01-18 23:37:28.250] [info] Unable to receive desktop appearance: GDBus.Error:org.freedesktop.DBus.Error.UnknownMethod: No such interface \u201corg.freedesktop.portal.Settings\u201d on object at path /org/freedesktop/portal/desktop\n[2025-01-18 23:37:28.250] [info] Using CSS file /home/practicalli/.config/waybar/style.css\n[2025-01-18 23:37:28.262] [info] Hyprland IPC starting\n[2025-01-18 23:37:28.263] [info] Loading persistent workspaces from Waybar config\n[2025-01-18 23:37:28.263] [info] Loading persistent workspaces from Hyprland workspace rules\n[2025-01-18 23:37:28.264] [warning] Can't open /dev/input/event0 (are you in the input group?): EACCES Permission denied\n[2025-01-18 23:37:28.264] [warning] Can't open /dev/input/event1 (are you in the input group?): EACCES Permission denied\n[2025-01-18 23:37:28.264] [warning] Can't open /dev/input/event2 (are you in the input group?): EACCES Permission denied\n[2025-01-18 23:37:28.264] [warning] Can't open /dev/input/event3 (are you in the input group?): EACCES Permission denied\n[2025-01-18 23:37:28.264] [warning] Can't open /dev/input/event4 (are you in the input group?): EACCES Permission denied\n[2025-01-18 23:37:28.264] [warning] Can't open /dev/input/event5 (are you in the input group?): EACCES Permission denied\n[2025-01-18 23:37:28.264] [warning] Can't open /dev/input/event6 (are you in the input group?): EACCES Permission denied\n[2025-01-18 23:37:28.264] [warning] Can't open /dev/input/event7 (are you in the input group?): EACCES Permission denied\n[2025-01-18 23:37:28.264] [warning] Can't open /dev/input/event8 (are you in the input group?): EACCES Permission denied\n[2025-01-18 23:37:28.264] [warning] Can't open /dev/input/event9 (are you in the input group?): EACCES Permission denied\n[2025-01-18 23:37:28.264] [warning] Can't open /dev/input/event10 (are you in the input group?): EACCES Permission denied\n[2025-01-18 23:37:28.264] [warning] Can't open /dev/input/mice (are you in the input group?): EACCES Permission denied\n[2025-01-18 23:37:28.264] [warning] Can't open /dev/input/mouse0 (are you in the input group?): EACCES Permission denied\n[2025-01-18 23:37:28.264] [warning] Can't open /dev/input/event11 (are you in the input group?): EACCES Permission denied\n[2025-01-18 23:37:28.264] [warning] Can't open /dev/input/mouse1 (are you in the input group?): EACCES Permission denied\n[2025-01-18 23:37:28.264] [warning] module keyboard-state: Disabling module \"keyboard-state\", Failed to find keyboard device: EACCES Permission denied\n[2025-01-18 23:37:28.488] [info] Bar configured (width: 1600, height: 30) for output: LVDS-1\n\n** (waybar:27230): WARNING **: 23:37:28.492: Status Notifier Item with bus name ':1.28' and object path '/org/ayatana/NotificationItem/udiskie' is already registered\n\n** (waybar:27230): WARNING **: 23:37:28.492: Status Notifier Item with bus name ':1.17' and object path '/org/ayatana/NotificationItem/nm_applet' is already registered\n[2025-01-18 23:37:28.497] [error] Item 'udiskie': Could not find an icon named 'drive-removable-media-usb-panel' and no pixmap given.\n</code></pre>","tags":["clojure"]},{"location":"learning-linux-like-its-1995/#add-user-to-input-group","title":"add user to input group","text":"<p>A user account can be added to a group using either <code>gpasswd</code> or <code>usermod</code></p> <p>Add user to existing group</p> <pre><code>\u276f sudo usermod -aG input practicalli\n[sudo] password for practicalli:\n</code></pre> <p></p>","tags":["clojure"]},{"location":"learning-linux-like-its-1995/#archlinux","title":"ArchLinux","text":"<p>Set the local time via the command line iusing the <code>timectrl</code> command</p> <p>ArchLinux uses an NTP server that automatically sets the local time from a remote server (at least after installing HyDE).</p> <p>To manually set the time with <code>timedatectl</code> the NTP server must be disabled first.</p> <p>Disable NTP server</p> <pre><code>timedatectl set-ntp false\n</code></pre> <p>Set the local time</p> <pre><code>timedatectl set-time \"2025-01-18 22:00:00\"\n</code></pre> <p>enable NTP server</p> <pre><code>timedatectl set-ntp true\n</code></pre> <p>Check current date</p> <pre><code>date\nSat Jan 18 10:00:09 PM UTC 2025\n</code></pre> timedatectl --help <pre><code>timedatectl [OPTIONS...] COMMAND ...\n\nQuery or change system time and date settings.\n\nCommands:\n status Show current time settings\n show Show properties of systemd-timedated\n set-time TIME Set system time\n set-timezone ZONE Set system time zone\n list-timezones Show known time zones\n set-local-rtc BOOL Control whether RTC is in local time\n set-ntp BOOL Enable or disable network time synchronization\n\nsystemd-timesyncd Commands:\n timesync-status Show status of systemd-timesyncd\n show-timesync Show properties of systemd-timesyncd\n ntp-servers INTERFACE SERVER\u2026\n Set the interface specific NTP servers\n revert INTERFACE Revert the interface specific NTP servers\n\nOptions:\n -h --help Show this help message\n --version Show package version\n --no-pager Do not pipe output into a pager\n --no-ask-password Do not prompt for password\n -H --host=[USER@]HOST Operate on remote host\n -M --machine=CONTAINER Operate on local container\n --adjust-system-clock Adjust system clock when changing local RTC mode\n --monitor Monitor status of systemd-timesyncd\n -p --property=NAME Show only properties by this name\n -a --all Show all properties, including empty ones\n --value When showing properties, only print the value\n -P NAME Equivalent to --value --property=NAME\n\nSee the timedatectl(1) man page for details.\n</code></pre> <p>Thank you.</p> <p> Practical.li Website</p> <p> Practical.li GitHub Org practicalli-johnny profile</p> <p> @practicalli@clj.social @practical_li</p>","tags":["clojure"]},{"location":"clojurists-together-q3---practicalli---update-1/","title":"Clojurists Together Q3 - Practicalli - Update 1","text":"<p>Continued support for Practicalli by Clojurists together is much appreciated and there are several hundred content ideas for the continued work.</p> <p>Highlights of the last two weeks includes:</p> <ul> <li>Live broadcasts - continuing the Banking on Clojure project with next.jdbc, H2 database and DBeaver.</li> <li>Database access and design for Banking on Clojure project</li> <li>Updated practicalli/clojure-cli-config repository to use Congnitect dev-tools for REBL and a way to configure CIDER to work with REBL - UPDATE: approach since deprecated in favour of Portal</li> <li>Test drive of Conjure, an impressive Clojure environment for Neovim</li> </ul>"},{"location":"clojurists-together-q3---practicalli---update-1/#clojure-webapps","title":"Clojure WebApps","text":"<p>Continuing the Banking on Clojure project as a major project, which started from the specifications created in Practicalli study group and will be expanded into a production grade web application.</p> <p>The application server system, UI, routing and initial handler have been defined and CircleCI used for system integration and generative testing, deploying to a staging environment on Heroku on successful builds.</p> <p>Currently adding content for database connectivity, database design and using next.jdbc and H2 for a development environment database.</p> <p>PostgreSQL provisioned using Heroku for staging and production database. Explored JDBC database connection strings, understanding well formed jdbc connection strings, very useful for working with Heroku environment variable for Postgres databases. Using different variations on the db-spec mapping for next.jdbc to minimise the number of environment variables to create.</p> <ul> <li>Design and create database tables</li> <li>Namespace design</li> <li>h2 Relational database and development tools for H2</li> <li>Relational databases - Managing connections</li> <li>Production dabase - Heroku Postgres</li> </ul> <p>Once the project is completed with compojure, other routing libraries (bidi, reitit) will be used to show a working comparison, communicating the different approaches taken in a practical way. The same will be done for component lifecycle libraries, eg. mount, integrant and component.</p> <p>Heroku only commercially available</p> <p>Heroku stopped providing user accounts with free compute credits, so either Heroku must be paid for or use an alternate approach to deployment in the cloud.</p>"},{"location":"clojurists-together-q3---practicalli---update-1/#clojure-depsedn","title":"Clojure deps.edn","text":"<p>Added new aliases and updated existing aliases</p> <ul> <li><code>:cognitect-rebl</code> and <code>:nrepl</code> updated to use the Cognitect dev-tools release for REBL, testing with latest version of CIDER.</li> <li><code>:database-h2</code> library dependency to separate the development environment database from staging and production deployment</li> <li><code>:outdated</code> unsing antq rather than depot (which is no longer under development) to manage dependency versions</li> </ul> <p>[Additional aliases added for lambdaisland/kaocha][https://github.com/practicalli/clojure-cli-config/blob/live/deps.edn#L318-L350] to support ClojureScript test runner, BDD style tests, code coverage and junit-xml reports for CI tools and wall-boards.</p>"},{"location":"clojurists-together-q3---practicalli---update-1/#practicalli-clojure","title":"Practicalli Clojure","text":"<p>Added several small projects to help people learn the basics of Clojure, many of which cover the concept of data transformation using the Clojure standard library.</p> <p>Added docs to use CIDER and Calva with REBL. UPDATE: replaced with Portal</p>"},{"location":"clojurists-together-q3---practicalli---update-1/#conjure-vim-tooling-for-clojure-development","title":"Conjure - vim tooling for Clojure development","text":"<p>Expanding the Clojure aware tools recommendations with Conjure, an excellent development environment for Neovim.</p> <p>Created a install walk through guide for Conjure that supports those new to Neovim (as I was) which will be added to the Clojure aware editors section in Practicalli Clojure. Also adding an example init.vim configuration that is documented and explains the purpose of the plugins included, supporting the adoption of the Conjure tool. (UPDATE: AstroNvim based Practicalli Astro configuration now used to configure Conjure for Practicalli)</p> <p>Planning a video of a REPL based workflow using Conjure (and all other editors) to show the tool in action and support effective.</p>"},{"location":"clojurists-together-project-update-5/","title":"Clojurists Together Project Update 5","text":"<p>Continuous integration and deployment was the main focus of this period, with some Clojure spec generative testing.</p> <p>Added Practicalli website and YouTube channel to the Clojure.org community resources.</p>"},{"location":"clojurists-together-project-update-5/#practicalli-study-group","title":"Practicalli study group","text":"<p>Continuing a tools theme by setting up continuous integration (CI) for Clojure projects. The CI service partially written in Clojure provides good support for Clojure projects. Building on CircleCI to deploy Clojure applications to the Cloud using the Heroku service.</p> <p>Broadcasts also cover using Kaocha generative test runner, both locally and on CircleCI</p> <ul> <li>077 - Continuous Integration - Clojure deps.edn and Leiningen projects</li> <li>78 - Continuous Integration - Clojure deps.edn projects and CircleCI</li> <li>079 - Continuous Integration - Deploying deps.edn project on Heroku via CirecleCI</li> </ul> <p>Content developed for Practicalli Clojure and Practicalli Clojure Webapps books.</p>"},{"location":"clojurists-together-project-update-5/#practicalli-clojure","title":"Practicalli Clojure","text":"<p>Created several guides for new and existent projects, using CircleCI as a continuous integration service. Kaocha is also used to run generative tests as well as unit tests.</p> <p>Created an introduction to CircleCI as a continuous integration service and identified and documented recommended docker images to use for Clojure deps.edn and Leinigen projects. The CircleCI examples are a little dated and includes only Leinginen project examples.</p> <p>Random Clojure Function project. Created a guide to develop a project that generates a random function from the namepaces available in the REPL or the functions from specified namespaces.</p> <p>Using the random Clojure function project, created a guide to develop a project with the help of CircleCI as the continuous integration service.</p> <p>Banking on Clojure Updated the banking-on-clojure project using a TDD approach with Clojure spec.</p> <p>Using Kaocha test runner run unit tests and Clojure spec generative tests locally and via CirceCI. Kaocha can run the same tests as clojure.spec.test.alpha/test function calls, without having to add code to the project. Adding the spect-check-plugin via the test.edn config did not run the generative tests, only the unit tests. Use the spec-test-check plugin to run the reports works when included as a command line flag.</p>"},{"location":"clojurists-together-project-update-5/#practicalli-clojure-webapps","title":"Practicalli Clojure Webapps","text":"<p>Created a guide to deploy a Clojure application via CirceCI onto Heroku. Think of Heroku as AWS without the cognitive load to use it, simply push source code to Heroku and it builds and deploys the resulting application.</p> <p>Updated the status monitor project to deps.edn to use as the basis for a guide to deploy Clojure applications via CircleCI to Heroku (a cloud platform as a service). The project takes a simple approach so the focus remains on the continuous integration pipeline.</p> <p>CircleCI has an Heroku Orb, providing common configuration for deploying to Heroku. The Heroku orb is used to deploy the project from its source code, building an uberjar and running the application from that uberjar.</p> <p>Updated details of using postgresql with Clojure (documentation will be extended soon) and recommended next.java as a library to use for SQL.</p> <p>Simplified the overall navigation on the Practicalli Clojure Webapps book.</p> <p>Heroku only commercially available</p> <p>Heroku stopped providing user accounts with free compute credits, so either Heroku must be paid for or use an alternate approach to deployment in the cloud.</p>"},{"location":"clojurists-together-project-update-5/#practicalli-spacemacs","title":"Practicalli Spacemacs","text":"<p>Rewrite of the switch to develop page, using in-page tabs to simplify the guide into the two different approaches.</p>"},{"location":"clojurists-together-project-update-5/#hacking-on-spacemacs","title":"Hacking on Spacemacs","text":"<p>Added key bindings to refactor namespace forms in clojure-mode</p> <p><code>\"ran\" 'clojure-insert-ns-form</code> <code>\"raN\" 'clojure-insert-ns-form-at-point</code> <code>\"rsn\" 'clojure-sort-ns</code></p> <p>Updated practicalli/.spacemacs.d repository with doom modeline configuration, providing a very clean and simple UI experience for Emacs whilst still providing the most useful information.</p>"},{"location":"practicalli-project-update-6/","title":"Practicalli Project Update 6","text":"<p>Started series called Banking on Clojure to cover application servers, sql and relational databases. This will cover the full development and deployment workflow, including clojure.spec for specifications and generative testing.</p> <p>Added more tools to practicalli/clojure-cli-config</p> <p>Add anchors to all sub-headings across all books, making content easier to navigate by enabling navigation to specific sections in a page. This helps keep relevant information together on one page and reference a specific section from other pages.</p>"},{"location":"practicalli-project-update-6/#practicalli-clojure-webapp","title":"Practicalli Clojure WebApp","text":"<p>Started a section on Application servers, covering approaches to server configuration and server start/stop/reload.</p> <p>Started a section on Databases that will initially cover H2 and Postgresql relational databases, using Sql with next.jdbc</p> <p>Created Banking on Clojure WebApp content for the live broadcasts and book. The project uses CircleCI for continuous integration and Heroku pipelines for deployment to staging and production.</p>"},{"location":"practicalli-project-update-6/#practicalli-clojure","title":"Practicalli Clojure","text":"<p>Configure REPL startup using <code>dev/user.clj</code> file and <code>:dev</code> alias in practicalli/clojure-cli-config configuration. Added examples of requiring namespaces and starting component lifecycle services at REPL starup added to Practicalli Clojure book.</p> <p>Add section on data browser tools, extending REBL and Clojure Inspector with new projects Reveal and Portal.</p>"},{"location":"practicalli-project-update-6/#practicalliclojure-cli-config","title":"practicalli/clojure-cli-config","text":"<p>Identified main purpose of the practicalli/clojure-cli-config project, to provide a large set of meaningful and consistently named aliases that would be available in all projects and less likely to be over-ridden by project specific deps.edn configuration.</p> <p>Any experimental or alpha state tools are clearly marked as 'experimental - used at own risk' to set clear expectations.</p> <p>Updated libraries used in aliases are using their fully qualified names, e.g. cider/cider-nrepl as this will be required for future versions of the Clojure CLI tool.</p> <p>Added Google Storage mirrors for Maven Central for Americas, Asia and Europe to library repository configuration. Also added a community mirror in Asia (China) for Clojars.</p> <p>Recent alias additions include - <code>:dev</code> - include the <code>/dev/ path to configure REPL startup with a /dev/user.clj file -</code>rebel-nrepl<code>- run rebel REPL with nrepl connection for editor connections (eg. CIDER, Calva) -</code>:nrebl<code>- REBL data browser on nREPL connection (e.g. CIDER, Calva) -</code>:deploy-locally<code>to add a jar to _/.m2 directory -</code>:deploy-clojars<code>to deploy a jar on clojars.org -</code>:deploy-clojars-signed<code>to sign and deploy a jar on clojars.org -</code>:carve<code>- a new project to carve out unused vars in code -</code>:repl-reveal` - a REPL with data browser</p>"},{"location":"practicalli-project-update-6/#practicalli-spacemacs","title":"Practicalli Spacemacs","text":"<p>Add Emacs profiler use to the Spacemacs troubleshooting guide</p>"},{"location":"practicalli-project-update-6/#pull-requests","title":"Pull requests","text":"<ul> <li>carve - fixed alias in docs</li> </ul>"},{"location":"practicalli-project-update-3/","title":"Practicalli Project Update 3","text":"<p>Continued with Practicalli Clojure updates and weekly broadcasts covering Clojure spec and generative testing. </p> <p>Also updates on Practicalli Spacemacs, including a move to doom modeline theme for a clean and modern look to Spacemacs.</p> <p>I was still feeling the affects of illness for some of this period, but steadily improving.</p>"},{"location":"practicalli-project-update-3/#practicalli-study-group","title":"Practicalli Study Group","text":"<p>Designing specifications for an online bank and basic generative testing video added to the Practicall Clojure Spec playlist</p>"},{"location":"practicalli-project-update-3/#practicalli-clojure-updates","title":"Practicalli Clojure Updates","text":"<p>Adding content and videos to the Introducing Spec section of the book, providing live code examples via klipse enabling the reader to interact with the specs and functions in the Practicalli Clojure book website.</p> <p>Spec is introduced by showing how it can be used in the REPL and added to project, with the leveraging-spec project containing many different examples.</p> <p>Divided the Spec section into Spec data, that covers how the use of predicates, literals and custom functions as specifications along with the core functions to verify data agains specs (conform, valid?, explain).</p> <p>Expanded on Getting Started section, converting to Clojure CLI and tools.deps. Examples on using Clojure CLI tools to evaluate functions, load files and run applications.</p> <p>Added details on configuring tools.deps and how to define and use multiple aliases. Provided a collection of aliases for community tools, jcenter clojars mirror and how to use a local Artifactory instance.</p> <p>Added section rebel readline for a feature rich command line REPL, including install, customisation and major features.</p> <p>Configure REPL starutup for Clojure CLI projects, examples of using <code>dev/user.clj</code> to require namespaces, call functions and manage component lifecycle services (mount, component, integrant, etc.).</p>"},{"location":"practicalli-project-update-3/#clojure-depsedn-updates","title":"Clojure deps.edn updates","text":"<ul> <li>Using REBL from Emacs CIDER using nREBL middleware, alias and configuration</li> <li>Add example of a local Artifatory instance for a repository provider</li> <li><code>:dev</code> alias - used to configure the Clojure repl automatically on startup by evaluating the content of <code>dev/user.clj</code></li> <li>Update of dependency versions in the <code>deps.edn</code> file with depot</li> <li>Update unit testing aliases, add separate expectation aliases.</li> <li><code>:test-path</code> alias - enable Emacs CIDER and other tools to add the test directory to the classpath</li> </ul>"},{"location":"practicalli-project-update-3/#practicalli-spacemacs-updates","title":"Practicalli Spacemacs Updates","text":"<p>Added page on calling component lifecycle services when refreshing the REPL from CIDER.</p> <p>Updated practicalli/spacemacs.d to use doom modeline and doom-gruvbox-light theme to give a modern and clean look to Spacemacs.</p> <p></p>"},{"location":"practicalli-project-update-4/","title":"Practicalli Project Update 4","text":"<p>After the broadcasts on Clojure spec, moving on to more tooling centric topics. Starting with Unit test runners for Clojure CLI tool and preparing a series on continuous integration, packaging and deployment.</p> <p>Flu symptoms have finally eased, so planning video tutorials in the later part of the sponsorship.</p>"},{"location":"practicalli-project-update-4/#practicalli-study-group","title":"Practicalli Study Group","text":"<p>Wrap up of Clojure spec series of 5 broad, sharing my experiences with spec along with feedback from many others in the community.</p> <p>Broadcast on unit testing and test runners, focusing on Cognitect Labs test runner and Koacha from Lambda Island.</p>"},{"location":"practicalli-project-update-4/#practicalli-clojure","title":"Practicalli Clojure","text":"<p>Updated and extended the Getting Started section, using rebel readline for the command line REPL UI. Added sections on configuriong Clojure CLI and provided a wide range of community tools and other useful aliases.</p> <p>Wrote a new section on Clojure Spec and generative testing, covering how to design specifications (composite vs hierachical). Also discussed organising specifications and how they fit into a project and along side Test Driven Development (TDD) and REPL drive development (RDD).</p> <p>Wrote section on Regular Expressions in Clojure. Added regular expressions for common string patterns, such as passwords, email addresses, etc.</p> <p>Extended the Unit Testing section to cover useful practices with clojure.test library, refactor is assertions with are to work over data sets.</p> <p>Added test runner section covering Cognitect Labs test runner and configuring categories of tests. Started a section on kaocha covering the basic use and configuration. This section to be extended as more projects are used with kaocha.</p> <p>Configured git template to use live branch as the default branch name. The word master has never made any sense as a term in a distributed version control system.</p> <p>Added <code>:test-runner-cljs</code> alias to practicalli/clojure-cli-config for the cljs-test-runner from Olical. A test runner inspired by Cognitect Labs test runner for Clojure.</p> <p>Discussion regarding some defacto approaches and conventions for Clojure tools.deps projects, especially around the idea of naming of aliases. The practicalli/clojure-cli-config repository is an example of how 30+ aliases could be defined to provide the most common tooling for all tools.deps projects.</p>"},{"location":"practicalli-project-update-4/#practicalli-clojurescript","title":"Practicalli ClojureScript","text":"<p>Clarified the introduction to the ClojureScript book status and surfaced the work that remains current and functional. This content includes and several reagent based projects, building and deploying a ClojureScript website for ClojureBridge and creating a TicTacToe game with Scalable Vector Graphics.</p> <p>Depreciated content developed several years ago, as much has changed in the ClojureScript world since then. The older content is still available and will be updated during July 2020 and onward.</p>"},{"location":"practicalli-project-update-4/#practicalli-spacemacs","title":"Practicalli Spacemacs","text":"<p>Using CIDER test runner in Spacemacs with Clojure CLI projects. Covering the Spacemacs specific key bindings, and how to configure the CIDER test runner in Spacemacs.</p> <p>Hint on turning off custom themes to get the classic Emacs look. The theme called default looks the same as classic Emacs.</p> <p>Created a reference sheet for CIDER configuration variables, as there is no overall reference.</p> <p>Using .dir-locals.el for project specific configuration.</p>"},{"location":"practicalli-project-update-4/#spacemacs-pull-requests","title":"Spacemacs Pull Requests","text":"<p>Refactor applications menu key bindings to create more room for key bindings and improve mnemonic keybinding use. Sub menus added using the layer categories of the packages any existing key bindings originate from.</p>"},{"location":"practicalli-project-update-1/","title":"Practicalli Project Update 1","text":"<p>Unfortunately illness caught up with me towards the end of this period, but otherwise I have been busy with the weeekly broadcasts and improvements to the Practicalli Clojure book, updating the install guides to Clojure CLI tools and repl driven development sections.</p>"},{"location":"practicalli-project-update-1/#practicalli-study-group","title":"Practicalli Study Group","text":"<p>The weekly live broadcasts continue, finalizing the data science series and starting a new series on <code>clojure.spec</code></p>"},{"location":"practicalli-project-update-1/#visualising-data-science","title":"Visualising data science","text":"<p>Concluded the series of 7 live broadcasts on Visualising data science.</p> <p>The series started with extraction of data from various sources and how to transform data into more relevant structures for the task required. Initially using ascii-graph to visualize data in the REPL before moving on to create a professional looking dashboard usings Oz and Bulma CSS framework.</p> <p>The dashboard project was developed around the continually changing coronavirus data available in the UK. The broadcasts has several examples of how to deal with things when the data format changes (which it did several times).</p> <p>The later broadcasts includes tips and examples on how to refactor a project as it grows.</p>"},{"location":"practicalli-project-update-1/#introduction-to-clojurespecalpha","title":"Introduction to clojure.spec.alpha","text":"<p>Started a new video series covering how to use spec in the REPL and with Clojure projects</p> <p>Initially covering the foundation functions of the <code>clojure.spec.alpha</code> library and why its called alpha. practicalli/leveraging-spec project was created, covering Clojure predicates, spec/conform, spec/valid?, literal values (Clojure sets), the spec registry, fully qualified namespaces, map literal syntax, spec/def and spec/explain.</p> <p>Started a spec for an online bank account that will be used in further episodes of the series.</p>"},{"location":"practicalli-project-update-1/#practicalli-clojure","title":"Practicalli Clojure","text":"<p>Continued to migrate the book to Clojure CLI tools and deps.edn projects. The overall book content design is being refactored.</p> <p>Update install guide to use Java 11 and added more editor options to the install guides, including NeoVim Conjure and Atom.io Chlorine.</p> <p>Updated the practicalli/clojure-cli-config repository with also contains a collection of commonly used aliases. This repository greatly simplifies the installation of Clojure CLI tooling.</p> <p>Started creating transcripts for videos. Creating transcripts first helps increase the quality of videos created and reduces the amount of effort required post processing videos.</p> <p>Added basic introduction to spec which will be expanded as Practicalli study group video series continues</p>"},{"location":"practicalli-project-update-1/#practicalli-spacemacs","title":"Practicalli Spacemacs","text":"<p>Supported the community with issues on Spacemacs gitter and #spacemacs channel of Clojurians Slack.</p>"},{"location":"practicalli-project-update-1/#practicalli-clojure-webapps","title":"Practicalli Clojure WebApps","text":"<p>Refactor overall book content design for Practicalli Clojure WebApps - plan to extend the scope of the book.</p>"},{"location":"practicalli-project-update-2/","title":"Practicalli Project Update 2","text":"<p>Unfortunately I was ill for most of this period, so not as much achieved this time. I am (and always intended to) extending the work passed the Clojurists Together sponsor period.</p>"},{"location":"practicalli-project-update-2/#summary","title":"Summary","text":"<p>Continuing the weekly broadcasts on Clojure spec, a topic that will be added to the Practicalli Clojure book.</p> <p>Added GitHub issues / PR shields for each book on the website to make tracking and contributing more convenient.</p> <p>Pages on how to use Magit forge to list and create issues and pull requests as well as fork repositories on GitHib, all from within Spacemacs (Emacs).</p>"},{"location":"practicalli-project-update-2/#practicalli-website","title":"Practicalli Website","text":"<p>Added Shields for each book with links to content ideas and pull requests on the respective repositories. Aids in the tracking of book progress and providing another way for others to contribute.</p> <p>Added YouTube playlists to the Practicalli website to make specific video content easier to find.</p> <p>Updated the Creative commons license notice on the front pages of all books and GitHub README files, ensuring compliance with the Software Freedom Conservancy.</p> <p>Add favicon to each book website</p>"},{"location":"practicalli-project-update-2/#practicalli-study-group","title":"Practicalli Study Group","text":"<p>Continuing the new series on <code>clojure.spec.alpha</code>, this time comparing function definition validation with <code>:pre</code> / <code>:post</code> conditions and spec <code>fdef</code>.</p> <ul> <li>072 - Clojure Spec - Part 2 validation with :pre & :post and spec fdef</li> </ul>"},{"location":"practicalli-project-update-2/#practicalli-spacemacs","title":"Practicalli Spacemacs","text":"<p>Several updates on using the Magit client</p> <p>Guide on using Magit Forge to list and create issues and pull requests on GitHub, including forking remote repositories on GitHub.</p> <p>Updated and tested the Magit Forge configuration page</p> <p>Add page on how to staging changes with Magit, including the scope of changes that can be selected, from multiple files, hunks or individual lines.</p> <p>Video to how to update an existing pull request added to the contributing section, to complement the existing video showing how to contribute a pull request to Spacemacs (which can be used for any other project).</p> <p>Practicalli Spacemacs playlist updated with related Spacemacs videos from jr0cket channel.</p> <p>Supported the community with issues on Spacemacs gitter and #spacemacs channel of Clojurians Slack.</p>"},{"location":"practicalli-project-update-2/#practicalli-clojure-webapps","title":"Practicalli Clojure WebApps","text":"<p>Add the high level plan to extend the book contents to the Clojure WebApps book, along with project ideas to implement.</p> <p>Updated the cover of the book to use the new Practicalli ClojureWebApps book banner</p> <p>Improvements to various content sections based on feedback from the community.</p> <ul> <li>Updated webapps overview with additional project links</li> <li>Completely revised the introduction to sets and hash-maps</li> <li>Improved descriptions for the ring introduction, creating a project, creating a webserver, defining handlers, compojure defroutes and using the let function</li> <li>Clarified use of Heroku for deploying applications</li> </ul>"},{"location":"practicalli-project-update-6/","title":"Practicalli Project Update 6","text":"<p>A range of updates, new content and tool reviews and testing. Reviewed 75 solutions for 44 students on Exercism.io over the last two week, adding that advice and code walk-throughs to the Practicalli Clojure book.</p> <p>Several high-quality REPL driven development videos will be released soon, awaiting some final editing and post processing.</p>"},{"location":"practicalli-project-update-6/#practicalli-study-group","title":"Practicalli Study Group","text":"<p>Continued solving Exercism.io challenges for the Live broadcasts, with a request to specifically do the Spiral Matrix challenge * 090 - Code challenges - Exercism.io Space-Age challenge * 091 - Code challenges - Exercism.io Spiral Matrix challenge</p>"},{"location":"practicalli-project-update-6/#practicalli-clojure","title":"Practicalli Clojure","text":"<p>Add SpaceVim to Clojure Editors in book now the Clojure command line bug is fixed. Continued adding REPL driven development approaches to solving Exercism.io challenges.</p> <p>Launch Portal data navigator with any REPL using <code>:env/dev</code> and <code>:inspect/portal-cli</code> aliases. The REPL automatically evaluates the <code>dev/user.clj</code> source code file to require portal, open the portal window and add portal as a <code>tap></code> source</p> <p>+New sections * Exercism.io bob challenge - walking through two alternative solutions * SpaceVim and vim-fireplace install guide - including clj-kondo * SpaceVim and vim-fireplace user guide - a quick guide to get started.</p> <p>Updated * Portal - auto-start portal on REPL startup * Clojure CLI tools version used with CircleCI and updating scripts to use latest Clojure CLI tools release and -M flag with aliases. * nrepl and cider aliases for the Reveal data visualization tool (Reveal deprecated)</p>"},{"location":"practicalli-project-update-6/#practicalli-clojure-cli-config","title":"Practicalli clojure-cli-config","text":"<p>Updates and fixes to the user level configuration for Clojure CLI projects. Added clj-kondo as a GitHub action to lint all pull requests and commits, ensuring aliases are in a good state.</p> <ul> <li>Alternative REPLs: socket server and prepl aliases</li> <li><code>:inspect/reveal-nrepl</code> to run an nREPL server with Reveal data visualization</li> <li><code>:inspect/reveal-light-nrepl</code> a light theme version with a 32 point Ubuntu Mono font useful for demos and HiDPI screens</li> <li><code>:inspect/reveal-nrepl-cider</code> CIDER specific libraries and middleware configuration with <code>:inspect/reveal-light-nrepl-cider</code> as a light version</li> <li><code>:test/cognitect-precompile</code> alias to compile tests before running Cognitect Labs test runner</li> <li>Monthly update of library versions for all aliases using <code>:project/outdated</code> alias</li> <li><code>community/zulip-event</code> to add community event to zulip chat</li> <li><code>test/cloverage</code> add clojure exec options for cloverage (#8)</li> <li><code>:inspect/reveal-nrepl</code> and <code>:inspect/reveal-light-nrepl</code> Cider specific aliases for Reveal data browser</li> </ul>"},{"location":"practicalli-project-update-6/#practicalli-data-science","title":"Practicalli Data Science","text":"<p>Created a new (alpha state) book to provide practical guides to using Clojure tools and libraries to build applications in a data science context. Working with the SciCloj community to raise awareness of what is possible in this space and as I grow my understanding it will be captured in the Practicalli Data Science book.</p> <ul> <li>Notespace section - created a simple demo of the Notespace data science journal tool for Clojure, combined with Portal to help browse large data sets.</li> </ul>"},{"location":"practicalli-project-update-6/#practicalli-clojurescript","title":"Practicalli ClojureScript","text":"<p>Updated to new Practicalli theme and put all project content first, moving overview and design content to the reference section. The book will focus on figwheel-main, reagent and ClojureScript for the next quarter.</p>"},{"location":"practicalli-project-update-6/#practicalli-spacemacs","title":"Practicalli Spacemacs","text":"<p>Update Clojure documentation section to show Clojure and Java documentation functions, including how to navigate to source code and specifications from help.</p>"},{"location":"practicalli-project-update-6/#hacking-cider","title":"Hacking CIDER","text":"<ul> <li>PR #2926 - Tip to evaluate namespace before documentation lookup - added to Practicalli Spacemacs instead.</li> </ul>"},{"location":"practicalli-project-update-4/","title":"Practicalli Project Update 4","text":"<p>Creating more recorded video content around REPL driven development of high quality, improving speed of editing with Blender.org as well as better script writing and delivery practice.</p> <p>Represented Clojure at the JVMWars 2020 online meetup, giving a short presentation which included a brief demo of REPL driven development.</p>"},{"location":"practicalli-project-update-4/#practicalli-study-group","title":"Practicalli Study Group","text":"<p>Refactored the data-access code into <code>practicalli.data.*</code> namespaces to make each namespace have a specific aim. Identified generic functions to reduce repetition in the code.</p> <p>Added unit test fixture (setup/teardown) to create and delete the H2 database on the fly, using functions in the <code>handler-helper</code> namespace.</p> <ul> <li>086 - Banking On Clojure - Part7 - Refactor data-access namespaces and fix the build on CircleCI</li> </ul>"},{"location":"practicalli-project-update-4/#practicalli-clojure","title":"Practicalli Clojure","text":"<p>New sections and Pages: - Unit testing selectors - Unit testing fixtures</p> <p>New page on the use of test selectors to organise tests and run test suites more effectively. Included examples for LambdaIsland kaocha, Spacemacs, Cider and Cognitect labs test runners.</p> <p>New page on fixtures for unit tests, with example fixture functions and configuration on when to run fixtures for testing.</p>"},{"location":"practicalli-project-update-4/#screencasts","title":"Screencasts","text":"<ul> <li>Clojure REPL driven development with Rebel Readline</li> <li>Clojure projects with the REPL</li> <li>Cloure REPL driven development - a simple example</li> </ul> <p>Updated Cognitect REBL install procedure, local maven install no longer required (Edit: since removed from the book).</p> <p>Updated Conjure configuration and documentation</p>"},{"location":"practicalli-project-update-4/#screencast-video-editing","title":"Screencast Video Editing","text":"<p>Learned how to use Blender.org for Video editing which proved to be much more efficient that previous tools used. This will help produce a higher quality of videos for the new series on Clojure CLI tools and REPL driven development.</p>"},{"location":"practicalli-project-update-4/#practicalli-clojure-depsedn-configuration","title":"Practicalli Clojure deps.edn configuration","text":"<p>Minor updates to the practicalli/clojure-cli-config user level configuration for Clojure CLI tools. This configuration is alsor recommeded by seancorfield/dot-clojure personal configuration</p> <ul> <li>inspect/rebl - link added to updated install requirements</li> <li>updated library versions for: clj-new and depstar update</li> <li>title and alias sub-section in mini table of contents</li> <li>merge project related aliases into one section</li> </ul>"},{"location":"practicalli-project-update-4/#practicalli-spacemacs","title":"Practicalli Spacemacs","text":"<p>Changes to the practicalli/spacemacs.d configuration for Spacemacs.</p> <ul> <li>renamed Git branch to live (update your remote urls)</li> <li>recommending Emacs 27.1 as its the current stable version and it supports ligatures (stylized character pairs).</li> <li>added unicode ligature support (no need for ligature configuration in dotspacemacs/user-config as it built into the unicode layer)</li> <li>Switched to using Fira code font as this has ligature support</li> <li>Updated the doom modeline theme for a nice minimal look without loosing any important information</li> <li>Added font rendering optimizations</li> </ul> <p>Several custom snippets added to the practicalli/spacemacs.d: deprecated and design journal banners, rich code block with clj-kondo ignore duplicate</p>"},{"location":"practicalli-project-update-5/","title":"Practicalli Project Update 5","text":"<p>A range of updates, new content and tool reviews and testing. Helping lots of students on Exercism in the last week.</p>"},{"location":"practicalli-project-update-5/#practicalli-study-group","title":"Practicalli Study Group","text":"<p>Getting back to some important basics of Clojure, walking through several Exercism.io coding challenges (to support mentoring efforts there).</p> <ul> <li>089 - Code challenges - Regular Expressions to solve Bob challenge on Exercism.io</li> <li>088 - Code challenges - Encoding and decoding</li> <li>087 - Clojure CLI tools - Practicalli Clojure deps.edn configuration and a tour of community tools</li> </ul>"},{"location":"practicalli-project-update-5/#practicalli-clojure","title":"Practicalli Clojure","text":"<p>Reviewed the Introduction and Getting Started sections, improving the flow and providing a solid introduction to Clojure.</p> <p>New sections * Using Clojure CLI tools - common tasks - with accompanying broadcast * Code Analysis - install and configuring clj-kondo * Neovim and Conjure install and Conjure user guide](https://practical.li/clojure/clojure-editors/) - Update: moved to Practicalli Neovim</p> <p>Updated Clojure CLI tools version used with CircleCI and updating scripts to use -M flag with aliases.</p> <p>Evaluated Spacevim to see if it should be added to the recommended Clojure aware editors. An issue was found running the Clojure CLI tools REPL on Linux, along with a quick fix. Although the configuration of vim packages is excellent and a very impressive overall experience. the Clojure environment is very basic and would welcome modernizing. Ideally adding Conjure to SpaceVim would produce an excellent development experience.</p>"},{"location":"practicalli-project-update-5/#practicalli-clojure-cli-config","title":"Practicalli clojure-cli-config","text":"<p>Updates and fixes to the user level configuration for Clojure CLI projects</p> <ul> <li>Add <code>:middleware/cider-clj</code> and <code>:middleware/cider-clj-refactor</code> aliases to allow connections to a running REPL from Cider (and should also work for Calva).</li> <li>practicalli/live middleware/clojure-clj-refactor: add documentation</li> <li>Clojure CLI config precedence - added graphic</li> <li>Added Common development tasks</li> <li>kaocha test runner: fix for 1.0.700 release</li> <li>Update group-id of <code>deps-deploy</code> (#3)</li> </ul>"},{"location":"practicalli-project-update-5/#practicalli-spacemacs","title":"Practicalli Spacemacs","text":"<p>New content: * Running specific test groups with test selectors</p> <p>Updated content: * Line numbers - visual, relative and absolute styles * Repeating searches and scrolling through search pattern history</p>"},{"location":"practicalli-project-update-5/#cider-issue","title":"Cider issue","text":"<p>Investigated bug with Emacs Cider and the new Clojure CLI tools <code>-M</code> alias flag. Cider modeled Clojure CLI tools support on the approach for Leinigen and this resulted in the -A alias flag occurring out of position. The clojure command does work this way, only since the <code>-M</code> flag has been introduced that the issue became visible. The fix organises the arguments in the correct position * Issue: Clojure CLI command parameters order incorrect * PR: jack-in: move Clojure-cli parameter global-opts after -Sdeps</p> <p>Hacking on CIDER live broadcast to evolve the way cider-jack-in manages aliases. Covers basic elisp print line style debugging and how to hack on the live Cider code running in Emacs.</p>"},{"location":"practicalli-project-update-5/#clojure-cli-support-for-other-tools","title":"Clojure CLI support for other tools","text":"<p>Reviewed Clojure CLI support for other Clojure aware editors recommended and raised issues and fixes.</p>"},{"location":"practicalli-project-update-5/#calva-issue","title":"Calva issue","text":"<p>Calva only seems to allow the use of <code>-A</code> flag when using its jack-in feature, so issue #826 raised for awareness of the change in Clojure CLI tools.</p>"},{"location":"practicalli-project-update-5/#spacevim-issue","title":"Spacevim issue","text":"<p>Spacevim fails to run the REPL using Command Line tools on Unix systems, picking up the wrong executable name. Suggested a quick hack to fix the issue to help the community create a suitable fix in vimscript.</p> <p>Thank you.</p> <p> Practical.li Website</p> <p> Practical.li GitHub Org practicalli-johnny profile</p> <p> @practicalli@clj.social @practical_li</p>"},{"location":"practicalli-project-update-2/","title":"Practicalli Project Update 2","text":"<p>Invested time to understand the changes coming to the Clojure CLI tools and understand the opportunities that Clojure exec (<code>:exec-fn</code> & <code>:exec-args</code>) brings to aliases. These changes provided a catalyst to start redesigning the aliases used in practicalli/clojure-cli-config.</p>"},{"location":"practicalli-project-update-2/#practicalli-study-group","title":"Practicalli Study Group","text":"<p>Continuing the Banking on Clojure project, especially around database access. The database schema was refined along with improved approaches to creating database schema, using transactional updates and ensuring connections are closed. The next.jdbc friendly functions were explored and a CRUD approach implemented.</p> <ul> <li> 082 - Banking On Clojure - Part3 - next.jdbc for SQL in Clojure</li> <li> 083 - Banking On Clojure - Part4 - Updating data in the database</li> </ul> <p>Next steps will be to use Clojure spec for generative testing with the database, add connection pooling and using lifecycle management libraries.</p>"},{"location":"practicalli-project-update-2/#practicalli-webapps","title":"Practicalli WebApps","text":"<p>Updated sections on H2 Database and Banking on Clojure</p> <ul> <li>Design and Create Database Tables</li> <li>Defining Database Queries - different approaches</li> <li>Create database records</li> <li>Read Database Records</li> <li>Update Records in the database</li> <li>Delete Records in the database</li> </ul>"},{"location":"practicalli-project-update-2/#practicalli-clojure","title":"Practicalli Clojure","text":"<p>Added core principles for writing effective unit tests in Clojure. Included project configuration examples of unit tests for Leiningen and Clojure CLI tools.</p> <p>Included example configuration for Emacs CIDER test runner and link to the test runner configurations in practicalli/clojure-cli-config.</p>"},{"location":"practicalli-project-update-2/#clojure-cli-config","title":"Clojure CLI Config","text":"<p>Created a draft guide to changes in the next release of the Clojue CLI tools, to understand the significance of the changes it introduces. The <code>-X</code> flag for executing a function with EDN arguments (hash-map arguments) has already been introduced and the new release depreciates the generic <code>-A</code> alias in favor of <code>-M</code>. In the long term using the <code>-X</code> flag with functions that take a structured argument looks to be an excellent approach.</p> <p>Started a redesign of practicalli/clojure-cli-config using qualified keywords for alias names. The Library repositories keyword, <code>:mvn/repos</code>, is already qualified, so this redesign brings the aliases in line with that style. The alias keywords are prepended with names to communicate the category of purpose for each alias, e.g. repl, project, env, lib, inspect, build, deploy.</p> <p>As part of the redesign, the new flags introduced with Clojure CLI tools, <code>-M</code> and <code>-X</code>, are used. The <code>-X</code> flag is the preferred Clojure command line flag to use for the aliases, where the library supports executing a function from the library that takes a hash-map of arguments. Otherwise <code>-M</code> flag replaces <code>-A</code> flag and continues to use <code>clojure.main</code> to call the <code>-main</code> function of the given main namespace.</p> <p>Add project/check to give detailed report on compilation issues for a project</p> <p>UPDATE: all aliases in Practicalli CLI Config use fully qualified names.</p>"},{"location":"practicalli-project-update-2/#practicalli-spacemacs","title":"Practicalli Spacemacs","text":"<p>Resolved simple bug fixes raised by the community.</p> <p>Thank you.</p> <p> Practical.li Website</p> <p> Practical.li GitHub Org practicalli-johnny profile</p> <p> @practicalli@clj.social @practical_li</p>"},{"location":"practicalli-project-update-3/","title":"Practicalli Project Update 3","text":"<p>Continuing the Live broadcasts covering the developmment of the Banking on Clojure web application. - 084 - Banking On Clojure - Part5 - Generated database records from clojure.spec - 085 - Banking On Clojure - Part6 - Refactor database schema, specs and namespaces</p>"},{"location":"practicalli-project-update-3/#practicalli-clojure","title":"Practicalli Clojure","text":"<p>New sections and Pages: * Coding Challenges section * Unit testing fixtures</p> <p>Added Code Challenges section, covering the Clojure challenges available in 4Clojure.com, Exercism.io, CodwWars.com, ClojureScript Koans and Advent of Code.</p> <p>A quick guide to using each of the Code challenge websites was provided and tips to using them effectively.</p> <p>GitHub code repositories for the Practicalli 4Clojure guides, codewars-guides and exercism-guides were included, along with the 4Clojure guides video playlist which walks through the solution to over 60 challenges and different approaches to solving them.</p> <p>Several 4Clojure and Exercism challenges have been added as solution walk-through, showing the design thinking behind the solution in the website. More of these will be converted from the solution code repositories as time allows, along with a video showing the REPL driven development experience.</p> <p>Added Unit testing fixtures page with examples from Banking on Clojure project. Also mentioned test selectors as a way to organize slower fixtures.</p> <p>Started creating project templates for use with clj-new, to create deps.edn projects useful for beginners and experienced developers alike. A section on writing your own custom templates will be added to the Practicalli Clojure book in October.</p> <p>Continuing to create scripts for video screencasts for a series on the Clojure CLI tools, covering the usage from the latest release (1.10.1.697). The series will convey the developer experience and common practices.</p> <p>Continue testing Clojure CLI pre-release and enhancing the aliases in practicalli/clojure-cli-config, no issues found so far.</p>"},{"location":"practicalli-project-update-3/#clojure-webapps","title":"Clojure WebApps","text":"<p>Redesign the database schema and clojure.spec specifications to simplify the use of generative testing with specifications and in general make the specifications easier to work with.</p> <p>Using generative testing with the database. Specifications are used to generate random data to test the database CRUD functions, validating the results of those functions against clojure specs.</p> <p>Added code to create and delete the development database which is called from fixture functions within the handler-helper-test namepace. The tests now run successfully via the CirceCI service.</p> <p>Using kaocha profiles to configure different behavior in the development environment and when running on the CI server, specifically file change watcher and test output.</p>"},{"location":"practicalli-project-update-3/#practicalli-spacemacs","title":"Practicalli Spacemacs","text":"<p>Now Emacs 27 is the default, trying out Ligature support in Emacs. Added the unicode layer with variables to include ligatures. Initially switching to the Fira code font which contains a wide range of ligatures in the font already.</p> <p>Will try the Ligaturizer project to add Fira Code ligatures to the Ubuntu Mono font, the preferred font used by Practicalli.</p>"},{"location":"practicalli-project-spring-2023/","title":"Practicalli Project Spring 2023","text":"<p>Due to covid illness during 2022 the planned work has been spread over late 2022 - early 2023.</p>"},{"location":"practicalli-project-spring-2023/#general-tasks","title":"General tasks","text":"<ul> <li>upgraded all Practicalli books to MkDocs for book generation, using Material for MkDocs theme for enhanced content engagement</li> <li>Updated Practical.li website to list all book, identifying those still under development</li> <li>Monthly updates of Practicalli Clojure CLI Config aliases to support the Practicalli books</li> <li>Practicalli Organisation Profile on GitHub to help surface the books and video content available</li> <li> <p>Improved Practicalli logo for light and dark theme support</p> </li> <li> <p>GitHub Issue activity</p> </li> <li>All GitHub activity</li> </ul> <p>Contributions to other open source projects</p> <ul> <li>Spacemacs Command log layer - add keycast bindings show keys in Emacs header / tab bar and modeline to support Practicalli Screencasts</li> <li>Spacemacs Git layer - add toggle draft PR key binding show keys in Emacs header / tab bar and modeline to support Practicalli Screencasts</li> <li>mulog documentation - add Reitit ring handler middleware example for logging requestst and responses</li> <li>Update Emacs Docs for Portal</li> </ul>"},{"location":"practicalli-project-spring-2023/#practicalli-clojure","title":"Practicalli Clojure","text":"<ul> <li>Packaging Clojure projects with tools build</li> <li>Practicalli Project Templates for seancorfield/deps-new project, including Dockerfile, Makefile, code quality check & megalinter GitHub workflows</li> <li>Major book re-write to focus on Clojure CLI and a REPL Reloaded workflow<ul> <li>REPL reloaded and associated aliases created in Practicalli Clojure CLI Config</li> <li>Intro to Clojure CLI, how to use and define aliases, exec options</li> <li>practicalli approach to designing aliases, discussing composability focused design</li> <li>refactor and update Clojure Editor section - creating several new books</li> </ul> </li> <li>Simplify practicall/clojure-cli-config<ul> <li>add <code>:repl/reloaded</code> & <code>:dev/reloaded</code> aliases to support REPL Reloaded workflow</li> <li>remove unused aliases to the deps-deprecated.edn file</li> </ul> </li> <li>using Make for a consistent command line experience across projects</li> <li>Format clojure code - cljstyle, cljfmt, eastwood, kibit</li> </ul>"},{"location":"practicalli-project-spring-2023/#new-book-engineering-playbook","title":"New Book: Engineering Playbook","text":"<p>Specific guides (plays) to common software engineering tasks covering a range of practices and tools</p> <ul> <li>Architecture</li> <li>C4 code driven architecture diagrams and Structurizr tool</li> <li>Practicalli FinTech risk system with Data Science Modelling example architecture</li> <li>Build tools</li> <li>Make universal build automation tool</li> <li>Code Quality</li> <li>MegaLinter local runner and GitHub Workflow - providing a wide range of lint tools for code and configuration files</li> <li>Clojure quality tools - format, syntax and idiom checks (clj-kondo, cljstye, cljfmt, zprint)</li> <li>Command Line tools</li> <li>kitty terminal - fast and feature rich GPU based terminal emulator</li> <li>Continuous Integration</li> <li>Common GitHub actions</li> <li>Example GitHub workflows used in production</li> </ul>"},{"location":"practicalli-project-spring-2023/#practicalli-clojure-web-services","title":"Practicalli Clojure Web Services","text":"<ul> <li>Service REPL Workfow added, including</li> <li>Aero parsing of system configuration and tag literals</li> <li>Integrant REPL for a repl reloaded workflow when building clojure services</li> <li>Integrant to manage system components at Clojure Service runtime</li> <li>GitHub template for a Clojure project including tools.build, format tools configuration, Makefile task automation, Dockerfile and REPL reloaded user namespace</li> <li>Practicalli Service template for seancorfield/deps-new project with http-kit, reitit, mulog, including Dockerfile, Makefile, code quality check & megalinter GitHub workflows</li> </ul>"},{"location":"practicalli-project-spring-2023/#new-book-practicall-vspacecode","title":"New Book: Practicall VSpaceCode","text":"<p>Started a guide to using VSpaceCode for clojure development, bringing VS Code, Calva and vim-style editing together as an effective tool.</p> <p>Key bindings for Calva were submitted and merged to VSpaceCode</p> <p>Additional settings and key bindings were created to enhance the experience.</p>"},{"location":"practicalli-project-spring-2023/#blog-posts","title":"Blog posts","text":"<p>New articles:</p> <ul> <li>Create deps-new templates for Clojure CLI projects</li> <li>Build Emacs from source on Ubuntu Linux</li> <li>London Clojurians Community - a relatively brief history</li> <li>Build and run Clojure with Multi-stage Dockerfile<ul> <li>practicalli/clojure-app-template Dockerfile comprehensive multistage Dockerfile example</li> </ul> </li> <li>Make Clojure development tasks simple and consistent - Update: moved to Practicalli Engineering Playbook - Make<ul> <li> practicalli/clojure-app-template Makefile</li> </ul> </li> <li>ClojureScript workflow with Clojure CLI tools and Figwheel-main</li> <li>Adopting FreeDesktop.org XDG standard for development tools</li> <li>Building Emacs 28 on Ubuntu Linux</li> <li>Java 17 JDK for Clojure development</li> </ul> <p>Updates:</p> <ul> <li>update: rewrite Clojure CLI understanding aliases</li> <li>clarify: extra-deps description updated</li> <li>update: Article build run clojure with multistage dockerfile</li> </ul>"},{"location":"archive/2025/","title":"2025","text":""},{"location":"archive/2024/","title":"2024","text":""},{"location":"archive/2023/","title":"2023","text":""},{"location":"archive/2020/","title":"2020","text":""},{"location":"archive/2018/","title":"2018","text":""},{"location":"category/practicalli/","title":"practicalli","text":""},{"location":"category/hardware/","title":"hardware","text":""},{"location":"category/clojure/","title":"clojure","text":""},{"location":"category/neovim/","title":"neovim","text":""},{"location":"category/debian/","title":"debian","text":""},{"location":"category/clojurists-together/","title":"clojurists-together","text":""},{"location":"category/100daysofcode/","title":"100daysofcode","text":""},{"location":"page/2/","title":"Journal","text":""},{"location":"page/3/","title":"Journal","text":""},{"location":"page/4/","title":"Journal","text":""},{"location":"page/5/","title":"Journal","text":""},{"location":"page/6/","title":"Journal","text":""},{"location":"page/7/","title":"Journal","text":""},{"location":"page/8/","title":"Journal","text":""},{"location":"page/9/","title":"Journal","text":""},{"location":"page/10/","title":"Journal","text":""},{"location":"page/11/","title":"Journal","text":""},{"location":"archive/2024/page/2/","title":"2024","text":""},{"location":"archive/2024/page/3/","title":"2024","text":""},{"location":"archive/2024/page/4/","title":"2024","text":""},{"location":"archive/2024/page/5/","title":"2024","text":""},{"location":"archive/2024/page/6/","title":"2024","text":""},{"location":"archive/2023/page/2/","title":"2023","text":""},{"location":"archive/2023/page/3/","title":"2023","text":""},{"location":"archive/2020/page/2/","title":"2020","text":""},{"location":"archive/2018/page/2/","title":"2018","text":""},{"location":"category/100daysofcode/page/2/","title":"100daysofcode","text":""},{"location":"category/clojurists-together/page/2/","title":"clojurists-together","text":""},{"location":"category/practicalli/page/2/","title":"practicalli","text":""},{"location":"category/practicalli/page/3/","title":"practicalli","text":""},{"location":"category/practicalli/page/4/","title":"practicalli","text":""},{"location":"category/practicalli/page/5/","title":"practicalli","text":""},{"location":"category/practicalli/page/6/","title":"practicalli","text":""},{"location":"category/practicalli/page/7/","title":"practicalli","text":""},{"location":"category/practicalli/page/8/","title":"practicalli","text":""}]} \ No newline at end of file