Yearly Archives: 2023

Goodnight MusicSrch

I’ve had MusicSrch for about seven years now.

Although it was an interesting curiosity, I never really figured out what to do with it, and it never managed to have more than a few dozen visits per month.

It was super helpful when writing music reviews because I could just dig up all the streaming links for a band with a quick search.

About a year ago I added a sort of “directory browse” feature, where it would save the data for a band, and keep track of some historical numbers, and let you browse by genre. That was kind of interesting, but not really useful, especially given the plethora of music sites out there in the world.

If I haven’t figured out what to do with the site in seven years, seven more won’t help.

So, goodnight, MusicSrch.

If you’d like to see the historical site, it’s been saved on the Wayback Machine over the years:

https://web.archive.org/web/20230000000000*/musicsrch.com

A New Save System – Easy Save To The Rescue

With Into The Inferno development, I reached the point where it was time to get a better save-game system than the existing hacked-together-in-an-hour XML file. It had been on my to-do list for a while as part of evolving past the “you get one save slot, and that’s it” stage.

I have a ton of experience with C#, so throwing something in an XML file is second nature. That’s not necessarily a good or bad thing, but some of the legacy bits are strongly disrecommended by Microsoft at this point (BinaryFormatter for example).

I decided to “do what everyone else does” and get a copy of Easy Save from the Unity Asset Store. It’s immensely popular and highly recommended and it seemed like it’d be the shortest time-to-implement of the available options.

Fast-forward 8 hours later. I have a working save system with three save slots and it’s better in every way than the previous system. I was able to re-use a lot of my existing data code, rewrote some of it to be cleaner, and have “summaries” that are saved as part of the game saves that say where and who the party was at the time of save, and the interface changes necessary to support all of this.

Before:

Into The Inferno Main Menu Load Game - Before

Loading From the Main Menu – Before

Into The Inferno Save Game - Before

Saving At The Inn – Before\

As you can see, there’s just “Load Game” but you have no idea what you’re loading. Similarly, saving the game is just “Save Game” with nothing beyond that.

After implementing Easy Save, this is what I have:

Loading From the Main Menu - After

Loading From the Main Menu – After

Into The Inferno Save Game - After

Saving At The Inn – After

The first screenshot shows what comes up after you click “Load Game” on the menu. The summary text is localized in realtime, so in Spanish you’ll see that Archie is a “nivel 1 guerrero” even if you saved the game in English.

The second screenshot is saving the game from the inn. Saves at this point are an intentionally-limited resource (for better or worse), but at least now you have more control over them, and it’s easy to customize the number of slots that there are.

In the future I’d like to add Steam cloud save synchronization, but I have no idea how tough that will be. In any case, Easy Save made what I thought was a 40-hour task into a single day project, testing and UI changes included, and I definitely recommend it.

Into The Inferno Demo Now Available on Steam!

I’ve posted a demo version of Into The Inferno on Steam. It includes roughly half of the game — the main town, the three wilderness areas, the orc village, goblin village, gnoll village, and the first of eight dungeon levels.

Into The Inferno - Main Town

Into The Inferno – Main Town

There’s still a lot more work to do between now and the October launch, but it’s mostly cosmetic and translation work and the gameplay itself isn’t going to change much.

If you’d like to offer suggestions or feedback, you can hit the F12 key from within the demo to send comments.

Beast Dungeon Nearing Completion

In the last week and a half I’ve put a lot of work into Beast Dungeon.

What’s been added? More dungeon variety, more monsters, more items, UI improvements, adding the endgame, adding a high score list, adding tracking of monsters killed, and adding localization in Spanish.

Beast Dungeon Kill Screen

The new kill tracker in Beast Dungeon.

At this point, it just needs a bit more translation and few audio tracks and it’s done. I anticipate it being completed within the next week. Wishlist it on Steam, it’s releasing soon!

YouTube is a Risky Platform

If you’re building your audience or business primarily on YouTube you should probably think again, or at least have a backup plan.

