Go to homepage

Reid Main

iOS developer @Affirm

  1. About
  2. @reidmain
  3. Email
  4. GitHub

šŸ”— Ubershaders: A Ridiculous Solution to an Impossible Problem

In an very technical blog post, the Dolphin emulator folks detail their solution to "Shader Compilation Stuttering", a problem that has been plaguing their emulator for years.

There was some frustration and even antipathy from the developers toward shader compilation stuttering. It was something that was deemed unfixable and was garnering a lot of ill will and frustration within the community. Ironically, we hated the stuttering as much as anyone else, but the sheer insanity of the task was enough to keep most developers away. Despite this, some still privately held onto a glimmer of hope. It started out as a theory that had a chance of working. A theory that would take hundreds, if not thousands, of person-hours just to see if it was possible.

That hope is what fueled an arduous journey against seemingly impossible odds. A journey that would take multiple GPU engineers across two years. All in an effort to emulate the full range of the GameCube/Wii's proto-programmable pipeline without falling victim to this pesky stuttering.

This is the dawn of the Ubershader era.

I love this blog post so much because it is a quintessential example of how you can become so tunnel visioned with a solution to a programming problem and then one day someone comes at it from a completely new angle and your mind just explodes.


August 2017 Retrospective

This month could not have been more of a clusterfuck if I had tried. I have definitely had worse months but the utter insanity of this month just drained me.

I will take full responsibility for fucking up the first half of the month. That was all me. With The International going on I pretty much watched or played Dota 2 every waking hour for two straight weeks with a little bit of TV (Broadchurch season 3) to spice things up. Again, I realize this was all my fault. I didn't make a dent in any of my goals but god damn it was super fun watching all that Dota.

Then on August 13th my life got turned upside down when I figured out that my RAID had failed. The vast majority of my free time over the next 15 days became either rebuilding my file server and RAID or recovering my data. Even as I am writing this I have just barely finished both of those things.

So The International and my RAID failing basically took up the entire month of August but lets dive into my resolutions and see how each of them turned out.


I managed to get out and exercise every single day of the month. I am still bouldering three times at week and either running or doing stairs the other days. I have been improving at bouldering but I think I am reaching a plateau that is only going to be broken through if I increase my strength which I am not yet convinced will happen if I just continue bouldering. I may have to look into lifting weights to take my bouldering to the next level.

Foodwise basically nothing has changed. Still trying to eat healthy at work, Cacao Soylent drinks at night and sometimes some other snacks if I am still hungry. I've probably bought a little more junk food than I would like but it honestly hasn't been all that bad. Game of Thrones finally ended so maybe Elsie and I will stop being such pigs on Sunday nights but who knows. I'm not gonna make any promises.

Weight and body fat percentage continue to be stable so my hopes that bouldering would make a difference seem to be dashed. Looks like I either need to cut back on what I eat or, more realistically, look for another way to build muscle and burn fat.

Read a book

I did not start reading The Fall of Hyperion until about August 25th. I am approximately a third of the way through and it is just as engrossing as the first book in the series. Unfortunately this means The Fall of Hyperion is going to bleed into September but hopefully if I finish it quickly I can move onto another book. I was thinking of starting The Stormlight Archive since the third book is being released soon and I have heard nothing but good things.

Play a video game

After watching Dota 2 for over five years I finally played my first competitive matches and it actually was quite fun. I am focusing only on support characters right now and plan to do that for the foreseeable future. I gotta imagine it will take me dozens of hours before I have even the slightest inkling of how to play support "right".

I played a bit more Fortnite but the repetitive gameplay got stale pretty quickly. I've taken a break from the game and could see myself jumping back in after a couple more updates.

The Dauntless' Founder's Alpha came and went and Elsie and I played about four hours of it. It is honestly really rough. I am genuinely concerned that this game is slated to be released in the fall. It is super unpolished and really low on content. There are only four weapon types and they don't really feel all that versatile. It is the same combos over and over. The monsters were repeating the same moves so fights because boring faster than I would have expected. In general is seems really low on content and I could see myself blowing through incredibly quickly. I know this is Phoenix Labs first game but in a world where Monster Hunter Generations exists for the 3DS, Monster Hunter XX exists for the Switch and Monster Hunter: World is coming in early 2018, they need to showcase something better to pull players away from Monster Hunter.

Speaking of Monster Hunter XX, I have imported it but not yet had a chance to play it. I did manage to set up and configure my Elgato Pro HD capture card so I plan to stream MHXX in September.

Anyone who knows me knows I am a huge fan of tactical turn based games and it just so happened that two of them were released on the same day! The first XCOM 2 expansion, War of the Chosen and Mario + Rabbids Kingdom Battle. I decided that I would give the XCOM mods a chance to get updated and beat Mario + Rabbids first. I'm only about two hours in and it is definitely baby's first turn based strategy game in a way but I can see how it could get much more difficult and involved. Also, the Mario and Rabbids motif is absolutely amazing. Those Rabbids can be freakin' hysterical.

For September my goal has become play all the games that were released in August. It is amazing the abundance of riches I have. Beat Mario + Rabbids, start a War of the Chosen campaign, play the Dauntless beta, stream MHXX, scrub it up in Dota. There is no way I am going to get to it all. The only thing being released in September that really grabs me is Destiny 2. Seriously watch this. Nathan Fillion and the Beastie Boys? Those fucking Bungie marketers know how to push my buttons.

Become conversational in another language

Yeah I really can't have an excuse for this one but let me try. Duolingo just stopped motivating me and I never got off my ass and made use of the Kana flash cards because I was distracted with The International and the failed RAID. Alright that excuse isn't half bad but still I should have been able to find some time instead of absolutely none.

Time to regroup and actually do this again this year since a trip to Japan actually may be in the cards.

Hobby Programming

Not even renaming this resolution to "Hobby Programming" helped. I didn't add the ability to directly link to a website from my blog. I didn't work on my Observables framework. I did write some Ruby scripts to validate my recovered data and cleaned up my photo renaming script to help organize it all so I can found that as a minor win.

I also did write about setting up an Ubuntu file server and while that was not directly "programming" is still involved learning a lot about technology so yeah, lets say I didn't totally effed this one up this month.

Do not indulge in time killing activities

So this is a tale of two cities. For the first half of the month you could say I did nothing but waste time. I only watched hours and hours of Dota. However when my RAID died I then spent every hour after work rebuilding my file server and recovering my data so maybe I made up for it.

Elsie and I sprinkled in some TV by finishing Broadchurch season 3 (fucking amazing go watch it) and Cowboy Bebop but I think that was the regular amount of time I'd spend in a month so I'm not going to beat myself up about it.

With so many video games to play and other activities to indulge in I don't think I am going to waste much time in September.


Let's look over my goals from last month.

Exercise every day of the month
Nailed it! šŸ¤˜šŸ»

Don't buy any junk food during the week
Technically failed it but did it way less than I thought so I count this as a win.

