Skip to content

Instantly share code, notes, and snippets.

View atomkirk's full-sized avatar

Adam Kirk atomkirk

View GitHub Profile
@atomkirk
atomkirk / soc2-by-myself.md
Last active July 17, 2024 23:22
I got SOC 2 certified by myself

I got SOC 2 certified by myself

From April 10 to May 2, 2024, I did all the work myself to get SOC 2 Type II certified. I'm now half way through the observation period to get Type II. The observation period is easy, you just have to babysit the controls. Getting to Type I is much harder. It took me somewhere around 100 hours.

image

SOC 2 is a security framework that, for many customers, eliminates the need to have you, as a vendor, fill out a lengthy security questionnaire. The SOC 2 controls and audits ask pretty much all the questions you'd get from a customer's security team. In fact, that is a great way to think about SOC 2. It's essentially a very thorough questionnaire you fill out once, an independent auditor forms an opinion of it in a report, and you share with all your customers.

There are two parts to SOC 2. The initial audit, where an auditor writes a Type I report sharing their opinion of your current setup. Then there's a 3 month observ

@atomkirk
atomkirk / udot_regions.sql
Created March 8, 2022 19:59
UDOT Regions 1 & 2 GIS
This file has been truncated, but you can view the full file.
INSERT INTO "public"."gis__objects"("id","layer","geometry","properties","inserted_at")
VALUES
(E'udotreg1',E'udot_regions',E'SRID=4326;POLYGON((-113.47488600498771 41.9933094053436,-113.47701796048186 41.993290592340216,-113.47965799142257 41.993267513722095,-113.48183048968212 41.993248275413805,-113.48442960325997 41.9932255219256,-113.48659558154715 41.993206333678295,-113.48914726497632 41.99318405086824,-113.49136078839656 41.99316446201844,-113.492336364185 41.993155700446096,-113.49386453053565 41.99313573035917,-113.49620402201325 41.99310529484248,-113.49858127956367 41.99307443869104,-113.50104721969728 41.99304241079656,-113.50292987922532 41.993017833210615,-113.50597269767145 41.99297851586337,-113.50791966759073 41.99295317178795,-113.51089816756081 41.99291467895187,-113.51203139408835 41.99289968747675,-113.51290988984236 41.99289062542413,-113.51576741908306 41.99286132012711,-113.51790018395923 41.9928393870467,-113.5206364298568 41.99281127081749,-113.52289058677229 41.992788109236464,-113
@atomkirk
atomkirk / download-zoom-recording.md
Last active July 23, 2024 14:40
Force download a zoom recording
  1. Open dev tools
  2. Search for the <video… tag.
  3. Copy the source URL
  4. Right click on the body tag and click Edit as HTML
  5. Add an a link with the src right inside the body tag like:
<body>
  <a href="url-you-copied">download</a>
  ...
@atomkirk
atomkirk / stop-all-docker.md
Created February 9, 2021 14:25
Stop all Docker containers

I will often run this command to make sure all my docker containers are stopped and removed before running docker-compose up. Sometimes when you restart your system, old containers will start back up automatically in the background.

docker stop $(docker ps -aq) && docker rm $(docker ps -aq)
@atomkirk
atomkirk / postgres_enum_add.sql
Created February 9, 2021 14:22
Add postgres enum values in order (for sort)
ALTER TYPE enum_type ADD VALUE 'new_value'; -- appends to list
ALTER TYPE enum_type ADD VALUE 'new_value' BEFORE 'old_value';
ALTER TYPE enum_type ADD VALUE 'new_value' AFTER 'old_value';
@atomkirk
atomkirk / explaination.md
Last active July 1, 2020 13:26
Run Elixir tests on VSCode save

A really great workflow is to write your test first (TDD anyone?), run the test to verify it fails (eliminate false positive) and then write the implementation. I've included a runOnSave setting to run a test file anytime it is saved and, second, to run any failed tests as soon as any other elixir file is saved.

So, you write the test, save, it fails. You write Elixir code, save, it still fails. You keep writing Elixir code and saving until it passes.

This is obviously cool. But one thing that is particularly cool is that while you are writing the implementation, you often want to peek at values and experiment with code. Well, thats easy! Just write the code, IO.inspect it and then save! You'll instantly

@atomkirk
atomkirk / factory.ex
Last active March 2, 2022 17:50
Generating Example Data in Elixir
defmodule App.Factory do
alias App.Repo
def create(module, overrides \\ %{})
def create(module, overrides) when is_list(overrides), do: create(module, Map.new(overrides))
def create(module, overrides) do
attributes = module.example() |> Map.merge(overrides)
struct(module)
@atomkirk
atomkirk / elixir-tuple-vs-list.md
Last active April 15, 2020 21:56
elixir tuple constant time

Whats the fastest way to look up an index in Elixir?

Lets create a long list of a million items and look up the 500,000th item

iex(54)> range = 1..1_000_000
1..1000000

iex(55)> index = 500_000
500000
@atomkirk
atomkirk / ios-camera.html
Created March 13, 2020 04:49
iOS Safari Camera API
<video id="player" autoplay muted playsinline> </video>
<button id="capture">Capture</button>
<canvas id="canvas" width=320 height=240></canvas>
<script>
const player = document.getElementById('player');
const canvas = document.getElementById('canvas');
const context = canvas.getContext('2d');
const captureButton = document.getElementById('capture');
const constraints = {
@atomkirk
atomkirk / hungarian.ex
Last active January 8, 2023 20:25
Hungarian/Munkres algorithm in Elixir
defmodule Hungarian do
@moduledoc """
Written by Adam Kirk – Jan 18, 2020
Most helpful resources used:
https://www.youtube.com/watch?v=dQDZNHwuuOY
https://www.youtube.com/watch?v=cQ5MsiGaDY8
https://www.geeksforgeeks.org/hungarian-algorithm-assignment-problem-set-1-introduction/