Sunday, October 25, 2020

[Technical] Frustration with VSCode ESP-IDF extension

It

Just

Refuses

To

Work!

 

When using the Espressif IDF extension in Visual Studio Code, I kept getting squiggles under text even when I thought I had muddled through setup correctly, and when I went to wipe everything out and try again I kept getting

Invalid argument: '\\\\${IDF_PATH}\\tools\\kconfig_new\\esp-windows-curses'

The other messages turned out to be key: pip was positively ancient and Python 3.5 is out of support. All I had to do was upgrade to Python 3.9 and ensure that the Visual Studio C++ workload was installed and the Python requirements installation stage completed successfully.

Saturday, October 17, 2020

DasKunkee.net now live

One time when I was in high school, someone came to physics class with a package of 500 Post-It Notes. That same day, the teacher ended up needing to spend most of the hour away from us--no big deal, they're honors kids, right?

Well, someone got the bright idea to label everything in the room. First was the chalkboard, but "chalkboard" wouldn't do so it was dubbed "das chalkboard". As this group of kids circuited the room, more things were labelled "das <thing>" until they came to me. Being known by my last name, Kunkee, I was thereby dubbed "das Kunkee".

Later in high school, a friend offered to host a website for me. What to call it? DasKunkee.net.

It even had a subdomain served out of my parents' basement. The server and subsequently the subdomain were named for for the less-prosperous side of Terry Pratchett's Ankh-Morpork, Morpork. This was served on port 81 by an Intel 486 DX with, as I recall, 128 MB of RAM that ran Gentoo Linux and two 1GB SCSI-2 drives. (This is what happens when no one wants high-end spare parts from a decade ago.) I learned a lot from setting up and running it. One day I may salvage the files from it and set it up again.

Recently I got the bug to build something, so I resurrected the concept of this website: DasKunkee.net

You may notice that the styling is pretty simple. Back yonder when, the same friend kindly provided a simple set of PHP and CSS pieces that made it look awesome to my starry-eyed teenage self, and I've done my best to base the current design on it.

Of course, nowadays I'm a software engineer so some technical description is warranted. The site is stored in a GitHub repo as .pug files. Every push to main triggers a Github Action that turns the pug files into HTML and uploads them to Azure Storage. The Azure CDN then picks them up and serves them through the Azure Storage Static Website feature. (There are numerous tutorials about how to set this all up; I don't recall which ones I used, sorry.) The root SSL certificate comes from Let's Encrypt courtesy of shibayan's keyvault-acmebot (relevant blog post). ServerFault was decidedly less than helpful. For me it was a case of setting up the Static Website with one tutorial and figuring out that shibayan's work allows layering Let's Encrypt on top of that.

Time

I stepped out of the past and into the present

everything old
worn
beaten
aged

I looked around at what my fathers left me
so long ago
so very long ago

and all I saw
was what had been
and what could be
but not what was
nor what will be

I ached for what was
not yet ready to part
yet already parted

blinded by tears
I looked, but only felt

they were gone
but they gave me something
something small to remember them by

an egg

a promise

clay for molding

a future for shaping

only without their hands to help.

the clay sat and dried
the stone sat uncarved
the endless potentiality of the universe irrevocably unrealized moment by moment
fading into echoes

fading back into an egg

a future promise

unshaped clay

raw stone

fallow

with no hands to shape it
with no intent to wreak beauty

only a suspended moment
a meeting of times

a cloying bear hug of that which was gone
a rending wail of parting too soon
a loss of a compass

a field of old stones
fallen
rotting
returning
going
drawn inexorably on
away
into the past

gone

lessons hardly learned
shapes hardly seen
places hardly visited
minds hardly known
hearts hardly mended

I hardly knew myself.
how to know those gone?
the echoes fade
the ashes crumble
the dust blows

what of this egg?
this fallow field?
this aging clay?
this uncut stone?

my past is gone

but the present bears a mark
a blessing
a sign
many signs
many blessings
many marks

shunned too long
known too little

perhaps a seed may be planted
perhaps a step can be taken

the future holds horrors
the future holds wonders

