Category: Technology

  • 2021: Complete projects, current projects, and beyond!

    2021: Complete projects, current projects, and beyond!

    It looks like it has been about 2 months since my last post 😬! November and December were crazy months for me in both my work and personal life. 2020 kept coming until the bitter end…

    When I wasn’t up to my eyebrows in work, I carved out some time to finally work on and complete the multiplayer board game I had been working on since September:

    Image of the Cavatars Thumbnail from GitHub

    Cavatars (Codenames with Avatars – clever I know) is a fully functioning multiplayer game playable in a web browser. I developed it in JavaScript using NodeJS, Socket.io, and Phaser3. The full source code is on GitHub:

    https://github.com/rfaile313/cavatars-game

    It’s not the greatest thing I’ve ever written but it plays like it was intended. What I was most surprised about when testing it with friends was how well the latency responded across multiple states. We had players in California, Texas, and Nevada with the server being located in San Francisco, and there was no visible lag:

    Cavatars’ maiden voyage 🚢

    Far more importantly though, the project allowed me to meet all of the goals I set when I started this project. All of the decisions I made when developing the game were for specific purposes:

    • Far greater proficiency in JavaScript, which I considered my weakest language at the time.
    • Better understanding of multiplayer gaming, client/server network architecture.
    • Learn Phaser3, a framework I have never used before.

    As one of my friends pointed out, there is no real purpose to the movement of the characters other than the fact it was to hone in on the movement for later projects down the road – which brings me into some of the stuff I have on the table for 2021.

    Building on the art kit I purchased and set of skills I developed to finish Cavatars, I have decided to start working on some other, longer term projects:

    1. Working on a Final Fantasy Tactics type game with my friend Travis. The game is yet to be named and we are in the very early stages. Travis brings a wealth of game knowledge and experience to the table and will handle most of the mechanics, balance, and lore. I will be handling all systems, programming, and development.
    2. Working on a longer term MMO passion project. These sprites and this art kit are perfect to put something like that together, so why not. There aren’t many 2D mmos that have come out in recent memory, so the idea of chipping away at one over the next few years seems exciting!
    3. Working on a smaller game to ship earlier, I’m thinking about a 1v1 multiplayer PVP arena type game.

    Aside from that, I reached out to The Greater Gaming Society of San Antonio which is a game development community in San Antonio that apparently has some folks participating in the upcoming Global Game Jam taking place this week, January 27-31. With any luck I’ll be able to connect with a team and follow up with a post about my experience 🙂

    Until next time…

  • Conference: Handmade Seattle 2020

    Conference: Handmade Seattle 2020

    Table of Contents:
    Intro
    Speakers Day 1
    Freya Holmér
    Nuno Leiria
    Joey de Vries
    Ramón Santamaría
    Elizabeth Baumel
    Andrew Kelley, Ginger Bill, Joshua Huelsman
    Speakers Day 2
    Gal Zaban
    Vegard Nossum
    Hannah Gamiel, Eric A. Anderson
    Randy Gaul
    Abner Coimbre
    Allen Webster, Ryan Fleury
    Project Demos
    Ripcord
    WhiteBox
    SYZYGY
    Footnotes

    I spent this past weekend attending Handmade Seattle which is an independent, low level programming conference. It is usually held in Seattle but due to the ongoing COVID-19 pandemic, this year’s conference was held online.

    First things first: wow. I was blown away.

    I was really impressed at the quality of speakers and the content they brought to the table. It never ceases to amaze me how many smart folks are out there deep diving into complicated topics and sharing what they learn with the rest of us. Huge kudos as well to Abner Coimbre for organizing the event and the job he did facilitating as its host. Abner did a fantastic job of being professional and informed with the topics he discussed with the speakers while managing to keep it real in true indie fashion 😎.

    Some of the talks were interviews between the speakers and the host, some were pre-recorded presentations or podcasts, but all ended with a Q&A with the speakers where all ticket holders were able to engage directly with the speakers using a private Matrix chat for which an invite was sent upon ticket purchase. It was really cool to see Matrix used like this in the wild, especially as it’s a project that my company recently invested millions into. I love the idea of this open, decentralized communication platform of the future. If you do too, we’re hiring engineers to help bring Matrix to Automattic 😊.

    Without further ado – I have included a list of the speakers below with a brief take on some of their topics with links to where you can check out more of what some of these folks are doing.

    Speakers: Day 1, November 14th 2020

    Freya Holmér
    Indie Game Dev – Developing Shader Expertise

    This was my first exposure to Freya as I haven’t dipped many toes into the shader world but oh. my. god. This is the person that accidentally created the industry standard shader editor for the biggest game engine in 2014?

    What a way to kick off this conference. Freya spoke heavily to the value in focusing on one thing and really digging down. In that, however, she emphasized a few points that I think is fantastic advice in general:

    1. Only learn the things you need to learn to do what you need to do.
    2. Don’t try to step into dozens of different topics, drill down and master one.
    3. Laser focus on one thing will result in getting more done faster.

    I love this because it’s a super common problem in the tech world and for learning in general. You start working on a project, but there is so much to learn that it’s easy to get distracted or never progress because you start looking into the various adjacent technologies. You end up becoming okay at the basics in a dozen technologies but have no deep understanding required to truly innovate.

    By the way, her YouTube channel is so good. Among other things, she has a dedicated series called “Math for Game Devs” which will make you a better game developer.

    References:
    https://acegikmo.com/


    Nuno Leiria
    Polystream Senior Engineer – Modern CPU Optimizations: From the kernel to the cloud

    This was so good. I know I probably sound like a broken record, but wow. Here was a AAA production solve for a performance bottleneck. The first obstacle had all of us laughing. Whoever had “Adobe Updater on the Server” on their systems bingo card, cash in that ticket!

    Beyond that, Nuno orchestrated a deep dive into performance profiling. On this particular project, he and his team went so deep into the matrix that they ended up discovering a bug in the Microsoft kernel. What’s more, they were able to provide specific enough information to have that bug patched, fixing their application.

    Yes, I couldn’t believe Microsoft actually patched a kernel bug either 😊.

    References:
    https://twitter.com/nunopleiria
    Full list of profiling tools at the bottom of this post1


    Joey de Vries
    Author – The History behind learnopengl.com

    Really great talk about the history behind learnopengl.com and how Joey ended up starting what many to be the definitive resource behind learning what is basically the industry standard in graphics rendering.

    Joey also has a new book: Learn OpenGL: Learn Modern OpenGL Graphics Programming in a Step-by-step Fashion which I will definitely be picking up!

    References:
    https://learnopengl.com/
    Book: Learn OpenGL: Learn Modern OpenGL Graphics Programming in a Step-by-step Fashion


    Ramón Santamaría
    Epic MegaGrants Recipient – Developing a Handmade Mindset for raylib

    This guy. I have pretty much been Ramón’s self-proclaimed #1 fan for about a year now, and I knew that this talk was going to be amazing but holy moly.

    How do you make an entrance into an indie programming conference? How about starting your presentation by compiling it from vanilla C source to web live using the software you wrote.

    Do you think it stopped there? Um…..

    I can fit on zero hands the amount of folks that thought guitar, cooking, and tree pruning would be the core tenants of a software conference talk.

    Ramón expertly translated how he applied these three passions from his life to his approach to software development. I won’t be able to give this talk its due justice here, so I highly recommend checking out the recorded video.

    References:
    https://www.raylib.com/


    Elizabeth Baumel
    Unity3D Engineer – You CAN Teach an Old Programmer New Paradigms!

    Data Oriented Design. This is the content I purchased my ticket for. Elizabeth teaches DOD for a living and expertly broke down components of DOD using various worksheets throughout her talk:

    This is my favorite software presentation slide ever:

    Slap 👏 that 👏 shit 👏 together 👏 — PREACH!

    References:
    https://twitter.com/icetigris


    Andrew Kelley, Ginger Bill, Joshua Huelsman
    Compiler Writers – The Race to Replace C and C++

    Excellent podcast between uber smart developers who work heavily with compilers and bring different perspectives to the table. Bill is the creator of the Odin Programming Language and converted many of his strong opinions into actions into his programming language. Josh is the creator of the Jiyu programming language and also worked on Johnathan Blow‘s upcoming Jai Language at Thekla. Andrew is the creator of the Zig Programming language. Abner keeps everything in order 😊.

    References:
    https://twitter.com/andy_kelley
    https://twitter.com/thegingerbill
    https://twitter.com/machinamentum

    Speakers: Day 2, November 15th 2020

    Gal Zaban
    Security Researcher – Linux Kernel Adventures: Reversing & Exploiting a Linux Driver

    🤯. A very humbling talk about exploiting systems via kernel device drivers. Gal’s talk goes deep into the matrix, discussing and breaking down ioctl syscalls in depth.

    This is one of those talks I’ll need to watch again….more than once 😅.

    References:
    https://twitter.com/0xgalz


    Vegard Nossum
    Kernel Developer – Parallelisation in the Linux Kernel

    Outstanding presentation from a true legend in the space. Check out this rig that his friend built:

    This is a computer with 6,144 cores. Yes, Linux supports this.

    As a point of reference, Windows supports a max of 256 cores.

    Linux Parallelism is state-of-the-art

    Vegard Nossum

    This talk perfectly covered the topics required to understand parallelism without going too deep into the rabbit hole on each branch (note: it is easy to do this). This is another talk I’m not capable of delivering justice to and highly recommend checking out Vegard’s work, white paper, and the talk itself.

    References:
    https://twitter.com/vegard_no
    White Paper – Ksplice: Automatic Rebootless Kernel Updates
    White Paper – Compact NUMA-aware Locks


    Hannah Gamiel & Eric A. Anderson
    Myst VR Directors – Cyan, Inc.

    Myst is upcoming VR game – but you already knew that. This interview was a cool chat between Abner and the directors of the project.

    One recurring topic in the podcast was the obstacles encountered via a sudden switch to remote work during the global pandemic. In the private chat I told Hannah she could reach out if she wanted some insight on some best practices, as I know a few folks who set the gold standard for remote work 😏.

    Other than that, it was just super cool getting a behind the scenes look at the folks @ Cyan and how they approached work on Myst and their transition to remote.

    References:
    Myst on Steam


    Randy Gaul
    Microsoft Engineer; Cute Headers

    Randy is a legend in the low level programming game space. If you’ve ever worked in this area you know about the Cute Header Libraries.

    This talk highlighted how good these small and useful libraries actually are and referenced future improvements I wasn’t even aware of, like networking libraries supporting both TCP and UDP. He also laid out the roadmap for the project and what we can expect to be released within the next year or so. It’s always cool to know awesome projects are under active development working towards features everyone wants 😀.

    References:
    https://github.com/RandyGaul/cute_headers
    https://twitter.com/randypgaul


    Abner Coimbre
    System Software Engineer – A New Terminal Emulator

    I was super looking forward to this as I basically live in the terminal, but it was postponed and totally understandably so. Abner has a working demo and is ready to present but was working so hard to host and keep everything organized that he chose to delay this a bit. Respect.

    References:
    https://twitter.com/AbnerCoimbre
    https://www.handmade-seattle.com


    Allen Webster, Ryan Fleury
    The How And Why Of Reinventing The Wheel / (Introduction To Dion)

    DION

    DION

    DION!!

    It turns out the hype was worth the wait as Allen and Ryan revealed Dion to the world in a big way.

    These guys weren’t kidding about reinventing the wheel. Imagine programming as you know it re imagined. When writing this I had a really hard time defining everything I was seeing, so I’ll let Ryan share his take:

    Dion is our experiment at a new iteration of what it means to program. Our existing programming tools are hamstrung, and it shows; they are often dumber, slower, and more difficult to use than it feels like they should be. We (Dion Systems) have a theory about why that is, and we’re focused in on demonstrating what we think is the solution.

    Dion aims to be an entire computing environment with one key tweak to the architecture of the programming systems we’re familiar with. Instead of storing code as text files, we store it as a more direct, structured representation that more closely maps to a traditional abstract syntax tree (which is a data structure that a compiler, for example, will use to store extracted semantic information from code).

    Instead of storing code as text files, we store it as a more direct, structured representation that more closely maps to a traditional abstract syntax tree

    This key tweak opens many doors. We now have the freedom to render code in different ways, achieve much smarter tools with much less effort, iterate on the user-interface and user-experience of the programmer, surface more sophisticated information about code, provide more insight for experts, improve the educational experience for beginners, and more, all with much less work.

    We’re not done with our experiment, and our demo is just a first glimpse into the kind of future that rethinking the architecture of our programming environments can bring, but we’re really excited with what we’ve found so far, and wanted to share that vision with the Handmade community.

    our demo is just a first glimpse into the kind of future that rethinking the architecture of our programming environments can bring

    There were too many “omg” moments for me to count but a few include:

    • All functions/procedures can be built by themselves.
    • How you view the code is up to you. Inline braces, newline braces, no braces, it’s all on the table.
    • Instant feedback on changes, errors, etc. The system knows not to build until something is fixed.
    • Zooming in and out on code granularity. This is crazy to watch. You can look at all definitions and calls, or just the calls or definitions.
    • Function arguments, variable declarations update their references instantly. By the way, this isn’t matching a string to do it. What? 🤯

    I’m so excited to see where this project goes. There are a few hurdles the team will need to overcome (e.g. version control) – but there are more possibilities than there are obstacles…. you can count on that.

    References:
    https://twitter.com/DionSystems
    https://twitter.com/ryanjfleury
    https://twitter.com/AllenWebster4th
    https://twitter.com/debiatan


    All of these talks were recorded and will be available soon at: https://www.handmade-seattle.com/


    Bonus!

    Between the interviews, there were “5 minute indie demos” which showcased some extremely interesting up-and-coming projects. Here were a couple that stood out to me:

    Ripcord

    This is one of the coolest cross-platform chat clients I’ve seen in a long time. It reminds me a lot of the old Trillian days. Remember Trillian? It would bring your AIM/ICQ/IRC convos into a single client.

    Built in qt, it is a program designed to bring all of your various modern-day chat programs into one place in a localized client – without needing four 2GB electron apps murdering all of your CPU and RAM.

    From the website, check out some of the features (emphasis mine):

    Features

    • Not made from a web browser
    • Tabs
    • Multiple windows
    • Multiple accounts
    • Voice chat (Discord OK, Slack WIP)
    • Graphical emoji and custom emoji
    • Tab completion for user names and emoji
    • Customizable fonts, colors, and sizes
    • Custom bookmark lists for easily accessing only the channels you actually use
    • Variable DPI and multi-monitor support
    • Low CPU and memory usage
    • Zero GPU usage
    • No tracking or analytics
    • No installer or forced updates

    Here are some screenshots of the software:

    I’m already tooling around with this, and really excited to see how this project evolves!

    WhiteBox

    A really cool tool that compiles, runs, and debugs real time as you write code 😲. Is there more to say? Check it out below:

    SYZYGY

    Syzygy is a crazy cool puzzle game which uses topology deformations as a game mechanic. I haven’t seen something like this before.

    Get it here on Steam. Releasing 20 November 2020 (this Friday!)


    Footnotes:

    1Full list of profiling tools from Nuno Leiria’s talk

    System wide profiling tools:
    https://developer.nvidia.com/nsight-systems
    https://docs.microsoft.com/en-us/windows-hardware/test/wpt/
    https://github.com/google/UIforETW

    GPU profiling:
    https://gpuopen.com/rgp/
    https://developer.nvidia.com/nsight-graphics
    https://software.intel.com/content/www/us/en/develop/tools/graphics-performance-analyzers.html

    Sampling/Instrumented profilers:
    http://www.codersnotes.com/sleepy/
    https://superluminal.eu/
    https://github.com/wolfpld/tracy
    https://github.com/Celtoys/Remotery
    https://github.com/jonasmr/microprofile
    https://www.puredevsoftware.com/framepro/index.htm

    Micro-architecture profilers:
    https://software.intel.com/content/www/us/en/develop/tools/vtune-profiler.html
    https://developer.amd.com/amd-uprof/NVIDIA Nsight Systems

  • Draw! is now Open Source

    Draw! is now Open Source

    Howdy everyone!

    After working on Draw! for a couple of months, then reaching the logical end of the purpose of making it (ship something using C and raylib) I have decided after publishing the game on the web last week, to open source the code on GitHub under the very permissive MIT License.

    The code lives here: https://github.com/rfaile313/draw_game
    You can play the game here: https://draw.rudyfaile.com/

    The code has always been on GitHub, but has lived in a private repository which is now public. The code itself isn’t the finest example of best practices programming or game development programming, but there is a single dependency (raylib) and I can say with confidence that I wrote every line of the code from scratch. There are also some live videos out there for most of the development process.

    I also wrote successful build scripts to four platforms: Windows, GNU/Linux, MacOS, and Web (HTML5/WASM). It’s never code I’ll look back on and think is great, but it *is* code that I’m proud to have written. It also served its purpose: make a small game from scratch in C programming, and learn and use raylib.

    Speaking of raylib, @raysan5 was just awarded an Epic Games MegaGrant:

    I couldn’t be more happy for @raysan5 and his project. He is a great developer, nice person, and is totally deserving of this awesome recognition!

    Back to the code. My hopes in making it open source is that folks learning C programming or raylib can have another source of reference for a working, published game. Perhaps someone will even fork the project and improve on it, isn’t open source amazing? 😁

    What’s next for me? Well, I have a few things on my plate at the moment. There are some work projects that are taking up the bulk of my time, but in addition to that, I plan on participating in Miziziziz‘s 48 hour game jam in four days. I was thinking about using Godot for the first time in this jam to learn it, but I also might use C and Raylib 😁. The concept of these jams that Miziziziz does is pretty cool: multiple game developers use the same art kit and have 48 hours to create a game with it. Here’s an example:

    Aside from that, I have been working to stay healthy and sane during these unprecedented times. Exercising a bit and trying to stay sharp and productive – I have also been playing a little bit of Starcraft2 and Hearthstone after a long, long break from gaming in general 😊.

    After the game jam, I was thinking about starting my next big project/game to chip away at for a long time. I have some ideas, and I’m thinking about an RPG/Roguelike as the general idea, but hopefully completely different than anything anyone’s seen before. I have some ideas 🤠.

  • Draw! is now playable

    Draw! is now playable

    I decided to port the game I have been working on when I have free time to the web so that anyone can check it out. It’s a simple wild west duel game inspired by Quick Draw from the original Kirby’s Adventure on NES.

    Anyone can play the game here:

    https://draw.rudyfaile.com

    If you want to check out a few videos of me working on the game (even the actual compiling for web!) check these out:

    Have fun!

  • Building an “easy” web application

    Building an “easy” web application

    I decided to spend my Fourth of July weekend transforming a small Python utility I wrote a couple of years ago for work. The idea was simple: make the tool more accessible for co-workers who use it by turning it into a web application.

    The premise of the tool is extremely simple. It automates the sending of multiple cURL requests to a WordPress site’s xmlrpc.php file with some extra QOL features.

    The purpose of automating the sending of multiple requests is that a single cURL request may succeed, but the WordPress mobile app and Jetpack do not make single requests – they make many requests and need to be in constant communication with that file. A single request might succeed, but many can fail due to rate limiting, bandwidth or other hosting limitations. It is impossible to fully diagnose a possible XML-RPC issue without performing a test like this.

    The utility works just fine, but I thought converting it to a web app would make it easier for folks to use. My first thought was to simply write a PHP script to make the POST request then return the results to the client. It probably would have taken all of 30 minutes but I thought “nah that’s too much work for a simple app….” So I thought I’ll just port the Python script into a web app using a Python web framework. Django is far too much for something like this, so I started looking at Flask. Even Flask seemed a bit overkill for a one-file project; thankfully there’s Bottle which is a “micro-framework” similar to Flask.

    I decided to spin up a Bottle app which is ridiculously easy and had a working version of the script running on a web page in about an hour.

    It worked just fine, but I wasn’t sure I liked the idea that the user would have to wait during the request for the script to complete all n number of requests before the results page loaded. I also thought that JavaScript might be a better solution in general: I could just make the requests via JavaScript and append the results to the DOM as they came in. I wouldn’t even need a server component. It would be so simple…

    The first thing I did was re-write the request using JavaScript’s Fetch API. This took a little while because I needed to refresh on Async Functions and Promises. I feel like every time I look at JavaScript it’s different 😭. After translating the request to a JavaScript acceptable request:

    let mySite = document.getElementById('siteURL');
        
        let myRequest = await fetch(mySite, {
            headers: {
                "Content-Type": "text/xml",
                "User-Agent": "Jetpack by WordPress.com",
            },
            body : '<?xml version="1.0"?><methodCall><methodName>demo.sayHello</methodName><params></params></methodCall>',
            method: "POST",
        });

    The next step was to wrap it into an Async function for looping:

    const MyAsyncFunc = async () => {
    event.preventDefault(); //don't reload the page
    }

    And then wrap the previous code into a loop and append the results to the DOM.

    const MyAsyncFunc = async () => {
    event.preventDefault(); //don't reload the page
    
      for (let i = 0; i < 50; i++){
        
        let mySite = document.getElementById('siteURL');
        
        let myRequest = await fetch(mySite, {
            headers: {
                "Content-Type": "text/xml",
                "User-Agent": "Jetpack by WordPress.com",
            },
            body : "<?xml version=1.0?><methodCall><methodName>demo.sayHello</methodName><params></params></methodCall>",
            method: "POST",
        });
    
        //console.log("Request #" + i + "HTTP Response: " + myRequest.status + " " + myRequest.statusText);
    
        document.getElementById("results").innerHTML += `<div>${"Request # " + (i + 1) + " | HTTP Response: " + myRequest.status + " " + myRequest.statusText}</div>`;
        }
    }

    This worked GREAT except:

    The request was coming from a different origin than the server, so it was blocked by CORS which is a security feature imposed by all modern browsers. From the wiki:

    Cross-origin resource sharing (CORS) is a mechanism that allows restricted resources on a web page to be requested from another domain outside the domain from which the first resource was served.

    A web page may freely embed cross-origin images, stylesheets, scripts, iframes, and videos. Certain “cross-domain” requests, notably Ajax requests, are forbidden by default by the same-origin security policy. CORS defines a way in which a browser and server can interact to determine whether it is safe to allow the cross-origin request. It allows for more freedom and functionality than purely same-origin requests, but is more secure than simply allowing all cross-origin requests.

    Cross-origin resource sharing

    Shit. I was never going to be able to be in control of the server from which the client request originated, since this tool in essence needs to be able to query any WordPress site. I understand the security implementations, but was kind of frustrated. I could get exactly what I needed in one cURL request, now I had to find a way to work around this. After some discussion on the Handmade Network, I confirmed that the request could be made from node or another tool on the server where CORS doesn’t exist for the request to the target WordPress site, and I would control the CORS between the client and the server.

    This quickly became more complicated than it needed to be. I could have just run the information through the back end and load it into a new route but that would be just like the Python solution. The idea was to run the request async and append the results to the DOM.

    Of course, the actual request would look something like this:

    Except it’s even more complicated because you can’t just pass something to the server like that and get it back asynchronously…. you have to set up an API! So I set up a small REST API to receive a GET request appended to the URL as the URL. Then sent that URL off in a fetch request, then sent the promise back to the client as the response data:

    app.get("/:url", (req, res, next) => {
        var recievedURL = req.params.url;
        console.log("Got URL: " + recievedURL);
        fetch(recievedURL, {
            headers: {
                "Content-Type": "text/xml",
                "User-Agent": "Jetpack by WordPress.com",
            },
            body : '<?xml version="1.0"?><methodCall><methodName>demo.sayHello</methodName><params></params></methodCall>',
            method: "POST",
            mode: "cors"
        }).then(data => res.send(data));
        console.log("Sent Data");
    });

    Yeah, it was messy as shit. It was also getting harder and harder to debug as JavaScript has no timeout functionality I would have had to wrap that request in another promise. It was all just so needlessly complicated and frustrating. I kept going back to my command line and running that single cURL request, getting exactly what I needed, and getting pissed.

    Ultimately I decided that the node app + REST API was just more trouble than it was worth. Two packages installed and I had a bloaty node_modules directory with 73 folders and 335 files.

    I hate node.

    Ultimately I said “screw it” and decided the whole API approach for this one-page app was WAY more trouble than it was worth. I would have had to maintain the client, server, and node packages because you know those things have to be updated every 9 minutes or you have a security vulnerability 🙄.

    So, 72 hours later and I was back to where I started, with my simple yet effective one file bottle app. The source is 6kb and can handle what it needs to, the error logging is verbose and it works how I expect it to. The tradeoff? People have to wait 1-30 seconds for the request to complete or timeout, so I added a GIF to help them with the wait:

    Three days wasted. I should have just written the PHP script 😢.

    My friend & co-worker Brooke helped put some simple styling on it (also helped with my workout program design) and I think the final result looks pretty sleek:

    I also got to do all of the fun systems stuff like remember how Apache works, update certbot from ACME v1, and play with the virtual hosts file which is always a good time.

    I spent some serious time on input sanitation and error catching, so it should be interesting to see how people break it 🙂

  • Free game assets

    While working on DRAW! I decided to commission a few artists on Fiverr to create the art assets. My idea was to commission about ~5 different artists and choose my favorite as art for the game. After about a week I decided to use assets from the very talented @penzilladraws who is an incredible Danish artist and was very easy to work with. While I ended up using this art in the game and won’t be directly sharing the assets here, I encourage you to check out their work on Fiverr and other places. Here is a screenshot of what the assets look like put together in my game:

    The other four artists made great work as well, but I didn’t end up using it in the final project. I have never been a fan of mixed and matched assets, but I also don’t want to leave this hard work sitting on my desktop in a folder called “Fiverr stuff I’m never going to use” so I have decided to share the art here for anyone to use 😊.

    1) @surajrenuka

    Examples:

    Individual Background Assets:

    Character Sprite Sheets:

    GIFs of the character sprites:

    2) @diegorago138

    Example:

    Background Assets:

    Sprite Sheet:

    GIFs:

    3) @dara90

    Example:

    Sprite Sheet:

    GIFs:

    4) @heart_container

    The only asset is a single sprite sheet:

    I hope you enjoy and check out these awesome artists on Fiverr and other places.

  • The Krimm

    With 2020 leaving me unsure if the Mayans were off by eight years, I have been doing whatever I can to stay busy. Aside from pouring myself into work, I have been working on my small game Draw! and tackling my project backlog.

    One of the things my wife used to subscribe to was something called “The Skimm”. The Skimm was basically an aggregation of news that would get emailed to you every day. She really liked it, but I thought I could make something better for her. This was in 2015 so in true husband fashion, I took care of it in 2020.

    Introducing, the Krimm

    The Krimm (Kristen + Rudy Skimm) is similar to the Skimm, except heavily customized to my wife’s liking. Every morning at 8:30am, she gets an email with the top three news stories in each category she’s interested in, which includes a summary and a link to the full story. What I like in particular is the sources tend to be diversified, and the lack of images allows me to fit more information on the screen and her to be more objective as she’s choosing which stories look interesting hopefully based on substance rather than imagery.

    How does it work?

    It’s very simple. All I did was SSH into one of my servers and install Jarun’s “googler” utility which I use often and highly recommend. One of the flags on the library is to pull results from news sources only. Perfect.

    From there, I made two simple bash scripts. One to run the utility for what she wants:

    simplicity scales

    and a one-liner to send the content of the generated text file to our emails with the subject “Today’s Krimm! 2020-06-01” (or whatever the date is 🙂) using postfix.

    So, pretty simple. From there I set up a simple cron to run the make_file script at 8:29am at our local time in the system’s time and then I fire off the postfix email script at 8:30am.

    So now, every day at 8:30am my wife gets a customized news feed from Google news consisting of the top 3 stories in the world from different sources based on keywords she’s interested in:

    That’s it?

    That’s it. It took me about an hour start to finish to hack this together, and she is satisfied with the result. I subscribed myself as well because well, hey, it’s pretty useful!

    What else have you been doing?

    Trying to stay sane. I have a really nice post in the works that I’ve been meaning to make about an enlightening conversation I had with one of my co-workers at Automattic. In the meantime, I also had the pleasure of interviewing the lead of the Handmade Network on their podcast:

    Which was very insightful and a lot of fun! Highly recommend the Handmade Network as always. Catch my post on Handmade here.

  • Custom Game Engines: A Small Study

    Author: Ramon Santamaria @Raysan5

    Edits: Rudy Faile @rudyfaile

    Original Text | Posted here with Author’s permission.

    a_plague_tale

    A couple of weeks ago I played (and finished) A Plague Tale, a game by Asobo Studio. I was really captivated by the game, not only by the beautiful graphics but also by the story and the locations in the game. I decided to investigate a bit about the game and I was surprised to see it was developed with a custom engine by a relatively small studio. I know there are lots of companies using custom engines but it’s very difficult to find a detailed market study with that kind of information curated and updated. So I decided to write this article.

    Nowadays a lot of companies choose engines like Unreal or Unity for their games (or rather, that’s what people think) because developing a custom AAA level engine requires lots of resources. I decided to list here some of the most popular custom engines with the team-sizes and notable titles released with those engines.

    Most of the engines listed here have been developed along the years with multiple iterations and multiple video games, those engines have gone through multiple versions or even complete (or semi-complete) rewrites from scratch, with an engine name change. Also, important to note, most of those engines use multiple middle-ware for specific functionalities (Platform, Physics, Network, Vegetation, UI, Rendering, Audio…).

    *Author’s Note: I tried to be as much accurate as possible with the information about the employees count (I checked the companies websites, Wikipedia or even the company LinkedIn) but take it with a grain of salt (some employees numbers could not be up to date).

    The BIG Companies

    *From left to right: Assassin’s Creed Odyssey, Final Fantasy XV, Red Dead Redemption 2

    The below list is for very large companies, sometimes with complex corporate structures comprising multiple divisions (not only focused on video games) and multiple studios/subsidiaries also developing games. Some of them work with multiple engines, not only custom ones but also licensed ones.

    CompanyEmployeesStudiosEngine(s)Notable Games
    Activision/Blizzard~9200~9custom engine(s)Call of Duty series, Overwatch, Starcraft II, World of Warcraft
    Electronic Arts~9300~36Frostbite 3Star Wars Battlefront II, Anthem, Battlefield 1/V, FIFA 20, Need for Speed series
    Ubisoft~16000~54AnvilNext 2.0Assassin’s Creed series
    UbiArt FrameworkRayman Legends, Child of Light, Valiant Hearts
    SnowdropTom Clancy’s The Division 2, The Settlers
    Capcom+2800~15MT FrameworkMonster Hunter: World
    RE EngineResident Evil 7, Devil May Cry 5, RE2:Remake, RE3:Remake
    Konami+10000~30Fox EnginePro Evolution Soccer series
    Square Enix+4600~18Luminous StudioFinal Fantasy XV
    Nintendo+6100~8custom engine(s)Zelda: BOTW, Mario Odyssey
    Rockstar+2000~9RAGE engineGTA V, Red Dead Redemption 2
    Epic+1000~11Unreal Engine 4Fortnite

    The companies above invested in custom engines to have full control over the technology and also avoid the revenue cut imposed by licensed engines. Despite that fact, there are some big companies that in the latest years have chosen Unreal Engine for their productions, the most notable cases are:

    1. Capcom is using Unreal Engine for the new Street Fighter IV/V titles
    2. Bandai Namco latest big titles are using Unreal: Jump Force, Dragon Ball Fighter Z, Dragon Ball Z: Kakarot, Tales of Arise
    3. Square Enix also moved to Unreal Engine for several new titles: Dragon Quest XI, Kingdom Hearts III, Final Fantasy VII Remake

    Interesting to see that those big three are Japaneses companies, maybe a market trend for that country? Also, maybe related (or maybe not), the Chinese holding Tencent owns 40% of Epic Games, I bet it has some influence in the Asian market.

    Middle-size Studios

    *From left to right: Rise of the Tomb Raider, Uncharted 4, A Plague Tale

    Here we have the medium-small companies that decided to create custom technology for their titles.

    The number of employees could be a nice reference to consider because a custom game engine is usually developed in-house (not outsourced) but note that some of those companies could have a big number of people because they also have in-house artist/audio teams while others outsource those parts of the development.

    It would be really nice to know how many engineers are working on the engine division of each company, I’m sure there would be some big surprises for the different companies, probably in some cases by the low number of them!

    Also, it would be interesting to have more info about the tooling included with those engines, it’s really difficult to have access to that kind of information. Engines tooling is usually a hidden-secret (beside some GDC presentation or some quick showcase video).

    *From left to right: Horizon Zero Dawn, God of War, Death Stranding
    CompanyEmployeesEngineNotable Games
    Infinity Ward+500IW 7.0Call of Duty: Infinite Warfare
    Bethesda~400Creation EngineSkyrim, Fallout 4, Fallout 76
    Valve Corp.~360Source 2Dota 2, Half-Life: Alyx
    Crystal Dynamics~350Foundation EngineRise/Shadow of the Tomb Raider
    Naughty Dog+300Naughty Dog Game EngineUncharted series, Last of Us
    Crytek~290CryEngine VThe Climb, Hunt:Showdown
    From Software+280Dark Souls engineBloodborne, Dark Souls III, Sekiro
    Remedy+250Northlight EngineQuantum Break, Control
    Guerrilla Games+250DecimaKillzone Shadow Fall, Until Dawn, Horizon Zero Dawn
    Platinum Games~250Platinum EngineNieR Automata, Bayonetta, Vanquish
    Santa Monica Studio+200custom engineGod Of War series
    id Software+200idTech 6/7Doom, Doom Eternal, Wolfenstein series
    Sucker Punch+200custom engineInfamous Second Son, Ghost of Tsushima?
    Insomniac Games~180Insomniac EngineRachet&Clank series, Marvel’s Spider-Man
    Quantic Dreams~180custom engineDetroit: Become Human
    Asobo Studio+140custom engineA Plague Tale
    Mercury Steam~110custom engineSpacelords, Castlevania:Lords of Shadow series
    Frozenbyte~100Storm3DTrine series, Shadowgrounds
    Daedalic Entertainment~90Visionaire StudioThe Whispered World, Deponia series
    Kojima Productions~80DecimaDeath Stranding
    Media Molecule~80Bubblebath EngineDreams

    Some observations from this list:

    1. Kojima Productions use Decima engine, developed by Guerrilla Games, despite not having a custom in-house engine, it’s surprisingly their accomplishments considering such a small team.
    2. Media Molecule latest game/engine (Dreams) seems to have been developed by only ~15 coders, amazing!
    3. Companies targeting one single platform, usually have less restrictions and can push the limits of that platform. Unfortunately, that’s a luxury that most companies can not afford.
    4. Asobo Studio, the company that originated this market study is not that small…

    Small-size Studios (Indie Studios)

    *From left to right: The Witness, No Man’s Sky, X-Morph Defense

    Here we have some really small studios that also choose to develop a custom engine for their games. Note that most of those engines rely on other libraries/frameworks for certain parts of the game, the common choices we find are SDL (cross-platform graphics/input), OGRE (rendering engine), MonoGame (cross-platform game framework, also relyes on SDL, SharpDX, OpenTK, OpenAL-Soft…).

    One question many people could ask is, what parts of the engine are actually coded by the developers? Well, it depends, but usually coders take care of the screen-manager, entities-manager and content-manager as well as the wrappers/interfaces to the other external libraries.

    Second question, what parts of the engine usually rely on external libraries/middleware? It also depends on the company resources but usually audio-system, physics, rendering, networking, ui-system, terrain-system, vegetation-system and some other pieces.

    *From left to right: Factorio, Thimbleweed Park, Owlboy

    On the following list (and the next one below) I added the publishing date (only +2012) and the link to Steam for all the games… there are not many games with custom engine from small studios out there and I think they deserve to be recognized and supported.

    CompanyEmployeesEngineNotable Games
    Hello Games~25No Man’s Sky EngineNo Man’s Sky (2016)
    Supergiant Games~20MonoGame-basedHades (2019), Pyre (2017), Transistor (2014)
    Wube Software~20Allegro-basedFactorio (2019)
    Ronimo Games~17RoniTech Engine (SDL)Awesomenauts (2017)
    Runic Games~17OGRE-basedHob (2017), Tochlight II (2012)
    Introversion Software~14SystemIV (SDL)Prison Architect (2015)
    Exor Studios~14OGRE-based SchmetterlingThe Riftbreaker (2020), X-Morph: Defense (2017)
    Tribute Games~11MonoGame-basedFlinthook (2017), Mercenary Kings (2014)
    Thekla Inc. (Jonathan Blow)~10custom engineThe Witness (2016)
    Terrible Toybox (Ron Gilbert)9custom engine (SDL)Thimbleweed Park (2017)
    Matt Makes Games (Matt Thorson)~7MonoGame-basedCeleste (2018), TowerFall Ascension (2014)
    Lo-fi Games (Chris Hunt)6OGRE-basedKenshi (2018)
    D-Pad Studio6MonoGame-basedOwlboy (2016)
    BitKid, Inc.6MonoGame-basedCHASM (2020)
    Double Damage Games5OGRE-basedRebel Galaxy Outlaw (2019), Rebel Galaxy (2015)

    Some observations from this list:

    1. Hello Games is a very small studio considering the size No Man’s Sky game and custom engine. Really impressive!
    2. Runic Games was dissolved in November 2017, the founders created Double Damage, not they are work on Echtra Games on Torchlight III.
    3. In most of those studios the people in charge of creating the game engine it’s only 1-3 persons!
    4. Lo-fi Games was a one-man team (Chris Hunt) for more than 6 years!
    5. Some of the games in this list took +5 years of development!
    6. Not many games… a couple of hits per year…

    One-man custom engines

    *From left to right: Stardew Valley, ScourgeBringer, Eagle Island

    Finally, the list of the heroes.

    Games developed by 1-2 people with custom game engines, engines mostly coded by one person! Respect.

    *From left to right: Axiom Verge, Ghost 1.0, Remnants of Naezith

    Creating an engine and a game from scratch to the point of publishing it is an extraordinary accomplishment, not many people in the world is ready for that. Almost all of them are 2D games, usually with very small budgets and developed along multiple years. Congratulations to the developers!

    Company/DeveloperPeopleEngineNotable Game(s)
    Lizardcube (Ben Fiquet and Omar Cornut)2?custom engine(s)Wonder Boy: The Dragon’s Trap (2017), Streets of Rage 4 (2020)
    Pocketwatch Games (Andy Schatz)2?MonoGame-basedTooth and Tail (2017)
    Justin Ma and Matthew Davis2custom engineFTL: Faster Than Light (2012)
    Ed Key and David Kanaga2custom engineProteus (2013)
    Flying Oak Games (Thomas Altenburger and Florian Hurtaut)2MonoGame-basedNeuro Voider (2016), ScourgeBringer(2020)
    Terry Cavanagh1custom engineSuper Hexagon (2012)
    Francisco Tellez1SDL-basedGhost 1.0 (2016), UnEpic (2014)
    Grid Sage Games (Josh Ge)1SDL-basedCogmind (2017)
    Luke Hodorowicz1custom engineBanished (2014)
    Thomas Happ1MonoGame-basedAxiom Verge (2015)
    James Silva1MonoGame-basedSalt and Sanctuary (2016)
    Eric Barone1MonoGame-basedStardew Valley (2016)
    Tolga Ay1SFML-basedRemnant of Naezith (2018)
    Nick Gregory1MonoGame-basedEagle Island (2019)
    bitBull Ltd. (James Closs)1MonoGame-basedJetboard Joust (2020)

    Some observations from this list:

    1. Some of those teams are formed by 1-2 people but probably growed at some moment and/or outsourced some parts of the development (art, audio…). Usually the publisher also helps with some resources (localization, marketing…).
    2. Omar Cornut from Lizardcube is also the developer of Dear ImGui, a free and open-source immediate-mode gui library used by lots of AAA custom engines.
    3. Some of the games in this list took +5 years of development!
    4. Not many games… a couple of hits per year…

    There are some other remarkable games using custom engines (usually XNA/MonoGame) that worth mentioning: Braid (2009), Super Meat Boy (2010), Terraria (2011), Dustforce (2012), Sword and Sorcery EP (2012), FEZ (2013), Dust: An Elysian Tail (2013), Rogue Legacy (2013).

    Conclusions

    I’ll start saying I’m biased, I’m really passionate about video games making technologies and I admire custom engines and game-making tools. I also contributed to custom engines ecosystem with my grain of salt: raylib and several game-making tools. I prefer a custom engine over a licensed one, it really feels extra amount of effort put into the product, usually translated into some specific mechanic of extra in-game details.

    Said that, I must admit that creating a custom engine is a big endeavor and not many people are ready for that. I recognize Unity (and Unreal to less extend) have really democratized video game development, lots of small-medium size companies can use Unity today to quickly develop games and put them on the market, sometimes with very low budgets… But, still, lots of big companies prefer to rely on their own custom technologies.

    From a game dev/teacher perspective I think students must learn how engines work internally with much detail as possible. Relying only on engines like Unity/Unreal for education to allow students develop eye-candy project in short-time is not the way to go. At the end of the day, someone has to write the engine and the tools!

    Ramon Santamaria is a teacher and game developer from Barcelona, Spain and the author of Raylib, a simple and easy-to-use library to enjoy video game programming.

  • A commitment to Handmade

    A commitment to Handmade

    This tale begins as most of the major changes in my life do during a sleepless night. It was about 3 in the morning and I was browsing YouTube videos in bed when I stumbled upon what is possibly the best dev log I’ve ever seen:


    When professor rework showed up I just about lost it 🤣

    I was laying there in disbelief between fits of laughter at what this guy was doing. Two years Thomas Randall has been working on this game. He started in Unreal Engine, Rewrote in C++, and then finally in pure C. He did everything over this period of time from completely redesigning the game’s architecture to teaching himself physics on the fly. He also moved his entire game into a new engine in a week.

    Aside from the awesome flow and humor in the videos themselves (something about Aussie sarcasm is extra funny 😀) what really intrigued me was Randall’s commitment to his vision. As a programmer and game developer, I have settled time and time again like everyone else for various reasons: burnout, time constraints, money, external factors, you name it. Randall wasn’t willing to give an inch. He wants to make the game he sees in his mind and obviously doesn’t care about what it’s going to take to get there.

    That kind of passion is contagious. As I watched more of Randall’s videos I started getting introduced to some other folks in Randall’s network via the videos. One of these guys is a fellow by the name of Ryan Fleury. Ryan developed the Telescope game engine Randall’s game currently lives in, and also created a custom tool called Data Desk for building and parsing C-like data components.

    Ryan uses Data Desk in most of his software projects and I was blown away at the level of fidelity he was able to achieve in a 48 hour game jam with a limited 2d sprite sheet. It is seriously impressive. Highly recommend watching the first five minutes of the Jam:


    This got me interested in what Ryan was working on and I came across his project “The Melodist” and again was simply blown away by the general difference in quality and attention to performance and optimization that was going into this project. I’ve made a few games, and a lot of software. I’ve played a lot of games and used a lot of software. This was next level stuff.

    I reached out to Ryan to introduce myself and ask if he would be interested in “micro-mentoring” me. Ryan is kind of busy 🙂, but was kind enough to invite me to the Handmade Network.

    The reception I have received since joining the Handmade Network community has been incredible. Handmade Network lacks the elitism or snobbishness I’ve seen in some development circles. Veterans of the community answer day 1 questions from new members or guests with the same respect and enthusiasm that they treat each other with. It’s kind of interesting because you would think folks that are doing things purposefully harder and putting invisible restrictions on themselves would feel a certain superiority. The opposite couldn’t be more true.

    It was through this Network I started meeting other folks working on extremely interesting software with a high attention to detail on performance, customization, and portability.

    This is something I’ve been curious about for years:

    I’ve been programming for 15 years now. Recently, our industry’s lack of care for efficiency, simplicity, and excellence started really getting to me, to the point of me getting depressed by my own career and IT in general.

    Modern cars work, let’s say for the sake of argument, at 98% of what’s physically possible with the current engine design. Modern buildings use just enough material to fulfill their function and stay safe under the given conditions. All planes converged to the optimal size/form/load and basically look the same.

    Only in software, it’s fine if a program runs at 1% or even 0.01% of the possible performance. Everybody just seems to be ok with it. People are often even proud about how inefficient it is, as in “why should we worry, computers are fast enough”

    – Nikita Prokopov on Software Disenchantment

    This is especially true in Web where the landscape changes drastically and tempo can be unpredictable. One moment you’re living in a dollar sign world $ in jQuery and the next it’s all about React. One minute your project has 5 folders and the next you have thousands of node modules and GitHub is overloading mail servers sending you dependency security notifications every 5 seconds. It is madness.

    All of this culminated in a few personal commitments. I have made a commitment to begin on the path of “getting closer to the metal” by developing new projects in lower level languages (particularly C) and committing myself to a greater understanding of how things actually work. Decades of abstraction and seemingly infinite storage space and processing speeds have led us here. I have also decided to participate where possible to the Handmade Network, contribute, and give back where possible. For example, one of the members: Allen Webster achieved what many programmers aspire to do: built his own editor called “4coder”. 4coder is exactly the type and quality of software that has me so intrigued with the Handmade community. There’s even a Handmade Network Podcast (it’s excellent btw) where some of these folks discuss their motivations for these projects and problems they solved along the way.

    Through Handmade Network I have found all sorts of high quality developers and projects. Among these was a library called “Raylib” written by a guy named Ray from Barcelona, Spain. I was so impressed by the quality of Ray’s library (he has a whole suite of libraries, actually) and the levels at which he was willing to go to share his work. Aside from being under an extremely generous software license, Ray has worked tirelessly to ensure his software can be used at every level, on every platform, with virtually any utility.

    I was once again moved by the passion I saw coming through in Ray’s project. Ray also actively communicates with folks interested in using his software and is extremely kind and open to working towards anything that will help someone have an easier time. It is for this reason that Ray is one of the solo developers I decided to donate to during this time of COVID-19 uncertainty:

    Speaking of Raylib, the Raylib community recently held a 32×32 pixel game jam I decided to whip up a submission in about two days and enter! I found the constraints interesting: how cool can you make a game that has to fit in a 32×32 grid of individual “LED” and be 100% generated programmatically with zero external libraries outside of Raylib? Turns out, pretty cool:

    Flappy Box – my Raylib game Jam submission programmed in C

    While the game isn’t extremely graphically pleasing, it plays well and the entire executable program is 15kb!! For reference, the above GIF is 52 times larger than the game it’s displaying.

    You can check out the source code (or grab the executable and play) here:

    https://github.com/rfaile313/RayLib32x32GameJam

    One of the cool things about making something like this is it could be easily transitioned into a hardware project. For example, very little would need to be changed to port this game onto a bookshelf, sort of like what this guy did with Tetris:

    😎

    I also plan on utilizing Ray’s suite of tools and other Handmade Network community projects and affiliations in my quest to create better software. In the meantime I will also be giving back to the community in other ways. For example, here’s a quick tutorial on creating your first project in 4coder on Windows:


    The best way to help out Handmade Network and other Handmade projects is through the Handmade Fund. Other developers like Randall and Ray usually have other ways to give back if you like what they’re doing.

    I’d like to encourage anyone who feels like donating during this time to consider folks who are making amazing open source software. If you don’t feel like donating, consider giving back by sharing links to the software, authors, and community. They deserve it.

  • Automatic Fish Feeder

    Automatic Fish Feeder

    We’ve been “watching” my mother-in-law’s fish for the better part of two years. One of my least favorite tasks in the day is feeding the fish in the morning. There are a lot of morning tasks where putting my fingers near my mouth is a factor (brushing teeth, drinking coffee, etc.) and having to put nasty fish flakes on my hand is disruptive to those tasks.

    I decided to solve this with an Arduino and some stuff laying around the house. The project goal was to make a feeder that would feed the fish every 24 hours so I wouldn’t have to. I thought the hardest part would be the timer (spoiler alert: it was) but in actuality, engineering components that were never meant to feed fish was the really difficult and fun part.

    Inventory

    I bought and ELEGOO circuit board for the microcontroller, some random servos for the motorized mechanism, and a general electronics kit for wires and stuff. Don’t worry, those aren’t affiliate links playa… god forbid I get 20 extra cents.

    I started off by testing the board and some components. So far, so good.

    With that out of the way, I started working on getting the servo moving:

    After realizing the electronics portion of the project was coming together quite easily, I realized I had to start thinking about the physical container the food would reside in, and how I’d deliver it. I had a bottle laying around that I cut the bottom out of for the food to reside in.

    Now I had to think about how I would control the food from storage to delivery. For this, I decided to cut square of cardboard (from a JB Weld package of course) and attach it to the servo. Then, it was a quick ziptie to affix the servo-JBweld-stopper to the food storage container.

    Then I just had to get that bad boy moving:

    Working but…. I’ll kill my fish if they get that much.

    We had a working JBweld-cardboard-servo control, but it was going to need adjustment. I decided it would be a good idea at this point to start testing not only the angle to set the servo, but the frequency, friction, and amount of times to move the thing for the proper amount of food to fall.

    It was in testing that I discovered some physical bugs. Some people might have used a different material to simulate how the fish food would fall. Not me, I went and grabbed the flakes that were going to be used in a real-life simulation train like you fight was about all I learned in the Navy.

    I’m glad I did, because those stupid flakes didn’t want to come out of my bottle after the first couple of times, they’d get stuck in the larger canister but wouldn’t fall out of the mouth. Not good. I thought about some possible solutions. Solution #1 was to hot glue a pizza flyer into a cone and stick it in there:

    This was better but still not ideal. I needed something to disrupt the flakes and get them to fall. Ultimately I decided to hot glue a 3″ screw upside down against the JBweld-servo at the bottom so it would disrupt the entire food storage unit as it went back and forth.

    Bingo

    With that problem solved, I was able to tweak the code until I got the appropriate amount of food to fall on each run. Once satisfied with that, all that was really left was to put all the hardware together. Well I mean, there was that little “how will I power this thing” obstacle:

    imagine knowing this little about electricity

    Obviously that wasn’t going to work (lol) and servos require a bit more of a power draw than an LED. I remembered when I bought my house a few years ago the mortgage company gave me some small USB power banks. Perfect.

    Thanks OnQ!

    Now I could attach everything to a single contained unit! I used a plastic container that some screws came in, threw everything in there and zip tied it closed – now this is engineering!

    “it looks like an IED” -my wife

    With all that done, all that was left to do was send the device on its maiden voyage:

    my wife’s surprise at this device actually working says it all

    And that’s it! Here’s the final display:

    The profile actually doesn’t look that bad, and it’s self contained.

    Remember we talked about the timer? The timer situation isn’t ideal. I ran through some other options but for now I’m just going to run a delay() method for 24 hours. It’ll be off more and more every day because the processor can’t keep time like that, but I’m hoping it will run a week or so before it’s off by more than an hour. The other concern here is I have no idea what the total potential energy of the OnQ financial swag charger is or how long it will power the device for….. I guess we’ll figure it out.

    If you have any ideas or experience with this sort of thing, I’d be interested in hearing about what a more efficient way to power and run the timer might be. Ideally it would wake the device up every 24 hours, run the program, then sleep for another 24 hours.

    Anyway, here’s the code:

    #include <Servo.h>             //Servo library
     
    Servo fish_opener;        //initialize a servo object for the connected servo  
                    
    int angle = 0;
    int times_to_run = 2;
    int start;
    
    void setup() 
    { 
      fish_opener.attach(9);      // attach the signal pin of servo to pin9 of arduino
    
    } 
    
    void loop() 
    { 
    
      while(start <= times_to_run)
       {
        
        for(angle = 0; angle <= 45; angle += 6)    // command to move from 0 degrees to 45 degrees / increment of 6
        {                                  
          fish_opener.write(angle);                 //command to rotate the servo to the specified angle
          delay(10);                       
        } 
       
        delay(500);
        
        for(angle = 45; angle >=1; angle-=6)     // command to move from 45 degrees to 0 degrees / increment of 6
        {                                
          fish_opener.write(angle);              //command to rotate the servo to the specified angle
          delay(10);                       
        } 
      
          delay(500);
          start += 1;
       }
    
      start = 0; //reset while loop variable
      
      delay(86400000); //24 hours
      
    }

    All in all it was a fun project. I really enjoy the hardware side of things and hadn’t put something together a little more than two years ago with my crypto miner.

    Cheeky Bonus

    When I decided I was going to make this into a blog post I airdropped all of my photos and videos from my iPhone to my MacBook pro.

    fffffuuuuuuuuuuuuuuuu

    HEIC isn’t a friendly web format and there was no way I was going to open up each file in preview and export them. A little known trick with these newer formats like HEIC and WEBP is you can simply rename the file extension to convert. However, there was also no way I was going to manually click each file and rename the extension so I used this handy 8 line Python script:

     import os,sys
     folder = '/Users/RFaile/Desktop/fishfeeder'
     for filename in os.listdir(folder):
            infilename = os.path.join(folder,filename)
            if not os.path.isfile(infilename): continue
            oldbase = os.path.splitext(filename)
            newname = infilename.replace('.HEIC', '.jpg')
            output = os.rename(infilename, newname)

    Which fixed it right up in less than a second:

    Programmers are so lazy.