Thursday 23 February 2023

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

Now for a comparatively low-tech episode of Black Mirror. Shut Up and Dance doesn't have any futuristic tech. It's more a commentary on computer security and perhaps online vigilantism.


Everything shown in this episode already exists in the world as we know it, and the threats are real. There have been reports of people being blackmailed via footage taken from their own web cams.

The Premise

We follow the trials and tribulations of teenager Kenny as he is made to jump through hoops after being blackmailed by a team of anonymous hackers. This culminates in tragedy for him and all the other victims involved.

The Characters

Alex Lawther as the shy, awkward Kenny, whom we are first led to believe is guilty of little more than being caught on camera masturbating to porn. Until, at the end, we find out that it was child porn. Lawther is astonishing in the role. As the role demands, he appears as a timid teenager who has a certain charm with kids, and as he begins getting blackmailed, his panic and fear are palpable. And there are times when he looks proper demented. Every time he bursts into tears on-screen, I'm marvelling at that talent.

Jerome Flynn is Hector. He's also Bronn from Game of Thrones, and damn does he channel shades of Bronn here! He's snarky, rough around the edges and cusses an awful lot... thugh that's where the similarity ends because he's nowhere as physically capable as Bronn. Still intensely watchable though! He gets the best lines, that's for sure.

What... jerking off? Well everyone's done that. The fucking pope probably does that.


And this. It's not so much the dialogue, it's the way Flynn delivers it.
That's what they got, yeah? Your hot little face, blurred fist, dick burping fucking spunk everywhere - your mum's gonna love that on Facebook, Twitter, Insta-fucking-whatever. And her friends, all eyes on you. Giving you that... Toss in the cunts at work, calling you 'Spurty McGoo', laughing at your cum face, making it their desktop wallpaper...it's not just weeks, we're talking years here. Pictures hang about on Google like a gypsy fucking curse! There's no cure for the internet, it would never go away. It would be glued to your name, a fucking stain on you! I'd hang myself if that was me. Crack my fucking neck at the first opportunity.


Ivanno Jeremiah as delivery guy. Barely showed up, could have done more with him.

Susannah Doyle as another blackmail victim who did something or other with a car at the start of the episode. Disposable, barely noticed her.

Paul Bazely
as the other pedophile. He's drunk and shaking, and I like the way the actor transitions to naked aggression. He did a great job; I could almost taste the heady mixture of desperation and resignation rolling off him.

Natasha Little as Karen, who's a pleasant enough lady that you feel bad for being annoyed with her for holding up Hector and Kenny with her request for a ride, and her incessant chatter inside the car.

Maya Gerber as Kenny's cheeky irreverent sister, Lindsay. She seemed like a fun character, wish we could've seen more of her.

Camilla Power as Kenny's mother Sandra, who appears to be the typical single mom out for a date.

The Mood

It starts out quiet, and then gets grim really quick, with high-stakes tension and gritted teeth. Near the end, things get literally dark as the episode ends at night with Kenny being arrested.

What I liked

The sequence where Kenny rides his bike on a race against time. It's done POV, intercut with scenes of his progress on his phone. This adds to the suspense and is masterfully done.




The foreshadowing of Kenny being good with kids, and that brutal twist when it turns out he jerks off to child porn.

That final handshake between Hector and Kenny, like they've formed some kind of trauma bond. It's a nice touch!


And can I just say, that music at the end when they're all outed, plus the trollface!

What I didn't

I have trouble believing that Kenny managed to kill this guy, who definitely outweighs him, had longer to mentally prepare and just as desperate not to be outed as a pedophile.


The blackmailers strike me as just a little inefficient. The whole mess with Karen could have been avoided if they'd made sure the car's tank was full. Maybe this was a way to introduce some filler into the episode, ratchet up the tension. Who knows?

The victims comprise of four men (that we can see) and one woman. The woman's "crime" is racism. As for the men? Two of them are blackmailed due to child pornography, one for something "perverted" and one for adultery. Like seriously, does the writer of this episode have this preconception in his or her mind that men are obsessed with sex and nothing else?!

