Posts from this year

Questions or comments? Email me.

Fri 20 November 2020

What Melee Gave Me

On or around November 19th, 2020, The Big House - one of the largest and storied tournaments for Super Smash Bros. Melee - received an unfortunate cease and desist notice from Nintendo of America, Inc.

Referenced in the matter is Slippi, a fan made, and supported, method of playing Melee online utilizing rollback, providing an almost console-level experience when it comes to netplay latency. In a year full of unpredictable events, and the worst pandemic of our lifetimes, Slippi has been vital in ensuring the health of the Melee scene without risking the health of individuals.

I'm not a lawyer, nor do I know the specifics of the cease and desist that The Big House received, so I can't comment on that. However, I wish Nintendo would reconsider their stance - I've been playing Melee since launch day, and it's meant the world to me, so I think it's worth sharing this.

For full disclosure, I've contributed to the Slippi project over the past few months - primarily on the Mac side of things, helping to ensure things work well there. I do it mostly because it feels like giving back to a game and community that gave me what you'll read below. With that said: none of the opinions in this post should be taken as representative of the Slippi team at all, though - mine, and mine alone.

Melee and Me

Super Smash Bros. Melee was released on Dec 3rd, 2001. I got my Gamecube shortly after, and with it, a copy of Melee. While I'd been playing fighting games for as long as I could remember (going all the way back to Street Fighter 2, then moving into the era of Third Strike, Marvel vs Street Fighter/Capcom, and so on - along with the requisite Smash 64 experience), this game immediately felt different. Not necessarily better, but expressive in a way they weren't - from graphics, to sound design, to movement options, to stage design and more, I was enthralled in a way no game had managed before.

