Skip to content

Instantly share code, notes, and snippets.

View mgd020's full-sized avatar

mgd020 mgd020

View GitHub Profile
@mgd020
mgd020 / pg_text.py
Created February 6, 2026 00:45
Serialize a Python value into PostgreSQL text input
import json
import re
from collections.abc import Sequence
from dataclasses import dataclass
from datetime import date, datetime, time, timedelta
from decimal import Decimal
from typing import Any
from uuid import UUID
@mgd020
mgd020 / public_id.py
Last active October 23, 2025 13:21
Generate encrypted and signed tokens for sharing DB primary keys
from hashlib import blake2s
from hmac import compare_digest
from typing import NamedTuple
def encode(key: bytes, value: int, expiry: int, key_id=0) -> str:
"""
Encrypt and MAC a value + expiry + key_id.
Params:
@mgd020
mgd020 / uuid7.py
Last active February 11, 2025 22:41
UUID7 functions for Python
import random
import time
from uuid import UUID
UUID7_MASK = ((1 << 80) - 1) ^ (0xf << 76) ^ (0x3 << 62)
UUID7_SET = (0x7 << 76) | (0x2 << 62)
def uuid7() -> UUID:
@mgd020
mgd020 / srt.py
Created September 4, 2022 11:34
Offset and scale SRT translation file
from dataclasses import dataclass
from datetime import datetime, timedelta
TIME_FORMAT = '%H:%M:%S,%f'
def load_time(s: str) -> float:
t = datetime.strptime(s, TIME_FORMAT)
return (t - t.replace(hour=0, minute=0, second=0, microsecond=0)).total_seconds()
@mgd020
mgd020 / parseHTML.js
Created October 20, 2021 00:49
turn a string of html into a document fragment
function parseHTML(html) {
var template = document.createElement('template');
template.innerHTML = html;
return template.content;
}
@mgd020
mgd020 / throttle.py
Last active November 4, 2021 04:53
Django throttling class using cache
import time
from typing import List, NamedTuple
from django.core.cache import caches
class RateLimit(NamedTuple):
seconds: int
limit: int
@mgd020
mgd020 / iseu.js
Created August 18, 2021 04:59
is the user in the EU
isEu = function() {
var euCountryCodes = new Set(['be', 'el', 'lt', 'pt', 'bg', 'es', 'lu', 'ro', 'cz', 'fr', 're', 'gp', 'mq', 'gf', 'yt', 'bl', 'mf', 'pm', 'wf', 'pf', 'nc', 'hu', 'si', 'dk', 'fo', 'gl', 'hr', 'mt', 'sk', 'de', 'it', 'nl', 'aw', 'cw', 'sx', 'fi', 'ax', 'ee', 'cy', 'at', 'se', 'ie', 'lv', 'pl', 'uk', 'gb', 'ai', 'bm', 'io', 'vg', 'ky', 'fk', 'gi', 'ms', 'pn', 'sh', 'tc', 'gg', 'je', 'im']);
return function isEu() {
return (
Intl.DateTimeFormat().resolvedOptions().timeZone.startsWith('Europe/') ||
euCountryCodes.has((navigator.userLanguage || navigator.language).slice(0, 2))
);
}
}();
from fractions import Fraction, gcd
def matrix_determinant(m):
"""determinant using laplace transform"""
size = len(m)
assert len(m[0]) == size
if size == 2:
return m[0][0] * m[1][1] - m[0][1] * m[1][0]
return sum(
@mgd020
mgd020 / getsizeof_deep.py
Created September 3, 2020 23:50
recursive getsizeof
import sys
def getsizeof_deep(o, verbose=False):
default_size = sys.getsizeof(0)
seen = set()
todo = [o]
size = 0
# encoding: US-ASCII
# stolen largely from http://www.ruby-forum.com/topic/140784
require 'stringio'
require 'fileutils'
def extract_chunk(input, output)
lenword = input.read(4)
length = lenword.unpack('N')[0]
type = input.read(4)