Friday, April 30, 2021

On Cyberpunk 2077's Writing

I didn't really want to write this post, but I think I ought to, just so as to capture a moment.

I've more or less cleared all the side quests that are available in Cyberpunk 2077, and am in the last legs of the main quest line. Translated to regular English, it means soon, I would have completed the game.

The story-telling isn't as strong as The Witcher 3 (I suspect it is something about deriving from an existing literary series versus a world-building rule-book), but the romance-able characters (Panam, Judy, and River---these I have seen so far) have very strong stories. I'm not going to spoil them [too much], but I just want to share that each of their story moments through their chain of side quests are very compelling.

V sryg gur cnva va Cnanz jura fur gevrq ure orfg gb qb jung vf tbbq sbe ure Snzvyl, qrfcvgr bccbfvgvba sebz gur ervtavat cngevnepu. Ure riraghny npprcgnapr nf n yrnqre bs gur Snzvyl vf n gbhpuvat zbzrag. V sryg gur fnqarff naq ihyarenovyvgl va Whql nf nyy gur crbcyr jub pnerq sbe ure crevfurq sbe bar ernfba be nabgure, zbfgyl qhr gb pvephzfgnaprf. V sryg gur cebgrpgvir angher bs Evire nf ur gevrq gb fnir uvf snzvyl guebhtu bgure zrnaf jura gur pbeehcg bssvpvny zrgubqf ner cebivat gb or erfvyvrag gb whfgvpr naq gehgu. Gur pne enprf gung V qvq jvgu Pynver jrer punyyratvat, ohg V sryg vg jura fur erirnyrq gur natre fur unq ntnvafg gung bar pbzcrgvgbe jubz fur nggevohgrq gur oynzr bs xvyyvat bss ure uhfonaq (qevire) va gur enpr gur cerivbhf lrne. Naq V pnaabg sbetrg zl byq pubbz Wnpxvr, jub qvrq orpnhfr bs gur obgpurq wbo gung pnhfrq gur znva dhrfg yvar va gur svefg cynpr.

The writing and delivery of the lines for these quests that count are really alluring and help flesh out the characters. At some fundamental level, I think the dialogue of the romance-able characters really touched something in me, a weakness from recent... events? I think that the loss of five years of that safe feeling of someone who has my back is starting to get to me, as the next phase of my sabbatical kicks in, the one where the social isolation gets stronger, as people start to realise that I am actually taking my sabbatical seriously and am not really that ready/interested to start work again.

I don't want to speak ill of people---this is just human nature---but it seems to be the case here. Genesis 2:18 says ``And the LORD God said, `it is not good that the man should be alone; I will make him an help meet for him.' ''. I think I'm feeling the effects of the lack of [most] forms of human intimacy now because of the emotional content that is within the writing for Cyberpunk 2077. A well-written game is at least as strong as a well-written book, the main difference that the delivery of the game can include additional elements to help suggest a particular set of emotional responses, while the book requires the imagination to do most of the heavy lifting.

No, it is not yet a sign that I am ready to date. This is Singapore---to date requires a sort of exchange. I don't have anything valuable to exchange now, considering that I have no job, no wealth, am not exactly attractive, nor am I powerful. More importantly, I'm still not completely comfortable in my skin for the new roles that are upcoming, and trying to be involved with another person is just a bad idea. As it stands, all I really have to give for exchange is my life---this seems to tie back again with the whole ``full-circle theme'' from the SMS Musing earlier today.

It's okay. This too, shall pass. Thankfully I don't exactly have many intrusive thoughts of suicide; I just have general thoughts of being a misfit in the society I am currently embedded in. Whether or not this is a better alternative remains to be seen.

This is no indication that God has failed though. I know my future after my mortal death is secured, so that's not where most of my worries lie; most of them lie within this mortal realm, strangely enough. Now, about what, exactly, is something that me and anyone else who reads all these blog entries need to deduce from what has been written.

Remember, I write here as a cathartic release of things that are in my head that can be publicly consumed---those that cannot be publicly talked about goes into a dead-tree version that does not reside anywhere near the 'net. Once these words leave my metaphorical mouth, they hopefully leave my immediate thought sphere, thus potentially allowing a different perspective to be synthesised from the thesis and anti-thesis.

If ever there is a summary for what I had written, it would just be this: I really don't do well with endings---they always make me sad. And if the endings are sad, they hit me just that much harder as all the sadness multiplies upon themselves. Anyone who still thinks that I'm some emotionless thinking machine... really hasn't known me well enough, and if they are someone I had known for a while, I would just be disappointed in them.

Oh Lord, I cast these sad feelings to You, for it is You who is my anchor point, my cornerstone; for You are my sword and my shield. I pray that you will protect me against the harms of this world according to Your Will, and that the suffering of any sort that I may undergo, no matter their severity, is in accordance with what Your Will is. I pray all these in Jesus' name, amen.

And with that, till the next update.

SMS Musing #12

While lounging at Gochi-So Shokudo waiting for the delivery of my ordered Teriyaki Iberico special set:
As I scour through my contact lists on Telegram and/or Whatsapp, I cannot help but think about how after thirty years, life has seemingly gone full circle. I started my life alone with my parents, then had a sister, then went to school where I made friends, most of whom didn't last, served my national service, left with no lasting friends, studied overseas twice, given the opportunity to start a new life in a place where my kind is not just tolerated but welcomed, decided to forego all that in the name of principles like honouring promises and loyalties, fell in and out of love with different types of futures, and while everyone seemingly has "grown up", here I am, back with staying with my parents alone, practically friendless-ish, jaded with everything thst is happening in the industry that I had once thought I would stay in and make a difference.

Perhaps I'm one of those perpetually bitter dilettanti, always feeling that the society that I was in was always wrong in some way, making myself out to be some kind of outsider.

I'm not really sure about that though. As the days go on, side thoughts about whether I truly belonged to Singapore kept on surfacing in my mind. In some ways, perhaps the "system" has failed me, but perhaps in some other ways, I have failed myself. I believed too much in my ability to control my fate, and even as things got progressively less ideal, I kept on believing that as long as I kept on thinking, I would be able to think my way out of things.

Naturally, nothing ever works that way. Hindsight would reveal the breakdowns over time that aat that point I would bot be able to see.

But of course, it is easy to fall into such thought patterns due to the foibility of being human. It is easy to forget that far above sits the Lord, and He has His great plan from which I am to play a role in. I think I know of at least one point where it would be hard for me to deny myself to pick up my cross to follow Him, but with Him, nothing is impossible. It is always heartening to remember that I am God's adopted child now, and that I can cast my fears and anxieties upon Him.

A sign of delusion from one who has read/studied so hard that one's perspective is warped to the point that any sort of relief would be greeted enthusiastically without reason? No. I think it's just the natural realisation that would come when one objectively observes that one is only a miniscule part of society, let alone the universe, and that one's size is too small to matter in the big picture. God is the big picture, and it does take aa little getting used to the fact that one's life really isn't one's own. It's easy to fall into that complacency because we literally live only in our bodies all day all the time; that proportion of time spent is the reason why most are self-centred. But take a quiet night, and look at the darkened skies, and observe that each star seen is but one of a million more that we cannot see, and that each visible star is as large as or even larger than our sun, and it will be quick (and mind-breaking) to realise just how insignificant we are.

I may have gone full circle, but I don't need to fear the future, for I am safe in my Father's hands. Amen.

Thursday, April 29, 2021

Improving the Prettyprinter and a Random Rant

Ah Thursday. I want to say that I have done a lot of things, but the reality is often very different. I chilled and stared off into space a lot today. But a little more of that in a bit. Let me quickly summarise the more... concrete things that I have done.

I mentioned nearly a month ago about how I used MutationObserver to re-execute the entire tree-walker to ensure that any newly added nodes were pretty-printed correctly. I also mentioned that to do it correctly would require the careful tracking of what [type] of nodes that needed to be adjusted, and what to ignore. What I didn't mention was that part of the difficulty lay in the hard-to-maintain nature of the tag-pattern checker.

I solved this problem recently, so it seemed like the best time to address the efficiency issues of this more thoroughly this time round. I refactored the code that was to determine if a particular HTML5-node was supposed to be processed or not using the updated tag-name matcher, as well as to bring out the special ``ignore me'' class. This refactoring allowed me to do two more things to make the MutationObserver-based code more efficient:
  1. Check if the tag-name/class of the node is to be processed;
  2. Recursively walk from that tag-node down to its children.
I only faced one issue, which was how to ensure that all descendants of node-trees who had an ancestor marked as ``ignore me'' do not get processed.