Read The Fall of Hyperion
Failed horribly.

Beat (or fail at) existing XCOM 2 campaign in preparation for the expansion
Oh shit I was suppose to play XCOM wasn't Iā€¦

Play my 25 newcomer matches in Dota 2
I think I only got through 13 before my RAID died and I forgot about video games.

Stream Monster Hunter XX
I hooked up my Elgato Pro HD but my copy of MHXX hasn't arrived yet. I did stream Mario Kart 8 and Mario + Rabbids so again this is a minor victory.

Memorize all of Hiragana and Katakana

Add the ability to link directly to a webpage from my blog

Build Observables framework

Write one article for my blog about an original topic
Fuck yeah we're back in the saddle! Thank you RAID for exploding so I could write three different articles.

Use the book Elsie got me to draw stuff on my iPad Pro and share it on social media

Man I really effed up here didn't I?


Thank some god that this month is finally over. I failed the majority of my goals but in my defense I was still really busy. I am going to try to get back in the saddle this month and complete the goals that I failed. I am also going to be a bit more realistic about the number of goals I set.

So my goals for September (in no particular order):

Yes I am carrying over a large portion of them from August but I don't think I set bad goals. If I manage my time right and don't have some catastrophic event everything should be quite doable.



Setting up an Ubuntu file server

I built my last file server in July 2010 and when it finally died in August 2017 I could barely remember how I had originally set it up. For posterity I thought an article detailing exactly how I configured my new file server would not only be great for future me to reference but maybe it will prevent someone else from stumbling through it like I did.

For my new file server I simply repurposed the remnants of my old gaming rig. It was a i5 2500K CPU with 16GB of RAM and a Radeon 6970 GPU which I chose to remove because I planned on using Ubuntu Server which didn't have a GUI. I took a spare 128GB SSD from another machine to be my OS drive and purchased two 4TB Western Digital Red (WD40EFRX) drives for my new RAID 1.

1. Create a bootable Ubuntu Server USB drive

The first step is to download the Ubuntu Server ISO. I recommend the Long Term Support (LTS) version because odds are your server is going to be very static and you're not going to need to update it to the latest and greatest Ubuntu as soon as it is released. You will want the more stable version that is supported for the longest period of time so you aren't likely to be forced into any major upgrades.

Be aware that the Ubuntu website will automatically download the ISO for the architecture of the machine you visit the website on which is going to be the 64-bit version for 99.99% of the people reading this. If you are going to install Ubuntu Server on a 32-bit machine you'll need to download the i386 ISO.

Once you have downloaded the ISO you can make a bootable USB drive by using the dd command. I did this on macOS Sierra using the following steps:

  1. Connect the USB drive you want to use. Keep in mind all the data on this drive is going to be erased.
  2. Run disktuil list to see a list of all of your connected drives. One of them should obviously be the USB drive because it should use some verbiage like "external". Let's assume the name of this drive is /dev/diskX.
  3. Ensure the disk is unmounted by running diskutil unmount /dev/diskX.
  4. Copy the contents of the ISO to your USB drive by running sudo dd if=ubuntu-16.04.3-server-amd64.iso of=/dev/diskX bs=1m. This will take several minutes.

2. Install Ubuntu Server

Plug your newly created Ubuntu Server USB drive into your file server and boot off of it. I booted into BIOS mode instead of UEFI because my hardware was fairly old (5 years) and I wanted to go with the old stuff that was robust versus the new hotness which could be buggy. Also the documentation for Ubuntu is pretty sparse and I was confident that my bad luck would mean I'd hit some random UEFI bug that no one has ever seen. I wanted to minimize my chances of stumbling across a phpBB forum post asking inquiring about my problem but having no solution.

I followed Ubuntu's handy install guide which was basically just push next until asked for a username and password. 99% of installs shouldn't need to change a thing but choose whatever suits your needs.

After the install has finished the server will restart and you should be looking at a command line asking you for the login credentials you created during installation. Enter them and you are ready to start configuring your server.

3. Update all the things

Even though you just finished installing your operating system I can guarantee you that something critical is out of date. Run the following commands:

sudo apt-get update
sudo apt-get upgrade
sudo apt-get clean

and now your system should be completely up to date.

If you followed the Ubuntu Server install guide automatic updates should already be turned on but if not I highly recommend you look into enabling them.

4. Give your server a static IP address

You will want to give your server a static IP address so you can easily access it. There is nothing more frustrating than not being able to SSH into your server because the dynamic IP address changed.

To do this you will need to edit your /etc/network/interfaces file.

You should see something like

auto eno1
iface eno1 inet dhcp

which indicates that your ethernet (en) onboard (o) in the first (1) position is set to use dynamic IP assignment (dhcp).

You want to change those two lines to be

auto eno1
iface en1 inet static

where "address" is the IP address you want your server to be, "gateway" is typically the IP address of your router and "dns-nameserver" is also the IP address of your router but you could use any name server you want like Google's ( for instance.

Technically you can get your server to recognize these changes by running some commands but I always like to ensure this stuff works from a cold boot so I usually restart the machine with sudo shutdown -r now.

When the machine finishes rebooting and you are logged back in you can run ifconfig to ensure your computer has the correct IP address and run ping google.com to ensure that it is resolving names properly.

To make things even easier you can now edit the /etc/hosts file on whatever machine you plan to connect to your server from and add CoolNameHere so that you no longer have to memorize the IP address and can refer to it by whatever name you choose.

5. Configure ufw

Uncomplicated Firewall (ufw) is an amazing tool that lets you greatly improve the security of your server by clamping down on the ports that it communicates through.

Turn on ufw by running the command sudo ufw enable and check that it is working with sudo ufw status verbose. You should see that none of your ports are open.

Next you want to open up the port that you are going use to SSH into the server. I typically choose a port that is five digits to be confident that I will not be colliding with any other programs. Run sudo ufw allow XXXXX/tcp to open the port for communication over TCP and then run sudo ufw status verbose again to ensure the port was opened correctly. You should see something like

Status: active
Logging: on (low)
Default: deny (incoming), allow (outgoing), disabled (routed)
New profiles: skip

To                         Action      From
--                         ------      ----
XXXXX/tcp                  ALLOW IN    Anywhere
XXXXX/tcp (v6)             ALLOW IN    Anywhere (v6)

6. Configure SSH

99.99% of Linux distros have OpenSSH already installed but if your server doesn't you can run sudo apt install openssh-client and sudo apt install openssh-server.

Once OpenSSH Server is installed you will need to configure it by editing the /etc/ssh/sshd_config file.

Now that OpenSSH is configured you need to set the public keys that are able to SSH into the server. Run the commands:

mkdir ~/.ssh/
touch ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys

which creates the necessary file and ensures it has the correct permissions, assuming the current user is the one that you added to the AllowUsers option in the sshd_config file.