Google can and will destroy all of your work at a whim, or with a bad bot decision, and there’s nothing you can do about it. You have no recourse, and there is no “manager” you can talk to.

In my case, I had been posting logs of my journey starting a game development studio. It started with a few videos detailing my goals and my process of learning the Unity game development framework, then with demos of the process of building my first-person dungeon crawler game Into The Inferno. It was totally normal stuff, just like hundreds of other channels are doing or have done. This approach is a time-tested way of telling your story, building an engaged audience, connecting with the world, and having more success than you would have without telling your story. This is the sort of thing YouTube was designed for in the first place. Or so I thought.

Just shy of two weeks ago I woke up to an email saying that YouTube had deleted my channel for “spam, deceptive practices, or scams”.

This was a pretty big surprise. There was no warning, no strikes, and no indication what, exactly the problem was. They didn’t indicate that there was something wrong with a particular video, so I really had no idea why my channel was deleted. There was nothing deceptive. If anything, I might have been too honest, bordering on oversharing. There was certainly no scam. I wasn’t trying to get people to do anything, or asking for money, or selling anything (yet). My game wasn’t even ready to wishlist on Steam.

I only have two guesses, and they’re vague ones. Maybe they decided that posting mostly videos on the same topic (my video game development) was spam, even though all the videos had different focus and were in different stages of the game’s progress. Or, since my account was nuked right after I uploaded a video describing how I had implemented in-game shops where you could buy equipment, recharge your mana, or heal your characters with the gold you get from killing monsters, maybe that was it, MAYBE they thought I was talking about some sort of real-money transaction thing. That’d be a stretch – since shops are just a standard mechanic that thousands of games have, and I wouldn’t ever consider adding real-money transactions to a game because that’s dirty, disgusting, slimy, and wrong. People who put real-money transactions in games should be ashamed. Look for the “Log 15” video on this blog if want to review that one and venture a guess.

Assuming it was just an algorithm glitch — after all, Google is not very good at algorithms, and they often make very dumb assumptions (I speak from experience since I’ve had quite a few websites over the last 20 or so years) — I sent in an appeal. The auto-responder said that they’d reply within 2 days.

Now, 12 days later, I have received a response.

“Hi Dragon Dropper,

We have reviewed your appeal for the following:

Channel: Dragon Dropper

We reviewed your channel carefully, and have confirmed that it violates our spam, deceptive practices and scams policy. We know this is probably disappointing news, but it’s our job to make sure that YouTube is a safe place for all.

How this affects your channel

We won’t be putting your channel back up on YouTube.

Thanks,
The YouTube team”

Again, still no indication of what the problem is. Whatever it was, I was definitely making YouTube an unsafe place.

They did NOT delete any of my other YouTube channels associated with the same email, some of which are more than 10 years old (my band channel, my vintage synthesizer demo channel, and some various other music channels). They certainly did delete any motivation I have to maintain or grow any of those channels.

I’ve switched all of my video hosting to Vimeo and re-uploaded all of my videos. They’re visible here on this blog at xangis.com or you can see my channel on Vimeo here. The first 15 log entries were hosted on YouTube. If you want to watch them and figure out why they might have insta-banned me, be my guess. I’m out of ideas.

I’ll miss those ~10 subscribers, and the extra organic visitors that YouTube brings, but at least with Vimeo I won’t have to worry about some random bot arbitrarily declaring that I am a scam because you can give in-game gold to a healer to have your injuries repaired in one of my games.

Take caution, a random deletion could happen to anyone, including you, and there will be nothing you can do about it.

Am I John Connor?

Do you ever feel like John Connor or is it just me?

It feels like lately any time there’s something that I do that involves an algorithm making a decision, the algorithm goes against me. Whether that’s posting a video (separate rant entirely!), or posting a comment, or placing an advertisement, or writing an article, the bots always seem to come up with something.

It’s never because there’s a reason. The excuse produced by the algorithm is always invalid and not applicable. But I probably used the wrong keyword, or had the wrong IP address, or exhibited “bot-like behavior” because I type so ridiculously fast (40 years of typing experience), or because my vocabulary is too large, or any of a thousand things that makes me not appear to 100% adhere to the “average, standard Human” that algorithms expect.

