Useful Utilities
Here’s a small collection of various utilities and recipes I find useful. It’s not organized in a particular way, but more as a long-term memory for me.
JPEG Optimization
jpegoptim is a handy little utility for doing JPEG optimization. I use it to compress files and strip EXIF data. Here’s an example that will process all the files in the current directory and compress them to a reasonable 85.
nix run 'nixpkgs#jpegoptim' -- --max=85 --strip-all *.jpg
The major issue with jpegoptim is that it doesn’t do resizing. Image Magick is the Swiss army knife of image manipulation and can do it all, but it’s a much larger piece of software. This can quickly reduce a full-size camera image (~5MB) to something suitable for web uploads, thumbnails or avatars (50kB).
nix run 'nixpkgs#imagemagick' -- input.jpg -resize 1200x800 -strip -quality 85 output.jpg
There are lots of options that can be passed to the image geometry. The default for pixel sizes is to treat it as a maximum and preserve the aspect ratio. If only a width is given then height is automatically determined from the aspect ratio.
Generate a random string
Many times I want a random string to act as a secret shared between two services. This comes up all the time when configuring services on my home server. The common openssl library will generate secure random strings for you.
openssl rand -base64 32
randinstructs it to generate a random number or byte sequence-base64instructs it to output Base64 encoded data. You can also use-hexif you just want Base 16, but that’s more verbose.32is the number of bytes of data to produce.
Base64 has only 6 bytes per character, while the system generates multiples of 8. This creates a mismatch since it’s generating 32 * 8 = 256 bits of data which is not a multiple of 6. This leaves 2 bits extra. Base64 encodes blocks of 3 bytes at a time into 4 output characters.In this case we need 8 extra bits to get to a multiple of three (257). These get encoded as zeros to fill out the character and a trailing = is appended to indicate a non-coding character.