Now you will need to add your public key to the authorized_keys file. I upgraded to an Ed25519 key since DSA and RSA are deprecated so I just copied the output of cat ~/.ssh/id_ed25519.pub on my local machine to the authorized keys file on my server.

Restart the server again with sudo shutdown -r now and ensure you can SSH into your server from the machine you just authorized.

7. Install mdadm and set up your RAID

I used this article to refresh my memory on how to install and configure mdadm.

First you need to ensure mdadm is installed by running sudo apt-get install mdadm.

Next you need to determine the logical names of the drives that will be used for the RAID. You can use sudo lshw -C disk to get a list of all of the hard drives connected to your server.

Now you could just run sudo mdadm --create /dev/md0 --level=1 --raid-devices=2 /dev/sda /dev/sdb and be done (assuming the logical names of your two drives are /dev/sda and /dev/sdb) but there is a downside to this. You are telling mdadm to use the entire disk for your RAID. This has two major drawbacks.

  1. If you removed a hard drive from your RAID and transferred it to another computer it would only only be recognized by mdadm because it has no valid partition.

  2. Any hard drives you add to the RAID in the future have to be the EXACT same size as your existing drives. If you can't find the exact model in the future then you'll most likely have to buy a bigger drive to ensure that it is large enough for your RAID. If you attempt to add anything that is smaller it will fail.

Basically partitioning your drives first gives you more flexibility in the future for when things inevitably go wrong.

So, assuming the two drives to be added to the RAID are /dev/sda and /dev/sdb, let's start by partitioning /dev/sda. Since the hard drives I was using were greater than 2TB I needed to use the parted command for its support of GUID Partition Table. fdisk only supports master boot record which means that it cannot work with drives over 2TB.

To partition /dev/sda with parted you need to run the following commands:

sudo parted -a optimal /dev/sda
unit MiB
mklabel gpt
mkpart primary 2048s 3720GiB
align-check opt 1
set 1 raid on

and then repeat them for /dev/sdb. Keep in my that 3720GiB is specific to my hard drives because they were 4TB in size. While you are inside parted you can use the print command to see what free space you have available.

You can run sudo fdisk -l to list all of your drives and ensure that the partitions were created successfully. They should be identical between your two drives (/dev/sda1 and /dev/sdb1) which ensures they can be added to the same RAID.

You can now create the RAID by running sudo mdadm --create --verbose /dev/md0 --level=1 --raid-devices=2 /dev/sda1 /dev/sdb1.

To check on the status of the RAID you can run cat /proc/mdstat or sudo mdadm --detail /dev/md0. Since the RAID was just created it should be in the syncing state which will most likely take multiple hours to finish but you can still use the RAID at this time.

Now that the RAID has been successfully created we can format it with a file system so it can be mounted. Run the command sudo mkfs.ext4 -v /dev/md0 to create an ext4 file system which is the most common Ubuntu file system.

Next we should copy the ouput of sudo mdadm --detail --scan and add it to our /etc/mdadm/mdadm.conf file so that the RAID can automatically start on boot.

And finally if we want to the RAID to be mounted on boot we need to add it to our /etc/fstab file. Get the UUID of /dev/md0 by running lsblk -o NAME,UUID and then add UUID=XXX /mnt/md0 auto defaults 0 0 to your /etc/fstab file where XXX is the UUID of the RAID and /mnt/md0 is your mount point.

If you run sudo shutdown -r now again and log in to your server you should be able to cd /mnt/md0 and access your RAID.

8. Test RAID performance

To test the speed of your RAID you can run hdparm -Tt /dev/md0. You can compare the results to the theoretical performance you should be getting from your drives to ensure that everything is working as expected.

You can also use the dd command to test the creation and reading of a large file to perform a practical performance test as well as see how your RAID handles syncing a large file.

dd if=/dev/zero of=/mnt/md0/test.out bs=1M count=10240 will create a 11 gigabyte file of all zeroes 1 megabyte at a time. dd if=/mnt/md0/test.out of=/dev/null bs=1M will read the entire file into /dev/null which is essentially a no-op but it will still access every byte of the file which demonstrates how fast you can read from your RAID.

7. Set up Samba

Now that our RAID is configured we want to expose it to our local network so that other users can read and write files to it. For this I chose to use Samba.

First you need to install Samba using sudo apt install samba.

Next for every user you want to have access to Samba you will need to set a Samba specific password. This password can be the same as your Ubuntu password if you want but if the user you are giving access to has a lot of power then I would recommend you use two different passwords. To set the password for "user" run sudo smbpasswd -a user and follow the prompts.

Now that "user" is configured to use Samba we must create a shared directory. To do this you'll need to edit /etc/samba/smb.conf and add the following to the very bottom if you want to share a directory at /mnt/md0/Photos.

    path = /mnt/md0/Photos
    browseable = yes
    read only = yes
    guest ok = yes
    write list = user

This creates a publicly browseable share called "Photos" that guests can read from but only "user" can write to. You also must pay attention to the actual permissions of the directory you are sharing. In our case /mnt/md0/Photos must be readable by anyone and writable by a group that contains "user".

Since we are using ufw we have one more step before our share can be accessed. We need to open the Samba specific ports by running sudo ufw allow samba. After that you should run sudo service smbd restart to restart Samba and ensure all of your changes take affect. Now you should be able to access your share from any computer on your local network.

If you are going to have Mac's accessing your share like I am you may want to add the following to your shares in /etc/samba/smb.conf to prevent Apple metadata files from being created.

veto files = /._*/.DS_Store/
delete veto files = yes

I learned about this little trick from this article.

8. Time for a celebration

That's it. You should be good to go. Your server is automatically updating. You have a firewall in place and only allow public key authentication for SSH. Your RAID starts and mounts on boot and you can share over your network. What more do you want from your file server?


Verifying the integrity of recovered data

I wrote previously about how I recovered data from my failed RAID but I skimped on the details of how I ensured that my photos and videos were recovered properly.

The first step was to copy the recovered data off of the drive that I provided the data recovery service. Let's assume I copied the recovered photos to /Users/reid/Recovered Data/Photos1 and /Users/reid/Recovered Data/Photos2.

Step two was to ensure that the files between the two directories were identical and if they weren't figure out which of the two files was worth keeping. I wrote a small Ruby script that iterated over all of the files in the first directory and ensured that the same file existed in the second directory by using the diff utility.

#!/usr/bin/env ruby

    Dir.glob("/Users/reid/Recovered Data/Photos1/**/*", File::FNM_DOTMATCH) do |child|
        if File.file?(child)
            if child.include?(".DS_Store")

            file1 = child
            file2 = child.sub("Photos1", "Photos2")

            diff_result = `diff \"#{file1}\" \"#{file2}\"`
            if diff_result.empty? == false
                puts "open \"#{file1}\" \"#{file2}\""

For my use case I made the script output open file1 file2 so that I could quickly run the command in the terminal and open up the two files that differed. I was expecting to only need to use this for images so the open command would simply open up both images in Preview.

