Sander's Blurbs

Menu

Category: Technology

Wagtail blog experimentation

I spun up a test Wagtail install and followed its tutorial which lets you make a basic blog with categories, tags, galleries. The interface looks good on screenshots but is a bit unpolished in places, I tried installing wagtail-blog as well but it’s written for v2 and we’re at v4 now. That could be quite easy to update, I haven’t checked but might do, depending on motivation.

That said compared to the tutorial creating RSS feeds is not too hard, a WordPress Importer would be nice.

After that investigate some indieweb features.

Mail: a local privacy focused searchable database

Draft mail is the WordPress custom post-type of databases.

Ultimately all productivity apps for privacy focused folks trend towards a locally synced database containing stuff. A database searched with an interface you already use. This is e-mail, if that wasn’t already ruined by untrusted parties.

For example

  1. Notes: mail in a folder
  2. Bookmarks: page content referenced by a URI as mail in a folder.
  3. Todos: mail in a folder

Some of these use a man in the middle process to filter content, and high volume incoming / outgoing mail might get your account in trouble. So there are webservices with paid options to sustain them, with data export and privacy concerns.

Using python – best practices

This is how I do it:

  1. Manage python versions with pyenv. Modern python comes with pip already installed.
  2. Don’t touch system python if you have it, in terms of installing packages, updating it etc.
  3. For projects, use virtual environments using one of the python version installed with step 1. I prefer poetry at the moment to manage them.
  4. Use pipx if you want to install a global utility, so it’s isolated from any projects.

Feedback welcome.

Enable Playlist Radio on Spotify’s Liked Songs tracks

I tested and created a IFTTT recipe for backing up Liked Songs’ tracks : https://ifttt.com/applets/iMnNGt3V-backup-spotify-likes.

Despite the incorrect labelling “Saving a spotify track” means liking it, not “downloading to your device”. So you can add it to another Spotify playlist.

To get historical likes, cmd-a / ctrl-a (or equivalent) all Liked Songs tracks and drag them into the backup playlist.

This enables playlist options such as Playlist Radio giving you similar songs to the ones in the backup playlist.

How to export Safari’s Reading List into other services

I’m always collecting interesting links to read later, but like to try out a bunch of services. It’s very easy to add links to Safari’s reading list (particulary on iOS), so I used it quite a bit. Now I’ve switched to Pocket, I’d like to get those links out.

The thing you might not know is that Reading List items are stored as bookmarks.

Pocket can import browser bookmarks, but you might not want to import non Reading List items. This is how you do that:

Step by step

  1. In Safari, File > Export > Bookmarks. Save all your bookmarks, this is the disaster recovery backup.
  2. Delete all your non-reading list items.
  3. Export the bookmarks again, as reading-list.html. Delete them from Safari.
  4. Import the reading-list bookmark file into Pocket.

If you use Safari for regular bookmarks, restore the browser bookmarks without the reading list items:

  1. Import the bookmarks you exported in step 1.
  2. Delete your reading list items.

Bonus

If you have other browsers with bookmarks you want to add to your reading list, you can use the same idea to get them into pocket, using Safari as a way to prune any bookmarks you don’t want to import.

Truly Muting Gmail Conversations

You might have noticed that after muting a Gmail conversation it pops back into the inbox.

Google says:

“Muted conversations will only pop back into your inbox ready for your attention if a new message in the conversation is addressed to you and no one else, or if you’re added to the ‘To’ or ‘CC’ line in a new message.”

If you find conversations are popping back into the inbox you can create a new Apps Script (from Google Drive) with the following contents and add a Timed project trigger (most easily available from the classic editor) to run it every 15 minutes:

function archiveMuted() {
  var threads = GmailApp.search('is:muted',0,100);
  GmailApp.moveThreadsToArchive(threads);
}

Adjust the number 100 to the amount of muted email threads you expect in your inbox every 15 minutes.

Global node packages

This is non-obvious, but might save you some time when using node based tooling:

  • When installing a package globally in system node it works across all versions of node ✅.
  • When installing it globally in a non-system node, it works only in that particular version of node.

Managing homebrew package updates

I’ve taken to upgrade homebrew packages once a week on Monday morning, and replacing any packages that cause issues in my workflow and managing them some other way. This seems to work quite well, and is a better workflow than waiting until a new package needs to be installed and then breaking lots of things.

Privacy Forest

It turns out Mail’s “Mail Privacy Protection” warns you it does not work, this can be because you have Network’s “Limit IP Address Tracking” enabled (it also doesn’t work with proxy’s and VPNs). The latter works only in Mail and Safari, so if you use another main browser you could simply disable the “Limit IP Address Tracking” option and benefit from Mail privacy.

How both these options work with iCloud Private Relay on Mac I’m not sure.

How to develop a library and a project in PHP concurrently

I keep forgetting the best way to do this, so thought it best to write it down.

Suppose you are building a library and an example project that implements it. You can do this in a single repository with an example folder, for small examples.

But for larger examples you might want to use a separate repository, with it’s own issues and documentation.

This can make it a hassle to work with the library and keep the project in sync.

Let’s say these are mylibrary and myproject which is using the library. Let’s assume you’re using PHP and Composer. mylibrary is at version 0.1 but there are newer commits in the develop branch.

Require a Git repository

$ cd myproject
$ composer config repositories.me vcs https://github.com/me/mylibrary
$ composer require me/mylibrary:0.1 --prefer-source

--prefer-source means Composer will install from source if there is one, the result is a git repository.

Switch to the develop branch

Once installed it’s then easy to switch to any other branch you want to work on:

$ cd vendor/me/mylibrary; git switch develop

