Ben's Blog

Category: I.T.

202 Articles
I.T., maniacal paranoia ben June 11, 2025

Attention Sniffing Events

I get disproportionally upset with websites playing videos which pause when you background their browser tab. I don’t understand why browsers respect the focus and blur event at the window level, clearly they only benefit nefarious purposes seeking to milk a poor soul. Either by forcing them to watch content, or by building a better model of their attention behavior. Attention which we all know is a currency to be extracted on the internet.

A while back I added a Tampermonkey script to catch the registration of these events, and invalidate it. Out of curiosity, I added reporting to it these past 10 days. I was curious to know how prevalent the practice was.

Out of 140 domains visited these past 10 days, 28 cared to know whether my eyeballs were pointed at them or not. 8 were in the constellation of Google.

Now of course, I don’t use social media, I have pretty established work routines, and 2 layers of ad blocking. I suspect both the numbers of domains visited, and the number domains interested in my eyeballs would be significantly higher if I disabled ad blocking. But do I really want to subject myself to 10 days of ads? No, I really don’t, not even for science.

3D modeling / printing, electronics, I.T., plots, plotters ben June 07, 2025

SketchyBot 1.0

I finally built a standard sized one. I ran into a few unexpected challenges given how smooth the small one went.

It really isn’t the most accurate machine, the belts inside aren’t timed, but it does pretty ok with some rendering algorithm and is fun.

I.T., miscellaneous, plotters ben May 07, 2025

X,Y Coordinates Redux

As is now tradition, I taught my session on X,Y coordinates to local 5th graders.

As before, the collaborative drawing website I made worked wonder for getting them to time-share on the drawing machines. Each of them picks a square and works on it, I disable actual drawing for the class and they can only “code” with go_to(x,y) type commands. When they submit their drawing, the machines get to work. Kids absolutely love the idea of controlling the machines, and having that bit of time to shine as their drawing is being rendered. They are all extremely motivated to figure out the minutia of the code to these effects.

It looks like I bring a new machine every other year, we started with the tabletop plotter, then I added the gondola one, and of course this year it was lasers!

The kids really loved it as I suspected they would. I have learned that light management is a bit of an issue in the classroom when it needs to be dark but not too dark. Something to improve for next year.

It was a good crowd this year and I’ve been tempted to see if I could do something extra having some of them build the etch-a-sketch plotter.

maniacal paranoia ben May 06, 2025

More Private

I’ve struggled more and more with the idea of posting things on the internet as of late. I’ve kept a reasonably high bar on personal stuff (thank you gifs for your terrible quality), but the reality is that it’s not high enough. Beyond privacy, I’m questioning why even toss nicely curated & authentic pieces of information into the sewer, I enjoy doing so less and less. Algorithms seem to gain new exploitative dimensions every few years, making everything you posted before a retroactive liability. The advent of AI clearly is one such evolution. Where social media fed off our attention, the fuel for AI is authenticity. Just as I absconded from social media early on when its extractive nature became clear, I seek to avoid fueling models, nor do I want them used against my family.

I don’t think I want fractions of our lives to be digested and regurgitated, this is especially true as my kids are getting older. I do realize the same was said about nascent photography, and I know it’s a funny thing for me to criticize generative models given my work with markov chains. That is how I feel nonetheless, and don’t get me wrong I love AI, just with someone else’s data in it :).

This blog has definitely turned into a bit of a personal journal over the years, and I don’t want to lose this as I often refer back to it. But in reality, there’s a lot I refrain from journaling here because it’s too public, and now more than ever it also feels dirty for a myriad of reasons all stemming from the current state of the internet.

I’m in a pickle, how does one filter for reasonable humans? Well, on this imperfect internet, the least bad solution I can find is to password protect some posts. And so I’ll do this from now on, and I’ll have to be better at segregating personal content from what is meant for public consumption. It’s unfortunate really, the projects I work on are deeply intertwined with our life, and will be more dry separated from it.

If you’re a reasonable human and you know me, the password when used is where I worked from 2003 to 2004.

aesthetics, all out geekery, electronics, plots, plotters ben April 10, 2025

Laser Portraits

I had a chance to run 2 Pewtybots at a public event where people could have their picture taken to be turned into line art to be rendered by lasers. I should have taken better pictures and videos, but I was too busy manning the station and talking to people. It’s unfortunate because it’s hard to convey the experience with words.

Ever since the first successful prototype, I kind of knew I wanted to do something for this event. And so I built 2 machines, refined the software, the math… well maybe that’ll be another post… I’m not sure I have it right just yet, I might. I have it right enough at least, let’s just say I refined the math. Finally, I spent time developing and practicing a pipeline where I can take someone’s picture and send it to either Pewtybot happens to be idle.

Esther helped man the station so we practiced at home with all her toys pretending to be the various personalities she’d encounter at such an event. From the overly curious bear to the llama in a hurry. And so the pipeline is as such: first we take your picture. A monitor is facing you to see what it is.

