A new Litter Survey
In a culmination of litter surveys and litter picks, linked data() and data exploration, and remoteStorage and ActivityPub, I have created a web-based litter pick/survey app that I hope will allow federated citizen science.
In a culmination of litter surveys and litter picks, linked data() and data exploration, and remoteStorage and ActivityPub, I have created a web-based litter pick/survey app that I hope will allow federated citizen science.
My latest litter pick target was Hoe Stream and the White Rose Lane Local Nature Reserve. Here's how it went.
I just created a Gitlab CI job to create a release with information from a CHANGELOG.md file for some of my projects. Here's how I did it.
Keeping track of what commit relates to which release of your Git projects requires making sure that you tag the commits with the related version. This can be manually done when you release a new version (if you remember), or automatically with the help of continuous integration (CI) pipelines.
I had previously hacked together a job to do this using git commands and a masked URL containing an API key (like in the example below), but recently found the release-cli project and docker container for doing the same in a much cleaner fashion.
tag:
stage: tag
script:
- export VERSION=$(node -e "console.log(require('./package.json').version)")
- git status
- git remote -v
- git remote set-url origin ${SECRET_URL}
- git tag v$VERSION
- git push origin v$VERSION
only:
- masterThe release-cli docker container is able to both create a git tag and a Gitlab release, for which you can give information on the release, such as what has changed.
Creating a job to create the release using release-cli is fairly straight forward.
tag:
stage: tag
image: registry.gitlab.com/gitlab-org/release-cli
script:
- |
release-cli --server-url $CI_SERVER_URL --job-token $CI_JOB_TOKEN \
--project-id $CI_PROJECT_ID create --name "Release v${VERSION}" \
--description "$DESCRIPTION" --tag-name "v${VERSION}" \
--ref $CI_COMMIT_SHA
variables:
# Ensures submodules are not pulled
GIT_SUBMODULE_STRATEGY: none
only:
- master And if you are using Gitlab >=13.2 it is even easier with the release keyword
tag:
release:
tag_name: v${VERSION}
description: ${DESCRIPTION}
only:
- masterThe only more difficult thing you need to do is specify the version and the description for the release.
As I keep a CHANGELOG of all the changes I make in most of my projects, I decided to pull the release description from that and get the version number from either the package.json file (for NPM projects) or from the setup.py file (for Python projects).
To do this, I used the powerful sed utility to:
tag:
stage: tag
image: registry.gitlab.com/gitlab-org/release-cli
script:
- |
# Get the version from either the package.json or the setup.py file
if [ -e package.json ]; then
VERSION=$(cat package.json | sed -n "s/^.*\"version\": \"\\(.*\\)\".*$/\1/p")
elif [ -e setup.py ]; then
VERSION=$(cat setup.py | sed -n "s/^.*version='\\(.*\\)'.*$/\1/p")
fi
if [ "$VERSION" != "" ]; then
# Get the version details from the CHANGELOG if we have one
if [ -e CHANGELOG.md ]; then
DESCRIPTION=$(cat CHANGELOG.md | sed -e "1,/$(echo $VERSION | sed 's/\\./\\\\./')/d" | sed -e '/^## /,$d')
else
DESCRIPTION="Release v$VERSION"
fi
# Get the current tag of the commit (to ensure it hasn't already been tagged)
CURRENT_TAG=$(git describe --tags 2>/dev/null || true)
if [ "$CURRENT_TAG" != "v$VERSION" ]; then
release-cli --server-url $CI_SERVER_URL --job-token $CI_JOB_TOKEN \
--project-id $CI_PROJECT_ID create --name "Release v${VERSION}" \
--description "$DESCRIPTION" --tag-name "v${VERSION}" \
--ref $CI_COMMIT_SHA
fi
fi
variables:
# Ensures submodules are not pulled
GIT_SUBMODULE_STRATEGY: none
only:
- master
With the job updated, it was time to test. Luckily, I needed to publish a new version of keeps-on-ticking.
I prepared the merge request and when it was ready hit merge. It worked like a charm and produced Release v1.1.0.

I noticed something strange happening during build process during a multi-tasking bug fix. Turns out I was using Gitlab CI's caching incorrectly. I should have been using artifacts. Here's what I saw.
As a birthday treat, I took the day off work to try out my electronerised litter picker. Here's how it went.
In preparation for a day of litter picking, I finally got round to a project idea - attaching a camera to a litter picker to record it all. Here's what I did.
I finally started implementing UI testing on first-draft using WebdriverIO. While writing tests was easy, getting the tests running was a little more difficult. Here is how I did it.
Hooray! My new blog is live! Based on Sapper, using MongoDB and eventually ActivityPub and ActivityStreams, it will be my federated posting hub to the world.
Creating this new blog, I wanted to make sure there was no metadata data leaking personal information. Here's how I removed all the metadata tags except the ones I wanted from my photos.
Using tmux for your terminal multiplexer but want an easy to reattach to a session? Here's a small bash script to do it.
Here's how to help your readers save time by making your post's shell commands easy to select and copy - with a simple CSS property.
Making my new blog, I didn't initially set the published dates to be native dates in the database. Here what I did to change them ...and do all the upgrades I needed.
I recently needed to test that some Vue components were creating the correct HTML. To do this, I decided to create snapshots of Object representations of the rendered HTML.
HTML5 number inputs aren't useful, but tel inputs, have all the power
I decided to look into the extortion emails I have been getting and wrote a small script to extract the bitcoin addresses that have been used.
As part of my pledge not to upgrade, I decided to repair two of my failing mice instead of replacing them with a brand new model (as tempting as it was). Here's what I did.