Unit Wrangling

I use GNU Units to convert measurements.

The program knows about many obscure and antiquated units, but I mostly use it for boring things like converting currencies and between metric and imperial units. It can be used directly from the command line, or via a prompted interactive mode.

$ units 57EUR USD
        * 63.526262
        / 0.015741521

$ units
Currency exchange rates from FloatRates (USD base) on 2019-07-24
3460 units, 109 prefixes, 109 nonlinear units

You have: 16 floz
You want: ml
        * 473.17647
        / 0.0021133764
You have: tempC(30)
You want: tempF
        86

GNU Units is picky about its unit definitions, and they are case sensitive. For example, it knows what USD is, but usd is undefined. It supports tab completion of units in interactive mode, which can be helpful. It knows the difference between a US fluid ounce and a British fluid ounce.

$ units "1 usfloz" ml
        * 29.57353
        / 0.033814023

$ units "1 brfloz" ml
        * 28.413063
        / 0.03519508

The unit definitions are stored at /usr/share/units/definitions.units. Occasionally I’ll need to peruse through this file to find the correct formatting for the unit I’m interested in. Sometimes when doing this I’ll run into one of the more obscure definitions, such as beespace. Apparently this unit is used in beekeeping when designing hive boxes. It is described in the definition file thusly: “Bees will fill any space that is smaller than the bee space and leave open spaces that are larger. The size of the space varies with species.”

$ units 12inches beespace
        * 48
        / 0.020833333

Every so often you need to know how many Earth days are in one Martian year. With GNU Units that information is a few keystrokes away.

$ units 1marsyear days
        * 686.97959
        / 0.0014556473

Currency definitions are stored in /var/lib/units/currency.units. They are updated using the units_cur program. In the past I would update currencies whenever I needed them, but recently I setup a systemd timer to update these definitions roughly once per day (depending on network connectivity). This provides me with conversion rates that are current enough for my own use, which I can take advantage of even when offline, and does not require me to let a third party know which currencies or quantities I am interested in.

Astute readers will have noted that I am big on this offline computing thing.

Undertime

Undertime is a simple program that assists in coordinating events across time zones. It prints a table of your system’s local time zone, along with other any other specified zones. The output is colorized based on the start and end hour of the working day. If you want to talk to someone in Paris tomorrow, and you want the conversation to happen at an hour that is reasonable for both parties, Undertime can help.

Undertime Paris Meeting Example

I often find myself converting between local time and UTC. Usually this happens when working with system logs. If I have a specific date and time I want to translate, I’ll use date.

# Convert a time from PDT to UTC:
$ env TZ="UTC" date -d "2016-03-25T11:33 PDT"
# Convert a time from UTC to local:
$ date -d '2016-03-24T12:00 UTC'

If I’m not looking to convert an exact time, but just want to answer a more generalized question like “Approximately when was 14:00 UTC?” without doing the mental math, I find that Undertime is the quickest solution.

$ undertime UTC
╔═══════╦═══════╗
║  PDT  ║  UTC  ║
╠═══════╬═══════╣
║ 00:00 ║ 07:00 ║
║ 01:00 ║ 08:00 ║
║ 02:00 ║ 09:00 ║
║ 03:00 ║ 10:00 ║
║ 04:00 ║ 11:00 ║
║ 05:00 ║ 12:00 ║
║ 06:00 ║ 13:00 ║
║ 07:00 ║ 14:00 ║
║ 08:00 ║ 15:00 ║
║ 09:00 ║ 16:00 ║
║ 10:00 ║ 17:00 ║
║ 11:00 ║ 18:00 ║
║ 12:00 ║ 19:00 ║
║ 13:00 ║ 20:00 ║
║ 14:00 ║ 21:00 ║
║ 15:00 ║ 22:00 ║
║ 16:00 ║ 23:00 ║
║ 17:00 ║ 00:00 ║
║ 18:00 ║ 01:00 ║
║ 19:00 ║ 02:00 ║
║ 19:04 ║ 02:04 ║
║ 20:00 ║ 03:00 ║
║ 21:00 ║ 04:00 ║
║ 22:00 ║ 05:00 ║
║ 23:00 ║ 06:00 ║
╚═══════╩═══════╝
Table generated for time: 2019-07-23 19:04:00-07:00

Music Organization with Beets

I organize my music with Beets.

Beets imports music into my library, warns me if I’m missing tracks, identifies tracks based on their accoustic fingerprint, scrubs extraneous metadata, fetches and stores album art, cleans genres, fetches lyrics, and – most importantly – fetches metadata from MusicBrainz. After some basic configuration, all of this happens automatically when I import new files into my library.

After the files have been imported, beets makes it easy to query my library based on any of the clean, consistent, high quality, crowd-sourced metadata.

$ beet stats genre:ambient
Tracks: 649
Total time: 2.7 days
Approximate total size: 22.4 GiB
Artists: 76
Albums: 53
Album artists: 34

$ beet ls -a 'added:2019-07-01..'
Deathcount in Silicon Valley - Acheron
Dlareme - Compass
The Higher Intelligence Agency & Biosphere - Polar Sequences
JK/47 - Tokyo Empires
Matt Morton - Apollo 11 Soundtrack

$ beet ls -ap albumartist:joplin
/home/pigmonkey/library/audio/music/Janis Joplin/Full Tilt Boogie
/home/pigmonkey/library/audio/music/Janis Joplin/I Got Dem Ol' Kozmic Blues Again Mama!