Conclusion

No one is the hero of this story - not the victims, not Kenny and certainly not the anonymous hackers who destroy their lives with vigilante justice. The victims aren't rich and powerful and therefore harder for the long arms of justice to reach. In the case of some of the other victims, their crimes - adultery, racism and pornography - aren't technically crimes in the sense that they aren't illegal. And even in the case of pedophiles, they are entitled to a fair trial.

I thoroughly enjoyed this one. The increasing desperation of the victims and the amazing twist at the end... all goes to show that we don't need futuristic tech or pretty cars (not that there's anything wrong with that) to build a good chilling tech tale.

My Rating

9.5 / 10

Final thoughts on Black Mirror Series Three so far...

There's more to follow; another three episodes when I have the time. But honestly, after the slight letdown that was Series Two, this was pretty good! I was undeniably entertained and none of the episodes I've watched so far, strike me as particularly weak.

Nosedive was vintage Black Mirror in the vein of other high-tech episodes, a case of Social Media sucking to high heaven. Playtest was another high-tech affair, though I take points off for being a little too conventionally horrific. The third and final one in this review made sure that things continued on a strong note, with modern-day tech this time and very relatable human evil.

Yep, Series Three is looking pretty damn promising. Can't wait to see the rest!

The fucking pope probably reads my reviews!
T___T

Monday 20 February 2023

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

This episode we will be discussing is Playtest, and it's very gamer-centric. It's also different in the sense that there's none of that Zed-eyes type stuff that appeared during The Entire History Of You, White Christmas and Nosedive.

This does not, however, mean that we will be going low-tech. If anything, the tech in here arguably even more futuristic, dealing with uploads to the brain as opposed to "just" making copies and recordings.

The Premise

Cooper is paid to playtest a new gaming concept by gaming company Saito Geimu - an immersive horror virtual reality game. This being Black Mirror, something of course goes horribly and ironically wrong.

The Characters

Wyatt Russell is Cooper Redfield. The script paints him as a nice sensitive guy, if sometimes unethical. Personally, I think he did fine even though his very prominent chin got a bit distracting in the early stages. Thankfully that beard later on took care of that. And guess what - he plays U.S Agent in The Falcon and the Winter Soldier! Dude was definitely working out after this episode, because he looks kind of doughy here.

Hannah John-Kamen as Sonja, whom I last saw in Ant-Man and the Wasp and Resident Evil: Welcome to Raccoon City. She's all right here. Seems like a poor man's Emily Blunt.

Wunmi Mosaku as Katie. Friendly and professional, sometimes dry and sarcastic. I enjoyed that performance.

Ken Yamamura as Shou Saito, the Japanese game designer. At first glance, he comes across as warm, friendly and enthusiastic about his craft. Near the end, when we see the real him, he's more sociopathic genius than anything. When the playtest fails and Cooper dies, he looks more bored than anything.

Elizabeth Moynihan appears near the end as Cooper's mother, who is suffering from dementia. She cuts a pretty tragic figure.

The Mood

Things start out bright, cheery, and dare I say, pedestrian. Midway through, it goes into clinically white, which seems to be a pattern with Black Mirror, and things soon become dark and sinister once Cooper begins his playtesting.

What I liked

The tech visuals are nice. The equipment, the interfaces and all, don't look over-the-top. It's smooth, minimalistic design.


Cooper and Sonja has this American-vs-Brit thing going. Cooper even has this line, which was cheesy, but elicited a chuckle. Wyatt Russell really sells it too.

All right. You are a top bird. I don't know what that means, but I heard somebody say it once, and you're it.


That Whack-a-Mole game is something else!


Since the system has scanned Cooper's head, everything he is experiencing from that point onwards contains little nods to stuff that went on earlier. For example, in the game, he is reading a book with this chapter. Earlier on, Cooper and Sonja met in a place called The Raven Inn. Man, talk about callbacks!




Hot damn, that twist at the end! That was a shocker, for sure.

What I didn't