Then we turn that into lines to be drawn (or lasered in this case). This is supposed to be a first taste of eye candy as these algorithms are cool to see at work.

Then you go in a dark room, and see it all get zapped on the wall (I don’t have a picture of the lasered dog plush).

Because this was a first on many fronts, I was pretty anxious some things would go wrong (they did). I also didn’t know how to present it, or how people would react. So the first couple of “customers” helped me figure out how to guide them through the pipeline. And when the time comes to go in the dark room, I purposefully kind of dump people in there and vaguely tell them to wait for the wall to light up. I have the laser write their name and count down from 3 to 1, and then the laser moves much faster through their portrait.

Nicole quickly realized adding chairs in the dark room would invite people to take in the experience more. And I realized I was silly to tune my setting for single portraits, I almost exclusively had families and groups of friends in the same picture. The reactions were great, although I didn’t get any from inside the room, people coming out were full of questions and kids were smiling. As always with my silly projects, there’s also a smaller fraction of people with whom they resonate more deeply.

Overall it was a big success and pretty smooth for a first. I want to do more for sure. There’s something fireworksy about when the laser really starts moving and light shows up everywhere.

plots, plotters ben March 30, 2025

Eink, Plots & Luxembourg

I’ve been revamping and refactoring the software stack for plotty… pewty… gondola plotty… etchy? bot. Everytime a new riff on drawing machines came up, I’d grab the last code I worked on and tailored it for the new endeavor, often adding generalizable improvements along the way, but never taking the time to refactor previous work.

I always try to be helpful when people reach out on this blog about something they need/want/would like, but I have limited time and I’ve learned to filter a bit and not let other people’s projects take too much of my time. Last December though, the folks from Code Club Luxembourg got in touch with a few questions, and I gave them the usual “helpful but not too much” filter. Except they went on to build 5 PlottyBots, a whole integration with Scratch, and now use it to teach coding. Music to my ears, and clearly they meant business. And so we hopped on a call to exchange ideas.

Clearly the software could use consistency and so I started thinking holistically with the laser code. Each machine has slightly different motor control, but it’s now evident which software pieces are consistent across implementations. Ideally, I’d like the same software stack no matter which machine you happen to be running on. So I refactored back to the gondola plotter, and finally the tabletop one. It’s still not finished but it’s definitely better and more consistent.

To test new software on the original PlottyBot, I ran it on my reMarkable tablet.

I’m not going to do a whole post dedicated to its merits, I’m allergic to promotional content, but I will say a quick few things on this unrelated post. I’ve been interested in Eink for the longest time but never found a compelling device I felt was more than a temporary gimmick. Even getting a pricy reMarkable was a bit of an experiment that could land in a closet gathering dust. But I did want to experiment with quieter and purpose targeted devices so I went on with it after more than a decade of seeing various Eink devices go by. I haven’t adopted it for everything I want to yet, it takes time to change long established work habits, but I will say that it absolutely NAILS writing. It nails it so hard it changed the way I problem solve to an earlier saner process. It might be a generational thing, but writing is key to information absorption and processing for me. The problem with paper is that I have pieces flying everywhere, and mistakes make for an unclean train of thought committed to paper which is frustrating to engage with further. With Eink writing, you get an infinite canvas, and the ability to massage thoughts into a perfect form, one ripe for implementation. I have found that I will pick this device with a sense of relief as it means I’m about to engage in uninterrupted deep thinking. I find many signs that it was carefully designed to be such a device and not your next fancy tech gizmo, and I absolutely love it for this. Hopping on a computer on the other hand does not yield a sense of relief, but rather stressed anticipation at the onslaught of mechanisms devised to get in the way of what I was trying to do. Of course, I can’t do as much on the reMarkable, but I’m curious more than ever to shift to it whatever I can.

Perfection is achieved, not when there is nothing more to add, but when there is nothing left to take away.

Antoine de Saint-Exupéry
3D modeling / printing, electronics, I.T., plotters ben March 22, 2025

PewtyBot 1.0 x2

I built another one, it’s always been useful to have 2 of my drawing machines.

electronics, homestead automation, I.T., maple syrup, self sustainability ben March 15, 2025

Evaporator Regulator

This isn’t the most involved project but I might as well document it. I’ve been trying to automate some of the more boring tasks of running the evaporator, I’ve got some nice stainless steel float valves to regulate the sap going in now for example. One of the things that kept requiring constant attention is the air intake to adjust the strength of the fire. I’d have to sit with a foot on it to be able to regulate it almost constantly, to make sure the fire wasn’t burning too hard or too weak. And so naturally I thought I could do something with a Pi.

This proved quite successful even with very loose wiring and fastening just to see how it would work.

All of a sudden I barely need to pay attention to the fire’s strength, with a few refinements I won’t have to at all.

The circuit is quite simple:

Wifi barely reaches the sugarhouse so I made sure this could run independent of connectivity. Which involves coding threads on a Pi Pico, which is supported but not as one would expect.

