May/June 2021 – Month(s) in Review

We’re now half way through 2021. This has been a weird one. With this milestone, it does have me thinking about how I can plan out my time better to make the most out of this second half.

I’ve been keeping busy these last couple months, there is actually a lot I would like to share, but it’s all over the place. So I’ll split up those topics through July (hopefully I make good on this).

In my free time, there’s been a lot of Diablo play (I and III), and researching/learning some new technical concepts. I’ve been checking out Apollo GraphQL for API considerations. I’ve also been spending some time getting familiar with Ansible for server configuration.

Diablo III – Season 23

Season 23 began for Diablo 3 and I’ve been playing through it on PC and Switch. This is actually the first season I’ve played on PC in a while, I really like playing on the Switch because it’s portable.

I decided this time around I wanted to complete the season as a whole, and I was able to accomplish that on PC. I’m pretty close on Switch

I discovered some helpful resources to figure out good builds. Icy Veins has a section for Diablo 3 and there’s also Maxroll (I really like their UI). I’ve also been catching info from the Rhykker YouTube channel.

I started with a Wizard meteor build on Switch, unfortunately that build is retired. I didn’t know that until later (I’ve moved over to Firebird Mirror Image). Spectral blade is one of my favorite skills ❤.

On PC, I went with a whirlwind-rend Barbarian and then leveled up an Akkhan Bombardment Crusader (I preferred their shield bash/glare kit, but bombardment was hands down more DPS).

I also rolled some hardcore characters. My Demon Hunter is still alive, but I’ve started a second character in case they keel over. The hardcore experience is fun.

April 2021 – Month in Review

The Jamstack

This month I’ve been checking out TravisCI and Netlify. I was able to get my portfolio app and Spotify app (pet projects) deployed to Netlify.

TravisCI is a continuous integration service. It will build an web application and run tests. This helps confirm there have been no changes that break the software.

Netlify is hosting service, more specifically Jamstack websites and serverless functions.

Both Netlify and TravisCI have been free to try. Their limits for the free tier have been more then enough for me to deploy a couple of my projects and push up updates. They also fit into the Github ecosystem very well.

The life cycle from development to deployment looks like this:
Push changes to Github → TravisCI builds app and runs tests → Netlify pulls new code and deploys

Stay Awhile and Listen

Go is a language that has always perked my interest a bit. I was watching a developer on Twitch working on with feature flags, and after looking into Go a little saw that it’s use is still growing. So I decided to finally try it out.

Go feels unique to me, in that a lot of how its used/coded is very opinionated. You have the freedom to do whatever you want of course, but there is a “Go way” of developing programs and mods. For example, it’s common to have all Go projects live under a single Go workspace.

I built a simple app that displays the Diablo III ladder rankings for any of the ladders this season. (Github Source)

Music Pick

Lately I’ve been listening to a lot of Call of the Wild, a weekly music show that has a mix of different electronic music. Episode 341 features Koven’s new album. Here’s a particular song I really like.

Link Picks

Casidoo – Make Jest Faster (Casidoo’s Newsletter)
C# learning this month (dot.net/videos)

Resting Up

Mid-September marks the end of a peak to work related activities. We hold an annual conference for our users. There’s usually multiple projects that have to be launched right before or the day of the event.

The first week of November is when BlizzCon is usually held, which makes August – November a pretty busy time of the year.

With COVID still here and a danger, there is no BlizzCon this year, which is a bummer. I enjoy being around the community and developers while learning what Blizzard has in the works. I really enjoy the excitement from both fans and developers.

So with no big events coming up and stuff at work settling down, I will have some energy to put towards other things.

Some Downtime

I’ve been recovering from the September conference rush. It was less stressful than previous years, but still took a lot out of me.

I haven’t been feeling like doing much creative-wise, which is unfortunate. Right before the conference I was gathering information about other content creators in software engineering that produce content. I’m hoping to make some progress with content creation soon.

Some Games

I have been catching up on a lot of games, many are titles I’ve been meaning to play for a while.

  • Amnesia: The Dark Descent
  • Hellblade: Senua’s Sacrifice
  • Assassin’s Creed I & II
  • Borderlands I & II
  • Tomb Raider
  • Bendy and the Ink Machine

Each of these were really good. Hellblade in particular was a very immersive experience, and I loved the puzzles and combat.

I’m currently working through Borderlands: The Pre-Sequel and playing Phasmophobia with friends.

Bendy and the Ink Machine

I played through Bendy and the Ink Machine this month. This is a nice indie game with a retro aesthetic.

I will be covering some spoilers here, so don’t read on if you don’t want anything spoiled.

