Posts Archive

Agents as just a tool

August 7, 2026

Almost all of the work I delegate to agents is work I could have done myself. The agent gives me two things: more thoroughness (which is now always better) and faster completion. I could sit down on a quiet day (which never happens) and type up a technical design doc for the team. I could dig through the logs and metrics correlating the latency bump from overnight. I could grep the codebase for the error message and trace through the code manually.

Welcome, Juniors!

June 30, 2026

I believe one of the reasons I’ve been pretty successful in adopting and utilizing Agents iny engineering work is relying on the decades of hard fought knowledge, experience, and taste. How do folks without that get it in this age of AI? It’s unacceptable for me to say “AI is only for seniors and above” or other nonsensical takes. Here’s what I’m currently thinking. And as with most everything “rethought” for the AI era, it’s the same as before.

System Design used to be reserved for the senior folks. They’ll hand down a document showcasing the new architecture or new service. Agents are making it so everyone can do some system design because even the smallest features can benefit from more intentional design.

AI system-design

Agents Calm Down

March 30, 2026

Agentic coding harnesses are violating the unix philosophy and trying to become the everything app for coding (and work and personal assistant and so on).

AI Thoughts

Use Your Noodler

May 24, 2025

A former coworker of mine over 8 years ago put this image into my head that has never left. He was working as my manager at the time and he had an upcoming large, foundational shifting feature that he wanted to let me know was coming. He said “Don’t do anything right now, but just put this in your noodler and see what comes out.”

Thoughts Slow then fast

golibnotify is a Go library for sending desktop notifications on Linux. It is a wrapper around the libnotify library.

There are some memory leak fixes in the latest release, v0.2.0.

Golang Open Source My Stuff

I often get large JSON files which contain no newlines or indentation. I’d like to look at these reasonably in neovim, but it’s been cumbersome until today.

TL;DR: You can replace the contents of the buffer with output formatted by jq with one command: :%!jq .

TIL

How can a tool that is indescernably wrong be anything more than a toy?

large-language-models

Here’s a super quick one-liner to copy the current branch’s PR URL to your clipboard (for posting into Slack, tickets, etc.) $ gh pr view --json url --jq .url | <pbcopy | xclip -sel c> Remember to replace the copy command with your platform’s specific command. This would also make a good shell alias. Also, also, I might try setting up Clipboard for multi-platform goodness. Happy PR-ing! – Chris

git Command-Line

Web Scraping 2.0

June 23, 2021

With the wide adoption of robust front-end frameworks and CSS-in-JS, traditional methods of targeting xpath or CSS selectors for scraping data from web pages are becoming ineffective. However, this new paradigm of front-end development leaves a key opportunity to improve the web scraping experience.

Thoughts

Magic PR Journeys

March 22, 2021

I was recently having a conversation about Pull Request reviews with a colleague of mine and I mentioned that when I’m ready to look at code for a PR, I review one commit at a time in order. After a confused pause, she asked how I could get the full context by only looking at one commit at a time. I supposed to her that perhaps the full context is not what facilitates a better review. Instead, we should follow the journey the developer who opened the PR has set out for us through their commits.

Practical PRs

Commit Before Code

June 26, 2020

I propose a case for writing all of your commit messages for a feature, bug, pull request before writing a single line of code and afterward not adding any additional commits to your branch. Plan and execute. Give clarity and focus to your reviewers. Here’s how.

git

Cleaning Up Docker Images

December 30, 2019

After a while of using docker locally for development, you may notice that you have a lot of images and containers laying around on your disk that you no longer use. This post shows you an effective way to clean up 50 of GB or more of disk space. The first, best thing to do is clean up dangling images. These are docker images that are not referenced by a container.

docker

The Golang web app framework, Buffalo, has a very good templating system called Plush. It adds some nice features to the standard library templating specific to web applications such as partials and local context. It’s pretty intuitive if you’re coming from Rails. While the default setup makes rendering a template as a response to a request super easy, using rendered template content elsewhere isn’t so obvious. Once you see it though, it’s pretty straightforward to render a template to a string within your action handler functions.

Buffalo Golang

For many recent projects, I’ve been using the excellent Buffalo web development eco-system. It’s a great collection of tools and packages for building web applications without needing to reinvent the wheel for each app. In this post, I’ll be highlighting a technique I use based on the service object design pattern of abstracting business logic from your applicaton implementation to increase readability and reusability. But, why? Here’s a scenario I find myself in with increasing frequency.

