Showing posts with label redux. Show all posts
Showing posts with label redux. Show all posts

Sunday, 1 June 2025

Rise of the Bike-sharing Phenomenon, Redux

Almost exactly seven years ago, I wrote about bike-sharing apps and how they were making their presence felt in Singapore.

Those were some turbulent times, in the context of the bike-sharing industry, at least. Users flagrantly mistreated the bikes they rented. Due to problems arising from abuse of bicycle privileges and irresponsible parking, the Land Transport Authority (LTA) eventually mandated that bike-sharing companies would have to implement a QR code-based geo-fencing for designated parking, and gave existing bike-sharing companies a grace period in which to do so.

Cyclists in Singapore.

By the end of 2019, the majority of the companies I was talking about back then, have either been absorbed by bigger companies or left Singapore altogether due to challenges both technical and financial.

New players

As of 2025, two main companies remain. Anywheel was founded in 2017, and was a relatively small player at the time. It was only in 2019, when the dust cleared, that it began to establish itself as a major player. HelloRide, in contrast, was founded just a few years back in 2022 and only as recently as last year, received a full license to operate in Singapore

Having downloaded the Ofo app in the past, I gave the Anywheel app a go. The difference wasn't huge. Like the Ofo app, it basically included a feature to scan a QR code on the bike to unlock it, a way to relock and park the bike, and a payment interface.

Designated parking spaces.

The only real difference was the parking feature, and all it really involved was scanning a QR code at the parking spot. This is mystifying, because it doesn't strike me as anything the previous bike-sharimg operators wouldn't have been able to do. In light of this, it appears that at least part of the reason that the new players managed to meet the requirements at all, was with the cooperation of the LTA.

Same same but different?

Things seem to have improved. I no longer see bicycles thrown around nilly-willy. Once in a long while, I might see an abandoned bicycle in a canal, but these seem fewer and further in between, as compared to the old days. Perhaps Singapore as a society has grown. One can only hope.

Abandoned bicycle in canal.

And while there are markedly fewer choices, there's also a whole lot less chaos. Less mess, an improved technical implementation, and an overall better experience for the consumer. I am optimistic.


Let's ride!
T___T

Wednesday, 3 April 2024

Web Tutorial: Easter VueJS Puzzle, A.I Edition

Easter's come and gone! With that, I want to introduce an exciting new spin on the Easter VueJs Puzzle Game web tutorial I did in 2020. Instead of using one single picture, we are doing to use a dynamically generated image from Open AI's API.

We'll be using PHP, and you will of course, need to sign up for a developer account at Open AI, get an application key and so on. And then you'll need the code from the existing repository here.

After that, we change the filename to a PHP extension, and start adding PHP code.
<?php

?>


<!DOCTYPE html>
<html>
    <head>
        <title>Easter Puzzle</title>


We begin by declaring variables key, org and url. key is the api key you will have been given, org is your account id, and url is the endpoint URL for OpenAI's image generation API.
<?php
    $key = "sk-xxx";
    $org = "org-FUOhDblZb1pxvaY6YylF54gl";
    $url = 'https://api.openai.com/v1/images/generations';

?>

<!DOCTYPE html>
<html>
    <head>
        <title>Easter Puzzle</title>


We follow up by declaring the headers array. In it, we use key and org to identify ourselves, and ensure that the content-type property is set to JSON.
$key = "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";
$org = "org-FUOhDblZb1pxvaY6YylF54gl";
$url = 'https://api.openai.com/v1/images/generations';

$headers =
[
    "Authorization: Bearer " . $key,
    "OpenAI-Organization: " . $org,
    "Content-Type: application/json"
];


Then we declare data as an associative array. model specifies the AI model we will be using. prompt can be anything that you want the engine to use for generating the image - in this case I have a string telling it I want a picture of Easter eggs. n is the number of images to generate, and in this case we only want one image. size can have a range of different values, and I'm going to specify a square. For response_format, you can get the API to give you the image as a string of serialized code (but then we'd have to decode on our server, so screw that) or just give us the URL to that image that will be stored on their server.
$headers =
[
    "Authorization: Bearer " . $key,
    "OpenAI-Organization: " . $org,
    "Content-Type: application/json"
];

$data = [];
$data["model"] = "dall-e-2";
$data["prompt"] = "A picture of Easter eggs.";
$data["n"] = 1;
$data["size"] = "1024x1024";
$data["response_format"] = "url";


We then use cURL to access the endpoint. If there's an error, we print it out.
    
$data = [];
$data["model"] = "dall-e-2";
$data["prompt"] = "A picture of Easter eggs.";
$data["n"] = 1;
$data["size"] = "1024x1024";
$data["response_format"] = "url";

$curl = curl_init($url);
curl_setopt($curl, CURLOPT_POST, 1);
curl_setopt($curl, CURLOPT_POSTFIELDS, json_encode($data));
curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);


$result = curl_exec($curl);
if (curl_errno($curl))
{
    echo 'Error:' . curl_error($curl);
}


If not, run json_decode() on result, and grab the url of the image, setting it as the value of imgURL. Finally, use curl_close() to sew things up.
    
$curl = curl_init($url);
curl_setopt($curl, CURLOPT_POST, 1);
curl_setopt($curl, CURLOPT_POSTFIELDS, json_encode($data));
curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);

$result = json_decode($result);
$imgeURL = $result->data[0]->url;

curl_close($curl);    


