Tag: featured

  • 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.

  • 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.

  • Reading list second half 2019 + update

    Reading list second half 2019 + update

    Howdy 🤠

    It’s been a while since I’ve written a post. Things have been extremely busy at work and I’m excited for what possibilities 2020 has in store Automattic as a company and for me as a professional.

    This extra effort has been synchronous with my reading list. I find myself ending work after long hours with a little more mental exhaustion than I would normally have. As a result, I have spent the vast majority of my reading time exercising via walking while listening to books on tape in order to try and effortlessly kill two birds with one stone.

    Virtually all of the books have been fiction, and all from the same series at that. I think my choice of genre is directly related to my workload 😅. Back during my 100 days of running I listened to the first three Dresden Files books and found myself returning to them for more. It turns out there are 15 books already published in the series, so the prospect of having a lot of available content I was already familiar with was another deciding factor (notice a pattern here?) During the time between my last reading list and now, I read 10 books in the series. Book 4: Summer Knight to Book 13: Ghost Story. I’m not sure how long the books are because I listened on audio for the most part. In general though: they average about 50 chapters and 20ish hours recorded, per book. By the way, the narration is excellent…. James Marsters is the narrator in every book, and really brings the stories to life if you ask me.

    I didn’t explain it much in the previous post, but possibly the main appeal for me is the books are basically Harry Potter for adults in the Noir genre. Hell, even the main character is named Harry, Harry Blackstone Copperfield Dresden, that is. Harry is a wizard who runs a small private investigation business in Chicago. On the surface you have a fun series that mixes a little bit of crime/mystery with the supernatural, but as the series matures you’re slowly sucked in to the supernatural world at large and the powers at play. As Harry becomes stronger, so increases the stakes in each book. The recurring characters, development, and overarching plot are what keeps me engaged, even 13 books later.

    Anyway, without butchering the review: I think Harry Potter for adults is a good baseline if you’re thinking about reading this series. I like simplicity. Did you like Harry Potter? -> You will probably like this. I’ll link the covers + links to the books I read below (don’t you worry those aren’t affiliate links, no one is going to make any money off of your precious clicks – I promise 🙏) — if you’re looking for links to Books 1, 2, and 3 – those are in my previous post.

    Simplicity is the ultimate sophistication

    Leonardo da Vinci
    Summer Knight: The Dresden Files, Book 4
    Death Masks: The Dresden Files, Book 5
    Blood Rites (The Dresden Files, Book 6)
    Dead Beat (The Dresden Files, Book 7)
    Proven Guilty (The Dresden Files, Book 8)
    White Night (The Dresden Files, Book 9)
    Small Favor (The Dresden Files, Book 10)
    Turn Coat (The Dresden Files, Book 11)
    Changes (The Dresden Files, Book 12)
    Ghost Story (Dresden Files Book 13)
  • 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.

  • It is impossible to get hacked*

    It is impossible to get hacked*

    *No, not really. It’s just that when you say “I have been hacked!” you’re handing off responsibility. People think these things “just happen” – hackers hack, right?

    Wrong

    In the present day, people use the word “hacked” as if they were being targeted by hackers, then getting their accounts broken into by some sort of voodoo computer magic. The reality is: this couldn’t be further from the truth.

    This is *not* how someone got into your Facebook account 🤦‍♂️

    There are many forms of hacking. In this post, we’re going to focus on modern day account security since this is where most people will tell you they get “hacked”. When I say account security, think Facebook, Twitter, Apple, Netflix, Instagram, Email, etc.

    What is “hacking” ?

    The early days of the internet were basically the wild west. As a result, account penetration was a much simpler process. Passwords could be guessed over and over by programs until it guessed the right one (computers can do this really fast) and direct p2p connections were extremely common as well since IPs were more exposed to the (relatively) few folks online. When I first started using the internet in the late 90s, it was a common practice to open a direct client-to-client connection with a stranger in IRC to share a file. You would never do that today, and modern communication platforms like discord abstract things in a way where you’d never actually know the IP of a person you were sharing a file with.

    Nowadays, there isn’t a service with over 20 active users out there that doesn’t have rudimentary security in place like brute force protection. Your larger platforms with millions of users will have much more sophisticated protection. For example, if you live in Chicago and log into Facebook, then try and log in from Bangladesh 5 minutes later, the system is going to block that attempt. In short, it’s nearly impossible for someone who has never met you to hack you without you handing them the keys to do it.

    So how does it happen, then?

    Here are the most common ways an account gets compromised:

    1. Clicking phishing links in emails or on websites which redirect to false pages reconstructed to look like a service you use: Facebook, Apple, Amazon, Chase banking, etc. You’ve clicked this link because it said in the email that you had an urgent notice that needed to be resolved, then you willingly entered your account information, which someone now has.
    2. You have a ridiculously easy password. 123456, qwerty, password, hunter02, your name, your kid’s name, your pet… the list goes on. Don’t do it.
    3. You use a universal password. A universal password means you use the same password or a variation of it for multiple accounts. This is literally the worst thing you can do. Why? Because if an entity legitimately gets hacked, like Equifax in 2017 for example, whoever gets that data is going to try to login to every other service they can with the account credentials they gained. Fun fact: Equifax got “hacked” because their database username was admin and the password was….. admin! Yes, really.
    4. YOU PROVIDE answers to password security questions, sometimes freely. These are questions you often set up when creating an account: What is your birth date? What is your Mother’s Maiden Name? When is your anniversary? I can find out 90% of the answers to these questions just by being friends with the average person on Facebook. People that answer Facebook “quizzes”? *Shudders* 😬.
    5. This brings us into what modern day hacking usually comes down to: social engineering. People trick you into revealing information that help them hack you. Whether it’s over a social media DM, a video game, or on the phone. Modern day hackers are experts at piecing together seemingly innocuous information… until it’s too late.

    What can I do about it?

    Here’s are some extremely easy ways to significantly reduce your odds of getting an account compromised:

    1. Don’t click links in emails. If you get an account notice, log in directly through the organization’s portal and see what’s up. Reach out to the organization directly. If you get an email saying your Netflix account is frozen, try logging into Netflix at https://netflix.com – if you can login, the account obviously isn’t frozen.
    2. Use long, strong, unguessable passwords. Zhwg(=B)wMNOd(m1l;1BHl/-O?Z:kVko#aMaclcd is an example of a strong password (230 bits) combining numbers, letters, case, and special characters. Length is one of the things that make a password tough to hash, but isn’t the only factor.
    3. Even better is to get a password manager and let the password manager generate the passwords for you. The password manager will ensure the password is as difficult as can be for a machine to guess, while allowing you to one-click copy/paste it into the service in most cases.
    4. Never ever use the same password in more than one place. Seriously, don’t do it. This includes if your password is just an alteration of the same thing. For example: packers01, packers1!!, Packers!! might as well be the same password.
    5. Never store username/password credentials in your browser (when you log in to a site, this is the “save password” prompt that you see.) The first thing a “hacker” who gains control of your computer does is check your browser for usernames and passwords which can be viewed as plain text.
    6. Set up two-factor Authentication…. everywhere. There aren’t any mainstream services that don’t offer this. Start with your emails (yes you should have more than one) as they’re the key to most account recoveries. If someone gains access to your email, they can reset your accounts in other places by sending a password recovery link to your email. Your email needs to be the hardest thing to get into. This is like the easiest thing to do, yet 90% of people with a Gmail account do not have 2FA set up. That number is staggering.
    7. Don’t use text-message based 2FA. SIM cards can and do get compromised remotely. Someone can assume your SIM and have 2FA codes sent to them if they care enough. It has happened to people I work with. Instead, use an Authentication app like Google Authenticator or Authy. These apps generate tokens that change every 30 seconds that you’ll need to provide when logging into a 2FA-connected service.

    So is it really impossible to get “hacked” then?

    No. True security breaches happen every single day. Usually someone discovers and exploits a security vulnerability in a service and figures out a way to query a database or gain access to an administrator’s account. I talked about Equifax a bit, but this has happened to other large organizations as well.

    What then happens is now someone has a list of username/email and password combinations used for that service. They then use these lists and throw them at other services until they work, banking on the fact that people can (and do) use the same credentials across multiple services. These attacks are known as credential stuffing. Again, using unique passwords for every service greatly mitigates the impact this has on you.

    “Have I been Pwned” is a great site for checking if you have an account that’s been compromised in a data breach somewhere: https://haveibeenpwned.com/

    Is it all worth it?

    In a word: yes.

    Think of how much you value everything on your computer and on web services: photos of your loved ones, correspondence, financial information, your writing. Your computer and web accounts are access points to things you own, things that are yours. The small inconveniences here and there are big inconveniences for hackers. Do you know what more inconvenient than entering a 2FA code? Trying to explain to Facebook that it’s your profile that someone else is using or getting your money back when someone gets into your bank or credit services.

    In Summary

    These are the basics. As you’ve learned, simply enabling two-factor authentication on your email will make you a harder target than 90% of the 1.5 billion people who have a Gmail account.

    Use Two Factor Authentication. Never re-use passwords. Get a password manager.

    Questions? More tips? Let me know in the comments 👇

  • Out with the old, in with the new.

    Out with the old, in with the new.

    I’ve been at Automattic about two years now, and it’s been long past due for me to upgrade my company-issued MacBook Pro. When I first started at Automattic, I opted for the 13″ fully upgraded model. I didn’t want a big and bulky 15″ and I definitely didn’t want the touch bar. I really like tactile keys and the difference in power wasn’t going to be that significant. Plus, it was less bulky.

    My 13″ MBP ended up serving me well in my first two years. Here is a top-shot in all its glory in the machine’s last day of service:

    rudy faile's 13" macbook pro
    Farewell, good buddy 👋

    I was due for a replacement in the middle of this year (2019) but decided to wait because there were rumors of Apple releasing a 16″ model which had numerous improvements over the existing 15″ models. For starters, it was bringing back the ESC key (less touch bar = good!) While I wish they would offer a tactile key option, this was better than nothing. Furthermore, they brought back the scissor keyboard! This one actually feels less mushy than the older ones feel, especially after you’ve gotten used to the butterfly mechanism of the 2016-2018 models, but it’s a short adjustment period. Lastly, I found that while I enjoyed the portability and power-in-a-small-package of my 13″ little beast, I was ultimately less productive due to lack of screen real estate.

    All of these factors led me to wait for the possible release of the 16″ MacBook Pro. My patience, it seems, paid off as Apple announced the 16″ model on November 15th. I made my order that day and it arrived to my door about a week later.

    I couldn’t find a case at first since it was so new. Even though the chassis was supposedly the same size, I had read multiple reports that cases from the 15″ would not fit on the 16″. Eventually, to my satisfaction, I ended up stumbling across this heavy duty case from i-Blason which is perfect for me because I have a tendency to drop expensive things.

    I still have room for a couple more stickers😄

    The specs are:

    • Operating System: MacOS Catalina
    • Processor: 2.4 GHz 8-Core Intel Core i9
    • Memory: 32GB 2667 Mhz DDR4
    • Graphics: AMD Radeon Pro 5500M
    • Storage: 1TB SSD

    All in all, this thing is a beast and I’m really happy to have it. If I dislike two things about it, it’s the bulkiness of it and the touch bar. God, I hate the touch bar. I’ve hacked it a little to remove anything useful unless I touch the function key. Otherwise, I’m constantly hitting it by mistake starting up programs or changing the display brightness or some other arbitrary change within the software I’m running I had no intention of making. It makes me really happy that I opted for the last MacBook Pro without a touch bar the last go around.

    Other than that, this thing has breezed through everything I’ve thrown at it. An 8 core i9 with turbo boost up to 5Ghz is just nuts. I can’t even get the fans to spin in the performance of daily tasks. I have to really try. I stand firmly behind the statement that Apple makes the best Laptops, Tablets, and Phones at the time of this post. I still think Microsoft has them beat in desktop computing.

    Lastly, and perhaps most important: migration assistant is a dream. If you haven’t used it, it basically takes your entire operating system and puts it on your new computer. It’s almost unreal how good it is. Turn on your computer, see how you have files laid out, configurations made just so and everything just the way you want it? Migration assistant puts that into a new machine for you. It’s very altered carbon-esque in the way it makes you feel like your hardware is just a shell for the operating system and the accompanying files, folders, and software – which is eternal. Seriously, if there’s one thing I would do if I worked at Microsoft is figure out a way to make a migration-like tool that’s even half as good as migration assistant is. Your software comes over with the same configuration, your files come over, the terminal is set up on the same git branch I left off on, I didn’t even have to log back into my Gmail because my browser and cookies came over. That’s how good it is.

  • How I train dogs

    How I train dogs

    Simply said but hard to do: dog training. I’ve successfully trained over a dozen dogs and consider myself somewhat accomplished on the subject. I wrote this for something else, but I liked it so much I’ve decided to share it here.

    Purpose: Quite apparent, but a dog needs training. You don’t want them going to the bathroom in your home, tearing up your stuff, biting other dogs/people/kids, etc. If you neglect a dog, all of these unwanted behaviors may happen and worse.

    Dog training breaks down into three foundational tenets: Patience, Routine, and Reinforcement.

    Patience: Easier said than done. It takes time, mistakes will happen – and it’s frustrating. Anyone that’s ever had a puppy understands this. If you aren’t willing to accept that this is a long-term game of patience and time investment, adopting a puppy may not be for you. There is no way around this.

    Routine: You have a program. Your goal is to get your new furry family member on your program. The best way to do that is by showing them, every day, what the routine is. Let them know what they can expect. A trained dog will know that they’re okay to go to sleep and not have the anxiousness or urge to get up in the middle of the night to use the restroom in the house, because they know as soon as you wake up they’re going to get to go out. Trained dogs don’t get (as) anxious when you leave because they know when you’re coming home. Trained dogs know when they’re going to get fed, when it’s time to play. You can eliminate virtually all unexpected behaviors with a good routine. You can identify if something is wrong with your dog when they behave strangely, or outside of the routine.

    Reinforcement: It’s all about training behavior. Dogs want to please, and it’s your job to show them how. When a dog performs a behavior you like, smile and verbally let them know! Treats are okay here too, but I prefer to use positive verbal and physical reinforcement, pet them! Let them know how good they are. When a dog provides the incorrect behavior during training, ignore them, look away, reset, and try again. If a dog performs bad behavior, a stern “no” is all that’s required. Never strike your dog or yell at it.


    Here’s what a one year training schedule might look like:

    >8 Weeks (2 to 3 months) – You’ve brought your new puppy home. Puppies shouldn’t leave their mothers before 8 weeks, so 8-12 weeks, or 2-3 months is the typical adoption range. Your puppy will need: a bowl of water, puppy food, toys, and a method for potty training. Some folks use cloth or grass pads, I personally prefer to use the inside/outside method – meaning you’re training to the outside of your home.

    (3 to 5 months) This is the most critical time, and it’s also the hardest. Your job is to be Ghandi, Mother Theresa, you are a bastion of patience. You are enlightenment. Your job is to Guide your puppy through expected behaviors while patiently showing them which behaviors you don’t want to see.

    Examples include:

    • Potty training. This is the big one. Establish common times, puppies around this age need to go every 2-3 hours, adding an hour for each month as they get older. The best practice here is to take them out routinely. They will figure out that they’re going to go out. When you take them out, watch them & observe them. When they go, immediately tell them “good job!” get them excited, let them know an outside pee pee is a good pee pee! It’s a good idea to stay out there with them a bit longer because puppy bladders and bowels are unpredictable. Eventually though, I like to work them into knowing that after they go, they get to go back inside. When you wake up, if they’ve gone inside, ignore it, let them out first then clean it up. Don’t let them see you clean it, and don’t acknowledge it, out of sight out of mind. The same holds true if you leave and come back. Never scold them for something you don’t see them doing. They won’t associate it and it will make them anxious. The only time you’ll want to do this is if you catch them in the act. When that happens, I like to say “No, outside” and pick them up and put them outside. Once outside, you can clean the mess 🙂
    • Chewing. Good toys and monitoring help this. Buy them toys and play with the toys with them. Give them a good sense of ownership over what to get when it’s time to play. If you ever see them chew something they shouldn’t, tell them “no!” If they chew something while you’re gone or sleeping, that’s tough luck. Again, you cannot punish a dog for something you do not catch them in the act doing. I’ve never seen it work. If they love shoes, put the shoes out of reach. If it’s the couch, get vinegar spray or stick around and catch them doing it and tell them NO – they’ll figure it out.
    • Feeding. Some folks do feeding time with their dogs forever, I only do it in these first few months while the puppy is young, I’ll feed them until they stop eating then pull the bowl up. I repeat this 3-4 times a day. I always leave the water down. I have never had a problem with dogs overeating.
    • Play. This is the fun part! Play with your puppy! Toys are great, give them small treats, and love them! This is why you have a puppy!
    • Walk. This is really hard to do at first, and it really varies dog to dog – but it’s one of the most critical functions of dog training. Dogs are pack animals. Walks establish who leads and who follows. I like to introduce the leash and collar as soon as possible, but if the walk isn’t going to happen right away, that’s okay. However, you need to head into the 6 to 8 month period with the dog knowing what a walk is. This part can be really tough. I’ve had to drag dogs that just don’t want to walk. It breaks my heart every time. My strategy is to stand up straight, eyes forward, leash in hand held tightly on hip and walk – whatever the dog does is up to them. Some walk naturally, with others it takes time.

    (6 to 8 months) The dog should be mostly potty trained at this point if not completely so. Accidents should be few and far between. There may or may not be residual chewing issues. The portion that must increase here is walks. Walks should happen daily if possible, even if they can only be 15-30 minutes long, they have to happen. Walks reinforce your position as a person of authority and someone they should listen to as well as love. They also help get the dog’s energy out, which they have and which they need. Even if the dog has a yard, walk them. If the dog doesn’t have a yard, walk them longer. I leave the food down at all day at this point. I like to cycle toys to keep them interested. You’ll be moving them to adult dog food soon. As a good owner, you’ll of course be keeping them up to date with immunizations and other required medications. If so, gently socialize your dog with friends’ dogs that you know can be trusted.

    (8 to 12 months) This is the refining phase. Everything should be worked out for the most part. Potty training shouldn’t be an issue unless there’s something wrong. Chewing shouldn’t be an issue, walks should be routine. Your goal in this phase is to cement the behaviors that are going to last the dog’s lifetime. If you see something you’d like to change, here’s where you want to work on it. You can train dogs later, but the saying “you can’t teach an old dog new tricks” exists for a reason. Speaking of, I haven’t mentioned tricks up to this point because they aren’t important. You’ll want to of course have worked on basic commands, but I like to refer to them as behaviors because behaviors are more important than tricks, and tricks are just an expected behavior. Lastly, another big goal in this phase is to ensure your dog is consistently socialized and feels comfortable around other dogs.

    (12+ months) Your dog is pretty much fully trained at this point. It’ll be fully grown to height at this time and will spend the next 6 months to a year “filling out”. You know its personality and what to expect, and they know your personality and what to expect from you. It’s all downhill from here, your dog is your family.

    Following this guide, even someone with zero dog experience ever can train a good dog – so long as they remain patient, follow the routine, and consistently reinforce.

  • Reading list: First Half 2019

    Reading list: First Half 2019

    I read a lot during my 100 days of running, pretty much every day and mostly via Audiobook. One of the great things about committing to run was I was able to easily get into and finish books on Audio. I read some the old fashioned way as well… pretty much the technical manuals… but for the most part, I listened. This was meant to be a first quarter reading list but I’ve been very busy since it ended, so we’ll call it “first half of 2019.”

    Anyway, without further ado: here was my reading list, in the order I read them, along with a short summary of my take on the book and a link to purchase. Full disclosure, these are affiliate links. I don’t run ads on this site 🤷. Comments, suggestions, feedback? Feel free to comment below 👇 or reach out to me here.

    Can't Hurt Me by David Goggins

    Can’t Hurt Me by David Goggins

    This was really the book that inspired me to challenge myself to run in the first place. I talked a lot about this book in my initial “New Year, Improved Me” post. But my words really don’t pay this book its proper tribute. Dive in as David grows up abused and the only, ending up 300lbs and spraying for cockroaches when he decides to change his life forever and become one of the baddest men on planet earth. Amazon Link.


    Living with a SEAL by Jesse Itzler

    Living with a SEAL by Jesse Itzler

    This was a re-read. I read this book back in 2015 when it wasn’t well known who the SEAL in the book that trained Jesse was, but after learning it was none other than our man Goggins I had to go back through. This book is an easy read, and hilarious the whole way through. Imagine an uber-rich CEO guy who hires a Navy SEAL to live with him for 30 days. That’s this book. Full of laughs and lessons, I highly recommend this book in it’s audio form. Amazon Link.


    Living with the Monks by Jesse Itzler

    Living with the Monks by Jesse Itzler

    After finishing my re-read of Jesse’s last book, I found out that he had come out with another one. Admittedly not nearly as good as Living with a SEAL, I still enjoyed the read and Jesse’s narration is always funny. Read as Jesse decides he needs to shake things up again, heading to upstate New York to spend a few weeks with the world famous dog-training monks of New Skete. Amazon Link.


    Finding Ultra by Rich Roll

    Finding Ultra by Rich Roll

    Suprising gem find by browsing Kindle Audiobooks. I loved this read. Rich Roll was a serious alcoholic, at risk of losing it all and almost his life many times. Read as he transforms to an accomplished ultra endurance athlete, doing it all on an exclusively plant-based diet. Amazon Link.


    Golden Son by Pierce Brown

    Golden Son by Pierce Brown

    This was another re-read, but I couldn’t resist. Red Rising is a three-book trilogy series by Pierce brown and probably my favorite series of all time (start book one here). It’s a mix of Star Wars, Ender’s Game, Starcraft, and Greek Mythology and it’s amazing. I recommend these books to everyone and I’ve never heard negative feedback. If you’re going to read anything on this list – read this series. Amazon Link (This is Book 2/3).


    The Plant Powered Diet by Sharon Palmer, RD

    The Plant Powered Diet by Sharon Palmer, RD

    After reading “Finding Ultra” I became interested in Rich’s plant-powered diet as an endurance athlete. This was research on a diet with more plants from the perspective of a Registered Dietician. It’s a great read, and I will say we signed up for a weekly produce delivery after I finished this book. Amazon Link.


    The Obesity Code by Jason Fung, MD

    The Obesity Code by Jason Fung, MD

    Going deeper down the rabbit hole of diet, health, and wellness I picked up this read by Dr. Fung. An extremely interesting read, Dr. Fung debunks common myths about health, wellness, and weight loss to include calories in, calories out and macro-nutrient intake. Dr. Fung primarily treated kidney disease before becoming curious about why patients who were given insulin gained weight when it was “common knowledge” that reducing calories and increasing exercise curbed weight gain. Amazon Link.


    Meditation by Camelia Gherib

    Meditation by Camelia Gherib

    As it’s probably obvious at this point, I was deep deep into a quest to improve myself mentally, physically, and spiritually. I listened to this on Audiobook where the format was 21 days of 10 minute meditation sessions, and I have to say it was excellent. I still use some of the breathing techniques in an attempt to still my mind and push out unwanted thoughts or feelings. Amazon Link.


    The Dresden Files - Books 1, 2, and 3 by Jim Butcher

    The Dresden Files – Books 1, 2, and 3 by Jim Butcher

    My friend Travis recommended this series to me. Harry Dresden is Chicago’s only openly practicing wizard in a modern day society. These books are sort of like your old detective/private investigator murder mystery books except the protagonist is a wizard and he’s trying to run his own investigation alongside the police. The stories are interesting enough but the Narration by James Marsters is superb. I read the first three books but I won’t spam you with a review of each. Book 1 | Book 2 | Book 3 Amazon Links.


    iOS Programming - The Big Nerd Ranch Guide

    iOS Programming – The Big Nerd Ranch Guide

    I switched over at work from WordPress.com to our Mobile Applications and decided to try and refresh on some iOS knowledge. I hadn’t even looked at Swift since 2016. This was my first Nerd Ranch experience and I can’t recommend it enough. If I’m ever breaking into another programming language, framework, or technology I’m going to look for Nerd Ranch first! Amazon Link.


    Ascend Online by Luke Chmilenko

    Ascend Online by Luke Chmilenko

    This book was alright. LITRPG is usually my favorite guilty-pleasure reading. As far as they go, I thought Ascend Online left a lot to be desired. If you’re interested in the story-is-told-from-the-perspective-of-a-game-player-in-a-VR-world Sword Art Online style, this might be for you… but I recommend a series like Awaken Online first. Amazon Link.


    Becoming by Michelle Obama

    Becoming by Michelle Obama

    A surprisingly intimate look into the life of Michelle Robinson and later, the Obama Family as a whole. I really enjoyed this read. It’s extremely long but Michelle is an excellent and engaging Narrator, and the book is split into three parts: Becoming Me, Becoming Us, and Becoming More. Read as Michelle grows up as a Black Female on the South Side of Chicago later attending Princeton, Harvard Law, and eventually landing a position as a corporate attorney at Sidley Austin where she met Barack before working with non-profits. Eventually, Barack runs for the Illinois Senate, the U.S. Senate and well, you know how the rest of the story goes. This book is a strong case for the idea that privilege has almost nothing to do with race but almost everything to do with environment. Michelle’s parents are attentive and engaged throughout her life, and they sacrifice everything to help Michelle find her voice and instill values in her that last throughout her lifetime. Amazon Link.

  • New Year, Improved Me.

    New Year, Improved Me.

    2018 is all but over, there are only 12 days left in the year. By just about any measurement, I’d say it was a decently successful year. I traveled to and through some new states including Texas, New Mexico, Florida, Louisiana, and Colorado. This was my first full year at Automattic. We moved across the country and bought a home. My team and I did our meetup in Playa Del Carmen back in March, and the last 5 days of this year, Kristen and I are heading to Switzerland to snowboard the Swiss Alps. It was a fun, comfortable year.

    2019 is about getting uncomfortable. It’s about evolving. I’ve always followed the “sage” advice of tripling down on your strengths – getting better at what you already have an aptitude for. I’ve always been strong, so I lifted weights for years and became stronger. I’ve always been a decent student, so I went back to school and picked up a Master’s degree, graduating back in March.

    It’s time to start tripling down on my weaknesses.

    Now: I’ve never been a New Years resolution type of guy. In fact, I’ve never actually made one. I’ve always considered resolutions as “things people break.” I’ve always looked at motivation like a going and coming, fleeting feeling. Some days you’re motivated, some days you aren’t. I’m a firm believer in cultivating discipline, routine, habit.

    Discipline, routine, habit, callousing the mind – this is the ethos of a man named David Goggins. I had read Jesse Itzler’s Living with a SEAL back in 2016 before it was well known who the person who trained Itzler, acting as the catalyst of the story was. I watched Joe Rogan’s interview with the man in February where he gave a condensed version of his life story. Then, nine days ago when it released, I picked up and read his book/autobiography “Can’t Hurt Me.”

    It’s probably impossible to give someone like David Goggins a fair shake when recounting parts of his life, so I encourage you to buy his book or do your own research on him. For those of you who have never heard of him though, this man:

    • Completed three hell weeks in BUD/S (the hardest evolution of arguably the toughest military training in the world).
    • Completed the aforementioned training on broken legs.
    • Completed 52 ultra marathons between the ages of 30 and 42, winning some of them and finishing top 5 in most of them.
    • Holds the world record for pull-ups completed in 24 hours at 4,025.
    • Did I mention he did all of this with a hole in his heart? How about a learning disability? One of the few black men in special warfare? The list goes on.

    This is just the tip of the iceberg. Again, if you have any interest or doubts – do your own research. If none of this impresses you, you’re not being honest with yourself and the world around you.

    The book was the icing on the cake in helping me determine what I needed to do next. I know I’m capable of doing more, and I decided to commit to something that I didn’t want to do, every day, for 100 days. As David Goggins would say: I’m going to do something that sucks, every day.

    The Plan

    The plan is two-fold, but it starts like this:

    • Every day, for 100 days, I’m going to run at least a mile.
    • Every day, for 100 days, I’m going to write about and share that progress.

    Why

    The why is the easiest part of this whole thing: because I hate running. I am a 260 pound man (at least at the start of this). The reasons why are a bit more complicated, but stick with me:

    • Why Run? Because I hate running, and there’s something to be gained from doing something you don’t want to do every single day.
    • Why one mile? I loathe running as it is, knowing I have to get up and run at all every single day is going to require immense willpower for me. Setting an unrealistic goal like “5 miles a day” or “300 miles in 100 days” is going to set me up for failure. Perhaps I end up doing a lot more, perhaps I end up getting just 100 miles at the end, the point is I know physically I can do one a day, the rest is willpower.
    • Why Share? Mainly because I’m not Mr. Social media. I’m a private person by nature, an introvert. It’s going to be uncomfortable sharing my slow miles and paltry distances. I’m doing this for me, but perhaps people will see my big ass do it with the hopes that realizing anyone can.
    • Why 100 days? After the first quarter of 2019 there’s a lot of work and travel obligations I’m not fully sure how to work around yet. I also want an opportunity to re-evaluate and modify my goals and 100 days feels like a good initial number and goal.
    • What about rest? Injury? The tentative plan is to lightly jog or even walk the mile every 7th day as active recovery, but I’m still going to complete the mile. I’m going to listen to my body. The plan is to not miss any days, but if I have to, I will make them up the next training session, and be complete within the 100 days no matter what.

    Accountability

    I’m going to post each and every day of the 100 days on this site.

    Date: X/X/XX
    Day: X of 100
    Weight:
    Miles:
    Time:

    I will also be using my Nike Run App and FitBit Versa to track miles and time.

    Goals

    • I’m interested in seeing how fast I can get, both in short distance running and endurance. Putting a number on this now seems silly, since I have no idea what I’m doing or talking about.
    • I’d like to culminate all of this in completing some sort of challenge as a new way to test myself, perhaps a marathon or obstacle run. More to come as the challenge evolves.
    • Ultimately, however, the main benefit here isn’t how fast I get, how far I can go, or about doing or completing any races. It’s not about trophies. The real trophy here is forcing my mind to do something for me that it doesn’t want to do. I surmise I’ll find the most real benefits there.

    I’m far from perfect. I’ll never be as strong as a lot of people, as smart as a lot of them, or as fast. What I can do, though, is become the strongest, smartest, and fastest version of myself. 2019 is about taking the first step in that direction.

    Last year, I donated – this year, I’m suffering.

    Are you interested in following this journey? There are some buttons on the right to help make that happen. I don’t run ads, I don’t e-mail, I just post.

    This post proudly written in Gutenberg, the new block editor for WordPress. I’m really starting to like it.

  • Super Mario Party

    Super Mario Party

    I didn’t think this level of disappointment was possible.

    I was so excited for this game. I mean, really, really excited. The first week of October I was at my company’s annual get-together (my colleague clickysteve does this more justice than I ever could in his post) when this game released. A few people at the meetup had it, and were asking me to play – but I had other plans….

    I had already pre-ordered the game and had snacks, booze, family and friends waiting on an epic game night planned back in Texas with a single purpose in mind: Game on the new Mario Party all night long.

    The stage? Me, Kristen, my brother, and his girlfriend. All of us had played previous Mario Party’s, but would come into this night fresh – not knowing the boards, minigames, nothing.

    Turns out none of that mattered.

    The maps are small. I mean, extremely small.

    We went from this in Mario Party 2 on the Nintendo 64:

    to this four generations of consoles later:

    ARE YOU KIDDING ME?

    Even worse, all the randomness and skill is taken out of the game. No more Bowser, no more duel spaces, the mini-games are mehhhhhhh, and the worst part is there’s never any guess about who wins – even bad luck spaces or super bad luck spaces suck.

    Where’s Bowser space where he randomly chooses to be nice and give you all someone’s stars? WHERE THE HELL ARE BONUS STARS?? Literally i’ve seen bonus stars for:

    • Ally space (WHO GOT THE MOST ALLIES??! RANDOM)
    • Spaces Traveled (WHO WENT THE FURTHEST, ALSO RANDOM)

    The game places no emphasis on who won minigames or played strategically. Total crapshoot. Golden pipes are completely broken and can be abused.

    So, to recap:

    • Minigame performance doesn’t matter.
    • Coins don’t matter.
    • If someone gets a lead, there’s pretty much no way to come back
    • In fact: Nothing Matters.

    It takes about three games to realize it’s just a time suck. There are some other modes – rafting and music mode…. they’re pretty boring too.

    Ultimately, it just feels like a rushed and unpolished game.

    In the words of my colleague Chris:

    If all of the minigames we’re available online, then I’d say it’s at least worth getting

     

    Bottom line:

    This. Game. Is. Not. Good.