I’ve been dabbling in Golang on and off for a little while now. Recently I was looking for a package to read and parse configuration files with the following requirements in mind:
- Be fast.
- Use environment variables and JSON files (in that order).
- Support hot reloading.
I looked at some of the popular configuration packages, but didn’t see anything that I loved. Many of them don’t meet the requirements I had in mind or are more complex than I’d like.
So, I decided to write config — I know, it’s a great name. It’s pretty simple. We cache values in memory to minimize disk IO. On
SIGHUP (or any time you call
config.Reload()), we clear the cache, so you can update the configuration without restarting your app.
Usage looks something like this:
There are more examples and details on the API in the README on Github.
If you have questions or ideas, issues and pull requests are welcome on Github. Let me know if you use it!
I published my first npm package over the weekend: github-auto-deploy.
I’ve been playing with Github Auto Deploys recently. There are a couple things I’m doing here that I think are different from the typical auto deploy workflow.
- Using the
deployment event. Github has a way to differentiate
deployment. Deployments have the added benefit of depending on Github statuses, like
ci/travis-ci. Having deployments depend on a test suite is nice.
git fetch && git checkout. Instead of doing a
git pull and slowly updating files depending on the network speed, first fetch all the files and then do a quick file pointer swap to instantly update all files at once.
PORT=1234 SECRET="Swifty4Lyfe" gad /var/app /var/app/bin/deploy.sh
In this example,
deploy.sh might look something like this:
service node-app restart
If you have questions or suggestions, let me know!
Photon, the image service hosted by Automattic, does lossless compression automatically. Page Speed will probably still complain that images aren’t compressed enough. Luckily, Photon has a way to fix that.
There are a couple of parameters, quality and strip, that will further reduce the file size of JPEG images. Quality is pretty straight forward. The strip parameter will let you strip EXIF and color data. I use a snippet like this to set the quality to 80% on my site.
The results can be pretty dramatic. At full size, this image of downtown Madison goes from 16MB to 2.7MB by setting the quality to 80%. That’s a big deal on a mobile connection and it’s pretty hard to spot the difference on most images unless you’re looking at them side by side.
Let’s have a little fun on a Friday. What’s the command prompt on your local machine?
I use Zsh, so I also have a right prompt. Most of this is pretty obvious, but I’ll explain some of the cooler things that might not be.
- dashboard is the current branch I’m on in a git repository
- fda1011 are the first 7 characters of the hash of the current commit
- The X means there are uncommitted changes
- The arrow is green when the return code of the last command was 0 and red otherwise
cd automatically calls
ls as well
It’s all available on Github.
Coming from Subversion, the extra steps involved in working with a Git repository can be confusing. Here are some basic concepts and commands to get started with Git.
I find that actually doing something is the best way for me to understand. If you’re the same way, the Github tutorial by Code School is great.
There are a couple conceptual differences between Git and Subversion that it helps to understand before getting started.
Centralized vs Distributed
Subversion is centralized version control — every commit lives on a central server. Git is distributed version control — everybody has a copy of the repository. When you commit to subversion, the push to the central server is implicit. The commit and push are discrete actions in Git. This means you can do work and commit changes without necessarily being connected to the Git server. Another advantage is the ability to make commits locally without necessarily publishing your work.
File vs Change-based version control
Subversion is file-based — when you make changes and run
svn commit, it commits all the changed files by default. Git is changed-based — when you make changes, you have to run
git add to “stage” changes. You can get similar behavior to Subversion with
git commit -a. The “a” flag tells Git to add all changes in tracked files.
- init – Create a new repository.
- clone – Set up a repository that already exists on a remote server.
- add – Stage changes to be committed.
- commit – Add changes to the local repository.
- push – Push unsynced commits to a remote repository.
- pull – Pull unsycned commits from a remote repository.
Get the latest version of the code. If you already have the repository, you can use
git pull to get the latest changes. Otherwise,
git clone will download the code from a remote repository and set it up locally. If this is a new repository, you can set it up with
Share your changes.
git add <file>; git commit; git push or
git commit -a; git push.