roncli.com blog
The blog of roncli
roncli.com blog
roncli.com
blog
Profile
roncli
Houston, Texas, United States
Labels
Coding
CTG Music
Editorials
Games
Miscellaneous
Music
Servers
Silliness
Software
Sports
Trax in Space Beta
Weather
Recent Posts
A Tale of Two Communities
The Final Stretch
A Two Tiered, Untiered OTL
Secretly, you wish you could've done what I did
What have I done since roncli.com v2?
It's Done. It's Finally Done.
The Big Picture is Starting to Wear on Me
A Low Bang to Buck Ratio
win-acme
Overload has truth; next it needs balance
Archives
February 2005
March 2005
April 2005
May 2005
June 2005
July 2005
August 2005
September 2005
October 2005
November 2005
December 2005
January 2006
February 2006
March 2006
April 2006
May 2006
June 2006
July 2006
August 2006
September 2006
October 2006
November 2006
December 2006
February 2007
March 2007
April 2007
May 2007
June 2007
July 2007
August 2007
September 2007
October 2007
November 2007
December 2007
January 2008
February 2008
March 2008
April 2008
June 2008
July 2008
September 2008
December 2008
February 2009
July 2009
August 2009
September 2009
October 2009
November 2009
February 2010
March 2010
April 2010
June 2010
July 2010
August 2010
September 2010
October 2010
November 2010
December 2010
March 2011
June 2011
July 2011
August 2011
September 2011
October 2011
December 2011
January 2012
February 2012
April 2012
July 2012
November 2012
July 2013
April 2014
July 2014
August 2014
November 2014
December 2014
March 2015
April 2015
May 2015
June 2015
July 2015
September 2015
January 2016
February 2016
May 2016
July 2016
November 2016
March 2017
January 2018
May 2018
June 2018
January 2019
January 2021
February 2021
March 2021
August 2021
October 2021
December 2021
August 2022
November 2022
October 2023
February 2024
Monday, February 12, 2024
A Tale of Two Communities
Posted: 3:01:00 AM 0 comments
"If you're a high visibility player, it's on you to move the community in a positive direction." -Jonas Neubauer, 1981-2021, seven-time CTWC champion


This quote by Jonas Neubauer has been engraved on the Classic Tetris World Championship's first and second place trophies since 2021, the year he unexpectedly passed away at the age of 39. I met Jonas and his wife Heather, a Dr. Mario world champion at TwitchCon in 2019. We both happened to cross paths at GDQx 2019. I was doing couch commentary for SpootyBiscuit's Cadence of Hyrule run while Jonas was doing couch commentary for Blink's Tetris 99 run. I got a big hug, a photo I'll cherish forever, and I introduced Jonas and Heather to one of the exhibits on the show floor, which was basically a mind-meld Tetris game. I remember the two of them enjoying themselves and having fun, and their laughter was contageous. Jonas was one of the few people I've met who, online, was pretty much the exact same person he was in real life, one of the most genuine individuals I've ever met. He was graceful in his CTWC defeats, and always worked to build up the community he championed.

Since his last win, there have been 4 other tournament winners. Joseph Saelee won twice. Then, Michael Artiaga (dogplayingtetris), won in back to back years. Eric Tolt (EricICX) defeated Justin Yu (Fractal161), the latter of whom won it a year later. Harry Hong also famously won the tournament back in 2014, interrupting Jonas's seven year streak.

All of these players have made a positive impact on the classic Tetris community in some way. Some have even made contributions to the community, hosting their own events, doing content creation, and genuinely being a good ambassador to the game. I had no idea that one side tournament at SGDQ 2018 would get me involved in a community amazing enough that I now find myself contributing my time to almost every classic Tetris organization. Oh, I suck at the game! But I don't let that stop me from being involved in organizing events, commentating for matches, and playing in the lower tournament levels myself, even if I have taken a bit of a step back from competitive lately to keep my competition anxiety in check.

Sure, Tetris has its bad spots. Players cheat. People get upset at others. People do tasteless things that get them banned. It happens, because people suck. But far and away, the classic Tetris community is wholesome, and I am better for being a part of it.

If only every community was like Tetris.