The problem with this script is that it only ensures Photos2 is a superset of Photos1. I needed to run the script in the other direction to see if there were any files in Photos2 that did not exist in Photos1 and lo and behold there was. This was probably impossible to not have happen because the drives were in such bad shape. They were seven years old for fucks sake! I am once again so thankful that William at Lazarus Data Recovery did a second pass on my photos directory to maximize my chances of getting all of my data back.

I merged the contents of /Users/reid/Recovered Data/Photos1 and /Users/reid/Recovered Data/Photos2 into a new directory called /Users/reid/Recovered Data/Photos. Now I had a directory where all of the "good" files should be and could move onto step three. What if a file was corrupted in both of the directories? I had over 9000 photos and videos so it would be impossible to check them all by hand. I wrote another Ruby script that would iterate over all of the contents of a directory and based on the extension of the file it would run some logic to verify the integrity of the file.

#!/usr/bin/env ruby

require "set"

    image_types = Set[".jpg", ".png"]
    video_types = Set[".mov", ".avi", ".mp4"]

    Dir.glob("/Users/reid/Recovered Data/Photos/**/*") do |child|
        if File.file?(child)
            filetype = File.extname(child)

            if filetype.empty?
            elsif filetype == ".jpg"
                if `jpeginfo -c \"#{child}\"`.include?("[OK]") == false
                    puts "Corrupted jpg: #{child}"
            elsif video_types.include?(filetype)
                if `ffprobe -v quiet -show_error -i \"#{child}\"`.empty? == false
                    puts "Corrupted video: #{child}"
            elsif image_types.include?(filetype)
                if `identify -verbose \"#{child}\" 2>&1 >/dev/null`.empty? == false
                    puts "Corrupted image: #{child}"
                puts "Untested file: #{child}"

The first edge case is for files with no extenson. Examples would be dotfiles or Apple metadata files. These are files that we don't care about verifying and can simply skip.

The first filetype to verify is jpg. I discovered a tool called Jpeginfo which did this. The -c parameter checks the file for errors and if the output does not contain "[OK]" then it is invalid.

The next filetypes to verify are video files. mov, avi and mp4 are the ones that I encountered. I knew about FFmpeg and after reading into their documentation I came across the ffprobe tool. It attempts to gather information about video files and after some quick tests I realized that it was successfully identifying corrupted videos. The -v quiet parameter first silences all output and then the addition of the -show_error parameter ensures only error information is outputted.

The final filetypes to verify are image files. jpg and png are the only two I had. ImageMagick is one of the perennial open source image manipulation programs and their identify tool allows you to check the integrity of image files. I was already checking jpgs with Jpeginfo but in theory this tool works for them as well. You need to use the -verbose parameter to ensure all possible data is read and outputted (including error data) and then 2>&1 >/dev/null ensures that only the stderr is outputted.

The final edge case is any other filetype that was not checked. A warning is simply printed to the console indicating that the file was not checked and you probably should find a tool that would let you verify it.

All of the tools I mentioned were installed using Homebrew. They are all available on Linux as well so you could easily write these scripts and run them on your RAID to ensure that none of your photos and videos are being corrupted.

And that is it. I lucked out and none of my photos or images were corrupted on both of the recovered directories. There were a couple of differences that did indicate corruption but luckily their sister file in the other directory was fine. Photos2 apparently had more files than Photos1 and luckily they were not corrupted but unfortunately this leads me to believe that not all of my photos and videos were recovered. This is a likely outcome of attempting to recover over 9000+ photos and videos totaling over 200GB. However, all of the important photos and videos that I wanted were recovered and if something was lost that I can't remember well then does it really matter if I lost it anyway? I'm going to go with the "ignorance is bliss" approach and just be thankful that every important picture and video of my grandfather's 80th birthday was recovered.


Thank you Lazarus Data Recovery

Back in July 2010 I built a file server with RAID 1 which I used to store every single bit of digital media that was important to me, including over 200 gigabytes of photos dating all the way back to 2003. The RAID was comprised of two 2TB Western Digital green hard drives that, as of August 2017, had reached almost four years of continuous uptime. I didn't have any other backup solutions for this data because I figured what were the odds that both drives would fail at the exact same time? As long as one of the drives lived I should be able to rebuild the array with a new drive and all the data would be recovered, right? I'm sure most of you can see where this is going.

Cut to the morning of Sunday, August 13, 2017. I decided to build a new file server because my existing one was getting old and had absolutely no room for expansion since it was in a home theatre PC style case. The server had not even been turned on in months and was tucked away deep in my closet. I pulled it out, plugged it in, turned it on and BAM. "Serious issues were found while checking the disk drive. Press M for manual recovery." uh oh.

I proceeded to spend the next five hours of my Sunday trying to understand what the heck went wrong. After reading thousands of lines of man pages and trying dozens of tools I finally came to the realization that both of the hard drives were fucked. I could not get either of them to mount and only one of them was actually recognized by Ubuntu as having a valid file system.

I quickly switched from "I am a computer science major. I can fix this." to "Oh fuck, I am in over my head. Who can I pay to fix this?". I typed "sf data recovery" into Google and the top result was Lazarus Data Recovery. Their Yelp reviews filled me with confidence so I gave them a call. Keep in mind this is now 3pm PST on a Sunday and someone picked up within seconds. I talked to William who listened to my problem and told me that if I showed up tomorrow morning at 10am he would be able to help me out.

I bought a 4TB Western Digital Black hard drive and external drive enclosure, packaged up my corrupted RAID and showed up at Lazarus Data Recovery exactly at 10am. I cannot say enough good things about William. He was absolutely amazing from beginning to end. He explained to me how he hoped to recover my data and gave me daily (sometimes twice a day) updates as to what progress he was making. By Wednesday night I heard back that he had successfully recovered my data and was in the process of transferring it to the drive I provided. By Thursday afternoon I had all of the recovered data in my hands. Not only did William recover my data but he made a duplicate copy of my photos just in case anything went wrong during the first copy attempt (spoiler alert: it did). He also profusely apologized to me about how he could not save the drives and that both of them were dead and not worth using again. William was incredibly empathetic and never stopped thinking about the customer.

After getting the drive home I hooked it up to my MacBook and transferred both copies of the photos off of it. After diffing the two directories I found that one of them had a single corrupted image file and the other had a single corrupted video file but together all of the data had been recovered perfectly.

