Archive for category Home Ec

Multiprocess Book-on-CD Ripping

The most recent iteration of ripping a book-on-CD to bits suitable for a small MP3 player begins by defining the metadata:

author="Whoever Wrote It"
title="Whatever It May Be About"

Set up a suitable directory for the MP3 files, with a subdirectory for the WAV files direct from the CD:

mkdir "$author - $title"
cd "$author - $title"
mkdir waves

Then unleash cdparanoia on each disk, but with its error checking dialed back to a minimum because most errors don’t produce much audible damage:

d=01 ; cdparanoia -v -Y --never-skip=1 -B "1-" waves/D$d.wav ; eject cdrom

In some cases, however, a nasty gouge (the previous owners being careless, alas) can jam cdparanoia midway through a track, so I fetch all the remaining tracks:

d=10 ; cdparanoia -v -Y --never-skip=1 -B "6-" waves/D$d.wav

Sometimes re-cleaning the disc and re-reading the offending track produces a better outcome:

d=10 ; cdparanoia -v -Y --never-skip=1 -B "5-5" waves/D$d.wav

With all the WAV files collected, I now know how to unleash multiple lame conversions for all the tracks on each disc:

for d in {01..12} ; do for t in {01..19} ; do if [[ -f waves/track$t.D$d.wav ]] ; then lame --silent --preset tape --tt "D${d}:T${t}" --ta "$author" --tl "$title" --tn $t --tg "Audio Book" --add-id3v2 waves/track${t}.D${d}.wav D${d}-T${t}.mp3  & fi ; done ; wait ; done

The disc and track ranges correspond to notes written on paper while ripping the CDs, there being no automagic way to collect the information.

That may be easier to read with the control structures spread out:

for d in {01..12}
 do for t in {01..19}
  do if [[ -f waves/track$t.D$d.wav ]]
    lame --silent --preset tape --tt "D${d}:T${t}" --ta "$author" --tl "$title" --tn $t --tg "Audio Book" --add-id3v2 waves/track${t}.D${d}.wav D${d}-T${t}.mp3  &

Affixing an ampersand (&) to the lame command drops it into the background, where it runs as CPU time becomes available. The wait after the first loop stalls until all of the lame instances for each CD finish.

The kernel scheduler manages to keep the GUI responsive while a four-core CPU makes short work of the entire CD.

When it’s all done, transfer the MP3 files to the player:

cd ..
sudo mount -o uid=ed /dev/sde1 /mnt/part
rsync -vrtu --progress --exclude="waves" "$author - $title"  /mnt/part/Music
sudo umount /mnt/part

Fetching commands from history eliminates the need to remember all that, but now it’s written down where I can find it for the next desktop box.

Life is good!


Leave a comment

Money For Nothing: Bitcoin Blackmail

The spam filters on my email account snagged a message with an impressive subject:

Be sure to read this message! Your personal data is threatened!

The sender used my very own email address, sending the message from a server with a Mumbai IP address:

As you may have noticed, I sent you an email from your account.
This means that I have full access to your device.
I’ve been watching you for a few months now.
The fact is that you were infected with malware through an adult site that you visited.
If you are not familiar with this, I will explain.
Trojan Virus gives me full access and control over a computer or other device.
This means that I can see everything on your screen, turn on the camera and microphone, but you do not know about it.
I also have access to all your contacts and all your correspondence.
Why your antivirus did not detect malware?
Answer: My malware uses the driver, I update its signatures every 4 hours so that your antivirus is silent.
I made a video showing how you satisfy yourself in the left half of the screen, and in the right half you see the video that you watched.
With one click of the mouse, I can send this video to all your emails and contacts on social networks.
I can also post access to all your e-mail correspondence and messengers that you use.
If you want to prevent this, transfer the amount of $796 to my bitcoin address (if you do not know how to do this, write to Google: “Buy Bitcoin”).
My bitcoin address (BTC Wallet) is: 14tfS3 << redacted >> WH6Y
After receiving the payment, I will delete the video and you will never hear me again.
I give you 50 hours (more than 2 days) to pay.
I have a notice reading this letter, and the timer will work when you see this letter.
Filing a complaint somewhere does not make sense because this email cannot be tracked like my bitcoin address.
I do not make any mistakes.
If I find that you have shared this message with someone else, the video will be immediately distributed.
Best regards!