My original plan was to walk up the parent nodes until we reached the root of the process tree (body-tag, in this scenario) or a node that said to ``ignore me'', returning an appropriate response. Naturally this was slow since I was doing O(n log(n)), assuming the worst case scenario of adding n nodes with an average tree-height of log(n). Then I tried to memoise the parents, but it was stupid for different reasons.

Then the answer hit me: since I had to walk through the tree anyway on the first load, why not just propagate any such ``ignore me'' class information down to all the children, so that if there are any new nodes to add, I just need to check the parent for such a flag, and if it exists, to propagate it down while doing the right thing. It would be the same as memoisation, except more efficient and significantly less stupid.

And that was what I did. Now that code is more efficient than before, and I am glad.

------

I didn't do any ``real'' reading, having only touched a bit on SCP Foundation Tome 5: SCP2000--2499 (page 952/2863). These SCP Tomes are in Mobi format, and thus they get reflowed all the time. This means that the actual page numbers matter less than the proportion they represent. The only reason why I even managed to read one SCP entry was because I was waiting in line for a snack that I was getting from the nearby food place.

I played more Cyberpunk 2077, clearing more side quests in Night City. It's cathartic to be running about in a ray-tracing enhanced game world. There is that subtle difference that makes it that much better than without any of the ray-tracing. Driving along a road after an in-game rain looks very different; all that subtle reflections and distortions in them. I guess the way graphics programming works over time and increasing graphics cards capabilities isn't about expanding the visible horizon, but to increase the details of things that are much closer. I mean, I play Minecraft too, and I will say that most of the time, one is really just interacting with a sort of ``close'' environment as opposed to the God-eye view of the world that requires large expanses of the land to be brought in to play.

Such technology limitations [of having the appropriate processing bandwidth to bring in information over a larger area for a wider visual horizon of processing] are often carefully camouflaged by the game design---in old school game engines running on old hardware without such capabilities, one would notice that level designs would attempt to draw out the strengths of the game engine while hiding the weaknesses, from the many elevators and corridors that hide the loading times of large area maps, to wide arenas that somehow seem to have just enough obstacles to make it nearly impossible to have a completely unfettered view out to the horizon, or the exact opposite of the Serious Engine by Croteam that eschews fine detail to support big and open areas with many mobs.

In many ways, there is a parallel of game design + technology against music composition/arrangement + skill of players. Good game design (music composition/arrangment) emphasises the strengths of the technology (players) while de-emphasises their weakness, to bias the consumer (audience) towards a more positive impression of the finished work. So in an objective sort of way, there is a decent enough bar to measure the success of a game design + technology combination, as there is a decent objective way of measuring the success of a music composition/arrangement + skill of players.

But these objectivities are then tempered against the preferences of the individual.

This idea of objectivity which is further projected into subjectivity can be seen as the driving concept of a lot of machine learning and data mining.

The big wins are already there---we're talking about the stuff that can already provide 75% precision/recall/F1. We know, objectively, that the big wins are already here because we already have textbooks that describe these techniques as though they are fact (compare with the discussion of Newtonian physics, at least at the early education levels). But large companies that had already been winning on these ``cheap'' but high impact tools want to raise the barrier of entry higher, and that is why the whole spiel on ``personalised machine learning'', or whatever the current marketing buzzword is.

However, the lines really aren't that clear-cut. It may seem to be better to allow machine learning algorithms to seemingly tailor their outcome to a person according to his/her personal data, but that method suffers from the literal lack of good quality data. Or put in another way, a data-driven algorithm that is trained only on [say] your data is not likely to perform well, even for you.

This is because all data-driven methods are necessarily interpolatory in nature. I would go as far as to claim [without proof] that using mathematical formulae alone to extrapolate will never get perfectly bounded variances, because dynamic systems are chaotic in nature.

Thus, the best way to hedge one's bets is to try and increase the sample size, which paradoxically means pooling ``similar'' people's data together so as to train a more strongly predictive model for the ``personalised machine learning''. Part of the black magic then is how such ``similarity'' can be determined. All these are non-trivial, and most require stupid amounts of data to do anything useful.

I mean, if a problem does not require stupid amounts of data to help fit some machine learning model, then it should be straightforward enough to write an old fashioned [sequential] program to solve it. That's the whole study of [classical] algorithms in computer science for anyway. It is because there are problems that we don't know the right representation for that we find that using a data-driven (i.e. data-based reconfiguration of the program skeleton, which represents the expressivity) to be superior.

In human terms, anything that doesn't reduce to a [low Kolmogorov complexity] heuristic that we can tell someone gets lumped into the catch-all of ``intuition''.

I don't know what this all means. But I have been staring randomly into space and mulling about this on and off.

I think I'll head back into Night City after this post goes up. Wanna enjoy more of that sweet-sweet graphics and gaming fun.

I also want to point out that the recent large number of anonymous comments was more amusing to me than alarming, mostly because it was anomalous. They are definitely not troll/spam levels of anomalous, but as someone who was trained in machine learning/data science (urgh I hate that term), observing patterns and anti-patterns is a thing.

Alright, that's all for now. I think I'll go work on the next Bible study session worksheet tomorrow, and maybe watch Futurama. Yes, I have decided to finish that for the umpteenth time instead of Darkwing Duck. But we'll get there... I do have more than half of my sabbatical left to go.

Till the next update.

Wednesday, April 28, 2021

Slow Day With Anon.'s Comments?

Compared to yesterday, today's rather sedate.

Apart from the usual Bible in One Year 2020 With Nicky Gumbel (day 355/365), I didn't do much reading. I didn't even watch many YouTube videos either.

I did spend quite a bit of time in Cyberpunk 2077 clearing out side quests. It has been a while since I last visited Night City, and I think that it is roughly the right time to head back there for a bit, to enjoy the nice scenery and side quest stories. Hotfix 1.22 did just drop in a couple of hours ago as I was watching the last few episodes of The Daria Restoration Project while ekeing some runs on Jupiter Hell (none of them successful), and so I'm probably heading back into Night City after this entry goes out.

There has been a rash of anonymous comments to various entries on this blog, which made me scratch my head a little. It's not normal to have people respond to my blogs, and usually they are from people whom I know. At least these anonymous comments so far are not triggering off my in-head spam/troll flags yet, so I suppose that's a good thing.

That said though, I would advise anyone who takes my blog entries as a common/everyday affair with sage-like wisdom to not believe too hard into that. All these near-daily entries are not really planned to last---they are happening as they are because of the fulfilment of the routine that I set out for myself for this sabbatical. Still want to note that the primary audience for this blog is still myself, and whoever among my friends who are still following vicariously, so expecting a consistent output of a modern ``content creator'' is sheer folly.

That warning is as much for me as it is for the reader.

Anyway, that's really all I have for today. I think at some fundamental level, all that excitement over the past two days in sorting out various weird technical issues have taken up quite a bit of energy, and so I am more likely to just take it easier today.

After this entry is published, I will go address some of the new anonymous comments that came in. I still think of it as strange...

Till the next update then.

Tuesday, April 27, 2021

Impossibru!

Okay okay, I know I've written too damn much today.

If you haven't figured out just how much I have written, just check out the last three entries here, and the third part to Print Me.

I should really stop, but I have just cause!

I went back to my favourite bar for some reading and writing recreation with drinking. The owner of the franchise happened to be there in the afternoon supervising some adjustments to the decor and we talked just for a moment. Ever since he had a new bar running out at Bencoolen St, he hasn't really been showing up at the one at Tai Seng, which was why he hired a bar manager in the first place. It was nice to see him and chat for a bit.

