I’ve been setting up a dev machine on my home server and doing all of my personal projects remotely over SSH . I’ve fiddled quite a bit with the system to make it ergonomic, so here are some of the things I’m quite happy with. Tmux autocompletions Of course, tmux is a t-must! One of the cool things about tmux is that you can programmatically read the contents of a pane via tmux…
I have a home server that I built primarily for “cloud” gaming (read more about that here ). I’m running Proxmox so I can install other services, one of which is my notes machine. After many years of experimentation, I’ve landed on a system that I like: I ssh notes@notes which drops me directly into nvim -c VimwikiMakeDiaryNote and disconnects on close. It’s a very…
At the end of 2024 I decided to build a new gaming PC. My existing one was a typical tower computer from 2012 that was big and loud and too old to run Elden Ring ! So I decided it was time to make a new build, but this time, I wanted to do it a little different. I wasn’t thrilled with the idea of having a large and loud tower at my desk, so I thought it would be fun to build a server that…
WireGuard is a secure, easy to use, and simple VPN solution that is the underlying technology for Tailscale . I’ve personally used it in both flavors and have been very happy with its reliability and the fact that it “just works.” So this week, I decided to learn how it can “just work” by reading the whitepaper describing its design and also watching the 2018 BlackHat…
It seems like 2025 came and went in a flash. Looking back, I’m happy to say that I continued being social and made some more friends. This past year, I.. Built a home server Okay, I actually built it in 2024, but I used it a lot this year and had a lot of fun setting up VMs with Proxmox . I keep all of my notes there, a gaming VM, and various media containers too. It may be recency bias, but…
I keep a weekly journal of notable events, my feelings, and ideas. Most of the time, the value I get out of doing this comes from the act of writing it down in the moment. Writing notable events helps my memory, writing my feelings helps me understand and let them go, and writing my ideas helps me refine them. This is largely unsurprising and overall very valuable to my mental health, but…
Okay, I know I’m finally finishing this post in NOVEMBER when 2024 is almost over, and it was mainly postponed because I lacked 2024 goals. So I’ve reflected on why and shared my thoughts below. But first, 2023 reflections! I made a huge life change that made it a great year for me. I moved to Seattle! It took me awhile to get everything ready and find a place to rent, but I finally…
I use Zoho as my email provider, and I recently learned that you can setup a catch-all forwarding address . This is pretty great, because that means I can receive any email sent to my domain! Go ahead, try it . I want to sort the emails I receive into their own folder, though, depending on the delivery address (for example, lol@miccah.io will go to /catch-all/lol ). It turns out, Zoho supports…
Leetcode, for those who don’t know, is a collection of data structures and algorithms programming challenges. More often than not, I find it difficult to maintain interest in the problems because they all seem so contrived and it’s not that rewarding to solve. There are plenty of articles about what’s wrong with leetcode, so instead, I’m going to share some alternatives…
I use git almost daily both personally and professionally, and my usage follows a pretty regular pattern. By sticking to this pattern, I rarely get into a sticky situation or unexpected state. As many can attest, git is a beast of a CLI tool, but these workflows have been enough to keep my projects organized. Personal usage Repositories where you’re the sole contributor are a lot easier to…
I was talking to my coworker about interfaces when the question arose about why a concrete slice has to manually be converted into an interface slice. I’ll demonstrate this as a simple example. ints := [] int { 1 , 3 , 3 , 7 } var anys [] any = ints // Error! // cannot use ints (variable of type []int) as type []any in variable declaration This is perhaps surprising because semantically…
There’s certainly good arguments for using AI tools like GitHub Copilot or ChatGPT , and there are certainly good arguments against them. This post isn’t about either. Instead, here’s my anecdote as to why I haven’t felt drawn to even try them out. I was talking to a friend about DALL-E and how it is affecting the art community. The whole AI art gave me this odd dystopian…
2022 was a good year for me. I grew, gained more confidence, made new friends and reconnected with old ones. Here’s a laundry list of what happened in 2022 and my thoughts on them. Started keeping a diary For some reason, I like recording things. At the beginning of the year I started using vimwiki and was able to tweak it to my liking. In the past I had used zim which I loved for its…
I watched a video recently about (mislabeled) laziness and how some people aren’t built for the “consistent and organized” lifestyle. I find this subject really interesting because I have noticed the effects of consistency and know how powerful they can be. But at the same time, I have also noticed my motivations and interests ebb and flow. It’s one of those situations…
The root of digital logic is being able to differentiate between something and not something . This little seed has basically built the entirety of the information age. You’ve probably heard it before: a computer is just ones and zeros, but let’s explore this a bit (ha) in the context of programming and data. Bits of Data Data ultimately comprises of ones and zeros (called bits) stored…
Rust’s trait system is pretty cool, and one of the common traits is Display . Defining an implementation for this trait will allow you to use the standard formatter {} with your type, but the official example is a bit misleading. use std::fmt; struct Point { x: i32 , y: i32 , } impl fmt::Display for Point { fn fmt ( & self, f: & mut fmt::Formatter < '_ > ) -> fmt ::Result { write!(f, '({},…
Go is a simple language, but I was pretty confused by the context package when I first learned about it. I had trouble understanding how it could be used to set a deadline or to cancel functions or how it even worked. Since then, I’ve gotten a firmer grasp on how to use it both as a user and as a library author. Let’s start by defining what a Context is and its purpose. A Context is a…
In November of 2017, I began keeping a lab notebook for experiments (inspired by this document ). My last entry was December of 2017 (a whopping two months of use) before I lost interest or motivation or both. I rediscovered it a few days ago when I came across a project I had recorded in it. I had converted the 4-prong plug of a 1950’s era rotary telephone into a jack usable in…
How did I get interested in computers and programming? Well, I grew up around computers. My parents were pretty technologically inclined, so we had computers and printers around the house. I particularly remember playing educational video games on a Compaq and later on, other games like Jump Start 2nd Grade, Pajama Sam, and Putt-Putt and Pep’s Balloon-O-Rama. My older brother also…
When I read a book or watch a TV show, I’m excited to get to a new chapter. There’s more to discover, more to experience, and more to understand. So why are new chapters in life so scary to me when the exact same can be said? It’s hard for me to let go and move on, but I’m slowly progressing into a new chapter of my life. I’m excited and scared about it, but it feels…
This post is a recap of my recent experience job searching and a “thank you” for all the help I received along the way. I’m sure you’ve heard it before, and if not, it’s a common sentiment to describe the amount of effort it takes to interview with multiple companies when job searching. I recently underwent this process for the first time, and I 100% agree with the…
As I have learned and gained more experience using Rust, I noticed that the way I write Rust code is a bit different than the way I write in other languages. When writing an application in Rust, I create the data structures I think I’ll need, then decide on “who owns what.” Which modules are responsible for which functionality. There’s a focus on organization, perhaps…
(on linux) The MSP430 launchpad is a low cost, low power microcontroller that can be used in a variety of embedded applications. This post documents how to program and flash the device on linux without TI’s IDE. Note: the specific MSP430 device I’m using is msp430g2553 . Tools used In addition to GNU Make, I installed these packages to cross compile, flash, and debug. mspgcc-ti…
I have been learning the Rust programming language in my spare time for a little over 2 years now. My first mental model of traits consisted of a contract for types that would implement the trait, similar to Go’s interfaces. It wasn’t until recently when I decided to explore traits during Advent of Code that I started to realize how integrated these contracts are into the language and…
Do you have a home server and would like to securely connect to it? Or are you tired of remembering your IP address? This post, as you may have guessed, describes software and technologies to easily setup HTTPS for your home server. Warning: opening up your home server to the Internet is dangerous without proper precautions. Your server will be found by bots and they will attempt to gain access.
In one of my Rust projects I am parsing very nested JSON structures. Let’s use the following example as our data source (though in reality it is 20+ deep): { 'foo': { 'bar': [ { 'baz': { 'x': 'y' } } ] } } Serde is the de-facto framework for serializing and deserializing data efficiently in Rust. It supports parsing JSON into either strongly typed data structures or untyped JSON values. Rust…
I recently listened to an excellent talk by Jordan Peterson titled Exploring the Psychology of Creativity , and it got me thinking about how it applies to software development. I came to the conclusion that software development is inherently creative. I think this is quite obvious when building a new project or writing new code, however even the maintenance of existing software has some room for…
I recently read a blog post by Dan Luu titled What to Learn . As a life-long learner, the simple title piqued my interest. I don’t tend to take recommendations about what other people find interesting, but I’m glad I decided to at least see what it said. The advice Dan gives is not concrete or cheap, but the type of advice that incites self reflection and personal growth. He advises to…
Welcome to a series of posts cleverly titled Ground Up , where I explain computing concepts from the ground up! We’ll explore how computers work starting with transistors and going from there. This post specifically covers finite state machines.
Two weeks ago I participated in the first ever LangJam , the goal of which was to create a programming language based on a theme in a 48 hour period. Now, I’m not exactly a seasoned programming language creator, but I am quite interested in the art. This jam was an excellent opportunity for me to grow my skills, interact with the community, and “complete” a minimal language just…
Welcome to a series of posts cleverly titled Ground Up , where I explain computing concepts from the ground up! We’ll explore how computers work starting with transistors and going from there. This post specifically covers how to create memory from gates.
Welcome to a series of posts cleverly titled Ground Up , where I explain computing concepts from the ground up! We’ll explore how computers work starting with transistors and going from there. This post specifically covers gates, binary math, and adders.
Welcome to a new series of posts cleverly titled Ground Up , where I explain computing concepts from the ground up! We’ll explore how computers work starting with transistors and going from there. This post specifically covers transistors, digital logic, and binary. Part 1: Bits [Part 2: Gates]({% post_url 2021-07-06-ground-up-gates %}) [Part 3: Memory]({% post_url…
Gratitude is one of the simplest and most wildly rewarding practices I have ever adopted in my life. It’s so sneakily simple that you may think it’s nothing special, but regularly practicing gratitude changes how you think in the most positive way. It changes how you see life, how you feel, and how you experience the world. Everything in life can be viewed in countless different ways,…
This is a scenario I have ran into a couple of times. I have a server that doesn’t allow logins with a password, and I need to setup a new computer or operating system so it can login. It’s a simple problem, but I decided to record how I do it in case it helps others. This method requires you to already have pubkey access from another computer. Copy the new public key to the computer…
In January of this year, I left my corporate software engineering position to do nothing, and it was one of the best decisions I have made. Before I get into the “why”, I’d like to point out that I am in a fortunate place to be able to leave my main source of income without lining up my next source. I was able to do this because I am young with few responsibilities, some savings,…
Eight weeks ago I started tracking what I worked on each day . I laid out a star board for all of my interests, and I would fill in a square if I gave it attention that day. I call this “watering my ideas,” and it has hugely helped me remember and allocate time for the projects that I wasn’t giving enough attention to, including this blog. Eight weeks ago I also gave myself a…
When I first learned how to program, I was so excited about how I could create anything ! The possibilities were endless and I could create in any way I choose. This is so powerful for creative coding, but I have learned that designing systems any way I want is not the best approach in a professional context. For professional systems, opinionated designs flourish. The more specific problem your…
Computers are like onions. They stink, make you cry, and when you leave them out in the sun they get brown and start sprouting little white hairs. Wait, that’s not right. Computers are like ogres! They have layers. Lots of layers. In fact, modern technology is built on abstractions. This is fantastic for containing complexity, assuming everything works as intended, because you can work on…
As the security industry grows and more and more critical systems are put online, the demand for security focused developers will grow as well. Security focused development, as the name suggests, is software development with security in mind. Software engineers need to think like hackers while developing systems in order to keep users secure. As an engineer with a strong interest in ethical…
I first learned of parkour around 2012. I thought it was so cool, but I was too scared to even start. All the videos I saw were these crazy jumps at height or doing flips over concrete. It took me eight years to finally practice it myself, and I have learned so much from my experiences. Parkour is such a unique and interesting sport because it is individualistic, creative, and physically…
When creating programs, you will almost certainly operate on data. This could come from users submitting information to your website, or data read in from a database. Wherever it comes from, developers define how that data is used and what can be done with it. As such, it is important to think whether the data is trusted and safe to operate on, or if your program can be exploited when the data is…
A fundamental part of software development is creating functions. It keeps your code organized, readable, and prevents duplication. Like any other skill, writing good functions can be improved with practice and intention. If you learn anything from this post, it should be that function call sites should be readable! A developer should be able to infer what a function does without knowing its…
There are many programming languages, but they can all be put into one of two groups. Those that are dynamically typed and those that are not. This post compares the two styles and will conclude with reasons why professional software development should use a statically typed language. Let’s start with dynamic typed languages like Python and JavaScript. These languages are fantastic for…
All big things started small. It started as a thought, a seed, and with consistent watering grew into a big tree. Doing little things consistently will grow into big things. It’s easy too! The hardest part is regularly showing up. I like to imagine my ideas as trees. Each one is unique and they always start as a seed. By giving an idea attention, I’m watering it. If I don’t water…
..everything looks like a nail. This is one of my favorite quotes because it is applicable to so many domains. As Wikipedia states, it depicts a cognitive bias towards using a familiar tool in any situation. Humans are very creative, and if all we know is hammer, we will definitely find a way to use it on a screw. But the beauty in this quote is the reminder that there probably is a better tool…
Today I read this article titled Myths about /dev/urandom . I stumbled upon it when trying to figure out why writing /dev/random to a hard disk was taking so long, and I learned a few interesting things. The most important being to always use /dev/urandom because it doesn’t block and it is just as secure. I also learned about a syscall that behaves similar to /dev/urandom but will block when…
Capture the Flag (CTF) events are common competitions in the security field. Many CTFs use Jeopardy style challenges where you can pick and choose which ones you want to solve with varying point rewards. It is a ton of fun, but when I first started, I thought the goal of CTFs were to win. You get the most points, you win, and you get a prize! Of course that’s the point, right? Well, no, not…
If you have ever programmed with REPL driven development, you will know that it is like programming without a blind-fold on. It makes development so much easier, faster, and have fewer errors. So I decided to add a generic REPL to vim. This is so simple, yet so effective and flexible. The idea is to send highlighted text to the terminal window (included in vim already). Since the terminal is…