In the fall of 2021, a player showed up on the Overload Teams League team SpaceCowboys by the name of Zor. He was a pretty decent player. Not quite top 10 in a league of some 60 pilots, but someone seen as dangerous to play against. There was a lot of secrecy around this player. Teammates would often go on mute when talking about Zor's past experience with 6DoF games, or just outright not stream. Someone caught a stream and quickly identified the voice as the Descent pilot - and former OTL pilot - Jediluke. With a DCL record of 5982 wins and 348 losses (1413-117 vs Rethink, 809-33 vs Drakona, and 476-24 vs b2af), Jediluke wasn't just a known quantity, he was the most active competitive player while the DCL was around, between 2013 and 2020. And, as the record indicates, he was pretty good, too: he was ranked first at the end of more DCL seasons (7) than anyone else (Mark392 5, Souljah 3, bahamut 1). What's more, he is unquestionably the most successful D1 pilot on my Twitch series The Observatory, a quarterly tournament open to all Descent 1 pilots where games are broadcast and commentated on, something the community never really had prior to this series, which was founded in 2016. To date, he's won 31 out of 34 seasons, losing only to Mark392 (season 5), Zero (season 12), and Morfod (season 26). We'll talk about Morfod's winning season a bit later. Unfortunately, Jediluke's also got a temper. He gets mad when he loses, and winning your first game over what seems like an impossible opponent usually results in him making you feel like shit, rather than celebrating your momentus victory.

For comparison, here's Jonas's last game at a live CTWC where he was shockingly eliminated in the first round.

Anyway, back to the point, Jediluke decided to compete in the OTL as Zor to "get away" from his Jediluke personality. Thinking it would put less pressure on himself, he adopted the alias and kept his true identity a close secret for a couple weeks. The voice changer was pretty silly, but once the word got out that Zor was Jediluke, he posted something quick in the OTL Discord explaining the name, and barring some critique from some old rivals, that was the end of it. The general vibe was like "yeah, it's weird, but he's got less of an attitude now, so whatever."

Also towards the end of 2021, season 26 of The Observatory occurred. An unknown entrant with the name "Genevieve" (PwnJett in game) showed up for the Finals Tournament as an unqualified player who had to fight from the wildcard anarchy to even get into the knockout bracket. He did so in shocking fashion, taking out Jediluke in the semifinals and Sirius in the finals to win the tournament. And, as the tournament concluded, Morfod revealed that he was in fact Genevieve. It was amusing at the time, and everyone got a good laugh. He had only played under that handle for a couple weeks, enough so that some regulars were aware of the handle. For me, I was kind of kind of amused, but also kind of annoyed that someone would go to such lengths as hide their identity just to gain an advantage. I let it slide, hoping it wouldn't happen again.

Um, remember earlier, when I said that people suck?

Season 35 of The Observatory kicked off this month, and with it Jediluke proclaimed his retirement, supposedly tired of not having a challenge after Mark392 showed up for about a week to play games and then left to become a parent. While Jedi's lack of participation didn't bother me - a more competitive top of the table would benefit the show - a newcomer, Tonka, showed up who had been around since August. Code, a long time Observatory player, did some training with him, and Tonka's skill began to noticeably rise. By the time season 35 began, it was clear that he would be a strong contender, and did in fact win all of his games in the first episode, including against season 34's runner up, terminal.

But something didn't sit right with some pilots, and eventually it was made known to me that he was suspected of cheating. Although there wasn't anything conclusive, and it was later decided that no cheating was involved, it got enough people suspicious that for the second episode, his IP was taken from a game log and compared with some website logs. I noticed that there was a lot of activity with that IP on the Overload game browser that didn't match the player's activity in Overload, which was very low and many months prior. I then decided to compare the IP to logs on the game servers themselves, and that's when the smoking gun was found. That IP was the same IP used by Zor in Overload.

While I had 100% confidence at that point that Tonka was 31-time champion Jediluke, a lot of things didn't add up. This player Tonka showed up in the community about 6 months ago. They were trained on basics like trichording. They had matches with Jediluke. They gave a phone number with a Houston, TX area code. They would chat back and forth with Jediluke, aggressively looking for games. Even now, this whole scheme doesn't make sense to me.

But it was real. Jediluke eventually confessed to the whole thing. And he was totally nonchalant about it. In fact, my current co-commentator, Chillybus, thought it was crazy that he would go through the whole thing. He said on Discord:

"for six months? what do you have to gain against pilots who would take hundreds and hundreds of games to even be competitive with you, let alone take a game? multiboxing discord accounts? faking tracker games? IMO you did competition a disservice and your friends dirty from the sound of it, just chasing shadows of the afternoon someone aliased you to a win. not how a longtime decorated top competitor should compose themselves. it isn't time to go around again, I think it is time to log off. you have shamed yourself here. That's all I'll say in this time and place."


The reply from Jediluke was equally nonchalant: "1 v 1 Chilly?" and "those who don't compete ...commentate".

Is this moving the community in a positive direction? Does he care at all about the community? Is this how a top player is going to treat the community that he represents?