The entire ten to twenty minute montage of Cooper leaving home, going through his travels, up to the point he finally begins playtesting, just feels like filler.

A Redfield in a haunted mansion? Seems to tread overly familiar ground here. What's more, Sonja's actress actually plays Jill Valentine in Resident Evil: Welcome to Raccoon City years later!

Conclusion

Great, great story. Started off a little lame and sad, but the last few minutes of it made it all worthwhile. Definitely a worthy entry in Black Mirror. Unlike many of the other tales, there's no overt moral to this tale and that's a little disappointing. The horror in this episode is more classic horror and jump scares, not the more cerebral kind Black Mirror usually gives us.

My Rating

9 / 10

Next

Shut Up and Dance

Friday 17 February 2023

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

Black Mirror has grown! Series Three is a whopping six episodes, and today we are going through just three of them because, y'know, my mental bandwidth is limited.


We have Nosedive, Playtest and Shut Up and Dance. All good in their own way, and as usual, centered around how tech can ruin your lives.

Warning

The language can be pretty spicy, and obviously there will be spoilers. So let's forge on ahead!

The Premise

The first episode, Nosedive, revolves around the life of Lacie Pound in a world where social approval and clout has become everything. We see how her life rapidly derails after a series of incidents which see her approval rating, er, well, nosedive.

The Characters

A chunky Bryce Dallas Howard as Lacie Pound. She put on thirty pounds to play the role of the insecure chubby girl, and man, that's dedication! Gotta say, the role was very well performed too. We get to see Lacie put on a fake face for approval, her desperation for social climbing and her occasional nastiness which slips out. Howard is superb! I've seen her from films like The Village, Spider-man 3, Terminator Salvation and Jurassic World, and this lady can be such a chameleon.

Alice Eve plays the Alpha bitch Naomi Jayne Blestow with aplomb. The last I saw of her was from Iron Fist Season Two, and Star Trek: Into Darkness. This role fit her like a second skin.

James Norton as Ryan Pound, Lacie's brother. This actor did great with what little material he had. The character was a slacker, and snarky, but also genuine in his misgivings as to what his sister had become in her pursuit for public approval. And the character had great lines. Like, really zingy. Guy nails every scene he's in.

There's sugary and then there's fucking diabetes.


Michela Coel makes a brief appearance as an unnamed airport service counter officer. Saw her recently in Wakanda Forever. The scene here lasts a few minutes, but she does well. That eyebrow game is strong.

Alan Ritchson as Paul Mathesen. I watched the first season of Reacher right before I watched this one, and almost did not recognize him right away. There's just not much meat to the role other than to look hunky and act borderline gay with his best bud, Ant.

Daisy Haggard
overacts as Bethany or "Bets". Or maybe she was supposed to be over-the-top and Haggard did too good a job... I can't decide which.

Kadiff Kirwan as Chester, who looks pathetic and ready to burst into tears in every scene. That's the character, not the actor. Actor did just fine.

Cherry Jones as Susan. I first got a sinister vibe when she was introduced, but that was the episode gaslighting me into taking her 1.4 rating seriously. No, she turns out to be pretty all right, if a bit kooky, with a tragic backstory and all that should have served as a warning for Lacie.

Colin Moss as Paul's bestie, Anthony, or "Ant". Frat boy shit. Nothing to see here, move along.

Andrew Roux as the car booth attendant. It was a short appearance, but the eye-rolling snark was delicious!

Sope Dirisu plays the black dude who's Lacie's jail mate. Good-looking, well-cuffed, foul-mouthed. A delightful package for such a short appearance.

De-wet Nagel as Reputelligent consultant Hansen Davis. As someone who's studied Data Analytics, I had a real kick out of watching him explain Lacie's popularity stats to her.

The Mood

The atmosphere is relentlessly colorful and bright. In fact, it's artificially so, as if someone's trying just a little too hard. This is deliberate; to show the viewer just how fake and garish all this is. Everyone laughs, smiles, giggles... and is way too nice for it to be real. The episode looks like a moving stock photo in parts!


What I liked

