Ed Nisley's Blog: Shop notes, electronics, firmware, machinery, 3D printing, laser cuttery, and curiosities. Contents: 100% human thinking, 0% AI slop.
After I finish fiddling with the first camera, I’ll copy its card onto these four, unique-ify the IP addresses / hostnames /suchlike, and bring ’em all online.
Given a camera running Xiaomi Dafang Hacks software, you can set up motion-triggered image capture and save the images either locally or on an FTP server. The latter makes sense, as it automatically plunks the images where they’re more generally available.
Define the FTP server parameters in config/motion.conf:
The FTP server should have the Cam4 directory in place and shared for read-write access before attempting to plunk files therein. Ahem.
The camera’s Services menu leads to the motion configuration page:
Xiaomi Dafang – Motion Settings page
Limiting the detection region to the lower-left corner cuts out all the waving-in-the-breeze foliage in the yard, while covering the driveway. High sensitivity detects squirrel-sized objects in the foreground, although your mileage will certainly differ.
The camera seems rate-limited at 5 s/image, which may come from FTP transfer overhead; I don’t know if the code includes a built-in delay or if it just works like that. The NAS drive requires upwards of 7 s to spin up if it hasn’t been used for a while, but afterwards the transfers don’t take that long.
Mounting the NAS drive’s CIFS shared directory from my desktop PC works as before:
sudo mount -v -o rw,credentials=/root/.nas-id,vers=1.0,uid=ed -t cifs //192.168.1.10/Cam4 /mnt/part
Then view / edit / delete images as needed:
Xiaomi Dafang – IR motion capture – 15-04-2019_20.02.06
The camera has built-in IR LEDs, but they’re nowhere near powerful enough to illuminate the entire yard.
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:
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 ]]
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
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
sync
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.
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:
Hello! 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.
Update: The ransom payments tapered off after five days.
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.
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
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
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
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
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
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.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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
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
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
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.
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
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
Our cycling vacation in July 2018 produced a blip, but the rest of the riding season worked as expected:
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
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.