Minor Bug in VoodooPad 6 – Text Colors

March 21st, 2022

VoodooPad4.jpg

Ever since moving to my new M1Max MacBook Pro, and moving to Apple Silicon apps, I've had one bug in VoodooPad 6 that's a touch annoying. I mean it's not horrible, but it was something that I hoped would be fixed. So I decided to let them know about it.

With the pandemic, and VoodooPad now being owned by Primate Labs, they haven't had someone to do all the upgrades and improvements that they'd planned, and I understand that completely. Times are challenging for everyone, and they want to update the app, they just don't have the people to do it right now, so it has to wait a little.

Thankfully, they responded, and seem to know what the issue was - adding support for Dark Mode, which is kinda odd, but I guess I don't know any of the inner workings of the codebase, or how Dark Mode support is handled, so I'll have to just be patient, and wait for them to update the app as they have time.

But it would be really nice to be able to save text colors... 🙂

Another Pi Day!

March 14th, 2022

pi.jpg

It's another Pi Day! And that always brings back memories of when the kids were little and the teachers in their elementary school would have the kids bring in pies for snacks, and fun, and while it's certainly a geeky thing to do, I always enjoyed that the kids loved it. Get them interested in things like that early, and maybe it'll make school seem more interesting.

Nice Config Change for Sublime Text

February 10th, 2022

Sublime Text 2

This morning I did a little searching about how to disable any Auto-Complete in Sublime Text, as there are a lot of times that I really don't want to have any autocomplete happening, as it just gets in my way. So I was very happy to find that all I needed to do was to add:

  "auto_complete": false

to the Settings file, and that will turn it off.

Blissful silence. 🙂

Thankfully, Ctrl-Space will bring it back, and that's exactly the thing I was hoping to find. Then it's at my command, as opposed to simply appearing. Once again, less is more... coding is what I do, and I know what to type... so Sublime Text is again my favorite editor. Wonderful. 🙂

Enjoyed Digging Through PostGraphile Code

January 10th, 2022

TypeScript

Over the weekend, I had a problem with a project at work that was using PostGraphile and I was having an issue with the Postgres URL that I was feeding to the configuration of PostGraphile:

    postgraphile(
      process.env.PLATTER_POSTGRES_URL,
      'public',
      {
        watchPg: false,
        graphiql: true,
        enhanceGraphiql: true,
        graphqlRoute: '/graphql/v2',
        graphiqlRoute: '/graphiql/v2',
        eventStreamRoute: '/graphql/v2/stream',
        appendPlugins: [
          require('@graphile-contrib/pg-simplify-inflector'),
          require('postgraphile/plugins').TagsFilePlugin,
        ]
      }
    )

The process.env.PLATTER_POSTGRES_URL was generated by a call to the Platter service, and it turned out to be cached, and stale, and as the source is Let's Encrypt, it needs to be updated monthly. The cache had been running for more than a month, and that left an old, expired, certificate for the site, in memory.

It was easy enough to have them restart the cache, getting to that point... well... 🙂 that was a little more involved. The first issue was that with PostGraphile, used as a Library, had the feature that if it could not generate the initial schema for the GraphQL engine, it would exit the process, and effectively crash the service.

I wanted to protect the service, so the first order of business was to update the way I was using PostGraphile to allow me to capture the failure, and just disable the GraphQL engine until we could get this problem figured out. Thankfully, that was as easy as adding a function to the retryOnInitFail option:

    postgraphile(
      process.env.PLATTER_POSTGRES_URL,
      'public',
      {
        watchPg: false,
        graphiql: true,
        enhanceGraphiql: true,
        graphqlRoute: '/graphql/v2',
        graphiqlRoute: '/graphiql/v2',
        eventStreamRoute: '/graphql/v2/stream',
        appendPlugins: [
          require('@graphile-contrib/pg-simplify-inflector'),
          require('postgraphile/plugins').TagsFilePlugin,
        ],
        retryOnInitFail: (err, att) => {
          log.error(`[PostGraphQL] Error on initialization: '${err}' with ${att}
                     attempts. Bailing out on PostGraphQL.`)
          return false
        }
      }
    )

At this point, we had time to figure out what the issue was. I was going to dig into the PostGraphile code, and Alex, at Platter, was going to look at it from his end. Which brings me to the point... the PostGraphile TypeScript code is very nice. Yes, there are a lot of packages/modules, and the organization is clean, but I'd have done it the same way - easy separation of responsibilities. The code is exceptionally clean... well considered and implemented. The more I dug into it, the more impressed I was with it as a project.

I thought it might be an issue with their code - an asset they are loading that has an expired certificate, so I filed that on GitHub, and had a wonderful exchange with the maintainer of the project. As I dug in more, and worked to repeat the issue on a much more limited basis, the back and forth with the maintainer was very helpful... just exactly what you'd hope to encounter - but often don't.

It was the most unexpected, wonderful, experience I'd had in months. It renewed my faith in Open Source again. 🙂

Happy Birthday to Me!

December 31st, 2021

Cake.jpg