This is literally night and day. In one community, I have players that are leaders, care about the community, and do everything they can to move the community forward. In another, I have players that are selfish, care about themselves, and do everything they can to try to get ahead.

You tell me which community I'm going to put more effort into.

Labels: , , , , , ,

Wednesday, October 11, 2023
The Final Stretch
Posted: 12:40:00 AM 0 comments
After much stalling on my part, the Overload Game Browser has finally migrated away from Windows over to Linux. This now makes 4 out of the 5 websites I wanted to move off the Windows box completed, leaving one last beast: the Overload Teams League.

This means I'm on the final stretch of a project that's gone on for almost two years now. It definitely feels like the light at the end of the tunnel. Now I just need to figure out what that light is.

The first thing I want to do after all this is done is give The Observatory its own website. I haven't updated anything having to do with it on this site in a long time, and the database I was using for it is massively out of date. In addition, I need to recreate the bot that was used for it so that the show runs much smoother. That will take time, however, and I'll be lucky to have it done by Season 35.

After that, who knows? I have a number of ideas on what comes after that, but haven't made any solid plans for anything yet. There's so many possibilities that I don't feel like I can even choose something until I finish up everything else I'm working on. I feel like I have an ocean of possibilities in front of me, but no clear direction to swim in. Yet!

In the meantime, a lot of other things are falling into place for me to resume a regular streaming schedule. More on that to come later, but I have a number of exciting projects in the works for the stream that I will be putting out there soon.

Labels: , , , ,

Sunday, November 27, 2022
A Two Tiered, Untiered OTL
Posted: 1:32:00 AM 0 comments
For those that don't follow the Overload Teams League, here are some examples of somewhat common scores: a close 96-93 game, a double-your-score 125-62 blowout, a comfortable 84-52 win, and a please PuDLeZ don't ever put 10 people into Indika again 283-252 throwdown.

And then there's this.

That's two-time OTL champion Invidia taking out winless Rogue Pilots by the score of 110 to 5. Ouch.

Here are the all time records that this game produced:

  • Highest Team KDA: 26.4
  • Fewest Team Deaths: 5
  • Highest Team Damage per Death: 2600.8
  • Highest Individual KDA: 84.0
  • Fewest Individual Deaths in 2v2: 1
  • Highest Individual Damage per Death: 8196.6

You may not understand these numbers, but rest assured, they are impossible numbers to get, especially given RP decided they're not playing anymore with their current roster until they can get some more pilots on their team.

Immediately, questions across the league were asked about why such a game should be counted. The answers are many, as are the arguments against. I sat on this for a couple days, thinking of a way to resolve this.

The obvious first solution is to divide the league into 2 tiers. Only count games when upper tier teams play upper tier teams and when lower tier teams play lower tier teams. On the surface, this sounds like a great idea until you realize there are only 11 teams, plus Rogue Pilots, which means that if we did this, we would essentially be dividing the league into two tiny tiers. Then you'd have to worry about league promotion/demotion tournaments and all kinds of other unpleasantries that an 11 team league simply does not have the patience for. This also has the drawback of disallowing play between lower tier teams and upper tier teams, at least from the formalized perspective. Sure, we could count "practice" games, but I am not made of enough time to track those practice games in this small of a league. I feel like the point at which I do something like this would be at 16 teams.

The second solution is to mark a team on a case-by-case basis as a practice squad. This would mean that the OTL is exclusive, and requires teams to prove themselves before they can start playing games that mean something. It would require manual intervention to get teams into the main league before they started playing games that count. That is not what the OTL is about. I am fine with teams that don't have skilled players trying to learn by playing against teams with skilled players. However, something has to be done about the current situation.

Putting everything together, I thought about what could work and what couldn't work. I don't want to exclude anyone, but I don't want to have the "NBA champions vs. bad high school basketball team" count for records. So, I came up with a system that allows those games to happen, but for the stats not to fully count.

The answer is an two tiered, untiered league.

It is untiered because a championship team can play a winless team, and have the game be meaningful on a league-wide level (provided the winless team decides to remain active). The standings page simply doesn't change. All teams are listed and rated accordingly.

What is two-tiered, however, shows up in individual stats. Going forward, individual stats are only displayed for games played vs. the upper league. That means when Rogue Pilots plays Invidia, Invidia is not playing for personal stats, only a team win. Rogue Pilots, however, do get to play for individual stats. That way, everyone's stats - from the top team to the bottom team - show their performance against only the upper league teams, and they can be reasonably compared. You can still see a pilot's stats against the entire league by going to their pilot page and selecting the appropriate option. However, everywhere else only shows stats vs. upper league teams.