One thing that I had to do today was to appease the craving for a burger. Now, my favourite bar does have a good burger (it's also beer+burger promotion day), but the last time I was there, I noticed that the menu had been updated to include the Impossible Burger.

What better way to support my favourite bar (thus keeping its existence through patronage) than to try out this Impossible Burger?
It looks like a regular burger, and has the texture/flavour of a regular burger patty. The only caveat is that it is more medium-well than medium-rare, which probably reduced the flavour of the ``meatiness'' by quite a bit. I usually like my burger patties medium-rare for a more tender flavour, but it is not something that should be ordered unless one is certain about the provenance of the patty---it has to be fresh, otherwise we're looking at possible gastro-enteritis issues.

Overall, I think the Impossible Burger has achieved what it sought to do---it was definitely much closer to the flavour/texture of a regular burger than any of other soy-based mock-meat burgers that one might get from a Chinese vegetarian restaurant. But with a price premium of about 25% [at my favourite bar], I don't see it replacing the regular burger soon. To be fair, that premium is roughly on par with mock-meat vegetarian burgers as well, so there might be some commonality there.

Okay, that's all I want to write here. Need to take a break---I think I have easily written upwards of three thousand words throughout the whole day over different segments of the day; it's a little... unnatural. But I blame it on doing stupid things at stupid o'clock.

Till the next update.

Regex Fun from Radix Trees

Despite sleeping at stupid o'clock, I found myself up at when the sun is up.

There isn't any surprise there.

What is truly surprising is after fixing the prettyprinter script to take care of the correct HTML5 nodes, I was dissatisfied. Mainly because I am using a regular expression to identify whether the provided HTML5 tag is one that I should recurse on or not.

That in its own isn't a problem. The problem comes when I want to make the expression not as long as the dumb enumeration mechanism, mostly because this JavaScript file is almost always loaded in all my pages that I author, and so ``every byte counts''. The relevant HTML5 tags share certain common prefixes (like h1, h2, h4), and in some cases, common suffixes (like figcaption, caption) as well. Thus, one can collapse some of these, for example h[124] instead of h1|h2|h4, and (fig|)caption instead of figcaption|caption.

The reason why I was lazy in the first place was that I was doing all these collapsing of cases by hand. It's stupid, error-prone, and unsystematic, not to mention a real pain in the ass to update/fix.

Naturally, I wrote a Python3 program to do the job for me.

The basic idea was to construct a type of radix tree to incrementally add each relevant HTML5 tag, before generating the associated regex using an in-order traversal. The splits are on the longest common prefix of the HTML5 tag, and any recursion on the children nodes just form parenthesised sub-expressions in the ensuing regex.

There's obviously no guarantee that the radix tree itself generates optimal length regexes, and frankly for my purposes it is not really needed. I just want an automated way that does reasonably efficient compression of the regex denoting the set of tags of interest, though the moment I wrote that past line, I am suddenly reminded of Bloom filters, of which I already have a working JavaScript version that auto-scales to any specific false positive probability threshold. But the machinery for that is messy, and increases the total number of bytes for the JavaScript file.

I added some micro-optimisations to the generator code as well. One of them is to collapse many single-character child-nodes into a single character set, i.e. from a|b|c|d to just [abcd]. The threshold where this starts to win is when the number of such single-character child-nodes is greater than 3 (they break even at 3), though this threshold is thrown out of the window if all the child-nodes are just single characters, i.e. a(b|c) versus a[bc].

The other is to handle common suffixes. The prefix-biased radix tree cannot detect common suffixes for collapsing (by design), so ul|ol to [uo]l isn't something that can be done. The hack I used is to look for all non-recursive children trees and construct a prefix tree of reversed strings, which is a suffix tree in disguise. There are some edge cases to take care of which are not important, but those are taken care of eventually.

While I was expecting to see [uo]l, I actually saw this optimisation used in s(|(ectio|pa)n|...) instead, which I find to be cute. This happened only because I expanded the list of tags I cared about since I now have an automated way of generating the hairy-looking regex.

Alright, that's enough nerding out for now. I'm going to head out to... wherever as I vaguely planned.

Till the next update.

Mobile Setting is Broken in a Different Way, But At Least It Shows Up Properly Now

Sometimes, I hate myself.

If you pour through all the text, you will find that I have described the problem. Take particular note of this paragraph:
Notice that I kept on saying ``desktop version''. Because it turns out that there is a hidden set of theme information that Blogger did not expose that handles the mobile layout. Even if I set the mobile layout to be ``custom'', it would still be drawing on the ``simple'' theme and ignore anything that was changed in the main theme's HTML. And any changes that I made to the HTML will immediately revert the mobile setting to using ``simple'', and to get it to look roughly like the Icy variant of this theme by Awesome Inc would require me to manually re-set it in the mobile theme settings.
Ever wondered how I knew all that?

That's right. Staring at the contents of the generated HTML page yielded the line that looked something like
<body class="mobile icy-variant">
...
The bloody thing was staring at me then. Why would the <body>'s class be generated like this?

I dug into the HTML file for the theme and found the generator information for that class and removed the bit that added the stupid class for one of the other themes.

Essentially, I took this:
<body expr:class='&quot;loading&quot; + data:blog.mobileClass'>
and changed it to this:
<body expr:class='&quot;loading&quot; '>
And what do you know, I get almost exactly the theme that is the same as the desktop version.

🤦‍♂️

The only snafu is the positioning of the date---it is sitting too close to the blog description. I spent/wasted nearly 30 min to try and adjust it away, but to no avail.

But you know what, I'm done. I said I would deal with it in the morning, but well, I couldn't, and I have succeeded. It's probably a janky hack that might bite me in the ass at some point in the future, but I am happy that I have finally gotten something much closer to my vision working over the mobile settings.

That's it. Shower time, and then bed time.

Till the next update.

Nope... Mobile Setting Is Still Broken

Goddamnit. The prettyprinter script is not loading in mobile form.

It's too late in the night to deal with this. I cannot deal with this now. I'm going to turn off the stupid mobile setting mode---maybe I will keep it turned off until I find a solution for this.

Aaaaargh.

Monday, April 26, 2021

Still a Sunned Day, But At Least Stuff Got Done

Argh. I tried my best, I suppose that counts for something.

Readers of the so-called ``desktop version'' of this blog should notice something very different as compared to before. As noted yesterday (wow, was it really just yesterday?!), I updated my personal domain to use the Atkinson Hyperlegible font by the Braille Institute of America.

Then I looked at this blog, and I sighed.

Between the two, I think I write way more here than in my personal domain, mostly because as a blog, we are talking about a more dynamic state of content creation/publication as compared to my personal domain. The whole purpose of the personal domain was to off-load highly static and information dense material, which it serves well. So yes, the update of my personal domain to make use of the Atkinson Hyperlegible font is great and can be considered a good proof-of-concept, but it will definitely benefit all my blogs better.

The first attempt involved me adding some new CSS and modifying the theme's template to use the defined fonts. I immediately ran into two problems.
  1. Blogger does not support CORS, so I cannot just use my hosted fonts;
  2. The list of fonts that are supported in the theme template are only the selected few from Google Fonts.
Argh.

Mitigating the first problem was easy: I could embed the WOFF2 file as an in-line Base-64 encoded data URI. The WOFF2 files are not terribly large, and after setting up the correct CSS incantations, they were only around 91.6 kB, which isn't that big as far as web-pages go (a quick sample check on this blog's landing page had Chromium reporting a total transfer of 939 kB for 1.9 MB of resources, with a load time of 2.36 s).

Mitigating the second problem wasn't too hard either---I just needed to choose the ``Edit HTML'' option under the theme selection page in Blogger and manually add in the font name to the list of font-families, while tweaking the sizes, increasing the old size of 13 px to 16 px, and scaling all the 18 px ones up to 22 px, as well as setting the blog title's 40 px to 49 px (basically applying the scaling factor of 1613 to all the pixel-count dimensions).

Doing that, and fixing something broken about the pretty-printing script about recursive node ignoring (it was doing the right thing of ignoring children nodes when told to do so, but I had been lazy before and didn't write up the necessary list of HTML5 tags to not skip the recursion on; that laziness led to a whole bunch of janky flags that I finally refactored and tossed out) led to what you can see here in the desktop version.

Notice that I kept on saying ``desktop version''. Because it turns out that there is a hidden set of theme information that Blogger did not expose that handles the mobile layout. Even if I set the mobile layout to be ``custom'', it would still be drawing on the ``simple'' theme and ignore anything that was changed in the main theme's HTML. And any changes that I made to the HTML will immediately revert the mobile setting to using ``simple'', and to get it to look roughly like the Icy variant of this theme by Awesome Inc would require me to manually re-set it in the mobile theme settings.

Since the mobile theme information is hidden, there is no way to adjust it to use Atkinson Hyperlegible, and so it looks... like it has always been since the change of the theme.

So that's it. Now all my blogs are using Atkinson Hyperlegible as the font, like the old days when I switched out ``Trebuchet MS'' for ``Candara''. Unlike the old days where there was no font embedding technology, this time I am almost guaranteed that all modern browsers can actually render what I want, except when it is in mobile mode (argh).

I am happy with how much more readable this is now.

------

Psalm 96:1--3:
96 O sing unto the Lord a new song:
    Sing unto the Lord, all the earth.
2   Sing unto the Lord, bless his name;
    Shew forth his salvation from day to day.
3   Declare his glory among the heathen,
    His wonders among all people.
Singing is a part of the worship of God. Psalm 96:1--3 tells us that when we choose a song to worship Him, we need to ensure that:
  1. The song declares His glory;
  2. The song points to Him; and
  3. The song is in the splendour (or beauty) of holiness, that is, to be reverent and set apart from the normal part of the world
That is one of many important things that I have learnt so far in my journey of faith.

Singing as used in worship is now allowed, and with that is my participation in the singing part of the worship service itself. I've always had a tendency to veer towards singing in the female vocal range, mostly because that's what I had been listening to often. But after the first couple of worship sessions that include congregational singing, I think I will stick with the bass range (E2 to E4) for two reasons:
  1. Much of the congregation seems to sing high, leaving the lows really empty and non-resonant;
  2. I have been assured by Chara back in the day that I actually had a low voice.
I also found that I could sing the worship songs that low anyway.

On a whim, I decided to measure just how low I could go. The spectrum analyser said that my lowest non-vocal fry range is about 82 Hz---this is an E2 with no octave stretching in both A440/A442 12-TET standards. If I have warmed up, I can go as low as 73 Hz, or about 2 semi-tones lower than E2 with no octave stretching.

I didn't realise just how low I could really go. I mean, I'm used to living with my voice, and never really tried to quantify and record the quantification. Incidentally, I'm not exactly tall (I'm under the average male height of 1.73 m as listed here), and I don't smoke, so knowing that my voice is that low is a surprise. Of course, I'm not at the range of the oktavist yet, though basso profundo does have a ``natural'' low of C2, which is totally reachable. I'm quite sure I am unable to reach A1 (or about 55 Hz) in this life time, but who knows? Maybe God would like me to reach that low later in life to better serve Him?