I am not good at bullshitting. I’m annoyingly honest, because making stuff up is EXHAUSTING and I just don’t have the patience for it. My style is to tell you what’s up, give a (hopefully concise) explanation, and get on with my day or whatever I was creating. So, the idea that a bot would flag me for “deceptive statements” or “misleading links” is doubly offensive. First, your bot is stupid. Second, that’s not something I’d even try to do.

Google/YouTube, Facebook, and every other platform: Fix your half-assed algorithms. You’re making the world a worse place with them. Stop being evil.

I expect that this problem will only get worse as the internet becomes mostly just robots lying about things. Before “AI”, this was already tough. Now it’s probably going to become impossible. It’s hard enough to get a tech support Human now. As companies hand over more and more of their business to algorithms, Human support is pretty much going to disappear.

The thought that I might be the one to defeat the AI apocalypse gives me a lot of hope for the future.

Wishlist Into The Inferno on Steam Today!

Into The Inferno is a retro-style grid-based first-person dungeon crawler RPG. Battle monsters and increase your skills in order to rescue a group of children from a horde of demons.

Battling snakes in Into The Inferno.

Battling snakes in Into The Inferno.

I’ve had a lot of fun working on this game, and it’s something I’ve been dreaming of for years. I must admit I really enjoy playing it, and now it’s in the “polishing and tuning” stage with an expected release in early fall.

Walking through town in Into The Inferno.

Walking through town in Into The Inferno.

Wishlist it on Steam today!

Disabling Automatic Closing Braces in Visual Studio Code

I really like Visual Studio Code as an editor, but it has some annoying defaults.

When working in C# (and a lot of other languages), it tries to be “helpful” by automatically adding closing braces, brackets, and parentheses when you type the opening ones.

An Automatic Closing Brace

Automatic closing brace added when typing an opening brace.

For some people, this is great. For me, no. It just doesn’t work with my typing and coding style, and ends up being something that gets in the way and I have to move or remove later.

Fortunately it’s easy to turn this off.

Go to File –> Preferences –> Settings

Search for “auto closing brackets”.

Change “Editor: Auto Closing Brackets” to “never”.

Auto Closing Brackets Setting

Turning off the auto closing brackets setting.

Problem solved. Happy coding!

Seasonal Website Advertising Income Differences (Monthly RPM Changes)

I’ve been running advertising-supported websites for about 15 years now, primarily music-related.

I typically notice a decline in income at the beginning of the year, and a spike in income toward the end of the year. My audience is international, but the majority of visitors are from the USA and to a lesser extent other English-speaking countries.

I gathered up the data on my historical earnings for the last three years and charted how much income changes throughout the year on average. Using January as a baseline, this is how things change throughout the year:

Month Earnings vs. January Pageviews vs. January
January 0% 0%
February -2.2% -9.9%
March -2.0% -3%
April -6.1% +6.6%
May -15.0% -0.4%
June -18.0% -15.7%
July -16.1% -17.0%
August -6.8% -21.0%
September -4.4% -38.6%
October +2.5% -8.0%
November +16.3% -4.1%
December +26.6% -3.2%

What’s clear and obvious is that income is heavily impacted by the holiday season.

Something else that I didn’t realize is how much both traffic and earnings drop during the North American summer and early fall. I think this a sort of “go out and play” influence — I tend to get less traffic on days when people are out with friends in the evening or otherwise on vacation. People tend to spend less time working on music and looking for tools to make that music when they’re out playing music in clubs or at parties.

That’s my theory, at least.

Of course, this is a sample size of one person (across two sites) over three years, so there will be a significant margin of error. Nevertheless, I still find it interesting.

Coming Full Circle With Game Development (Unity)

The very first programming I ever did was game programming.

It started with my Commodore VIC-20 in 1984. The computer’s manual had some BASIC programs you could type in and run. One was a Space-Invaders-type game.