This, of course, leads to the question of who is in the upper league and who is in the lower league. I thought about this, and again did not want to be exclusionary by saying only RP should be in the lower league. So, I have retroactively applied the following formula to determine who is upper and lower league:

  • The first eight teams in the league are automatically assigned upper league.
  • All new teams thereafter are assigned lower league.
  • At the conclusion of the season ending tournaments, the league is re-divided, with the six teams that make the knockout stage plus two other teams assigned to the upper league.
  • In seasons that have it, the two finalists of the season-ending Best of the Rest II tournament are the other two teams that make the upper league. In seasons that don't have it, the top two teams by the previous season's rating that did not make the knockout bracket make the upper league.

There are obvious caveats with this. First, one of the newest teams in the league, The Boys, are made of pilots that came from other upper league teams. They're pretty good, too, The Boys hold 3rd in the current season standings. Should they be lower league? The answer is yes. This is still a new team with a new dynamic that other teams need to become familiar with, so for a single season TB is considered lower league. Once they finish the Championships in the top 8 - and I have no doubt they will as half of their team was a large part of OMG's recent run of top 4 OTL finishes - they can be assigned to the upper league.

Second, if a team leaves the league mid-season, what should happen? One, that team loses the right to be upper tier, even if they return later that season. Two, there needs to be a way to fill the spot, and that will fall to 3rd place from the most recent Best of the Rest II tournament.

Third, if a team chooses to sit out of the Season Championships, what should happen? There are teams that aren't quite so competitive that they need to rank themselves in a season ending tournament. However, they may clearly be an upper tier team that just chooses not to play. So, if a team that sits out a tournament was upper tier in a previous season, I think the fairest solution is to play a separate series against the lowest upper tier team after the end of season tournaments are over, and the winner gets that spot.

