It is a “how the hell is it Friday already?” kind of week. It’s been a combination of ongoing clean-up from the ice storm, restocking, general maintenance, and a dollop of guilt. Hopefully the guilt will help me keep this short.
Over the years, like everyone else in the area, we’ve lost all but our youngest Ash trees to the Emerald Ash Borer Beetle. This has left us with a good number of logs lying about, cut to firewood lengths by the crew we hire to take them down. Cleanup from the storm is going to increase that substantially, as well as provide a big supply of smaller branches that will make good kindling. Last week we cleared some new space for a new wood storage rack, and I spent Monday afternoon splitting logs. We’ve got a little “5 Ton” electric splitter that does a great job on smaller logs but chokes on these. So I got the wedge axe and the sledgehammer out and took to splitting them old school. Man, that’s tough work, but I made a significant dent in the pile before running out of steam.
I had planned to pick The task up on Tuesday, despite some complaining muscles, but winter is still hanging on and had other ideas:
A week into April and winter is still hanging on.
There are still many other small jobs to take care of, so the rest of the day was spent getting something done, warming up, getting another thing done, warming up, and so on. Biggest achievement: getting the cable back on our laundry line, after I managed to knock it off while trying to clear it from ice. It took me a while to remember that the way to get this done is not to set a ladder in a precarious position on the tree the far end is attached to, fearing that one slip will send me crashing onto the large rocks below, but to disconnect it at the house side, stretch up (I can just barely reach it), pull the wheel assembly off, re-thread the line, hook it back up and then do the tough part, which is re-tensioning it, back at the house where it can be dropped to chest level. I’m hoping that when this inevitably happens again, I remember this instead of spending 30 minutes re-discovering a non-life-threatening solution all over again.
I also managed to release NovelWriterExtract, a tool that will be of use for a specific kind of writer who is highly analytical when it comes to reviewing their work, and who is using novelWriter as their writing tool. So, like maybe five people. But hey, I’m one of those five and I’m happy about it!
Wednesday started with a restocking run. We aim to stockpile 4-6 weeks of non-perishables with a single trip to Costco, but this time with an added layer of complexity: aggressively minimizing product coming from the country run by a tariff-obsessed madman. By the time I’d returned from that, the new resin printer I’d picked up at a decent discount for In3D arrived. I have a project that needs a big pint volume, and this thing is huge!
This box is big!
It’s so big that I had to do some significant re-arranging of the print shop. I have a mid-sized CNC machine that takes up a lot of room for nothing. It’s not in use because the amount of sawdust it creates would turn the rest of the shop into a disaster area. The printing operation prefers nice clean, dust-free, almost clean room conditions. The CNC will move to the garage, but at the moment the garage is a disaster area in need of a major renovation (not to mention a plan and a bucket of money) so the CNC sits here idle. I stole the clearance space the CNC would need to operate to move a shelf, thus giving me room to move a few other things around, which ultimately cleared space for this monster. By the time all that was done, I was both exhausted and “out of spoons”*. Setup, calibration and test prints have been deferred until I find more time.
Thursday was a trip to Toronto to go to the dentist. There are some good reasons why we endure a two hour drive each way to go for a routine dental appointment, but I won’t bother going into them here except to say that if you’re closer to the Sheppard and Warden area, look up Dr. Lindzon. I had gone in with fears that a broken tooth was going to require an expensive crown, but fortunately all that was required was a filling (okay, there’s one of the reasons; other dentists I’ve used would have had me into an expensive crown in no time, he’s more about the right level of care than bringing home the big bucks).
Then more re-stocking. First at Blue Sky Supermarket. Blue Sky is a massive supermarket full of foods you’d find in a Southeast Asian menu. If we can even find an ingredient out here in the country, the cost will be ridiculous. For example, we can buy a tiny bottle of sesame oil for $12 here or get a huge one at Blue Sky for $7. They also have a huge selection of spices and spice mixes at half the price of Costco’s limited selection. Even then, we couldn’t find a couple of items like Poha, a flattened rice common to Indian cuisine. Enter Namaste Indian Supermarket, where we picked up the last few items on the list including Poha and Fenugreek leaves.
This left us hungry, so we decided to look for fast food that can’t be found in our small town. This used to mean a quest for Burritos, but a year or so ago a branch of Fat Bastard Burrito opened in town, so this time we went on a quest for Shawarma. Our first stop was Towny Shawarama. A ramshackle pile of equipment in place of a cash register and a menu board with gaping holes where the prices should be put us off, despite a 4.8 rating on Google. Our next attempt was at Big Bites Shawarma, where staff were cleaning the front window as we approached. As my wife observed, if you’re wiping down the front window, everything else has already been cleaned. This was confirmed as we entered a spotless shop. I got a freakin’ huge Shawarma, she got a Falafel plate. Prices were more than reasonable, service was great and the food was excellent. Definitely earmarked for a return visit.
The drive back wasn’t bad, considering my low tolerance for urban traffic these days. I can still switch into “GTA Driving Mode”, which requires a strange mixture of patience, aggression, and courtesy, but isn’t much fun. As a friend once observed, the key is to be able to read the “automotive body language” of other drivers and respond appropriately. Still, driving in the city is far more demanding than the big source of complaint here, which is that sometimes it can take all of four minutes to get over the bridge. Four entire minutes! This makes the Toronto driver in me laugh, hard. Other than that, we had a mixture of snow and rain on the trip back, none of it heavy enough to be a concern.
Now here it is Friday evening. I’d started this post in the morning, hoping to fire it off quickly and get on with the day. Alas I had forgotten that we had a visitor scheduled to drop in this morning, so that plan was replaced by a relatively intense effort to clean the house. As it turned out, our guest couldn’t make it, but heck, the place looks better!
Oh yeah, the guilt. Tomorrow is the Annual General Meeting for Spirit of the Hills, our local arts association. I still have responsibility for managing our membership and over this week I have both failed to send our President a current membership report and to remind members who haven’t renewed that they have to do so before the AGM. Clearly some stuff needs to get done tonight! Then, last but not least there’s the feeling — I’m not sure which word describes it best, guilt, remorse, or frustration — the feeling that through all of this I’ve written maybe 100 more words of outline for the novel. A novel that I wanted to finish a year ago, and now each time I work on it, completion seems to get more distant. In part, I blame recently reading A Passion for Narrative, by Jack Hodgins and his emphasis on the benefits of reviewing, re-drafting, and repeatedly honing a manuscript until it’s the best it can be. This has left me in dread of being five years down the road, working on draft nine. It’s a somewhat irrational dread, but a writer’s mind can pay on them this way, and I am not immune.
* Spoons are a concept I first discovered in the autistic community. This references the limited pool of resources we have for doing things that neurotypical people seem to do effortlessly, such as interacting with other humans at a social level. At some point we run out of this resource, and are at risk of going into a meltdown. In this case, the spacial reasoning required for me to figure out how to move everything around and still make it all fit in some kind of workable configuration pretty much exhausted my abstract thinking resources, so doing any more actual work, or writing for that matter, wasn’t really possible.
A large part of running a web hosting business, which I did for nearly two decades, is protecting customers from scammers, spammers, and hackers. This was a constantly escalating battle, and now with the addition of a whole new class of aggressive AI scrapers, one of the main reasons why I got out of the business. Waging low-level warfare for two decades was enough. Time to rest.
For a flexible definition of “rest”.
The first thing I found myself doing, unencumbered by the risk of messing up customer sites, was to build a “web application firewall”. This application looks at incoming requests and applies a set of rules to determine if the query is coming from a “bad actor” or not. If it is, it takes an action ranging from delivering an error to blocking the source address in the network firewall. The rule set I have for this is just as aggressive as the AI scrapers, and this results in some behaviours that would be unacceptable to my former clients (for example, all of Meta/Facebook is blocked from accessing my sites).
One of the things I learned how to do was write rules for Spamassassin, the widely installed open source application that protects millions of users from the worst spammers. Like any defensive measure, attackers work to find ways to defeat these tools, which is why many spams contain big blocks of unrelated text at the bottom in a small font. That’s an attempt to game a Bayes filter by making the spam trigger words less prevalent.
SA rules are a little tricky to write, but with some practice, I learned to write custom rules that flagged common phishing attempts, big blocks of text in a small font, and more. None of these alone are enough to flag a message as spam, but they’re reliable indicators. cPanel allows each user to write their own mail filters, using a much more simplified set of criteria. So I set my SA rules to not score very high, then used the indicators to write cPanel filters. This gave users the power of SA without the complexity and was very effective.
But now I don’t have to worry about killing a customer’s email with a false positive. I can write rules that say if a message comes from a domain like example.ru.com and contains one of several keywords in Portuguese, it’s going straight to write-only memory. A rule like that is currently killing 20-30 spams per day.
This morning I got one of a relatively new class of spam, the AI-generated “I love your Instagram account” praising my content on IG in a way that sounds human but isn’t quite right at the same time. It’s kind of amusing to see an algorithm take a wild guess at what my accounts are about. (BTW the accounts are @alanlangford, @in3dca, and @silohouse.ca).
Time to kill that crap. Now the domain that “Maya” sent the email from, the domain linked in the email body, and an intermediate domain that the message was routed to each trigger new SA “Instagram shill” rules that let me trash the message. I took the opportunity to pull some similar rules from my cPanel filters and bring them into SA, which should make the whole process a little more efficient.
NovelWriterExtract is an application that pulls scene metadata from a novelWriter project and exports it to a spreadsheet (ODS or XSLX), a HTML page, or a CSV file. It pulls out NW’s references in scenes (@char, @location, @pov, and others) plus data in the upcoming story structure tags (see Issue 1784 for a full description).
NWE 1.0.0 is available as a PHP PHAR file; there are also executables for Linux, Mac, and windows (in the /bin folder)
Originally written as a Proof of Concept, this release introduces an extract format specification, which is written in JSON. The format file introduces some powerful formatting and filtering capabilities. A format can select specific columns and do things like bold the first occurrence of a character, location, plot line, etc. Check the project’s readme file for more information.
SQL was invented as a way to let “managers” (or more broadly, people who are not coders) extract information from databases.
Obviously, this was a good idea. Another good idea would have been to publish an interface that standardized programmatic access to the database. That layer has to exist somewhere, and if an API had been made available that incorporated the same abstractions as SQL does, odds are that it would have caught on just like SQL did. Over the years it would have become a standard, vendors would have competed to get their extensions accepted into the standard, and as object store databases and key-value databases emerged, the standard would be extended to embrace them.
Instead, we have hundreds, probably thousands of “database abstraction” layers that convert a programmer’s requirement into a SQL statement, thus making SQL itself the de-facto API. The query then gets parsed by the database server into something that must closely parallel the calls that went into the abstraction layer.
If SQL had come with a database access API that paralleled the query language, millions of developer hours would have been saved, let alone uncountable machine cycles. And maybe, just maybe, that API would have abstracted the nature of the back end database, so we’d have a single, unified API for interacting with “things that store data”, including filesystems.
Wherein I learn that mastering a language is necessary but not sufficient.
My Introduction to Programming
I caught the programming bug early, at 12 or 13. It was essentially an accident. For a time, we lived near the main York University campus on the Northern edge of Toronto. On weekends I’d ride my bike over there and go exploring through the buildings, sneak into the library and read a book (at the time I was deeply into electronics and desperately trying to understand the physics of semiconductors. Vacuum tubes made sense; introducing impurities into silicon crystals to take advantage of quantum effects was much harder). Weekends on campus were eerily desolate. Most buildings were locked, but every once in a while I’d find a door that had been propped open and slip in. Born to hack, as they say (if they don’t say that, they should).
One day I’d “cracked” the Ross Humanities building. What a goldmine that was! The math department, Senate chambers, so much to explore. Then I came to a hallway and there was unexpected noise. People. Machinery. Curious, I inched closer and peeked into the room that was this anomalous hub of activity. There were students (who were fully developed adults in my young eyes), card punches, a fellow behind a desk who took card decks from students, placed them in a card reader, and then a few minutes later returned the cards along with fan-fold sheets of paper from a noisy line printer. I had to go in.
Naturally, I didn’t know it at the time, but this was the moment that set the course of the rest of my life. All because of that fellow behind the counter, who I still wish I could track down and thank.
There was some ASCII art (actually in this case EBCDIC art) on the wall. I asked the gentleman how that was done, and instead he taught me how to write a loop in WATFIV (Waterloo FORTRAN IV) to print out the numbers from one to ten. That was it, I was hooked. Critically, he also showed me how to appropriate the account numbers of students, so I could continue running programs. Born to hack, they say. This came with a caution that I must only use WATFIV, for students had unlimited access to that, but other languages came at a steep cost. Over the next few years there I was caught more than once and either told to stop using the purloined account or given permission, with the “only WATFIV” admonition. Fortunately, acquiring a new account was trivial, all one had to do is read a number off the card at the top of a deck and then reproduce it.
I had brought my best friend into this scheme and we made some progress in learning the language. I got a copy of the language reference and was figuring out the merits of things like subroutines.
At some point, we got well and truly busted by someone in the computing department. As punishment for our crimes, we were given our own accounts and shown how to run APL, a language that had it’s own unique syntax and a character set featuring Greek characters and over-struck composites like ⍫. This required that we sit at actual interactive terminals (IBM 2741s) with a specialized “typeball” for APL.
More than half a century later, I’m still writing code.
English, the Language
I remember waking up in my crib one day, looking at the wooden blocks on a shelf in my room and realizing that a graphic, the red tent-like one with a crossbar was an A, and that it meant something. I’m guessing I was somewhere between two and a half and three at the time.
My parents were intelligent and well-read. Even though I was going to lose my father less than two years later, I grew up in a house where language was important. At school, my English marks were generally good (despite the oft repeated comment “Alan would do much better if he didn’t spend so much time day-dreaming”, something that these days would have led to an ADD/Autism diagnosis).
I recall complaining to my mother in Grade 2 that going to school was causing me to lose my vocabulary.
Still, my spelling sucked, and I pretty much decided to ignore the lessons on grammar, so that even to this day when someone says “adverb” I have to pause for a moment to remember what that means. Not that I can’t use them adequately, I just can’t name them. That’s an autistic attribute: once I’ve decided I don’t need to know something, reversing that decision is damn tough. My brain locks in to the first decision and does not want to budge.
When I got to first year of university, the administration had decided that high schools were no longer doing an adequate job of teaching English, and that each student must now write a competency test, with under-performers being required to take a remedial course. I was terrified. I had finally gotten to a place where I could study what I wanted, and I feared that my crappy spelling and grammar-resistance would consign me to yet another English course! Aughh!
The results came in and I placed in the eighth decile. Eighth. Now I know why they needed to do the tests. Incomprehensibly, I was spared.
Existential Crises
Somewhere in my late 20’s I was having the sort of “what am I doing with my life” existential crisis that is probably pretty common for people of that age. I sat down with my notebook and did an analysis of my skills, what I enjoyed where I thought I could lead a useful life. By then I had come to appreciate writing code as an arcane art form, one where the art itself is invisible. Only another practitioner who reads your code is capable of appreciating quality work, and even then the best work will never exist for long. Technology moves along rapidly. The most elegant code from five years ago can easily become the legacy crap that’s holding back progress.
What could I do that had more permanence? I could write!
The only problem being that I could write words and be destitute or write code and pay my bills. So I kept writing code, but always working to master English, this Borg of languages, always assimilating from other languages, always evolving. All while entertaining the idea of becoming a writer.
A Random Walk in Search of Authorship
In the early days of the Internet, I connected into USENET and found a community of writers (one I miss to this day). One of the things the group did was serial stories: someone would start a story, another member would add a scene, and then someone else would add another. I had a little fun with this, but… just say that my aesthetic was at odds with most of the group. I have a bit of an affinity for writing like that of Harlan Ellison and the sort of stories one might find in an episode of The Twilight Zone. My contributions to a story could take it to darker places and were often met with comments like “interesting”, with nobody making subsequent contributions.
Then AOL connected to USENET and that was the end of that.
Some time later I started to blog, writing relatively long posts on whichever topic happened to come to mind, much as I will probably be doing here. Successful blogs seem to focus on a subject area, becoming a reliable source of information on the topic they cover, or they follow someone with an interesting life (a nascent form of “influencer”). I can’t do that. I get bored. I’d post on politics, marketing economics, software development, scams, and more, essentially at random. It actually went well in the early days, when I was getting some significant search engine rank. I got a little traffic, and more important, I got comments from actual people. Then the SEO hackers figured out how to game Google, then Google changed the algorithm, and that cycle repeated many times, each time with me not interested in tracking trends. Now I use my original blog to post random rants, insights into software or hacking, not much more.
I do plan to mirror what I post here over there because like everything else that’s headed to an IPO1, I expect Substack to go through multiple iterations of enshittification in search of more revenue, and at some point I want to pull the plug without losing my work.
At the same time I worked to hone my ability to communicate humour through platforms like IRC, Facebook, Twitter, etc.
I figured these things would help me become a better writer. I was right and I was also horribly wrong.
Writing Fiction
Over the years, I’ve accumulated a list of things I want to write about, mostly science fiction based, but some non-genre fiction too. A few years back, as I started to plan moving away from writing code and running my hosting business, I figured it was time to start turning those ideas into books. This only four decades after figuring out it was what I should be doing. Ugh.
I ran into a wall. A big one. The tell is in a sentence above: “ideas into books”, not ideas into stories. So I embarked on learning storytelling. Storytelling. What a vacuum in my skill set! I picked up a couple of online courses, all basically formulaic three-act structure guides. Not that a three act work is a bad thing, but it’s also not enough for a great story. Then Susan Statham, editor of the anthology that contains my only published short story to date, suggested The Story Grid, by Shawn Coyne. With that knowledge, I took my first crack at a novel. While the start was (and is) encouraging, I became less and less happy with it as it ground to an unsatisfying conclusion.
I put the story on the shelf for the better part of a year and did a little work on the next novel. I read The Anatomy of Story by John Truby and used it for a critical assessment of my plot. Although these books have an understandable subtext of “how to write a story that will be the basis of a great screenplay” (because that’s where the real money is), they gave me the insight I needed to go back to the work and revise the plot until I got something that I think will work. At the least it’s enough to get to a “second first draft”.
Revising the work and integrating the new subplot that gives the story necessary breadth has been challenging, and slow going. Far too slow for my liking.
Neural Pathways and Transitioning
Part of the slow progress in picking my novel back up is down to a lack of practice. It’s more than a little frustrating that I can sit down and write an essay like this in one go, or that I can spend several hours working on a complex application, maintaining a vast amount of detail in my head, but I can’t yet do that when writing a novel. I find it difficult to maintain that writing head-space, distractions are harder to filter out, momentum is hard to find.
It’s also frustrating because I’m measuring five decades of coding against a few years of writing. Unrealistically, I want the level of focus I get when writing that I do when I’m coding.
I know this will come with practice, but the frustration is not only slowing progress, but it’s taking some fun out of the process.
New neural pathways can’t come soon enough. I have stories to write!
1 My reverse acronym for IPO is “It’s Pretty-much Over” since a public offering marks the point where the major stakeholder in an enterprise shifts from the users to the shareholders and the focus becomes maximizing return on equity, and not what users want. When Substack IPO’s, get ready to find a new home.
Recent Comments