import machine
import time
import network
import socket
from max6675 import MAX6675
import _thread
    

html = """{\"evaporator_temperature\":<TEMPERATURE>}"""

# LED
led = machine.Pin( "LED", machine.Pin.OUT )

# temperature
sck = machine.Pin( 2, machine.Pin.OUT )
cs = machine.Pin( 3, machine.Pin.OUT )
so = machine.Pin( 4, machine.Pin.IN )
sensor = MAX6675( sck, cs , so )
temperature_min = 25
temperature_max = 30
temperature = -1337.0

# servo
servo = machine.PWM( machine.Pin(0) )
servo.freq( 50 )
servo_min = 1000
servo_max = 8000
servo_at = 0


def temp_to_servo( temp ):
    if (temperature_max - temperature_min)==0:
        # right in the middle
        return int( (servo_max-servo_min)/2 )
    result = (temp - temperature_min) * (servo_max - servo_min) / (temperature_max - temperature_min) + servo_min
    if result>servo_max:
        result = servo_max
    if result<servo_min:
        result = servo_min
    return int( result )


def blink_number( number ):
    number = str( int(number) )
    for char in number:
        for i in range(int(char)):
            led.value( 1 )
            time.sleep( 0.2 )
            led.value( 0 )
            time.sleep( 0.2 )
        time.sleep( 0.3 )
        led.value( 1 )
        time.sleep( 0.1 )
        led.value( 0 )
        time.sleep( 0.3 )
            


keep_going = False
def servo_thread():
    global temperature, servo_at, servo
    
    while keep_going:
        time.sleep( 5 )
        print( "# measuring average temperature over 1 seconds..." )
        temperature_total = 0.0
        for i in range(10):
            temperature_total += sensor.read()
            time.sleep( 0.1 )
        temperature = temperature_total / 10
        blink_number( temperature )
        print( "# " + str(temperature) )
        new_servo_position = temp_to_servo( temperature )
        print( "# new_servo_position: " + str(new_servo_position) )
        step = 1
        if new_servo_position<servo_at:
            step = -1
        for i in range(servo_at, new_servo_position, step):
            time.sleep( 0.001 )
            servo_at = i
            servo.duty_u16( i )
    print( "# servo tread finishing" )

# main thread
servo.duty_u16( servo_min )
for i in range(servo_min, servo_max):
    time.sleep( 0.001 )
    servo_at = i
    servo.duty_u16( i )

try:
    ssid = "<wifi_ssid>"
    password = "<wifi_password>"
    wlan = network.WLAN( network.STA_IF )
    wlan.active( True )
    wlan.connect( ssid, password )

    # wait for connect or fail
    max_wait = 20
    while max_wait>0:
        if wlan.status() < 0 or wlan.status() >= 3:
            break
        max_wait -= 1
        print( "> waiting for connection..." )
        time.sleep( 1 )

    # handle connection error
    if wlan.status()!=3:
        print( "> network connection failed, will launch servo thread in 1 minute" )
        time.sleep( 60 )
        print( "> launching" )
        keep_going = True
        _thread.start_new_thread(servo_thread, ())
        while True:
            time.sleep( 1 )
    else:
        print( "> connected" )
        status = wlan.ifconfig()
        print( "ip = " + status[0] )

        # open socket
        addr = socket.getaddrinfo( "0.0.0.0", 80)[0][-1]
        s = socket.socket()
        s.setsockopt( socket.SOL_SOCKET, socket.SO_REUSEADDR, 1 )
        #s.settimeout(1)
        s.bind( addr )
        s.listen( 1 )
        print( "> web server listening on", addr )

        # listen for connections
        while True:
            print( ">" )
            try:
                cl, addr = s.accept()
                print( "client connected from", addr)

                request = cl.recv( 1024 )
               
                request = request.decode( "utf-8" ).strip()
                print( request )

                if request.startswith( "GET / " ):
                    print( "get data" )
                    response = html.replace( "<TEMPERATURE>", str(temperature) )
                    cl.send( "HTTP/1.0 200 OK\r\nContent-type: application/json\r\n\r\n" )
                    cl.send( response )
                elif request.startswith( "GET /min_temperature " ):
                     print( "get min_temperature" )
                     cl.send( "HTTP/1.0 200 OK\r\nContent-type: application/json\r\n\r\n" )
                     cl.send( str(temperature_min) )
                elif request.startswith( "GET /max_temperature " ):
                     print( "get max_temperature" )
                     cl.send( "HTTP/1.0 200 OK\r\nContent-type: application/json\r\n\r\n" )
                     cl.send( str(temperature_max) )
                elif request.startswith( "PUT /min_temperature " ):
                    print( "put min_temperature" )
                    new_min_temperature = int(request.split( "\r\n\r\n" )[1])
                    print( new_min_temperature )
                    temperature_min = new_min_temperature
                    cl.send( "HTTP/1.0 200 OK\r\nContent-type: application/json\r\n\r\n" )
                    cl.send( "\"ok\"" )
                elif request.startswith( "PUT /max_temperature " ):
                    print( "put max_temperature" )
                    new_max_temperature = int(request.split( "\r\n\r\n" )[1])
                    print( new_max_temperature )
                    temperature_max = new_max_temperature
                    cl.send( "HTTP/1.0 200 OK\r\nContent-type: application/json\r\n\r\n" )
                    cl.send( "\"ok\"" )
                elif request.startswith( "PUT /start " ):
                    print( "put start" )
                    cl.send( "HTTP/1.0 200 OK\r\nContent-type: application/json\r\n\r\n" )
                    if keep_going:
                        print( "  already started" )
                        cl.send( "\"already started\"" )
                    else:
                        keep_going = True
                        _thread.start_new_thread(servo_thread, ())
                        cl.send( "\"started\"" )
                        for i in range(5000, 6000):
                            time.sleep( 0.001 )
                            servo_at = i
                            servo.duty_u16( i )
                elif request.startswith( "PUT /stop " ):
                    print( "put stop" )
                    #cl.send( "HTTP/1.0 501 OK\r\nContent-type: application/json\r\n\r\n" )
                    #cl.send( "\"not implemented\"" )
                    # crash on stop, thread support is that bad
                    cl.send( "HTTP/1.0 200 OK\r\nContent-type: application/json\r\n\r\n" )
                    if keep_going:
                        keep_going = False
                        cl.send( "\"stopped\"" )
                    else:
                        print( "  already stopped" )
                        cl.send( "\"already stopped\"" )

                cl.close()
         
            except OSError as e:
                cl.close()
                print( "> connection closed" )
                keep_going = False
                time.sleep( 2 )
    

