--- title: 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](https://github.com/tjko/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. ```bash 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). ```bash 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](https://imagemagick.org/command-line-processing/#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. ```bash openssl rand -base64 32 ``` - `rand` instructs it to generate a random number or byte sequence - `-base64` instructs it to output [Base64](https://en.wikipedia.org/wiki/Base64) encoded data. You can also use `-hex` if you just want Base 16, but that's more verbose. - `32` is 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.