How I got rid of a JavaScript framework and became enlightened, happy, charismatic, rich…
I have taken some pains to rebuild this entire blog in Django class-based-views.
It was much easier to do than anything in Angular, and more enjoyable to boot. There are a few bits and bobs missing, but I’m feeling a lot more energised about blogging.
At least, I’m not going to have to spend time updating npm libraries with CVEs being found every ten minutes.
I have now moved to a somewhat less dense, leafier suburb. Both my cat, Esme, and I are enjoying the sunlight and green surroundings.
Esme enjoying the sunlight and cool breeze on the deck.
Though bloody exhausting, the move was successful. Many stressors and complications were overcome. For renters, there are many:
The hunt for a new home.
The application process.
The budgeting.
The move itself. Oww.
The bond cleaning.
The real estate agents.
The utilities.
The great transfer of NBN connections.
We managed them quite well. Thankfully, I had time off work so I could lift a lot of the weight – literally and metaphorically – while my other half trudged on through work commitments as well .
As hinted through the winky italicisation above, getting the internet connected was an ordeal. Our new apartment is in a complex composed of three buildings. Each has apartments numbered from one through to twelve. There are three main distribution frames (MDFs), one for each building. These connect the NBN fibre to the internal building copper (sigh) networks and so you have Fibre-to-the-Building (FttB).
That's the set up.
For the ISP to provide us with an internet connection they need the identifier for the copper pair "C pair" that links to our apartment which is wired up in the MDF. They hoof the internet into that.
Alas, it so happened that they had an incorrect C pair value. Someone else was chugging down the internet that I was unwittingly paying for. When I called the ISP and explained, they read out to me the MAC address of a modem that they insisted was mine. It was not.
Three weeks and much ado later, they finally agreed to request an appointment with an NBN tech to visit and isolate the correct C pair. According to the tech, whoever provided the C pair value to the ISP had just picked the first apartment number that matched mine. They gave them my apartment, but in another building.
All fixed now. And while I have internet again, it is 10 times slower than the FttP internet at my last house at just 100mbps down. I will have to live with that I suppose. Though the abandonment of FttP for all Australians remains a tragedy given the proclivity for complications with the current multi technology mix strategy. A national embarrassment.
Otherwise, I'm very happy in the new digs. Good breeze, lovely birdsong, more space, cheaper rent! I shouldn't really complain.
Starting from Friday I will be taking long service leave for a couple of months.
For the first few weeks my partner and I will be moving house, but afterwards I have some time to myself. I plan to use this time being a fun, happy-go-lucky, man about the house. Primarily, this involves resting, playing, engaging in hobbies, and cooking good food.
The temptation is to write an enormous to-do list, but I want to actively avoid the mind-state of doing. I am here to be and stuff will get done I suppose – I am not really bothered. Thus I will be doing being.
I want to spend some time being a home-programmer.
I have some web utility ideas that I want to dabble in. I have a couple of Raspberry Pis that I plan to play with. I also want to sharpen up this site a bit, possibly finishing the unit tests and making the code public, maybe.
There's also a thought about replacing the Angular front-end. I initially developed this blog with a Django back-end and an Angular front-end in order to teach myself Angular. What I have learned is that I hate it, and it is definitely overkill for this use case. Besides, the more complexity that gets added to these frameworks the harder they are to maintain. I am toying with the idea of rewriting it as class-based views in Django, with only vanilla javascript to add some pop.
Using the same syntax as curl you can get really useful details about http calls, like this:
1
httpstathttps://infinicky.me
Which produces the following output:
httpstat https://infinicky.me
I did this after setting export HTTPSTAT_SHOW_IP=false to omit IP details for the screenshot.
This turns out to be pretty useful for troubleshooting network issues between servers. At least in ruling out some people's pet theories about what might be causing an issue.
Over the last six months I have been testing out GitHub Copilot at work, and I thought I would write up my observations. The TL;DR is that I will be avoiding these regurgitative transformer models for coding, even though they are useful for some things.
Knowing what I know now, would I use it to learn a new programming language or framework? Nah. Just read the documentation. Would I use it to "improve productivity" or "write less boilerplate"? Also, nah. I don't intend to delegate critical parts of my code to a plausible-text-generator as I'll just spend more time rewriting naive code.
So, what is it any good for?
Let me outline some of the things that I think Copilot is actually good at.
Quickly reminding yourself of forgotten syntax
You know, it's embarrassing how often I forget how to write a ternary conditional in Python. I've looked this up more times than I can count – it just doesn't stick in my dumb flesh brain. Copilot answers this really quickly without needing to context-shift into validating search results.
Copilot quickly demonstrates ternary syntax in Python.
Summarising some undocumented noodle-code you wrote two years ago.
You wrote that mangled disaster function for a reason. Copilot can break it down and help you make sense of it. It’s pretty damn good at this. You can follow up with specific questions to spin that fork around your spaghetti pretty quickly. Then again, it has no idea about the broader context the function operates within. So you will probably spend some time finagling your queries.
Superficially explaining a new concept.
Yet another async implementation to learn...
Some libraries can be pretty opinionated about how they work, and they might not necessarily follow the conventions of the language you are using. I sometimes want help wrapping my head around “the right way” of implementing a particular class or API. Hey, LLMs give you a pretty good start, but follow up with the documentation because it has probably been updated since Copilot was last trained.
Offering theories about what could be wrong in some code.
Copilot can quickly read exceptions and provide explanations. It can look at your code and find the little mistakes that might be throwing everything off. In particular, the type of mistakes that are easy for a human to overlook like incorrect nesting/indentation, or curly brace placement. I think that Copilot can be a good starting point. But, I've also had it lead me down rabbit holes suggesting ridiculous changes to my code when the problem was one of the aforementioned little mistakes. This may improve as GPTs gain the ability to handle more context, but then it seems we may still be inevitably stuck with the hallucinations.
This means being prepared to deal with bogus suggestions.
Writing quick, nasty little scripts
Occasionally, I have to do stuff on Windows (yuck) and there have been a couple of occasions where I used ChatGPT to write a PowerShell (yuck) script where my requirements were simple enough. So there's that!
Okay, but?
The fundamental essence of these chatbots is that the veneer of usefulness is itself the trap. Aren’t all these qualities just ingredients of the stew we call professional growth? Shouldn’t we practice debugging, research, creative thinking, as well as reading and interpreting “noodle code”? These are all important skills for devs. Delegating them to Copilot means handing over your personal growth to a statistical plausibility toilet and hitting flush.
The temptation to have a regurgitative language model spew forth code because it is faster leads to unforgivable programming sins that cast oneself into an unending debugging purgatory. I know this, and I freely confess it, because I've done it and paid the price. How did I end up there? Well, regardless of lacking context and hallucinations, the dopamine spike after watching 60 lines of code materialise in a couple of seconds is thrilling. Sometimes, not often, it even runs without requiring any modifications. This experience is enough to throw caution to the wind and try it one more time. And then again. Before you know it you have entire modules written and apparently functioning. What a productivity boost! Take a holiday, you did your work in half the time.
Gone are all the patient safeguards of a codebase built from the necessarily intellectual process that is programming. By outsourcing your code to a script-puker you won't know how it works in runtime anymore. You won't understand how your data flows, whether it is sanitised appropriately, or if you're hitting your database with an expensive query. At first, this won't matter because you are getting stuff done. It will hit you like a tonne of bricks eventually. You'll realise that your code is poorly commented, it uses deprecated APIs, and is impossible to troubleshoot precisely because it is so plausible. I found myself nuking all of it. That was easier than trying to figure out what nonsense was causing all the problems as the Frankensteinian appendages kept falling off as I was stitching new ones on.
Copilot, lead us not into temptation
Like any vice, the secret may lie in using these vom-bots in moderation. There are also pitfalls to looking up issues in StackOverflow, right? The site even warns about the possibility of spreading security vulnerabilities when copying-and-pasting code from otherwise ostensibly helpful threads. But as that post summarises:
Copying code itself isn’t always a bad thing. Code reuse can promote efficiency in software development; why solve a problem that has already been solved well? But when the developers use example code without trying to understand the implications of it, that’s when problems can arise.
Similarly, the regurgitator bots' utility cannot be denied and the developer must simply act responsibly.
Nonetheless, for my part, I'll be using these LLMs only as a last resort. Why? Let's try this thought experiment.
Imagine that the silicon valley tech bro fantasy is realised. With a simple prompt containing your backlog, the vom-bot will write a fully featured application, packaged just how you want it. It will handle support requests, and deploy updates that are regression tested and sound. The bot will vom all this up within minutes – a task that otherwise may have taken months or years. Actually, this quickly evolves as we witness a Cambrian explosion of software. The market is not flooded with new apps per se, because the very need for an app market is made redundant. Instead, everyday users manifest new software capabilities with mere utterances, interpreted, compiled, and executed ephemerally on device and in the cloud. Maybe this software isn't even the result of a regurgitative algorithm any more – maybe the bots acquire the ability to craft novel solutions.
What is the role of a human programmer then? See also: what is the role of a musician or novelist?
I like to code. I enjoy the exercise at an intellectual level. It is inherently gratifying, and I am rewarded with satisfaction each time I push a new commit. Ultimately, I avoid the vom-bots because they steal away this sense of satisfaction and exchange it for supposed productivity. When the bots rule the world I may have to swap careers. Maybe I'll go into politics where the vom-bots are flesh and blood and in audacity alone could never be supplanted.
Nevertheless, I will continue to code just for myself. I will do this knowing that it will not contribute unnecessary carbon emissions or political disinformation. It will be my little act of rebellion, an unproductive sip of self-expressive joy.
I fiddle with this blog mainly because I enjoy doing web stuff. It's an outlet for all of the creative bits and pieces which I don't get to indulge in that often at work. Recently, I put together some logos which I think are consistent with the blog's design language.
The previous logo was really always a placeholder which I whipped together using the site's colour scheme. Over the weeks I've had this blog going I have been toying with different ideas, just for fun.
Minimal Memphis
What I landed on is pretty minimalist and became the obvious option to me after all the time I spent looking at typography for the site. I really like the Abril Fatface font that I use for titles combined with the thick fulvous underline. That's how I ended up with this wider variant of the logo to begin with:
Wide Infinicky logo, used in the footer and navbar.
I felt it needed something extra so I experimented with additional geometry until I found the blush coloured triangle. This appealed to me at a visceral level, so I didn't question it and here we are.
I also needed to make a square icon to replace the old favicon. So I took the same elements, replicated the site's background gradient, and foisted away the 'infinicky' in favour of a lower-case 'i'. In the same font, of course.
Square logo, used for social share sheet.
I am not convinced with how it looks as a favicon. It's not a discernible shape when reduced in size that much. So I made another variation which I think looks better as a favicon:
The site favicon which is a jumble of the geometric elements from the design above.
I have been watching a lot of Curb Your Enthusiasm lately, and it's only after creating these that I noticed some similarity with the Seinfeld logo:
But it's the apparently unintended subtext of the ad that has caused problems. Yesterday afternoon, the company issued a rare public apology for the ad following a social media uproar. Critics were upset both about the destruction of the objects themselves (whether those objects were physical or computer-generated or some mix of the two isn’t clear), and about the symbolism of a Big Tech company destroying art and the things used to create and consume art.
Watching this ad is like reading the unconscious impulses of a tech giant. It goes like this: “All these things that fulfil your lives are garbage — just buy our new shiny screen and throw your passions into the crusher”.
It precisely summarises how creatives have been flattened by these overgrown corporate parasites. Did no one at Apple stop to consider the obvious symbolism? The total lack of tact and awareness is a great punchline.
As Australia's tax season rolls around again, the national tax office has a familiar group in its sights: landlords.
The Australian Tax Office (ATO) this week revealed Australians with rental properties were one of three groups under scrutiny, after findings that nine out of 10 landlords were making mistakes on their returns.
I read a great disturbance in the news, as if millions of landlords suddenly cried out in terror, and decided on a new excuse to increase rents.