Skip to content

Instantly share code, notes, and snippets.

View James-E-A's full-sized avatar

James E. A. James-E-A

View GitHub Profile
@James-E-A
James-E-A / tkinter_async_helper.py
Last active August 18, 2025 16:44
Python tkinter async mainloop
import asyncio, tkinter
import ctypes
import math
import threading
from types import coroutine
__all__ = ["ATk"]
if tkinter.TclVersion == 8.6:
try:
@James-E-A
James-E-A / surrogate_wakelock.py
Last active August 9, 2025 16:07
keep Windows awake until process exits
import argparse
import asyncio
import ctypes
import concurrent
from contextlib import AsyncExitStack, ExitStack, asynccontextmanager, closing, contextmanager
import csv
import functools
import inspect
import logging
import os
@James-E-A
James-E-A / bash_profile.inc.sh
Created August 7, 2025 17:51
Elixir fix "Failed to fetch record…from registry" / "ssl_handshake.erl:… generated CLIENT ALERT: Fatal - Unknown CA"
# https://github.com/hexpm/hex/pull/727#issuecomment-3165170464
export HEX_UNSAFE_HTTPS=1;
@James-E-A
James-E-A / simple_rng.ex
Last active September 6, 2025 19:59
Elixir simple seeded AES-CTR rng
defmodule Foo.SimpleRNG do
@moduledoc """
A simple glue layer to use CTR-mode `:crypto` algorithms with the `:rand` module.
iex> new(:aes_128_ctr, <<0::size(128)>>)
...> |> :rand.seed()
iex> :rand.uniform(10**10)
3992083247
iex> :rand.uniform(10**10)
4813258075
@James-E-A
James-E-A / filenameSafeTimestamp.mjs
Last active August 20, 2025 15:21
Format timestamp safe for filename
// https://en.wikipedia.org/wiki/List_of_UTC_offsets
const TZLETTER = new Map([
[0, "Z"],
[60, "N"],
[120, "O"],
[180, "P"],
[210, "P30"],
[240, "Q"],
[300, "R"],
[360, "S"],
@James-E-A
James-E-A / settings.json
Last active July 24, 2025 20:13
VS Code set git editor only when using VS Code
{
// File > Preferences > Settings > User > Terminal > Integrated > Env
"terminal.integrated.env.windows": {
"GIT_EDITOR": "code -w"
}
}
@James-E-A
James-E-A / code_normalize.css
Created July 11, 2025 16:45
CSS make code elements regular sized
p code, code[role=presentation] {
font-size: 1.140625em;
}
@James-E-A
James-E-A / regexp_escape.mjs
Last active August 7, 2025 18:22
Javascript RegExp.escape ponyfill
// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp/escape#return_value
const NEEDS_ESCAPE = new RegExp("(^[0-9A-Za-z]|[,-=<>#&!%:;@~'`\"])|([\\^\\$\\\\\\.\\*\\+\\?\\(\\)\\[\\]\\{\\}\\|\\/])|([\\t\\f\\n\\v\\r\\x20])|(\\s(?<![\\u0000-\\u007f]))|([\\ud800-\\udbff](?=$|[^\\udc00-\\udfff])|[\\udc00-\\udfff](?<=^.|[^\\ud800-\\udbff].))", "gs");
const CHAR_ESCAPES = { "\u0009": '\\t', "\u000c": '\\f', "\u000a": '\\n', "\u000b": '\\v', "\u000d": '\\r', "\u0020": '\\x20' };
function _escape(m, hex, backslash, ascii_whitespace, nonascii_whitespace, lone_surrogate) {
if (hex !== undefined)
return `\\x${hex.charCodeAt(0).toString(16).padStart(2, "0")}`;
if (backslash !== undefined)
return `\\${backslash}`;
if (ascii_whitespace !== undefined)
@James-E-A
James-E-A / async_currentScript_shim.html
Last active July 30, 2025 19:58
Javascript currentScript in async script
<script>(async (currentScript) => { // scoped to this IIFE, does not pollute global namespace or vanish on future event loop ticks
// You are 100% free to do async stuff in this block
await new Promise(window.requestAnimationFrame);
window.alert(currentScript);
// ... //
})(document.currentScript).then((value) => {if (value !== undefined) console.debug(value);}, (error) => {console.error(error); debugger;});</script>
@James-E-A
James-E-A / galois_arithmetic.mjs
Last active July 21, 2025 14:20
Galois fields of non-prime order in Javascript
/**
* A nonnegative integer.
* @typedef {number} NaturalNumber
*/
/**
* Datatype representing a polynomial as an array of coefficients.
* e.g. "5X^3 + X + 2" is represented by [2, 1, , 5].
* e.g. "0" is represented by [].
* Must have no trailing zeroes. Array slots containing 0 are equivalent to empty (sparse) array slots.