Another year has passed, and another birthday arrives. As time passes, it's interesting that my birthday and the end of the year coincide, a time to think about the end of both, and the start of new things. It's been a year of ups and downs, the second year of the pandemic, and in many cases, so little has changed. In other ways, so much has changed.

A friend asked me to think about writing down how change happens from the inside, versus what's visible from the outside, and I mentioned that I thought it would be a very short story:

  • Don't let yesterday ruin your today
  • Don't hold today hostage for the promise of tomorrow
  • Focus on just this moment, it's all we have, and it is more than enough.
  • Do your best, all the time, and whatever happens - you know you couldn't have done more

This is what I've distilled my recovery down to... it's not a lot of big changes, in fact, it's not any really big changes at all. It's the almost imperceptible layering of millions of little things, that when viewed, occasionally, from the outside - appear as changes, but at the time they happen, it's really just sticking to one of the four tenets.

Every day is exactly the same... and I am blessed. 🙂

Merry Christmas!

December 25th, 2021

Christmas Tree

It's another Christmas, and things have started out quietly... I was able to finish Advent of Code today - all 25 Days in 25 days. It's an unusually warm Christmas - so no snow, but that's not really unusual, but the temps being as warm as they are is a little odd. Still... the temps will fall, and the snow will come, and it'll be time to shovel snow, but for now it's just like an extended Fall.

The Christmas Music has been great this year, and I've enjoyed some really good Christmas Movies. I wrote a Christmas Letter yesterday and sent it to extended family, and it seemed to be appreciated. I like catching folks up with a little humor. 🙂

Life goes on.

The iPad Pro Really is Something

December 22nd, 2021

IPadPro

I have been using the iPad Pro for two generations now, and my current model is the M1 iPad Pro, and during the pandemic, it has really proven to be a great Zoom, Meet, etc. box. It has a nice camera, and with Front and Center in iPadOS, it really makes it easy to have a good presentation, or meeting. But it's really so much more.

With the GitHub app, I can get PR notifications, review them, and merge them. With the GitHub Workflow Actions, we have continuous deployment, and that is really quite amazing to me. Of course there are the shells to boxes, and that is great, but even offline, there is so much to like about this machine.

It's rugged - compared to my MacBook Pro, and the screen is a lot easier to clean. I'm not saying my MacBook Pro isn't nice... it's just that in some respects, the iPad Pro is nicer.

What a really amazing device. 🙂

The Nasty Log4j Business

December 20th, 2021

log4j.jpg

It's been a wild couple of weeks for the log4j team... I mean, the problem with a logger is that you don't really want to limit it, and adding the url handlers probably seemed like a great idea at the time, but once they started to be used, it was understandably hard to drop support for them. And then the exploit hit.

It's just one of those nearly universal components of JVM systems that is being supported by volunteers, and trying to thread the needle between keeping as much of the functionality as they can... while restricting the vulnerability to something that can't be exploited. It's clearly not easy, as they've had at least three releases of the 2.x codebase to try and correct the vulnerability, and each time, there seems to be more there is to do.

This is certainly going to shift how some open source teams function... it's great to be the author, or maintainer of something as used as log4j, but to have this kind of attention... well... I'm sure it's not what they were hoping for this Christmas. 🙂

Advent of Code Day 19 was Brutal

December 19th, 2021

Christmas Tree

I just got Day 19 of Advent of Code, and it was brutal... I mean yes, the concept of change of axes, and then translation - that's not horrible, and while getting the individual translations right took a little time, the fact was, it worked, and I found the overlaps. What came next was the real challenge - Searching was not going to work.

This is not something new, as it's often that Part 1 is something that's reasonably direct, and can be solved directly, but Part 2 adds a much larger scope, and so can't really be solved in the same way. Not always... but often enough, that it didn't surprise me. So I knew I needed to thin the search space - I just didn't know I'd have to remove it entirely, and come up with an "execution plan" for the work.

Thankfully, I expect each translation to need the working rotation function, and offset so that once I had two sensor data matched, I could then move any point on one sensor to the other. But I then needed a faster way to find the overlaps, and then an order with which to collect all the beacon locations.

As it turns out, the unique set of inter-beacon distances is a nice "fingerprint" for a sensor data list, and we can use that to identify the "pairs" of sensors that overlap. Then it's the matter of order of mapping - and there we had to start at 0 and work up. If the pair had a sensor that we'd already mapped, then add it, and put it in the list. If not, put it at the back of the list, and try again. Eventually, all the pairs will be put in order, forming a chain of translations.

To get this, I worked on so many variations it's crazy. I easily spent over 10 hours on this day's puzzle. But in the end, the feeling of seeing the quick response was just fantastic! 🙂

Advent of Code 2021!

December 1st, 2021

Christmas Tree

It's December again, and that means 25 days of some of the funniest, most frustrating coding problems of the year. Yes, Advent of Code is back, and it'll be interesting to see how things work out. I will confess that today's problem wasn't too bad, but that's how the month always starts out. 🙂

We will see how things progress as we go through the month, but it's always fun to play along with the puzzles as they put you in the middle of the action to help Santa and the elves. It just makes me smile.