On a different whim, I started from the lowest note I could go and just smoothly glissando up to see how high I could go before I got ``stuck'', i.e. reaching a point where I had no other way of raising the frequency any higher. As I looked at the history of the spectrum analyser, I could almost catch a glimpse of where my vocal registers were switched over due to a small plateau as my [untrained] voice takes some time to move along. I could definitely feel the resonance of the voice shifting as I glissando up more than glimpsing it in the spectrum analyser, mostly because the switch over order of magnitude was at centiseconds (the spectrum analyser ran at around 5 cs per pixel row of output data)---it was a weird feeling.

743.4 Hz is the upper range, which is around F♯5 in A442 12-TET.

So my comfortable-ish vocal range is around 3 octaves or so (ratio of highest frequency reached to lowest reached ranges from 8.96× to 10.2×, ``one octave'' is a multiplicative factor of 2, so 3+ octaves is about right).

That's good enough for me.

------

I did have quite a few failed Jupiter Hell runs, but they weren't worthy of speaking of due to them being failures. I'm in the fifth and final season of The Daria Restoration Project and after that is done, it will be a toss up between Darkwing Duck series, Futurama (again), or something else. I think if I'm going to continue with grinding out more Jupiter Hell runs, I might go with Futurama, but if I just wanted some passive entertainment alone, then I might go with Darkwing Duck.

That's about all for now. It's a long update, but hey, I did quite a few things today. I am planning to head out of the apartment tomorrow just to do something different (probably reading). It does feel like a burger sort of day, though the question is whether to head out to my favourite bar for the beer+burger day (are they still running this on Tue & Thu?) or to head out to Five Guys. The benefits of the former are that I can easily sit there for hours on end and just keep chugging beer while reading, but the latter does satisfy some deep cravings. Eh, more first world problems.

I'll leave those for tomorrow. Till the next update then.

Sunday, April 25, 2021

Sunday? More like Sunned Day

That has been a very hot day. The interior walls of the apartment were measuring at 30 °C, which only hints at just how hot it really was for the exterior facing walls, behind which I sit at with Eileen-II. Speaking of Eileen-II, I did undervolt her to −37.1 mV instead of leaving her at −35.2 mV like last time. Yes, it is borderline greedy, but any bit that can help with the thermals is a good thing.

I spent most of the day reading, having reached page 364/3790 of Harrison's Princicples of Internal Medicine (20th Edition), and page 506/1321 of Handbook of Data Structures and Applications. I'm nearing the end of the section that deals with multi-dimensional and spatial structures, and I must say that the contents do actually fill in some gap in my knowledge, mostly because these data structures are reaching the point where it is more efficacious to use a pre-implemented one in the form of a library/framework, than to roll it out on one's own.

In many ways this is a demonstration of the principles behind what I usually call the ``professional versus the knowledge base of the fourteen-year-old''. Old school data structures that I had known since I was fourteen were the ones that could mostly be implemented by hand from scratch, mostly because of their lower level of [Kolmogorov] complexity. They are generally good enough for 80% of the cases out there, but they suffer from the single flaw that they are primarily in-memory only and are often non-concurrent safe.

Putting it a little more simply, it means that using such data structures would strictly relegate us back to the early 2000s level of software technology. Since the mid 2000s, multi-core processors that share memory, large secondary storage (local disks), and even larger tertiary storage (think cloud storage/NAS) have been in mainstream use. It is not that the old technologies are not applicable any more, but that these new [hardware] capabilities mean that we can seriously improve the constant terms of more complicated data structures that can leverage on massive concurrency and/or parallelism that can potentially beat the traditional data structures.

I have learnt from young that part of solving a problem (after suitably defining what the problem that needs to be solved is first) is to devise a good representation for the problem space and/or solution space. Data structures affect this aspect of problem solving directly, and the larger the problem, the harder we need to think about the better representation for the problem. Notice that I did not say ``best'', mostly because the performance and scale of the computational machines we have now are generally good enough that we often do not need ``the best'', mostly because having ``the best'' requires super-specialising the data structure and associated algorithms for that specific instance of the problem that needs to be solved. Don't get me wrong, having ``the best'' solution for an expensive enough problem with a great enough payback is sometimes the only way to proceed, but for the purposes of solving more problems overall at a faster rate, the data structures need to be sufficiently generic enough.

That's why the old ``abstract'' data structures like arrays, linked lists, stacks, queues, binary search trees, [in-memory] adjacency lists [in arrays] were defined the way they were, and designated as fundamental. The problem space now is much more diversified, and much of the research in the data structures seem to be more of the specific-solution phase as opposed to generalising.

In many ways then, my urge to read Handbook of Data Structures and Applications is completely warranted and is vindicated as I make my way slowly through the text. It's technically an extended survey monograph, so implementation details will probably require me to dig into the referenced papers, but most times knowing that something can be done is of a higher importance than knowing all the specific details, especially since these days, one can look up the specific details relatively easily through the many search engines out there.

Yes, not implementing complex next-generation algorithms from scratch does lose one some street cred, but at my age and time availability, it's better to be known as one who solves many large problems successfully than the [basement] hacker who only knows how to implement that one complex data structure from scratch. Paraphrasing, implementing a complex data structure from scratch is fun, but it does not pay the bills in this time and age.

What I think I'll do with the remaining time today is to finish up the chapter I am currently on in Harrison's Principles of Internal Medicine (20th Edition), before calling it a day. Doing website development/maintenance/changes at stupid o'clock without taking a nap really does take it out of me.

Oh, I think that I forgot to mention that I had man-handled Blogger to ensure that the disclaimer blurb appears also in the mobile version of this page. Getting that to work required many levels of stupid to be done. As to the why those hoops needed to be jumped through, I don't know.

In case it wasn't obvious enough, I didn't play any video games today, but I did watch a few more episodes of The Daria Restoration Project. I think I might be able to finish that soon-ish, after which I will need to decide what I would like to watch.

After all, being on sabbatical is more than just being occupied with intellectual pursuits---there is also a certain sense of self entertainment and re-discovery as well.

Till the next update then.

Stupid O'Clock Font Change

Okay, we're at stupid o'clock again, but this time, it is not a rant but a quick technical update.

I was looking at the existing font that my personal domain is using (it is Open Sans that is locally hosted), and I realised I hated it.

The reason is simple: ``Il1''. That's a capital i, small L, and the number 1. They look like garbage. The inspiration for this realisation is from this Reddit post on Arial. Thanks to u/accideath's comment, I learnt about an awesome font face that is designed to make things more legible: the Atkinson Hyperlegible Font by Braille Institute of America.

I won't replicate the features of Atkinson Hyperlegible here (just visit their website to read), but suffice to say, I liked what I saw, and stupidly spent the past hour or so setting it up to replace Open Sans for my personal website.

Lazily, here's the comparison before my recollection of the process---left is the original in Open Sans, right is the new one with Atkinson Hyperlegible:
The download package contained the WOFF2 font files that are used in web browsers, and so it was just a case of setting up the appropriate @font-face blocks in the main style sheet. It was after doing that and reloading the pages that I realise I needed to do some more tweaking.