After recovering all of my data I moved onto revamping my data backup solutions. Going forward I plan to do the following:

  1. Set up a new file server with RAID 1. Mirroring the data across two drives is still a solid starting point.
  2. Every year or two, remove one of the drives in the RAID and replace it with a new drive. This should prevent what I just went through by ensuring the drives being used in my RAID are of different ages. Also, this removed drive can be stored somewhere so in the worst case I have a drive with all of the data up until a certain date so I shouldn't be able to lose everything.
  3. Set up periodic backups of the RAID to another hard drive. Either an external one or possibly a SSD inside the file server. If the RAID fails I should have a functional snapshot of it that is not that old and because the drive is not constantly being accessed it should live longer than the RAID (especially if it is a SSD).
  4. Copy important photos/videos to iCloud Photo Library. I pay for iCloud storage so I may as well make use of it. This will also allow me to easily share photos with family and friends which is something I barely do right now.
  5. Set up a cloud backup solution, like Backblaze, to store the entire RAID offsite so if my place burns down or some other catastrophic event occurs the data should be stored safely in the cloud.
  6. I currently have all of my photos on my MacBook Pro. Continue to store them there before copying them to my RAID. This way I can easily use Time Machine

With all of these in place my photos should be stored on at least six different hard drives in at least three different locations. I think that many redundancies should ensure that I never lose my data again.

So let this be a lesson to anyone out there who thinks they have enough backup solutions for their data. Odds are that you don't. Start thinking about the doomsday scenarios and figure out how confident you are that your data is going to survive.


July 2017 Retrospective

July was another decently productive month. I would say that on the whole July is a little step down from June because I did not write anything for my blog or be as diligent as I wanted with my learning of Japanese. But I still managed to read a book, continue to be healthy and play a lot of video games so I cannot complain that much.


I think that July was one of my best months for exercising. I focused on the elliptical and climbing stairs during the week and on the weekends Jan and I would run and boulder. Near the end of the month we decided to start bouldering on weekdays are up to three times a week now. All of this lead me to exercise nearly every day of July. This new bouldering schedule combined with using the elliptical and climbing stairs should easily allow me to exercise every day in August.

After another month of lifting no weights I have finally decided to delete the Strong app. The app itself is great for tracking your workouts but apparently I needed something else for motivation. My hope is that the increase in bouldering will help me build muscle and cause me to start looking into new ways to improve my flexibility.

Food continued to go great in July. I would like to think I have been eating healthy, balanced meals at work and dinner has been predominantly a Soylent drink with some fruit or a little snack. Not only has the Cacao Soylent drink grown on me but I legitimately look forward to it. The ability to come home, quickly pound a Soylent and get on with my evening cannot be understated.

I haven't been buying much (if any) junk food. I try to focus on being able to snack on fresh fruits and vegetables versus buying food with processed sugars. The only real negative thing I could say about my eating habits is that the weekends seem to have become cheat days. After exercising on the weekend Jan and I usually go out and grab a carb heavy meal to replace what we burned and then Elsie and I usually order some food while we watch a movie or Game of Thrones. Things could definitely be worse but on the whole I am happy with where I am with respect to food.

Weight and body fat percentage continue to plateau but I am growing happy with the way I look and I hope that with a renewed focus on rock climbing I can help shed some more of that unwanted fat. An inch or two more off my waist and I'll have to come up with some new weight loss goals.

Read a book

I did finally read Hyperion and holy crap what a great book. I can see how it would not be for everyone but as someone hoping for a sci-fi epic I was not disappointed. I really don't want to say too much about the book because I think it would be incredibly easy to spoil it. But I will say that the world building that occurs is absolutely mind blowing. I wanted to know more about this universe the second I finished reading the book. I just couldn't get enough.

Another thing I would like to say is that I forgot, multiple times, that this book was written in 1989. The forethought of the author, Dan Simmons, is fucking insane. Hyperion reads like it was written within the last few years by someone who is completely immersed with our technical culture and where it could lead. This book was written before the Internet was a thing and you'd honestly think someone wrote his novel because they saw the potential for how something like it could grow over centuries.

The Fall of Hyperion is going to be my novel of August because I just cannot get enough. If you are thinking about reading Hyperion make sure you have the time to read The Fall of Hyperion right after because I absolutely guarantee you will want to.

Play a video game

July was a really eclectic month when it came to video games.

Elsie and I finally managed to beat the A Realm Reborn portion of Final Fantasy XIV and unlocked the Heavensward expansion. Unfortunately after that happened we fell off the wagon again and haven't played any FF14 since but I wouldn't be surprised if we came back to it in August.

PLAYERUNKNOWN'S BATTLEGROUNDS continued to hold Jarques and I's interest for the first half of the month. A lot of amazing moments were had including my first squad win and my second duo win with Jarques.

While waiting for Jarques to be available for PUBG, I picked a single-player game from my Steam backlog, Defense Grid: The Awakening, and beat it. I am a huge fan of tower defense games and Defense Grid was a solid one. I liked how fast the levels were and the multiple challenges each one had. I literally spent three hours one evening playing the same level over and over again because I wanted to get a gold medal for all of the challenges. That is probably the biggest praise I can give that game. It is addicting.

I choose Defense Grid over some other games in my backlog because I wanted something that I would be able to finish before July 21st when Splatoon 2 came out. I was all prepared to become absorbed with Splatoon when I heard about Epic Games' Fortnite entering early access on the same day. Well I am a huge fan of both Minecraft and tower defense games so I immediately forgot about Splatoon 2 and just dove head first into Fortnite. It just so happened that Elsie and I's friend Cthulhu and the Teamworkcast got into Fortnite as well and we've been having a blast playing together.

Looking forward to August, it is going to be an absolutely insane month for games.

First, The International 2017 starts on Wednesday August 2nd and goes until Saturday August 12th. This means my days are going to be completely absorbed with Dota for the next two weeks. I could honestly see myself watching 10 hours of Dota, multiple days in a row.

Second, the Dauntless' Founder's Alpha goes live on August 18th. If this games is half as good as Monster Hunter I can see myself putting dozens if not hundreds of hours into it.

Third, speaking of Monster Hunter, Monster Hunter XX comes out for the Switch in Japan on August 25th. Since Elsie and I are insane we are going to import it and play the absolute shit out of it.

Fourth, August 29th is a date that strategy game fans will remember for years to come. The first XCOM 2 expansion, War of the Chosen, and Mario + Rabbids Kingdom Battle are being released so I guess I'm just not going to sleep that week.

That is four amazing new releases and the biggest gaming tournament in history all happening in August. Plus I still have PUBG and Fortnite to play and I wanted to finish my existing XCOM 2 campaign in preparation for the expansion . I guess Christmas is coming early this year.

Become conversational in another language

I was doing a passable job at using Duolingo to learn Japanese but I will admit that I fell off the wagon during the final week or so of July. I found that I could not move onto the later lessons and found myself constantly repeating the previous ones to a point where I lost all of my motivation. I am going to try to press onward in August as well as use the Kana flash cards that Elsie bought me for my birthday. Hopefully I will be able to have all of Hiragana and Katakana memorized by the end of August.

Release an app

Again I did absolutely nothing to release my app in July and that has made me realize that I really need to re-evaluate this goal. It has become obvious that it is so high level and wide reaching that I just cannot bring myself to even make a dent into it. If you look at all my other resolutions you can see how small measurable subgoals grew for all of them. This is what I use to push myself to work on those resolutions where this one is basically just one big excuse to be lazy.