I tell myself
to sleep at night

in the morning
in the sun-drenched fallow field

I freeze

again

untold wonders just out of reach
both ahead and behind

but just a fallow field in front of me

no helping hands to light the way
no sagely voice to soothe
to prune the unfathomable plenipotentiality
that is
and isn't
their gift
their burden

lifting my foot to take a step
I freeze
I cannot see
I cannot find the silver thread
leading to tomorrow

so I put my foot back
and let another day
slide into the soil
into the past
away from the future
unrealized
untrammeled
untouched
no more beauteous than before
no more regal than a fallow field
no more accepted than an uncut stone

and thus my gift is not a gift
but a paralysis
a boon of ill effect

a priceless wonder

a derelict

why shrink from the step?
why cling to the potential?
why not trammel the future in pursuit of a sublime past?
why not cast aside the endowment of antiquity
to forge a path of sublime wonder?

it won't be sublime
it will be mundane

and then
all is lost
all is wasted

the field fades away
empty
unused
trammeled
poisonedcluttered
spent

even an egg from which
would be a burden
a broken tangle of girders
unfit to bury a seed in
a choking death of futures

I have freakin' high expectations here, man!
Don't lose your parents' legacy; rather, honor and magnify it! Make something of it!
Don't just spend the nest egg, do something honorable with it! Make something of it!
But the task feels big enough to swallow me whole, to remain undone after spending my life on it.
I am daunted by what I see as the scale and breadth and size of it.
Oh, and don't just have a life, do something of your own! Do better than your forebears! Make something of it! (THE ANCESTORS DEMAND IT --ed.)

but what of my pain?
what of the fading echoes?
the convulsive clinging to lives long lost?

the deciduous future
must be decided
every day
every moment

but who am I to aspire to beauty greater than the subtle grace of a fallow field?

I stand no chance

the energy of the plenipotency beckons
but
I sit down
I bury my hands
and cry
at the futures I will not make

could the hands help prune
it would be their future

not mine

they are not here

from the past they bid me forward

it will not be one future
it will be many that I make
each better than the last
each more finished
each more seasoned

so when another finds this field

maybe the gnarled girders
and fallen ferroconcrete
can be their aged stones
and point them to what can be
and not what was
and what was not

instead of poison
and choking

when I find the silver thread again
I will pull

but if I cling
it will end me

so when it ends
and end it must

I must find another

Saturday, May 16, 2020

Replacing a Vigo Soap Dispenser

I recently found myself under my kitchen sink tugging and twisting and generally failing to remove a Vigo in-sink soap dispenser (metal tank, not plastic). It is mounted behind the sink, so I was operating by feel and pretty awful phone photos.

Since I couldn't find details about how this particular item goes together and I have the resources to, I went ahead and bought a new kit so I could tell how the pump and tank attached to each other and so tell how to disassemble the existing one. (Unfortunately my first purchase was of the plastic-tank model, so that's what the pictures are of.)

Sure, there might be other ways to do that, but that's what I did and now you don't have to. :)

Hopefully what I found and learned will augment the existing how-to videos to make someone's life easier.

The packaging is simple and robust. It's a cardboard box, a styrofoam insert, and a couple of papers:


You can see in that last photo the tank and the pump assembly.

The tank in this particular kit is just one piece of plastic. The neck has threading on the outside.

The pump assembly slides apart into two sections that I'll call the pump and the mount. Here's the pump:


This is a single unit, already attached and glued together. Normal operation has this sitting snugly in the mount and lifts out as a unit to allow refills. The problem I had is that the translucent straw on the pump broke off and fell into the tank.

Here's the mount:

Note the brass nut and the rubber gasket. These function just as described in numerous online tutorials to seal the sink surface off from the underside.

The part that I could find no photos of anywhere is this:


The bottom of the mount has threading on both that outside for the brass nut and the inside for the tank. Now I know I need to retighten the brass nut and remove the tank before removing the nut and mount. Silly as it may seem, it's now on the Internet.

Thanks for reading.

Saturday, February 22, 2020

[Tech] ESP32 Programming from ARM64 Windows