The threat uses Nigerian-scam grade English, evidently targeted at folks with both a guilty conscience and a tenuous grasp on how email works. I thought those same folks would have enormous difficulty converting dollars into Bitcoin.

However, feeding the wallet ID into a Block Explorer shows three transactions over the last two days, with the account now standing at 0.43069539 BTC = US$2269.44. I have no way of knowing how many emails went out, but obviously three people had sufficiently guilty consciences to (figure out how to) make a Bitcoin transaction.

I’m sure this has something to do with my recent IP camera adventures

Update: The ransom payments tapered off after five days.

Bitcoin Scam - Total
Bitcoin Scam – Total

I don’t know how many different scams came from the same source, but $6700 (at today’s market rate) says this campaign paid better than most legal occupations outside the fintech sector.


Seam Ripper Cover

The cover for Mary’s favorite seam ripper cracked long ago, has been repaired several times, and now needs a replacement:

Seam Ripper cover - overview
Seam Ripper cover – overview

The first pass (at the top) matched the interior and exterior shapes, but was entirely too rigid. Unlike the Clover seam ripper, the handle has too much taper for a thick-walled piece of plastic.

The flexy thinwall cover on the ripper comes from a model of the interior shape:

Seam Ripper Cover - handle model
Seam Ripper Cover – handle model

It’s not conspicuously tapered, but OpenSCAD’s perspective view makes the taper hard to see. The wedge on top helps the slicer bridge the opening; it’s not perfect, just close enough to work.

A similar model of the outer surface is one thread width wider on all sides, so subtracting the handle model from the interior produces a single-thread shell with a wedge-shaped interior invisible in this Slic3r preview:

Seam Ripper Cover - exterior - Slic3r preview
Seam Ripper Cover – exterior – Slic3r preview

The brim around the bottom improves platform griptivity. The rounded top (because pretty) precludes building it upside-down, but if you could tolerate a square-ish top, that’s the way to go.

Both models consist of hulls around eight strategically placed spheres, with the wedge on the top of the handle due to the intersection of the hull and a suitable cube. This view shows the situation without the hull:

Seam Ripper Cover - handle model - cube intersection
Seam Ripper Cover – handle model – cube intersection

The spheres overlap, with the top set barely distinguishable, to produce the proper taper. I measured the handle and cover’s wall thicknesses, then guesstimated the cover’s interior dimensions from its outer size.

The handle’s spheres have a radius matching its curvature. The cover’s spheres have a radius exactly one thread width larger, so the difference produces the one-thread-wide shell.

Came out pretty nicely, if I do say so myself: the cover seats fully with an easy push-on fit and stays firmly in place. Best of all, should it get lost (despite the retina-burn orange PETG plastic), I can make another with nearly zero effort.

The Basement Laboratory remains winter-cool, so I taped a paper shield over the platform as insulation from the fan cooling the PETG:

Seam Ripper Cover - platform insulation
Seam Ripper Cover – platform insulation

The shield goes on after the nozzle finishes the first layer. The masking tape adhesive turned into loathesome goo and required acetone to get it off the platform; fortunately, the borosilicate glass didn’t mind.

The OpenSCAD source code as a GitHub Gist:

, , , ,


“New” Phone Battery

Having an ancient flip phone in need of a battery, I ordered a Kyocera TXBAT10133 battery from eBay. Described as “new” (which, according to the Ebay listing, means “New: A brand-new, unused, unopened, undamaged item in its original packaging”), I was somewhat surprised to see this emerging from the box:

Kyocera TXBAT10133 - not really new
Kyocera TXBAT10133 – not really new

It obviously led a rather hard life before being harvested from somebody else’s obsolete flip phone and is definitely not “new”.

Not yet having a deep emotional attachment to the thing, I set it up for a capacity test:

Kyocera TXBAT10133 - contact clamp
Kyocera TXBAT10133 – contact clamp

Given a very light 100 mA load, it shows about the same capacity as the original battery in our phone:

Kyocera TXBAT10133 - 2019-03-29
Kyocera TXBAT10133 – 2019-03-29

Given the precarious contact arrangement, the glitches near the right end aren’t surprising.

The battery label claims a 900 mA·h rating, so both have nearly their nominal capacity at such a reduced load. In actual use, the phone has a low battery after a few hours of power-on time, far less than when it was new.

The seller promises a replacement. For all I know, there are no genuinely “new” batteries available for these phones.



Monthly Science: Weight