The whole clout-chasing thing reminds me of how people Follow each other on Clubhouse and Instagram. It's very on the nose.


The look on the cabbie's face as Lacie squeals and giggles in the back seat, is to die for.

The cars. So pretty!


The booth attendant is obviously watching porn when Lacie interrupts him. While we can't see it, the sounds coming from his earbuds are pretty telling.

The way the smile on Naomi's face fades when her groom and best man are hugging it out, is a delectable nod to some social dynamics. Adds depth to the episode.

Despite having put on thirty pounds to play Lacie Pound (wow, talk about apt names!), Bryce Dallas Howard still looks yummy without that dress on. No, no pics, you pervs.

The jail cell bars are glass (probably bulletproof) or plastic with air holes. Nice touch!

Lacie's traded insults with her cell neighbor are pretty creative. And the sheer glee behind the vitriol they spit at each other, is a joy to watch.

What I didn't

I know that scene was necessary, but watching Lacie rehearse her speech was just so cringe.

Lacie just asks a guy if she can borrow his bike, and he just lets her have it? How?! Before, it was shown that road users are really dicks who will kick you when you're down. Pains were taken to show that Susan was a rare exception. Plus, I don't think the guy even got his bike back!

Conclusion

This was such a typical Black Mirror storyline. Tech and Social Media fucks lives up. But yes, thoroughly enjoyable. Sure didn't hurt that they had some of the most watchable faces in cinema in this episode - Bryce Dallas Howard, Alice Eve and Alan Ritchson.

It's a strong start to Series Three, that's for sure!

My Rating

9.5 / 10

Next

Playtest

Sunday 12 February 2023

Web Tutorial: Valentine's Day Animated SVG

Valentine's Day is here in a couple days. As tradition demands, I've got a nice web tutorial for an animated SVG.

We begin with some boilerplate HTML with an SVG parked in the middle. The div has been given a red outline because the boundary will be important for us to see where things begin and end.
<!DOCTYPE html>
<html>
    <head>
        <title>Happy Valentine's Day!</title>

        <style>
            #svgContainer
            {
                width: 500px;
                margin: 5em auto 0 auto;
        outline: 1px solid red;
            }

            svg
            {
                width: 500px;
                height: 500px;
            }
        </style>
    </head>

    <body>
        <div id="svgContainer">
            <svg>
                SVG not supported
            </svg>
        </div>
    </body>
</html>


Start off with something simple. Two text tags.
<svg>
    <text x="155" y="60" class="message">HAPPY</text>
    <text x="70" y="100" class="message">VALENTINE'S!</text>

    SVG not supported
</svg>


Style them here. I'm making them a nice pink.
<style>
    #svgContainer
    {
        width: 500px;
        margin: 5em auto 0 auto;
    }

    svg
    {
        width: 500px;
        height: 500px;
    }

    .message
    {
        fill: rgb(255, 200, 200);
        font: bold 50px verdana;
        textLength: 100%;
    }    

</style>


Nothing too elaborate there.




Let's get to the heart (heh heh) of the matter. We will make an SVG heart using the path tag and some curves. We will preemptively style this to have a black background.
svg
{
    width: 500px;
    height: 500px;
}

.heart
{
    fill: black;
}    
    

.message
{
    fill: rgb(255, 200, 200);
    font: bold 50px verdana;
    textLength: 100%;
}    


Now with the d attribute, start in the horizontal middle of the SVG, and maybe a third of the height vertically. Don't forget to style it using the CSS class heart.
<svg>
    <text x="155" y="60" class="message">HAPPY</text>
    <text x="70" y="100" class="message">VALENTINE'S!</text>
    
    <path d="
    M 250 200
    Z"  class="heart"/>


    SVG not supported
</svg>


Move to the left.
<path d="
M 250 200
q -100 0
Z" class="heart"/>


Apply a curve upwards. Vertically, we tug the line upwards by 60 pixels, and horizontally left by 50 pixels.
<path d="
M 250 200
q -50 -60, -100 0
Z" class="heart"/>


See where this is going?




