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 / 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
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)
#! /usr/bin/env python
'''
Simulation of a 'magnetic' pendulum. Actually we'll just use
electrostatic charges instead of magnets, but..good enough, right?
Plots an image showing which source the object is closest to after a certain time
(Note: Depending on params like maxiter, the object may still be moving at the
end of the simulation, so the 'ending position' may not be where it comes to rest.)
This code integrates all the (non-interacting) test objects at once, on the GPU.
@drscotthawley
drscotthawley / newpost.py
Last active July 28, 2020 03:12
Little script I use to easily start a new Fastpages/Jekyll/Markdown blog entry
#! /usr/bin/env python
# Little script I use to start a new Markdown blog entry.
# Run from the parent directory above the blog directory,
# or supply a full path to run from anywhere.
#
# Usage: newpost.py <title>
# It automatically figures out what the current date is to
# create a new entry, and supplies a default header with a title
# and a bibliography placement