Trans Scend Survival

Trans: Latin prefix implying "across" or "Beyond", often used in gender nonconforming situations – Scend: Archaic word describing a strong "surge" or "wave", originating with 15th century english sailors – Survival: 15th century english compound word describing an existence only worth transcending.

  • This winter, I am excited to be teaching a new youth-oriented class at the Odessa Public Library- "TinkerCAD for Functional 3d Printing & Propmaking"! Sign up here:
    "Youth ages 8-18 will master the tools and skills required to design and print just about anything made of plastic, and will be confident in their ability to search for projects and models others have designed and print them at the Odessa Public Library."
  • I've been fairly distant for the last few months, but not for a lack of exciting projects! I've been sorta hyperfocused on the research and development of ultrasonically emulsified polyethylene polymers for an upcoming and very exciting material brand of my own.
  • Designed a small video light:
  • Created a overly complex rapid fab FOSH litterbox:

This and That!

updated on 5/23/22


  • Built out a lil web dashboard for DLA Makerspace- find the space's calendar, general information, technical documentation, printer livestreams for students and access the discord ticketing system-

  • I have been busy at the Ithaca Generator- building up our new website and writing new member mangegment & accounting software. I've taken over as IG's 3D Printer Area Captain too! 😸

Teaching a new class! Weekly Printer Party! Noise Night!
See a need, fill a need! An exciting new venture! Chemicals and experiments oh my!
Magic Fusion 360 for 3D Printing Class
  • Draw and print your mechanical daydreams! Watertight threads? Anneal-fit tolerances? Learn to design and print beautiful hardware and parts in this exciting workshop with Jess!
Weekly 3D Printer Party w/ Jess & whoppingpochard!

Tuesdays 5 - 8pm

Noise Night
  • Sunday nights 6pm to 8pm beginning March 20th ~~~ Come enjoy a low-key evening of casual jamming, music and noisy projects with Jess!

Some lil random printed projects:

Makerspace financial reporting w/ ipython

Visit this project on github here

  • Merge PayPal & Membershipworks members in a sorta intelligent way to create kinda accurate financial reports
  • Convert a PayPal transaction export into an upsert-able csv to import into membershipworks
  • Keep tabs on PayPal memberships as they become deprecated