Now go back right to the middle, and way down.
<path d="
M 250 200
q -50 -60, -100 0
q 100 150
Z" class="heart"/>


The curve is applied. Go left 50 pixels and down 80 pixels. I had to experiment with different values to get it just right.
<path d="
M 250 200
q -50 -60, -100 0
q -50 80, 100 150
Z" class="heart"/>


And we have half a heart!




Move right and up.
<path d="
M 250 200
q -50 -60, -100 0
q -50 80, 100 150
q 100 -150
Z" class="heart"/>


The curve to apply here is tricky, and you really have to understand your curves well. You have to tug the line right 150 pixels. And because you're moving from a lower position to a higher position, the vertical offset is negative. Hard for me to explain, but try it yourself!
<path d="
M 250 200
q -50 -60, -100 0
q -50 80, 100 150
q 150 -70, 100 -150
Z" class="heart"/>


Three quarters done!




Back to the origin, with one last curve.
<path d="
M 250 200
q -50 -60, -100 0
q -50 80, 100 150
q 150 -70, 100 -150
q -50 -60, -100 0
Z" class="heart"/>


Now you got a heart.




Let's fill this in! We want a 3D effect, so we style it with a gradient. The gradient will be called heartGradient.
.heart
{
    fill: url('#heartGradient');
}    


Start a defs tag and input the gradient here.
<svg>
    <defs>
        <radialGradient id="heartGradient">

        </radialGradient>
    </defs>


    <text x="155" y="60" class="message">HAPPY</text>
    <text x="70" y="100" class="message">VALENTINE'S!</text>


It begins with a very light pink, at the top right...
<radialGradient id="heartGradient" cx="10%" cy="10%" r="90%" fx="10%" fy="10%">
    <stop offset="0%" style="stop-color:rgb(255, 200, 200); stop-opacity:1" />
</radialGradient>


...to red...
<radialGradient id="heartGradient" cx="10%" cy="10%" r="90%" fx="10%" fy="10%">
    <stop offset="0%" style="stop-color:rgb(255, 200, 200); stop-opacity:1" />
    <stop offset="20%" style="stop-color:rgb(255, 0, 0); stop-opacity:1" />
</radialGradient>


...to brown and then dark brown. The percentages ensure that red takes up the majority. Opacity is 1 all the way.
<radialGradient id="heartGradient" cx="10%" cy="10%" r="90%" fx="10%" fy="10%">
    <stop offset="0%" style="stop-color:rgb(255, 200, 200); stop-opacity:1" />
    <stop offset="20%" style="stop-color:rgb(255, 0, 0); stop-opacity:1" />
    <stop offset="90%" style="stop-color:rgb(200, 0, 0); stop-opacity:1" />
    <stop offset="100%" style="stop-color:rgb(150, 0, 0); stop-opacity:1" />

</radialGradient>


Beautiful!




Now let's apply a shadow. Add an ellipse below the heart. It will be wide and flat, and styled using the shadow CSS class.
<svg>
    <defs>
        <radialGradient id="heartGradient" cx="10%" cy="10%" r="90%" fx="10%" fy="10%">
            <stop offset="0%" style="stop-color:rgb(255, 200, 200); stop-opacity:1" />
            <stop offset="20%" style="stop-color:rgb(255, 0, 0); stop-opacity:1" />
            <stop offset="90%" style="stop-color:rgb(200, 0, 0); stop-opacity:1" />
            <stop offset="100%" style="stop-color:rgb(150, 0, 0); stop-opacity:1" />
        </radialGradient>
    </defs>

    <text x="155" y="60" class="message">HAPPY</text>
    <text x="70" y="100" class="message">VALENTINE'S!</text>

    <path d="
    M 250 200
    q -50 -60, -100 0
    q -50 80, 100 150
    q 150 -70, 100 -150
    q -50 -60, -100 0
    Z" class="heart"/>

    <ellipse cx="250" cy="400" rx="120" ry="10" class="shadow" />

    SVG not supported
</svg>


