Where I've been; goals; what's next
Published on
Hello. How are you? It's been quite a bit since I've been on here.
In this post I am going to do some writing. It might be long, but I assume that's what we're all here for; to read and learn. I apologize if it's boring, but it is what it is.
Recently I suffered a loss in the family, and the pain it caused has created a lot of ripples in the familial network. There is going to be a lot of shifting pieces and the chess board is going to be quite different looking in a few months time. I am one of four children in the family, and I've been trying to do my part for the sake of my family.
I have a lot of mixed emotions and have had way too much time doing self-reflection. I can't say this was an unexpected loss, but it hit hard regardless and left me in not the greatest place. I try to avoid writing personally about myself, because I assume nobody is here to read about my personal life updates. Sometimes I think it's best if I close myself off entirely from a security stand-point. The less knowledge about oneself, the better, but that feels a little too close-minded sometimes. It's nice to connect to other like-minded people and share viewpoints and see what others are doing and how they ... well, I guess cope with life itself.
I don't really see me changing that anytime soon, however. I don't really connect with anyone by writing here. I chuck my writing into a void, and I get back a #<void>
object as part of the function call. Nothing more, nothing less. I don't do enough interesting activities on a daily basis to consider throwing any of that up on here permanently. I hang out around the house, play with a dog, and go to sleep. Outside of technical expertise, I find myself pretty uneventful most days. I have a few close friends and a wonderful partner I'm happy with. That's about it.
Maybe it's this analysis of oneself that leads to a void of content here. Most people love writing about themselves, or writing about their days, and I'm sure many love the idea of something like the days of old LiveJournal. Maybe I still have some stuff there from God knows how many years ago. Ever since working, I struggle to come up with interesting programming topics. I switch languages every year practically. I say "I don't like this language" then continue using it. It gets old real fast. I get bored with programming. My brain can't focus after sitting at the computer for several hours a day at work.
This self-isolation I impose on myself doesn't allow me to connect with you, the reader, any better than I have been. I've been distant, I've tried to keep it polite, and from time to time I try to write things like "hey I got covid, here's what it was like I guess". However, I never really deeply connected with anyone over my writing. I don't bring up my website to my close friends, and I've never received a message about my work online. I'm okay with that, but I'm just stating the facts that I do talk to a void with this website.
It might be the case that I am at present, running out of gas. I can't keep myself going technologically all the time, and my personal life takes precedent over that of my online life. I have obligations, chores, tasks to complete and a career to keep moving forward with. My online blog does not really get any level of priority, simply because it isn't "fun" to maintain. I enjoy media like movies, video games, and other entertainment I can share with my partner. However, I can't really "share" programming with friends. I have a strong knowledge in most things computing-wise, but no one to really "bounce" those ideas and learnings off of. It's less exciting because of that.
At some point in life, I would love to do adventure-style photo essays, because I think those are pretty neat. The internet is nice when you have pictures to share with others, and photography is a cool passion to have. But the technological aspect of creating websites is what drives me up the wall; at no point do I ever feel most current engines out there make it easy. Almost all website kits just add a ton of yak-shaving onto a ton of busywork, and the busywork in creating a proper website engine sucks.
Safe to say, I might be taking a step back from my website presence here for a time.
I think it's this down-state I find myself in that leads to less interesting content being written. I tried writing an article about some code samples I've been reviewing at work and how to deal with bad code smells, but that article stunk, and it didn't feel great. My reasoning for decisions felt weak even if I rolled changes in a professional environment. I had less confidence going into it, and I had to delete the draft. None of it felt like something I could be proud of; I think I'd rather write about code I write instead.
Part of me doesn't feel like my social life ever recovered post-pandemic. While 2020 and 2021 were problematic years for developing friendships, 2022 didn't feel quite the same with people I've known for years. Everyone became vastly divided, and the idea of the game Death Stranding, a game about re-connecting people and societies after a horrific tragedy, felt oddly way too relatable and impossible to achieve in real life. I used to come here as an escape mechanism for dealing with the lack of social interactions, but coming here I don't find the same joy as I previously used to.
So, I will announce right here and now, I will most likely not be very active for the next few months, until inspiration strikes me. It could be next week, or it could be next year. I need to re-vitalize myself with a new perspective on life and technology, and recent events have not left me with the greatest optimism about how technology is used.
I don't think I've covered my thoughts on artificial intelligence ("AI"), but I hate it. I think I mostly despise every aspect about it.
Up until maybe a decade ago, AI was a thing that sat in university classes as a fun "what-if" theory that students could use and employ in fun little projects. Write a Tic-Tac-Toe solver, write a Connect-4 solver, figure out how to deal with the absurd memory costs of memorizing entire game-state trees and estimate statistical efficiency of certain tree routes to achieve ideal game-state for a win condition. These types of classes would lead people into creating what's effectively brains for video game entertainment. Robot "AI" can be placed in games to create fun experiences to be bundled into video game software to be sold to consumers.
Think StarCraft AI fighting against a human opponent; the AI has to make second-by-second crucial decisions about resource collection and battle unit dispersion. These decisions have to be made with little memory being consumed as to have a minimal impact on computer hardware, because at the time of StarCraft's release back in the old 90's, hardware had very little memory to take advantage of. The AI also has difficulty settings to adjust how good or bad their decision making was; a parameter to guide them further away from or closer to a goal.
AI now isn't the same; there are no game-state trees. There's statistical approximations of what AI should be outputting. If someone asks a sentence, you give them an approximation of what they "want", because human language is not a formula you can encapsulate all the variables for in a closed system of equations. If it were, then human conversation would be pretty damn boring.
AI has to be trained on mass-bulk data gathered by third-world workers hoping to make a few dollars. The data has to be processed on increasingly-expensive silicon-based hardware produced by a single company hoping to rent-seek as much as possible on technology companies who want to process data. Data is then stored on massive amounts of silicon storage-based hardware in data centers across the world causing more heat and energy burn than a small neighborhood of elderly citizens. The access to this data is then played to you via an input-receiving program who can translate your words into tokens which are interpreted by a neural-network that has been statistically trained and readied for any and all sentences possible to present to you something you can speak to.
The world is going to drown in AI, and we are going to be worse off for it. Social media companies are going to fight each other over their "human data" to sell to companies hoping to make a buck off anyone trying to develop a new "AI product", when it all does the same shit. You get fake pictures or you get fake sentences. The companies who make the graphics cards, the companies who host all the data, the companies who gather learning data for AI to be trained on, all of this is what I would still consider yak-shaving. We're using AI to create fake humans to talk to so companies can hire less people, because people are expensive and machines are easier and cause less issues, meaning we have less need for "human resources" because there's less humans to deal with.
Yet seemingly, why are there no AIs to replace CEOs? If CEOs can make decisions, why can't AI be trained on all CEO decisions over the last 50 years of business and replicate CEOs to create "CEOS-as-a-service"? Wouldn't that suck for all the poor CEOs world-wide sailing on their yachts, burning barrels and barrels of fossil fuel to live a life of luxury as millions continue to be jobless?
What is even the point of AI other than to devalue human life itself? Will we need anyone for anything if we can get a statistical "good enough" approximation of what a human would do? Do we need generals in an army to make decisions if an AI can learn and do the same thing? Do we need presidents and politicans to make dumb decisions if AI can also make the same dumb decisions? Is there a point in art anymore if AI can create millions of pictures in the time it takes for an artist to paint one single painting?
I hate modern AI. It solves no problems. It creates a flood of lifeless content that humans are going to be subject to. Forums and social spaces are flooded with lifeless text. Nobody will be interacting with anyone. We will use AI to generate emails to send to co-workers, only for those co-workers to use AI to briefly summarize your AI-created emails into compact sentences. AI will analyze billions of pictures of dogs and food photos, but still can't analyze Quake replays to make a real AI opponent. Lazy programmers will use AI to generate shoddy boilerplate code for their jobs so they can code less, only for them to get replaced by the AI later when the company realizes they are of no use to them.
I want to live in an AI-free world, at least this current stupid AI world. I liked it when AI could play Unreal Tournament against you, not sell me stupid shit like AI optimizing your LinkedIn profile, or Snapchat making dumb pictures out of your selfies, or Google using AI to solve your yak-shaving. All these companies are hoping to make a quick buck off stupid shit you probably would spend more human-time trying to recreate, but giving you a pre-conceived notion that this data is going to be "correct", when in fact it will not always be that way.
The biggest offender of life itself is Tesla, with their "FSD" AI-powered driverless cars. Making bold claims like "the car can be a taxi and make money while you sleep/work" is straight-up lying and grifting at the highest level. We're being sold snake oil each and every day and there's nothing we can do to stop it. If cars are powered by cloud-based AI, what happens when your car can't connect to a server because it's in a spotty cellular region? People are being injured because of driverless cars, and Tesla takes no blame for any of it, despite being the problem. Same can be said for Waymo who routinely pops up in the news now for the same level of crap.
I don't want to touch this level of AI programming at all. If it forces me out of a career, so be it. I'd rather not contribute to the decline of society. I'll go back to school to learn a trade that means something if it ever came to that. Many are frightened by AI for fears of becoming Skynet, while I am simply straight-up disgusted by AI and the world capitalism itself.
Due to the ever-growing threat of AI on humanity, I am most likely going to do something drastic: I will remove my website from search engines and web crawlers entirely.
I have had this thought for a while, but I don't stand to gain anything from my website being in the public internet search like that. My website isn't exactly something that people are going to visit every day of their life, but my data here is mine, and I write it all with care and love. For it to be farmed by Google, Microsoft, or even damn TikTok, I do not consent. I don't want to partake in this massive data farming scam, so I will look to remove myself from public search entirely, and would rather support "better" search engines like DuckDuckGo instead.
(note: I don't think DDG is free of "bad guy status", but I enjoy DDG more than Google search currently).
My personal site, as I've come to learn, will also come to another change in the future: a domain move.
NameCheap announced a price change to .XYZ and .COM domains, which is really just another excuse for "rent-seeking". A lot of people use .COM, and a lot of people, like myself, use .XYZ for personal sites. Unfortunately this new shift is going to lead me to abandon my good old sleibrock.xyz site, and pursue something else. I have not yet decided on a domain, but I will buy another one soon, and leave this one up for grabs. I will be sure to create some form of identify-proofing so someone can verify if the new site is indeed me, should they feel compelled to do so.
I don't blame NameCheap for the sudden price surging, this is really out of their hands. They have operating costs, and I will gladly buy domains from them in the future for how simple their system is. I still transfer my supported domains to Cloudflare if possible, but NameCheap has been good to me.
I expect this change to happen within the next month or so at the minimum. I'd like to purchase a new domain this week and begin the registrar transfer as soon as possible, so I can start working on moving away from the .XYZ domain.
Lately I have been doing some prep-work in some other of my web projects to undertake the goal of designing my own static-site generator. As it stands, the project may be developed in Racket, as it's what I have bootstrapped a lot of code in already.
I have ambitions of developing something I can use across a wide range of spectrums, but I have a hard time using what's already out there as something useful. Hugo is probably the most suitable solution, but it's a little too large and I'm not sure how customizable it is. Zola is what I use now, but I'm not exactly... satisfied, with it.
I gave up several times due to the complexity of parsing Markdown files. They are pretty damn tricky, and doing it in a functional language was not simple. However, I think now's the time for me to try it out again. Before I didn't have a pretty basic thing: a templating engine.
String templating is a hard thing to accomplish mostly due to the fact that string copying is a memory allocation problem; strings have to be stored somewhere in order for them to be used. At a low-level, you have to figure out a way of reading data and then being able to write the data where it's needed, without blowing out your memory pool. You can't read large files without the complexity of memory management, so doing this in something like Zig or Rust was not something I was fond of even attempting.
With Racket, the memory management is less of a threat, so I don't have to think about memory problems. But string replacements are a little bit expensive at times. The first issue is you need to understand which parts of a string need to get replaced, and then perform the replacement operation itself by breaking apart the original template string into components you can substitute.
The simplest approach I had was to break things apart using a regular expression that can break apart two different templating variable formats, {{ ... }}
and {% ... %}
. These fit into one regex grouping expression and can break apart a string into a list of matched and un-matched strings. Depending on whatever the substitution format is, we can separate them into a different tag-based node that gets substituted with data.
For example, a template string like this:
<title>{{ title }}</title>
Can be broken down into a list that looks like this:
'((raw . "<title>")
(sub . "title")
(raw . "</title>"))
Now note that the symbol in front of each string in this new list can represent an operation that takes place. raw
means no substitution, while sub
means to substitute this node with data from some exterior source. When doing template substitution we might end up passing some data from a hash-like source of data that can look for the key title
in the dictionary.
(define (render nodes dict)
(define all-strings
(for/list ([node nodes])
(let ([tag (car node)]
[data (cdr node)])
(if (eqv? 'sub tag)
(hash-ref dict data)
data))))
(string-join all-strings ""))
This of course is a pretty version where it assumes data will always exist in the hash collection we accept. If it does not exist, we should probably consider throwing an error or a fail-code of some sort.
The harder part is implementing these features:
block
, to substitute text in other templatesfor
loops to implement iterating over dataif
conditions to execute logical statementsAdding these tags is pretty simple so long as you follow a similar format and add the correct tags to the list. Then when you try to replace each node, you have to execute sub-level logic correctly.
block
, we have to keep a track record of two types of tags, block
and endblock
. When we interpret the data, we need to keep track of these two tags, and when one block
is missing and endblock
, we know something might go wrong and can raise an error.if
statement, we need to examine the syntax and determine a logical statement. The variables used can be extracted from the exterior hash object, and "truth" can be determined based on whatever we see fit; like numerical equivalence or true/false equalities.for
loop requires grabbing the contents of the for
block (once again by using for
/endfor
tags), and recursing into a mini-template that the for
block will use to execute into a final string. Since we can really only iterate over lists, the for
block will iterate over each element, and render the template each time with a different hash object binding the iteration variable forward each time.Sub-templating with block
will be the hard problem to tackle, but it's necessary to have that in order to make modular templates. In order to do sub-templating, we need to set a base
template with something like {% base "template.html" %}
, which will set a flag inside the template engine to use template.html
as the base. With this, we now understand that we're really going to render template.html
, and then the other stuff is a bonus pretty much. We can still grok the text inside our current template and use it's contents, but there's a good chance it won't anything unless it's used in a block
.
Whew, that was very busy to describe. I am not entirely done with this, but this is the most important part of the web engine I am trying to create, and initially I will do it with Racket. Racket might not be the fastest or the most light-weight, but I will do it with Racket and slowly consider moving it to something more durable, portable and slim, like Janet.
The Markdown parsing itself might not be as difficult, but doing all the string templating is where it will be most difficult, really. I have put in as much time as I would have like into this in most recent weeks, but given what I just endured I do not know when I'll be mentally able to continue working on this endeavour.
While I do not wish to give up writing on here as part of my hobby, I am simply running out of both time and energy to keep at it competitively. I don't write a whole lot in my spare family time, I like to relax where I am able to. There are some projects I attend to in my spare time, but not enough for me to really want to write about them.
I expect my healing process for our recent loss to be slightly long, and it may impact my ability to continue writing here effectively. I would like to start a new iteration of this blog and keep it simple, and maybe a little less technical, too. I shouldn't have to feel like I need to put out technical writings and break-downs all the time; I'm human, and I can write about other things than code or Docker or whatever.
Per my Cloudflare dashboard, here are my stats for the month of August.
I think that's a pretty cool number overall, I didn't think I would ever have a monthly dashboard that ever looked like that. Nearly 4,000 people reading? Whether they're bots or scrapers or whatever, I think it's marginally pretty cool. I expect this to go down when I take my site offline from Google search engine, but none the less I am pretty proud of that.
Regardless, I have my work cut out for me in the coming months, so I hope to see you all again soon on the new domain with a bit of a different website.
Take care!