You don’t have to register the repository with packagist if you follow this workflow! As a bonus when after you run composer update in myproject the mylibrary directory sticks with the branch.

Daily Clean Trash

I use trash-cli on every linux install, and today I realised it’s not actually removing files from the trash, so I’ve set up this little scheduled task to delete items that have been trashed at least 30 days ago:

$ crontab -e
# daily trash clean
@daily /usr/bin/trash-empty 30

OpenSUSE Tumbleweed Installation Notes

For future reference here are some issues I’ve come across installing and setting up Tumbleweed on my workstation.

The reason for switching from macOS is that a commercial operating system focused on services builts in too many distractions for me. Also long term the Apple hardware is priced above what I’m prepared to pay, so it makes sense for me to look for an alternative.

Tumbleweed is a rolling distribution which makes for a long term maintained setup, and packages are tested thoroughly but are quickly updated.

So far these are just little niggles.

Day one issues

  • The old Grub menu from my previous Linux installation wasn’t wiped, I simply reinstalled making sure all existing partitions were deleted before partitioning.
  • avahi is not allowed to start itself due to security policies. This was because dbus needed to restart after avahi installed configuration into it. I could have rebooted.
  • My Apple Magic Keyboard must be selected in KDE after the installation as it’s not an option during the installation routine.
  • Opening ports for OpenSSH means that they’re open on the public zone. I didn’t realise this as I want to use the home zone as default.Yast Firewall sorted this out.
  • After installing Lutris, Steam and Proton Experimental, certain games would not start, due to missing vulkan drivers. This Lutris Wiki link describes the issue, I had to search Yast Software for vulkan showed I had to install libvulkan_intel and libvulkan_intel-32bit.

Interesting links

  • There’s a nice tiling window manager script for KDE called Krohnkite. Meta-D conflicted with show desktop, after reassigning the latter I still think that shortcut doesn’t do anything, though.

So far so good. The interface is more snappy than macOS and more powerful, and the system is working nicely.

Bye Twitter

I’ve deactivated my Twitter account.

Twitter didn’t like it, you get unceremoniously dumped out of the service with an error message. All your tweets disappear. Like you weren’t welcome anyway, social media with a nasty streak.

The problem with Twitter is that there’s only space for black/white arguments and replies. It harms compassion and collaboration. It’s algorithms are optimised for making money, not your wellbeing.

Let’s go make something beautiful instead with all the time saved!

VVV utility for ElasticSeach / ElasticPress

I’ve been switching my local WordPress sideprojects development setup to VVV and one thing I couldn’t find documented is how to setup ElasticSearch and ElasticPress.

There’s a VVV-ElasticSearch plugin on GitHub but it is missing documentation and it’s not been updated for 6 years :D), so I made my own:

elementaryOS 6 refresh

I refreshed the olde Thinkpad to elementaryOS 6, and thought it would be useful to me and others to document the process.

As they don’t support an upgrade from elementaryOS 5, I backed up my repositories using repoman and paved the rest, as I use this laptop for side-projects and have a sync solution in place.

The first install resulted in a black screen (perhaps it went into standby and did not respond to mouse or keyboard presses), but a restart continued the installation successfully. Further OS setup was straightforward and simple. I thought about creating a /home partition but as I was happy with my migration process I decided to go with the convenient default.

The first app to install I had to get from FlatHub, which is nicely integrated. This first flatpakref loaded on the second try and installed using the integration included in the OS.

Syncthing’s introducer feature allows a device to introduce shares to connected devices and this helps setting up the shared folder containing my new-device scripts. It’s important to untick “Receive only” so that it’s a two way sync.

This post will be updated as more thoughts become available.

GPG failed to sign the data

  • Follow https://www.git-tower.com/help/guides/integration/gpg/mac
  • If everything fails, use GIT_TRACE=1 prefixed to the git commit command to try and see what git is actually doing
  • Key might have expired, run the GPG Keychain application to check, it offers to extend the key.
    • You must then export the new key, delete the expired key in your GitHub account, and upload the new key to GitHub. Unverified past commits then become verified.

The trick to relative symlinks

I learned this week that relative symbolic links are relative to the link not the current working directory. What does this mean?

To remind ourselves, the format of ln is:

ln -s {{/path/to/file_or_directory}} {{path/to/symlink}}

Example

Say we have the following structure:

config/config.yaml
app/index.php

Say we want to create a symlink to app/config.yaml. If we are familar with the cp command we would incorrectly do this:

$ ln -s config/config.yaml app/config.yaml  #this is incorrect

Here, we’re asking ln to create a symlink in app/config.yaml that points to app/config/config.yaml because the ‘source’ parameter is relative to the link being created, not the current working directory. As that file does not exist the command fails!

Correct example:

$ ln -s ../config/config.yaml app/config.yaml #this is correct
$ cd app; ln -s ../config/config.yaml config.yaml; cd - #this is clearer

The first correct example can be difficult to comprehend unless we’re familiar with this concept: From the perspective of the app/config.yaml file, we need to first go to the parent directory then into the config directory.

This is clarified by the third example: by changing into the destination directory, we align the current working directory with the path to the source.

Notes

  1. If we create absolute symbolic links by providing the full path to the source file, this is avoided, however these links are more fragile. For example when syncing links the absolute path to the source is likely different on another device.

nvm ind

So shell login can be slow if you installed node versions using nvm and used nvm to set a default interpreter. The solution that helped me was to unset the default node but that means that there’s no node executable unless you manually first run nvm use node or setup .nvmrc in projects… If limited to the former solution, that means PHPStorm might complain node is missing.

I had success installing node from nodesource as the “system node” fallback. weird flex but ok. Some node is better than the right node.