As regular readers will have surmised, the files themselves are stored in git-annex.

Mirrors on a bike are no different than mirrors on any other vehicle.

They aren’t a replacement for turning your head, but they can be a useful supplement for maintaining 360 degrees of awareness.

Drop Bar Mirrors

I purchased a pair of Sprintech Drop Bar Mirrors last spring. I had never used a bike mirror before, but I’ve grown fond of these over the past three months of use. The viewport is small, but adequate to identify vehicles of any size. I keep the mirrors canted outboard slightly, which means they move if I lean the bike up against a wall. Sometimes I’ll bump one when straddling the bike at a stop light. But they’re easy to move back into place, and I’ve never had them move on their own – rough roads aren’t enough to rattle them – so I don’t mind this. Having never used any other kind of bike (or helmet) mounted mirror, I can’t compare them against their competition, but I think the Swiss are on to something with these. I’d buy them again.

Terminal Countdown

Termdown is a program that provides a countdown timer and stopwatch in the terminal. It uses FIGlet for its display. Its most attractive feature, I think, is the ability to support arbitrary script execution.

I use it most often as a countdown timer. One of my frequent applications is as a meditation timer. For this I want a 11 minute timer, with an alert at 10.5 minutes, 60 seconds, and 1 second. This gives me a 10 minute session with 30 seconds preparation and 30 seconds to return. Termdown makes this easy.

$ termdown --exec-cmd "case {0} in 630|30) mpv ~/library/audio/sounds/bell.mp3;; 1) mpv ~/library/audio/sounds/ring.mp3;; esac" 11m

An Offline Lexicon

dictd is a dictionary database server and client. It can be used to lookup word definitions over a network. I don’t use it for that. I use the program to provide an offline dictionary. Depending on a network connection, web browser and third-party websites just to define a word strikes me as dumb.

To make this go, dictionary files must be installed. I use the GNU Collaborative International Dictionary of English (GCIDE), WordNet, and the Moby Thesaurus. The GCIDE is derived from Noah Webster’s famous American dictionary. WordNet is a more modern (one might say “dry”) resource. The Moby Thesaurus is a public domain thesaurus originally built by Grady Ward. Between these three sources I can have a pretty good grasp on the English language. No network connectivity required.

I use a shell alias to always pipe the definitions through less.

def () {
    dict $1 | less
}

All-Purpose Cleaner

My all-purpose cleaner consists of:

I use this to clean my dishes, my shower, every surface in my apartment, and every part of my bike except the chain. About the only things I can think of that don’t get cleaned with this mixture are my body and my electronics. Previously I used a mixture of Bronner’s castile soap and water for all of these things, but Sal Suds is better at cutting grease. This makes it preferable for kitchen (and bike) duty. I saw no reason to keep two cleaners around, so I phased out the castile soap mix.

I mix this in a recycled 0.5 L glass bottle with a neck that has standard 28-400 threading, allowing me to add a sprayer. The half liter bottle lasts me roughly two weeks. A single batch costs me in the neighborhood of $0.25, meaning I spend somewhere around $6.50 per year to clean my things.

I go back and forth on the vinegar – sometimes I skip it and use 0.5 L of water instead. I don’t notice a difference in the cleaning performance, but I tend to use more of it when I skip the vinegar. Vinegar is an effective bactericide and, unlike with castile soap, there’s no harm in mixing it with the Sal Suds detergent, so I generally opt to put it in.

To measure the detergent I use an OXO Mini Angled Measuring Cup, which has proved a useful thing to keep around.

I soak produce in a solution of baking soda.

A study from the University of Massachusetts found that a baking soda wash can be effective at removing pesticides from the surface:

Surface pesticide residues were most effectively removed by sodium bicarbonate (baking soda, NaHCO3) solution when compared to either tap water or Clorox bleach. Using a 10 mg/mL NaHCO3 washing solution, it took 12 and 15 min to completely remove thiabendazole or phosmet surface residues, respectively, following a 24 h exposure to these pesticides… This study gives us the information that the standard postharvest washing method using Clorox bleach solution for 2 min is not an effective means to completely remove pesticide residues on the surface of apples. The NaHCO3 method is more effective in removing surface pesticide residues on apples. In the presence of NaHCO3, thiabendazole and phosmet can degrade, which assists the physical removal force of washing. However, the NaHCO3 method was not completely effective in removing residues that have penetrated into the apple peel. The overall effectiveness of the method to remove all pesticide residues diminished as pesticides penetrated deeper into the fruit. In practical application, washing apples with NaHCO3 solution can reduce pesticides mostly from the surface.

I use a dish washing basin with a drain filled with 6 liters of water (I’ve previously placed pieces of tape on the side of the basin to indicate water levels for 2, 4, 6, and 8 liters). The study’s 10 mg/mL NaHCO3 washing solution translates to 60,000 mg of baking soda for this amount of water, or about 4 tablespoons, which I dump in and swirl around a bit. Then in goes the produce. After 15 minutes I can just pull the drain, blast everything with some pressure from the faucet, and let it sit in the basin (with drain open) to dry until I get around to putting everything away. It is most important to perform this process on the Environmental Working Group’s Dirty Dozen, but the procedure requires such a low amount of effort that I soak any produce which is lacking a thick peel (like oranges) as soon as I get back from the market, regardless of its providence.

Bacteria is a different matter.