SMTP and IMAP credentials fail late and far from their cause: a reset email that never arrives. A small check proves both directions first, with a tokenised test message, a read-only inbox check, and broken config kept distinct from a broken server.
Technical notes, projects, modules, tools, workflows, and architecture on electronics, software engineering, and DevOps.
SMTP and IMAP credentials fail late and far from their cause: a reset email that never arrives. A small check proves both directions first, with a tokenised test message, a read-only inbox check, and broken config kept distinct from a broken server.
A 4 GB laptop GPU once sent every heavy job to a borrowed Colab runtime. Deciding per piece of work instead — by a measured number, by reliability, by a change of method — split one project across three places and deleted 9975 lines of machinery on the way home.
Each project began with its interface served from inside the borrowed Colab runtime, through Colab's own proxy — until Colab warned against it. Moving the interface out made the runtime a pure worker, and left two codebases held together by nothing but an agreement.
A borrowed Colab GPU ends every session by time limit or daily quota, often in the middle of hours of image generation. Picking up where it stopped meant treating each new runtime as a machine that knows nothing — and may not even be the same machine as yesterday's.
A laptop and a borrowed Colab GPU talked through a public MQTT broker that anyone could read. Giving that channel an identity took an afternoon on the broker and eight obstacles in the clients — mostly safeguards that were right for the old setup and wrong for the new one.
A Colab runtime has no address anyone can call, so a laptop and a borrowed GPU talk through a broker both of them dial out to. Sending commands was the easy half. Knowing — whether the worker is alive, whether a command arrived once — is where six silent failures hide.
A 4 GB GPU pushed the heavy work onto a borrowed Colab runtime, so a laptop and that runtime had to share one store. Storing the data was easy. Believing it was not: seven of the ten obstacles were successes that were false, and the most useful fix removed an entire layer.
Every search result gives the same answer for this: a LibreOffice command. I use a different engine, for four specific reasons — and the rest of the tool is the cost of talking to a converter built for a document server rather than for a command line.
A recording is two halves and usually only one is broken. Cleaning up the audio repeatedly, without watermarks or caps, needed a filter already compiled into ffmpeg — and eight further decisions that had nothing to do with noise, including the one whose proof is a matching hash.
Editing, building, and flashing had all moved to the terminal; reading serial output was the one job still holding a vendor IDE open. Replacing it took a program already on the machine, plus six decisions the IDE had been making silently.
Get an email when a new article is published.