Well, naturally, after typing in this game and playing it for a bit, I wanted to start making changes to enemy colors, speed, and score values. This was how I started programming.

It continued when I got a Tandy 1000 EX that ran MS-DOS and started writing games in GW-BASIC. By now I was coding much more detailed and complex programs. They were still text-only (ASCII), but I was creating them from scratch, and they had much more detailed mechanics.

I remember well a text-based gladiator combat tournament game that I spent the better part of a year working on, at about age 10, in addition to a few text-based adventure games.

Later, as the Internet started to grow, I became interested in multi-user dungeons. There were various codebases — Diku, Merc, Envy, Circle, and others. Not only did I work on some existing games, I also created my own, starting with Illustrium Arcana, and later with the Basternae  rewrite, Basternae 3: Phoenix Rising. If you look at the “Basternae and ModernMUD” topic on this blog, you’ll see that I was working on them well into 2013.

When I was finishing my college degree in 2004, I took some classes for credit at The Game Institute and got a job with a company working on simulators for the US Army (among other government contracts). It was basically a video game company, but replace “fun” with “realism”. I didn’t really work on any graphics code, and ended up specializing in audio and network communications. This was the first and last job I had in video games.

My strong knowledge of audio programming and networking protocols took me on to develop parts of the Authentic8 SILO browser, work on a home automation system, and build the various audio applications I released as Zeta Centauri.

Now I’m returning to my roots and learning Unity. It’s incredibly intuitive, and the programming is easy and natural thanks to the many years I spent writing C# code.

I’ve started with the “Complete C# Unity Game Developer 2D” course available through Udemy. I’m about 50% of the way through, and the deep, thorough coverage coupled with real hands-on coding projects has been great for the learning process. I’m definitely going to take more of the Gamedev.tv courses because they really know how to teach.

The Job Interview

(This is an old joke I remember from childhood.)

A guy was in a job interview, answering every question correctly and showing an impressive level of knowledge and skill. After nearly an hour of tough questions, the interviewer said, “You seem like a great fit, but I see there was a 7 year gap since your last job. What happened there?”

Guy: “Oh, I went to Yale”.

Employer: “Oh great! Well, you’re hired, and you start Monday. What did you say your name was again?”

Guy: “Yim Yohnson.”

The 80/20 Rule Is Going To Ruin Your Life

I’ve touched on this before, but it bears elaboration.

With the rise of AI, which most people call “Artificial Intelligence” but I call “Artificial Ignorance”, you are absolutely going to have problems if you are not normal, or are in the minority in any particular situation.

This is because AI systems use large databases to generate “rules” or guidelines about the world. Because they’re based on math and averages, there will always be a margin of error.

Let’s go with some fake statistics that I made up for the sake of this post.

  • 88% of people in Michigan like vanilla ice cream.
  • 91% of people in Michigan follow professional hockey.
  • 78% of people in Michigan own a pair of skis.

Well, if you don’t like vanilla ice cream, don’t follow hockey, and don’t own skis, it might be pretty safe to assume you’re not from Michigan. After all, only 0.2% of people in Michigan fail to meet one of these criteria, so it’s safe to assume everyone else is a faker.

When these 80/20-rule-type things start making decisions about your life, you are absolutely going to run into problems. Why?

  • Nobody is completely, entirely, 100% normal. Everyone is unique in their own little way. You will inevitably be in a situation where you don’t match the math that the computer has decided is correct.
  • As Google has shown, companies can get away with having almost exactly zero support for their products, so there will probably not be a Human you can talk to to solve your problem.
  • If there ARE Humans available for support, they probably won’t have the power to fix your problem, or will be overwhelmed with the 20,000 other people (0.2% of the population of Michigan) who have been miscategorized and need to have their issues fixed.

The AI apocalypse will not be robots shooting Humans. It will be dumb computers denying us food and housing because we don’t match their badly-calculated templates.

Google Is Not Very Smart (or Incredibly Smart)

To the layperson, Google might seem like the smartest company in the world.

Once you understand technology, it’s obvious that they’re not very smart. Or incredible geniuses.