(note, you'll need nbconvert, pandoc, TeX to write to pdf)

...If all goes well, the output will look something like:

loaded **** paypal records
loaded ** existing membershipworks records
converted Date column to datetime objects
kept *** records processed between 01/01/22 and 22/11/21; discarded **** records
discarded **'s Donation Payment record for **, continuing...
discarded **'s PreApproved Payment Bill User Payment record for **, continuing...
** ** already in member list! continuing...
discarded ** **'s Payment Refund record for -**.00, continuing...
discarded ** **'s Donation Payment record for **.00, continuing...
exported: ** Members!
 - ** Standard Members
 - ** Offline Standard Members
 - ** Extra Members
 - ** Offline Extra Members a membershipworks-readable format at ./csv/membershipworks_import.csv

This and that, bits and bobs…

Afternoon scribbles & prints:
...Continuing to fix Jess and Cloud's New York nest with PLA:
…Experimental microphone hardware for Merlin Sound ID:
YMMV, but YOLO: 3d printing @ IG repo and docs:
...A variety of improvements and updates to the chrome remote desktop automatic patching repo for Ubuntu Budgie

Continue reading

Bits & Bobs, Mushstools & Toadrooms

...Despite being a chilly & wintery March up here in the White Mountains, there is no shortage of fun birds and exciting projects!

Merlin AI pipeline for Mushroom identification!

It's happening, and it is going to be awesome YMMV, but YOLO:

Continue reading

Annotators, interpreters & audio demo stuff

...Notes, Repo

....Even more demos @

miscellaneous dregs, bits, bobs, demos in this playlist on youtube

Continue reading

Chindōgu ASCII art

A ridiculous Chindōgu utility prompt & CLI for fetching private releases & files from GitHub & BitBucket

  • Fetch, unpack, extract specific releases & files or a complete master branch from a private GitHub repo with an api access token
  • Fetch and extract specific files or complete branches from a private BitBucket account with user's git authentication
  • Prefill default prompt values with a variety of console flags
  • Save & load default prompt values with a file of environment variables, see templates FetchReleasegSampleEnv_GitHub, FetchFilegSampleEnv_BitBucket, FetchEverythingSampleEnv_BitBucket, FetchEverythingSampleEnv_GitHub; pass as an argument with the -e flag, (./LeafletSync -e YourEnvFile) or provide one on launch.
curl --output LeafletSync && chmod +x LeafletSync && ./LeafletSync

Continue reading

naive distance measurements with opencv

Knowing both the Field of View (FoV) of a camera's lens and the dimensions of the object we'd like to measure (Region of Interest, ROI) seems like more than enough to get a distance.

Note, opencv has an extensive suite of actual calibration tools and utilities here.

...But without calibration or much forethought, could rough measurements of known objects even be usable? Some notes from a math challenged individual:

# clone:
git clone && cd misc-roi-distance-notes

Most webcams don't really provide a Field of View much greater than ~50 degrees- this is the value of a MacBook Pro's webcam for instance. Here's the plan to get a Focal Length value from Field of View:

So, thinking along the lines of similar triangles:

  • Camera angle forms the angle between the hypotenuse side (one edge of the FoV angle) and the adjacent side
  • Dimension is the opposite side of the triangle we are using to measure with.
  • ^ This makes up the first of two "similar triangles"
  • Then, we start measuring: First, calculate the opposite ROI Dimension using the arbitrary Focal Length value we calculated from the first triangle- then, plug in the Actual ROI Dimensions.
  • Now the adjacent side of this ROI triangle should hopefully be length, in the the units of ROI's Actual Dimension.

source a fresh venv to fiddle from:

# venv:
python3 -m venv distance_venv
source distance_venv/bin/activate

# depends are imutils & opencv-contrib-python:
pip3 install -r requirements.txt

The opencv people provide a bunch of prebuilt Haar cascade models, so let's just snag one of them to experiment. Here's one to detect human faces, we've all got one of those:

mkdir haar
wget  -O ./haar/haarcascade_frontalface_alt2.xml

Of course, an actual thing with fixed dimensions would be better, like a stop sign!

Let's try to calculate the distance as the difference between an actual dimension of the object with a detected dimension- here's the plan:


# `python3`
import math
from cv2 import cv2

DFOV_DEGREES = 50  # such as average laptop webcam horizontal field of view
KNOWN_ROI_MM = 240  # say, height of a human head  

# image source:
cap = cv2.VideoCapture(0)

# detector:
cascade = cv2.CascadeClassifier('./haar/haarcascade_frontalface_alt2.xml')

while True:

    # Capture & resize a single image:
    _, image =
    image = cv2.resize(image, (0, 0), fx=.7, fy=0.7, interpolation=cv2.INTER_NEAREST)

    # Convert to greyscale while processing:
    gray_conv = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
    gray = cv2.GaussianBlur(gray_conv, (7, 7), 0)

    # get image dimensions:
    gray_width = gray.shape[1]
    gray_height = gray.shape[0]

    focal_value = (gray_height / 2) / math.tan(math.radians(DFOV_DEGREES / 2))

    # run detector:
    result = cascade.detectMultiScale(gray)

    for x, y, h, w in result:

        dist = KNOWN_ROI_MM * focal_value / h
        dist_in = dist / 25.4

        # update display:
        cv2.rectangle(image, (x, y), (x + w, y + h), (255, 0, 0), 2)
        cv2.putText(image, 'Distance:' + str(round(dist_in)) + ' Inches',
                    (5, 100), cv2.FONT_HERSHEY_SIMPLEX, 1, (255, 255, 255), 2)
        cv2.imshow('face detection', image)

        if cv2.waitKey(1) == ord('q'):

run demo with:



« Older posts