Hacker's Diary
A rough account of what I did with Emacs recently.
- January 31
- Funny moment in tonight's Blacklist episode where I'd swear the
framed picture of a church hanging on a wall was one where a
grand-aunt of mine was married in the early 1900's. Thing is, her
church was in Chicago, and this church was mar dhea in
Detroit, so who knows.
- January 30
- I just noticed that tonight's Blacklist
featured a guy creating pregnancies for a scam whose name was
Hatcher. Sigh. Try harder, script room.
- January 29
- Our robot vacuum appears to have gotten slightly confused with
the minor rearrangements of things in the course of moving stuff
for painters. Everything is back more or less the way it was, but
the robot's location function seemed unable to figure things out,
which caused a variety of questionable behaviour from climbing
all over its own recharge station to deciding the whole house
needed to be remapped. Eventually I put it down in the middle of
the kitchen - least likely to have even tiny changes - and it
accepted that it did in fact recognise its
environs.
You can't just point at things and say they're files.
Or maybe
you can. This honestly feels a bit like the whole "everything
is a file" thing was extrapolated to an extended joke in Bell Labs
and the people who were supposed to be pranked took it
seriously.
- January 28
- More house-reordering. Finally back to some semblance of
normality, although my home office is more of a mess than
usual. Of course, all this activity meant that once again I've not
tried to automate the LetsEncrypt thing. More interestingly, the
Server application didn't like my PKCS12 file this time around and
I wound up having to import certs and key manually.
- January 27
- We spent most of the day trying to put some order on the house
after all the disorder from painting during the week. An almost
perfect score achieved on "reassemble the cabling behind the
TV". During the course of the painting we discovered that the
bracket holding the TV to the wall is, shall we say, a little
overwhelmed: someone - names unnamed, but it very much was not me
- figured that it was ok to attach the mounting bracket onto the
plasterboard using rawlplugs and screws that only pentrated said
plasterboard, rather than the previous installation where the
mounting screws went right through and were anchored in the wall
behind. So I guess now I need a handyman because if I do this
myself I'll likely cause structural damage and smash the
TV.
This
is a fascinating write-up on REST. The really interesting bit
here is effectively returning callbacks to the client for
synchronous calls; this allows the server to vary the nature of
the callback with no work on the client side other than to invoke
the callback as provided. So the server could e.g. send back a
callback with a smaller fetch size or a longer delay between calls
in order to shed load.
- January 26
- Well, that was an excellent if short season of Vera;
I am also enjoying the books, but the "season" there is even
shorter, since the series writers have extrapolated the characters
and their environs from 10 - soon to be 11 - books into about 50
TV episodes.
- January 25
- One of those days... a thing wasn't working for me and I'd been
assuming various reasons and then eventually actually looked at
it. Four typos in about ten lines of code, all in places that
syntax checking wouldn't catch. Pfft.
- January 24
- The painting is almost done (well, except for the bit where
someone has to find and fix a leak first) and it's been totally
worth the disruption: the guys have done an excellent job.
I am childishly pleased that I managed to do some simple scripting
in OpenHAB of the "if this item changes, update that item using
this computation" type. Granted, it seems harder than it should
have been, but still.
- January 23
- I have some LetsEncrypt certs due for renewal and the main
reason I've still not done it is that I keep telling myself I'll
finally figure out how to do the last step of hands-off cert
renewal and incorporation into the Server app on an old macOS
box. The truth is that at some point I had it mostly working and
the final piece was something to do with ACLs on the cert, and it
was annoying to debug and I eventually gave up on it, and every
three months I tell myself I'll have a look this time around, and
eventually with a day or two on the clock I use the script that
fetches the cert and exports it to a PEM file which I drag and
drop into the Server app. Again.
Painting continues. For a task that involves applying wet adhesive
stuff to the house, there's sure a heck of a lot of dry
non-adhesive dust covering pretty much everything.
- January 22
- Painting going on in the chez today. Which means, of course,
that everything is everywhere and we were only able to watch The Blacklist
through me rooting out some cables and bodging things together
sufficiently. The show has gotten distinctly soggy:
they've never made much of Elisabeth's supposed ability as a
profiler, but not noticing who her neighbour is when said
neighbour is dropping double-entendre hints throughout their every
conversation is ... eye-rolling.
- January 21
- Things previously mentioned: the OpeHAB install seems to have
stablised, although I'm still considering buying a bigger
boat Raspberry Pi to run it on, and I'm using LSP-Mode both
at home and at work with mostly good experiences (there's some
breakaage in the office version related to my Emacs version which
I mentioned previously, but it's mostly more of an annoyance than
a showstopper).
Of course as soon as I write that the OpenHAB install throws a fit
and locks me out of the Pi. Great.
- January 20
- The current season of Vera
is really good and I've been chewing through the books as
well. The book character is a lot less sympathetic, because you
get her internal monologue and, well, it's not always the
nicest.
- January 19
- Oh dear, someone thought Blacklist needed an AI/Singularity
episode. Almost, but not quite, as ridiculous as the assassination
by beetle episode.
Kill Bill Vol. 2
(last watched January 16, 2005) kinda makes me feel the whole Cult
of Tarantino is/was exactly that: I'm sure there's all sorts of
homages and sly references I'm missing because I don't have the
same movie-watching background as our Quentin, but without those
references the movie isn't actually great.
The final episode of Reacher
season 2 felt a little hum-drum. I mean, there was only so many
ways it could pan out, and the main question was whether or not
any of Reacher's team would be sacrificed in the name of George
R. R. Mar... the story; I did laugh out loud at a few things
but at the end it was kinda so-so. I am reminded that Warren Ellis
wrote a piece about the source material some time back, which my
approximate recall of was that the stories are like clockwork
pieces - cleverly assembled and so on but you know from the
start more or less how it's going to work, and all the stories
work more or less the same way.
- January 18
- We fought bravely with the audio settings. Play the
recording. Interrupt it by pressing the "OK" button on the
control, but em not when the scrub-bar is showing. From
the menu that appears, find the A/V prefs. Select audio. From the
list of soundtracks - "unknown soundtrack" and "unknown
soundtrack", select the one that isn't already
selected.
- January 17
- Non-nerd tech gets on my nerves: watching a recording of
The Blacklist (do the kids still call them recordings?) and for some
reason audio description was enabled. Could we figure out how to
turn it off? No, we could not, or at least we weren't willing to
spend more than ten minutes trying before just watching the damn
thing anyway.
- January 16
- A little more fiddling and frankly I've no idea what's going
on. I've managed to verify that the client can connect and query and
whatnot, but it seems now that Django is having trouble with
it. Hmm. I have had a thought... yaaaaas. The problem was
that I had tested at some point while I still had the
pre-raspberrypi OpenHAB DB still up and running, verified it
worked, then went off and did other things, then dropped the old
DB, and never got around to updating the toy I'm using to look at
the new DB. So when I thuoght it was working against the new DB,
it was in fact working against the old one but using the REST API
from the new installation. That is now fixed, and I can stop
worrying about weird client behaviour, and go back to figuring out
other things.
- January 15
- Last night's adventures did produce a working mysqlclient
but... it claims there are no databases on the server I'm
connecting to. I'm assuming this is some sort of weird security
quirk whereby I can't see the databases unless I successfully
connect with TLS or some such. Weird and annoying,
though.
- January 14
- Reinstalling some things and I once again find myself banging my
head against mysqlclient. It appears that some
combination of the offical install and this Python package results
in a build that's missing some critical runtime info that allows
it to actually work. Several people have asked the maintainer of
mysqlclient about this; for all the threads I found asking he
was an unhelpful ass in responding. It seems like if there's a
consistent problem with a thing you "vend" (provide, maintain, or
are otherwise responsible for), there's some value to adding at
minimum a note about that common error to your docs. Even if it's
to just collect all your pithy wisdom about how people should learn how dynamic
linkers work and how to use a search engine. Who knows, someone
may actually contribute a solution.
In the meantime, I am poking this with sticks myself to figure it
out. I have one approach that works (set
DYLD_LIBRARY_PATH to point to or include the directory
where your actual MySQL libraries are), and I think I
got something working with install_name_tool (similar to
what I described here but
updated for paths and versions), but I'm trying to find something
a bit more definitive that either fits the
MYSQLCLIENT_LDFLAGS or otherwise into the build so I can
repeat it for every virtualenv using MySQL.
Ok, so it turns out that setting MYSQLCLIENT_* has no
effect if your path includes mysql_config because that'll
override whatever settings you want. Weirdly, adding the mysql lib
dir using -rpath causes other libraries to not load,
presumably because they don't have the @rpath
prefix. There's a reasonable chance I'm actually being bitten by a
Homebrew install here (which I've been trying to get rid of for
exactly this sort of reason).
Right, this works:
- Make sure mysql_config is in your PATH somewhere.
- Either make sure it includes -rpath
/mysql/lib/directory (may require editing your
mysql_config) or preload LDFLAGS with the
same flags.
- $ pip install mysqlclient --no-cache-dir --force
(the extra flags are to make sure you don't reuse a previous
broken install, like I did)
- $ otool -L $(python -c 'import MySQLdb; import sys; print(sys.modules["_mysql"].__file__)')
- That may print out a bunch of libraries, some with
@rpath, some not, and also the location of your new
_mysql module. If it throws an error because Python
can't load the file (likely) you can specifiy the path to
the .so file directly instead of my trickery.
- For the ones without: $ install_name_tool -change libcrypto.3.dylib '@rpath/libcrypto.3.dylib' /path/to/_mysql_file.so
If I can, I'll get rid of the Homebrew install and see if that
improves the situation any.
Late-breaking discovery: this may not affect the 2.x
version of the library, which is nice? Guess I need to upgrade a
whole bunch of scripts.
Sadly, no, the 2.x version breaks differently. I think
I've had enough of this for one evening.
- January 13
- Ugh, Powerline devices did the "drop connection on floor" thing
again (previously). I hope
this isn't a new trend for 2024. At least this time I
figured out what was wrong without rebooting any servers.
1917
is very much a "futiliity of war" sort of movie. You forget about
the technical stunt - the constant eye of the camera arranged as a
single take - and get caught up in the story, but honestly there
was a bit of eyerolling when the whole thing took a compassionate
pause in the middle of a ruined, occupied village. I wasn't sure
how it was going to wrap up, either, so was a little surprised at
the ending they chose. It was ok, but I'd probably not watch it
again.
- January 12
- We recorded (!) Vera
S13E1 last week and only got around to watching it now. Some of
the "surprises" had already been spoilered to death online before
the episode was even aired, but it was excellent both in terms of
story and visually. I suspect at this point "Tourism North of
England" are pouring money into the series in exchange for drone
shots of random scenery with a battered Landrover Discovery
driving through them.
- January 11
- Barely have my new mac set up and there's an OS update. Typical.
- January 10
- Mac hackery proceeds.
We wrapped Season 6 of The Blacklist
yesterday and planned on starting Season 7 today except... Season
7 isn't available on PrimeVideo right now. GRR. I could've sworn
they opened up all the remaining seasons. Anyway, as fortune would
have it I'd snagged the entire season on the DVR box at some
point, so we have it available modulo dealing with, ugh,
adverts.
- January 9
- New laptop setup has been a bit lumpy so far. Migration
Assistant completed, except for a couple of files of no particular
significance that it failed to copy, and now a few things are
failing due to the change in platform (x86 -> M2) but
... they're all failing differently. Trying to get some
minimal set of toys up and running at least.
The absence of /usr/bin/python is troubling.
- January 8
- New toy... after more than a decade I've finally sprung for a
new laptop. Having picked it up on a workday, of course, I have
limited time in which to set it up, so right now it's running
Migration Assistant.
Things are coming to a head nicely on Blacklist Season 6, except
having "solved" Reddington's identity they are of course
throwing it into doubt again.
- January 7
- Plugged in a Z-Wave inductive electrical meter that I've had for
ages and hooked it up to OpenHAB: it seems it's not reporting
much, or anything, and I have no idea why. Toggling the reset
button got it to report a voltage but that's about it. I have
plans for this, if I can make it work, but probably I should put
them to one side in favour of stabilising the OpenHAB setup
itself. I did go so far as to identify the platform I'm running on
because one RaspPi looks the same as another: I'm running on a Pi3
with something like 870MB of RAM, which I assume is 1GB with a few
slices reserved for hardware or something. The OpenHAB process is
consistently occupying 50% of this, which I presume is why
everything goes kaput when anything mildly memory-hungry comes
along.
- January 6
- Good morning, said the Raspberry Pi hosting OpenHAB, or rather,
it didn't: it seems it's not responding to the network right
now. This might be something to do with the eeros having
upgraded themselves last night (and in doing so rebooting the WiFi
network), or it might be that the damn thing is indeed not muscly
enough to do the job, as I suspected when I set it up last
week. Further investigation required.
(interestingly, the eero app claims it's online.)
Powercycled it to get at it. Looks like OpenHAB got
resource-starved and restarted at around 7am, but no immediately
obvious reason for the system being off-network.
As an initial bandaid I'm pulling all the graphical stuff off this
as it was initially set up as a graphical desktop. No point
running an X server, etc. if it's not being used.
Every Which Way But Loose
was kinda par for the Clint movies of its time: random bar fights,
very lightweight plot, a bunch of slapstick gags, that kinda
thing. No deep thoughts required.
- January 5
- The Pigeon Tunnel
is an odd sort of thing. Ostensibly it's an interview with John le
Carré that runs to 90 minutes, but it's intercut with clips
from the movies made from his books and various other media. It's
interesting, certainly, but could have done with a little less of
the artsy shots of the eponymous pigeons as
punctuation.
- January 4
- A few hundred km in the EV, during the course of which ABRP
initially worked really well, then the live SoC updates first got
spotty and then stopped outright, meaning the app was counting
down from an incorrect value by itself. I've checked the bubblegum
and sticky tape that gets the data into the API and it all looked
ok, so I don't really know what the problem was.
Also the car pranked me at one point by claiming after a rest stop
that I didn't have the keys. That was fun... not.
- January 2
- Throws me for a loop every time: param: Optional[...]
doesn't mean that param is optional, it means
it's None-able. To make it optional, you want
param: Optional[...] = None.
Caught git doing its amnesiac routine again. Worryingly
it seems to be showing me log entries for a file with the same
name bit a different path; that really looks like some
sort of hashing collision or other weird data overflow
issue.
- January 1
- Happy 2024!
OpenHAB seems to have survived the night running happily by itself
on the RaspPi, so it's time to start cleaning things up. First job
is to recover the two ZWave TRVs which fell off the network. For
this I had to build the ozwcp app because it seems the precise
sequence of steps isn't possible on OpenHAB itself, something I'd
like to dig into further at some point.
So.
- Step one, shut down OpenHAB.
- Step two, run up ozwcp.
- Step three, open the ozwcp web interface and wait for it to
populate everything.
- Step four, ask the UI a few times if the suspect node is
dead. It may initially say it's ok, but should eventually say
it's failed. You may need to poke it with INF requests or what
not to trigger this.
- Step five, ask the UI to replace the failed node; when it
prompts for the new node, press the INF button on the "failed"
TRV, and wait for the controller to notice it.
- Step six, repeat for any other failed nodes.
- Step seven, turn off ozwcp and restart openhab.
Oh except one minor detail: I accidentally picked the
wrong physical devices to re-init (swapped, basically), so that
left two of my devices literally wrongheaded. Rather than
redo the recovery process I just swapped the heads around and now
everything seems happy.
previous month | current month| next month