-
Austin Tech Week Recap
Formally known as Austin Startup Week, Austin Tech Week provides founders, funders, and freelancers the opportunity to meet, connect, and share with one another. This year was my first year in attendance and there were many things about this conference that I liked better when compared to many others. I made a lot of new friends and connections around the startup scene in Austin and learned a lot about sizing markets and strategies to approach fundraising. In this post, I share a bit about my experience, the sessions I chose to attend, and some of my key takeaways from the conference.
-
Addressing Addiction without AA
Health and Healing - Part 4
After 5 months since my last relapse, I figured it was a good time to check in on my recovery. In this post, I wanted to share more about my journey and the challenges I’ve faced along the way, including finding a non-faith based group. Most people refer to Alcoholics Anonymous (AA), but don’t understand just how religious (specifically Christian/Catholic) those groups can be. While I’m still quite spiritual, this approach doesn’t work for me and many others.
-
Observability from Scratch
Back in February, I found myself quite frustrated with many of the "modern" observability stacks on the open source market. At my previous company, my infrastructure engineer spent a good amount of time fighting with the LGTP stack. After work, I found myself venting to a friend about how unnecessarily complex the open source ecosystem has become. Having worked at startups for the last 4 years, I've seen just how hard it can be to deploy a comprehensive observability and business intelligence solution. In this post, I'll discuss my rationale for abandoning many popular stacks out there today in favor of one of my own design.
-
Dismantling Decades of Diet Damage
Health and Healing - Part 3
A few months back, I remember seeing some concerning discourse minimizing the impact eating disorders have on someone's life. I wanted to say something at the time, but wasn't in a place where I could. For years, I've struggled with an eating disorder that I didn't know was there. It's claimed months of time from my work over the years, and has sent me to the emergency room on more than one occasion. Today, I share the many other ways a pervasive eating disorder impacts my life on an ongoing basis.
-
Countdown - the Card Game
Over the summer, I made a more conscious effort to spend dedicated 1-1 time with my child. We often spend our time together playing board games, playing piano, watching movies, among other activities. Recently, I've been watching clips from the UK game show "Countdown" and found myself really enjoying the math portion. In this post, I discuss how my child and I came up with a way to play this game using a single deck of cards.
-
"Slacking-off" in 2016
Work Smarter, Not Harder - Part 1
Let's take a slight detour from the health and healing series to talk a little more tech. Specifically, I want to share a story of a project I worked on back in the Summer of 2016 while at Indeed. It's a great example of where working smarter, and not harder, led to less hands-on work, and being able to spend my day playing pool (billiards).
-
Loss and Love
Health and Healing - Part 2
While it's not something that I actively sought support for during FMLA, loss and grief has been a fairly consistent theme throughout the last few years. From going no-contact with some family members, to saying goodbye to several key relationships in my life, to the death of a chosen family member.
-
The Best Investment I've Ever Made
Health and Healing - Part 1
Today, I want to share with you the best investment that I decided to make in my life. The investment I made in me. Since the end of May, I've been on a journey piecing my puzzle back together. It was not a decision I took lightly and required great sacrifice along the way.
-
Remote Work Essentials: One-on-ones
While peer one-on-ones can provide a lot of value, a big argument against them is that they require a lot of time and can cost a lot of money. In this post, we’ll take a deeper look into the time commitment and cost for peer one-on-ones.
-
Bye-Bye Twitter
I took my Twitter account that I reserved back in 2012 with hundreds of followers and deactivated it. Before deactivation, I created a new account and invited folks to follow me there. This not only gave me a fresh start, but it also gave me a chance to curate who I follow and who I allow to follow me a bit better than I had before. After having it up for a few months, I finally decided to deactivate it. For good. Here's why, and how my life has been better because of it.
-
Extending my Security System with a Raspberry Pi Network Bridge
It doesn't happen a lot, but every so often I come across a device that isn't wi-fi supported. This latest case was my security system. On one hand, I like that my cameras aren't taking up bandwidth on my home network and that the system is largely a closed loop. On the other, not having access to my security system without having it tethered into the router is a bit of a pain. Today, I show how I set up and configured a Raspberry Pi to act as a WAN client for a connected device.
-
Exploring Redis High Availability
Recently, I've found myself using [Redis][] for more of the projects that I work on. Redis can be used in a variety of ways. It provides functionality for queueing, set operations, bitmaps, streams, and so much more. In this post, I dive into the variety of ways Redis can be deployed. I'll cover the benefits, tradeoffs, and even some uses for each deployment. Finally, I'll describe the deployment that I recently put together.
-
Renovate your GitOps
Recently, I noticed Renovate submit pull requests for dependencies in my Helm v3 charts. This gave me an idea. What if Renovate could automatically manage something like a GitOps repository? This means organizations would no longer need to tediously query for newer versions of applications. Instead, they'd automatically receive a pull request when an update becomes available. In this blog post, I demonstrate how to set this up for an ArgoCD GitOps repository.
-
Pronoun Practice
Historically, my blog has largely been focused on technology. This was because of where I was in my career. And yet, my career doesn't solely reside in tech. As a transgender individual, I frequently need to correct peoples use of my and other peoples pronouns. Whenever a transgender person needs to correct someone, we pay an emotional tax. While it might seem small at first, you need to consider that individuals full experience. In this post, I share techniques I found effective at getting better with pronouns.
-
Running a Service Mesh on Raspberry Pis
Many people have asked how to support deploying service mesh to Raspberry Pis. It wasn't until September that this started to be possible. Linkerd recently released support for arm64, but has had support for it in edge versions since August. Many envoy based service mesh have been blocked by support for an arm-compatible envoy image. In this post, I'll demonstrate how to deploy Consul to support a service mesh on Raspberry Pis.
-
Adventures in Path Based Routing
Path based routing can be an extremely useful feature. It enables you to serve a single page app and an API on the same domain. This can often be helpful when starting a project, but don't want to handle things like cross-origin resource sharing. In a recent project, I wanted to split traffic between a static site hosted on GitHub (or S3) and an API running in the cluster. In this post, I'll demonstrate some less common approaches to path based routing using Kubernetes resources.
-
Docker Registry Setup
DockerHub's impending download rate limit presents an interesting challenge for some. From hobbyists to open core ecosystems, projects are trying to find ways insulate their users. For my projects, I chose to deploy a simple registry mirror. One nice thing about this project is that the system is largely stateless (and cheap to run). In this post, I'll walk you through my deployment.
-
Local Ingress Domains for your Kind Cluster
Tools like minikube and kind make it easy to get a kubernetes cluster up and running locally. Unfortunately these tools are limited in their capabilities, namely a lack of load balancer support. As a result, the community developed solutions like kubefwd and minikube tunnel to expose services. While this approach works, keeping a dedicated terminal open during development can be tedeous. In this post, I show how to set up an ingress controller in a kind cluster and pair it with a private, locally addressable domain.
-
Show us Your Setup!
Indeed had an internal blog series called "Show us Your Setup." It was a great way to get an idea of others workspaces, the equipment they use, and software they run. Recently, I had noticed a few folks doing a walk through of their equipment. In this post, I will show and walk through my setup. I'll discuss the things I like, and the things I don't.
-
Learning Jsonnet
Jsonnet is a powerful data templating language. It extends JSON with variables, conditionals, functions, imports and more. As an engineer who never touched the technology before, I often struggled to understand it. In this post, I share my experience learning Jsonnet and my thoughts behind developing a starter.
-
SLOs for Open Source
Open source software has been used to build organizations for years. From libraries to complex infrastructure systems, the open source landscape provides a vast sea of solutions. For larger infrastructure projects, organizations are asking maintainers for service level objectives (SLOs). Many do not publish or provide any, even when projects come from organizations who likely had SLOs in place. In this post, I walk through my process for developing indicators and objectives for open source projects.
-
Working with Protocol Buffers
Google's Protocol Buffers can be a power piece of technology. Yet, I often feel they are undervalued, underutilized, and underappreciated. Since joining Indeed back in 2013, I've had a fair amount of experience working with them. In this post, I discuss many of the benefits to using the technology.
-
Implementing Breadth-first Search Over gRPC
deps.cloud is an open source project that I started. It's a tool that helps companies understand how their projects relate to one another. While graph databases do exist, finding administrative and engineering support is often hard. On the other hand, finding support for relational databases is easy. In this post, I share lessons learned while implementing a graph system on top of common relational databases.
-
Reducing cost on DigitalOcean
In a Twitter thread between Vito Botta, Alex Ellis, and myself, we talked about how expensive DigitalOcean can be for personal projects. You often start off small with just a cluster for compute. Eventually you need a database to store your user's information. As time goes on, these needs only continue to grow. In this post, I share some cost-saving techniques I've used to reduce my bill.
-
Conclusion: Tracking impressions on repositories
In this post, I bring a conclusion to my recent series on tracking impressions on repositories. While it's the last in the series, I will likely continue to post updates as time goes on. For now, I feel my current approach has yielded a wealth of information that I'm still fully digesting. In this conclusion, I will walk through how several of my metrics have changed since my original approach.
-
Follow up: Tracking impressions on repositories
Last week, I put a tracking pixel on my GitHub repositories. And I've got to say, the results have been really interesting. In this post, I follow up on what I've learned since last week, changes I've made, and improvements I'm working through.
-
Tracking impressions on repositories
When working on open source projects, I often wonder how to improve the experience for my users. In order to improve my users experience, I first need to be able to measure and monitor it. On a website, I have Google Analytics which can help me understand my users paths through my site. This capability isn't as accessible on GitHub or GitLab as it requires JavaScript execution.
-
Home Lab: 1 year later
Last year, I wrote a series of blog posts covering the set-up of my home lab. The first post was on my decision to run Rancher's k3s on my Raspberry Pis. Since then, I've made a few modifications to how its all managed. In this post, I discuss some of these changes I made over the last year.
-
Returning to Indeed
In November 2018, I decided to return to Indeed.com. The decision to return did not come easy. Since then, I have frequently been asked about my reasons for rejoining. In this post, I hope to cover my interviewing process and some reasons that I had for returning.
-
Building deps.cloud
Over the last year, I've been heavily working on deps.cloud. deps.cloud draws it's inspiration from a project that I worked on at Indeed.com. Since it's original inception, there had been a heavy push to move it into the open source space. In this post, I'll discuss the process and rationale I applied as I rewrote this project in the open.
-
Checking Service Dependencies in Kubernetes
Back in July, I found myself needing to better coordinate deployments of my applications to Kubernetes. After searching around, I found many ways that people where trying to solve this problem. Some used shell scripts to apply multiple YAML files with a fixed time sleep between them.
-
Using docker-buildx for Multi-architecture Containers
When you build a container image, it's typically only built for one platform (linux) and one architecture (amd64). As the Internet of Things continues to grow, the demand for more arm images increased as well. Traditionally, in order to produce an arm image, you need an arm device to do the build on. As a result, most projects wind up missing arm support.
-
Moving Licenses - Apache 2.0 to MIT
Yesterday, I decided to switch the license that I apply to my personal projects.
-
Raspberry Pi Cluster Monitoring
In my last few posts, I talked a bit about my at home development cluster. Due to the flexibility of my cluster, I wanted to provide a monitoring solution that was valuable across each technology I use. In this post, I discuss how monitoring is setup on my cluster. I'll walk through setting up each node, the Prometheus server, and the Graphana UI.
-
Raspberry Pi Cluster Setup
Previously, I talked about the different orchestration technologies that I've run on my Raspberry Pi cluster. That post was rather high level and only contained details relating to k3s. In this post, we'll take a more in depth look at my cluster setup and my management process around it.
-
k3s on Raspberry Pi
Over the last few days, I've been revisiting Kubernetes on my Raspberry Pi cluster. I hope to share what I learned in the process and some of the tooling that I discovered along the way.
-
Easy Steps to a 64bit Raspberry Pi 3 B/B+
I was quite surprised to see how under documented installing a 64-bit operating system onto a Raspberry Pi is. Many articles out there talk about needing to compile Linux, which sounds oh-so-pleasant. One day, I stumbled across a 64bit OpenSUSE version that was compatible, but the installation instructions required a Linux OS to be done properly. Since I primarily work on OSX, this presented yet another barrier.
-
gitfs - A FUSE File System
During my first employment at Indeed, I cloned every repository down to my machine. This approach worked for a while when the number of repositories was small. As the organization has grown, the solution quickly became unmanageable.
-
Reflecting on Past Projects - JavaScript
Every now and then, a friend of mine reaches out and discuss previous projects we had worked on together. As we looked back at code, there was some obvious lessons that we took away from the project. In this post, I reflect on several JavaScript projects that I have worked on over the course of my career.
-
AWS Lambda - Handler Lifetime
While working at Dosh, I had pretty heavy exposure to managing NodeJS services running in AWS Lambda. During that time, I had learned a few things about the platform that can be leveraged when writing Lambda services. Some of these lessons may influence how you write services but can also give you some performance boosts. It’s important to note that some of the behaviors that I observed about AWS Lambda may not apply to other serverless technologies.
-
AWS Lambda - Local Development
While working at Dosh, I had pretty heavy exposure to managing NodeJS services running in AWS Lambda. During that time, I had learned a few things about the platform that can be leveraged when writing Lambda services. Some of these lessons may influence how you write services but can also give you some performance boosts. It’s important to note that some of the behaviors that I observed about AWS Lambda may not apply to other serverless technologies.
-
NodeJS gRPC Code Reference
While working at Indeed, I did a fair amount with gRPC. I became rather familiar with the Java, Go, NodeJS, and python implementations. During my vacation between jobs, I decided to revisit one of my old projects and try to migrate it to using gRPC. By doing so, I would be able to support a larger variety of request types (streaming, non-streaming, etc).
-
Delaying Asynchronous Message Processing
At Indeed, we always consider what’s best for the job seeker. When a job seeker applies for a job, we want them to have every opportunity to be hired. It is unacceptable for a job seeker to miss an employment opportunity because their application was waiting to be processed while the employer makes a hire.
-
Component Scanning Library Code
Component scanning packages can be both your best friend and worst nightmare. In this post, I will cover several bad practices when it comes to component scanning. In detailing a few of these anti-patterns, I will also offer a few better patterns that are much cleaner to use.
-
Spring Bean Method Invocation
In my day to day development, I spend a fair bit of time working with Spring since it offers a lot of scaffolding to get a project off the ground. At Indeed, I spent a fair bit of time upgrading us from Spring 3 to Spring 4 and came across many good uses of Spring and many bad ones too. In this Bad Practices series, I will talk about some of these bad practices, why they should be avoided, and what you can do instead.
-
Gracefully Degrading Functionality Using Status
In a previous blog post, we described how to use our Status library to create a robust health check for your applications. In this follow-up, we show how you can check and degrade your application during an outage by: short-circuiting code paths of your application; removing a single application instance from a data center load balancer; and removing an entire data center from rotation at the DNS level.
-
Docker Machine DNS Resolution using Consul
Developers at Indeed have recently switched over to using docker for local development. Being one of the earlier adopters, I fell in love with the type of workflow that it enabled. It allowed me to create seamless environments between both my desktop and portable workstation. The tooling did this by allowing you to resolve container names as hosts in your web browser.
-
Introducing LAAS
LAAS is an abbreviation for LevelDB as a service. LevelDB is an implementation of a log structured merge tree (LSMTree) provided by Google. This data structure aimed at providing a high write throughput. When attempting to use LevelDB, I found it difficult to track down supported libraries in different languages.
-
Status: A Java Library For Robust System Status Health Checks
We are excited to highlight the open source availability of Status, a Java library that can report a system’s status in a readable format. The Status library enables dynamic health checks and monitoring of system dependencies. In this post, we will show how to add health checks to your applications.