(Disclosure: I am an employee of Microsoft and work on Windows 10 on ARM, but the content here is from me on my own time. Views expressed are not those of my employer, and there's no guarantee of...well, pretty much anything, but I try.)

I have had some experience using Windows 10 on ARM (ARM64) devices and, given their extreme battery life and sufficiently good performance characteristics, I thought one would be a good foundation for an IoT development machine. (Think about not needing an outlet at a hackathon...)

To test this, I recently decided to finish a project I have most of the parts for: a WiFi-controlled pair of LED strips. A long time ago someone got me a modest ESP32 break-out board for Christmas and I've been itching to use it, and I've had the LED strips since I came up with the idea.

I may yet author a Hackaday.io project describing the build, but for this article I'll be focusing on the development environment. (If I do, I will add the link here and it will be listed here.)

Sunday, February 2, 2020

The Werewolf Moment [not fiction]

Over the course of time, I have had the opportunity to play what I call 'hidden identity' games. The entire group openly has one objective while a subgroup is secretly given an opposing objective and knows about each other, but the subgroup loses if it is discovered. A low-prep version called either Mafia or Werewolf is popular; in it, the group is secretly divided into 'villagers'/'citizens' and 'werewolves'/'mafia'. Each round the whole group decides one person to 'kill', revealing their identity but excluding them from further votes and discussion, then the werewolves decide on one person to 'kill'. The villagers are trying to find all the werewolves while the werewolves are trying to kill all the villagers. Sometimes an oracular character, say a detective, is added to rebalance the game.

There are about as many different sets of rules as there are fans of the game. :)

Board-ish games with this concept include One Night Werewolf, Werewords, Avalon, Tortuga, and Secret Hitler.

While playing Secret Hitler over the course of a few weeks, I noticed an interesting emotional moment in the game. As the subversive subgroup's subterfuge grows in complexities and stakes, the game often reaches an 'ah-ha!' moment in which the subgroup subtly (or not-so-subtly) outs itself to the rest of the table. Depending on the trust relationships that have been built up, parts of the overall group may be convinced one way or another; typically, though, it becomes clear who is closing ranks around whom and who is pushing what agenda.

The game tends to end pretty rapidly after such a moment, for better or for worse.

What's interesting to me is that feeling of things clicking together, of certainty, of finally knowing whom to trust. The other side of this, of course, is if that moment comes too late: sometimes it comes when the subgroup has everything aligned according to the game mechanics to reach its goals, so it is able in that moment to do something so revealing because staying hidden instantly no longer matters. Sometimes it's just a screw-up (my especiality). It can also spell doom; in one game of Secret Hitler, I had been outed as Fascist (capitalized to emphasize the reference to the game), but that meant that two other Fascists were so trusted that one was able to get elected to make the final decision that won the game. (That game was pretty epic; the subgroup discover process had failed in a spectacular fashion, and part of why I was outed was that the other Fascists didn't think I was one of them.)

Truth be told, I don't like playing as one of  'the bad guys'; that said, the last few games have been *quite* instructive about what the subgroups tactics need to look like. For example, in that last game only two of the six Fascist policies were enacted by Fascist subgroup members (IIRC). The rest were from luck, subversion, clever smokescreening, and manipulation. I managed to land a presidency with another Fascist who deliberately selected a Fascist policy, but I waited until he explained that I had given him no choice (I had) to claim that I had drawn three Fascist policies (statistically believable at that point in the deck) when in fact I had drawn two Liberal policies (drastically skewing the stats for the next two to three presidencies). There may have been a better move, since I was outed two presidencies later as obviously Fascist due to this, but it took a Liberal in the next presidency down as well and left the other Fascist sufficiently trusted to help steer the last vote to Fascist victory. (The look on the other Fascist's face confused me until I learned he thought I was Liberal.)

Draw what lessons you will from this. In any social situation, someone with covert subversive values will typically not outright confess them, but instead will act in secret and sew confusion and misdirection. Overt group affiliation is not helpful when attempting to identify such a person and is often useful for concealment. The OSS (CIA) called one such approach Simple Sabotage (see Section 11 on page 28-31).