Author: Dave Strickler

  • Subtractive Solutions

    Many solutions we implement are additive: We want more customers, more revenue, more good Press.

    Subtractive solutions are just as important, but work without offering anything more.

    • Anti-spam solutions remove your junk email. They add no new emails.
    • The fence around your garden keeps the rabbits out. It doesn’t make your lettuce grow faster.
    • The Advil you take removes your headache. It doesn’t make your brain smarter.

    But I think you’d agree, having no spam makes reading your email easier, keeping rabbits out of your garden gives you peace of mind, and having your headache go away makes you think better.

    Sometimes a solution needs to subtract something before it can add something.

  • Always use the good stuff

    I recently had to do some work on my house that involved CAT6 Ethernet cables, so I looked for some modular plugs (AKA end caps), and found an old crimper to use. After over an hour of frustration in cutting, stripping, pairing, connecting, and crimping, my Ethernet tester told me the all the cables I made were faulty. In frustration, I dug deep in my tool drawer and pulled out “the good stuff” – a Kline Tools pass-through crimper and the associated end caps. Of course, these were easy to use, made the work quick and painless, and worked the first time.

    The lesson here is tried and true. If you want it done right, don’t cut corners.

    There’s never enough time to do it right, but there’s always enough time to do it over.

  • Avoid overlapping AP channels

    When building a Unifi network with APs, it’s tempting to find an open channel, free from neighboring networks, and put all your APs on that same channel, but that would be a mistake.

    Channel frequencies are, at their core, radio signals on a certain frequency. If you put to APs close enough that their radio signal can be seen by a device like a laptop, that device will jump between them endlessly. From the device’s standpoint, it sees radio signals coming from both directions, with the same SSID, and neither AP backing down – each one demands “Connect to me” over and over. The result is your device see WiFi as “unstable”, and to be sure, it is.

    A better way to do this is to look at the frequencies and pick two that, if they are seen by the same device at the same time, at least are on different frequencies. At this point, the device is still confused, but it does see two different APs – progress.

    Better still, use a minimum RSSI value to allow “hopping”. This allows the signals to overlap with different frequencies, as stated above, but now at a minimal RSSI level – typically about 70- 75 dB. Let’s say you set each AP’s minimum connection threshold to 70 dB. By taking your laptop and moving from room to room, you should move farther away from one AP (its signal value will go up in dB as it weakens), and you’ll also move closer to the other AP (its signal value will go down as it gets stronger). Somewhere in this journey, your laptop will say “I have a signal of 65db from one AP and an 85 dB from another,” and it will choose the AP with the lower dB value. This is how your laptop knows to “hop” from one AP to another. It sees one as weakening and the other getting stronger, and “hops” to the stronger AP.

    But how do you know what dB level to set the AP at? Trial and error? A good gut feel for networks? That used to work: a notebook, lots of pencil scratching, and some math. Or you can use Claude, my preferred method. Let it do the math for you, and it will tell you what to set your RSSI values to. But don’t expect it to spit out numbers instantly. It will need you to move from room to room, run some tests in each room, adjust your APs, and rinse and repeat. This is a process, but it can tune your network as well as (maybe better) than a professional network installer.

    So, in summary, don’t let the AP channel frequencies overlap unless they are well out of range of each other, and if the APs are close enough that their signals overlap, use Claude to help you adjust the RSSI values.

  • Meshing with Unifi networks

    When setting up a Unifi network, especially if it’s at home or somewhere that’s not commercially wired, it’s pretty common to run into a room where you just can’t get a good signal from the nearest wired Unifi AP. The logical next step it to put a new Unifi AP in between this room and the nearest wired Unifi AP, and configure it as a “Child” in a mesh network, also know as a repeater.

    Now, while that often magically works the first time you do it, you may be tempted to start dropping in meshed APs all over, but that would be a big mistake. To understand why, you need to back up a little and understand how UniFi’s Mesh technology works, which is similar to other manufacturers.

    Let’s use the simple example above: a wired AP and a mesh AP, connected to the wired AP via WiFi itself. While this works well, you will notice that connecting to the mesh AP gives slower throughput because your network packets are handed off through the wired AP, and the negotiation overhead translates to roughly 50-75% slower throughput. Also, each time you connect a meshed AP to a wired AP, the wired AP needs to stop and send data to the meshed AP. While this is fast, if more than one meshed AP is connected to the same wired AP, it will slow down everyone’s throughput to the wired AP.

    Think of of this way: a mesh AP with a single radio doing both jobs has to receive each packet from its parent over the air, then retransmit it to you over the air — same radio, same channel. Every bit crosses the airwaves twice, so the radio’s airtime is split between backhaul and serving you.

    Now a smart engineer would design around this with multiple radios, but that would also need some serious CPU power to handle this. Luckily, these units are on the market, although they’re not expensive.

    If you can’t get one of these new multi-radio APs, you should consider UniFi’s “AC-LR” AP. The “LR” stands for long range, and through some beam-forming tricks, they focus the same radio signal into a cone shape to achieve a stronger signal over a longer range. Think of it like yelling through a megaphone; same yell, but it sounds louder. While the spec says 600 feet outdoors, my experience has been closer to 300 feet outdoors, and 150 feet indoors. Now think about 150 feet inside a residential house – that’s a long way. I recently put an AC-LR in a loft in my house that had no other way of connecting an AP. While the throughput was only about 30-60Mb/s when connecting to this AC-LR in mesh mode, that’s plenty fast for a video call.

    In summary, don’t put any more than a single meshed AP attached to each wired AP, and try to use a new model with multiple radios. If you can’t find one of those, then look into an AC-LR.

  • Why use FindTheTime ?

    I used to use Calendly, and as a paid user, I was pretty happy with it. It worked, but one evening I thought I could create a system that would be easier to use, cheaper, and I could add features as fast as I could think of them.

    And thus, findthetime.app was born.

    At its core, it fixes a familiar problem. It allows anyone with your private calendar link to book an appointment with you. You can link it to your Google, Microsoft, or iCloud calendars, and it has features like creating buffers on either side of a meeting so you don’t have back-to-back meetings, and your day stays sane.

    And it’s only $3/month. Even cheaper if you ask Support nicely for a coupon.

    I didn’t create this to make money. I created it to help people, like me, handle scheduling issues.

    So give it a try at https://findthetime.app and see if it works for you. If you’d like any features added or have general questions, email support@findthetime.app, and I’ll get back to you quickly.

  • AI Can’t Design Code

    AI is everywhere today, but for people who want to create an application, where is it really helping?

    As a person who codes, I can’t imagine any coder not using it, just as I can’t imagine typing a text without auto-complete. For a non-coder, AI can build a prototype for you if you carefully know how to ask it.

    But will it replace coders today? No, but it will shift the way we think of them.

    Currently, AI makes it easier to create basic code, the code that creates an application menu or a form to accept data. The list of what AI can code is long, and it’s getting longer every day.

    The nuance of an application’s requirements has become much more important than the task of building it.

    But if you think coding is simply a series of tasks to complete, you’re missing the difference between a mechanical engineer and a 3D printer. Humans envision the design and the interaction with an object, and the 3D printer just builds it. AI can be used as a tool for building applications, but it’s just that—a tool for building, not an architect.

    Today’s AI lacks higher-level tasks such as architecture—the application’s overall design. The nuance of an application has become much more important than the task of building it. While AI will get better at this, its overall design today is to regurgitate patterns that humans have already used, not to think of a clever new way of doing things. For the moment, that’s the exclusive domain of humans.

    In the near future, I see the market for a coder who can only “code” shrinking. But for application architects and designers, the market is already exploding. They are becoming the “Prompt Engineers” of our future. They’ll be good at coaxing AI to build what they envision.

    So when you hear, “AI will eliminate coders!”, that’s a gross generalization. A better explanation is that it will alter how coders do their work, recasting them as deep thinkers of the problems presented to them. They will spend more time designing at the whiteboard and less time coding at the keyboard.

    After all, what is an application but a representation of what it’s architected to do?

     

  • Monitoring PlanetScale from Zabbix v7.x

    PlanetScale is a hosted MySQL database SaaS, and while it’s got great uptime, you should be monitoring it for metrics if nothing else. While PlanetScale offers lots of features beyond your average MySQL install, monitoring it is surprisingly the same.
    (more…)

  • Laravel

    I’ve been coding in PHP for a few decades, mostly using the CodeIgnitor, which I have grown to love. But today, I’m breaking from the old ways and adopting a framework that’s been on the rise for many years: Laravel.

    Ironically, I’ve layered on many of the basic features of Laravel over CodeIgnitor as I extended CodeIgnitor’s framework for my use. Not as clean, not as well architected, but the basics were there. But seeing Laravel’s implementation made me realize how mine paled in comparison.

    If you’re considering switching, I’ll advise you that its design is “opinionated”. This means there are rules, like keeping a Model (it’s an MVC framework) filename singular but the database table plural. While you can override things like this if you follow their conventions, things, as Steve Jobs used to say, “Just Work.” For instance, is that example my Model is almost empty. There’s the shell of a class but nothing else. Yet I can go into a controller,  reference the Model, and query the database, even though the Model looks unfinished.

    The “opinionated” nature of Laravel makes it very quick to code, but (and here’s the catch) you need to learn its conventions. Following these conventions allows all kinds of magic to happen in the background and allows for less code that’s easier to read, which is a win for both the programmer and the next person who has to read their code.

    Add in the incredible ecosystem of packages that extend Laravel, and you’ll find this like writing CRUD for a table more of configuring, and less of coding. While its list of packages is growing, I’ve only once found something I needed that wasn’t already coded and free or reasonably priced. I’ll discuss a few of of this in another Post.

  • Running Engineering in a Vacuum

    Wouldn’t it be great if you could be in a section of an office, surrounded by intelligent people, working on projects that really mattered to you personally, and never having to interact with the rest of the company? I know a lot of people who would consider that a dream job. I would hate it.

    Don’t get me wrong, as an engineer, the first few days would be delightful. Lots of interesting conversations over coffee. Working on engineering projects that are just purely interesting, regardless of how they fit into the company. That sounds fun – for a bit.

    And there’s the rub. Within a few days, I’d start asking myself, “Why am I working on this?”. “What is it accomplishing, and where does it fit into the company’s goals?”. I shouldn’t live in a vacuum, nor should my engineering team.

    How about we take a better approach? One that starts to ask those salespeople, “What does the customer want?”. One that starts to ask accounting if I have a budget and asks HR how hard it would be if I needed to staff up. And how about asking the CEO what goals they’re trying to accomplish? You can learn a lot if you just ask.

    Somewhere along the line, we’ve forgotten that we need to accomplish the company’s goals – not ours. If you’re running your engineering team in a vacuum, it’s not good for the company, and it’s probably not good for your career.

  • Getting the Weather via an API the Easy Way

    If you’re coding and need to find the local weather, there are a lot of places you can go to get it. Most are complex and require you to create an account, and generally don’t offer much.

    If you’re looking for one that’s simple and based on GPS, try https://api.pulsewise.com/environment/weather/42.3388/-71.0726 , which is free for the first 1,000 calls per month and includes sunrise and sunset, too. Just swap the latitude & longitude coordinates for your own latitude & longitude, or if you leave them off, it will use your browser’s coordinates.

    This is just part of a set of tools I wrote at https://pulsewise.com or see the documentation.

    Its output is in standard JSON, and looks like this:

    {
    “success”: true,
    “timestamp_utc”: “2023-10-16 20:25:30”,
    “summary”: “Clouds”,
    “description”: “Broken clouds”,
    “temperature_current”: 56.68,
    “temperature_min”: 53.22,
    “temperature_max”: 59.11,
    “feels_like”: 55.53,
    “pressure”: 1003,
    “humidity”: 74,
    “wind_speed”: 5.75,
    “wind_direction”: 120,
    “wind_gust”: null,
    “sunrise”: 1697453864,
    “sunset”: 1697493703,
    “lattitude”: “42.33880000”,
    “longitude”: “-71.07260000”
    }