The fill will be shadowGradient.
.heart
{
    fill: url('#heartGradient');
}    

.shadow
{
    fill: url('#shadowGradient');
}


.message
{
    fill: rgb(255, 200, 200);
    font: bold 50px verdana;
    textLength: 100%;
}


And this gradient is simple - grey to white, but with 0 opacity at the white part.
<defs>
    <radialGradient id="heartGradient" cx="10%" cy="10%" r="90%" fx="10%" fy="10%">
        <stop offset="0%" style="stop-color:rgb(255, 200, 200); stop-opacity:1" />
        <stop offset="20%" style="stop-color:rgb(255, 0, 0); stop-opacity:1" />
        <stop offset="90%" style="stop-color:rgb(200, 0, 0); stop-opacity:1" />
        <stop offset="100%" style="stop-color:rgb(150, 0, 0); stop-opacity:1" />
    </radialGradient>

    <radialGradient id="shadowGradient" cx="50%" cy="50%" r="100%" fx="50%" fy="50%">
        <stop offset="0%" style="stop-color:rgb(100, 100, 100); stop-opacity:1" />
        <stop offset="50%" style="stop-color:rgb(100, 100, 100); stop-opacity:0" />
    </radialGradient>

</defs>


Here's your shadow!




Now we're going to place circle tags before and after the heart. So some will appear behind and some will appear in front. The CSS class is mote.
<circle class="mote"></circle>
<circle class="mote"></circle>
<circle class="mote"></circle>
<circle class="mote"></circle>
<circle class="mote"></circle>
<circle class="mote"></circle>
<circle class="mote"></circle>


<path d="
M 250 200
q -50 -60, -100 0
q -50 80, 100 150
q 150 -70, 100 -150
q -50 -60, -100 0
Z" class="heart"/>

<circle class="mote"></circle>
<circle class="mote"></circle>
<circle class="mote"></circle>
<circle class="mote"></circle>
<circle class="mote"></circle>
<circle class="mote"></circle>
<circle class="mote"></circle>


All of them will be filled in using moteGradient.
.heart
{
    fill: url('#heartGradient');
}    

.shadow
{
    fill: url('#shadowGradient');
}    

.message
{
    fill: rgb(255, 200, 200);
    font: bold 50px verdana;
    textLength: 100%;
}    

.mote
{
    fill: url('#moteGradient');
}


moteGradient is from pink to white, again with opacity 0 at the white part.
<defs>
    <radialGradient id="heartGradient" cx="10%" cy="10%" r="90%" fx="10%" fy="10%">
        <stop offset="0%" style="stop-color:rgb(255, 200, 200); stop-opacity:1" />
        <stop offset="20%" style="stop-color:rgb(255, 0, 0); stop-opacity:1" />
        <stop offset="90%" style="stop-color:rgb(200, 0, 0); stop-opacity:1" />
        <stop offset="100%" style="stop-color:rgb(150, 0, 0); stop-opacity:1" />
    </radialGradient>

    <radialGradient id="shadowGradient" cx="50%" cy="50%" r="100%" fx="50%" fy="50%">
        <stop offset="0%" style="stop-color:rgb(100, 100, 100); stop-opacity:1" />
        <stop offset="50%" style="stop-color:rgb(100, 100, 100); stop-opacity:0" />
    </radialGradient>

    <radialGradient id="moteGradient" cx="50%" cy="50%" r="100%" fx="50%" fy="50%">
        <stop offset="0%" style="stop-color:rgb(255, 200, 200); stop-opacity:1" />
        <stop offset="50%" style="stop-color:rgb(255, 200, 200); stop-opacity:0" />
    </radialGradient>

</defs>


Each of these will have different positions and sizes.
<circle cx="190" cy="370" r="5" class="mote"></circle>
<circle cx="220" cy="350" r="8" class="mote"></circle>
<circle cx="260" cy="380" r="10" class="mote"></circle>
<circle cx="290" cy="390" r="5" class="mote"></circle>
<circle cx="2950" cy="380" r="3" class="mote"></circle>
<circle cx="300" cy="370" r="10" class="mote"></circle>
<circle cx="330" cy="350" r="8" class="mote"></circle>

