shm That Cache
I am often trying to find more space on my hard drives and found today my own docker containers wasting space thanks to ! Here's how I fixed it.
I am often trying to find more space on my hard drives and found today my own docker containers wasting space thanks to ! Here's how I fixed it.
Upon recently trying Deezer again, I found their web app ate all my memory when running in Firefox, so I decided to see if I could find out why. I got as far as memory-file-data/string and Blobs. Here's how.
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.
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 have been wanting to attach a camera to a litter picker to track the things I have been picking up for a while. Hopefully, I can then use the images to track the items I'm picking up. As the Great British Beach Clean week is around my birthday, I decided to treat myself and spend some time on the project.
I bought a Raspberry Pi Zero W and a camera when they first came out, but hadn't really done anything with them.
As I was planning on using them for a beehive monitor, I also bought a 5000 mAhr LiPo battery and a PowerBoost 1000C LiPo battery module to use with the pi and a solar panel. I soldered them all up (minus the solar panel) and strapped them to the litter picker I had in a high-tech housing (a quarter of an orange juice bottle). I also bought a NEO-6MV2 GPS module so that it could record the GPS position the photo was taken.
I wanted to have the pi take a photo automatically when I went to pick something up and was planning on wiring up a microswitch, like one I replaced in my mouse surgery, but didn't have any spare. I instead decided to use some nickle tape I purchased to replace the batteries in my laptop.
I used an old USB cable that someone had thrown out and soldered two strips of nickel tape onto two of the wires in the cable.
I then placed old packaging foam between them and taped them together with trusty old electrical tape.
I downloaded the latest version of Raspberry Pi OS Lite and loaded it onto the microSD card I had.
$ wget https://downloads.raspberrypi.org/raspios_lite_armhf_latest -O raspios.zip
$ unzip raspios.zip
$ sudo dd if=2020-08-20-raspios-buster-armhf-lite.img of=/dev/sdb
I then configured the Pi to automatically connect to my WiFi using wpa supplicant and enabled ssh to start automatically
$ wpa_passphrase wificentral
$ echo "
network={
ssid="wificentral"
psk=6862a1eb9ac83930997165f51817a1cffea8da6bbbb24316d0efd181588ee93c
}" | sudo tee -a /media/user/rootfs/etc/wpa_supplicant/wpa_supplicant.conf
$ sudo touch /media/user/boot/ssh
The first blog I looked at on using a NEO-6M GPS module with a Raspberry Pi used Node.js, and as I am a fan of Javascript, I thought yeah, why not.
I installed the modules GPS.js and node-serialport for dealing with the GPS module, pigpio for detecting trigger presses and pi-camera-connect and piexifjs for capturing images and adding metadata to them.
I found the node-serialport and GPS.js modules had changed since the blog was written, so I had to rewrite the code and also found the GPS was on device /dev/ttyS0
instead of /dev/ttyAMA0
.
const file = '/dev/ttyS0';
const GPS = require('gps');
const SerialPort = require('serialport');
const port = new SerialPort(file, {
baudRate: 9600,
parser: new Readline({ delimiter: '\r\n' })
});
const gps = new GPS;
let position = null;
let updated = -1;
gps.on('data', function(data) {
if (data.type === 'GLL' && data.valid) {
position = data;
updated = (new Date()).getTime();
}
});
port.on('data', function(data) {
gps.updatePartial(data);
});
After some playing around with camera options and adding the metadata into the images, I was ready for my first tracked litter pick.
A little dark as it was early evening and in need of some angle adjustment, but it worked as I hoped.
As a finishing touch for the first version, I created a SystemD service to start the Node script on startup and got the script to save some power by turning off the WiFi 1 minute after startup if it wasn't connected to any network.
Helpful hint, when doing this, make sure your logic is correct as iwconfig wlan0 txpower off
persists even after a power cycle. Doh!
It was now ready for proper litter picking session.
I have put the code up on Gitlab and will update as I add more functionality. Ideas so far have included:
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.