Skip to content

Instantly share code, notes, and snippets.

@thsutton
thsutton / log4j4py.py
Created January 11, 2021 00:41
Forward Python logging module to Spark log4j
import logging
import time
from contextlib import AbstractContextManager
from logging import Handler, LogRecord
from typing import Any, List, Optional
from pyspark.sql import SparkSession
logging.basicConfig(level=logging.INFO)
@thsutton
thsutton / normalise-path.php
Created January 10, 2011 03:02
Normalise paths in PHP
<?php
/**
* Normalise a file path string so that it can be checked safely.
*
* Attempt to avoid invalid encoding bugs by transcoding the path. Then
* remove any unnecessary path components including '.', '..' and ''.
*
* @param $path string
* The path to normalise.
* @param $encoding string
@thsutton
thsutton / __main__.py
Created February 9, 2023 04:06
Basic Python logging usage
#!/usr/bin/env python3
#
# I do this infrequently enough I always forget how this stuff works and have to read the code to figure it out.
#
import logging
import sys
formatter = logging.Formatter(
fmt='%(asctime)s - %(levelname)s - %(message)s',
@thsutton
thsutton / response-header.js
Created November 6, 2010 09:17
Get the value of an HTTP response header in JavaScript
/**
* Read the value of a header in the current document.
*
* This uses a [single] XMLHTTPRequest to do a HEAD of the current document
* and fetch HTTP response header values. Note that the implementation is
* rather stupid in that it spins waiting for the XMLHTTPRequest to complete
* if it hasn't been called yet.
*
* @param name string
@thsutton
thsutton / vault-get-keytab.sh
Last active February 23, 2022 22:37
Get a Kerberos keytab from Hashicorp vault.
#!/bin/sh
# vault-get-keytab
#
# Rather than verify that it’s exactly the keytab we expect, this script checks that it is
# (or appears to be) a keytab for the required principal.
set -eu
$vault_path=“$1”
@thsutton
thsutton / make-drupal-file-field-private.sh
Last active February 9, 2022 07:52
Hold your hand through the process of converting an existing Drupal 7 file field to use the private file system. Update the $FIELD variable (and, if required, the path and arguments for drush) and do what it tells you to.
#!/bin/sh
#
# This script will hold your hand during the process of converting an existing Drupal 7 file field from public to private.
#
# http://twitter.com/thsutton
# http://www.linkedin.com/pub/thomas-sutton/55/391/350
# http://thomas-sutton.id.au/
set -eu
@thsutton
thsutton / demo.sh
Last active December 15, 2020 11:44
Using asyncio to handle subprocess output line-by-line.
#!/bin/bash
fmt="$1"
n=0
while [[ n -lt 5 ]]; do
n=$((n + 1))
date "+o: $fmt"
echo -n "antici"
@thsutton
thsutton / trianglenumbers.hs
Last active August 1, 2018 05:55
Several approaches to computing the triangle numbers.
#!/usr/bin/env stack
-- stack --resolver lts-12.4 --install-ghc runghc --package QuickCheck
--
-- If you have Haskell Stack installed (brew install haskell-stack) you
-- can execute this script directly:
--
-- $ chmod +x trianglenumbers.hs
-- $ ./trianglenumbers.hs
{-# LANGUAGE TemplateHaskell #-}
@thsutton
thsutton / typescript
Last active March 9, 2018 05:29
Putting Terraform state into an S3 bucket you manage with Terraform
$ mkdir example
$ cd example
$ cat > main.tf <<EOF
provider "aws" { region = "ap-southeast-2" }
resource "aws_s3_bucket" "state" {
bucket = "thomas-example-s3-stateception"
acl = "private"
}
@thsutton
thsutton / gist:d3bc4fd38fb321a1da801a812ecc3d20
Created December 18, 2017 20:49
Using specific build of a Terraform plugin
[me@home test]$ ls -lash
total 4360
0 drwxr-xr-x 9 me staff 288B 18 Dec 11:46 ./
0 drwxr-xr-x 18 me staff 576B 13 Dec 17:12 ../
0 drwxr-xr-x 3 me staff 96B 8 Dec 13:05 .terraform/
4224 -rw-r--r-- 1 me staff 1.5M 18 Dec 10:27 crash.log
8 -rw-r--r-- 1 me staff 1.4K 13 Dec 10:17 example.txt
0 lrwxr-xr-x 1 me staff 48B 8 Dec 13:05 terraform-provider-azurerm@ -> /Users/me/go/bin/terraform-provider-azurerm
56 -rw-r--r-- 1 me staff 24K 18 Dec 11:46 terraform.tfstate
56 -rw-r--r-- 1 me staff 24K 18 Dec 11:46 terraform.tfstate.backup