Skip to content

Instantly share code, notes, and snippets.

@ggorlen
ggorlen / star.py
Last active December 28, 2025 23:26
Draw minimal coprime stars
# see https://stackoverflow.com/questions/72943585/how-to-draw-n-pointed-stars-using-turtle#comment140920249_72943585
import math
from turtle import Screen, Turtle
def first_coprime(n):
for k in range(2, n):
if math.gcd(n, k) == 1:
return k
@ggorlen
ggorlen / utc-to-pst.html
Created December 14, 2025 05:51
utc to pst converter
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>UTC → Pacific Time Converter</title>
<!-- Luxon -->
<script src="https://cdn.jsdelivr.net/npm/luxon@3.4.0/build/global/luxon.min.js"></script>
<!-- Chrono -->
@ggorlen
ggorlen / chrono-node-test.html
Last active June 27, 2025 18:03
Testing Chrono Node in the browser
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<meta name="color-scheme" content="dark light" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>chrono-node & Date Test</title>
<script src="https://cdn.jsdelivr.net/npm/luxon@2.5.2/build/global/luxon.js"></script>
<style>
* {
@ggorlen
ggorlen / discogs-video-adder.js
Created June 16, 2025 03:56
discogs video adder
// WIP script that auto-adds videos to a discogs release
// TODO: "full album" mode
// TODO: try multiple approaches (with and without artist/album title)
/*
x=[...document.querySelectorAll("[data-track-position]")]
.map(e => e.querySelector("td:nth-child(3) span").textContent).join("\n")
console.log(x)
*/
@ggorlen
ggorlen / slurp-xlsx.js
Last active July 17, 2025 15:18
Read XLSX in Node.js
const XLSX = require("xlsx"); // 0.18.5
const workbook = XLSX.readFile("foo.xlsx", { cellDates: true });
const sheetName = workbook.SheetNames[0];
const worksheet = workbook.Sheets[sheetName];
const data = XLSX.utils.sheet_to_json(worksheet, { defval: "" });
console.log(data);
@ggorlen
ggorlen / index.html
Created May 25, 2025 19:18
minimal vanilla SPA history router
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
</head>
<body>
<div id="app"></div>
<script>
const nav = `<a href="/">Home</a> |
<a href="/about">About</a> |
@ggorlen
ggorlen / hyperformula-playground.html
Last active May 20, 2025 02:17
HyperFormula Playground
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="description" content="HyperFormula Playground" />
<meta name="color-scheme" content="dark light" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>HyperFormula Playground</title>
<link rel="icon" href="https://fav.farm/⚡" />
<script src="https://cdn.jsdelivr.net/npm/hyperformula@3.0.0/dist/hyperformula.full.min.js"></script>
@ggorlen
ggorlen / scrape-kanopy.js
Last active April 21, 2025 14:22
scrape kanopy
var results = [];
for (let pg =1;pg < 50_000; pg++) {
var res = await fetch(`https://www.kanopy.com/kapi/search/videos?sort=popular&rfp=exclude&domainId=2290&isKids=false&page=${pg}&perPage=40`, {
"credentials": "include",
"headers": {
"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:137.0) Gecko/20100101 Firefox/137.0",
"Accept": "application/json, text/plain, */*",
"Accept-Language": "en-US,en;q=0.5",
"Authorization": "Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJkYXRhIjp7InVpZCI6IjMzMDU3NjkiLCJpZGVudGl0eV9pZCI6IjE3OTMxMDI2OCIsInZpc2l0b3JfaWQiOiIxNzQzOTExNDcwNTk5MDE5MjI1Iiwic2Vzc2lvbl9pZCI6IjE3NDUxODkxOTI0MjQwNTE3NzIiLCJjb25uZWN0aW9uX2lkIjoiMTc0NTE4OTE5MjQyNDA1MTc3MiIsImt1aV91c2VyIjoxLCJyb2xlcyI6WyJjb21Vc2VyIl19LCJpYXQiOjE3NDUxODkxOTIsImV4cCI6MjA2MDU0OTE5MiwiaXNzIjoia2FwaSJ9.dS0SQ32ZF5Vezr2Ha3GCvgFZ5tbzraAjIvRm_5LFCTI",
"X-Version": "web/prod/5.3.0/2025-03-24-13-06-01",
@ggorlen
ggorlen / chatgpt_turtle.py
Created April 8, 2025 20:34
ChatGPT turtle
import turtle
from os import environ
from openai import OpenAI # 1.12.0
instructions = input("What should I draw? ")
prompt = (
"Generate valid Python turtle code to draw the following input:"
@ggorlen
ggorlen / guitar-tuner.html
Created April 7, 2025 19:39
Guitar tuner
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="color-scheme" content="dark light">
<link rel="icon" href="data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' width='48' height='48' viewBox='0 0 16 16'><text x='0' y='14'>🎸</text></svg>" />
<title>Guitar Tuner</title>
<style>
body {
font-family: sans-serif;