If you’ve spent more than a few years building websites, you know very well the types of ignorant robot-stupid mistakes that Google can make. An example from this very blog is that I spent quite a few years working on multi-user dungeons (MUDs for short). There are a lot of posts on the subject, and Google’s ad system thinks that one of the main topics of this blog is digging holes in wet soil, and it’s not uncommon to see an ad for such machines on this site.

Google is PHENOMENALLY good at miscategorizing things. If there are two meanings to a phrase or topic, and 80% of the discussions in the world focus on the more popular meaning and 20% are about the less-popular meaning, the less-popular topic will be buried in the noise, because the systems will assume you mean “computer keyboards” when you meant “music keyboards”.

When you combine this with what I call “computational laziness”, this means that if your site happens to be categorized in a certain manner, you’re basically stuck there. Google doesn’t put much effort into revising its categorization models or re-analyzing sites based on new information.

What does that mean for web developers? Well, for a newer site, if Google puts you in a place you don’t want to be, you’re probably better off starting over from a different angle.

For people searching the web, it’s a little more complicated. Google is NOT designed to be the best search engine on the planet. Now that the search engine wars are over, the design has changed to focus on revenue maximization. What does that mean?

It means that Google as a search engine is designed to show you just-barely-adequate results that kind-of-but-not-really satisfy the question you were asking. It’s designed to be mostly-accurate but slightly frustrating, so that you are tempted to click on ads that seem likely to answer your question.

In a perfect world, a search engine would give you exactly the information you were looking for, as quickly and as accurately as possible. In THIS world, search engines are designed to give you the plausibly-relevant information that will benefit the search engine the most.

In a world where the profit motive rules over everything, product quality must necessarily suffer for the purpose of maximizing margins.

As something used by most of the people in the world pretty much daily, when does it make sense for search to become a public utility? It’s an interesting question worth pondering, but the mathematics and economics are far too complicated for a sound-bite answer.

The number of websites in existence has been relatively flat since 2017, not growing any faster than the world’s population, but processing power has effectively tripled. If Moore’s Law was still in effect, it should have grown 16x, but that ship has sailed. What this means is that, even though sites today have many more pages and much more data on average than six year ago, the ability to organize that information has grown faster than the actual quantity of information.

Google is not special. They’re just another business. And, with their original core patents being expired or expiring soon, there’s a lot of room to build something of higher quality with lower cost. Given the level of mind-share that they have (as any good look at Bing’s market share will confirm), is it worth it to build a competitor?

It depends.

Blocking Twitter and Other Nuisance Sites with BlockSite

It’s very common for news articles to contain links to Twitter. Some lazy writers even create articles that are nothing but a page of Twitter embeds.

I think Twitter is trash and never want to visit the site, and sometimes it’s not obvious that a link ends up on Twitter, especially with the widespread use of URL shorteners on the web.

I found a quick solution that works well via a plugin called BlockSite. I use both Firefox and Chrome, and it’s available for both.

BlockSite for Chrome

BlockSite for Firefox

There’s a lot more to it than just blocking garbage sites like Twitter, including things like setting up distraction-free hours to block social media during your workday, so check out their website for more info.

Here’s an example of the plugin preventing a visit:

BlockSite Plugin Preventing Twitter Access

BlockSite Plugin Preventing Twitter Access

PostgreSQL Command History

The command-line PostgreSQL database client keeps a command history.

Much like on a Linux console, you can use the up arrow to scroll back through previous commands. This can be handy if you want to repeat a command, or to change a parameter on a long query.

One other thing that is less widely-known is that you can view the ENTIRE history by typing “\s”. Backslash-s will function pretty much the same as the Linux “history” command, and can give you multiple pages of commands.

Much like the history of the Bash shell, the Postgres command history is stored in your home directory in the hidden file .psql_history. Although this is handy, it can also be a security risk to keep old commands where prying eyes can find them. You can easily delete this file, or clear it using the command:

 truncate -s 0 .psql_history

I like the truncate command because it’s a nice, clean, one-step way to clear a file without deleting it.