except KeyboardInterrupt:
    print( "> ctrl+c, wrapping up..." )
    keep_going = False
    time.sleep( 10 )
except Exception as e:
    print( e )
    print( "> unexpected exception, wrapping up..." )
    keep_going = False
    time.sleep( 10 )

import time
class MAX6675:
    MEASUREMENT_PERIOD_MS = 220

    def __init__(self, sck, cs, so):
        """
        Creates new object for controlling MAX6675
        :param sck: SCK (clock) pin, must be configured as Pin.OUT
        :param cs: CS (select) pin, must be configured as Pin.OUT
        :param so: SO (data) pin, must be configured as Pin.IN
        """
        # Thermocouple
        self._sck = sck
        self._sck.low()

        self._cs = cs
        self._cs.high()

        self._so = so
        self._so.low()

        self._last_measurement_start = 0
        self._last_read_temp = 0
        self._error = 0

    def _cycle_sck(self):
        self._sck.high()
        time.sleep_us(1)
        self._sck.low()
        time.sleep_us(1)

    def refresh(self):
        """
        Start a new measurement.
        """
        self._cs.low()
        time.sleep_us(10)
        self._cs.high()
        self._last_measurement_start = time.ticks_ms()

    def ready(self):
        """
        Signals if measurement is finished.
        :return: True if measurement is ready for reading.
        """
        return time.ticks_ms() - self._last_measurement_start > MAX6675.MEASUREMENT_PERIOD_MS

    def error(self):
        """
        Returns error bit of last reading. If this bit is set (=1), there's problem with the
        thermocouple - it can be damaged or loosely connected
        :return: Error bit value
        """
        return self._error

    def read(self):
        """
        Reads last measurement and starts a new one. If new measurement is not ready yet, returns last value.
        Note: The last measurement can be quite old (e.g. since last call to `read`).
        To refresh measurement, call `refresh` and wait for `ready` to become True before reading.
        :return: Measured temperature
        """
        # Check if new reading is available
        if self.ready():
            # Bring CS pin low to start protocol for reading result of
            # the conversion process. Forcing the pin down outputs
            # first (dummy) sign bit 15.
            self._cs.low()
            time.sleep_us(10)

            # Read temperature bits 14-3 from MAX6675.
            value = 0
            for i in range(12):
                # SCK should resemble clock signal and new SO value
                # is presented at falling edge
                self._cycle_sck()
                value += self._so.value() << (11 - i)

            # Read the TC Input pin to check if the input is open
            self._cycle_sck()
            self._error = self._so.value()

            # Read the last two bits to complete protocol
            for i in range(2):
                self._cycle_sck()

            # Finish protocol and start new measurement
            self._cs.high()
            self._last_measurement_start = time.ticks_ms()

            self._last_read_temp = value * 0.25

        return self._last_read_temp

Web requests collection.

3D modeling / printing, electronics, I.T., plotters ben March 11, 2025

PewtyBot 1.0

I’ve used this project as a stepping stone and modified it some. I can’t say enough good things about it, it propelled development forward significantly and I found it to be expertly designed. Too bad the project it now defunct. I had to find assembly documentation on archive.org.