My baseline was the [then] existing layout that was already tweaked for Open Sans. Atkinson Hyperlegible is a slightly smaller font-face than Open Sans, and as such, the font-size needed to be increased enough to reach the legibility that I wanted. Strangely, the line-height needed to be backed down a little to reduce excessive spacing in between lines. As I compared the pages visually, I start to realise quite a few off points, and had to investigate further.

It turns out that there were many funny ``magic numbers'' that I was using to ensure things looked well with Open Sans that did not need to be done for Atkinson Hyperlegible, which is great, since it meant I could chuck it out.

I like how it looks now. Sure, it looked a little funky as compared to Open Sans, but it is definitely more legible now. It also gives the page a new feel as well, since the change of the main font is akin to a major design change.

That's all for now---I should go to bed. Till the next update.

Saturday, April 24, 2021

More Website Tweaking, and Pre-Stupid O'Clock Rant

Hmmm. In case there's been any doubt, I'm still on a sabbatical.

Not sure why I felt this sudden need to make this declaration, but here it is.

It was a slow day today. I finished the remaining pages of Animorphs Series: The Invasion, and watched some more Linus Tech Tips, and that's basically it. I aim to at least complete the Quadtrees and Octrees chapter/article in Handbook of Data Structures before I turn in for the night.

I did spend some time tweaking a bit more on the presentation on my personal domain, adjusting the way paragraphs show (paragraphs following other paragraphs are indented), and added more subtle line-based separations per year in my read-list page.

I saw this article today and reflected a little upon my experiences with taxis in Singapore. There was a time where they were quite reliable, in the sense that it was possible to hail one as and when one needed one, to get to the place that one wanted to go.

They are still rather useful to getting to and fro the airport from home (to requires an advance booking which can be easily done over the phone, while from is settled through the dedicated taxi stands at the airport itself), but other than that, their reliability has gone down to the point that I would not willingly take one unless I really have to.

And I still refuse to take so-called ``private-hire cars'' if I am on my own, but that's a rant for a little later.

I want to support the taxi drivers, I really do. But they are making it hard for me to support them. For some reason, they have started to demonstrate extreme pickiness from street hails. Previously, I would expect no more than 2 failures after flagging before I could get on a taxi to where I wanted to. Now, I would be damn lucky if I can get less than 5 failures from flagging. To be precise, when I say ``failures after flagging'', I mean that the taxi must first stop after my flagging of one, and then refusing to take me to my destination after ``demanding'' to know where I was heading before I boarded.

If I wanted to include the number of failed flags, then the numbers are much worse: previously, it would take on average of 5 cabs passing by before one would stop. Now, the number is closer to 15, with at least 2 that would suddenly switch from the green ``TAXI'' to the red ``BUSY'' when they saw that I was flagging for one on the roadside.

To be fair, I do have slightly better luck at designated taxi stands, but even in those cases the pickiness is definitely on the up-tick.

Taxis as a mode of public transport was traditionally the fall-back for when one screwed up the timing and cannot hope to reach one's destination in time with the mass public transport modes of the buses and/or MRT (subway). It was reliable for that then, but now, it is not reliable enough for that.

In fact, the time taken from starting to hail a cab to actually arriving at the destination nowadays is almost the same as if I just took the mass public transport modes and suffered the delay from my own doing, while simultaneously over-paying by at least 10×. So, I get to be late, and pay much more, with even greater stress.

All in all, a lose-lose-lose situation.

Because of that, I have not really put taxis in my list of viable transport options for quite a while already. I would rather take the extra time for the regular mass public transport modes, or walk than to rely on the taxi. It's a good thing because it forces me to be much more disciplined in planning my travel. It reminds me of the times that I was studying/living in the US, where there was basically no such thing as a taxi anyway, mostly because they cost at least 35× that of the bus, and are very hard to flag too.

And now, on ``private-hire cars''. Man... I don't know where to start on my dislike of these services. Maybe I'll start with the most selfish reason: I really don't like it when my money gets trapped in an app on my cellphone. Heck, I am still very angry with DBS for forcing everyone to use the digital token on the cellphone. I can go on an angry spiel on the privacy angle, but I will do a much simpler one.

It fucking gives Google/Apple too much damn power, because it is completely reliant on these third party infrastructure providers. If for any reason one gets banned from these platforms, either because of an automated false positive flag or through real mischief, things get locked out hard. At least for banks, it is still somewhat possible to talk to a human at one of their branches armed with nothing more than oneself, one's NRIC, and one's bank card.

But third-party ``private-hire car'' platforms like Grab and all? Money that goes in stays in there for as long as they can make one do so, and even if there are ways to extract one's fiat money out of that system, it is likely to require many hoops to be jumped to make it technically possible but practically improbable.

The other reason why I don't like ``private-hire car'' platforms is their inherently exploitative nature. I'm pretty sure that I had mentioned it at some point that such platforms that support the so-called ``gig-based economy'' is just the capitalist way of side-stepping all the labour protections that had been navigated through blood and sweat over the past century and change. In the original incarnation of actually acting as a ``side-hustle'', it is still tolerable with a strong sense of personal choice---one is expected to only take up gigs during one's ``free'' time to generate some income from some ``free'' resources that one might have (like time, and a vehicle that would otherwise be depreciating normally with no supplementary income to defray its depreciation).

But these platforms have reached the point where they are fast becoming an alternative source of actual ``full-time'' income for many people, and the regulations for these are still vague and unenforced, which allows the fairness of the underlying match-making inherent in the successes of these platforms' operation to remain opaque, and thus susceptible for abuse/exploitative practices that cannot be proven/disproven.

Since the money in these platforms are still great, there is little incentive to actually reign in on errant players who are actually exploitative. I cannot even say with certain if any platform is not exploitative, since what ``exploitative'' means is never really well-defined in the legal sense.

Despite all the corruption that we see in many governments, I still believe that one of the roles of the government is to protect its human citizens to ensure that the intangible concept of human dignity is respected. For many of us, this means the proper regulation and enforcement of said regulations for any activity that involves humans, especially when economic success [of the corporations] are concerned. Corporations retain lawyers to defend their rights, but the man-on-the-street has no one other than regulation on their side to protect them from abuse.

If only people were to repent from their sin of covetousness... then perhaps I don't even need to have such a rant in the first place.

Ah well. I think that's about it for now. Till the next update then.

Welcome to Stupid O'Clock Again

Ooh, look at the time: it is stupid o'clock.

And strange rants usually occur at stupid o'clock.

A Redditor (u/strydar1) wrote this (replicated here for reference):
I didn't write this. But it's true.

As for grief, you'll find it comes in waves. When the ship is first wrecked, you’re drowning, with wreckage all around you. Everything floating around you reminds you of the beauty and the magnificence of the ship that was, and is no more. And all you can do is float. You find some piece of the wreckage and you hang on for a while. Maybe it's some physical thing. Maybe it's a happy memory or a photograph. Maybe it's a person who is also floating. For a while, all you can do is float. Stay alive.

In the beginning, the waves are 100 feet tall and crash over you without mercy. They come 10 seconds apart and don't even give you time to catch your breath. All you can do is hang on and float. After a while, maybe weeks, maybe months, you'll find the waves are still 100 feet tall, but they come further apart. When they come, they still crash all over you and wipe you out. But in between, you can breathe, you can function. You never know what's going to trigger the grief. It might be a song, a picture, a street intersection, the smell of a cup of coffee. It can be just about anything... and the wave comes crashing. But in between waves, there is life.

Somewhere down the line, and it's different for everybody, you find that the waves are only 80 feet tall. Or 50 feet tall. And while they still come, they come further apart. You can see them coming. An anniversary, a birthday, or Christmas, or landing at O'Hare. You can see it coming, for the most part, and prepare yourself. And when it washes over you, you know that somehow you will, again, come out the other side. Soaking wet, sputtering, still hanging on to some tiny piece of the wreckage, but you'll come out.

Take it from an old guy. The waves never stop coming, and somehow you don't really want them to. But you learn that you'll survive them. And other waves will come. And you'll survive them too. If you're lucky, you'll have lots of scars from lots of loves. And lots of shipwrecks.
He's not wrong. The waves never stop coming, and we don't know what's going to trigger them.

Perhaps that is why it is said that it takes at least as long as a relationship had been going on in order to recover from that particular break-up. I am definitely in much better shape than I was nearly a year ago today. When she told me that she was going to break up with me, it hit me so hard that there was nothing that I could do but cry. I cried, God knows how hard I cried. That kind of ripped-out-my-heart feeling... can probably only be matched by the death of a close loved one. It was that gut-wrenching.