Golang Buffalo

Let’s examine a refactoring to move code to follow the open/closed principle. We’ll see how the resulting calling code becomes much easier to read locally, without having to open other files or classes to understand what’s going on. Open/closed principle First, let’s do a quick recap of the open/closed principle. Classes should be open to extension, but closed to modification. What does that mean? Let’s take it a half at a time.

Ruby Reactoring

Recently at Videofruit, we had a fun internal exercise of building an app in single workday. That app ended up being an Email Service Provider picker where you answer a series of questions and we recommend an email service provider to meet your needs. In this post, we’ll breakdown a simplified version of that app focusing in on how we built a routing mechanism that is simple but effective and uses no external dependencies.

React Javascript

I work on a lot of little side projects. Many of them are short-lived and small scale. I start them to learn a new technology, to learn a new concept, try an idea, or just to see if I can actually build something cool. I should also mention that my memory is terrible. I “remember” things by figuring them out again. Rote memorization is basically non-existent to me. I’ve recently come up with a new best practice for my side projects which has saved my butt several times now.

How To Self-Reference

Git References

April 6, 2016

Everyone knows how to checkout a branch, git checkout master, or how to look at a specific commit, git show a1c8b6d. But few know that branches, tags, and commit SHAs are typically interchangeable in these and many other git commands. Plus there is a whole set of modifiers to reference commits near to specific commits. In this post, we’ll explore all these techniques to become expert git referencers. References Below we will explore the different ways we can express a commit in git.

git

Over the past few months, I’ve been getting my hands dirty with containers, Docker, and Kubernetes in an effort to get some hands on experience working toward microservices. I’ve been building up a small application to generate and serve Sudoku puzzles. My original goal was to see how many puzzles with unique solution I could actually find, but that’s another post entirely. There are already many great tutorials about Docker and Kubernetes on Google Container Engine, so I won’t go into getting started details here.

Containers Kubernetes Docker

New blog; New identity

February 4, 2016

You may have noticed a few changes around here. First, a new domain name: codegoalie.com. I am moving away from ChrisMar035 in favor os something, as I said on Twitter, that “better show my love of programming and blocking vulcanized rubber disks with my body.” Also, my last name is not Mar. Along with Twitter, I’ll be moving other usernames to codegoalie shortly. I already snagged codegoalie@gmail.com. Either way, if you see codegoalie or chrismar035 anywhere, it’s probably me.

Announcement

Here’s a quick trick I’ve been using for a while, but have found that not many others know about it. It’s a way to grab the arguments from the last command you executed. Command line expansion allows you to do many things, but today we’ll focus on just argument expansion. First to simply repeat the last command with !!. This is most helpful when needing to prefix a command; with something like sudo or bundle exec.

Command-Line

When working on projects with multiple developers following a feature branching workflow, you can end up with a lot of branch laying around. I’ve been trying to optimize my branch cleanup workflow for a while now and had a big breakthrough recently. UPDATE: I now use a shell script which has the meat of the git-sweep functionality. Thanks to @pengwynn for letting me steal that. Before we get to that, I must mention git-sweep.

git Self-Reference

Recently I’ve been dabling in Go. I was lured in by the lore of a purposefully simple language with amazing concurrency features. While that is true, I have to admit that I stayed around for the documentation. Golang.org has a this great Tour which walks you through the basics of the language through interactive examples and exercises. Secondly, the godoc command has a --server flag which spins up essentially a local copy of golang.

golang

