Skip to content

Instantly share code, notes, and snippets.

View drscotthawley's full-sized avatar
Solving environment /

Scott H. Hawley drscotthawley

Solving environment /
View GitHub Profile
@drscotthawley
drscotthawley / run-config.py
Created January 4, 2025 23:36
Wrapper to run another script with CLI args read from a JSON config file stored on WandB; allows override via new CLI args. Gen'd by Claude 3.5 Sonnet.
#!/usr/bin/env python3
import json
import subprocess
import argparse
import sys
import os
def parse_override_args(args):
"""Parse CLI arguments that start with '--' into a dict."""
overrides = {}
@drscotthawley
drscotthawley / audio_data2url.py
Last active September 3, 2024 19:52
Move audio data in Jupyter notebooks to external urls stored on separate Git branch
#!/usr/bin/env python3
# audio_data2url.py
# Author: Scott H. Hawley
# License: MIT
# Date: Sep 2, 2024
# Description: This script will convert base64 audio src data in a Jupyter notebook to URLs of the same audio
# which is saved in a separate branch of the same GitHub repository. The script will save the audio files in a
# directory named 'audio_files' and commit them to the 'audio-storage' branch. The script will then replace the
# base64 data with the raw URL of the audio file in the notebook. The script can be run on a single notebook file
@drscotthawley
drscotthawley / dualsense_listener.py
Last active December 2, 2023 13:49
PS5 DualSense Controller Listener
#! /usr/bin/env python
# OS-Agnostic PS5 DualSense Controller Listener
# Author: Scott H. Hawley
# Instructions:
# 1. Pair the DualSense controller with your computer
# 2. Install hidapi system binary, e.g. on Mac: brew install hidapi
# 3. Install Python packages: pip install hidapi pygame numpy
# 4. Run this script!
@drscotthawley
drscotthawley / tailtop
Last active June 15, 2023 17:02
bash aliases for SLURM: "tailjob <jobid>" or just "tailtop" for most recent job
# tails output of any SLURM job that is listed in the queue.
# if job is pending, tailjob will wait until the output file exists
# usage: tailjob <job_id>
tailjob() {
local job_id=$1
if [[ -n "$job_id" ]]; then
local stdout_file=$(scontrol show job "$job_id" | awk -F= '/StdOut=/{print $2}')
echo "Running tail -F $stdout_file"
tail -F "$stdout_file"
else
@drscotthawley
drscotthawley / rearrangewrapper.py
Last active October 30, 2022 01:52
Wrapper to give einops.rearrange an "inverse"
from einops import rearrange as _rearrange
class RearrangeWrapper():
"wrapper to endow einops.rearrange with an 'inverse' operation"
def __init__(self):
self.shape, self.s = None, None # just in case someone tries to call inverse first
def __call__(self, x, s:str, **kwargs): # this 'forward' call is lightweight to preserve original usage
self.shape, self.s = x.shape, s
return _rearrange(x, s, **kwargs)
@drscotthawley
drscotthawley / magic_mult.py
Last active October 4, 2022 12:12
Tries to multiply two arrays/matrices in a variety of ways; returns what "works"
def magic_mult(a, b):
"""
Tries to multiply two arrays/matrices in a variety of ways
Returns all possible working combos as a dict, with the shapes of their respective outputs
Author: Scott H. Hawley, @drscotthawley
"""
combos = ['a*b', 'a*b.T', 'a.T*b', 'a.T*b.T','b*a', 'b*a.T', 'b.T*a', 'b.T*a.T'] # elementwise multiplications
combos += [s.replace('*',' @ ') for s in combos] # matrix multiplications (I like the space here)
working_combos = {}
for s in combos:
@drscotthawley
drscotthawley / usagebot.py
Last active October 1, 2022 22:12
SLURM cluster usage tracker Discord bot
#! /usr/bin/env python3
"""
SLURM usage tracker Discord bot by drscotthawley & rom1504
Requires external file token_channel.csv to connect to Discord
Syntax of that file should be:
token,channel
<DISCORD_BOT_TOKEN>,<CHANNEL_ID>
@drscotthawley
drscotthawley / Tabular_Spotify.drawio.svg
Created November 8, 2021 23:39
my svg file of tabular data model
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
@drscotthawley
drscotthawley / webcam_nerverot.py
Created June 2, 2021 19:38
change webcam settings in realtime
#!/usr/bin/env python3
# Do violence to the Logitech C920s webcam settings in realtime
# To annoy your Zoom-mates by constantly changing the image
from pynput.keyboard import Listener
import os, sys
import random
import time
@drscotthawley
drscotthawley / kfold_swap.py
Last active January 25, 2021 15:33
Swaps Validation set with a section of Training set, given a value for k
# In case you didn't think to add k-fold cross-validation until late in your
# ML project,...
# This is built for a situation where datasets are arrays of, say, images.
def kfold_swap(train_X, train_Y, val_X, val_Y, k):
"""
Swaps val with a section of train, given a value for k
"Duct tape" approach used to "retro-fit" k-fold cross-validation while minimally
disturbing the rest of the code, while avoiding reloading data from disk and
keeping RAM use manageable. (e.g. np.append() is bad b/c it would copy all of train)