Life was less meaningful from that day on. We were in the middle of a pandemic-induced ``circuit breaker'' scenario, which basically meant that everyone was isolated from everyone else. Work was a jerk, night and day had no difference, and I had to keep it together still because I had an intern to guide through. I made my acquaintance with the Lord and started walking in His footsteps as well as I could. I did contemplate death ever so often, mostly unintentionally and intrusively, but sometimes there was some actual deliberation involved.

I talked to some of my friends, but I realised that at some level, our interests and synchronicity have diverged. And I really didn't have the right words to convey what I was really feeling, because I didn't know what I was feeling any more.

No rehearsals meant no way of just getting back those much cherished routines of life that give the man drowning in his own depressive thoughts an anchor point of normalcy to start again from.

Today, nearly a year on (I could, in theory, look it up to confirm the date, but I don't think it productive to do so), I find that I'm still numb in that region of my heart. I am still an equal-opportunity ``hater'' of people, which also means that I am an equal-opportunity ``lover'' of people, because being neutral is also, by definition, equal parts of both antagonising perspectives. But that part of me that normally would have the angst of having a mate, a companion, a comrade-at-arms, that part is still numb; can't feel anything other than an occasional sadness that I do not know how to articulate.

I don't know if it is still just me grieving, or if it is just a tacit understanding that this type of longing is no longer necessary nor needed ever since I turned my eyes upon Jesus:
Turn your eyes upon Jesus,
Look full in His wonderful face,
And the things of earth will grow strangely dim,
  In the light of His glory and grace.
The things on earth do grow strangely dim for me---that is one big reason for the sabbatical; to find back that sparkle that would have led to a spark and then flame of enthusiasm and vigor. Somehow, somewhere along the line I lost them---I don't know how. Perhaps it was the exploitation, or perhaps it was not being true to myself, almost always just going with the flow, even if it feels bad. Or perhaps it is because I know that had I followed the original trajectory I was on, whatever I might have done will not actually bring honour to God, or to put in layman's terms, is not morally defensible.

But I digress far from the metaphor that was offered by u/strydar1. I think I mentioned something similar before, but instead of talking about waves, it was more on the auto-triggered memories, and the need to form new memories to re-contextualise the memories so that the newer ones without the significant other overrides the old one and thus reducing the level of grief and other bad feelings. However, new memories do take time to take proper root, and in the process of trying to create these new memories, the old ones are still lurking just beneath the sub-conscious, ready to spring out and spoil the whole day.

The trick, it seems, is to let the old memories come out into the open, but pay it no heed, letting it ebb and flow accordingly while actively recalling the new memories as much as possible. It is a concept that comes from the mindfulness form of meditation, and also from the various error-propagation protocols used for training neural networks.

Meaningless drivel at stupid o'clock... it's not as though what I have written here has any hope to have coherence in the first place.

Till the next update.

Friday, April 23, 2021

Scratching Various Itch

Ah... feels great to be sitting in front of Eileen-II to write yet another blog entry after a day of [sorta] gallivanting about. I really could get used to this.

I scratched a few itches today. The first of which was to sort out my Tex-Mex craving with stuff'd at 90 Hougang Ave 10, #01-38, Singapore 538766, near Hougang Mall. Yes, I said Tex-Mex, and I'm well aware that stuff'd is ``mexican, turkish, delicious''. But that applies only if one is ordering the kebab, which I did not. I just went for the Beef Con Carne Burrito with all of the Standard Base and Standard Toppings, with Habanera and Sweet Mustard Sauce. It is mmm mmm good, naturally. I am really happy that stuff'd exists in Singapore now---back in the day circa 2011, I was craving burritos really bad after having come back from the US and learning about Chipotle Mexican Grill, which served delicious burritos as large as my head. There was no easy-to-find burrito place that tasted great---everywhere was some kind of bowdlerised restaurant that charged an exorbitant fee (think SGD 25+) per [tiny-ass] burrito(!). It's kinda like heading out to somewhere not Singapore, and having to pay like SGD 30 equivalent for friggin' Hainanese Chicken Rice in Filet Mignon-sized portions. stuff'd came into existence only in 2014, and it has been a true godsend to me throughout the years that I spent in Singapore after returning from my second round of overseas studies.

Like all things that I love, eating the burrito from stuff'd is bittersweet. I think it was recommended to me by Chara back in the day, and we had many a date spent just sitting at some random place and chowing down on them burritos. It was always burritos, whether it was the chicken or the beef con carne. Well, all these memories are in the past now, and I need to create new memories to move on, and so I shall.

The other itch that I scratched was to go play with my friend's cat. His cat is new, having only been recently adopted from Kittycare Heaven, located at 80 Lim Chu Kang Lane 1, Singapore 718911. He is a real beauty, being a ragdoll cross, and is really friendly too. It took a while, but I was soon scritching his nape, back, and even his belly. He mewed, and purred quite a lot as well. He was still young though, estimated to be around 9 months old or so. According to my friend, he eats a stupid amount of meat, nearly 8× the quantity that his previous cat ate per day, at a rate that would rival any of the conscript soldiers in the SAF.

He is a sweet thing, and I am glad that my friend and his wife adopted him. God only knows they really need a joy-maker in their life, ever since their old cat passed away some time ago from kidney failure.

The final itch that I scratched today was more tweaking of the header colouring and margins. Last time I talked about using colour to ``pop'' the section header out---this time I added more highlights for the sub-section headers and lower to make it easier to pick them out in a wall of text. One version of them can be seen at this dizi article [with missing diagrams], which also shows the adjustments I did to the figure caption as well.

I am satisfied with the results---they provide that additional visual cue on the document structure that the older method of messing with underlines and small-caps alone could not do as effectively. The highlights started at gradient from 50% of width at h3 level, before dividing by 2.5 each time we increase the header depth, till we get to 3.2% of width at h6 level. Why the 2.5 factor? I'm not too sure; I only remembered that a factor of 2 looked lame, while a factor of 3 seemed to decay too much. On hindsight, perhaps I should have messed with using φ or even e as factors, but it's too late---I'm too lazy to do even more adjustments now.

Originally, these highlights used the same starting colour as for the h2 level, but I decided to lighten it up a bit more to make it stand out. I added an additional white border around the text for h3 to h6 levels just so that if for any reason the text gets too long and reaches the blue-ish area, the text will still be readable.

I would add that apart from all these, I watched a bit more Daria Restoration Project while lazily attempted more runs on Jupiter Hell.

All in all, it has been a nice day. Till the next update then.

Thursday, April 22, 2021

AoC on Hard in Jupiter Hell

Well, I mentioned before my attempts in completing Angel of Carnage at Hard difficulty level in Jupiter Hell.

After many retries, I finally made it. The long story short is the need to be careful in when I choose to move, which is hilarious since it is the type of activity that is common in such rogue-likes in the first place.

I think I'll retire to passive entertainment (watching The Daria Restoration Project) for the rest of the evening. Or maybe, just try something different in Jupiter Hell while simultaneously listening to The Daria Restoration Project.

That's all for now. Till the next update.

Popping Out Section Headers

Well, I spent most of the day thus far trying to get through Angel of Carnage on Hard mode in Jupiter Hell while simultaneously watching the Daria Restoration version of Daria. The Restoration version basically takes the latest DVD collection's remastered visuals, and combines it with the original sound of the VHS versions that came about from individual's recording before the remastered version came out.

The DVD collection came out only many years later, and had its sound re-done with genericised music tracks since it was prohibitively expensive for licensing---the original TV run of Daria was on MTV during an era where they could get lots of good/relevant pop music to go with it.

I've watched the VHS version many times, the updated DVD collection even more times, and now, I'm getting the best of both worlds.

While poking around and learning that Wendy Hoopes, voice actress for ``Jane Lane'' is born in Malaysia back in 1972, I also learnt about the gradient box in CSS for the header. I liked the set up, and tried it out on my web domain to make the intra-page sections stand out.
I think it does stand out well. The only other adjustment I did was to add a thing text shadow around the white text to ensure that if the header information get long enough to run into the white part of gradient, it will still stand out.

I think that's all I want to write for now. Till the next update.

Edit: It seems that there is a new spin-off/reboot of Daria called Jodie that was ordered in June 2020 with no release date yet. Should be interesting!

Wednesday, April 21, 2021

7 Pints of Guinness and Other Diversions

Okay, so I mentioned before that I was heading to my favourite bar, which I did. Got some good reading done [naturally]---page 379/1321 of Handbook of Data Structures and Applications, completion of Animorphs Series: The Andalite Chronicles by Katherine Alice Applegate, and page 42/77 of Animorphs Series: The Invasion by the same.

Apparently I had drunk 7 pints of Guinness stout, or roughly a pint an hour for the whole 7 hours that I was there (from 1415hrs to about 2115hrs). I mean, I had some finger food and ``regular'' food to go with it for lunch/dinner, but apparently the 7 pints were enough to make the store manager a little bit concerned about my safety getting home.

I reassured her that it was fine. Frankly, I didn't even feel anything more than buzzed. She did mention that she didn't realise just how much I could drink, but I didn't dare to lionise what I have done by pointing out that before heading to my favourite bar, I had already downed two cans of Tiger beer at home.

It's good to feel a little buzzed every now and then. Takes the edge of reality in some ways.

On the way home, I was listening to an album from SDN48. The pieces they have were sung in Japanese, but had a really high-energy beat to it, which was just the right amount of energy that I wanted.

Which of course segues into a completely different topic. When I play the high pitched instruments (like the 梆笛 or the soprano saxophone), I mentally switch myself towards ``diva''; in other words, whenever I go high, I re-imagine myself as an accomplished female soprano singer, the first lady in the orchestra. It helps with setting the right attitude and all the subtle adjustments necessary to ensure that my entire breathing tract is in tune with the rigours of playing high notes.

And no, I don't have some kind of gender dysmorphia, in case there was any doubt. I'm still a cis-male, but I find that putting myself into the shoes of a prima donna is a great way to sound much more controlled and light when playing high. It's just another way of acting, though less intense than say method acting where one is a role as opposed to one takes on a role.

Since my natural voice and volition is no where near sounding like a prima donna, I suppose it is why I have a tendency to favour listening to music that is sung by female singers, with bonuse points if they go high but do not sound squeaky.

These days though, I'm starting to expand more on the lower end of the range. I mean, yes, having the right mental model to play high is essential for 笛子 playing, but with the alto flute, bass flute, and tenor saxophone, I really need to beef up my lows. As time goes by, it will be increasingly easy to go lower on my natural voice than to keep going higher---going high by voice is always doable through careful constriction of various parts of the breathing tract, but the lowest note that one can sing (and therefore shape properly on a woodwind instrument) is completely limited by the length of the breating tract and its diameter.

There's a reason why the lowest oktavists are generally tall and/or old men. No woman is ever going to reach the deepest of the bassi profundi no matter how much they try---it is literally impossible for them due to physiological limitations. To be fair, for male voices to go to the highest soprano range without resorting to falsetto isn't exactly the easiest of things either, but as I said before, ``squeezing'' out a high pitched note is always feasible, even if its timbre sounds like garbage.

On a completely unrelated note, I just want to point out that O(log (n!))~O(n log n) from Stirling's approximation.

I think that's really about all for today. Till the next update then.

SMS Musing #11

While hanging out at my favourite bar and looking over at a neighbouring table and seeing a cute female:
At some fundamental level, I need to ask myself: do I just have really bad taste in women. Or more fundamentally, am I sufficiently untrained in the arts of choosing a mate for life, no thanks to the policies of school (I'm staring at you, RVHS with your "no BGR" nonsense), my bad skin in general, my spending of my so-called prime dating years studying overseas under the spectre of over-achievement (I'm staring at you, A*STAR for that 3.8 GPA requirement). The women that attracts me the most (and are attracted to me.in return) are abnormal in their own ways---either they really aren't into starting some kind of family, or are otherwise "pre-occupied" with other aspects of life.

I'm not going to lie; I'm not even sure it was actually worth it ti be on that scholarship that I was to study abroad and then return with a useless Masters degree. What's the point of studying so much and so hard if in the end, all I'm looking at is being exploited by people for not even the value of all the training that I've been through, without any sort of happiness.

It would seem that all that study and training has brought me nothing but angst, doubt, and bitterness, with a severely under-developed sense of the humanising self. I mean, I started with low attraction to women, but as the years go by, I am getting ever less attracted to them. It's not that I've "gone to bat for the opposite team", but that the foibles and failings of mortal humans in general, and the repeated demonstration of misplaced trust in people has made me super wary of wanting to start yet another [serious] relationship.

I pray weakly to God to guide me in terms of this. But frankly, as this sabbatical goes on, I am increasingly convinced that there is probably no other human female that is worthy enough of my trust, loyalty, faith, and love.

Sure, I might miss out on the sex, but is it really a loss? Maybe I might miss out on the companionship, but isn't a God-centric life supposed to ameliorate that?

First World Problems

``Minority'' is not a universal statement but a conditional one.

Now, before the mob grabs pitchforks, let me be a bit more precise---I mean this in a probabilistic sort of way. The concept of what a ``majority'' or ``minority'' is depends on the population in which we are determining the subset of. So for instance, say one is in America. Then people of Chinese ethnicity (very loosely defined as being people descended from China up to five generations ago) are in the minority as compared to the population that makes up the geo-polity that is ``America'', even though people of Chinese ethnicity in China is close to 100% [by my definition above].

In short, the concept of majority and minority depends very heavily on the definitions that are used. This is no small matter, and can affect the way in which the conversations of privilege and disenfranchisement are conducted. To a large extent, public policy is guided by how these definitions are determined, and I think that part of the engagement between the national governing bodies and their citizens should include alignment of these definitions so as to ensure that all citizens [that the governing body serves] are treated fairly.

That brings us to another tricky point: what is the definition of ``fairness''? There are two big concepts that have gained a consensus in their meanings, that of equality (everyone is given the same resources/opportunities) and of equity (an acknowledgement that everyone comes from different circumstances and therefore needs to have different resources/opportunities allocated to get the same outcome).

Crudely, meritocracy can be considered a philosophy of equality, while affirmative action can be considered a philosophy of equity.

Both are ``fair'' depending on what one prioritises same-ness for. My current working hypothesis is that there is no single eternal mortal governance system that is without flaws (because people are always actively gaming the system for their own personal benefits instead of playing ``nice''), and because of that, equality or equity as the measure of fairness is something that needs to be re-examined ever so often, with neither philosophy absolutely dominating the other.

Going back to the matter, the concept of establishing ``fairness'' for minority peoples in a society. At some level, I think that the over-arching consensus despite either philosophies of fairness is that people are treated without specific preference or negative bias, that the behavioural choice of those who are acting under the aegis of officialdom be one that is physical evidence driven and defensible as being unbiased. This means that those who act in official capacity will stay within the rules of engagement, and within the rules of decency, despite who they are interacting with. This is a much lower bar than requiring that everyone in a society treat each other in a civil fashion based on observed actions instead of inner prejudices.

That is why there is a lot of anger against police officers in the United States that seem to behave according to their inner prejudice instead of basing it on the more defensible rules of engagement of law enforcement. But to be fair, such misbehaviour isn't limited to just some police officers in the US; it's just that the US being relatively transparent in their media about what is going on in their country means that any blemish can easily get scrutinised and magnified at a global scale. I can safely say that there are other countries and territories that have similar or worse problems, but considering that the current media juggernauts are still Western technology companies, it will be hard to notice/see them.

But human governance is hard. I'm glad that justice eventually turns up [in the mortal world]. That said though, even if such human justice never turns up in our life-times, at some level one can hope that God will enact His morality on those who sin. But what He does specifically, and when He does it to whom isn't for us to know---faith requests that we seek comfort in knowing that a moment's folly with no repentance is stacked against the eternity and awesomeness that is God's wrath, and that His Will be done.

That alone allows me to sleep at night knowing that even though I'm but a mote, it will all be well in the end. And as long as it isn't well, well, it isn't the end.

------

In other news, I think I'll head out of the apartment today to do something different. Gonna be bringing Eileen-II out as well, though not sure if I will just stick with reading or if I will do some kind of programming as well. I'm also uncertain what kind of day it is, but part of me wants to go to my favourite bar to hangout partly because it is much closer, and partly because unlike my favourite sushi place, it is open at odd hours, meaning that there are way fewer people to worry about.

Then there's that craving for Tex-Mex food that I feel like I need to deal with.

So many first world problems huh.

Alright, enough of ranting for now. Till the next update.

P.S.: I think I'll head to my favourite bar for reading, beer, and luncheon meat fries.

Tuesday, April 20, 2021

AoSh and mala Hotpot

Today's a mix of some Jupiter Hell achievement seeking and reading.

I've progressed to page 289/1321 of Handbook of Data Structures and Applications, as well as page 936/2863 of the SCP Tome 5---SCP-2000 to SCP-2499. Nothing much to talk about there.

I have also completed the Angel of Shotgunnery challenge for Jupiter Hell. It was a fun one, and the details of the post-mortem can be found where I linked to.

I had an early dinner at 辣'不辣麻辣香锅 at 683 Hougang Avenue 8, #01-923, Singapore 530683. I've known about their existence at that spot for quite a while, and it was only recently that I actually went there to try their food.

Man, it reaally scratches that mala hotpot craving. That piquant flavour combined with the numbing spicy peppercorns is just amazing. Naturally, it's probably not the best mala hotpot in town, but as I have said many times before, sometimes the best food stall is just the one that one can have easy access to for the freshly made food. It's the same principle as I apply for prata, going for Al Falah Restaurant over at 681 Hougang Ave 8, #01-855, Singapore 530681 if I truly wanted prata [alone].

Or even Sin Heng Kee porridge over at 685 Hougang Street 61, #01-150, Singapore 530685, though to be fair Sin Heng Kee is considered to be among the best places for porridge in Singapore.

But my point is, tastes can change and adapt through frequent access, and thus having easy access to a certain food is definitely the best way to develop a certain taste for it. After all, food is very cultural in nature, and so what counts as ``good'' or ``not good'' is really in the eyes of the beholder. Any and all reviews for food should thus be considered individually to take into account the level of similarity between one's tastes and the reviewer's.

I mean, unless the day comes where reviewers start quantifying the flavour, texture, and other other physical properties of food via stating the concentrations of the various ions that create the flavour profile, and associated SEM, I would stick with this additional informal application of the K-L divergence interpretation.

I'm about to go for a bible study session with my care group, and so, I will just end this entry here.

Till the next update.

Monday, April 19, 2021

Lost in Data Structures and Other Reading

Today is a reading sort of day.

Apart from Bible in One Year 2020 With Nicky Gumbel (day 346/365), I've also made some progress on Handbook of Data Structures and Applications (page 220/1321), and Harrison's Prinicples of Internal Medicine (20th Edition) (page 357/3790).

There were also a bunch of other shorter works that I read as well.

After that, a little bit of time was spent in Cyberpunk 2077.

A friend of mine started a new venture, providing consultancy services for human resources and other business-improvements. It made me think a little of a possible direction in which I can head down; that is to do consultancy for __________ . It's currently left as __________ only because I have not thought about what __________ can be. Maybe infocomm technology related, maybe general problem solving; or maybe even music.

Who knows?

There really isn't much to talk about for today---it's been rather quiet. So I think I will just end the entry here.

Till the next update then.

Sunday, April 18, 2021

Sheet Metal Rules the World

It's been a quiet day. I think that this is likely to be the type of beginning for my entries for a long while to come as people start to forget about my existence as the year (and my sabbatical) goes on. But it's okay.

I spent much of the day reading The Book of Malachi, the remaining 10 psalms from Psalms, and The Revelation of Jesus Christ from the New King James Version. With that, I have successfully finished reading The Holy Bible, New King James Version. This second read-through definitely has a different feel to it, partly because the text is better formatted (with a more modern English), and partly because I am reading it from the perspective of a believer as opposed to one who is merely curious about one of the biggest sources of inspiration of Western literature. I think I might have said it before, but the Old Testament really doesn't get much love---many people, well-meaning or otherwise, have a tendency to quote very heavily from the five books of Moses, but then conveniently forget about the later parts of the Old Testament that revolve around how Israel has sinned repeatedly, together with the associated ramifications and God's actions in getting them to steer back onto the righteous path.

Of course, this is where I say that I'm no theologist and not-so-subtly sidestep talking about the details of it. Please consult your neighbourhood pastor/minister/deacon for details about proper biblical interpretation.

------

I'm not sure if I ever talked about the I C Weld YouTube channel here. It's a fun channel of a guy who does heavy machinery repairs with his plasma cutter and various welding tools. It's not as heavily produced as say Linus Tech Tips, but there is a certain honest charm about it. It also helps that he is rather skilled at problem solving as well, including the art of articulating what it is he is doing, and why he is doing it. He does make it clear that he is merely showing how he does it, as opposed to how it ought to be done, which helps to set the correct tone that it is a showcase rather than a credited source of introduction.

Watching I C Weld and even Stuff Made Here made me realise that much of the industrial world's structures revolve around sheet metal. Anything structural has a tendency to begin life as some form of sheet metal, which includes things like pipes. This includes things like the many different types of cranes that feature as part of the repair videos on I C Weld itself. I think part of the reason why sheet metal is so important is just the ease of fabrication---metal is malleable, and many structures can be built out of simply bending a pre-cut sheet metal into the right shape. The resultant structure is as light as it can get without using exotic processes and using/wasting too much material.

This thought also made me realise that one of the earliest topics in primary school mathematics that appears in only one module, that of nets, actually plays a rather important role in modern industry. I mean, we can go even deeper down the rabbit hole and look at the mathematics of paper folding, of which there is a textbook on it, with practical uses of reducing space needed for solar panels and antennae without massive re-engineering of the stiff planar components.

I think I'm rambling again. Heh.

That's all I have for today. Till the next update, I suppose.

Saturday, April 17, 2021

Week in Brief

It's late on a Saturday night. The rain has already fallen, and it's a real cool one.

What better time than now to do a recap-type blog entry?

This week has been a strange one. I did not do much reading; at some level, I feel like that I have been ``read out'' for a while. More importantly, there was a different type of project to occupy me, and that is the building of a new PC for my mum. It felt like the right thing to do this time period, partly because of the exceeded tolerance level of re-seating the RAM chips every month or so due to corroding contacts, gradual loss of USB ports due to (you guessed it) more corroded contacts, the complete end-of-life of the Xubuntu operating system LTS release, generally super ancient hardware specifications, and partly because I wanted a different kind of thing to work on. All the oldness of the still sort-of working PC and generally reduced external connecting capability meant that we are starting on the other end of the bathtub curve.

It's been about 8+ years---the PC has had a good run. No regrets.

Throughout the process of figuring out what parts to get, to getting the parts themselves, to unwrapping and assembling, to operating system installation/set up, and finally to data migration and user integration, I found that time passed really fast. I mean, I knew the passage of night and day, but the sense of how the hours were passing was less clear, especially since I don't really eat lunch any more (I've been cheating with breakfast, and as such, my mass is increasing again; urgh).

