The Mezunian

Die Positivität ist das Opium des Volkes, aber der Spott ist das Opium der Verrückten

The Crash Bandicoot GBA Games

My experience with Crash Bandicoot is opposite to Spyro’s in 1 strange way: while I hardly played the GBA Spyro games, — ’cause just look @ them — I hardly e’er played the PlayStation Crash Bandicoot games, ’cept for faint memories o’ playing Crash Bash when I was li’l & rather recently trying the 3rd. Unsurprisingly, my short experience told me that the PlayStation games were probably superior to the GBA games ( as well as probably any other Crash games ), much as I’m certain the PlayStation Spyro games are superior to… well, any other Spyro games.

But this is a GBA tribute, not a PlayStation tribute, & it’s the month for the ugly cousins to shine, so let’s look @ the GBA games. I actually almost forgot ’bout this & ne’er would’ve come close to writing ’bout it if not for my bizarre decision to talk ’bout the… less grandiose games for the GBA.

The Huge Adventure ( XS in Europe ) & N-Tranced

Truthfully, these games aren’t too bad. They stay as true to Crash as the Game Boy Mario games stayed true to Mario: they play somewhat like Crash, just a li’l worse & much less advanced in aesthetics or gameplay. They’re OK Crash games, much like the Super Mario Land1 games were just OK Mario games — nobody in their right mind would e’er say they’re better than Super Mario Bros. 3 or Super Mario World.

My lack o’ experience with Crash Bandicoot isn’t any deterrence from it, but simply a lack o’ thinking ’bout it. It’s too bad, since after trying it out, I’ve become quite fond o’ how simple, & yet how clever & fun, the crate system is: to 100% a level, you need to destroy all the crates. This requires some strategy, as some crates require other crates to reach them; destroy the necessary crate without reaching the other crate & you’re hosed. There’s also different types o’ crates: crates that take multiple bounces to break, crates that must be spun into to destroy.

There are also dangerous TNT & Nitro crates. TNT crates hurt you if they explode near you, & explode in your face if you try breaking them with a spin attack or belly flop. You have to jump on them to start a downward timer to blow them up, as well as any surrounding crates. However, crates with power-ups & extra lives that are blown up with TNT don’t give their presents if you blow them up this way, adding a risk-&-reward treatment to TNT. Lastly, Nitro blocks hurt you if you touch them @ all & require hitting a green metal box with an ! — usually located @ the end o’ the level — to destroy them all.

The 1 annoying thing is that the 1st game oft requires you to have an ability you learn later to 100% a level, forcing you to go back & complete it as a form o’ cheap elongation. That this game has the Yoshi’s Island style o’ making you get everything in 1 go, rather than the Donkey Kong Country style o’ letting you get collectibles in as many or few trips as possible without having to beat the level on each grab, makes it e’en mo’ annoying.

I’m also not so fond o’ some o’ the gimmick levels, ’specially in N-Tranced. While the shoot-out with the blimps in the 1st game are rather cool, most o’ the gimmick levels in N-Tranced are pointless & slow @ best. @ worst, they’re an abomination: the autoscrolling races where you’re running from a polar bear / shark on a smaller bear / jet skis are borderline trial-&-error, since you hardly have time to see anything before it hits you. ¿What idiot thought making you head toward the screen was a good idea?

N-Tranced also has some Super Monkey Ball levels where you have to roll round an isometric area in a gerbil ball, running o’er crates, dodging other crates, & trying not to fall off the platforms till you make it to the end. These aren’t too bad, ’cept that the controls & physics are so wonky that you’re pretty much forced to go slowly & that some o’ the barrels on the 2nd 1 are hard to see thanks to the perspective. But the worst part is simply that the levels go on for way to long & get repetitive. N-Tranced also has some dumb level where you’re Coco racing from the sun. It’s basically a lazier version o’ the blimp shooter levels from The Huge Adventure, but stupidly easy.

Also, Coco’s icon is amazing:

Nice square chin & neck combination.

Despite this, I’d say N-Tranced is definitely better than The Huge Adventure. It’s less plagued by The Huge Adventure’s problem o’ not letting you 100% a level till later & generally feels mo’ refined. Its level themes are also much mo’ interesting: I’d much rather hop round Arabian carpets & space stations than the same jungle, water, & pyramid levels that The Huge Adventure is filled with.

That said, both have finicky controls & physics & have questionable level design. Sometimes they expect you to fall into seemingly bottomless holes to find crates, & the double jump takes a while to get used to, as it has a much shorter period after your 1st jump for how long you’re able to make a 2nd jump than any other game I’ve played.

Part o’ the problem is the graphics, which aren’t good. They’re pixelated CGI, but without the quality or heart o’ e’en the GBA Donkey Kong Country games, which is proof that Rare employed mo’ artistry in those games’ graphics than people give them credit. While the Donkey Kong Country games had gorgeously colorful backgrounds rich in detail, Crash’s graphics are just dirty & tacky. It’s hard to ’splain, but they just look… off. & not in an interesting way. They’re just so ugly — just look @ them. Worse, ’cause they’re pseudo-3-D, it can be hard to determine collision, making it easy to miss crates & fall into a hole.

The cutscenes also look terrible, but that’s mo’ comical than frustrating.

The bosses blow. They fall into “Rareware Boss Syndrome” worse than Rare themselves. Literally every boss I’ve fought so far is, “Dodge boss’s attacks, wait for boss to hurt themselves in the stupidest way possible or just turn off their barrier for no reason, hit them”. The 1 exception I found was gainst Fake Crash in N-Tranced, which is a broken mess. Trying to pass Fake Crash without getting hurt is finicky, & bullshit. ¿Why do I get hurt by him but he doesn’t get hurt by me? — we’re fucking clones for fuck’s sake. Also, shit falls from the ceiling @ random & is pretty much impossible to dodge in the split second you have to realize it’s happening ’bove you, while trying to pay attention to both you & your clone, without running into some other hazard. It’s like a bunch o’ obnoxious children poking me with dozens o’ fingers, & it’s annoying. Augh, fuck off.

Thinking on it, I’m surprised by how much nostalgia has waned for this game. Though I don’t remember if I e’en played N-Tranced, I do remember having nostalgia for The Huge Adventure. I remember young me beating the game ( probably with save states ) & using the run move you get after beating the game to try beating the time scores on each level. Now it just feels kind o’ ho-hum. They’re all right games in limited doses. After a while they get tiring, though.

Crash Bandicoot Purple: Ripto’s Rampage

I have e’en less experience for Crash & Spyro’s bizarre crosso’er pair, Crash Bandicoot Purple: Ripto’s Rampage & Spyro Orange: The Cortex Conspiracy. I only remember that ’twas a bunch o’ minigames.

Though the time when I did play it before, I mainly played the Spyro 1, since I always preferred Spyro, since this article’s focusing on Crash, I tried that 1 this time.

& I must say, it’s better than I remember the Spyro version being. Some o’ the minigames are e’en quite fun. Surprisingly, the funnest is a 2-D version o’ those awful levels from the other GBA games where you’re stuck going constantly forward on a polar bear; ’cept here you can actually see what’s ’head o’ you, so it’s not just luck-based bullshit.

Some are mo’ middling, but harmless. There’s a game where you have to blow sheep to ashes with a rocket launcher to keep them from touching some nitro crates… I guess. It’s amusing @ 1st, but it can go on for a bit & so far I had to play it 2 times in 3 worlds. The tank minigames have clunky controls — for some reason you can’t steer & move forward @ the same time — & you move way too slowly. There was 1 minigame that’s basically an earlier version o’ the rocket barrel levels from Donkey Kong Country Returns, but much easier & much mo’ padded out — & thus less fun. Most o’ these minigames go on too long & could be quite fun if they were just shortened.

Then there’s the bullshit minigames. I didn’t find too many; but the game forces you to beat every minigame to pass each world, so you still have to deal with them. The 1st world had a clunky game where you have to shoot a bunch o’ minitanks falling from the sky from touching some crystal ball @ the bottom. You also have to avoid being shot, which is basically luck, since the tanks that shoot you are right in front o’ your face, making it impossible to see a bullet ’fore it hits you. You can move to the bottom & lift the crystal ball thing, but if it comes to that, you’re pretty much screwed, anyway. The tanks fall so quickly that you’d ne’er have time to drop the ball ’gain & resume shooting; & ’ventually a tank’s going to shoot you with no way to defend yourself while holding the ball.

In general, this minigame tried to do too many things & didn’t think them out all the way. Would’ve been better had they just kept it to shooting the tanks to prevent them from reaching the crystal ball. Also would’ve been better without the cheap shots.

The other awful minigame is 1 they did in all 3 worlds: you have to move some inflatable raft through water while avoiding whirlpools, spike bombs, & other dangers. The whirlpools suck you toward them & kill you instantly if you hit their heart.

While the 1st game was OK, — but, ’gain, went on too long — the others are obnoxious. The 2nd had these torpedoes out o’ nowhere that are underwater, & thus seem like they’re harmless @ 1st. Trying to dodge them in the narrow corridor in which they appear is, as far as I know, impossible: you move with tank controls, so you can’t move horizontally without turning & then moving straight, & then turning back forward ’gain, ’cause you’re too big while sideways to avoid getting hit by any torpedoes on any side. The only way I knew how to pass without getting hit was to just wait till they randomly stopped spawning. What crap.

The game has collectible cards, which you can find hid in places or can be bought by that smarmy bastard bear, Moneybags. They’re cool, I guess.

The story is hilariously awful. The pre-rendered slideshow cutscene graphics are e’en worse. I’ll just show the greatest hits:

Wrong way, Aku.

The main advantage Spyro Orange had o’er this was that you ne’er had to see these things.

Half o’ Spyro’s poses — which aren’t copypasted @ all — look less like he’s got Attitude™ & mo’ like he’s having eye problems.

¡AHH! ¡The other half is worse! You have no idea how sudden this transformation was in the actual game.

Definitely not copypasted.

I’m quite impressed by their ability to make pre-rendered CGI look like a real human in a bad costume.

Just keep feeding Coco’s drug habit.

“Fire”.

In fact, the graphics in general are as crappy as the other GBA Crash games — which makes sense, since it’s obvious they outright reused resources from those games.

Like the other GBA Crash games, I’d say Crash Purple is all right. In fact, I’d say ’twas mo’ fun than them.

That said, let’s be honest: we’d probably all be better off playing the original PlayStation games.

Music

The only song worth listening to is the main theme from The Huge Adventure, which is super good, since it’s just based on a popular song from Warped. The rest is forgettable.

Posted in GBA Tribute, Video Games

But Lispers Are Worse

Last week I made fun o’ Ruby for the crime o’ being used by idiots who don’t e’en know why they like it.

But Lispers are hilariously crazy. Just read through the “SmugLispWeenies” pages on C2Wiki, a TV Tropes for programming that bewilderingly has e’en fewer standards & civility.

Just look @ this:

Most “commercial grade” coders are little better than faeces hurling monkeys randomly bashing at their terminals and making the odd primitive grunt in the machine’s general direction. Really, it’s an insult for a computer to have to tolerate some of the shit I have seen spewed at them by their neuronally challenged masters. Go away and learn to actually reason about code before you start the “Language X is superior to language Y” pissing competition; otherwise you just look like a pack of nitwits. I can shoot a stream of piss much farther than you can, but that’s because I’m standing on top of a mountain. Keep that in mind next time you think it’s raining.

Remember this next time somebody tells you programmers are geniuses. This is them when the cameras aren’t rolling, just like your grampa talking ’bout the black folks ( Well, ’less your grampa’s black & not that black KKK member from that Dave Chappelle sketch ).

That italic ( er… non-italic now, since it’s in a usually-italic blockquote ) is someone else jutting their text into someone’s paragraph. It’s quite common on this site & makes reading it feel like reading the raving rants o’ a schizophrenic. I’m not e’en sure which is the Lisper & which… ¿isn’t? ¿Maybe they both are? Maybe some drunk guy just randomly stumbled on this site & decided to post this & nobody e’en realized ’twas irrelevant.

Just afterward we get a nice paragraph ’bout some Lisper fantasizing ’bout being God & using his totalitarian powers to banish object-oriented programming & Java, the Lisper’s greatest enemy, from all schools & that people with such “prior exposure” “should be considered mentally mutilated beyond all reasonable hope of recovery and should simply be shot on compassionate grounds”.

Hilariously ’nough, 1 guy who labels himself a smug atheist ( ¿isn’t that a redundancy? — hur, hur ) goes on some anal-retentive tangent ’bout how that guy’s comparison to banning OOP & Java to banning heroin from pre-schools is inaccurate, <squeaky voice>since it’s truly the Federal government that bans it everywhere, which simply cascades down to the state level & schools, Sir</squeaky voice>. He then goes on to say that he still understands that other person’s “pain & suffering” & “largely agree[s] with what [he’s] communicating”. The guy wanted to make a eugenics system for people who learned Java in college. It wasn’t e’en particularly people who liked Java — anyone who was e’en “exposed” to Java in college was incurably infected & fit only for the gas chambers.

I mean, I hate Java people now, too, & take back all the nice things I said ’bout Clean Code & its writer’s creepy threat to heathens who don’t recompile & redeploy ’cause I made the mistake o’ taking their advice to refactor my game project based on their super-serious OOP rules that, as it turns out, aren’t exactly consistent in detail ( “Single Responsibility Principle” is hopelessly vague & contradicts “Law of Demeter”, & “Uncle Bob” should go back to writing large books for me to read while I’m on the shitter ) & only made things a bigger hassle & messier. But e’en I think that’s too far. Punishing them by forcing them to make banal business programs for the rest o’ their lives is fine ’nough.

My favorite part ’bout crazy online communities is the conspicuous lack o’ any voice that says, “I’m sorry, ¿but is it me, or are you guys all crazy?”

Man, I joke ’bout language fanatics; but if there e’er was a programming language that’d actually inspire programmer to strap a bomb onto his back & blow up a building, I think it’d be a Lispers. These fuckers are crazy. You don’t fuck with them. Somebody please make them some half-decent GUI libraries so they don’t have to use C++ & break all their fingers on all the colons & angle brackets to make Steam games. Our safety depends on it.

Posted in Programming, What the Fuck Is this Shit?

Garfield: Search for Pooky

Pictured: a smug fuck.

Also pictured: JPEG artifacts in a GBA game.

That’s right, bitches & kitchens: I’ve officially dedicated April to the… um… less pristine classics o’ the Game Boy Advance as a tail-end to my GBA tribute that’s lasted o’er a year1. ¿Why April? ’Cause like my main gangster T. S. Eliot told me on the streets o’ Peach Creek, “April, man — that shit’s the cruelest, yo”.

& we’re starting with a grand 1. ¿Remember how I praised Ed, Edd ’n Eddy: Jawbreakers! for doing a good job o’ emulating its cartoon’s graphics? Well, Search for Pooky doesn’t. It looks like shit, sounds like shit, plays like shit. It’s shit with no additives, no filler. It’s pure shit, like your great grandpa ate during the war. You don’t fuck with this shit.

& unlike Jawbreakers! the plot makes no sense. Some rats kidnap Garfield’s teddy bear. ¿Why? ’Cause they’re assholes, I guess. In the comic, Garfield & the rats had an indifferent opinion o’ each other. In fact, their lack o’ animosity toward each other was kind o’ the whole joke: a cat so lazy, he can’t e’en be bothered to hate rats.

That’s OK, ’cause the game’s plot doesn’t focus much on that, anyway, but meanders all o’er the place. Garfield wanders the neighborhood, & then some random warehouse, only for Jon to force Garfield to go with him to his farm.

The 1 good thing you could say ’bout this game is that it’s so bad, it’s laughable. It’s so bad, you know they had to not care.

Look @ this fire animation:

1st, ¿why is the grass on fire outside? ¿’Cause somebody somehow dumped an entire bucket o’ castor oil o’er the grass? That has an interesting story ’hind it, I’m sure. ¿Is nobody alarmed by that? Just a regular day in Jon’s neighborhood, I guess.

But, seriously, that shit looks like an animated GIF from some totally-rad late-90s website. ¿Why does the oily grass suddenly break off into black void ’hind the fire? ’Cause they couldn’t be bothered to copy the fire graphic & paste it onto a copy o’ the sidewalk graphic, that’s why. Only apathy could ’splain how the developers could look @ this & say, “Yes, this is sufficient”.

This game’s so repetitive & boring, I couldn’t tell if I were playing levels multiple times — ’specially in the warehouse world. It’s so tedious, I didn’t e’en bother playing this game for this article, but simply took the screenshots I took for an article I made years ago & am basing this off my memory o’ that dark time. It’s so boring, I’d intentionally fall into holes & die just to save time traversing through levels. This is ’specially the case in the farm levels, where they added the brilliant gimmick o’ making you collect chickens & bring them back to a cage — which basically just means you have to traverse the level multiple times.

The camera’s so bad, just ’bout every jump is a blind jump. Jumping off the ground causes the camera to move so high that you can’t see the ground till you land — presumably into a hole you couldn’t see before.

But the best part is some minigame on the trip to the farm — a piece o’ absurdist art that’d give The Square Root o’ Garfield Minus Garfield & Lasagna Cat a run. Apparently, Garfield’ll starve to death if he goes a single car trip without constantly stuffing his face — e’en though he went through the levels themselves fine without eating. The only way he can eat is by snatching food from covered plates being carried round the highway by a bunch o’ Liz the Veterinary clones. That’s odd by itself, but it gets better: you have to watch out, ’cause sometimes these plates turn out to have bombs in them, which hurt Garfield if he stupidly tries to eat them. None o’ the drivers are perturbed that there are a bunch o’ clones walking ’long the highway with bombs — presumably to commit some acts o’ terrorism.


Other greatest hits

Pooky is not just a teddy bear, but also a quantum device that prevents temporal malfunctions.

The game’s nice ’nough to tell you that pressing A makes Garfield jump after every level — in case you happen to fall on your head ’tween levels & develop amnesia.

This… mutant creature.

Trash cans that float in the air.

This generic yellow cat attacks you but jumping into the air with its claws out & slowly floating toward you.

Jon, after the lobotomy.

Also, Garfield can float or has super long legs in this scene.

Also, love those cheap GIF dots all o’er the colors. WarioWare showed that the GBA was capable o’ doing photographs rather well, but these guys couldn’t get the color right on flat cartoons.

Grandma smiles as Garfield claws up her furniture. Also, somebody dumped honey all o’er the floor. No reason is given.