Gameplay

For me, gameplay over all was fun and entertaining. There was a combination of puzzles, action fighting, and scary-monster hiding.

Henry, the character you play, loses his weapon often. So gameplay transitions between puzzle solving, stealth, and fighting. I think this kept game play fresh and enemies interesting.

With that said, there were some moments that didn’t feel so good.

I played on the Switch, which was mostly fine, but there were some moments that it felt like mouse and keyboard were more appropriate. In particular, the corrupt Boris fight was hard because I couldn’t grab the ink globs fast enough and the second phase of the fight where Boris leap-attacks you if you are too far away was pretty unforgiving.

The last chapter, The Last Reel, was rough and in some ways disappointing to me.

Coming from the Boris fight, the experience was taking a bad turn because the gameplay didn’t feel fair. More specifically, the Switch controls didn’t seem to be working for me. (I’m primarily a PC gamer, so maybe that explains a bit too)

Clearing blobs from the wheel of the paddlewheel was a neat mechanic, but unforgiving if you don’t work quickly. Again, with the Switch controls, this was rough. If I spent too much time trying to aim for the control that makes the paddlewheel move forward, I would die.

After the paddlewheel, the onslaught of searchers, lost ones, and Sammy were a bit frustrating because it was too easy to die. I was unable to attack without getting hit. It’s possible my timing was just bad, but I think I was probably suppose to attack, turn around, and run away before the enemy attacked, which was too much on the Switch.

After this, there was the administration offices. I had to dodge the Butcher gang while retrieving blobs to create three pipes. This was a simple stealth sequence. I was tempted to cheese it by just running through the level, but instead I took my time to properly avoid the baddies.

Youtube Creator Research

I want to share some of the content creators I’ve come across while exploring what content and personalities are out there for web development.

Since I’m planning on generating content myself, I thought it was important to see what common practices and structure is out there.

KimComplete

KimComplete has some videos that cover their own experience in web development, as well as what worked for them and answers important questions that someone new to the industry will want to know.

Reading from the comments of this video, I think it’s really cool how inspirational this content was to others. Not only did Kim successfully get into the web development industry, they are also a woman and person of color.

This video helped remind me that everyone learns differently and that it’s very possible to become discouraged in learning something new if the learning style doesn’t fit.

While written examples and how-tos can be helpful, they aren’t very interactive or don’t have the pacing that some learners desire. This is something I have in mind with my tutorials, I would like them to be interactive.

Scheduled Maintenance: April Edition

In February I wrote my first scheduled maintenance piece. It’s my chance to reflect and plan on career goals.

In February I was concerned about keeping my skills sharp. I spend a good chunk of my day talking to people, coordinating on projects, and gathering business requirements. This leaves little time for actual coding.

To be honest, one of the biggest challenges I have been running into for the last year is staying on top of changes and new trends in the stacks we work with.

React and state management tools in particular have been challenging to keep up on because those libraries are evolving quite rapidly and in some cases like React hooks, very dramatically from a design perspective.

Building Tools

I found a nice middle ground here, thanks to some coaching advice. I can use my my spare time to develop tools that help me in my role as a manager while staying in touch with changes in technology.

This inspired me to fix up a custom burndown chart and get it working again. As well as adding a new tab with Github activity stats.

I’m using the burndown chart in our standups and retrospectives, it has been really useful.

The Github activity report is pretty early in development, but it helped me become aware of a SASS file that was refactored (nice improvement) and another file that probably needs to be broken up.

Learning

As I mentioned, my progress was inspired by a coaching session. I feel very motivated and have several more things I want to try now.

In addition to the coaching session, I finished the book The Phoenix Project. This has me thinking about continuous deployment and streamlining our development process.

I also virtually-attended Failover Conf, which exposed me to the dev-ops world a bit. There are many takeaways I got from that too.

What’s Next?

So what’s next? Work-life balance.

My goal this month (May) is to work my leisure and hobbies back into my routine. This past week I was really focused on the burndown chart and Github reports and didn’t give myself enough time to relax. I felt this towards the end of the week.

In addition, I want to see how I can cut down on meeting. These days I hold and attend LOTS of meeting. I need to have some time for engineering.

Some learning I plan on picking up Testing Javascript by Kent C. Dodds.

Getting More Familiar with Docker

I’ve been spending this week getting more familiar with Docker. I’ve learned how to build new images, spin up a collection of related containers with Docker Compose, and push an image to AWS.

I’m pretty excited about how this will help my team, but I’m also nervous about the unknowns we’ll encounter. My goal is to free up time, not take up more.

It’s important to know what Docker is and isn’t. To be honest, I’m still a little fuzzy. I wrote about this in my last post.