<path d="
M 250 200
q -50 -60, -100 0
q -50 80, 100 150
q 150 -70, 100 -150
q -50 -60, -100 0
Z" class="heart"/>

<circle cx="190" cy="370" r="5" class="mote"></circle>
<circle cx="220" cy="350" r="8" class="mote"></circle>
<circle cx="260" cy="380" r="10" class="mote"></circle>
<circle cx="290" cy="390" r="5" class="mote"></circle>
<circle cx="295" cy="380" r="3" class="mote"></circle>
<circle cx="300" cy="370" r="10" class="mote"></circle>
<circle cx="330" cy="350" r="8" class="mote"></circle>


Here's what it should look like now.




Now to animate this shit! The animate tag should be inside each of these. For starters, the repeatCount property should be set to indefinite.
<circle cx="190" cy="370" r="5" class="mote">
    <animate repeatCount="indefinite" />
</circle>
<circle cx="220" cy="350" r="8" class="mote">
    <animate repeatCount="indefinite" />
</circle>
<circle cx="260" cy="380" r="10" class="mote">
    <animate repeatCount="indefinite" />
</circle>
<circle cx="290" cy="390" r="5" class="mote">
    <animate repeatCount="indefinite" />
</circle>
<circle cx="295" cy="380" r="3" class="mote">
    <animate repeatCount="indefinite" />
</circle>
<circle cx="300" cy="370" r="10" class="mote">
    <animate repeatCount="indefinite" />                    
</circle>
<circle cx="330" cy="350" r="8" class="mote">
    <animate repeatCount="indefinite" />
</circle>


<path d="
M 250 200
q -50 -60, -100 0
q -50 80, 100 150
q 150 -70, 100 -150
q -50 -60, -100 0
Z" class="heart"/>

<circle cx="150" cy="370" r="10" class="mote">
    <animate repeatCount="indefinite" />
</circle>
<circle cx="200" cy="350" r="8" class="mote">
    <animate repeatCount="indefinite" />
</circle>
<circle cx="250" cy="380" r="5" class="mote">
    <animate repeatCount="indefinite" />
</circle>
<circle cx="270" cy="390" r="5" class="mote">
    <animate repeatCount="indefinite" />
</circle>
<circle cx="300" cy="380" r="8" class="mote">
    <animate repeatCount="indefinite" />
</circle>
<circle cx="310" cy="370" r="10" class="mote">
    <animate repeatCount="indefinite" />
</circle>
<circle cx="350" cy="350" r="5" class="mote">
    <animate repeatCount="indefinite" />
</circle>


Each of these animations will move the circle upwards. But how far upwards (depending on the to attribute), how long the animation takes and the delay at the start, should all vary.
<circle cx="190" cy="370" r="5" class="mote">
    <animate attributeName="cy" from="370" to="50" dur="30s" begin="0s" repeatCount="indefinite" />
</circle>
<circle cx="220" cy="350" r="8" class="mote">
    <animate attributeName="cy" from="350" to="10" dur="30s" begin="0.5s" repeatCount="indefinite" />
</circle>
<circle cx="260" cy="380" r="10" class="mote">
    <animate attributeName="cy" from="380" to="50" dur="8s" begin="0.5s" repeatCount="indefinite" />
</circle>
<circle cx="290" cy="390" r="5" class="mote">
    <animate attributeName="cy" from="390" to="40" dur="15s" begin="0s" repeatCount="indefinite" />
</circle>
<circle cx="2950" cy="380" r="3" class="mote">
    <animate attributeName="cy" from="380" to="50" dur="8s" begin="0.5s" repeatCount="indefinite" />
</circle>
<circle cx="300" cy="370" r="10" class="mote">
    <animate attributeName="cy" from="370" to="50" dur="30s" begin="0.5s" repeatCount="indefinite" />                    
</circle>
<circle cx="330" cy="350" r="8" class="mote">
    <animate attributeName="cy" from="350" to="10" dur="15s" begin="0.5s" repeatCount="indefinite" />