We’d been eating a “healthy” high-carb / low-fat diet, which produced the more-or-less expected 1 lb/yr weight gain over the course of three decades. Given that we eat about 106 Cal/yr, being off by a mere 0.3% seemed fixable, but we were always hungry while trying to cut out calories.

In April 2016, we decided our tummies had come between us, so we switched to a mostly ketogenic diet (clicky for more dots):

Weight Chart 2016 - Ed
Weight Chart 2016 – Ed

Having a Master Gardener in the family complicates dietary choices along the ketogenic axis, but Mary raised more green-and-leafy veggies, less squash-and-corn, and we keto-ized our meals reasonably well. Moderation in all things works fine for us, so losing 25 pounds at about 1 lb/week wasn’t particularly stressful.

Continuing through 2017, you can see how regular bike riding season affects winter bloat:

Weight Chart 2017 - Ed
Weight Chart 2017 – Ed

Our cycling vacation in July 2018 produced a blip, but the rest of the riding season worked as expected:

Weight Chart 2018 - Ed
Weight Chart 2018 – Ed

It’s straightforward to crash-diet two dozen pounds, but maintaining a more-or-less stable weight for the next two years suggests we’ve gotten the annual calorie count about right. FWIW, my bloodwork numbers sit in the Just Fine range, apart from the somewhat elevated cholesterol level typical of a keto-ized diet.

Starting in late 2018, however, a stressful situation of a non-bloggable nature (at least for a blog such as this) produced an unusually high number of road trips, motel stays, and generally poor dietary choices:

Weight Chart 2019-03 - Ed
Weight Chart 2019-03 – Ed

The situation now being over, our lives / exercise / diet will return to what passes for normal around here and my goal is to lose another 10% of my current body weight, ending at 150 pounds, by the end of the year. In round numbers, that requires losing half a pound = 1700 Cal/week, 250 Cal/day. Not power-noshing an ounce or two of nuts a day should do the trick.

If it makes you feel more science-y, you can use the NIH Body Weight Planner, but it produces about the same answer: knock off 300 Cal to lose weight, 250 Cal to maintain it, at essentially the same exercise level as before.

We’ve been recording our weights as dots on graph paper every Saturday evening for the last four decades, so I know for a fact I averaged 148 pounds when I wore a younger man’s clothes. I’ll re-post the 2019 chart, adding four dots every month, during the rest of the year.

This way, you can help keep me on track … [grin]


Poster Boilerplate: Whoopsie

Spotted this in a lobby (clicky for more dots):

Hannaford Reusable Bags - Poster Boilerplate
Hannaford Reusable Bags – Poster Boilerplate

I know no more than you do about the situation, but I’d lay long, long odds Hannaford created the poster with a more recent version of Microsoft Word (or whatever) than the recipient organization has available, making the file essentially read-only.

Not casting shade on ’em; sometimes, you do what you gotta do.

FWIW, I’d expect LibreOffice and any Microsoft Word version other than the exact one used to create the poster to mangle the formatting differently. Been there, done that.


Injured Arm Support Table: Wide Version

This table must sit across the threshold of a walk-in / sit-down shower, with the shower curtain draped across the table to keep the water inside.

Starting with another patio side table, as before, I installed a quartet of 5 mm stainless screws to lock the top panels in place and convert the table into a rigid assembly:

Arm Supports - wide table - overview
Arm Supports – wide table – overview

Because the shower floor is slightly higher than the bathroom floor, I conjured a set of foot pads to raise the outside legs:

Patio Side Table Feet - OpenSCAD model
Patio Side Table Feet – OpenSCAD model

The sloping top surface on the pads compensates for the angle on the end of the table legs:

Arm Supports - leg end angle
Arm Supports – leg end angle

I think the leg mold produces legs for several different tables, with the end angle being Close Enough™ for most purposes. Most likely, it’d wear flat in a matter of days on an actual patio.

Using good 3M outdoor-rated foam tape should eliminate the need for fiddly screw holes and more hardware:

Arm Supports - leg pads
Arm Supports – leg pads

The feet fit reasonably well:

Arm Supports - leg pad in place
Arm Supports – leg pad in place

They may need nonskid tape on those flat bottoms, but that’s in the nature of fine tuning.

And, as with the narrow table, it may need foam blocks to raise the top surface to arm level. Perhaps a pair of Yoga Blocks will come in handy for large adjustments.

The OpenSCAD source code as a GitHub Gist:


1 Comment