I think I was genuinely having fun throughout the build process. That is a good thing I suppose, since it means that at some level, I still enjoy technical stuff.

I don't feel too bad for not doing ``enough'' reading for this week, nor did I feel too bad about not trying to ``complete'' Cyberpunk 2077---it just didn't seem to be that kind of week to me. I still got some good things done, and that is, for a lack of a better term, still good.

I wonder what the next week is going to bring to me.

Incidentally, this is the last day of the third month of my sabbatical. I am definitely more relaxed in comparison to the start, but I'm not sure if I'm truly well-relaxed yet. Thing is, there has been hints of rumours of the recent past catching up with me for some reason---I don't know what is transpiring, and am determined to not get involved in it. It isn't a true sabbatical if I cannot let go and move on, and it is important that I dictate my own terms in consultation with God, and not rely on someone else to dictate my headspace and time.

``This too, shall pass''---this sabbatical of mine isn't going to last forever; it's a sabbatical, not a retirement. The time limit for the sabbatical is one year, after which I will be embarking on the next leg of my journey, God willing, in a role that best glorifies God which makes use of all the talents that He has graced me with and the opportunities that He has provided me with to hone, display, and use them. Since my sabbatical has a definite time limit on it (nine months left from today), I am determined to not let the fleeting time in it be taken up by people who no longer matter as much to me as before.

