Skip to content

Instantly share code, notes, and snippets.

View danielrbradley's full-sized avatar

Daniel Bradley danielrbradley

View GitHub Profile
@danielrbradley
danielrbradley / README.md
Last active December 15, 2022 16:18
Generate cross-language Pulumi examples
  1. Edit Pulumi.yaml
  2. Run ./convert.sh
  3. Copy content of example.md
@danielrbradley
danielrbradley / index.ts
Created September 16, 2021 19:53
AWS API Gateway, JWT Authorizer with Cognito and CORS support
/**
* Annotated, real-world example of how to use
* AWS API Gateway V2 + JWT authorizer + Cognito
* with support for CORS & good security practices
* deployed with Pulumi (https://www.pulumi.com/)
*/
import * as pulumi from '@pulumi/pulumi';
import * as aws from '@pulumi/aws';
import serverlessExpress from '@vendia/serverless-express';
import express from 'express';
@danielrbradley
danielrbradley / Stream Analytics UDS int overflow.md
Last active March 2, 2021 10:38
Reproduction of Stream Analytics Query UDF integer overflow

When returning a number from a UDF function which is greater than 2,147,483,647 but less than long.MaxValue and bound to a Stream Analytics bigint type then the number is shown as a negative which indicates that the integer has been overflowed. This error does not happen when using the local or portal query tester.

The workaround we've used to return the value as a string. However, this behaviour does not match the documentation: https://docs.microsoft.com/en-us/azure/stream-analytics/stream-analytics-javascript-user-defined-functions#stream-analytics-and-javascript-type-conversion

@danielrbradley
danielrbradley / OfflineApp.tsx
Created November 5, 2019 10:50
Integrating service worker auto-refresh with reach router
import React, { useEffect, useRef } from 'react';
import { Location } from '@reach/router';
import { register } from '../serviceWorker';
/**
* Include this component around your router to register a service worker to cache the application
* so it works offline. Then, when the application has automatically updated itself, intercept the
* Reach router location change and do a hard browser navigation to enble the application updates
* to be applied.
* @example
@danielrbradley
danielrbradley / exec.ts
Created October 25, 2019 09:28
Pulumi custom component for running local commands
import * as pulumi from '@pulumi/pulumi';
import { exec, ExecOptions } from 'child_process';
export type ExecArgs = {
command: pulumi.Input<string>;
options?: pulumi.Lifted<ExecOptions>;
};
export class Exec extends pulumi.ComponentResource {
stdout: pulumi.Output<string>;
@danielrbradley
danielrbradley / Pulumi+Prettier+ESLint-setup.md
Created October 22, 2019 10:03
Setting up ESLint & Prettier for Pulumi

Setting up ESLint & Prettier for Pulumi

This is my process for addint ESLint and Prettier support for a new Pulumi TypeScript project.

Install packages

yarn add -D @typescript-eslint/eslint-plugin @typescript-eslint/parser eslint eslint-config-airbnb-base eslint-config-prettier eslint-plugin-import eslint-plugin-prettier prettier
@danielrbradley
danielrbradley / aws-auth.sh
Last active January 8, 2020 12:23
Get console session with AWS access for 36 hours when using MFA
#!/bin/bash
# Note: Depends on having jq and AWS CLI installed: `brew install jq`, `brew install awscli`
set -e # stop on error
AWS_ACCOUNT="1234567890"
AWS_USERNAME="YOUR_AWS_USERNAME"
MFA_SERIAL="arn:aws:iam::$AWS_ACCOUNT:mfa/$AWS_USERNAME"
export AWS_CONFIG_FILE='/dev/null' # ignore config file so CLI doesn't pick up MFA config
read -p "Enter MFA code for $MFA_SERIAL: " MFA
@danielrbradley
danielrbradley / README.md
Created August 3, 2018 22:43
Script for backing up processed photos

My method for storing and backing up photos is as follows:

  1. All photos get downloaded into the Archive folder, in a folder for the current year, with the batch folder name starting with the date.
  2. The photos get reviewed, the ones which get picked are edited, exported as JPEGs, and the edit metadata saved alongside.
  3. Once editing is complete, the processed JPEGs are uploaded to wherever they're being shared (e.g. Google Photos).
  4. Run the script below which copies only files which have been picked and edited into the Best folder using the same folder names, but not grouped into years.
  5. The Best folder is backed up to a second local disk, and an offsite location (AWS Glacier).
  6. The Archive folder is only backed up onto a second local replicated disk.
@danielrbradley
danielrbradley / type.test.ts
Created September 15, 2017 15:25
Testing JSON matches TypeScript types
import { writeFileSync, mkdirSync, existsSync } from 'fs'
import { resolve } from 'path'
import * as ts from 'typescript'
function checkForTypeErrors(jsonContent: string) {
const tempDir = resolve('.tmp')
const tempFilePath = resolve(tempDir, 'typecheck.ts')
if (!existsSync(tempDir)) {
mkdirSync(tempDir)
}
@danielrbradley
danielrbradley / Request-accept-headers.md
Last active April 13, 2017 16:10
AWS API Gateway proxy via Lambda

Headers added by chrome...

Going direct to the PNG:

text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8

When linked from img tag in an html page:

image/webp,image/*,*/*;q=0.8