</circle>


<path d="
M 250 200
q -50 -60, -100 0
q -50 80, 100 150
q 150 -70, 100 -150
q -50 -60, -100 0
Z" class="heart"/>

<circle cx="150" cy="370" r="10" class="mote">
    <animate attributeName="cy" from="370" to="30" dur="15s" begin="0s" repeatCount="indefinite" />
</circle>
<circle cx="200" cy="350" r="8" class="mote">
    <animate attributeName="cy" from="350" to="50" dur="30s" begin="0s" repeatCount="indefinite" />
</circle>
<circle cx="250" cy="380" r="5" class="mote">
    <animate attributeName="cy" from="380" to="10" dur="8s" begin="0.5s" repeatCount="indefinite" />
</circle>
<circle cx="270" cy="390" r="5" class="mote">
    <animate attributeName="cy" from="390" to="50" dur="30s" begin="0s" repeatCount="indefinite" />
</circle>
<circle cx="300" cy="380" r="8" class="mote">
    <animate attributeName="cy" from="380" to="30" dur="8s" begin="0.5s" repeatCount="indefinite" />
</circle>
<circle cx="310" cy="370" r="10" class="mote">
    <animate attributeName="cy" from="370" to="50" dur="15s" begin="0s" repeatCount="indefinite" />
</circle>
<circle cx="350" cy="350" r="5" class="mote">
    <animate attributeName="cy" from="350" to="50" dur="15s" begin="0s" repeatCount="indefinite" />
</circle>


Remove the red outline.
#svgContainer
{
    width: 500px;
    margin: 5em auto 0 auto;
    outline: 0px solid red;
}


Have you ever seen anything more amazing?!




Love is the answer!

There you go, just a simple web tutorial. But so pretty. I had fun, hope you did too. Now go forth and be romantic, lovebirds!
Heartening, isn't it?
T___T

Monday 6 February 2023

Five Java Exceptions Personified

Exceptions in programming; we encounter them a lot of the time. How many of us, when confronted with a thrown exception, immediately think of a person? I know I do. And in today's blogpost, I will be listing five examples.

The exceptions listed below mostly occur in Java, but some are pretty general and should be encountered in basically any programming language.

1. ArrayIndexOutOfBoundsException

This occurs when the programmer attempts to grab an element from an array using an index which does not exist. For example, if the array has only 6 elements and you request for element number 10, this exception would occur.

Out of bounds!

When it comes to "out of bounds", the first thing this brings to mind is a soccer linesman signalling that the ball has gone over the line. Seems pretty apt.

2. FileNotFoundException

Pretty straightforward here; this exception is thrown when the code references a file that does not exist. It could be a wrong filename or directory, either results in the same thing.

No such publication.

What else could I possibly think of at this point, but a stern librarian informing me that a certain book is not available?

3. ArithmeticException

An exception of this sort typically occurs on a bad arithmetic operation, such as a division by zero. There are other instances where this would be thrown, but a division by zero is probably the most common.

Nope, math does not
work like that.

The most obvious image that comes immediately is that of a math teacher telling you your formula is wrong!

4. IllegalArgumentException

This one gets thrown when a method receives an argument that does not fit the parameters allowed. For instance, if a method allowed for two parameters, a string and an integer, the exception would be thrown if we attempted to call that method using two strings.

Court, to order!

This exception is probably best personified by a judge in a court session, bringing down that gavel. "Illegal argument" is kind of like saying "Objection sustained. Prosecution will watch their line of questioning", or something to that effect.

5. ClassNotFoundException

When a programmer tries to invoke a class that doesn't exist, this is what gets thrown. It could be a misspelled class name, or a class that does not belong in the current hierarchy.

You must be
new here?

Can't find your class? This is where the hall monitor or prefect comes in! Sorry, bad pun.

That's all!

This was meant to be a silly, frivolous listicle with a tech twist. There's not supposed to be any deep meaning to it! I hope you had fun.

Stay exceptional!
T___T