I’m not sure I’ll document it as well as I have the tabletop plotter or the gondola one. At least not yet, maybe that’ll be a Christmas project like the other 2. I did port the same software stack, it would be a shame not to given the years of feature development that went into it. Of course we should use these features with lasers. It might also change drastically, I want to investigate what rotating mirrors could do for speed. Currently some of the moving parts of the machine have enough mass that their inertia causes inaccuracies when moving at high speed.

It’s nice to have things tidied up, the development machine was a mess.

aesthetics, electronics, I.T., plotters ben February 03, 2025

Laser Pew Pew

I have yet to crack the math, I’ve been banging my head against the wall with various implementations but this is a lot worse than the Gondola’s double polar system. I’d like the laser to be able to project a cartesian system in any position relative to the surface it’s drawing on. Alas, I’ve only been able to get decent results in ideal positions.

electronics, I.T., plotters ben January 26, 2025

For Posterity

The first successful prototype of PewtyBot.

Philip from Germany got in touch to tell me about a cool project he had seen that involved photoluminescent paper. He thought maybe PlottyBot could so something with it, and maybe it could, but not fast enough I thought. I knew exactly what I wanted to do with it though, with the PlottyBot software stack, but a different machine. I love that people get in touch to show me cool things. I’ve been working on plotters for years now, and in some sense it felt like I had turned every stone. Out of nowhere Philip got in touch and steered me toward a whole new area of exploration. Of course one can buy glow-in-the-dark paper, of course I can shoot lasers at it, of course all the algorithms I’ve been working on these past years lend themselves to this new endeavor. Well, with some tweaking :).

It was a real struggle to get Trinamic drivers working on a Pi, but I wanted to step up my motor stepping game. Once I figured it out, holy shit do they work! There’s much else to talk about here, but this isn’t the point of this post, I just want to capture the miletone that is shooting lasers super fast at photoluminescent paper. I still haven’t wrapped my mind around what this all means.

plots, plotters ben December 05, 2024

No Pen up/down, No Precision

Still totally fun and I want a big one.

miscellaneous, plotters ben December 02, 2024

As is Tradition

Thanksgiving handwriting capture.

It’s pretty cool that Esther learned writing just as this project came online so I could capture her progress from the beginning. For comparison purposes, this doesn’t show lowercase letters, special characters, or cursive that she recently acquired.

electronics, I.T., plotters ben December 01, 2024

PlottyBot Port

I stumbled upon electronically actuated Etch-a-Sketches, and I pretty much had to see if I could port the PlottyBot stack to the toy. It was pretty straightforward. I got the parts from someone else on Thingiverse for a smaller Etch-a-Sketch and the fit isn’t great, but it’s enough of a proof of concept to know I want to make a nice big one, and really the work is all mechanical at this point. How about a web enabled Etch-a-Sketch that can write in your handwriting?

I.T., maniacal paranoia ben November 01, 2024

Disabling Cell Connectivity on an F150

I’ll do my best not to rant here, I got a new car, of course it’s connected, of course it defaults to sharing your location and everything else with Ford and its dumb affiliates, of course I diligently went through all the settings off the lot to disable all the data sharing, of course these settings found themselves back to enabled magically after a few days. And now Ford knows where I live, work, shop, eat, and everything in between. ~16 years ago society still cared about privacy, but multiple “scandals” quickly showed corporations there were no real repercussions legally or reputationally for privacy abuses. Since then it’s been a free for all, and a new generation of people has assimilated these practices as a norm. Let’s beat the piñatas for all they’ve got!

I’ve been trying to disable the cell modem in this car. Even if the car had a no-tricks UI for privacy settings (it doesn’t), I don’t trust software to truly report nothing back to the mothership. And so for definitive results, I want to pull the plug. Today I can, tomorrow, I’m sure cars will absolutely require a fresh slice of your private life before they deign take you anywhere.

Take a look at your car’s manual to find the fuse box and a mapping of what they control. In my case the box is by the passenger side’s right foot. It’s work to move the panels it’s behind out of the way. The manual points to a likely candidate:

Yup, sounds like the sort of shit I want to nuke

So I removed it and hoped for the best.

Next thing you know, gone is all the worthless bullshit Ford reimplemented worse than Apple so they too could suck up your data.

It brings me pleasure to see incapacitated corporate malpractice, but I know things will only get harder with time. At least I got me a 10 year respite.

I.T., maniacal paranoia ben October 11, 2024

Fake Time in Docker

What if you need a container to have a different time than its host? Well, LD_PRELOAD has a solution for you. While this solution generally works outside of Docker, I rarely find myself outside of a container these days. I like that it works in one without requiring special privileges.

Dockerfile:

FROM ubuntu:latest

RUN apt-get update --fix-missing
RUN DEBIAN_FRONTEND=noninteractive apt-get install git build-essential -y
RUN git clone https://github.com/wolfcw/libfaketime.git
WORKDIR /libfaketime/src
RUN make install
RUN echo "/usr/local/lib/faketime/libfaketime.so.1" > /etc/ld.so.preload

ENTRYPOINT bash

Build with:

docker build -t faketime .

Run with:

docker run -ti --rm -e FAKETIME="1970-01-01 00:00:00" --name faketime faketime

Of course you can run the “date” command to confirm, but this fake time percolates to all processes in the container. I was reminded of the existence of LD_PRELOAD to hijack system calls recently, and remembered this old trick I had stashed in my notes.

And just in case it goes away, I mirrored the excellent repo this is based on here.

web games ben September 07, 2024

Oldie but Goodie

Since I figured out how to emulate old Dos games to host Capture the Flag using JSDos, I might as well spread further other games which left an impression in their time. I don’t mean to compete with the highly curated abandonware sites out there, I just want to reduce the chances for attrition by hosting another copy, and I like having these gems at my fingertips too.

Introducing MadTV, an addictive game where one runs programming for a TV channel. The issue? You’re also trying to “get the girl”, and she only likes utterly boring documentaries which aren’t good for ratings.

Click to pop out

all out geekery, I.T., maniacal paranoia ben August 09, 2024

Flipper Zero

I finally got my hands on a Flipper Zero and boy oh boy, let me tell you, I should have done this a long time ago. I got it for my own interests because I was curious to understand some protocols better. To my surprise, both kids have been way into it. I’m of course elated to titillate their hacker spirit. I didn’t even think it possible with a 7 year old, but the cross between ease of use, and yes… a Tamagochi is really hitting home. Esther’s mind was blown when she scanned and replayed the IR signals of a toy of hers.

Robin & I are trying to sniff and replay all kinds of signals which always leads to a deeper understanding of technology for the both of us.

I too I’m in love the with the fun packaging and the geek humor. There isn’t anything revolutionary about the capabilities, but they way lowered the bar of entry. Most of all, it’s built with a spirit that strongly appeals to my original love of computers. This little wonder sparks curiosity and discovery everywhere it goes.

plotters ben June 22, 2024

Experimenting with Larger Ink Reservoirs

When I plot stuff that goes beyond a pen’s ink capacity, it’s a pain to swap pens. It’s a constant worry and the operation has the potential for ruining a plot. So I’m experimenting with ways to have enough ink on board, or maybe refill. Of course I’m learning that pens are designed within tight tolerances of pressure & viscosity.

I think this one is going to work. I made the reservoir’s volume 5 times that of an unaltered Precise v5 pen.

I always make an ink mess with each experimentation. I’ve learned that PLA printing is not liquid tight. And so thank you Nathan for the resin printing :). One other silly lesson I’ve learned is that various paper can suck up ink at different rates.

plotters, web development ben May 17, 2024

X,Y Coordinates

Some of the tools I’ve accumulated over the years lend themselves particularly well for teaching. I’ve gotten better at swooping in a classroom with some plotters and talking about math or machine drawing topics. I can make it very interactive.

One tool in particular is https://draw.mandalagaba.com.

It started not so much for teaching, but rather for collaborative art. Very much inspired by r/Place, I created a tool with real estate scarcity, but with my usual focus on drawing. The kicker would be that the art is rendered live on a plotter somewhere in the world, maybe in front of you in a public place, maybe a video stream and you know your pen strokes are executed by a machine thousands of miles away. You claim a square, coordinate with others to make bigger pieces, and a collaborative art piece is born. That was the idea at least. I’ve tried several permutations of this experiment, in public, on a stream, with various rules and online communities, and it simply never generated the enthusiasm I thought it would. I have 95% given up on the idea of a collaborative art piece of the sort. The big plotter still has me wondering hence the remaining 5%, but it is tedious and expensive to deploy for an experiment that has shown no promise at every iteration.

What this website became great for however is teaching as it allows for time sharing a drawing machine across several students. We can explore one concept or other, and then apply it and have the great motivator that we’ll get to control the machine by doing so. 3 years ago I taught a module on X,Y coordinates with the local 5th graders, I didn’t have this site then and it went fine. But the following year I figured I might as well use this dumb collaborative art website I made for something so I integrated it into the coursework. Now that second year The machine’s made an enormous difference in how students engage. Recently I ran this course for the 3rd year with the website and the magic happened again. Both times, kids were very much willing to go through teeth grinding (light X,Y coordinate based coding), and help each other out to see their work realized in the world by a cool machine. The first student that submits a drawing on the site inevitably has everyone jumping off their seat to see the machine move up close. Then they’re even more motivated to do it themselves. I help them with the mistakes they make at first, and once they get it I have a good half an hour of walking around and seeing the cool stuff they draw. During this time I might send one drawing machine on a more intricate plot that can finish quick. Having that plotter wield a pen expertly inevitably draws 2 or 3 kids who just sit and stare at the machine non-stop. I know what they’re going through. The whole experience has them asking so many questions, and I love interacting with the different ways in which they see the world. I also love the opportunity to get to know every kid in town a little better when they go through 5th grade.

I’m quite glad that these tools found a place in education. Sometimes I think of pushing further, there’s definitely something to this formula, and I know teachers often purchase various curricula or interventions that meet a standard or other. But I can’t push all the projects, and so far I’ve refused to let money taint anything plotter related.

