Skip to content

Instantly share code, notes, and snippets.

View pj's full-sized avatar

Paul Johnson pj

  • San Francisco, CA
View GitHub Profile

This collection of paraphrases, speculation, contradiction, bald assertion, outright theft and pseudo-profundity is all I’ve learned in 15 years of software engineering.

  1. Most problems are procedural shaped, only sometimes object oriented or functional.
  2. Software quality and code quality are different things. The presence of one doesn’t imply the presence of the other.
  3. Software quality is an emergent property of a culture and can’t be reduced to tooling, frameworks and other technology.
  4. We obsess about code quality because we have no power to influence software quality.
  5. Fights about languages, frameworks and tools are so intense because the stakes are so low.
  6. Devops problems tend to be graph shaped, unfortunately most devops tools are string shaped.
  7. It’s probably economics not incompetence, it’s probably incompetence not malice.
  8. Abstractions are predictions about the future, as it is said - “predictions are hard, especially about the future”.
  9. Tech debt is the amount of misprediction
@pj
pj / debug.log
Created April 22, 2023 04:24
Terraform docker error when using gcloud cred helpers.
2023-04-21T21:23:38.734-0700 [INFO] Terraform version: 1.4.5
2023-04-21T21:23:38.734-0700 [DEBUG] using github.com/hashicorp/go-tfe v1.18.0
2023-04-21T21:23:38.734-0700 [DEBUG] using github.com/hashicorp/hcl/v2 v2.16.2
2023-04-21T21:23:38.734-0700 [DEBUG] using github.com/hashicorp/terraform-config-inspect v0.0.0-20210209133302-4fd17a0faac2
2023-04-21T21:23:38.734-0700 [DEBUG] using github.com/hashicorp/terraform-svchost v0.1.0
2023-04-21T21:23:38.734-0700 [DEBUG] using github.com/zclconf/go-cty v1.12.1
2023-04-21T21:23:38.734-0700 [INFO] Go runtime version: go1.19.6
2023-04-21T21:23:38.734-0700 [INFO] CLI args: []string{"./terraform", "plan"}
2023-04-21T21:23:38.734-0700 [DEBUG] Attempting to open CLI config file: /Users/pauljohnson/.terraformrc
2023-04-21T21:23:38.735-0700 [DEBUG] File doesn't exist, but doesn't need to. Ignoring.
@pj
pj / generate_terraform.go
Created August 25, 2022 02:57
Simple go program for generating terraform variables.tf files from cue definitions.
// Apply @generate_terraform_variables(filename="variables.tf") to a definition you want to output as a variables file.
package main
import (
"fmt"
"os"
"strings"
"text/template"
"cuelang.org/go/cue"
@pj
pj / disable_local_ssd_formatting.ts
Created February 16, 2022 16:19
Script to stop GKE formatting local SSDs when initializing a node.
import compute, { protos } from '@google-cloud/compute';
import axios from 'axios';
import util from 'util';
import * as child_process from 'child-process-promise'
import { ZoneOperationsClient } from '@google-cloud/compute/build/src/v1';
import { sleep } from '../utils';
import { hasUncaughtExceptionCaptureCallback } from 'process';
type InstanceTemplate = protos.google.cloud.compute.v1.IInstanceTemplate;
type InstanceGroupManager = protos.google.cloud.compute.v1.IInstanceGroupManager;
# Unlike MutableMapping, dict has it's own implementation of get() that doesn't use __getitem__ underneath. This will cause your subclass to return None unexpectedly, unless you don't implement get() as well. Probably better to just subclass MutableMapping :-).
# example code:
def test_dict_subclass_get_method():
import collections
# WORKS: class Hello(collections.MutableMapping):
class Hello(dict):
def __init__(self, underlying):
super(Hello, self).__init__()
self._underlying = underlying
# -*- mode: ruby -*-
# vi: set ft=ruby :
Vagrant.configure("2") do |config|
# Define our MAAS instance
config.vm.define "controller", primary: true do |maas|
maas.vm.box = "bento/ubuntu-16.04"
maas.vm.hostname = "controller"
maas.vm.network :private_network, ip: '192.168.50.2'
maas.vm.network :forwarded_port, guest: 5240, host: 5240
var NUMBER_CHARS = "0123456789";
var IDENTIFIER_CHARS = '+abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
var WHITESPACE_CHARS = ' \r\n\t';
function lex(input) {
var i = 0;
var tokens = [];
while(i < input.length) {
var c = input[i];
@pj
pj / x_ray_element_properties.js
Created February 24, 2016 08:44
node js x-ray accessing selected element properties
var html = `<html>
<body>
<div id="someId">
<a href="http://example.com/page1">Page 1</a>
<a href="http://example.com/page2">Page 2</a>
</div>
</body>
</html>`;
// If you have html like the above and you want to access properties of the links that
2015-08-24 - NAB - If you are running Kibana in windows and have a proxy set in your environment variables and try to run kibana it will try to go through the proxy to connect to elastic search, to fix this unset the variable in the kibana.bat file:
@echo off
SETLOCAL
set http_proxy=
set https_proxy=
@pj
pj / gist:b3daace52dfa218cd444
Created May 5, 2015 22:36
Scala Future example
Yep Futures/Promises are monads, in scala you'll often see code like:
val foo = for {
someResult <- doSomethingAsync(someArgument);
someOtherResult <- doAnotherThingAsync(someResult);
finalResult <- yetAnotherAsyncThing(someOtherResult);
} yield (finalResult)
foo.recover {
case SomeException e => "Something Went Wrong!"