There are probably other things that I'm not thinking of. It's probably not a perfect system, but to make sure that we're not excluding other teams and at the same time making sure we don't get ridiculous records (Yinut's 0 death game is also out of the record books after this update) that can't be beat under normal circumstances, this will do in a pinch.

There are two other minor changes that result from this update:

  • New teams are automatically set as not qualified to affect ratings (ie: ratings for games played against that team do not count) until they have played everyone 3 times. This is to ensure that teams that show up for half a season and then disband don't hit the ratings at all. Side note: I really need to come up with a term other than "not qualified".
  • Because it's a little more important now, the group stage will be returning to the Best of the Rest II tournament. The specific format of that will depend on how many teams play in it. A 3rd place match will only be played if it is necessary, ie: multiple upper tier teams disband at the end of the Championships.

There is also the ethical angle of the team that carried out that 110 to 5 victory. As of the beginning of the year, there is nothing to be gained for your team by getting 22 times the score of your opponent. It's no different than winning 110 to 109. Did the league's focus on stats make Invidia feel like creating a blowout like this was justified? I would like to think better of our pilots, but I can't discount that possibility either. I've also played in a game against RP where I got an outsized KDA, and all it made me want to do was never play them again, because it simply wasn't a challenge. If stats are a motivator for this kind of thing, I hope that by eliminating the source of motivation, games like these won't happen again, unless the lower team really wants the upper team to go hard.

This is a large update to the league structure. It seems like a lot is changing. But honestly it's a small update overall. I feel I owe it to the league to make sure that incidents such as the 110 to 5 game are just looked at as a footnote, rather than a lightning rod for drastic change. Ultimately, this isn't a drastic change, and it doesn't change the way the league operates on a day to day basis. Only individual stats are affected. The biggest controversy will probably be which team is in what tier, and if that's all that comes of this, this update will be a success.

Labels: ,

Saturday, August 13, 2022
Secretly, you wish you could've done what I did
Posted: 3:39:00 AM 0 comments
I mean, I'm not reading anyone's mind or anything like that. But judging from a lot of people's comments about That Bird Hell Site, you'd think that people would be dying to get away from it.

It's not that easy.



There's a reason it's called social media. It's social. It's your connection with a list of other users that you presumably have curated over a span of months or years. For some of those connections, it's your only connection to them. It also costs a lot of energy to make connections like these to begin with. So, it makes sense that people wouldn't want to start over elsewhere. In fact, I recall reading a couple people fearing that they were being abandoned by people who decided that enough was enough at Twitter.

A very fair conclusion to make, but not one that is without its flaws. Social media is a double edged sword. Sites like Twitter are designed to get you to engage the site as frequently as possible. How? Twitter has critical mass. Everyone you know is probably on Twitter or at least tried it, so you get comfortable with it because most of the people you know are there. They want you to stay on their site and browse around, so they try to learn about you and your friends through your posts, and then throw them all in an algorithm to try to make a few cents off an ad you might click on. Sure, Twitter has other ways to monetize, but the general rule is if a product is free, you - or more specifically your data - are the product.

To some people, this is just the absolute worst. However, I decided that I was generally okay with this as long as the product was useful and the people behind it weren't completely evil. Symbiotic relationships aren't necessarily bad relationships, after all.

When I "left" Facebook - "left" is in quotes because I still log in to and even use the account from time to time, much like I did during my Twitter down time - I made a conscious decision that I wasn't going to support what Facebook had become. When I first joined, it was fun to keep up with everyone. When I left, keeping up with everyone meant suffering through arguments, bad political takes, and opinions about things you didn't want to know. I saw the worst of people I cared for many times, and interactions on the site straight up ruined several relationships between friends. It was too much. The product ceased being useful, and I quit.

Earlier this year, I "left" Twitter - again "left" is in quotes because I still logged in, read everyone's posts every day, and even sometimes replied - I again made a conscious decision that I wasn't going to support what Twitter was about to become. My leaving was 100% about Elon Musk's planned purchase and privatization of Twitter. Why would something like this prompt me to leave?

Simple. The guy is an asshole.

Don't get me wrong, I'm no angel myself. I mean, just read this blog in its early years, or dig up some of my older posts on Trax in Space. However, someone with the money and influence that this man has who is consistently stooping to this level of dehumanization is downright dangerous. Sure, there are other billionaires out there with less than reputable personalities, but no one comes close to touching Musk right now. So if the top man at Twitter is going to be this kind of person - and this is not to mention anything about the recent political views he has taken - it will cease to maintain my loyalty.



Joining and using Mastodon regularly is simply me hedging my bets. Don't get me wrong, it's not perfect. Far from it, in fact. The main thing it's missing is critical mass - the people and organizations you know are very likely not on Mastodon. The other problem is it's hard to actually do any discovery on the site, although this might be good for some people whose main complaint about Twitter is that discovery leads to some bad mental health situations (ie: doomscrolling). However, consider this discovery is what draws a lot of people to Twitter, and is a contributing factor to its critical mass. A third problem is that its sharding is poorly done. You can only belong to one server, even if you have more than one interest, and it's not trivial to move servers if you decide you want to do so. I feel like with this being its cornerstone feature, it should've been more thought out and useful. But the good things are that it is actively moderated, it's easy to follow the posts of people you follow (even on other servers), there's no algorithm on your timeline to deal with, and you get 500 characters instead of 280.

I returned to Twitter once it was clear that the acquisition was not yet a done deal. No need to abandon ship if it's not sinking. Besides, I'm doing my part trying to keep it afloat. But like I said, there's social in social media, and that's the main draw. Remeber, that feeling of abandonment that people get by reading about people like me leaving is by design. I feel for people who are hooked like this, but it's not going to stop me from at least trying to do the responsible thing.

I'm hoping that if the worst happens and the deal is closed that I'll be able to formally pack up and leave for good without coming back, but if there's one thing I've learned from the last couple months?

It's not that easy.

Labels: , , ,

What have I done since roncli.com v2?
Posted: 2:13:00 AM 0 comments
Nothing.

That's it. That's the blog post.



OK, so that's not entirely true. Actually, a lot has happened since the end of 2021. Allow me to recap.

  • I needed a break from hardcore coding. I was going hard for about a year, and needed some time to do something else for a while. I still did some coding, but it wasn't for the big picture projects.
  • Return to work sprung back up. I now travel to the city two days a week for my job. I was not ready for the level of fatigue this would bring on those days.
  • I moved. My wife and I bought a house, and I now live in Pittsburg, California, pretty close to a BART station. It's gorgeous here, we have awesome views of the delta and surrounding hills. The house, however, is cursed.
  • My ability to keep up with everything waned for a while. Having to worry about house searching during the week and actually going to look at houses on the weekend while juggling about a half dozen other responsibilities. For those keeping track, I temporarily gave up maintaining olmod, running the Observatory, and streaming regularly.

While things with the new house have been pretty hectic - see aforementioned comment about the house being cursed - life has been pretty damn good otherwise. I still feel my top goal in terms of coding is to get off of the Windows VM, so I'm going to start picking things up again to move into that direction. But first thing's first.

I've been doing a lot of modernization of some older projects, and have been forcing myself to catch up on super old issues. I want to get the issues list for my personal projects down to zero (excepting FusionBot, read on for more on that) before moving the Overload game tracker to a Docker project. After that, the next real big task is going to be combining the OTL and the Azure server manager into one project, and then moving it to a Docker project. The last big project is giving The Observatory its own website and reinstituting the bot so I don't have to directly deal with Borjarnon making a mockery of the event. (I still love you, Borj.)

After that? I don't think I can commit to anything after that other than shutting down the Windows VM once and for all. I have a lot of ideas as to what I want to do next, but getting to that point is going to take dedication... the same level of dedication I gave last year to my coding projects. It's not unreasonable for me to finish all these things within a year, but I also know how easy it is to burn out, so I'm taking it carefully and giving myself time to do other things that I enjoy. I believe that taking things one step at a time while leaving room for other things will help prevent the burnout I experienced at the release of roncli.com.

Labels: , , , ,

Friday, December 17, 2021
It's Done. It's Finally Done.
Posted: 1:52:00 AM 0 comments
I give to you the complete. The informative. The functional. roncli.com version 2.0.

While it's been out here in beta for the last couple weeks, I formally released version 2.0 on GitHub earlier this evening, shipped it out to its new home in Azure, finished up all the remaining content changes I needed to make, and popped off.

OK, so the celebration was more subdued than that, but I tell you, this has been a journey. I've done so many things that are new, I don't even know where to begin.

roncli.com is the product of nine Docker containers. All of these containers run simultaneously on the same server to get the website to function.

  • Certbot - For keeping the SSL certs up to date.
  • Logger - A node.js application that logs Docker output to Azure Application Insights.
  • Nginx - This web server acts as a reverse proxy for the applications on the server.
  • Redis - Caching for the main website.
  • MongoDB - The main data store for the website.
  • MariaDB - The data store for the photo albums.
  • PhotoPrism - The photo album service that stores over 3,000 pictures used on the website.
  • ronc.li - The redirection service for roncli.com.
  • roncli.com - The main website.


roncli.com uses a whole bunch of tools to make it tick, including some mainstays like express. I also have written my own, including something called Hot Router, an express router that lets me create classes that are picked up by the router to determine what page to load when a certain URL is hit. It connects to a whole bunch of third party services for things such as my blog, my music releases, my coding projects, my gaming stats, and more. And, it has a super cool résumé page that I'd been wanting to do for a long time.

Being finished with this site doesn't mean it's time to stop, though. Next, I'll be doing a release of olmod for the Overload folks, doing some long overdue updates to the Overload Tracker and the OTL, and then it's on to moving all the Overload projects off of the Windows server and retiring it, finally.

There's still a long way to go, but I feel roncli.com was the biggest project that hadn't been moved yet. It was a complete rewrite from the ground up, which the tracker and the OTL will not be. Hopefully I can complete everything I want to do within the next few months and free myself up to do some stuff other than websites for once.

We'll see how that goes in the coming months, but until then, enjoy the new roncli.com!

Labels: , , , ,

Saturday, October 09, 2021
The Big Picture is Starting to Wear on Me
Posted: 10:59:00 PM 0 comments
Eight months ago, I wrote on The Big Picture, a summary of my initiative to get off of my Azure Windows VM and on to Linux VMs running Docker containers with Node.js websites backed by MongoDB databases. It's a meta-project of sorts, and it has taken a certain mental discipline to keep at it.

The Trax in Space 1 archive was easy to port, and since porting it I've learned that I didn't need to restrict downloads so much on it, so I increased the download limit. Six Gaming was full of challenges, and even today I find things I have to change with it because I didn't do it right the first time. I'm currently working on rebuilding this site and have been for several months now, and I'm itching to get back to the Overload-related projects, and to move on from this whole thing.

I said this back in February:

This is, of course, a multi-part project that has taken on a life of its own in recent months, and it's one I am enjoying greatly so far. It's really expanded the boundaries by which I am able to operate websites and related online services.

Boy, that's an awful lot of enthusiasm. Sigh. We were so young back then.

Since then I've worked through major bugs, tackled big architectural design questions, learned a hell of a lot about MongoDb... and have bored myself to death with this project.

Look, it's not like I knew this was going to be a huge project. Just the opposite, I knew what I was getting into. I remember how long it took me to complete roncli.com the first time, and I'm still looking at coming in at well under a fifth of the time it took me to complete it the first time around. I've learned a lot in 7 years, and it's showing with how fast I'm getting stuff done. But when I take a look at the big picture, it just seems so... slow.

I am to the point I want to work on something else. I want to update the OTL for season 7 and beyond. I want to add some amazingly cool things to olmod. I want to make games of my own. And, I want to get back to regular streaming again.

But every time I sit down to code, I am reminded of the plot: get off that monolithic Windows VM, and you'll have the freedom to do what you want and when you want when this is all done. So I go heads down, jam my EDM playlist, and spit out another couple of files on whatever I'm working on, making a bit of meaningful progress until I get bored and go for a walk, play some games, or write a blog post.

I'm sure a lot of this stems from the fact that I've been essentially stuck at home for 19 months. I'm bored to death with that, too. No train rides to The City, and very few outings outside of the usual Friday routine of dinner and groceries. While 2021 has been infinitely better than 2020 when I didn't get out at all, I can't shake the feeling this year that I'm accomplishing very little.

Of course, my GitHub contribution graph will tell you otherwise, and when I look at things logically, I know I'm getting stuff done. I just wish I could fast forward to the end of the big picture so I can move on to the next big thing... perhaps something a bit more exciting.

Labels: , , , , ,

Sunday, August 29, 2021
A Low Bang to Buck Ratio
Posted: 2:08:00 AM 0 comments
The story behind Six Gaming is long, complex, and probably can't be covered in a single post. If I were to sum up what Six Gaming is today, the answer would be "probably should be dead, but stubbornly isn't". I knew this going into redesigning the Six Gaming website, yet I did it anyway. Why?

There's a number of personal reasons involved. My outside hope that some day everyone stops being super busy with life and commits to a podcast again, which is what the original community was built around after our WoW guild died. The only reason I decided to stop streaming it is because no one could commit to the schedule except for me. The website also has a Discord and Twitch bot that promotes streamers, hosting them on our Twitch page, which would be a great tool if the community was still active. However, it's not active, so the main reason I used to justify upgrading Six Gaming? Knowledge building.

Six Gaming is the first website that I've built that runs with a MongoDB back end. It's the second site I've built that uses Docker containers. It's also the second site I've built on my current generation of node.js website architecture, but the first time I've done it within Docker. The website uses Discord.js, Express, FullCalendar, the node.js wrapper for IGDB, the node.js wrapper for MongoDB, and the Twitch.js library that is being rebranded as the ridiculously-named Twurple. However, when I talk about my website architecture, I don't mean the libraries I'm using, but rather the way the website is put together.

I drew some inspiration from the now-defunct Rendr library. It was a node.js library that worked with Backbone.js to let you code a web site just once to render web pages on both the client and server side, making it easy to create single page applications. I was turned on to this library while working for the startup Sift back in 2013, and ultimately used it for my personal site roncli.com. Of course, as soon as I released that site, Rendr stopped getting updated, so I stopped using Rendr and started rolling my own.

The first website I used this new architecture with was the Overload Teams League. I didn't go too far with it, only making it so that there are views that can be rendered either client or server side. I didn't go as far as making it a single page application, that wouldn't come until version 2.0 of roncli.com. The back end architecture is your run of the mill MVC application, nothing too exciting going on. What made everything tick, however, was a custom-built router that I would eventually release to NPM called Hot Router. It's called that, because it has an option that lets you hot-swap controller files while the site is live while the application is running. That was super useful for debugging the first few sites created with it, but the hot swapping has become less useful now that I've gotten better at using Docker.

All of the above is setup for one of the more amusing issues I encountered while working on Six Gaming's website, and there were plenty. Being only my second Docker project, I won't talk about what I can only describe as "newbie mistakes". However, the biggest thing I found was what I term the memory leak from hell.

I discovered it when I was working on the Hot Router project. The gist of the problem is that for weeks after the launch of six.gg, I had a very slow memory leak that would break down the server after about a week. It drove me insane that I couldn't find it. The lengths I went to in order to find the leak were insane. First, I wrote my own calls to the docker.sock API, logging the metrics to Application Insights. That alone instantly doubled the cost of the server while I had the metrics active. The price you pay.

This led me to learn the memory leak was happening in the node.js Docker container. In order to find the memory leak, I had to connect the node.js instance inside Docker to Google Chrome's dev tools. Once I did that, I spent hours pouring over memory logs, slowly narrowing the problem to my shiny new router. Did making the router a module cause the memory leak? Did I screw something up porting the code over from being inline in the project to its own module?

No, the memory leak was there all along. I tried comparing Date objects to see if they were different. While you can compare to see if they are greater than or less than each other, trying to compare that they are equal or not equal actually doesn't work. This was causing Hot Router to always treat the controllers as if they were just hot swapped. It would delete the cache of the controller and re-require it. As it turns out, the act of deleting the cache and re-requiring it caused the memory leak. That, combined with the date comparison bug, resulted in a slow memory leak.

As I was fixing that bug, it dawned on me. I run the Overload Game Tracker, and that site had been suffering from a memory leak for over a year. It runs an early version of the routing code that Hot Router uses. Turns out I solved a very old memory leak by finding the leak in an entirely different application.

Anyway, Six Gaming's website has been humming along for a while. It was a lot of effort for not a lot of reward. However, this project taught me a ton about Docker, MongoDB, and more. And everything I learned from this is going into my most ambitious project yet... my own website! More on that in a future post.

Labels: , , , ,

win-acme
Posted: 2:05:00 AM 0 comments
Here's a great piece of free software for IIS administrators who want to easily manage their SSL certificates from Let's Encrypt.

win-acme is a self-guided command line utility that allows you to quickly and easily take an IIS website and get an SSL certificate on it. After struggling with utilities like ACMESharpCore, ZeroSSL's Crypt-LE, and Posh-ACME, I realized that all of these tools, while powerful, didn't have any ease of use whatsoever. When I first looked at the text interface for win-acme, I didn't think it was going to be as easy as selecting options from a menu.

It's as easy as selecting optinos from a menu.

Within 5 minutes, I had 7 websites with shiny new SSL certs, and I had gotten them scheduled them for a regular renewal. I didn't have to do any configuration or any PowerShell scripting, it just worked. Give it a try if you're running websites on IIS!

Labels: , , , ,

Thursday, March 25, 2021
Overload has truth; next it needs balance
Posted: 6:31:00 PM 0 comments
Overload multiplayer was put together in around a month, went through another month of testing, and ended up being rather underwhelming to play. Ranked multiplayer queues died out after the first couple weeks, those that remained were either gaming the system or late to the party. Mercifully, ranked multiplayer did not survive very long.

However, multiplayer soon began to thrive in the form of the Overload Teams League. I founded the OTL in 2019 for pilots who wanted to play team games. It caught on pretty quick with 6 teams by its second month. At first, we dealt with the frustrating limitations of poor server choices, shoddy networking, and always demanding to Bammer "RESTART YOUR SERVERS!!!". But shortly after Revival Productions folded in February of 2019, a glimmer of hope appeared in the form of olproxy, a piece of software that allowed Overload LAN servers to act as Internet servers. For the first time, Internet games were playable without official servers.

Over time, this expanded to olproxy being incorporated into olmod, a collection of mods for Overload with the aim to improve multiplayer game play. A large number of improvements have been included in olmod since then, including larger game sizes, reporting to a tracker, sniper packets, lag compensation, and more. What hasn't been addressed is weapon balance.

Multiplayer weapon balance has not been great since Overload launched. Ammo weapons have been shown to dominate, and the energy weapons are a mixed bag with cyclone being dominant and reflex being weak. Hunters used to be super strong until an early nerf was added to olmod. Creepers and time bombs used to be excessively out of sync between client and server. Despite this, people still played, but bigger issues existed because people couldn't understand what they were seeing. Ship positions were not consistent. People were saying that 50ms in Overload felt worse than 100ms in Descent 3. (While seemingly unbelievable, this was learned to be a true statement since Overload intentally adds a minimum of 83ms of lag to game play; 33ms for processing controls smoothly and 50ms to be able to interpolate ships smoothly.) Slowly over time, the net code was deciphered and unravelled, and we learned some shocking things about how the net code was implemented. In addition to the intentionally added lag, your entire controls are sent to the server every frame for processing server-side. Every button press, mouse movement, or swing of the joystick would be part of that send. But because client and server frames don't match up one to one, this would cause errors in position and rotation, and weapon firing that was often out of phase, meaning what you saw on your screen wasn't what was happening on the server.

First, we fixed the weapons. Sniper packets made it so that every time you fire something client-side, that is what was seen server-side. This also eliminated some super bad parts of the game, such as disagreements as to how many missiles you have, what weapon you're using, what side of the ship you're firing a missile out of, and more.

Second, we fixed most of the intentional lag and made it so that it would try to compensate for lag, predicting where ships will be in the future, making them easy to hit. Then we revisited weapons, also compensating them for lag so that they'd be easier to dodge.

I say "we" because this is a team of developers doing this. Arne de Brujin created olproxy and olmod and showed us what is possible. I've contributed a bunch of code, and Tobias, Whollycow, and derhass have been instrumental in keeping things on track. We even have occasional contributors like terminal, luponix, and D.Cent provide extra quality of life for both players and developers.

And now we're ready to tackle balance.

Players are now seeing the game closer to the truth than ever before, and as a result they have honed in their skills better than ever, showing us that, yeah, there are serious balance problems with the game. It's not like we didn't already know this. However, now that we are seeing closer to the truth, we can begin to understand exactly what these balance problems are, and hopefully start finding common ground in regards to what needs to be balanced.

Labels: , , ,