Funnily enough, I even had an opportunity to guest lecture in the same way with college art students. Of course we don’t talk about 5th grade X,Y coordinates, and I’m not there to talk about art either. Rather we learn and employ tools and techniques for line art and single instrument machines. It’s only funny because I’m ashamed to admit I’ve been very dismissive of art (except music) my whole life. I never understood it and wasn’t a fan of the carefree personalities gravitating to it. I’ve seen the light now, and I do feel apologetic for the times someone showed me a something they had made and it went completely above my head. But I can’t say I was particularly impressed by the students. I’m definitely curious to try again and see if I can bridge more understanding. In the meantime, I have no issues resonating with 5th graders so I’ve got that going for me :). Except for keeping them focused, that is insanely hard.

I.T., maniacal paranoia, web development ben May 07, 2024

Focus & Blur: Behavioral Inference & the Tattletale Browser

This web thing’s been bugging me for too long. Have you ever tried to background a tab that is playing insufferable & unskippable content, only to find out that the annoyance has paused itself until your eyeballs are known be aimed back at it? Why do browsers honor requests to let websites know if you’re paying attention or not?

This is achieved by relying on the focus and blur events. But there are many UI Elements that rely on them to trigger useful UI responses. Think of a suggestion box that shows up when you click in a search bar for example. The window element though, is one for which I cannot think of a single instance where the focus and blur events at are used to benefit the user. I think a well intended couple of events were generally implemented to every possible elements, but one of them reveals more than was intended and is abused to that effect. Why would ad-blocker not nuke them either? I’ve gone through this rabbit hole several times over the years trying to find an extension or adblocker customization to dismiss these events. Alas, they never seem to have made it into the crosshair as the true annoyance that they are. How do you like to have your browser report how good you are at consuming content as intended?

These events are responsible for more ills than making sure you’re watching, they are a key metric for inferring behavior. As with much of data mining, what’s scary isn’t really the information you’re giving away, it’s what can be inferred from it. In a way these attention events are perfectly suited for the attention age. Particularly though, they matter when they are attached to the window element. As far as I know, that is the only method I’ve seen in the wild that is abused into this purpose.

In any case, since I never could find anything, here’s what I came up with. The best way I found to run user JS on all websites is using Tampermonkey. Then here’s the script I’m running:

// ==UserScript==
// @name         Attention Event Nuker
// @namespace    http://tampermonkey.net/
// @version      2024-05-01
// @description  nukes focus and blur events when attached to the window element
// ==/UserScript==

(function() {
    var old_add_event_listener = EventTarget.prototype.addEventListener ;

    EventTarget.prototype.addEventListener = function(event_name, event_handler) {
        if( this.toString()==window.toString() &&
           (event_name=="blur" || event_name=="focus") ) {
            console.log( "attention event caught: " + event_name + " on: " + window.location.host ) ;
        } else {
            old_add_event_listener.call( this, event_name, event_handler ) ;
        }
    };
})();

Unfortunately I did run into a couple of sites that somehow rely on the events to even work properly. I don’t think I want to reverse engineer them 1 by 1 so I’m adopting a blacklist of sites which is a bit obnoxious. For a while I did have the script report which sites were asking for the events, the results weren’t surprising and showed that pretty much any big site with a baseline of behavioral data mining wants to know what your eyeballs are in front of.

I.T. ben March 13, 2024

Pi-hole

I don’t know why I didn’t deploy this before, but this is another case where Docker lowers the bar of entry and makes running this less of an ordeal.

10% of internet traffic at home is ads & trackers (well 10% of DNS queries but let’s not split hair).

This number is obviously higher in reality considering all the ads and trackers which DNS alone can’t tackle. Ublock Origin is still really busy after all.

There are 2 main drivers of these 10%. Unsurprisingly a 13 year old’s windows machine, he just wants to game but gaming now means being online and bundling in greedy vectors to your eyeballs. The other unsurprising culprit is an iPhone tied to social media. Without these 2 devices, we hover around 2% with 10+ various connected devices. With them we immediately jump to 10% of all home internet traffic being ads.

The real beauty of Pi-hole, is in being able to neuter various household “smart” devices. The printer which calls home and requires extra buttons presses to annoy us into a firmware update we don’t want. Screw you Epson. The connected TV which should have never been connected but the kids wanted Netflix, and oh surprise ads are now everywhere. Screw you Roku. Both are gone now. Pi-hole makes it very easy to see what clients are contacting and neuter it along with the millions, yes millions of worthless domains your home network will never see.

A few years back, I tried a more drastic approach doing a full network proxy with whitelist only. But that proved too cumbersome to setup and maintain. Specifically, the interconnectedness of everything. You can’t just allow one website through, it requires too many dependencies to be functional. I wish they had a concept degrees past whitelisted websites one can get to, but they didn’t. Say you whitelist wikipedia, and that lets anything it refers to through as well. I never found something that did, and I didn’t have time for another project. Pi-hole isn’t a panacea, but it strikes a great balance of effectiveness Vs ease of deployment.