That's the easy part! Now we get to another easy part - setting the image as the puzzle image. In the CSS, modify the CSS class piece. Instead of the previously hardcoded image, use imageURL. And ensure that the background-size property is set to 500 by 500 pixels, because your image is actually 1024 by 1024 pixels.
.piece
{
    width: 100%;
    height: 100%;
    background-image: url(<?php echo $imgeURL; ?>);
    background-repeat: no-repeat;
    background-size: 500px 500px;
}


Now if you run this, you should see a new image come up.


But uh-oh, there's a delay in image loading. The timer has even started running down even before the image is done loading.


That's only to be expected. Your browser code will run faster than the server code sending data to OpenAI and back. And depending on the speed of OpenAI's server where the image is stored, there's going to be some level of lag. What we need to do is mitigate that. That's the hard part. First, we change this message in the reset() function. Originally, it reads "Time elapsed", but now we will switch it to a notice for the user to wait.
reset: function()
{
    this.stopTimer();
    this.seconds = 100;
    this.btnText = "RESET";
    this.message = "Please wait while image loads...";
    this.startTimer();


Also, now the reset() method will have a parameter, delay. What do we do with this value? Well, we pass it in as an argument when calling the startTimer() method.
reset: function(delay)
{
    this.stopTimer();
    this.seconds = 100;
    this.btnText = "RESET";
    this.message = "Please wait while image loads...";
    this.startTimer(delay);


This means we also need to change the startTimer() method. Firstly and most obviously, we introduce the parameter delay.
startTimer: function(delay)
{
    if (this.timer == undefined)
    {
        this.timer = setInterval
        (
            () =>
            {
                this.seconds = this.seconds - 1;
                this.message = "Time elapsed";

                if (this.seconds == 0)
                {
                    this.stopTimer();
                    this.btnText = "REPLAY";
                    this.message = "Better luck next time!";
                }

                if (this.checkIncorrectPieces() == 0)
                {
                    this.stopTimer();
                    this.btnText = "REPLAY";
                    this.message = "Congratulations!";
                }
            },
            1000
        );
    }
},


And then we wrap the entire section involving the setInterval() function, within a callback which will be used in a setTimeout() function, using delay as the duration. And inside it, we also set the message property value to "Time elapsed".
startTimer: function(delay)
{
    if (this.timer == undefined)
    {
        setTimeout
        (
            () =>
            {

                this.timer = setInterval
                (
                    () =>
                    {
                        this.seconds = this.seconds - 1;
                        this.message = "Time elapsed";

                        if (this.seconds == 0)
                        {
                            this.stopTimer();
                            this.btnText = "REPLAY";
                            this.message = "Better luck next time!";
                        }

                        if (this.checkIncorrectPieces() == 0)
                        {
                            this.stopTimer();
                            this.btnText = "REPLAY";
                            this.message = "Congratulations!";
                        }
                    },
                    1000
                );
            },
            delay
        );

    }
},


Then we ensure that when we call reset() upon a page load, it has about a 5 second delay.
created: function()
{
    this.reset(5000);
}


But in the HTML, this value will be 0 when we click the button to run reset(). Because if that button is being clicked, that means the user just wants to reset the game and the image has already been loaded, so there's no need for a delay.
<div id="timeContainer">
    <h2>{{message}}</h2>
    <h1>{{seconds}}</h1>
    <button v-on:click="reset(0)">{{btnText}}</button>
</div>


Now we see this happen! And the timer doesn't count down until...


...the entire image is loaded! If you click the RESET button, the pieces rearrange themselves and the timer starts counting down immediately!


One more feature...

What if you wanted to just change the image altogether? Well, the straightforward thing to do would be to refresh the browser, but it's still considered good service to add a button.
<div id="timeContainer">
    <h2>{{message}}</h2>
    <h1>{{seconds}}</h1>
    <button v-on:click="reset(0)">{{btnText}}</button>
    <button>NEW IMAGE</button>
</div>


Use the v-on:click binding attribute and set it to run the refresh() method.
<div id="timeContainer">
    <h2>{{message}}</h2>
    <h1>{{seconds}}</h1>
    <button v-on:click="reset(0)">{{btnText}}</button>
    <button v-on:click="refresh">NEW IMAGE</button>
</div>


Add the refresh() method to the methods object. In it, you set the message property to a friendly warning.
methods:
{
    refresh: function()
    {
        this.message = "Please wait while new image loads...";
    },

    reset: function(delay)
    {


Then you run the stopTimer() method, and finally refresh using the built-in JavaScript reload() method.
methods:
{
    refresh: function()
    {
        this.message = "Please wait while new image loads...";
        this.stopTimer();
        window.location.reload();

    },
    reset: function(delay)
    {


There you go. Click the NEW IMAGE button, and "Please wait while the new image loads..." should appear briefly before the page reloads entirely!


Final words, and hope you had a Happy Easter!

Well, this has been fun. A.I is full of interesting new possibilities, and with this little exercise today, we've just scratched the surface.

Piece be with you,
T___T

Tuesday, 5 March 2024

Film Review: Black Mirror Series Four, Redux (Part 3/3)

Next one is a fun one... Black Museum.

The Premise

The titular Black Museum is a place where tech arctifacts and the horror stories that come with them, are displayed. Rolo Haynes is the proprietor, and he narrates some of these stories with a shocking twist at the end. Think of this episode as an episode of mini-episodes.

The Characters

Douglas Hodge is the narrator and antagonist Rolo Haynes. Where do I begin? This guy knocked it out of the park as the loathesome opportunistic sleazebag Haynes, what with the griping about human rights and off-color commentary. Can't give him all the credit, of course, the writing played a big part, but he carried it so well.

Leticia Wright as Nish. Wright recently played Shuri in Black Panther and Wakanda Forever. Here, she plays much the same character - plucky, snarky, good with tech. However, she also adds a more emotional bent to her character, and she's great to watch in the final quarter of the episode.

Daniel Lapaine as Dawson. Guy starts out as a well-meaning doctor who falls prey to the unintended side effects of tech. The actor did a pretty believable job of portraying, with his limited screen time, a healer-turned-psycho. Can I just say the actor's name is oddly apt? Lapaine. Heh heh.


This shot of him lying in a coma with a hard-on just seems very representative of what Black Mirror is as a whole - technology that is touted to improve our lives, turns out to have nasty side effects due to human beings being flawed and using it in terrible ways..

Emily Vere Nicoll as Dawson's concerned and long-suffering girlfriend, Madge. She really doesn't have much to do except look concerned, look repulsed and appear naked. I'm kind of sorry for the actress, to be honest.

Aldis Hodge plays Jack, the single father who faithfully raises his kid after the death of the kid's mother. He does come across as a man admirable in his consistency towards Carrie.


However, there's a limit to how much he can sacrifice and Black Mirror has a way of finding that limit. In particular, having Carrie's consciousness uploaded to his brain, where he has to hear her constantly, and lose his privacy twenty-four seven.

Alexandra Roach delivers a compellingly tragic performance as Carrie Lamasse. This one gave me mixed feelings. On one hand, I sympathized with the horror of her situation, especially when almost none of it is her fault exactly. On the other hand, I can't help but feel that if Carrie had just learned to be a little less noisy and less of an annoying backseat driver, it might not have come to this.

Yasha Jackson camps it up as bitchy new wife Emily. Sleek, sexy and venomous. She's not a nice person, but put in a situation though no fault of her own, and doesn't handle it at all well. Who would, really?

Babs Olusanmokun as Clayton Leigh. Stoic family man. Though I feel like the part near the end where he just drools and stares off into space is his best acting.

Amanda Warren as Clayton's wife Angelica. She does this nice emotional bit with Clayton during a prison visit - very heartrending. After that, the actress is basically reduced to cameos.

The Mood

It begins as a sunny day in some desert, but soon gets into the confines of the titular Black Museum.


The little flashbacks and stories span between mood whiplashes. Sometimes it's all nice and breezy in the day, and then flashes to a nightmare of blood and violence. A lot of it can be claustrophobic especially since a couple stories revolve around someone's consciousness being trapped in either a confined space or an inanimate object (or inside a living person but with no agency).

What I liked

All the little Easter Eggs that appear in this episode that harken back to previous episodes. Black Mirror has always had them, but this episode seems to have Easter Eggs to every single episode in Black Mirror ever, up to this point. We have news tickers referencing multiple previous episodes and displays in the museum doing the same (mugshots, exhibits, etc). The names of the mice are Hector and Kenny, two of the main characters in Shut Up And Dance. And near the end, we see a sly reference to the episode Be Right Back, when it's revealed that the name of the nearby gas station is BRB Connect!

And of course, there's TCKR, the company being featured in San Junipero. They feature pretty strongly here, too.

Nish charging up her electric car using solar power is a fun nod to Nosedive.

Who wrote Rolo's dialogue? Whoever they are, they deserve an award.

Eventually, he dick-pukes a little baby paste up her wazoo which takes hold. Before you know it, out pops a boy. Boom. They're a family unit.


The part where Nish whispers "Happy Birthday" to her dad is really heartwarming, not that it has anything to do with the overall plot.

The first mini-story was great. Started out as useful tech, segued into the applications for sex, and turned out to have tragic consequences.


I especially love the second mini-story where Jack loses his privacy and Carrie loses her agency. This is very characteristic of Black Mirror. In particular, Carrie's utterly horrible fate is to be trapped in an inanimate object, being able to only say "Monkey loves you" and "Money needs a hug".


That final mini-story now... that takes the proverbial cake. But it would have been a lot less flavorful without the earlier two stories giving it context.

What I didn't

Clayton Leigh is a little too calm when being executed. Granted, I don't know exactly how inmates on death row typically act, but it feels like it shouldn't be that stoic.

Conclusion

Black Museum has just about everything you could want in a Black Mirror episode - swearing and violence, human beings being dicks to each other and abusing technology in the worst ways possible, call-backs to previous episodes, nasty twists at the end (and because there are different stories in this one, -multiple- different nasty twists). I really enjoyed this one.

This is vintage Black Mirror, all right. Extra emphasis on human beings being scum. Love it!

My Rating

9.5 / 10

Final thoughts on Black Mirror Series Four

The first half of Series Four was decent, with Crocodile being one of my least favorite episodes while still managing to be watchable. 

However, Series Four really picked up its game with the latter half with Hang The DJ and Metalhead. And it had a hell of a strong finish with Black Museum. An improvement on Series Three, for sure. This just keeps getting better.

Monkey loves you,
T___T

Sunday, 3 March 2024

Film Review: Black Mirror Series Four, Redux (Part 2/3)

On to the next episode: Metalhead!

The Premise

We follow the trials and tribulations of a middle-aged woman named Bella, who is being hunted by - get this - a robotic dog.


Were you expecting more? Too bad, then, this is all there is. Honestly, what else do you need?!

The Characters

Maxine Peake does a fantastic job as Bella. Plucky, tenacious and compassionate. I was rooting for her to survive, but this is Black Mirror, after all. That being the case, this was a heroine I could really get behind. 

Clint Dyer as Tony. The weary black dude who gets killed in the first few minutes.

Jake Davies as Clarke. Jumpy fella. Comes across as someone who wants to do the right thing but has to be persuaded by deal-sweeteners.

The Mood

Dark, man, it's dark. Visuals aside, this is probably the most depressing Black Mirror episode ever, period. All hope goes out the window. Humanity is doomed.

What I liked

The fact that this episode was filmed entirely in monochrome. Think about it - dogs are color blind.


Holy shit, the Dogs are terrifying. Just the fact that they look like large iron roaches already made my skin crawl. Add the penchant for wanton violence and, well, dogged persistence, make them an extremely scary threat. Not to mention that part of their arsenal includes tracking devices embedded in shrapnel bombs, and short-range bullets! Their silence and obvious intelligence, as well as the inherent wrongness about the way they move, serve to make them intensely creepy in addition to being dangerous.


Not just their weapons - the little devices they have in their "paws" that enable them to commandeer vehicles and hack into houses. The plot points really revolved around those too!


The scanning from the dog's point of view is grainy, monochrome and nightmarish. Nice work!

I really liked the way Bella outsmarts the AI of the Dog hunting her and even takes the fight to the Dog. This gave me shades of Sarah Connor in Terminator.

Bella's tearful farewells on the comms are really poignant. They bring up an extended cast whom we never hear from (much) but add to the backstory.

What I didn't

If I had to quibble, this was thematically one of the worst fits in the Black Mirror universe. I mean, normally we see hints of advanced technology and humans screwing it up due to being human. This one was outright apocalyptic. Doesn't make it less fun, but I watch Black Mirror for certain things, y'know? There wasn't any of it here.

Conclusion

Not too heavy on the social commentary. There is basically one main character in here. If you're looking for an action-survival hour, this episode ain't too bad at all. However, if what you really want is some urban drama revolving around tech, maybe not so much.

But hey, I enjoyed it. The monochrome really reminded me fondly of Sin City.

My Rating

9 / 10

Next

Black Museum

Friday, 1 March 2024

Film Review: Black Mirror Series Four, Redux (Part 1/3)

It's time to continue with the review of Black Mirror Series Four!

We have the next few episodes lined up here, and trust me, these are great. And fear not, I'm gonna tell you why as we proceed on through this review. Suffice to say, Black Mirror Series Four really ups its game midway through this offering, and the latter three episodes reflect brave and refreshing choices.

The Premise

In an alternate reality where a dating system promises a 99.8% compatibility rate, two participants brave all odds to stay together despite the system deciding otherwise.


At the end of the entire episode, we see that this is about a dating app, but in a more meta context.

The Characters

Joe Cole as Frank. Didn't I see this guy in Peaky Blinders? Whatever, he's good here as an everyman with self-deprecating wit.

Georgina Campbell as Amy. Charming, beautiful, with a very healthy sex drive and great sense of humor.

George Blagden as Lenny. A hunk with a penchant for exhaling loudly. Just a little character quirk that annoys Amy no end.

Gwyneth Keyworth as Nicola. Supreme sourpuss, with all the charm of a blunt battle axe. The actress does a pretty decent job of making her unlikeable.

The Mood

Everything seems beautiful and glamorous in this episode, a sure sign that something is not quite right. It's all just so... neat.


I mean, even the houses the participants stay in, look like little doll houses!

What I liked

Whenever Amy and Frank are together in the same scene, even as a shy awkward couple or a pair of daring co-conspirators, the chemistry is amazing. I can totally buy them as star-crossed lovers. That is some great dialogue right there, and the two of them just carry it so well.



The design of the little devices that participants have to carry around. They're just flat circular palm-sized things, which matches the logo of the system - two interlocking circles! Pretty apt.

The recurring theme of the rocks skipping an exact number of times. SOmething I only picked up on at the second viewing, a hint that this is a computer simulation.

The twist at the end - that it's a simulation - was so cleverly done. And we see exactly how the 99.8% figure was achieved.

What I didn't

The episode title. These seem to get increasingly nonsensical in Series Four. Like, what the heck does "Hang the DJ" even mean?! It's just the refrain of the song they play at the end.

It's a little weird that the participants seem to have literally nothing else to do than wait for their next partner. Then again, perhaps this is a clue that the whole thing was a simulation.

Conclusion

This episode was not bleak, and even ended on an uplifting note. The twist, however, was very Black Mirror and I approve heartily.

My Rating

9 / 10

Next

Metalhead

Sunday, 2 July 2023

Confidence is overrated, and here's why, Redux

Roughly four years back, I wrote a blistering piece on how confidence is overrated. I stand by everything I said back then, but there are nuances to it. There are cases where projecting confidence actually helps your case, even if that confidence is not being backed by any substance. Confidence cannot be a substitute for actual substance. In that sense, it absolutely is overrated. I would rather be operated on by a cautious but extremely qualified surgeon who is constantly second-guessing himself (or herself) than some supremely confident upstart.

But in cases where the confidence is more important than actual skill, those are the cases where confidence is the skill.

John Cena

Someone recently told me told me that "John Cena speaks fluent Mandarin". Given that I had never heard this individual speak in anything but English, I was naturally skeptical - how would this guy even know what fluent Mandarin sounds like? Nevertheless, I had to check out this claim, and came across this video clip on YouTube. Somewhere in the middle, John Cena starts (or attempts) to speak Mandarin.


If anyone reading this blog is actually a Mandarin speaker, I apologize for what I just put you through. Yes, that was a long, long way from being "fluent". In fact, it was extremely hard for me to understand Cena's butchered version of Mandarin.

But as I watched on, my ears burning in agony, I noticed one other thing.

Despite his obvious deficiencies in the language, John Cena maintained a big smile as he uttered the gibberish they called "Mandarin". As he regaled the audience with his horrible Mandarin, the massive shit-eating grin on his face never wavered. He did not hesitate, or show any signs of being anything less than confident. And the non-Chinese crowd just ate it up.

This is the lesson I got from this. John Cena knew his Mandarin was crap. But it didn't matter. He wasn't there to teach linguistics, engage in a debate in Mandarin, or read a documentary. He was there to entertain, and by God, that's what he did. For the largely monolingual crowd (this being the USA, that's a safe assumption), it didn't matter either.

The confidence that John Cena projected, was the skill. Not his Mandarin, which was rubbish.

That job interview

I have mentioned before my habit of attending job interviews even though I have no intention of taking the job, just for the practice. I don't do it much these days, but there was a time I was doing it constantly.

At one such interview for the position of a Software Engineer, I went into the interview and did my thing (at this point I could pretty much do it with my eyes closed) and at the end of it, my interviewer asked me why I was so confident. He'd noted that my resume didn't showcase any skills or achievements that would have been special considering my years of work experience. There was nothing in it that warranted that air of confidence I projected. (If nothing else, I'm very honest in my resume and I flatly refuse to inflate anything).

Nerves of steel.

Shucks, I wasn't sure what to tell him. That his company was the tenth I had interviewed at this month alone? That I'd already been rejected by companies far bigger and more prestigious? That what he saw as supreme confidence was simply a case of me being inured to interview anxiety simply through constant exposure? And that since I did not lie on my (admittedly mediocre) resume, I felt completely able to back up everything on it?

Then he surprised me. He asked me if I would be open to a Managerial position instead. He explained that as a Software Engineer, I would probably be totally mediocre and he had many good candidates he was already considering. But what he needed was someone who could project the same confidence I did, to customers. Any technical work would be handed by the Software Engineers, so all he really needed was my confidence, and the actual substance would be provided by the technical team.

No, I didn't wind up working for him. By the time he came back to me, I was already working somewhere else.

But you see, this is another example of confidence actually being the skill rather than the supplement.

Don't get me wrong...

Confidence is still overrated. We cannot afford to think of confidence as a crutch for any deficiencies.

What confidence can do, is amplify what you're already capable of. It's a good complementary attribute. Conversely, lack of confidence can negatively affect your actual qualities.

What makes you confident?
T___T

Thursday, 25 May 2023

Film Review: Black Mirror Series Three, Redux (Part 3/3)

The last episode, Hated by the Nation, is styled like a police procedural and reminds me strongly of movies like Se7en, with a tech bent. It also boasts a really large cast.

This is the quintessential Black Mirror in the sense that the evils of Social Media and cyberbullying is central to the plot. In fact, it's like a violent and explosive version of The National Anthem.

The Premise

It's a few years into the future, and the extinction of bees has given rise to a tech creation known as Autonomous Drone Insects (ADIs). These tiny robots are used as an instrument for murder, with Social Media as a trigger. A nasty twist at the end ensures that few remain unscathed, either physically or psychologically.

The Characters

Kelly McDonald as Karin Parke. She's a jaded and cynical veteran of the force, and a divorcee. Every sarcastic quip and world-weary expression McDonald throws out is gold. For real, the dialogue is excellent. And McDonald delivers like a pro.

Liza: What about the others who chipped in? Are you going to tell them off too? I didn't do anything!

Karin: Start a thread about it.


Now that was a performance I truly enjoyed. She puts a lot of people in their place just with a look or a carefully-placed stinging remark. Which makes it all the more poignant when it's quite obvious that the events have somewhat broken her.

Faye Marsay as Blue Coulson. A former idealist who wants some field experience. Coulson is tech-savvy and does a lot of the investigation regarding how the "Game of Consequences" works. She's a great foil to the bitter jadedness of Karin Parke.

Benedict Wong as Shaun Li from the National Crime Agency. I just about fanboyed out loud when the Sorceror Supreme appeared on screen! In here, he's a straight-laced, growly-voiced semi-antagonist, serious as a heart attack.

Jonas Karlsson plays the ADI engineer Rasmus Sjoberg. He provides, with earnestness, most of the exposition around the ecology of ADIs and the tech behind it.

Joe Armstrong as Nick Shelton. Other than being a victim, I'm not sure what use he was to the plot.

Elizabeth Berrington as Jo Powers. She's a provocative journalist who writes vicious articles that punch down, and punch down hard. This makes her a publicly hated figure, and she's the first victim of the hashtag. Berrington plays her as a woman with an extremely thick skin who weathers the constant vitriol hurled her way, letting everything roll off her.

Charles Babaloa as Tusk. An obnoxious black rapper who becomes the next target of public hate and thus dies a grisly death.

Ben Miles makes a delightfully foul-mouthed appearance as Tom Pickering, the slimy and heartless politician. We see him burst into expletives under pressure, and it is so fun to watch.

Holli Dempsey as Clara Meades. She's presented as a feckless young woman who earns public hate due to a silly and disrespectful prank.

James Larkin as Simon Powers, Jo's husband. Now, this role is tragic. Larkin plays him as a traumatized husband who had to watch his wife kill herself in violently crazed fashion.

Georgina Rich as Tess Wallander. She's a soft-spoken individual who was a victim of cyber-bullying, and the original inspiration for the deadly hashtag.

Duncan Pow as Garett Scholes. Some psycho who dispenses what he calls justice... but with the tech skills to actually make it happen. We don't see much of him except toward the end, and even then there's not all that much of him to form a strong opinion.

Vinette Robinson as Liza Bahar. She's a pre-school teacher who is found to be using the hashtag without really understanding the consequences but otherwise does not seem to be a horrible person. Later on, Scholes delivers her comeuppance and I can't help but feel that perhaps it was a bit much. It was probably deliberate, to show us just how disproportionate extremism can be.

Esther Hall as Vanessa Dahl. What was she even doing taking up space on-screen? What a waste. She existed for no other reason than to be the verbal punching bag for other characters, mostly Karin.


The Mood

It's a big city vibe, but with grim undertones to it. Karin and Blue pretty much nail it with their conversations while driving. The surroundings are bustling and lively and the investigative feel of the entire episode is pretty pervasive.

What I liked

The red herring in the form of Jo's cake was clever. And yes, like her husband said, "very creative".


The scene where Karin and Blue initially have a conversation in the former's car, contains a reference to the Series Two episode, White Bear. And it carries the same vibe that Brad Pitt and Morgan Freeman had in Se7en, with Kelly McDonald playing the part of the jaded veteran, and Faye Marsay being the earnest newbie who just wants to make the world a safer place.

I thought Tusk's death was particularly creative. Gotta see it to appreciate it.


I like the display where several ADIs fly in formation to form Granular's logo. It even rotates!


The screenshot doesn't do it justice, but the interior of Shaun's NCA-issued car is really impressive!


That sequence of the ADIs leaving their hive to wreak bloody murder, is both poetic and terrifying.

That entire episode, along with the final twist, is very characteristic of Black Mirror. The horrors of Social Media, and how people are utter dicks to each other. In particular, how people don't stop using the hashtag even after finding out what it does, and actually pile it on. This makes it really hard to sympathize with them later on.


And later on, when Karin and Blue wander through that hall filled with bodybags of victims, the sheer bleakness of the shot is iconic.

What I didn't

The format of having the episode framed by Karin as a narrator, felt unnecessary. The ending was also pretty ambiguous. This episode could have worked better as a full-length movie, with perhaps a proper resolution. As it was, it was already about 90 minutes in length.

Wait, if the ADIs attack based on facial recognition, couldn't potential victims just mask their faces for protection? Isn't that exactly what Scholes does at the end? Why the need for that sequence regarding the bunker to protect Pickering? This seems like quite the plot hole.

Conclusion

This final episode really rounded up Black Mirror Series Three really well. While the cast just seemed a little larger than it really needed to be, the snappy dialogue and tension-laced action absolutely did it for me. This is a great addition into the franchise despite some totally superfluous bits.

My Rating

9 / 10

Final Thoughts on Black Mirror Series Three

I liked Series Three as a whole. After the slight disappointment that was Series Two, Black Mirror came back strong with plenty of content, all the while staying somewhat true to what came before.

San Junipero was the standout, though in terms of storyline and vibe, it was very different from the entire Black Mirror universe. Still, it was a sweet love story that strongly resonated.

A close second was Nosedive and Shut Up and Dance. These were episodes that were very typical of Black Mirror, showcasing the ugliness of humanity, amplified by advanced (or in the case of Shut Up and Dance, not all that advanced) technology. Men Against Fire and Hated in the Nation were both strong action-packed offerings and gave me a satisfying conclusion to Series Three. And while Playtest wasn't (in my opinion) as good as the others, it was by no means a weak episode.

All in all, this was very, very satisfying.

#DeathToBlackMirror (heh heh)
T___T

Tuesday, 23 May 2023

Film Review: Black Mirror Series Three, Redux (Part 2/3)

This next episode is Men Against Fire, and deals with what looks like a post-apocalyptic world where the same Zed-eyes technology is deployed. This time, it's known as the MASS system and controls what soldiers see, hear and smell. This episode is actually very heavy on the action, though dread also plays a big part. The creep factor comes in midway through this episode.

The Premise

This episode centers around a soldier, named Stripe, who is initially tasked as part of a team effort, to eliminate a race of diseased humans named "Roaches". Things take a sinister turn when he discovers the truth behind the Roaches and has to live with his conscience.

The Characters

A very buff and good-looking Malachi Kirby plays Stripe, real name Koinage. He does OK as a soldier starting off enthusiastic and compassionate, and later on transitioning to a human being wracked by guilt. I didn't feel all that strongly about his performance because he kind of gets outacted by almost everyone he has a scene with.

Madeline Brewer knocks it out of the park in the role of Raiman. She's a soldier like Stripe, all tomboy bloodthirsty action-girl and cute as a button. The boisterous performance she puts up here, along with lewd commentary and good-natured roasting, it's really easy to see her as one of the guys despite her pint-sized figure. This is pretty much a supporting role, but it's done so well.

Michael Kelly as Arquette. If there's any way to instantly point to a character as the real bad guy, it's to cast the man who played Douglas in House of Cards, in this role. Kelly's dead-eyed gaze and soft-spoken affability make him a terrifying bad guy and utterly believable sociopath.

Sarah Snook as Medina, Stripe and Raiman's commanding officer. The script requires her to be matter-of-fact, dignified and steely, which she does really well. Up until her sudden death.

Ariane Labed cuts a tragic figure as Catarina. She delivers the much-needed exposition before her death at Raiman's hands.

Loreece Harrison as Stripe's fantasy girl. That was the source of the sex and nudity in this episode, but she's not just a pretty face. The smile on that face is sometimes subtly unsettling, and I'm not sure if that is deliberate. Kudos if so!

Kola Bokinni as Lennard. This guy is surly and mean. And that's all we actually see of him, which is a pity because so much more could've been done.

Francis Magee as Parn Heidekker. Magee plays him with solemn gravitas.

Simon Connolly as doctor. Just a bit part which felt totally unnecessary.

The Mood

In contrast with the previous episode, this episode is almost colorless. It's very drab, with everything viewed in very bleak hues. It paints the picture of a world with no life in it.



Even in the end sequence where we see Stripe's actual home against what he is seeing, in the "idealized" version, the most we get is pastel-white.

Definitely there's a whole lot of blood and violence in here and it feels like an action flick.

What I liked

The translator gadget is a nice touch.


The MASS technology allows images to be transmitted to the brains of the soldiers. This is a very cool, and important plot point. 3D-imaging too! Great for tactical decisions.


That scene where Stripe's dream sequence with his dream woman turns into a full-on orgy with several identical girls is both erotic and extremely creepy.

Medina's sudden death was a shock to me. Well played!

I like how Stripe's senses come back once his MASS implant is damaged, being able to smell grass and all. It's good foreshadowing on how the MASS system was obscuring the truth.

Arquette's entire conversation with Stripe at the end. Michael Kelly is in his element here. All that exposition and histrical background, leading up to the sadistic choice he gives Stripe. This was both a spine-chilling and awesome sequence.

What I didn't

The title of this episode doesn't seem to make any sense. What does "Men Against Fire" mean, exactly?

The faces of the Roaches just look like cheap plastic masks. Granted, this is probably budget constraints, but still.


Raiman sings that song How do I know what love is to annoy Parn Heidekker and ends up annoying me as well. Like, do we always have to hear this song? This is the third time it's appeared in a Black Mirror episode. The first time was nice, the second was amusing, but enough is enough.

The entire thing just felt a bit light in the story department. It was more of a creepy action movie than an actual Black Mirror episode.

Conclusion

Phew! This was one brutal episode. It's unflinching in its depiction of violence, showing us that women and children get gunned down, with the accompanying blood and guts. There's racial purity fanaticism at the core of this, and an examination of how augmented reality and propaganda can further some truly horrific causes. Remember, the villagers in the story don't have the excuse that they literally see Roaches as monsters.

Special shout-out to Michael Kelly. He really made this episode for me. What an actor. He just played a heinous psycho so well.

My Rating

8.5 / 10

Next

Hated by the Nation

Sunday, 21 May 2023

Film Review: Black Mirror Series Three, Redux (Part 1/3)

We're back with the next three episodes of Black Mirror Series Three! Took me a few weeks (or several), but here it is. We will be going through San Junipero, Men Against Fire and Hated in the Nation. There are a few surprises in store.

Warning

There will be spoilers ahead. And plenty of profanity. And stories of tech fouling up our lives. Basically, whatever you've come to expect of Black Mirror, is gonna be in there, and more!

The Premise

This next story, San Junipero, takes place largely in a virtual reality world, where the time periods vary. It's also pretty much a love story and there's even a happy ending. But it wouldn't be Black Mirror if there wasn't a little something at the end...

The Characters

Mackenzie Davis is the lanky and timid Yorkie, who learns to live even as she dies. I last saw Davis in Terminator: Dark Fate. I didn't love the movie, but this woman's one hell of an actress! These two characters couldn't be more different.

Gugu Mbatha-Raw is Kelly. Vivacious, bodacious. And those bedroom eyes! And that temper when its let out. This lady delivered.

Gavin Stenhouse as Wes, whom Kelly describes as "not a bad guy" despite being all obsessed after their one-night stand. Stenhouse plays him as a somewhat decent guy who has his own issues to work through.

Denise Burse as actual Kelly. She looks like she could actually be an aged Kelly. Burse plays her with grace and just the right amount of cheekiness.

Annabel Davis as actual Yorkie. There doesn't seem to be much to the role; they could have just used a mannequin.

Raymond McAnally as Greg, Kelly's nurse. He's played as this jovial nice guy with an "aw shucks" demeanor. Not gonna lie, I snickered a little at the actor's name.

Billy Griffin Jr puts in a couple appearances as video game nerd and romantic hopeful Davis. There's something very endearing about his puppy-dog enthusiasm.

The Mood

It begins in colorful fashion as the episode tells us that this is the 80s with references to Max Headroom, The Lost Boys and Belinda Carlisle. It's a very party vibe complete with big 80s hair, disco and even arcade games. Later time periods are less flashy, showcasing movies like Scream, The Bourne Identity and even what looks like a Pink music video.

Soon, we're taken on a tour of the seaside town that is San Junipero and things get rather strange from there. And all around, there's always a hint of something else going on beneath the surface, like nothing is what it seems.

This also seems to be the first episode in Black Mirror that's set in the USA, rather than in the UK.

What I liked

The little subtle nods to what was really going on. Yorkie turns down a chance to play Top Speed when she sees the animated car crash because it reminds her of her own accident. The club is named Tucker's, and the company that actually sets up the simulation, is TCKR. Even the name "San Junipero" is a Spanish version of the hospital's name, "St Juniper's".

The music! The 80s fashion! The 90s visuals! So good. Even the arcade games change with the time priod. Love it!

The Quagmire is awesome in its depravity and I'm really hoping it gets more airtime in future episodes.

The lesbian sex between Kelly and Yorkie is kept brief and just long enough to be obvious as to what's going on. It's not played for titillation, and the pillow talk is both tasteful and contains clues as to what San Junipero really is.


That scene where Kelly breaks the mirror and it magically repairs itself, is such a sly nod to the series.


That futuristic vehicle that Kelly rides in... that design. It speaks to me.


Yorkie's vanity plate is cute.


That slightly creepy vibe in the mid-credits. This is Black Mirror, remember?

What I didn't

I was slightly disappointed to find that there's no nasty ending to this episode. Yes, Black Mirror has conditioned me to expect certain things.

That close-up of Kelly's gravestone was nowhere clear enough for me to see the name. Minor quibble, I know.

Conclusion

This was the only Black Mirror episode so far that wasn't depressing as fuck. Normally, I'm not a fan of love stories, but this one was surprisingly poignant. It dealt with existential issues without going in way too deep, and touched me on a very emotional level.

My Rating

9.5 / 10

Next

Men Against Fire

Sunday, 11 December 2022

Eyes Off The Prize!, redux

One year has passed since I wrote this blogpost about taking your eyes off the prize, and how this could be an actually more optimal way to move. This is an opportune time to revisit the subject, since I'm not sure I explained the concept all that well the last time round.

A recent shock

Back in June, I took a blood test. The results left me flabbergasted. While blood sugar and pressure were fine, cholesterol levels had skyrocketed since the last blood test six months ago. That meant in the past six months, something in my lifestyle had caused this to happen in my body.

Annual bloodwork.

For sure, it wasn't lack of exercise. I was working out five times a week. Couldn't have been the smoking; this blood test was a recent thing. Therefore, it was most definitely the food. It wasn't like I was pigging out every day, but I had been frying unhealthy stuff for dinner because it was cheap and convenient. Daily.

This had gone unnoticed because I had not put on weight, nor had my waistline expanded. This had led me to believe that everything was fine; in reality, it was the daily exercise that had kept fat at bay. However, cholesterol is not fat, visible or otherwise, and there is no way to exercise it off. Thus, the only way I found out was through a blood test, which, by the way, is absolutely recommended for everyone above their mid-thirties.

The doctor recommended medication, but I was like, fuck that noise. I was going to do it my way.

Lifestyle changes

A dietary change was in order. Instead of buttered toast or a sweet bun at the coffeeshop, breakfast was now a boiled egg and a lettuce sandwich. Instead of frying stuff for lunch, I had half that sandwich.

That lettuce sandwich!

And for dinner, I ate organic rolled oats boiled in milk, with bananas and dried fruit.

On weekends, I'd go out for meals with the wife and give myself a break. But come weekdays, it was back to the grind. Only, it turned out not to be that much of a grind, but more on that later.

Two months later, I went for another blood test and my cholesterol levels had gone down a full sixty percent. The doctor was impressed enough at the progress that instead of recommending medication, he instead told me to keep doing what I was doing.

The point behind taking your eyes off the prize

People were gushing over how much discipline it must have taken, but in truth, discipline was only required for about two weeks. Beyond that, I had hit my stride and it had become a matter of routine. I was on autopilot at that point. After the second week, I was eating my oats without thinking about the fact that I was eating oats.

You see, I did have an objective - improve on my cholesterol readings. More importantly, I wanted to achieve that goal in a way that would not put too heavy a strain on myself. Hence, the dietary change. The prep work, the washing up; all of that were tasks that were designed to take a minimum of fuss. The real feat most people imagined, was to be able to eat oats for days at a time, over a period of two months.

Oats daily.

That's where my singular advantage comes in. I'm quite possibly the most boring man in Singapore. I don't crave variety. I don't have this need to seek out new and exciting experiences. This makes it far easier for me than others, to be consistent. Once familiarity sets in, I'm good to go. Forget two months; it's been six now, and I'm still going. Thus, the probability of me going back to my old ways after meeting the original objective, is about nil.

Professionally...

This is apparent in the existence of this blog. Initially, this was set up so that I would hone my craft on a regular basis, and have prospective employers see this. And it worked. I learned new technologies, kept up to date with tech news and developments, kept myself sharp. I progressed from employer to employer, building up my portfolio as time passed.

As mentioned before, I surpassed my income goals a long time ago before I even realized it. Why do I still do this?

Why am I still
taking shots long
after scoring?

Because it's become a habit. A very productive habit. It has become an integral part of my lifestyle. Without it, I might be engaging in any number of less wholesome pursuits. Getting into the salary range was the original objective, but because my eyes weren't on the prize, I came further than I ever imagined. I arrived at this point at least partially because of this habit, and me staying on this trajectory is probably dependent on maintaining this habit. Stopping at this point just because I seem to have obtained the prize, could turn out to be dangerously complacent.

In Conclusion (for real this time)

The value of the prize is not the prize itself, but the habits you formed while getting there, and the lessons you learned.

No doubt, people need to have goals. However, what's arguably more important is a realistic and sustainable way to them, and beyond.

Don't let the destination get in the way of the journey,
T___T