¿& what’s with those clouds in the window? ¡How do you fuck up drawing clouds? ¡They’re just white circles! ¡*!&( #@*%^@*%^!

Garfield shows he’s hip with the slang syrup, chocobo.

( Laughs ) . No, this is not some hastily-edited screenshot for a cheap laugh. This is an unaltered screenshot.

Garfield speaking to whoever’s playing this game, straight from the blue void.

Pictured on the left: the expression permanently painted on the developers’ faces.

Posted in GBA Tribute, Video Games

10 Reasons this Post is No Ruby

Since I’m sick o’ political bickering, I’ll focus on the much mo’ important issue o’ programming language wars.

The most interesting thing ’bout programming languages is how their quality is inversely related to the quality o’ the people who use them. While I’ve found nobody who defends PHP beyond “it’s faster” & “it’s convenient”, & it’s design is so laughably inept, one wonders if ’twas an intentional joke, PHP developers tend to be much better people to be round, since they focus mo’ on actually accomplishing things than whining & scribbling rants ’bout conspiracies gainst the public caring mo’ ’bout practicality o’er their language. Languages like Ruby & Lisp1, meanwhile, were quite elegantly designed, but is filled with some o’ the most socially inept douche bags e’er who have this amusing tendency to try demanding things o’ people o’er whom they have no authority. “¡Just quit whining ’bout [ insert flaw in language ] & just use it!” while whining ’bout flaws o’ some other language. The logic is that if you can’t deal with some absurdity in their language, you’re just too dumb, e’en though the fact that one can remember the quirk ’nough to complain ’bout it should be proof that one can understand it; but if they can’t handle some absurdity in some other language, it’s ’cause it sucks.

To be fair, the 1 exception is the guy who made Ruby himself, Yukihiro Matsumoto, who sounds like a very nice person who seemed to make Ruby for incredibly unpretentious reasons, & e’en said, “I tried to make Ruby perfect for me, but maybe it’s not perfect for you. The perfect language for GuidoVanRossum is probably Python”, which is the inspiration for all my Matsumoto / Rossum slash fics.

I almost get the sense that Google hits get mo’ from attention-grabbing, contentious posts than those that are actually useful. While I’d like to get some useful info on Ruby, ’stead I get some incoherent rant, & now the rest o’ you get to suffer for it. ¿Curious, right? Wink, wink. ( Fuck you. )

{ // Braces, just to further rile Rubyists ( e’en though Rubyists do use braces for hashes — shhh ).

’Nother fun idiotic debate ’mong Rubyists & other people:

“Man, Ruby & Rails have no good documentation. Just this drugged-out shit. Face it, programming is ruined”;

“There’s plenty o’ documentation. Get off your ass & look”

“¿Could you provide some evidence?”;

“Find it yourself. Do something yourself for once”

Nothing better than expecting people to prove a negative.

I can, however, prove that the official Rails guide is so shitty that it actually caused me errors ’cause o’ a dumbass typo:

¡Looks like your prettyful Apple computer couldn’t help you now, DHH, whom I know totally wrote this guide! ( ¡Stop whining & just get off your ass & pay thousands o’ $ on o’erpriced garbage hardware already or I won’t hire you for my shitty company! )

}

This writer, whose job description is apparently “Converting beer to code since 2004” ( ¡& now he’s converting writing to beer for me! ¡How nice! ) wrote an article called “10 reasons not to use Ruby”, which sounds like a drunken rant ’bout how lame Ruby is, man, but is actually a drunken rant gainst people who make ’scuses for not using Ruby, man.

1. Ruby isn’t as mature as Java or PHP

My grandmother has also been around longer than Ruby, but I don’t go about using her to build Web apps every other day.

Maturity == age.

Speaking o’ maturity, that’s an argument a fucking child would make — c’mon. “If PHP’s so great, ¿why don’t you use it to drive to work?, huh”.

2. Ruby isn’t as performant as .NET or Java

That’s true, & is ’specially a problem in web programs, where people are particularly impatient, already have to deal with loading resources ( essentially downloading software as they’re trying to use it ), & likely to be on much slower architecture than the o’erpaid web developer who should probably be doing mo’ to deserve their high pay than worrying ’bout whether their language is fun to use. ( ¡Stop whining ’bout my slow website & just use it, customers! God, ¿why do I e’en let you idiots give me money? )2 Considering how bewilderingly slow websites still are e’en with modern technology, this should be a big issue.

You’re right. Ruby is also slower than Erlang, Lua and C++ but you don’t go about writing Erlang or C++ code every day, do you?

Um, yes, plenty o’ people do.

It’s good to see that we’re still sticking to the sullen technique o’ twisting reasonable arguments to extreme non sequitors. This argument is essentially, “Nothing’s perfect, so any depths o’ quality is acceptable”. Awesome.

Web development isn’t all about code performance.

It’s 1 o’ the most objective ( note, I said “most”, for e’en benchmarks are questionable ) criteria — certainly mo’ than “fun to use” & quickness o’ development.

Your new shiny Web app doesn’t have a million users a day for day one. You need to code it, test it, release it, rinse and repeat, and you need to do that quickly.

Keep in mind that this person is telling you you should experiment with new programming languages — ’cause nothing is quicker than learning new things.

Hiding behind the “performance” argument is not only cowardly, it’s plain wrong, because instead of focusing on releasing your app as quickly as possible, you’re focusing on the unknown promise that one day you might have to worry about scale.

Fucking performance pussies, man.

So, it’s wrong ’cause it’s not important in this writer’s opinion — ’cause nothing’s worse than wasting your time preparing for the future. It’s much mo’ professional to only focus on spewing out shitty software as quickly as possible.

¿Aren’t Ruby programmers s’posed to be smart? & I must say, it’s probably mo’ “cowardly” to change topics to development speed to avoid actually addressing the issue.

3. Well, Ruby apps scale as well as .NET or Java apps.

“I say so, therefore it’s true”.

We all end up there, clench our teeth and handle it like adults.

So that’s how you optimize Ruby. You can’t really blame detractors for not understanding such an obscure — & I must say unorthodox — method.

“Handl[ing] it like adults” apparently means bitching ’bout imaginary critics online & making appeals to extremes.

We might do it differently, but we do it all the same and usually begin at the DB level rather than the application level. Curious, right?

You’ll have to show a bit mo’ cleavage 1st, Sir.

4. Ruby doesn’t work well on Windows

¿It doesn’t? Worked fine for me. Not sure what magic allowed Compass to work all those years I used to have Windows.

Instead of banging your head against the wall, complaining that you’re used to Windows and all that jazz, just take a deep breath, install Linux and get on with life. Technology is about learning new things, not staying in your comfort zone forever.

“Just quit whining & setup a whole ’nother operating system just so you can fulfill my language fetish”.

I have a better idea: how ’bout you guys quit whining & make Ruby work well with Windows.

’Cept Ruby works fine for Windows, so maybe you should just stop arguing with idiots — worse, strawman idiots you made up in your schizophrenic head. I can imagine all the ghostly voices dragging him down to his knees — echo 'use $PHP…'; echo 'use $PHP…'; puts you.leave_alone! me

5. Ruby isn’t as popular or commonly used as PHP

Perhaps a less stupidly-circular argument based on true concerns is Ruby’s lack o’ easy compatibility with existing services, such as MySQL or common hosts. For example, my host doesn’t have Ruby installed, so using Ruby would be an absolute no for any o’ my websites ( a’least for distribution — in development, all bets are off3 ), as much “funner” it is to use than lame ol’ PHP & it’s dumbass error-handling or “echo” function. Rubyists would tell me that I need to change my entire host & go with some obscure, o’erpriced alternative, ’cause shared hosts are, like, a “ghetto”, or something.

( Or maybe that’s Rails — all ’cause Shaw hates a bunch o’ people he had to work with & ’cause dumbass DHH had to restart his server a lot, I guess. )

Technology isn’t a popularity contest, otherwise we would all be developing Websites in Javascript (currently the most popular language on Github).

Um, we are all making websites in JavaScript ( well, we’re making lowercase websites in camel-case JavaScript, a’least ). For instance, Rails, which I’m sure this guy uses, uses JavaScript, e’en if it has to compile a superfluous cheap knockoff into it 1st for no good reason. That’s ’cause JavaScript is the defacto language o’ browsers.

Technology is means to an end.

That end being feeling cuddly when one types code rather than ensuring compatibility ’tween their code & their architecture or not spending days trying to get a compatible architecture running.

Popularity is a warped factor that tries to measure adoption rate and community activity to help people gauge production-readiness, code stability and support level.

¡Those fiends!

Here’s a novel idea for you then – Try checking production-readiness, code stability and support level on a per-technology basis, rather than throwing popularity figures into the thinning air.

That’s quite hard, considering “per-technology” is vague. “Technology” is anything related to computers. ¿Does he mean software? ¿Hardware? ¿Types o’ software one is making or types o’ software in which one is working? Considering the points ’bout Ruby being slower than PHP & its ilk & the problems o’ compatibility, one could still make good arguments gainst Ruby.

6. The Ruby community is condescending and snobbish

No… That couldn’t be.

Well, yeah, and the Java community is stubborn, the .NET community is closed-minded, the Perl community is quirky and the C++ community is a bunch of middle-aged, pipe-smoking elves.

Though I have nothing to do with the community, he is right that I’m an elf who likes to take a Tolkien toke on the leaf now & then.

Since Ruby is relatively young, and tends towards early adoption of many technologies, Rubyists have a relatively easy life when it comes to trivial stuff like tests, deployment, integrations with 3rd parties and so on. So when a Rubyist is “boasting” that things are easier in the Ruby world, they’re not looking down at you, but merely suggesting there’s a simpler, more pragmatic way of doing things.

See, here’s where we hit the true problem. Languages usually have advantages & disadvantages. Nobody can seriously argue that C isn’t faster than most other languages; they just try to argue that that factor isn’t important. & there’s something to be said ’bout the universality o’, say, JavaScript. Meanwhile, C++’s balance o’ efficiency & high-level abstraction, with a focus on things, makes it great for video games & heavy GUI programs, but probably obnoxious for anything else.

Ruby is I guess a nice-looking language, & it can certainly be used to make well-working software just like other languages. But when Rubyists say that the Ruby “life” o’ deployment & integrations for web development are easy, they’re just straight-up wrong. It’s an ol’ joke that in order to get Ruby frameworks working, you have to jump through a billion hoops — mainly ’cause, as he mentions, they love using obscure tools with li’l compatibility. ¿Why use JavaScript, which works right out o’ the browser, when you could use CoffeeScript, just so you could compile it back into JavaScript? You’d have to be a cave-dweller to not be able to make a program in JavaScript when 10-year-ol’s all o’er the world have been making “¿Which DBZ character are you?” quizzes for years; but that’s not sexy, so let’s add extra complexity ’cause we’re bored. Ruby prefers PostgreSQL e’en though apparently nobody on the internet knows how to use it ’cause all o’ the info I find online is just flat-out wrong ’bout what it’s e’en called in Linux’s terminal, all ’cause MySQL has some obscure imperfections that are immensely rare; web hosts prefer MySQL. & that’s not e’en getting into how you actually get your project off your local computer & onto an actual online host. Apparently you’re just s’posed to use Heroku, which is a lame limitation. It’s so bad that e’en the official Rails guide ne’er bothers to teach you how to put your Rails project online, as if a newbie should be satisfied being able to look @ their shiny Rails project on just their localhost. Ironically, preferring Unix was the 1 thing Ruby did right.

In fact, it’s strange that they make fun o’ PHP for being simple-minded, but also somehow too much o’ a fuss, e’en though on most hosts it works right out o’ the box. Literally all you have to do to get PHP working on a Linux computer is go to the software center & install Apache & PHP & put your files in /var/www/html. To get it working on any host, just upload PHP files to the file system & it works. When one complains ’bout PHP’s language design being half-assed, they’re probably right, as subjective as that may be; but to claim that Ruby is easier to deploy than PHP is nonsense.

In fact, sometimes Rubyists criticize PHP for being too simple — ¡e’en though that’s what Ruby’s s’posed to be good @ in the 1st place! “True developers” apparently don’t just upload files to a file system, e’en if using FTPS, — which doesn’t e’en exist, fingers; keep it up & it’s off to the grill — but [ insert 1 o’ many convoluted, unintuitive methods that hardly anyone uses & is surely incompatible with the vast majority o’ web hosts ]. They claim that performance isn’t an issue for start-ups ( ’cause all programming is for start-ups, & start-ups that are likely to fail are a great source o’ stable, profitable careers ), ’cause hardly anyone visits, ¿but you do need to worry ’bout 1 o’ those nobodies hacking you as you upload files? Rubyists can’t e’en decide what they like ’bout Ruby.

Strangely, this writer ne’er brings up the issue o’ security, which may be the 1 objective advantage Ruby might have o’er PHP. O, wait, maybe it’s a good idea not to bring up security with Ruby.

It’s funny, ’cause there’s so many arguments this guy could make that he doesn’t. There are entire websites dedicated to showing how shitty PHP is. It’s creator has a delightful nonchalance & seems to agree that PHP was just some hack garbage he puked out on 1 drunken evening & looks like he stumbled out o’ 18th-century Britain. It’s like this blog poster is an attorney for a victim o’ Charles Manson & is losing.

7. Ruby is too opinionated and takes away my freedom to do things my way

All languages do this. That’s like complaining ’bout English demanding you to use punctuation. Communication is based on consistent info. This applies just as well ’tween computers & people as ’mong people.

My only problem is the whitespace requirements, which are terrible, & is why I still prefer C-style braces & semicolons — though I think Ruby would work fine with just line-ending punctuation, since block-starters & “end” are just as specific as braces. I hate it ’cause I oft want to break up long lines o’ code & it’s much harder to do than in, say, C++, which lets you break code however you want & will always know where the line ends thanks to the semicolon, & thus saves its ugliness for stds & HTML-tag container templates.

¿Wanna know how an associative array o’ #s looks in C++?

std::unordered_map<std::string, int> gorgeous_list_;

¡What beauty!

( Yes, I know I can use “using std”. If I like namespace poisoning — ¡you revolting savage! )

Then ’gain, maybe Ruby’s better @ breaking up lines, since it does seem to be able to break up ’tween commas. I remember I had trouble breaking up lines in Python once & the solution was apparently to put some god-awful “\” or something & I’m like, ¿isn’t this s’posed to be better-looking than C++?

Let me ask you this – How many ways are there to write an HTTP routing component for a Web app or an image manipulation library?

I ne’er did it without biting: ask Mr. Owl.

Convention over configuration, best practices and clear codings standards don’t take freedom away from developers.

See, this is something I’d agree with, but Ruby doesn’t actually succeed well. For instance, Ruby has a radically different syntax from the C-style convention, including their bizarre use o’ “def” for “function” & “elsif” ( which is the stupidest bastardization o’ English since “RESTful” ) & having object members have a “@” in front o’ them & having static class members have 2 “@”s in front o’ them — ’cause that makes sense. Granted, PHP has those dumbass “$”s. ¿What the fuck is wrong with you people? ¿What e’er happened to the idea that code’s s’posed to be as comprehensible as feasible? ¿What made anyone think that $s & @s aided understanding in any way whatsoe’er?

The truth is that JavaScript’s better than all o’ them, ’cause they call variables “var” & functions “function”. ’Cause that’s what they fucking are. Then they fuck up block scoping & lose all their points.4 Good job.

& though I’m not exactly an expert in programming, despite my smugly pretending like I do throughout this post, I do know a lot ’bout web design standards, & know that Rails violates it in the most ridiculous ways possible. ¿Why didn’t they use that convention o’er configuration idea when deciding to make post, article, whatever entries use the primary key ’stead o’ an automatically-generated slug in the URL & not force me to use some hack that’s apparently been deprecated, but is, as far as I could find out, the only way to do so, & is e’en the way done by the most popular plugins? ’Cause, duh, ¿what’s SEO? ¿Why would anyone want to have the primary key in the URL? The user shouldn’t e’er e’en know ’bout the primary key — it’s there purely for the computer. This is a case where it’d be perfectly safe for Rails to automatically change this & it’d be the best for everyone. ¿Where’s that convention?

Rails also loads a bunch o’ empty JavaScript files for every Controller, e’en if they’re empty, which is a hilariously waste o’ server requests. This is in contrast to the common web-design convention o’ combining common files to minimize the # o’ server requests.

Yeah, I know I can fix these problems. But that’s my point: it’s configuration. Whenever anyone says, “¡But it gets rid o’ tedious configuration!” it always turns out to be bullshit, ’cause as it turns out, the software maker didn’t actually know what I wanted — definitely not ugly #s in my URL or empty JavaScript files clogging my pages’ headers, Rails.

Ruby’s opinionated and convention-driven approach helps developers not only to become more productive, but also to adhere to community-driven standards that aim to reduce boilerplate code to a minimum. Many people can chant the “KISS & DRY” paradigms, yet not as many adhere to it.

It fails. Ruby code has boilerplate code, just like any other language. Read any Rails tutorial & see all the code you’re s’posed to copy & paste. As we’ll both talk ’bout later, Ruby makes you do manual type-checking, which comes automatically in Java & C++ compilers. Also, e’en if you’re not making code everyone else has already made, there’s a good chance you’ll probably need to take just as much time looking up the code to understand how it works, which is why “reinventing the wheel” is actually useful in programming as a learning experience.

The funny thing is that Ruby is one of the only languages I know that lets you change absolutely anything, anytime, anywhere.

Your ignorance o’ Lisp isn’t that funny, nor something to be proud o’.

To be fair, this is the 1 good point Ruby has ’bove PHP. Not JavaScript, though, which also lets you change just ’bout everything… which shows how bewilderingly ignorant he is ’bout JavaScript.

Yet, people seem to be happy to adhere to its standards and conventions because it makes them more productive, without compromising their ability to innovate and be creative.

“Ruby’s best advantage is that it has a feature that nobody uses”. So we see ’gain: Ruby’s great, it’s programmers aren’t.

Curious, right?

Stop trying to get into my pants, you smarmy bastard.

8. Ruby isn’t as reliable as Java and .NET

¿Java & .NET are reliable?

Windows isn’t as secure as NetBSD. Oh No!!! I should dump my shiny new Windows for a NetBSD installation.

You just said earlier that I should dump Windows for Linux. Great. Now apparently I’m an idiot for doing so & have to waste ’nother afternoon deleting Linux from my hard drive. You’re truly making me mo’ productive.

While static languages offer a performance boost in relation to dynamic languages, due to their compiled nature, and a strict mechanism to ensure private and public APIs are adhered to, lets be blunt – How many bugs, in your history as a programmer, were the direct result of a wrongly-typed variable?

You’d be surprised.

I know a lot o’ bugs can be caused by functions getting bad parameters, ’specially when dealing with user input online, which is why JavaScript’s lack o’ type-safety is annoying. It’s just a way for me to have to manually check parameters to ensure they’re valid strings or #s rather than have the compiler do it for me, like in C++.

Ensuring a method can only accept variables of predetermined types doesn’t ensure sound and bug-free code.

It sure helps.

If anything, it adds noise to an otherwise clean code in case you do have to cast variables or read compiler complaints about wrong types.

The former is rare, & can be handled rather cleanly with generics ( in C++, a’least; don’t know ’bout Java or .NET ); the latter wouldn’t happen till you fix the problem ’cause the compiler would refuse to compile till you fixed it.

Ruby’s way of solving this conundrum is to promote testing as a culture. In other words, your code is as reliable as your tests, not as reliable as your method signatures.

Ruby’s solution is to make you do extra tedious work that compilers do automatically. But it’s much mo’ convenient, DRY, & enjoyable to work with — not to mention how much cleaner your code is with all those tests. ’Cause nothing’s mo’ enjoyable than writing tests.

8. Ruby lacks entreprise-level support

¿Is this a fancy way o’ saying “not a lot o’ rich people are paying people for this kind o’ programming”?

Sure, if you’re an enterprising ant working for a bunch of bureaucrats who consider COBOL to be cutting edge stuff.

Yeah, maybe if you’re 1 o’ those fucking conformists working for the man, ¿am I right? True radicals smash capitalism by using unpopular programming languages. That’s what Emma Goldman would do.

Ever heard of Engine Yard? No? But they offer fantastic enterprise-level Ruby support.

“Just take my word for it”.

I’m going to admit, I have no idea what argument’s going on in this point. He goes on to rant ’bout how big corporations’ll try to hide security flaws in their code out o’ greed, which is possible, I guess, — I wouldn’t put it past them — & then mocks developers for being so “incapable that the mere threat of being left alone ‘unsupported’ deters you from choosing a piece of tech”. That sounds mo’ like love advice ( ¿Curious, right? Wink, wink ), if anything else ( ¿or should that be “elsif anything”? ).

In an era where technological innovation goes hand-in-hand (and is often driven by) open source code, choosing a closed-source, monopolised, technology for the sake of support is choosing to stay one step behind everyone else. Just take a look at companies like Basho, RedHat, Canonical, 10gen, Cloudera and Engine Yard, who all offer open-source technologies as well as enterprise-level paid support.

I literally have no idea who any o’ those people are, ’cept that Basho is the god o’ haiku ( though I prefer Issa ). Hilariously, the link to Basho is broken, so clearly these companies aren’t doing that well.

9. Ruby doesn’t scale well

This is just a repeat o’ “¡But Ruby’s slow!”

Man, I’m noticing mo’ & mo’ that this writer would make a shitty lawyer. He acknowledges Twitter’s scaling problems due to using Rails, but uses that to praise Ruby for an irrelevant subject he already talked ’bout, & then goes on to talk ’bout other technologies that don’t use Ruby — 1 being C++, which he implied earlier was a ridiculous choice for web development. I guess he’s saying that lots o’ people use obscure ( well, for web development, if we’re including C++ ) programming languages to make web programs, so you should use Ruby, ’cause… ¿it’s a special not-all-that-obscure language?

He then says this:

Since no two Web apps are exactly alike, one should learn from battle-hardened experience of successful Web apps, rather than proclaim one technology is superiorly scalable than another.

But it seems that the “battle-hardened experience” indicates that some languages do scale better than others & that one should learn from the mistakes o’ Twitter & think ’bout scaling issues before it becomes a problem.

10. It’s a lot harder to find experienced Ruby developers in today’s market

“¡There’s fewer workers to exploit!”

¿Aren’t these programmers talking? ¿Why would a programmer complain ’bout a smaller supply? ¿Are they that ignorant o’ economics? “¡I’ll have fewer people to compete with! ¡That’s awful!”

That’s actually true, depending on where you are in the world. In Israel, for example, where .NET and PHP are more widely used, finding good Ruby developers is harder.

The true source o’ all the strife ’tween Israel & Palestine is that Israelis are ASP-fanatics, but Palestinians are hard-core Pythonistas.

I’m quite sure PHP & .NET are the most widely used all o’er the world. Ruby isn’t e’en close. That’s ’cause PHP comes embedded in Apache, the standard for Unix servers, & .NET is Microsoft’s pet, & we always need to leave room for their useless shit.

But, you know what? It’s also harder to find experienced Javascript developers.

( Laughs. ) ¿What? You literally know nothing ’bout JavaScript, ¿do you?

For fuck’s sake, you can’t e’en spell its name correctly.

In my mind, that’s a clear indicator that a certain segment of the market is in demand, and is on the rise, which is definitely a good thing.

This literally means nothing: “To me, that means some vague this is doing well. The fact that some things are doing well is certainly good”.

He then basically tries to say that there are mo’ experienced Ruby developers ’cause they’re smarter than PHP developers, which I doubt, but OK. If anything, developers would need to be smarter to work through PHP’s nonsense. But calling PHP’s documentation “fragmented” is ironic, since it’s commonly known that Ruby’s documentation is terrible & that documentation is the 1 thing PHP did well. E’en fans o’ Ruby admit it.

So, instead of shying away from a good thing because it’s hard, why not train Ruby developers yourself? I mean, if you agree it’s the right technology to use, why not invest in it?

¡But you’ve yet to prove that Ruby is a good thing! If this were a debate class, you’d fail terribly.

¿& weren’t you saying that Ruby is easier than PHP? ¡Gah! ¡Logic! ¡BOOM!

So… the take’way is that Ruby’s advantage is that it’s faster & easier for programmers, e’en if it’s less efficient, computer-wise… but there’s a good chance I’ll need to invest extra money & time into learning it, & is actually hard, but a good thing.

Pretty long article to just say, “Well, I like Ruby, so fuck you”.

I don’t know why we’re having all these debates. Everyone knows the best programming languages are C & Lisp, & that everything else is crap. But we still have to use C’s dipshit nephew, C++; C++’s douchie brother, Java; Java’s ultra-douchie younger cousin Ruby; idiot-savant JavaScript; & that alcohol-fetal-syndrome victim, PHP, ’cause we’re too stupid to understand C, & Lisp isn’t useful for making anything actually productive, ’cept for academics & shitty Yahoo e-stores. Better to be bitching ’bout not being able to use Ruby or Haskell or Brainfuck or whatever in 50-100K-a-year jobs than worrying ’bout losing a finger on the cutting machine used to make 1K a year.

’Sides, languages are ne’er based on logic, but just arbitrary history & popularity. ¿Will this guy try telling me that English is the most common language in the world — & the lingua franca o’ the programming world — ’cause ’twas well-made? ( ¡Just stop bitching & learn Esparanto already! )

Also, ¿don’t you hate those pushy listicles with titles that say something ’long the lines o’, “Why you need to do this thing right now”. Fuck you. I’d trust my plumber to teach me anything, e’en technological, ’fore I’d trust some idiot who writes listicles.

Strange Fun Fact ’bout Ruby

In 1 o’ my many waking comas where I’d just think ’bout random subjects for hours without e’en realizing it ’stead o’ doing anything productive I came up with this bizarre idea o’ a C++ / Ruby lovechild called “Crystal”, which would purportedly have the elegance o’ Ruby & the efficiency o’ C++.

Then I happened to notice “Crystal” in the list o’ languages in my notepad program & looked it up the find out, not only does it exist, but it pretty much fits my C++ / Ruby idea, as well.

They were right when they said people were spying on me…

Posted in Programming, Yuppy Tripe

The Shot that Was Not

The image that isn't.

You ‘scaped my camera eye this time,

my lovely waxing-gibbous morning moon,

by making its battery run out o’ time

just in time.

But next time…

Posted in Photos, Pictures, Poetry

Ed, Edd ‘n Eddy: Jawbreakers!

I wanted to end my GBA Tribute with Mario vs. Donkey Kong on March 21, exactly 1 year after I started it. But then I remembered I absentmindedly forgot this pillar o’ gaming & knew I had to continue.

Also, I ne’er did Mario & Luigi: Superstar Saga. But that’s later. We have, ahem, a masterpiece to discuss.

Jawbreakers! actually has a nifty game mechanic: it essentially copies The Lost Vikings, allowing you to switch ’tween “the Eds”, as the gamesters down in Peach Creek call them. Each character has different abilities: Eddy Gizzard can double jump & is generally the most agile, making him the most fun to play. He can also collect a jetpack & fly round in later stages. Double-Dogg-Dare-You can collect wrenches & slingshots & use them to fuck up deadly chihuahuas, chickens, & fire hydrants, but is a pussy & won’t walk o’er cement. Finally, Gravy Train can carry the others o’er dangerous terrain with a wheelbarrow & can collect a helmet to bash things with his head. However, he’s the least agile lump o’ fuck. Also, if he gets too close to a chicken, he starts chasing it, making you lose all control o’ him & forcing you to make Double-Draw-Bridge murder the sneak with his slingshot.

The game also takes a page from everyone’s favorite DK game, Donkey Kong 64, & gives them all their own… uh… ¿quarters? ¿Colored pogs? ¿Who cares? Collect 100 & you get an extra life.

The goal, as one can imagine, is to get all o’ the Eds to the end o’ the level. Unlike The Lost Vikings, if a character dies, you’re not stuck in an unwinnable situation & forced to just restart, but just makes you lose a life & sends that Ed back to the last checkpoint. On the other scale, I’m pretty sure The Lost Vikings didn’t have lives @ all & just let you retry levels an infinite ’mount o’ times, which, ’specially for an SNES game, was mo’ forward thinking than this GBA game made in the 2000s.

That said, this game does have autosave, which is nice.

You wouldn’t expect it, but the time can be rather frustrating, as these levels go on fore’er, every character but Eddy Blizzard is slow as sludge, & physics can be finicky.

This game’s biggest problem, I think, is that it’s not sure if it wants to be a fast-paced action platformer or a slow, exploratory puzzle platformer. The levels can be quite linear, despite their large size, & expect you to make many tiny, tight jumps ’cross moving platforms, & give you a time limit; but the characters move sluggishly, & 2 o’ the characters have immensely weak jumps. Having to traverse the whole level essentially 3 times can drag on. While I’d defend this in Donkey Kong 64, in this game the levels are a bit too linear & too similar ’tween characters, & the characters just move so slowly. Yes, sometimes characters have to take different routes ’cause o’ their different abilities; but mostly, the game just makes you wait for different characters to get to where your current character is so you can break whatever obstacle’s in the way with whatever ability key the other character has.

The interaction ’tween the camera & the level design is a bit wonky, too, leading to cheap deaths. It’s not uncommon to end up in a place where you’re forced to make a blind jump, with the high risk that you’ll fall on a rabid chihuahua & die.

The controls can be a bit wonky, too — ’specially with Double-Dutch-Fudge-Packer having B be both the run button & the stop-&-shoot button.

Speaking o’ shooting, the game’s not terribly out-front ’bout how the aiming works, so it’s quite easy to miss targets. The problem is, in many cases in levels you have to kill certain enemies for certain characters to pass, & there’s only a limited ’mount o’ ammo in a level, making it quite easy to end up in unwinnable situations.

The levels are cool, though. They’re based on settings from the show; & I don’t know if you e’er watched the show, but the art style o’ that show was great. It had an abstract style that was bizarre, but rather subtle in its bizarreness, & used subtly off colors, such as having purple tree trunks & yellow skies. Thankfully, this game keeps that art style, e’en if its in low-res GBA pixel-vision. Hell, they e’en kept the weird wiggly outlines on the characters from the show, which is impressive. Honestly, ’hind only the SNES & Genesis Capcom Disney games, this may be 1 o’ the best-looking 2-D pixellated game that tries to emulate cartoon graphics.

The level themes are also creative & refreshing: you go from hopping ’long window sills & trash cans in suburban neighborhoods to hopping ’long tire swings in a playground to climbing spider-web ladders in some dark woods to roaming wooden skeletons o’ houses in a construction site to climbing broken cars & ladders made o’ radiators in a junkyard to walking ’long clothes lines in a trailer park. 1 thing ’bout this game: you can’t say they weren’t creative.

The bosses are also rather creative, though not particularly complex. The levels are much harder. After the playground, Rolfe challenges Double-Duplex-Plex to a slingshot duel; after the woods, you have to complete some mirror-movement puzzle to make Nazz & Butter Toast Ghost come together so he can give her her communistic black book; after the construction site, Sarah pounds the ground like Donkey Kong, causing wrenches to inexplicably fall from the sky, forcing you to hastily switch ’tween the Eds to move them out o’ the way o&rsquo such deathly dirtiness; after the junkyard, Kevin… revs his bike in a corner, causing dirt to fling all o’er, forcing you to move Eddy Splinters out o’ the way; & after the trailer park, you have to solve some quick puzzle platform level to knock out the lead Kanker with that ubiquitous red wheel barrow glazed with rain water, rescue Double-Trouble-Barney-Rubble, & get the dodge out o’ hell.

What I like most ’bout these boss battles is that the challenge comes purely from slight mistakes you might make. I don’t think I e’er lost to 1 & didn’t know the reason, & didn’t know a way I could avoid it on ’nother try. Mo’ importantly, they’re quick-paced & don’t make you wait through long invincibility periods ’tween hits, like the average Rareware boss.

I think there’s something wrong in the world when I have to compare Ed, Edd ’n Eddy: Jawbreakers! favorably to Donkey Kong Country.

Granted, some o’ the later bosses don’t make much sense. Why the Eds stand round for a while dodging screwdrivers ’stead o’ just leaving for the Sarah boss is ne’er ’splained, nor why Kevin decides to give you a ticket ’cause he fails to get Eddy Tincture dirty.

E’en stranger, the final boss is probably the easiest in the game. You expect it to be some big showdown; but you just have to dodge some flying kisses to grab an item, & then ram 1 o’ the Kankers with a wheel barrow. After that, you’re pretty much guaranteed success.

I have mixed views ’bout the sounds o’ this game. The game uses voice clips from the show, kind o’ like Simpsons games oft do, which is nice. The music, however: though it fits the show’s themes, they can become repetitive & headache-inducing, amplified by the length o’ this game’s levels. You have no idea what a breath o’ fresh air ’twas to finally beat the playground world & not have to listen to that bloody twang music.

As for the writing o’ the cutscenes ’tween worlds & bosses, it’s quite bad. It’s like a bad knock off o’ actual scripts from the show. Part o’ the problem is that the text boxes make it feel sluggish, which is awkward compared to the rather fast pace o’ the actual show’s dialogue & action. O well: it’s not too bad, & a’least the main plot fits the subject matter.

Also, the characters’ dialogue portraits don’t change to reflect what’s being said, leading to absurd situations where someone’s grinning stupidly while their dialogue is obviously unhappy.

1 cool thing ’bout this game is that it has a level-select code hidden in it, which not only lets you skip to any level, but also to any cutscene & boss battle — which I definitely didn’t use to get most o’ these screenshots after I became too tired from the slog that is the playground world to finish the woods world. I should point out that I do faintly remember beating this game a long time ago when I was young, but can’t remember much ’bout the actual experience.

E’en the credits matched the show’s credits, which was a nice touch.

Posted in GBA Tribute, Video Games

An Inquiry into the Proposition in Regards to Economics Utilizing Programmic Language ( or: Economists Should Use Programming Languages ‘Stead o’ Math Language )

A common criticism gainst economics is that it uses incomprehensible math language to describe itself, as if that’s the true reason a bunch o’ rich academics prefer philosophies that benefit rich academics. ‘Cause we know from the Tea Party Movement that plain ( AKA sloppy ) language ne’er leads to sloppy economics ( i.e. economics I don’t believe in ).

Mo’ wary economists acknowledge that math language isn’t necessary for economics, but has 2 benefits:

  • It’s mo’ rigorous than plain language, & thus harder to make invalid statements ( though it’s still possible — not to mention that this does nothing to protect gainst inaccuracy ).

  • Economists being, well, economists, can understand it better than your human language with all its gooey emotions.

There’s something to say ’bout the 1st point. Austrian-schoolers famously claim that math language isn’t necessary ( though can’t argue why it’s necessary not to have it ), & then hurt their cause by having a much sloppier logical system1 with vague language, logical jumps, & outright inaccuracies ( despite Mises’s claim that praxeology only makes abstract logical statements )2.

So I’m recommending a different solution: replace math language with programming language. Economists can’t claim the 1st point gainst this solution: the fact that computers can run off programming language is proof that it’s mathematically rigorous. But I’d also argue that it’s much mo’ readable than math language, if done right.

Indeed, unlike math, programmers take the readability o’ code very seriously. This is ’cause o’ a fact ’bout programming that most people probably don’t realize: that it’s aimed @ writing for humans, not computers. This makes sense: programmers rather quickly realized that they can create computer programs — “compilers” or “interpreters”, depending on how it’s used — that can translate text into machine code.

Now, this obviously has limits.3 ‘Cause human languages are vague, plain English can’t be used; but different languages heavily inspired by English can be used, albeit with much stricter grammar & diction rules than human languages.

Keynes.js

I’ll use Keynes’s General Theory as an example, since ’twas what 1st inspired this view. Keynes, like any economist, loves incoherent math formulae. I’ll go through its primary flaw: wording.

Calculus has this odd pattern o’ using single letters, or e’en Greek letters, to represent concepts & values & a letter plus a letter in parentheses afterward to represent functions. This has greater advantages than being incomprehensible to anyone who doesn’t memorize them: they’re also super hard to position & configure on computers. ¿Isn’t smothering characters in some big E with angled ends — called “Sigma E” — much mo’ elegant than boring ol’ “function SumOFunctionOutputsFromInputInterval( first_number, last_number, function )”.4

It’d be nonsense to argue that economists can’t use words ’cause they’re too vague, but that they can use just letters & symbols, which are e’en less meaningful. The fact that computers can run logically-consistent programs with words proves that economics can, too, so long as it uses these words as precisely & consistently as programs.

The trick is to set off variable names ( function names should already be easy to distinguish from plain English ), — maybe bold them — define them precisely when 1st using them ( in programming, we call this “initialization” ), & ne’er use them for anything else. Don’t use them in the description text @ all; treat doing so as trying to create ‘nother variable with the same name, which would create a compilation error.5

To give an example, let’s take the formula from the beginning o’ Book III o’ General Theory:

Cw = χ(Yw) or C = W * χ(Yw)

I want to point out that this formatting in my copy is so bad that I’m not e’en sure if I got this formula accurate. I’m not sure if that asterisk is s’posed to be there or if it’s some obscure math meaning ( using the same symbol for different functions is less common in math than one might expect from such a rigorous science ) or if it’s just a printer smudge. It’s slightly off-center, which is suspicious. Also, Keynes just mashes “I can’t believe it’s not χ” & the parenthetic expression next to it to form multiplication earlier, ¿so why not just mash W & χ together?

Basically, I’m going to want to append this image next to Keynes’s formula:

Yeah, this is called a “coding horror”. If you click that link you may see an article that proves that, though economists should talk like programmers, programmers probably shouldn’t talk ’bout politics, ’cause they might look silly ( yes, I could totally imagine a programmer with no experience in politics winning a local election based purely on his disgust with the current president — as if that’s a rare commodity — & his inability to tell that election system from Stack Overflow )6. Anyway, this icon is actually from a book called Code Complete, by some other guy & is used to set out particular awful pieces o’ coding, much as blogs set out particularly awful wording with bold. I’d recommend reading that book, since it talks ’bout the comprehensibility issues I’m talking ’bout in greater depth. I’d recommend Clean Code & Cleaner Code e’en mo’.

Anyway, let’s make this fomula not suck:

Let’s start by noticing that these 2 formulae are probably the same, ‘cept spelled-out in needlessly opaque ways. Cw is “consumption based on `wage units'” Let’s ignore that the “propensity for consumption” is apparently based mainly on lowly wages & just focus on translating. C is just “consumption”, & is = to the same thing, but multiplied by uppercase W. If one reads “The Choice of Units”, which I don’t recommend, one will learn that W is — surprise — “wage units”, which I believe is the average wage money per worker. ( I just know it’s some form o’ “wages” / some # o’ workers. Keynes is terrible @ specifying domains, but common sense tells me he’s talking ’bout a country’s economy. Since none o’ this is backed by any evidence or data, it doesn’t matter anyway. It could apply to the Gusty Glade Galaxy for all we care. ) So… basic math tells us that Cw = C/W. So, Cw must be average consumption per average wage.

Thus we have our 2 functions:

function AverageConsumptionPerAverageWages( χ, Yw )

function TotalConsumption( average_wage, χ, Yw )

Already, things are looking much mo’ coherent.

Thankfully, these 2 functions share the same 2 variables. As it turns out, I realized that these weren’t 2 variables being multipled together, but 1 other function with Yw as an argument. These are the kind o’ parsing errors you still have to look out for in programming. For instance, in C++, it’s still possible for a compiler to mistake the initialization o’ a variable through parentheses with the initialization o’ a function.

So… ¿I guess Cw & C are variables to functions? Good thing that works perfectly for JavaScript:

var AverageConsumptionPerAverageWage = function( Yw ) {};

var TotalConsumption = function( average_wage, Yw ) {};

Let’s just appreciate how much easier it is to understand the word “function” o’er a cheap knock-off version o’ the letter “χ”.

Now we just need to figure out Yw. I’ve figured it out: it’s “income in terms o’ wage units”, which is a weird way o’ saying “income per wage unit”, which is a weird way o’ saying “income per average wage”.

Thus, now we have:

var AverageConsumptionPerAverageWage = function( income_per_average_wage ) {};

var TotalConsumption = function( average_wage, income_per_average_wage ) {};

Note that average_wage & income_per_average_wage could be described as functions, too:

var AverageWage = function( total_wages, total_number_of_employees) {};

var IncomePerAverageWage = function( total_income, AverageWage ) {};

Now, we still need to define the implementation o’ these functions. We already know AverageWage & can easily discern IncomePerAverageWage through that:

var AverageWage = function( total_wages, total_number_of_employees )
{
    return total_wages / total_number_of_employees;
};

var IncomePerAverageWage = function( total_income, average_wage )
{
    return total_income / average_wage;
};

Thus, we’d call IncomePerAverageWage thus:

var income_per_average_wage = IncomePerAverageWage( total_income, AverageWage( total_wages, total_number_of_employees ) );

In contradiction to my core claim in this article, there’s a difference ‘tween total_income in this function call & in the function definition earlier. In programming, this is known as “scope” ( sort o’ like my namespace point made in a footnote down below ). The total_income in the function definition only exists for the duration o’ that function call & is set to whatever is pushed to it through this call. This call, meanwhile, references a specific variable whose scope we’ll deal with later.

Anyway, we have 2 mo’ functions to define:

var AverageConsumptionPerAverageWage = function( income_per_average_wage )
{
    return income_per_average_wage;
};

‘Course, this 1 is pointlessly redundant ( & a wrong assumption ).

var TotalConsumption = function( average_wage, income_per_average_wage )
{
    return average_wage * income_per_average_wage;
};

Interestingly, we could redefine AverageConsumptionPerAverageWage in a ( slightly ) mo’ meaningful way.

var AverageConsumptionPerAverageWage = function( total_consumption, average_wage )
{
    return total_consumption / average_wage;
};

‘Course, comparing these 2 functions & understanding basic math will allow one to see that total_consumption / average_wage will inevitably = income_per_average_wage — which is, ‘course, the whole point ( mo’ on this later ). That average_consumption isn’t a particularly meaningful value — better median_consumption — is beyond our scope.

Here we can see all the pieces together:

var TotalConsumption = function( average_wage, income_per_average_wage )
{
    return average_wage * income_per_average_wage;
};

var AverageConsumptionPerAverageWage = function( total_consumption, average_wage )
{
    return total_consumption / average_wage;
};

var AverageWage = function( total_wages, total_number_of_employees )
{
    return total_wages / total_number_of_employees;
};

var IncomePerAverageWage = function( total_income, average_wage )
{
    return total_income / average_wage;
};

var total_income = 16770; // In billions. // These 2 must be
var total_wages = 157.5; // In billions. // in the same unit.
var total_number_of_employees; = 124.73    // In millions.

var average_wage = AverageWage( total_wages, total_number_of_employees );
var income_per_average_wage = IncomePerAverageWage( total_income, average_wage );

var total_consumption = TotalConsumption( average_wage, income_per_average_wage );

console.log( total_consumption ); // Prints 16770 to browser debug console.

Mo’ Fun

You’ve probably noticed by reading the comment after the final statement or running this code yourself ( you can make the debug console pop up in most browsers by pressing F12 ) that total_consumption = total_income. While just following the logic o’ the functions & understanding basic math shows this, familiarity with economics & basic pattern-recognition was mo’ an asset.

But with programming languages, we have 1 tool we can use to test this a lot: conditionals.

To simplify, let’s wrap up the code outside o’ functions in the previous program into 1 big function & have it return a value:

var TotalConsumptionFromIncomeWagesAndEmployees = function( total_income, total_wages, total_number_of_employees )
{
    var average_wage = AverageWage( total_wages, total_number_of_employees );
    var income_per_average_wage = IncomePerAverageWage( total_income, average_wage );

    return TotalConsumption( average_wage, income_per_average_wage );
};

This’ll abstract ‘way all these connections so we don’t have to go through them ‘gain.

Let’s add 2 mo’ functions. The 1st is a simple helper function:

var RandomNumber = function()
{
    var MAX = 99999999999999;
    return ( Math.random() * MAX );
};

JavaScript’s built-in random function is odd: it returns a random # ‘tween 0 & 1. This function increases that to 99.9… trillion.

The next function is the main focus o’ this program:

var TestThatConsumptionEqualsIncome = function( iterations )
{
    var total_income;
    var total_wages;
    var total_number_of_employees;
    var total_consumption;
    
    var consistent = true;

    if ( isNaN( iterations ) ) // isNaN: Not a #
    {
        iterations = 999; // Default
    }
    
for ( var i = 0; i < iterations; i++ )
{
    total_income = RandomNumber();
    total_wages = RandomNumber();
    total_number_of_employees = RandomNumber();
    
    total_consumption = TotalConsumptionFromIncomeWagesAndEmployees
    (
        total_income,
        total_wages,
        total_number_of_employees
    );
        
    if ( total_consumption != total_income )
    {
        consistent = false;
    }
}
    if ( consistent )
    {
        console.log( “¡Our math formulae are pure!” );
    }
    else
    {
        console.log( “¡Economics is a failure! ¡Abort!” );
        SmashCapitalism();
    }
};

1 major flaw o’ JavaScript is its lack o’ argument defaults ( values that the argument becomes if nothing is sent to the function in its place ). This is bewildering, since just ’bout every language has them, including the languages that were JavaScript’s main inspiration.

In this case, the need to manually check for a given argument isn’t too bad, since we need to ensure that it’s a #, anyway — which can’t be done automatically without static typing.

Anyway, now we just need 1 statement @ the end:

TestThatConsumptionEqualsIncome();

Run & let’s see the magic:

Math is a lie.

( Also, Firefox shows a hilarious depth o’ social knowledge with that line, “ReferenceError: SmashCapitalism is not defined”. )

All right, calm down. I tested this program a bit & realized that a’least 1 kind o’ math is a lie: floating-point #s. Try to ne’er use floating-point #s if you can; they can’t seem to understand such obscure, arcane concepts o’ equality. Looking @ the values gotten, total_consumption & total_income vary by .00000000001 or so. But e’en if they didn’t, they could fail equality, ’cause floating-point #s. This is the case wherein JavaScript’s loose typing is a pain — just like how I have to be careful doing math in Python so it doesn’t try to trick me into thinking 8 / 5 = 1. In C++ or Java I wouldn’t have this problem, ’cause they demand you specify the type. Then ‘gain, C++ also automatically converts types without you knowing, so it kind o’ sucks, too.

The problem is, trying to fix this is mo’ complicated than just wrapping Math.round() round every division. In my tests, ’twas strikingly common for these divisions to give 0 values ( which makes sense, since it’ll be common for the values to be close ‘nough that division would give some value below .5 ) & when a # was divided by 0, which every mathematician knows is kosher, it gives “Infinity”. & when that’s multiplied, we get “NaN”. In that case, we’re guaranteed to get an economic disaster, since NaN isn’t equal to anything — e’en itself. Now, this is what I call a well-designed programming language.

Obviously I can’t just do bounds-fixing for 0, since that would change data, which could cause values to go out o’ sync & cause the same capitalism-destroying problem. Also, fixing our “model” by just “fixing” the data is both hilariously wrong & yet hilariously right for an economist.

Thankfully, I have a much mo’ elegant way to move the goalposts — 1 that’s, if I say so myself, much saner: we’ll just change the definition o’ “=”:

var AbsoluteDifference = function( one, two )
{
    return Math.abs( one – two );
};

var CloseNough = function( one, two )
{
    // I said, “¡Hey! ¿Are we doing government work here?”
    return AbsoluteDifference( one, two ) < 1;
};

By the way, if you e’er hope to get a job programming, I highly recommend you fill your functions with silly comments that reference songs & memes & stuff. I can guarantee your boss’ll think you have the utmost professionalism.

Interestingly, the new ES6 standard apparently has some Number.EPSILON variable that is s’posed to be used for comparing floating-points, rather than using a better # system. ‘Cept, that # doesn’t seem to work with my program ( probably ’cause o’ all the divisions that lead to further impurities ).

& now we change change the conditional statement:

if ( !CloseNough( total_income, total_consumption ) )
{
    consistent = false;
}

Let’s see how it works now:

( Holds breath ).

¡Capitalism is saved!

¿Why’d I waste my time on this horse-piss ‘gain?

Posted in Politics, Programming

Mario vs. Donkey Kong

Mario vs. Donkey Kong is ’nother game I neglected to write ’bout.

It’s based on the Game Boy Donkey Kong, — or “Donkey Kong ’94”, as we say in Rogueport — which was amazing & underrated: it’s a puzzle platformer wherein each level is split into 2 parts: in the 1st, you need to grab a key & bring it to the locked door, as in “Donkey Kong ’94”. In the next, you need to grab the toy Mario. ’Long the way there are a red, blue, & yellow present; collecting them all gives one a bonus that allows one to get extra lives & bonus points. Beating the level score nets one a star, which can unlock new levels.

Its story is Nobel-Prize worthy, told through the advanced art o’ slideshows o’ prerendered CGI screenshots in pixelated glory. DK, while sitting @ home watching TV, sees a commercial for Mario toys & decides to bust into Mario’s factory, fill burlap sacks with them, & flee, only for Mario to chase right ’hind. That this plot is essentially the reversal o’ Donkey Kong Country’s plot is a clever quirk on DK’s character that the developers probably hadn’t considered. Why Mario owns his own factory is ne’er ’splained, any mo’ than Mario’s occupation as a referee or a cake-factory worker.

I love puzzle platformers, & this game is full o’ clever puzzles with fun mechanics, such as the red, blue, & yellow switch blocks, which permeates levels throughout all the worlds, & yet ne’er feels tired, e’en by the end. I also like how the theme o’ red, blue, & yellow seeps throughout so much o’ the game.

The level themes are rather clever: the 1st world isn’t a bland grassland, which isn’t in this game @ all, but a toy factory; the final world, meanwhile, isn’t some fiery world, but a cool, night-time city. E’en the volcano theme is made mo’ interesting by putting it midway through the game, rather than the end, while the forest world is the penultimate, both somewhat like Donkey Kong Country 2.

The graphics fill me with nostalgia, e’en if they’re hilariously tacky in their attempt to emulate 3D graphics on a 2D system, ’specially with the clunky voice clips they just loved to use on the Game Boy Advance. In general, Mario vs. Donkey Kong’s aesthetics scream early-2000s Game Boy Advance, which makes it fitting for the final game I’m examining in my GBA tribute.

The game’s also full o’ levels — ’gain, without feeling like it has padding. In addition to the 6 worlds o’ 6 levels, plus a Mini Mario stage & boss, there are 6 extra worlds & 12 “expert” levels that can be unlocked by earning stars in each level through beating the high score & getting all the presents.

A minor problem with this game is that the controls & physics are somewhat clumsy, unpredictable, & choppy. Mario sometimes can’t decide whether he wants to stop on a dime ’pon letting go o’ a direction button or continuing to slip off the platform into a garden o’ spikes. Sometimes he decides not to jump when I press A. Sometimes he can’t manage to jump o’er a single block. He’s also finicky ’bout picking up keys or moving on conveyor belts, & in 1 level, ’twas inconsistent on whether he could throw a key up through conveyor platforms, so much that I @ 1st thought you couldn’t till I tried half a dozen times. Also, Mario can only seem to throw keys upward if he’s not moving horizontally @ all, regardless o’ whether you’re holding up — & that’s the most consistent, & thus least terrible part. In ’nother level, Mario would always grab a vine or monkey tail just by jumping into it, ’cept for 1 time I tried while jumping toward 1 o’er spikes.

Worse is the fact that this game can be anal ’bout the high scores in some levels needed to get 100% ( though other levels aren’t ) . Both these combined lead to hours o’ frustration & cursing Mario to the rashy bowels o’ the hellblizzards.

Also, while the puzzles are clever, sometimes the levels are designed to waste time, which can lead to tedious waiting if you have to redo a level. 3-1 makes you wait a while after getting to the key for the platform to slowly return to you, after rising & falling a few times ’long the way. I’ve ne’er been able to figure out a way to skip the wait. Half o’ 3-6 is just waiting for the lava to slowly fall so you can reach the bottom, only to quickly hop up minutes before the lava would e’er come close to climbing back up to you. I’m not sure what they were thinking with that level: it’s mind-numbingly easy & just makes you wait a long time. ¿What’s the point? 4-5 has an awful Thwomp that it seems like you can pass under him @ 1st; but the right corner o’ him will just smash you if you try. However, you can, if you’re daring & impatient, super somersault ( back flip jump & jump ’gain just after landing ) o’er him while he’s on the ground; though I’m not sure if that actually saves time, & can be finicky to time.

In general, I’m mixed on the involvement o’ the Mario toys in this game. While I like the aesthetics o’ them & the toy factory, & the story is refreshing compared to “villain kidnaps woman, Mario must rescue her”, they don’t have a good effect on gameplay. Mixing the key-&-door mechanic from the Game Boy Donkey Kong & the mechanic o’ just grabbing the toy in 2 half-levels spliced together feels forced, ’specially since the 2 half-levels rarely have anything to do with each other; & the key-&-door mechanic was much mo’ interesting. I’d prefer it if this game kept Game Boy Donkey Kong’s method o’ just 1 level per level, get the key to the door, & collect the 3 items on the way.

Interestingly, the extra levels combine them in a way: there’s a Mini Mario with a key that you have to lead with you to the locked door. But that has the following problem:

That problem would be escort missions, which you have to do before every boss & during the extra levels. The 1s before the boss have you lead 6 o’ the toy Marios to the toy box, collecting the letters that spell out “TOY” ’long the way. The problem is the same o’ every escort mission: they’re e’en mo’ finicky ’bout following my lead than Mario himself, & their “Hey, Mariooo” makes me want to destroy them. Why developers continue to put in such an obnoxious mechanic that, as far as I know, nobody likes, is beyond comprehension. Why DK wants these annoying toys is a mystery, as well.

Worse, you have to do this escort mission perfectly ’gain if you get hit e’en once gainst the boss1, if you want the high score. Each hit gets you points, & you can only get all the hits if you beat the escort mission beforehand.

As for music, while TV Tropes claims its music is great… Well, they say all music is great, so that’s meaningless. I ne’er found any o’ it memorable. Certainly none o’ it comes close to the amazing music in the Game Boy Donkey Kong.

¿Apparently the ghost house songs are particularly good? I kind o’ liked the 3rd theme. It’s no “Fight Against a Stronger Monster”, — or e’en a “Showdown at the Tower” — but it’s all right.

’Cause o’ its superior controls, physics, music, & mo’ refined gameplay, I’ll have to judge the Game Boy Donkey Kong to be superior to Mario vs. Donkey Kong. That said, e’en if you’ve already played the Game Boy Donkey Kong, I’d still recommend this game.

Also, our heroes are assholes.

Posted in GBA Tribute, Video Games

Debunking the Linguistic Rule Against “Mo’ Unique”

It’s truly the greatest threat to our present society — much mo’ than Hairpiece, fascist corporatism, or Google searches that give me stupid listicles ‘stead o’ useful info.

A common grammar “rule” is that unique can’t be modified with words like “very” or “mo'” ’cause “unique” means “1 o’ a kind”.1 E’en in the comments o’ that page people hand-wrung ’bout how it’s been used fore’er, & 1 person argued that everything could be described as “unique”.

Oddly, I have the opposite conclusion: the word “unique” has no logical meaning ’cause nothing could truly be described as “unique”.

¿Want proof? ¿Can we describe something with English words? Then it can be put in a set o’ multiple things that can be described with English words, & therefore can’t be “unique”, ’cause it shares something with an infinite # o’ other things. The paradox o’ “unique” is that if it’s possible to describe something as “unique”, then by definition, it can’t be. It’s like the sentence, “This sentence is false” or, inversely, a set o’ all sets that don’t contain themselves.

If one were to argue that “unique” only means 1 o’ some kind, not all kinds, then the argument that “unique” can’t be modified is obviously false: something that is 1 o’ a kind in mo’ kinds than something else is unquestionably mo’ “unique” than that something else. ‘Course, “kind” is so vague that there could be infinite #s ( indeed, a kind is a thing itself, which should please Lisp fans immensely ), & thus it’d be impossible to test all o’ the kinds something could be ‘lone in, & thus it’d be impossible to prove that anything is mo’ “unique” than anything else; but we’re simply talking theoretics, not facts.

A better grammar rule is to avoid the word “unique” ’cause it invokes a different bad habit o’ writing: sensational language & o’eruse o’ superlatives &mash; ‘specially since it’s so oft invoked in a narcissistic way to describe oneself. After all, there’s nothing mo’ trite than calling oneself unique.

Posted in Literature Commentary