I have no polite words for people wasting human potential on marketing. Nothing in the world was ever made better with marketing, its impact on society is strictly negative with no redeeming quality. It is a nefarious endeavor amplified by recent advances in technology. One of the most salient point I heard against it (I wish I remembered where) went like this: chess grand master Kasparov was overtaken by a computer in 1997. 27 years of exponential technological progress later, we now allow thousands of super computers to be pointed at our kids’ brains for persuasion. Do you really think they stand a chance?

Ads should be illegal. I understand we historically accepted them into society at a time when they were innocuous, but their dial was cranked so far up they are unjustifiable in their current form. There is no justification for using psychological trickery on children. People should risk prison for being so ill intended as to devise such machinations. And let’s not even get into how bad it’s been for public conversation to use them as a funding model for everything. There is a direct line between flailing western democracies and the outrage engines ad funding inevitably creates. Maybe it’s not the only line, but it’s definitely one of them. It’s a moral imperative to avoid ads.

Vermont has a road billboard ban. You don’t quite know why things feel better here until it’s pointed out to you. It was done so as not to stain the beauty of the state, thus preserving tourism. But a side effect is that it also removes an ambient layer of aggression and you can feel yourself relax driving into the state. Life is demonstrably better without ads.

Warning! We have detected that we need to monetize absolutely everything with ads. Lower the draw bridge, drop your shields, and let us aim an army of poorly vouched 3rd party marketing dickweeds at your family.

I love seeing these anti-ad-blockers popups for they show how they lost the arm’s race, and all they have left is making an inarguable case. What a pathetic position to find oneself into, all they can do is ask “pretty please let us keep harassing”. I have no doubt they’ll find more insidious ways soon enough.

All the respect in the world to ad blockers, and sites taking risks with principled funding models.

I.T., maniacal paranoia ben March 13, 2024

Quiet Airtags

I didn’t post several years ago about the GPSes I installed on our farm vehicles. It felt like painting a target on my back. It took quite a bit of figuring out to set up Particle.io‘s early asset trackers. They’ve since created a dedicated preprogrammed and well polished device, seeing an opportunity in the success of the early hobbyist version I suppose. I never posted my setup, code, or experience but let’s just say it worked well for a few years, for very cheap. Unfortunately, the 2G network they relied on was eventually retired, and that forced me reconsider options.

And well, an obvious contender these days are Airtags. I bought a few for testing, and they quickly became the obvious choice. I replaced bulky cellular GPSes with them and folded them into home monitoring. Watching for geofences, battery status, and last contact.

While I can’t wire them directly to the vehicle’s battery, their battery does seem to last a good year (Vermont winters wear them down faster). And they come with several huge advantages over GPSes.

  • A mesh network of people’s iPhones has a lot better coverage than cellular in a rural area. Cell phones will report them when they finally get to a tower or some wifi.
  • They aren’t subject to tree or cloud cover.
  • They are tiny! I went through great lengths to paint and find a place for bulky GPS boxes. Airtags on the other hand will live anywhere.
  • They are cheap, and have no recurring cost (except the cell battery once a year).

These advantages led me to significantly lower the bar to what I stick them on. It’s no longer reserved for the expensive vehicles. If it costs money and isn’t fastened to the ground, it gets an Airtag.

Of course when used as theft tracking, their chirping is problematic. And so I finally bit the bullet and gave them the surgery they need to make them quiet. And it was very very trivial, I should have done this much earlier.

Open them up, I used a stronger blade than the exacto for prying. Note the 3 sharpie dots to point tabs.

I simply snipped the 2 wires going to the speaker

Still works!

Posts pagination

← Previous 1 2 3 … 9 Next →

This blog is solar powered

Interactive

Handwriting Capture
Mandalagaba
IPv6 link-local to MAC converter
IPv6 MAC to link-local converter
Markov Text Generation
Markov Word Generation
Markov Music Generation
Duplogrifier
Flood Fill Algorithms
Homestead Metrics
RGB Playground
Web Games

Categories

  • aesthetics111
    • plots54
    • specular holography6
  • Books3
  • I.T.202
    • 3D modeling / printing21
    • AI6
    • all out geekery36
    • electronics27
    • homestead automation6
    • maniacal paranoia25
    • plotters49
    • unix / linux29
    • video games4
    • web development29
    • web games3
  • Lego / Duplo67
  • life in the U.S.42
  • miscellaneous202
  • nature encounters114
  • old vinyls3
  • organs2
  • self sustainability560
    • agriculture105
    • apiculture38
    • apple20
    • building131
    • canning3
    • crochet6
    • foraging6
    • hunting10
    • maple syrup47
    • poultry39
    • preserving2
    • solar power28
    • water23
    • wood84
  • trip to a new life6
Theme by Bloompixel. Proudly Powered by WordPress