As a web application developer working in a company full of mobile app developers with a mobile focus and as a full time Android user, there’s a natural gravity in my universe toward mobile apps and the power of the app plus server backend paradigm. Naturally, I wanted to build my own app and really see what it is like on the other side of the API. {% img left /images/android_first/car_icon.

Android

As I’ve been working in git and crafting my commits with rebase working toward creating pull requests which are easy to read, review, and comment, I’ve been noticing myself fall into habits of naming commit messages similarly which contain code to acheive similar ends. Further, when I struggle to find the correct words for a commit message, it’s often easier to being with a familiar word to get things flowing.

git

UPDATE (Jun 7, 2013): I created an ascii.io video demo of autosquash for your viewing pleasure. Pull requests are an extremly crucial part of our workflow at Mobile Defense. We pride ourselves on producing quality code and we do not subscribe to the git-blame “I didn’t write it” culture. We all take responsibility for all the code we produce, as a team. As such, being able to review our code efficiently and thoroughly before it gets into master is a goal we are constantly looking to improve upon.

git Pull Requests

We’ve all been there: just finished a nice new feature, deployed it out to production only to find that you’ve completely overlooked an edge case or use case which is now totally breaking your app. Sometimes you have to push a big hot fix. It has to get in immediately. It can’t wait for writing correct tests or other better abstractions and implementations. What to do? What to do?

git

I was getting this error and the excellent Zeus rails environment loader gemwas crashing making it a huge bummer to dev. Luckily, I found a fix in one of the open issues on the project. It was easy to fix, just run a bundle install to add the missing gems: Easy as that. Hope this helps someone else! – Chris

How-To Self-Reference

Oh no! I’m screwed! Better try to remember what work I did and recreate it… :( J/K! This is git! Of course there’s a slick way to recover what you lost. Here’s my situation: I was working on a feature branch happily coding away. Finished the feature, rebased it quickly to fix a typo and then merged it into master. All’s well in my world. However, that was days ago and today I just realized that I accidentally removed one of my commits from the feature branch while I was working on it. No worries. Here’s how I got the commit back with relative ease.

git How-To

Everybody loves the SuperBowl commercials! Last year, I hacked up a script to randomly generate items to create your own bingo cards. This year, I improved the script to actually generate the cards as a PDF file based on an excel sheet of bingo items.

My Stuff Ruby

This is an account of my adventure with delegation from problem to apparent solution to bug in ActiveSupport to you’re doing it wrong!

How-To Ruby On Rails Self-Reference

Not knowing perl, I set out to write my own script in Ruby to send auto-responses from e-mail addresses setup in a vmail folder structure. You don’t need to use postfix, just have the ‘new’ folder where new messages are stored.

How-To Self-Reference

Trick out your Vim

June 25, 2010

Today, I’m going to add some plugins and scripts to make better use of Vim. I have not started this project and I will be updating this post throughout the day with my finds and experiences.

I generally use Vim to code web applications. My site at work run on PHP and at home I’m working with Ruby on Rails. So, I’ll be looking for something to specifically help with that, but who knows what I’ll find.

How-To

Sometimes it can be kind of painful to discover a cool new setting or mode for on of your favorite programs. For instance, I use TTYtter, a terminal based Twitter client. A few weeks into using it, I discovered it had ReadLine support for tab auto-completion of @usernames, in-line editing of posts and command history (up key). Awesome right? I know. Except, now I need to change my .ttytterrc file on my laptop, home computer, work computer, everywhere. Also, how do I get it there? USB drive, e-mail to myself, browse the network, etc. Being geeks, we don’t want to go through all that.

How-To

The Ubuntu Blog has a nice lil' article about keeping SSH sessions alive It basically boils down to editing your /etc/ssh/ssh_config file and adding the following: # /etc/ssh/ssh_config ServerAliveInterval 5 The number is the number of seconds to send the small keep alive which keeps the connection open. Ubuntu Blog suggests changing it from 5 to 240 or 300 (4 or 5 minutes). – Chris

How-To Self-Reference

Update: HURRAY!!! It was approved!! Get it now at http://www.getpersonas.com/en-US/persona/140288

My Stuff

PianoBar is a console client for Pandora Internet Radio. For me, this is a huge discovery. If you run Ubuntu, the flash player for Pandora can be a pain in the ass to install. Plus, on my netbook, the flash plugin for Chrome usually eats about 40-55% CPU constantly. A console client for Pandora will resolve all these issues.

How-To Self-Reference

Before I start talking about colors, let’s talk font. Consolas. That’s all you need to know. By far the best programming font. Get it. Use it. Love it.

How-To Self-Reference

Here’s my Problem: My website sends text files to a partner’s site via FTP. Our partner site sends us the results of their processing the file in an e-mail. This e-mail is a the direct output from their processing script. Or, the relevant details are buried in a bunch of garbled text. My Solution: I first looked at message piping, but my hosting provider doesn’t provide an easy way to do this.

How-To