Skip to content

Instantly share code, notes, and snippets.

View brandur's full-sized avatar

Brandur Leach brandur

View GitHub Profile
@brandur
brandur / code_mod.rb
Created October 28, 2024 12:46
Go code mods
def replace_vars(text, vars)
updated_lines = []
text.each_line do |line|
new_line, after_func = line.split("func(", 2)
vars.each do |var|
new_line.gsub!(/([^"]?\b)#{var}\b/, '\1' + "bundle.#{var}")
end
new_line += "func(" + after_func if after_func
@brandur
brandur / go.mod
Last active July 25, 2023 21:41
PartialEqual implementation
module github.com/brandur/prequire
go 1.19
require github.com/stretchr/testify v1.8.1
require (
github.com/davecgh/go-spew v1.1.1 // indirect
github.com/pmezard/go-difflib v1.0.0 // indirect
gopkg.in/yaml.v3 v3.0.1 // indirect
@brandur
brandur / uuid.rb
Created April 14, 2022 00:34
UUID data type in Ruby
# typed: strict
# frozen_string_literal: true
require "base32"
require "securerandom"
require "ulid"
# A type to represent UUIDs. Particularly useful for annotating fields in API
# representations or Sorbet parameters to help prevent accidentally mixing up
# UUIDs and EIDs as they're being passed around as loose strings.
@brandur
brandur / ractor_worker_pool.rb
Created January 13, 2021 17:37
Ractor worker pool
require 'kramdown'
require 'redcarpet'
require 'toml'
require 'yaml'
#
# pool
#
class WorkerPool
@brandur
brandur / downsize.rb
Created March 10, 2020 17:57
Image resize and optimize script
#!/usr/bin/env ruby
#
# Downsizes and optimizes (for size) an image so that it can be suitably/easily
# sent to people via email.
#
TARGET_DIR = "#{Dir.home}/Downloads"
TARGET_WIDTH = 2000
@brandur
brandur / github-actions-first-impressions.md
Last active November 7, 2019 19:45
GitHub Actions first impressions

Overall: very good experience. My migration from Travis involved quite a few prerequisites to get everything working in the same way again, and I was pleased to find all of them available in some form on GitHub Actions.

Here a couple problems I ran into:

  • Although there's a story for running background services like Postgres, there doesn't seem to be much of one for interacting with them with client tooling. After Postgres is running, I often want to createdb or raise a schema with psql. I ended up installing postgres via apt-get to get these tools, but it's mostly just good luck that the version drift between these old LTS versions and Postgres running in my container hasn't been too great for things not to work.

  • The above is true for all command line utilities. If I want Imagemagick, I have the choice between (1) Ubuntu's ancient version, and (2) running everything through a Docker container, and

@brandur
brandur / keybindings.json
Created September 8, 2019 21:01
VS Code Settings
[
//
// Ctrl + j/k for up/down in ALL the places
//
{
"key": "ctrl+j",
"command": "cursorDown",
"when": "textInputFocus"
},
{
@brandur
brandur / main.go
Created August 10, 2018 22:52
Request re-use
package main
import (
"bytes"
"fmt"
"io/ioutil"
"net/http"
)
func main() {
@brandur
brandur / main.go
Created May 23, 2018 12:51
stripe-go API candidate #3: types with an interface, working
// This example is similar to candidate #2, but compiles because we make sure
// to define an alternate type for int64 (Int64) that we're allowed to add the
// Convert function to.
//
// This approach works, and is fairly clever, but ergonomically it looks very
// similar to the pointer approach in candidate #1. You use a type conversion
// instead of a function call when invoking Int64, but they look identical in
// code.
//
// Arguably, it has a small advantage over pointers in that because Int64 here
@brandur
brandur / main.go
Last active May 21, 2018 17:35
stripe-go API candidate #3: types with an interface, working
// This example is similar to candidate #2, but compiles because we make sure
// to define an alternate type for int64 (Int64) that we're allowed to add the
// Convert function to.
//
// This approach works, and is fairly clever, but ergonomically it looks very
// similar to the pointer approach in candidate #1. You use a type conversion
// instead of a function call when invoking Int64, but they look identical in
// code.
//
// Arguably, it has a small advantage over pointers in that because Int64 here