I come from a rather large family (I'm the oldest of 7...), so we always had enough people to play with. We started, like many, with your standard Free-For-All matches on Hyrule Temple, moving on to trying every item option possible, exhausting the single player modes, and finding every trophy. At a certain point, the game felt complete... but fighting games have a competitive aspect to them, and there's always someone to try and beat.

So I found the competitive scene, and dabbled on and off. In the interest of keeping this readable, we're going to skip ahead a bit - just know that Melee was there for some of the most difficult and formative periods of my life.

Melee and Jamss

My youngest brother, Jake (or as he was known online, @notjamss), first found Melee by chance: walking through the living room while I was watching a tournament, and asking what it was. So we hung out there, and I started to explain the game, from tournament lore, to techniques and more. He was hooked - and wrote about it once, if you wanted his take.

Our family is from Northern Virginia, so it was perhaps natural that we'd want to attend SmashCon. We first went in 2016; for Jake, it was his first exposure to the competitive scene in real life, and we made plans to attend again. We missed 2017 due to my travel schedule, but we did hit 2018... albeit under some tougher circumstances.

You see, in February of 2018, Jake was diagnosed with a combination of Acute Myleoid and Acute Lymphoid Leukemia. This required an immediate, and ultimately long, stay in the hospital. Our Father was (literally) always there with him, but the rest of us siblings would take turns staying with him. His room was almost amusing, considering everything we moved in there to make it better for him - including, most importantly, a working Melee setup.

And so play Melee, we did. A ton.

The Community

In an attempt to keep his spirits up in the hospital, I decided to see if I could put together some surprises for him. Through a friend of my lovely wife, we got Twitch to send him a care package. He had a fledgling interest in coding, so I sat with him and we put together a basic app, which wound up bringing a swag package from them as well. He'd alternate Twitch and hoodies for his walks around the hospital, and always seemed happy to explain them to anyone curious.

Most notably, though, was reaching out to Panda Global, who sent him a jersey that he could be found wearing... pretty much every day.

Graciously, they also said they'd be happy to meet and play with him if SmashCon 2018 was able to work out. I didn't tell Jake this, but I did tell him that if he made it out of the hospital by SmashCon I'd be happy to take him. His doctors worked tirelessly - and amazingly, he was able to go to outpatient treatment, albeit wearing a mask all the time (before it was popular).

The timing was tight, but I flew back, and off to SmashCon we went.

SmashCon 2018

Much has been written about this tournament elsewhere, and I encourage you to read (or watch!) it if you haven't: pretty much every game had fun sets and great Grand Finals, coupled with SmashCon's generally great setup for chilling and playing.

Jake and I spent our time roaming around, playing various games and browsing the merchandise stalls. Jake got to meet up with some members of the community he'd been friends with for a bit, and the Panda Global crew made him feel like a VIP - MVD and Wobbles (Panda Global players at the time) in particular were great, with MVD somehow finding Jake in the crowd and welcoming him personally. Wobbles welcomed Jake into some friendlies and spent time showing him tech, and signed his new controller to replace the one from 2016.

A very friendly Panda Global representative, who I've unfortunately forgotten the name of, eventually found us and asked Jake if he'd like to meet Plup and play some games with him. Jake jumped at the chance, and they played for about an hour or so. If I recall correctly, Plup wasn't feeling the best, but still went out of his way to do this - and it meant a lot to Jake.

To top it all off, we watched what is one of the greatest Grand Finals set of all time (and the final US singles set before Armada's sudden retirement). Here, Melee gave me one of the best weekends of my life.

We left SmashCon 2018 feeling great, and we'd continue our general tournament watching and netplay sessions. Since I was located in Seattle, this became our way of staying close even when I couldn't hang with him in-person.

Eventually, Jake made it to a stable enough place to go for a bone marrow transplant (and thankfully, one other sibling was a good match). He got it, and we waited to see if it worked.

Saying Goodbye

Unfortunately, science just sucks sometimes. The doctors did everything they could, but it looked as if it just wasn't taking - Jake's cancer was pretty rare, and options became limited to comfort to ride it out. Jake would ultimately pass at home, surrounded by family and without pain. We miss him every day.

For me, I've struggled to write about this experience since it happened, and it's the subject of another blog post that I'll eventually finish writing, when the words come. What I wanted to showcase here, though, happened shortly before Jake passed.

Before death, some experience what's known as a "surge" or "rally" - a noticeable, but short, return to energy and form. It can be jarring to witness, mostly due to the juxtaposition of watching the decline beforehand - but in a way, it's beautiful too. Jake had a rally, and he looked up, and asked if we wanted to play Melee.

We all kind of just looked around, and then said yes. We played a few one on one, and then we swapped out and played group games with the cast of siblings.

To this day, they were the most surreal games of Melee I've ever played.

Some quick additional context might explain. Fighting games in general (and Melee in particular) are incredibly complex games, and Melee served as a great test for eyeing decline. When we'd play in the hospital, or over netplay, Jake and I would often ask each other if his reactions started to get slower, or if the game became difficult to play - for example, hands not listening, or being unable to process things on screen. Against the odds (and likely thanks to the support of his incredible doctors), he never really declined.

Except towards the end of those last games.

Jake had never really talked much about the concept of death, other than being proud that any research or efforts on his condition might be helpful to others down the road. I spent a few months struggling to parse these games, until one day I realized that Melee had transcended just being a game for us - it was a language, and that was our goodbye. We were given closure in a package I didn't understand, but to this day I'm thankful for it.

On Melee

This post leans heavily personal, and I'd forgive anybody for wondering how this pertains to the Big House Online cease and desist.

Simply put: I wanted to showcase what Melee gave me. The game is approaching 20 years old, and while I understand Nintendo wanting to protect copyright and trademark and so on, there comes a time where, like any child, it ceases to just be a product of your own creation.

Melee as an experience is defined by the 20 year rollercoaster of a community it developed. There is no other Smash Bros. game that has reached the level that Melee has, and there is no technological achievement, or cast of characters, or quirky mechanics that can match it - because Nintendo, frankly, did not create the part of Melee that matters now. But they could be a part of it.

Nintendo, if you happen to read this: I get that you're the "family friendly" company, and I understand you're a business. But families come in different shapes and sizes, and Melee meant more to mine than you could possibly imagine.

I implore you to reconsider your position, and find a way to get okay with streaming tournaments.

Sun 15 March 2020

You Did Not EARN IT

In the midst of a global pandemic, there's a bill moving through the Senate that has massive ramifications for private companies and platforms utilizing encryption to secure user data. Smarter people than me have written in depth about it, and I urge you to read their take and contact your representatives to take action against this bill.

Essential Reading

Contact Your Representatives

If you can take action, contact your representatives and ask them to vote against or condemn this bill. The passage of this would cause serious harm to users, ranging from the general web-browsing population to activists and targeted groups (e.g, minorities). I've included a copy of the letter I sent to my representatives earlier this week - feel free to use it as a base when contacting your own. If you're unsure where to look or how to contact your representatives, check out this EFF tool for getting started.

I'm writing today to ask you to consider voting against the EARN IT act currently making its way through the Senate. While the act is targeting the very serious issue of child exploitation, it does so in an overly broad way that threatens the foundations of the internet. The bill effectively proposes the creation of a government-funded commission that would be tasked with establishing U.S. government dictated best practices for private-sector companies and services in regards to detecting Child Sexual Abuse Material, or "CSAM".

Private companies that would be threatened by this already work to aggressively detect, flag, and address harmful content (CSAM), and are actively engaged in working with the government to further this work. Passage of this bill, however, would ensure that the freedoms the internet has held, which allowed it to grow and innovate on an unprecedented scale, would effectively be tied to Attorney General signoff.

The bill (indirectly, but notably) curtails the ability for private companies to design secure products and services. These types of development require strong encryption, both for systems like digital commerce, as well as the safety of users - including children.

Allowing this type of legislation to pass under an adminstration that has seen fit to strip away civil liberties is a frightening prospect that must be rejected.

Wed 01 January 2020

Wobbling in Rust

In 2019, one of my goals was to get back to writing here more regularly. I'm proud to say I was mostly successful in that endeavor: it was certainly an increase from the amount written in 2018, and absolutely a win over 2017 (which saw... no posts). I think personal websites still have value in the modern era, and so I'm going to continue this goal in 2020 and try to write at least a post a month.

To start things off, I figured this'd be an amusing topic - equal parts stupid, dangerous, and potentially useful.

How to never fail in Rust

Let's say that you've got a task you need to run. For whatever reason, a multitude of runtime errors can occur where you need to just keep retrying - for example, an upstream network endpoint is finnicky and drops the connection sometimes, and resuming is not an option. It can panic due to a third party library, too - Rust is still a newer language, even with the insane growth it's seen the past few years, so this isn't too out there concept-wise.

Assuming we have a method like the following:

use std::error::Error;

fn do_something() -> Result<(), Box<dyn Error>> {
    // Code that could potentially Err() or panic

Our goal is simple: how do we just keep retrying this thing, results be damned?

Unwinding a panic

In the standard library, we can find some methods that are useful for this problem. The one we use below is std::panic::catch_unwind, which will catch unwinding panic events. Note that this doesn't cover every type of panic event - as the docs point out, one that aborts the process will bypass this entirely. It returns a Result, where the Ok variant is just the result of a passed in closure, and the Err variant being the cause of the panic.

Hey, listen! This is a Footgun.

The docs do point out that you should not use this as a general try/catch mechanism. They're right.

My use case for this was a panic happening somewhere in ssh2, where I'd occassionally run into a panic due (seemingly) to it linking against C code. In my particular case, it was easier to just keep trying since it was randomly failing, but would work 100% fine the rest of the time.

It's entirely possible this was a bug in an older version of ssh2 and would not happen today. Consider this trick a footgun and only contemplate using it if you're truly in a situation that requires it.

You've been warned!

Corrections as of March 19th, 2020

A few weeks after this was posted, it wound up /r/rust, where /u/najamelan and /u/viaxxdev pointed out some issues with the original code in this post. This has been updated to take their points into account, and major thanks to them for catching it!

Later in the day, type_N_is_N_to_Never also noted that this could be reduced down - so the code block below now uses that approach, as it's cleaner and arguably easier to digest. Nice!

Disclaimers out of the way, we now know how to catch and loop a panic. The code below illustrates a naive way to loop and handle panic events. Notice we mark the passed in closure as requiring RefUnwindSafe.

use std::error::Error;
use std::panic::{catch_unwind, RefUnwindSafe};

/// Given a closure, will attempt to run it and unwind from panics... infinitely
/// retrying until it works.
/// Maybe.
fn wobble<
    F: RefUnwindSafe + Fn() -> Result<(), Box<dyn Error>>
>(process: F) {
    while let Err(err) = catch_unwind(|| process()) {
        eprintln!("{:?}", err);

Usage is relatively straightforward. For example:

fn do_something() -> Result<(), Box<dyn Error>> {
    panic!("Induce a panic here, for testing");

fn main() {
    wobble(|| {

Why's it called Wobbling?

It's an "infinite" move (or glitch, some might say) in Super Smash Bros Melee for the Nintendo Gamecube. I chose the name because the move is divisive, not something most people enjoy seeing in competitive tournaments, and while valid (depending on the ruleset), might not be the best way to play the game. It kind of symbolically fits here: you probably don't want to use this, and it's arguably not a smart way of doing things... but hey, you might make top 8 once in awhile.

Great! Should I use this?

Probably not.

I mean, sure, you can. For a small subset of problems it can be a useful trick. It's probably not what you want to do, though. It almost feels like a lurking unsafe {} without explicitly being so. The code could also be slightly less verbose, for sure, albeit code golf wasn't the point here.

With that said, it definitely worked for me. Lately I've come to value my time more highly than I did in the past, and this let me focus on other things while still logging errors to determine what the actual issue was. I'll call it a win.

Ryan around the Web