This will be the last month I talk explicitly about this resolution. I think I am going to rename it "Hobby Programming" or something along the lines. I want this to be about me doing things outside of work to not only help me grow but rediscover my love for programming.

Do not indulge in time killing activities

I will admit that Elsie and I probably spent more time than usual watching TV this month. Seinfeld, Broadchurch (season 2 on Netflix and season 3 on iTunes), Evo 2017, Game of Thrones, Ballers, The Defiant Ones, Ghost in the Shell (which was fucking horrible by the way), as well as various YouTube channels like Jun's Kitchen, Node, Robbaz, Sam and Niko, The king of DIY and many more. It was just a couch potato kind of month in some ways but for the most part I don't regret any of it but I probably could cut down on all the amazing content I consume.


Similar to June, July feels like another month of a step, mostly, in the right direction. My continued fuckups with not releasing an app and failure to learn Japanese aside, I am content with my progress.

But there is always room for improvement and for August what I want to do is create a list of goals that will help me improve. The idea is that these goals should satisfy my larger resolutions in some manner but are specific enough that they give me something to work directly on rather than towards. When I come home at night I want there to be no doubt of the answer to the question "what should I do?". It should go without saying but these goals should also be attainable within the month.

So without further ado, my goals for August (in no particular order) :

  1. Exercise every day of the month.
  2. Don't buy any junk food during the week. I am fine leaving the weekend as our "cheat days" but I want to improve my eating habits during the week.
  3. Read The Fall of Hyperion.
  4. Beat (or fail at) existing XCOM 2 campaign in preparation for the expansion.
  5. Play my 25 newcomer matches in Dota 2.
  6. Stream Monster Hunter XX. This involves organizing my desk which is something I desperately need to do.
  7. Memorize all of Hiragana and Katakana
  8. Add the ability to link directly to a webpage from my blog. I want the ability to present some webpage with a little blurb giving people context as to why I think it is worth sharing. I come across so much great content in a month that I would love to start sharing it from my blog so I can easily look back and see what I found interesting over time.
  9. Build Observables framework.
  10. Write one article for my blog about an original topic. I don't want to be too specific on the topic because I fear that will hamper me. I am thinking either a post about "Mobile App Foundations" like I have been teasing for months or maybe an article detailing game mechanics I like/hate.
  11. Use the book Elsie got me to draw stuff on my iPad Pro and share it on social media.

So those are my goals for August. I have no idea if there are too many or too few but I am looking forward to feeling out this new process and improving on it in the months to come.



June 2017 Retrospective

June was a fairly solid month. I did not make progress in all the areas I wanted, but I did manage to branch out and expand to others so I definitely count this month as a step forward.

June was also the first month I really wrote a lot for my blog because WWDC and E3 provided a substantial amount of material.


I rebounded from my shitty month of April and managed to exercise four or more times times every week.

Every weekend my colleague, Jan, and I ran at least 15km including a half-marathon which we managed to complete in under two hours. We also took advantage of my Dogpatch Boulders membership and climbed a couple of times which really made me remember why I love climbing with friends.

During the week most of my exercising came from running on the elliptical or climbing the stairs in my building. I didn't strength train as much as I wanted to again because Strong app still hasn't been enough to motivate me and I haven't spent any time reading up on it.

Food has been trending in the right direction as well. Avocado toast with eggs has been a delicious and nutritious breakfast. The lunches at Affirm have been healthy when I avoid the carbs. I have done a good job at not buying unhealthy snacks and instead focusing more on fruits on vegetables. I am still purchasing some dinners from the prepared section of the grocery store but I also have been substituting some dinners with Soylent Drink of which I've tried all three flavours. Original tasted like pureed sugar cookies. Nectar tasted like the milk left over in a bowl of Fruit Loops. Cacao tastes exactly like chocolate milk. Most likely I'll get a subscription of Nectar and Cacao so I can replace 60-70% of my dinners with them.

My weight and body fat percentage have not changed at all so my fears seem to have been confirmed. Unless I cut my caloric intake and continue exercising the same amount I probably won't lose any more weight. The alternative is to work on increasing my muscle mass which should result in me gaining some weight but burn some of body fat which is really the only thing that matters.

Read a book

I did plan to read Hyperion in June but I got distracted by the Death Note anime which made me want to read the Death Note manga and that was exactly what I did.

After rewatching the anime and reading the manga for the first time I can honestly say that every single person should experience Death Note. It is not your typical Japanese anime or manga and I believe that it can appeal to everyone.

But in July I swear that I am going to read Hyperion!

Play a video game

PLAYERUNKNOWN'S BATTLEGROUNDS was the only new game that I played in June. It is your standard battle royale type of game that was made popular by mods for ARMA 2 and 3 as well as DayZ and standalone games like H1Z1: King of the Kill. It is still in early access so it is quite janky (network hiccups and frame drops being the most egregious) but after playing 10 or so hours I can understand its allure. The game does an amazing job at ensuring you never feel completely safe. You're never more than a minute or two away from having to take some kind of action that will force you into potential danger. The constant tension is palpable but games last less than 30 minutes on average so it is never too long before you get relief. You either die, the likely outcome, or you win that sweet chicken dinner. Either way once you get that release you quickly think over all the great moments of that game and usually you just want to dive right back in.

Become conversational in another language

Duolingo finally added support for Japanese so I resurrected this resolution and have been practicing every day for the final 10 days of June. I am under no illusion that Duolingo is suddenly going to allow me to converse in the language but I hope their gamification will kickstart my interest in learning Japanese so I can go back to the Pimsleur audiobooks on Audible or Genki book series.

Release an app

I did absolutely nothing this month to release my app. I spent the majority of my time writing, reading or playing video games. I won't say that means I wasted my month but I really need to find a way to motivate myself to work on this stuff. I need to find a way to convince myself that trying is not the first step towards failure and accept the fact that I am not going to write amazing code for the frameworks I want to build even if I spent months planning them.

Do not indulge in time killing activities

May was pretty much the exact same as April with respect to time killing activities. I did a decent job of keeping myself busy with either a game or a book but I still did spend too much time browsing Reddit or watching YouTube/Netflix. I've noticed I routinely say "I am tired and it is so late that there is no point starting a game or programming" and then kill time rather than being productive. I need to figure out a way so that, no matter how little time I think I have, I can pick up something and be productive. If I wait until I feel that I have a couple of hours to get deep into an activity I am never going to do anything and instead just fall back to killing time on Reddit or YouTube.

I think what I need to do is break my activities down into much smaller goals. Instead of it being "Release an app" it needs to be "write a logging framework" or maybe even smaller than that like "write the interface for the logging framework". Goals that are so explicit that even if I only have 30 minutes I should be able to make progress on them instead of just pulling out my phone and playing more Magikarp Jump. Also fuck that game and its addictive jumping Magikarps.


