Skip to content

Instantly share code, notes, and snippets.

View carl-mastrangelo's full-sized avatar
๐Ÿ’ญ
I may be slow to respond.

Carl Mastrangelo carl-mastrangelo

๐Ÿ’ญ
I may be slow to respond.
View GitHub Profile
cmastrangelo@MacBook-GJG2C:/tmp/cpython
Wed Apr 08 12:54:44 $ ./python.exe
Python 3.13.13+ experimental free-threading build (heads/3.13:4002c3a4615, Apr 8 2026, 12:53:37) [Clang 21.0.0 (clang-2100.0.123.102)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> from concurrent.futures import ThreadPoolExecutor
...
... count = 0
... with ThreadPoolExecutor(max_workers=3) as executor:
... def inc():
... global count
from concurrent.futures import ThreadPoolExecutor
count = 0
with ThreadPoolExecutor(max_workers=3) as executor:
def inc():
global count
for i in range(10_000_000):
count = count + 1
executor.submit(inc)
* Python uses pathlib "/" operator to concatenate paths
@carl-mastrangelo
carl-mastrangelo / build.gradle.kts
Created April 3, 2024 23:47
Debug Javac and Annotation Processors On Gradle
tasks.withType<JavaCompile> {
options.setFork(true)
options.forkOptions.jvmArgs = listOf("-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=127.0.0.1:5009")
}
๐“บแตŽสนหˆหŒแ‘Š๊˜กแกƒแŽฅสพสฟห‘หฯณ๐“ค๐“ชแฃŸilแด‰ั–สปสผสฝjศทฦ–ั˜ษพษฟ๐…›๐›ฑปแแง๊žษ‰ว€๐‘ซฅล‚แฃž๐›ฒ„๐›ฒ”โฒ“ษฉ๐›ฑ†แถ…๊‰แถ–๐›ฐ€๐“ฌแ“ซ๐‘‡๐‘ฆษญแฑธแฑนแฑบ๊žŒ๊ž‹๊œ๊œž๊œŸ๐–ญ๐–พ–๐–พ˜๐˜๐ญีตีฌอฟ๐“ป๐›ฐ‚๐›ฐ‡๐›ฐŒฤฑำฮ™ะ†Iวƒำ€แถ˜สส†ฮนtส‡สˆfษŸ๐“ˆ’หห€๐”แฃณ๐”–ณษช๐”“„โฒ’๐Œ‰๐›ฑˆ๐›ฑ‰๐›ฐ๊ญต๐–ผจ๐”Ž๐“Œ€๐›ฒ€๐›ฒ‚๐›ฒ๐›ฒ’๐”’จ๐’ƒ๐“Œโต๊“ฒโต‘๐“Šง๊“ธ๊“ฝ๊“น๊“ผ๐–พ“๐“Šคโต‚ี™แกŸ๊žฒ๐‘… ๐“Œƒ๐Œน๐“Œ โฑ๊žแฃš๐–พ™สบโฑœ๐›ฑง๐›ฑช๐–พ”๊œ—แ”‰แ”Š๐“ซ๐‘ซฏ๐‘ซฐ๐‘‡œแฃด๐–พ—๐Žƒลงแตปโต—๐‘€ญ๊œฃเทฆ๊ญ‡แฑผแบแบœ๐‘›€๐“Ž—๐–กก๐›ฒˆ๐›ฒ˜แ’พ๊ž™แ‘‹๐“Œ™๐–พ๐”—ท๐“‡ฉหŠห‹หŽหษนษบrษผษฝหฎห†ห‡หฌห‰ห๐ŠŠ๐“Œ๐”–ญ๐”–ฎ๐”–ฐ๊คท๐“‚ญ๐”“ฏ๐“๐›ฒ…๐›ฒ•๐–พ•๐“Ž˜๐‘ข๐‘˜๐“๊Ÿพ๐‘ƒต๐‘ถ๐‘ฌ๐“Œฑฦ—ฦšษจ๐“‡‹๐“†ฌ๐‘ƒถ๐›ฑฉ๐–คฑ๐–พœ๐–พž๐‘ƒธแถ‚๊ฌต๊‡แฃ˜๊™‡๐“›แตผแดŠ๐‘ƒณแ”‹๐‘ƒท๐“‡ž๐“Žซ๐Ž‡๐’โฑก๐›ฑจ๐“Œž๐›ฒ™๐“‡›ษฌ๐“Œ‰า“๐›ฑค๐Ž‚๐‘โฑƒ๐›ฐ„แฃตโณ‹แตฎแตณเงŽแตต๐›ฑ‘๐›ฑ’๐›ฑ“๐‘ฃก๐‘ƒนโณ”ฦช๐–ผฉ๐”•ฟ๊ญ๐‘๐‘“๐‘š๐‘๐“„ค๐•†แง’๐“ฐ๊–Žแฃ–แฃ—ฦญฦซแ•‘๐“Ž„๐“ކ๐“އ๐“„ฅ๐‘ƒฑ๐‘ƒฒเฌฝ๐›ฑฅ๐“‹ฉ๐–จ˜๐“Œœ๐“‹ฟ๊ซดษซโณ•๐–ฉ™๐–จ„แ›ต๐›ฑฃ๐“€พแกฐ๐•‡๐‘ช๐‘จ๐‘ฉ๐‘ง๐–ฅฃ๐‘ซซ๐‘ซฌ๐‘ซณ๐‘ซด๐‘ซตโฒฃ๐‘ฃ‘๐‘ฆเงฐเงฑ๊œขโฒ๊ฌธ๐›ฑฆ๐‘ƒจ๐“‰ผโณ‡๐‘‘๐‘›๐“—โฒƒศด๐–ฃฃ๐”–ฑ๐”•ป๐”•ฝ๐”•บ๐”•ผ๐“‚†๐“ชแฆแ’ปแ’ฝ๐›ฑ‡๐›ฑŒ๐›ฑ๐›ฑŽ๐›ฑบ๐›ฑผ๐“ŒŸเฅฑโฐฌ๐“ฏศถ๐›ฒ†๐›ฒ–แจแคแฉแ•€แกแขแชา‘๐ษโฑฆอฑ๊™†๐‘ขฑโณ‰แข๐“™๐‘ฃ๐“œ๐‘ƒด๊ฌน๐™‚แฃ๊กฒ๐“Œข๐”“ฝเฆฐเฆฌ๐›ฑข๐›ฑ๐‘›‡เทญ๊œ˜แตฒ๐”˜—๐””ต๐‘Ÿ๐‘•๐“ฎแ—ฎแ™พแ™ฟ๐ฎ๐”—Œ๐“Žฟ๊œฅ๊žŽเฆŸ๐“Šชโฒ‹๐‘ฃ๐‘™ะณ๐”“ˆ๐“ขสƒส„๐“Šขเฆ ีน๐‘ฐ๐“กโฒ๐‘‡๐– ฃแ’ƒแ’„๐›ฐ…แАโณคเฆšเฆข๐‘ƒ’๐–ฆ”๐”–ฉ๐”–ช๐“‰บ๐Ž“๐“โฐ‘๐€๐“ฑแถ‰๐“„‰๐“„ป๐ƒŠ๊œฐโฑน๊ผ๊ž…๐“ฒ๐“‹๐“Œ๐“‹พ๐“‰ถ๊ฌฒ๊žง๐’น๐›ฑ‚๐“๐“„ˆ๐–ญ๐“‹ด๐–ขž๐”บ๊žˆ๐‘…‘เฆฆแ”…แ”‡แ”พแ•แ–ฎ๐›ฑก๐‘šค๐–งป๊ฃ‘๐–ฝ๐‘†ซแ”†๐“˜๐–ฆ•๊œฑ๊ฌท๐“‡ช๐–จท๐“‡œ๐“กแดฏแŸแ ๊”งแถ‹๐– œ๐“‡•๐“‡Ÿ๐‘ฎ๐‘ค๐–ฆ…๐”’ซแดคส…๐‘ฑ๐‘ฒ๐“‚‚๐–งนโฑ๐Š–๐‘ณ๐‘††แกฃ๊กฑแฐ…สฌ๐–ก๐”–ธ๐“ผ๐“พ๐“ฟ๐“‹ฝ๐“Œ‚๐“‚๐–จฎ๐‘š™๐›ฐ”ว๐”“๐”˜…๐“„ฝ๐›ฑโฒ…โฒงเฆงเฆฏเคเคเคŽเค๐– Ž๐”˜ำปแ‘ฆแ’กแ’ขึ‚๐’‘–๐’‘‰โณ‘โฐฝ๐›ฐ†๐›ฐ—เคฐำท๐น๐‘ƒ๐–ฆป๐“Œš๐‘…›เงง๐–งณ๊ง๐”ถ๊ฒ๐–ฅพ๐”˜ธ๐””ฅ๐“„™๐“Ž›๐“นโฒฅแˆเฆ˜๐–จฃ๊ญ‹๐”“ก๐“ฌ๐‘š†๐‘š‡๐Œ†๐Œ๐”•‘๐‘ฅ๐‘ฏเฆฝษปแดฆ๐“Œ‘แดŒโณ†๐Œ”๐•๐‘™“เคฝอฐ๐‘“‘๐‘ ๐‘–ฮถ๐–จˆ๐–ขŸ๐”—ฆ๐“Žญ๐‘‚ เถฏเถณโฒ‰๊˜“๐– ™เฆทเฆจโ…Ž๐”˜Š๐“Œฐ๐“†„๐…—แŽซ๐–ง–๐”‘๐”‘เผฅ๐”˜ญ๊ฃ’๐‘ƒฃ๐‘ซจ๊€ค๊€ซ๐‘ƒž๐‘…ซ๐›ฑŠ๐›ฑ‹๐›ฑƒ๐–ฃ…๐‘พ๐–ผท๐–ผธ๐–ผน๊œค๐”—ถแก•แฃ•๐“†ณ๐“†ด๐“†ถเฎฐ๐•กแ“‘๊กจ๐‘‚ฉ๐“„ ๐“Œฃ๐“†ผ๐–ฆ‹๐”–๐”–จ๐‘…–แ‚จ๊ˆŒ๐– ต๐˜๊ˆ‹๐‘›ˆ๐‘ƒฆ๐‘ƒ–๐””ด๐“‹ƒโฒ•เฒฝ๐–จ™๐–จ‹๐”•ฎ๐‘‡—แ›ณ๐›ฐ–๐‘Ššิ๐“„Š๐–ฅซ๐–งฐ๐–จ‚๐–ขด๊ˆฅแ”ˆ๐–จ†เฆฎ๊คฑ๊คถฯ๊‹ฝ๐–ฃข๊‹ผ๐‘ฃ‡๊ฌฝ๊ฌพ๐”–ซ๐“Šเฆฃเฆน๐‘š–แฅ‰โฒญ๊œ™๐‘€ค๊”ช๐“ƒ‰๐“ƒŠ๐š‰๊†น๐–ฉš๊กก๐‘…Ÿ๊†ธ๐พฦพ๐‘™˜๐•๐–งพ๐”—จ๐”–’๐“โณเค‡เคˆโฑปแด‡๊›๐”–€๐”˜ฑแ˜คแ˜ฅแ˜ฆแ˜ง๐›ฒƒ๐›ฒ“๐”—Ž๐”—โฑ‰แด›แฅ๊ซฒแ–Ÿแฃ™๐”“ธ๊ˆค๊ˆฃ๐–ฃปแŒˆแƒแ‹จเฆ–๐‘ซฆ๐–ก๐–คฒ๐”“ฑ๐”—ต๐”˜ฆ๐“‰ฝ๐‘›ƒ๐‘‹‰แ™†แ™‡๐–ฅ๐‘’๐‘œ๐”‘ˆ๐“‹€๊›ฌ๊™‹โณŸ๐“Œน๐“Œบ๐›ฒ‡๐›ฒ—๐”—ศฅแดขแถŽโดญ๐‘šŸแตถษ€โฒนส๊œšแฑ‡โฐ“โฒ—๐’‹™๐‘ƒŸ๐–ฆธ๐‘™„๊ฃ–๐‘…ญ๊™๊™ƒ๐‘›‰๐๐“Œ๐–ข”๐”•”แŽจแ›ถ๊›๊ญ๐‘„๐‘ซง๐””๐–ฆพ๐‘…•๐‘ƒš๐‘ƒค๐™ง๐‘Ё๐”ป๊Œ…๊Œ•๊Œ–๊‘๊Œ„๊Œ”๐–ฅˆ๐‘๊‰‚๊‰๊คฐ๊คด๊คณ๊คนเฆฅ๊Šค๊Šฃ๊‰ง๊šƒ๐‘ฃ‚๊ญปโฑˆ๊žฉ๊‚๊๊Šซ๐“Šฝส‚๐‘ˆแถŠ๊™…ศฟ๐–ก‰๐‘™’เงจแด แตดเคชเคท๊šน๐”—๐ฝ๐‘‹แถ—๊œฟ๊ž”โฐต๐‘ก๐‘—๊ž“๐™†แŠ”แ…๐–งฑเงฏเฆŒเฆ—เงก๊„ง๊„ฆ๐”˜™๐””ƒ๐‘™–๊ƒ˜เงฌ๊ญ‰๊ฎช๐–ผณโฑ›๐– —แณฏแขƒแข„แฑ”๊›Œ๊ฎท๐‘‡’เฆ™๐”—ฉ๐”“นฯ›๊…ช๊Šฐ๊‘Œ๊…ฉ๊Šฏ๊‘‹เผกโฐฐแ•แ•ฝ๐‘€Ÿ๐‘ƒ™๐‘ƒœ๐‘ƒ ๊ฎ€๐ฐ๐“ฉ๐‘…ฐ๊…“๊œ›๊œœ๊…’แฃ›๐”’ฝ๐‘‚เคน๊†พ๊ป๊ž„๐“‹‚๐–ฅ‰แฅ‹๊”ท๊†ฝ๊†ผ๐‘‡•๊Љ๊š๊š‘๐‘“—๐‘…žา’๐–งฉ๐–คƒ๊‹Š๐ฉ๐‘ƒ‘โฒŸโฑถแฑ๊„”๊†ปแฑ€๐– ด๐”˜ค๐‘šเซง๊›จฦฝแดฃแถšแถ”๊ž‡๐‘ŠŸัฏโดพ๐“„น๐“„ผ๐–คฃ๐–คฅ๐‘‡˜๐‘šก๐™ฟ๐š’๊ฒ๊ฑ๐–ฆงาแฅแฅŒ๐‘†‰แฅเฎ‰เคฌเคตเฅฟสŸแš†แšแš๐’—๐’‘๐”–ง๊„œ๊„›๊ฃ“โณŠ๊ฎžโฒ‘แถ“๐–ฆฌแดป๐– ฑแœ๊‡ฑ๐‘ฃŽ๊…จ๐˜„๐˜…๊€ฏ๐–จš๐œฅ๐“‡กฯžสแ‹•แ ตแ ถแกท๐ƒ๐–ผด๊‡ป๊Šฑ๐„เงช๐’ฆ๐‘™‘๐‘ƒง๐‘ขกเชขเชฝเญฏแฅˆแฅŽ๐‘ƒฐ๐–ฅฎ๊„ก๊„ค๊‰–
@carl-mastrangelo
carl-mastrangelo / Queens.java
Created March 24, 2023 21:11
Find covering positions of a Chess board using a minimum number of queens.
package com.carlmastrangelo;
import java.util.SplittableRandom;
import java.util.concurrent.ForkJoinPool;
import java.util.concurrent.RecursiveAction;
import java.util.concurrent.atomic.AtomicLong;
public final class Queens {
public static void main(String [] args) throws Exception {
@carl-mastrangelo
carl-mastrangelo / foo.java
Last active February 26, 2023 20:30
Small number encoder
// Writes numbers less than 172 in one byte, numbers less than 1936 in 2 bytes.
private static void writeInt(OutputStream os, int i) throws IOException {
if (i < 0) {
throw new UnsupportedOperationException("no neg");
} else if (i < 172) {
os.write((byte) i);
} else if (i < 1936) {
i -= 172;
os.write((byte)(172 + 42 + (i % 42)));
os.write((byte)(172 + (i / 42)));
@carl-mastrangelo
carl-mastrangelo / perf.java
Created February 20, 2023 21:32
Sleep Executors
/*
Benchmark (executor) (sleepMillis) (sleeps) Mode Cnt Score Error Units
SleeperBenchmark.Bench.run CACHED 1 1 ss 30 1.180 ยฑ 0.028 ms/op
SleeperBenchmark.Bench.run CACHED 1 8 ss 30 1.227 ยฑ 0.044 ms/op
SleeperBenchmark.Bench.run CACHED 1 64 ss 30 1.365 ยฑ 0.045 ms/op
SleeperBenchmark.Bench.run CACHED 1 512 ss 30 3.764 ยฑ 0.476 ms/op
SleeperBenchmark.Bench.run CACHED 1 4096 ss 30 13.375 ยฑ 0.996 ms/op
SleeperBenchmark.Bench.run FIXED 1 1 ss 30 1.234 ยฑ 0.035 ms/op
SleeperBenchmark.Bench.run FIXED 1 8 ss 30 1.362 ยฑ 0.084 ms/op
SleeperBenchmark.Bench.run FIXED 1 64 ss 30 9.433 ยฑ 0.409 ms/op
@carl-mastrangelo
carl-mastrangelo / ntru.py
Last active October 8, 2022 17:37
NTRU Prime encoder
# From page 16 of https://ntruprime.cr.yp.to/nist/ntruprime-20201007.pdf
# Linked from https://www.imperialviolet.org/2021/08/26/qrencoding.html
def rebase(innums, indenoms, limit, newbase):
if len(innums) != len(indenoms):
raise "Bad"
syms = []
if len(innums) == 1:
num, denom = innums[0], indenoms[0]
while denom > 1:
@carl-mastrangelo
carl-mastrangelo / b58encode.py
Created July 31, 2022 06:45
Base 58 Encode
# From https://datatracker.ietf.org/doc/html/draft-msporny-base58-03
# The description on that page is misleading or just wrong.
# This was derived from converting the Rust code here:
# https://github.com/hachi-bitto/btc-wallet/blob/5dde65a262d3239a23292fc2a4a692994603aeb0/wallet/src/base58.rs
TABLE = "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz"
FORWARD = {k:v for (k, v) in enumerate(TABLE)}
BACK = {k:v for (v, k) in enumerate(TABLE)}