Docker utilizes virtualization technology to run processes in isolated environments called Containers. It has some similarities to virtual machine technology, such as VMWare and VirtualBox.

Docker Containers do not hold an OS, but they do have libraries and binaries from other OSes.

After working with Docker a little, I’m now much familiar with commands to setup a container and access the container (docker exec -it is my friend). I’ve also gotten more familiar with docker-compose (docker-compose up/down are pretty cool).

The documentation for Drupal on Docker provides info on both setting up Drupal and MySQl.

I’ve been able to spin up a Redis and MySQL server with Docker, it has simplified the setup and given my team a consistent toolset.

What is this Docker Nonsense?

This last week I’ve been working on getting Drupal running through NGINX so I can test out a page builder feature. I was getting a weird error with the dev-server built into PHP.

I didn’t want to have NGINX running on Windows, so I spun up a VM. Setting up an environment can be time consuming and sharing content between host and client is a bit of a pain.

The last two weeks has had a theme: environment/tools setup. So my mind has been on “how do we improve this process?”

Documenting the process helped a little, but it is still a time consuming process. It also seems like there’s always some new gotchas that eat up time. If only there was a way to automate this…

Here is where Docker enters the picture and where it’s suppose to shine. We can create a group of containers that run a web server, database, and other needed services. This setup can be shared across workstations so we maintain a consistent work environment. We can also use Docker in production too with Amazon’s ECS (Elastic Container Service).

It sounds like a smart move and everyone is on board.

Great, now let’s tear down this idea and look at use cases and scenarios, starting with security.

But in order to feel out security we need to know what Docker is. That can be a little confusing. To be honest, I’m still a bit fuzzy.

My understanding is a Docker container is a very thin layer that can have libs and executables. When you run the container the processes run in their own isolated namespaces.

This diagram is the most helpful of everything I’ve come across.

Regularly Scheduled Maintenance

For about the past year I’ve been putting my time towards planning and managing projects and less time with implementation.

I was stubborn in accepting I didn’t have enough time to both manage and code. I learned the hard way.

I tried to code out a complex solution that ended up taking a long time to finish, because I kept getting pulled away. After that, I focused more on coaching. Guiding my developers to make good decisions has become a more effective use of our time.

One challenge with this approach is my coding skills are becoming a little rusty. My memory of higher level design is fine, but my familiarity with the code base and specific implementation has started to become fuzzy.

Another challenge is keeping up to speed on new features that come out for languages and frameworks. Last year I had an instance that caused a little conflict when I wasn’t familiar with with some new React features that had been announced the year before.

There is a question I’m hoping to get an answer for this year; is it possible to be a technical lead and a manager?

I’ve heard of positions that are both, but my personal experience has shown me it’s difficult and probably best there’s a separation of the two.

Regardless of if I hold on to those responsibilities or not, I want to keep my skills up to date. And that requires some routine maintenance.

I think it’s best to focus on one area at a time, which has me a little torn. Do I put that attention on work or hobby? That’s a topic to delve into more in another post. For now, I’m going to side with work and explore Drupal more.

I was tempted to say Drupal and React, but I need to limit myself to reasonable goals.

Putting in any time to perform any maintenance is an improvement over the past two months.

My target is to get Drupal setup in an environment to test out the layout builder and see how their database schema is structured.

Wish me luck!

A* Pathfinding In Game

I wrote a post on implementing a simple A* Pathfinding algorithm a couple months ago. When I went to add it to my game I ran into some interesting differences I wanted to write an update on.

Here is the algorithm working on my game server. Both player and NPC are red blocks. When the player is within viewable range of the NPC, the NPC will start chasing it.

The pathfinding algorithm allows the NPC to maneuver around blocked tiles.

Coordinate to Tile Mapping

One thing I discovered while incorporating it into my game was my simple example had a 1:1 coordinates to tile ratio. Coordinates 0,0 was the first tile, and 0,1 was the second tile. When tiles were 16×16 pixels, the coordinate to index mapping broke.

To address this, I needed to pass  map width and map height in tiles, as well as the tile size so it was known when a new row started and the bounds of the map.

I did this by creating a map struct that contained the width, height, size, and pointer to the tile vector.

struct GameMap {
	GameMap() {}
	GameMap(int _map_width, int _map_height, int _tile_size, std::vector<unsigned int>* _tiles) : map_width(_map_width), map_height(_map_height), tile_size(_tile_size), tiles(_tiles) {}
	int map_width = 0;
	int map_height = 0;
	int tile_size = 0;
	std::vector<unsigned int>* tiles;
};