While May felt like a lost month June definitely feels like a step in the right direction. I think I can easily maintain everything that I did in June and if I add even just a minor bit of work towards releasing an app I think I will finally be able to count July as a truly productive month.



My gaming schedule for July thru December 2017

Now that E3 has come and gone I think it is finally safe to say we have the release dates for the vast majority of games that are going to come out in 2017. Sure there could be a couple of outliers who announce their release in the coming months but, with the size of the list I have going right now, it will be hard for me to find time for them.

Since I have been trying to play at least one new game a month in 2017 I thought it would be a good idea to list all of the games I think I will end up playing by the end of this year.

Splatoon 2 (July 21, 2017)

While Splatoon 1 was a fun game I just never really got into it. I think with the addition of a single-player mode and the ease of use of a Switch (booting up my Wii U was just painful) I think I'll get much more into this game.

Dauntless (Founder's Alpha starts August 18th, release 4th quarter 2017)

Dauntless is a free-to-play hunting game in the same vein as Monster Hunter. Players can pay for various cosmetic items or temporary boosts but the most important items in the game (crafting materials, armor and weapons) cannot be bought. Supposedly you cannot buy your way to power. You can only pay for things to make your character look more badass. The developers behind Dauntless, Phoenix Labs, have been very open about their development process so far and as a result I have incredibly high hopes for this game. It will be the first high definition hunting game in the West in almost five years.

Dauntless is offering Founder's Packs for players who want to buy into the game to get early access as well as some nice trinkets for supporting Dauntless before launch. I purchased a Founder's Pack because I really believe in what Phoenix Lab's is doing and I want to see more hunting games in the West. That means that I will get to play Dauntless on August 18th when the Founder's Alpha does live and hopefully the game will release in full in the 4th quarter of 2017.

XCOM 2: War of the Chosen (August 29, 2017)

X-COM is probably my favourite game franchise of all time and XCOM 2 was my #2 game of 2016, behind Monster Hunter Generations.

I've made dozens of attempts to beat XCOM 2 but only succeeded once so far and still had an absolute blast. I am in the middle of a Commander Ironman run which I hope will end in success before this DLC comes out and then I can jump right into another play-through with War of the Chosen.

Firaxis has talked up dozens of quality of life improvements to the core gameplay as well as the addition of several new game mechanics which should make the game even more strategic. I could not be more excited for this DLC.

Mario + Rabbids Kingdom Battle (August 29, 2017)

It's Rabbids meets Mario meets XCOM. I did not think I would have any interest in this game but after seeing some gameplay I am incredibly hyped. The only concern is how am I going to find time to play this when XCOM 2: War of the Chosen is released on the same day?

Destiny 2 (September 6, 2017)

I really want to say I will resist playing Destiny 2 but if one or two friends starting playing and ask me to jump in for a raid I would probably cave. Also who doesn't want more Cayde-6?

Marvel vs. Capcom: Infinite (September 19, 2017)

2017 is apparently the year of story driven fighting games for me and Marvel vs. Capcom: Infinite feels like it is going to pick-up where Justice 1 & 2 left off. I played a lot of Marvel vs. Capcom 2 in University and am really excited to get back into the franchise in September.

Middle-earth: Shadow of War (October 10, 2017)

Middle-earth: Shadow of Mordor was my game of the year for 2014 so I could not be more excited for Middle-earth: Shadow of War. The Nemesis system now allows players to create entire armies which they must use to assault fortress to unseat its Warchief. Everything about this game seems like they took the first and cranked it up to 11.

I was going to say that this game could get me to buy an Xbox One X but since that is not released until a month after (seriously what the fuck was Microsoft thinking) I'll probably end up getting Shadow of War for PC. I would like to play it on my couch but I think the Nemesis system and scale of the world will really benefit from my beefy gaming rig.

Super Mario Odyssey (October 27, 2017)

I was always going to play Super Mario Odyssey. There was absolutely no doubt about that. But with the new hat possession mechanic I have not been this excited about a Super Mario game since Super Mario Galaxy 1.

Wolfenstein II: The New Colossus (October 27, 2017)

I really hope I get an opportunity to play this game but I think with Super Mario Odyssey coming out the same day it is going to be really easy for it to fall under my radar.

Star Wars Battlefront 2 (November 17, 2017)

Star Wars Battlefront 2 is on this list strictly for the single-player. If it isn't good then I'm not buying. I got enough solid multi-player games to occupy me for many years already.

BattleTech (beta soon, release 4th quarter 2017)

I am a huge fan of Harebrained Schemes so their next game, BattleTech, is very much on my radar. I debated going through BackerKit to get access to the beta but there are so many games coming out this summer that I think I'll just wait until the fall to play BattleTech.


E3 2017: Best in Show

E3 2017 has come and gone and these are what I think were the best announcements made or games shown at this year's conference.

Monster Hunter World

Monster Hunter is one of my favourite franchises of all time so I could not be more excited to see it return to consoles. My first Monster Hunter game was actually Monster Hunter 3 Ultimate on the Wii U and it is still the highest resolution Monster Hunter game I have played. Don't get me wrong I loved the portability of the 3DS but it has been pretty obvious for a couple releases now that Capcom is limited by the hardware. Look at this report by Digital Foundry. That is running at 240p! While it is amazing what Capcom has done with such a low resolution and underpowered hardware (especially the particle effects) I cannot wait to play Monster Hunter at 1440p and 60 FPS.

Combine that with the fact that this is being made by the same team who made Monster Hunter 3 and 4 and I have extremely high hopes for this game. It is not going to be some one and done, flash in the pan spin-off. This is the next evolution of Monster Hunter.s

XCOM 2: War of the Chosen

XCOM 2 was my second favourite game of 2016 (beaten only by Monster Hunter Generations) so of course I am chomping at the bit to get my hands on the latest XCOM 2 DLC.

Everything I have heard makes this sound more like a total conversion mod than typical DLC. The game has been completely rebalanced and dozens of new mechanics have been added: new hero classes, rebel factions you can curry favour with, bonds between soldiers increasing (or decreasing) their fighting prowess, soldier become fatigued. And of course the Chosen are the main part of the DLC, three enemies specifically crafted by the Ethereals to hunt down the Commander. The each have their own unique powers (like the Alien Rulers from the Alien Hunters DLC) but they will level up as your game progresses and constantly be harassing you and referencing past events.

Firaxis even said that this could have been XCOM 3 but they decided to release it as DLC so I bet there is so much more in the pipe that we don't know about. August 29th can't come soon enough.

Mario + Rabbids Kingdom Battle

My love for XCOM perfectly segues into this next game, Mario + Rabbids Kingdom Battle. Some insane Italian, Davide Soliani, thought "what would happen if I took Ubisoft's Rabbids mixed them with the Super Mario universe and used XCOM's game mechanics?" Well Davide, you get a pretty fucking kickass game is what you get.

This game looks absolutely bonkers. The announcement trailer sets the tone for how kooky this game is going to be (Rabbids taking selfies, Mario with a gun) and this boss battle gives you an idea of how incredibly deep the strategy in this game could go. Honestly, the only problem with this game is that it comes out on the exact same day as XCOM 2: War of the Chosen. Maybe I need to take a staycation that week?


Bioware finally revealed Anthem and holy shit does it look good. It seems like Bioware's take on Destiny which is something I thought I would never say. The gameplay looks way beyond what you would expect from a narrative driven studio like Bioware. I am very much interested in hearing what the story is and how it integrates into the gameplay we saw. This is Bioware after all so I cannot imagine them making a game that doesn't focus heavily on the story.

Super Mario Odyssey

The main gameplay mechanic of Super Mario Odyssey was finally revealed and it is that Mario can possess nearly anything by throwing his hat at it. I love the potential that this brings. Nintendo can now deviate so far from the standard Mario power-ups. He possessed both a tank and a t-rex in that trailer for fucks sake! I was already pretty interested in Super Mario Odyssey but I was not expecting something like this. The original reveal trailer looked very pretty but gameplay seemed fairly standard, which isn't a bad thing. I'm sure that kind of Mario game would still be fun because of the polish Nintendo would have put into it. But with this possession mechanic they can literally do anything. Entire mini-games that we would never expect to see in a Mario game are now possible.


While I was expecting a Spider-Man reveal I was not expecting that level of polish. The combat looked fun, the traversal looked fluid and the story had an amazing cinematic feel. I honestly was not expecting much from Insomniac going into this but they have gained my attention.

A Way Out

I love the idea of story driven game that HAS to be played co-op. It is a bold idea and I am interested in seeing how it plays out in practice. Playing a pair of prisoners who have to work together to escape from jail is also an amazing backdrop for a game like this.

Wolfenstein II: The New Colossus

The original Wolfenstein slipped under my radar but I hope that won't happen with the second one. That trailer gives me a lot of hope for the writing and characters of this game. Looks like a great mix of action und comedy and with the id Tech engine I'm sure the gunplay is going to be spot on.

Dragon Ball FighterZ

I am a huge fan of the Dragon Ball Z: Budokai series so I thought my eyes were deceiving me when a trailer came on during the Microsoft conference for another Dragon Ball Z fighting game that wasn't 3D. Holy shit does this game looks amazing. It truly looks like you are playing the anime and when you watch gameplay like this or this you realize that they truly have done it.

Metroid: Samus Returns

This was such a strange reveal. Nintendo chose to not show this in their presentation and instead just drop it casually during their Treehouse stream. Apparently it is a remake of Metroid II: Return of Samus. I am a big fan of side-scrolling Metroid games but dear god the 3DS visuals are really rough. I honestly think it being a more stylized 2D game would have been better than this low-res 3D version.

Middle-earth: Shadow of War

I feel kinda guilty putting Middle-earth: Shadow of War on this list because it got a lot of press before the show but fuck it I am so hyped for this game. I want to make sure everyone hears about it because it is undoubtably going to be competing for my game of the year.

Xbox One X

Microsoft announced another $500 console. Did Vaas never tell them the definition of insanity?



E3 2017: Nintendo Spotlight

C'mon Monster Hunter XX localization announcement! That is literally all Nintendo has to do for me to consider this a success.

Xenoblade Chronicles 2

I tried to play Xenoblade Chronicles 3D but the story and combat did just not grab me. I played it for a good 20 hours hoping it would get better and then one day I put it down and forgot to pick it back up again.

Xenoblade Chronicles 2 doesn't look that much different. I'll definitely be paying attention to the reviews because there really aren't any RPGs coming out for the Switch but good lord it is going to be hard to overlook that bad voice acting.


A new 2D side scrolling Kirby game for the Switch. The trailer looks pretty good so I'll definitely keep this on my radar.

Pokken Tournament Deluxe

I never played the original so I highly doubt I will play Pokken Tournament Deluxe.

Metroid Prime 4

I guess a 43 second "trailer" for Metroid Prime 4 is better than nothing? I am surprised that they are continuing with the Prime franchise rather than spin something else off. It will be interesting to see exactly what makes it a "Prime" game.


Very similar to Kirby, this new Yoshi game looks like it could be a lot of fun. Playing with the depth of the levels could be a blast. My major fear right now is that it looks like it may be a bit too simplistic but if it is meant for young children then I think this game looks perfect.

Fire Emblem Warriors

Nintendo seems to be big on licensing their major franchises for musou games and Fire Emblem seems to be the next one to get the treatment. Personally I'm no longer a fan of these types of games. I wore myself out with Dynasty Warriors a long time ago so I'll probably pass on Fire Emblem Warriors.

The Legend of Zelda: Breath of the Wild DLC

Honestly, the majority of this stuff looks like it could have been in the main game. I don't see any reason to buy the expansion pass to get access this. I was hoping for more involved dungeons like previous Zelda games.

It is obvious that I am in the minority who prefers the old Zelda games so maybe I'll just go buy Majora's Mask and relive my youth.

Mario + Rabbids Kingdom Battle

I linked the announcement trailer yesterday and nothing new was revealed during this presentation but I am still so fucking excited for this. During the Nintendo Treehouse stream they showed off a boss battle to give you a better idea of what the gameplay will be like.

Rocket League

Rocket League is coming to the Switch. There really isn't much more to say other than it will feature cross-network play so you can kick it with your buddies on PC and PSN.

Super Mario Odyssey

The Super Mario Odyssey game trailer was probably one of the most interesting presentations because it finally showed the major hook of the game. Mario can throw his hat and possess seemingly anything in the world. Goombas, frogs, Bullet Bills, rockets, Cheep Cheeps and of course a tyrannosaurus rex. I was already pretty stoked for this game but to see such a departure from the standard Mario power-ups I am even more excited to get my hands on this in the fall.


And that was it. The Nintendo Spotlight was barely 30 minutes long and showcased more of the games that were announced at the same time as the Switch as well as reveal a good number of new games.

I come out of this presentation still excited for Mario + Rabbids Kingdom Battle and Super Mario Odyssey but lukewarm on most other games. I'm sure I'll play and enjoy some of them but the way they were showcased here just didn't get me that interested. At least not to the point where I am chomping at the bit for them to come out. I'm sure games like Kirby, Yoshi and Xenoblade Chronicles 2 will just sneak up on me and suddenly they will be out where Mario cannot come soon enough.

However like I said at the beginning, all Nintendo had to do was announce a localization of Monster Hunter XX and they did not so I must consider this presentation an absolute failure. It looks like Nintendo has relinquished their control on Monster Hunter in the West and is letting Capcom take over and go multi-platform. I can't say I am disappointed about that but I was really looking forward to have a nice looking portable Monster Hunter game again.