Speaking of people who no longer matter as much to me as before, I learnt indirectly from a friend that Chara is no longer working at MusicGear. Well, it is to be expected, considering everything that happened; I wish her all the best on her pilgrimage to re-acquaint herself with God once more. My only otherwish is that she will still be in Singapore long enough that I can fulfil my last fulfillable promise to her---that I would invite her to my baptism ceremony when it comes.

When will it come? I'm thinking maybe within the upcoming year, but it will be by God's will, not mine.

------

In other news, I just ran the hair clippers around my head with the number 2 guide comb to neaten the mess. Recall that the last time I went for a hair cut, it was a full head shave. Since I got the trimmer, it was possible for me to keep and maintain side-burns as well, just to see how I look like. Now, side-burns work terribly if I went for a head shave, and so I just decided to crop my own hair this time round.

The same trimmers were also great at neatening the fringe hair, as well as the bits of hair that grow around the ear. The idea was just to run the 6 mm setting on the trimmer about carefully on the edges to neaten them. The number 2 guide comb is at 1/4", which is very roughly 6 mm (it's really 6.35 mm, but that amount is too subtle). In theory, I could just use the hair clippers to do it, but they are less nimble than the trimmer, making it that much harder to manipulate the cutting blades to do the right cut without actually knicking myself in the skin.

Anyway, it's starting to get late, and somehow, I am feeling tired. I think I will turn in for the night.

Till the next update then.