Skip to content

Instantly share code, notes, and snippets.

View szhu's full-sized avatar

Sean Zhu szhu

  • Google
  • NYC / SF
  • 14:44 (UTC -04:00)
  • X @sfzhu
View GitHub Profile
#!/bin/bash
set -e
if [[ -z "$1" ]]; then
echo "Usage: $0 backup|backup-and-delete|restore"
exit 1
fi
CMD=$1
SELF=$0
@szhu
szhu / make-dynamic-wallpaper.sh
Created April 6, 2025 21:43
Make a basic macOS dynamic wallpaper
#!/bin/sh
# A script version of the instructions here: https://remove.codes/01-dynamic-wallpaper
set -e
# Helper functions.
verbose() {
echo >&2
echo $ "$@" >&2
#!/bin/bash
set -e
echo "==> Formulae" && brew leaves | xargs brew deps --tree --formula | sed '/^$/d' && echo && echo "==> Casks" && brew list --cask | xargs brew deps --tree --cask | sed '/^$/d'
@szhu
szhu / preallocate.c
Created February 17, 2025 16:57
Create a file that takes up space, a little faster than using `mkfile`.
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <errno.h>
// Converts a size string (e.g., "20g", "500m", "1024") into bytes.
off_t parse_size(const char *sizeStr) {
char *end;
-- ~/.hammerspoon/init.lua
---@diagnostic disable-next-line: undefined-global
local hs = hs
hs.window.animationDuration = 0
-- https://github.com/Hammerspoon/hammerspoon/issues/3224#issuecomment-1294971600
local function axHotfix(win, fn)
local axApp = hs.axuielement.applicationElement(win:application())
local wasEnhanced = axApp.AXEnhancedUserInterface
#!/usr/bin/env deno run --allow-env --allow-read --allow-run
// Was this file modified in any PR?
import { readline } from "https://deno.land/x/readline@v1.1.0/mod.ts";
declare global {
export const Deno: any;
export interface ArrayConstructor {
fromAsync<T>(asyncIterable: AsyncIterable<T>): Promise<T[]>;
}

Update!

I just found rclone, which seems to do what my script does, and more:

  • No need to set up sharing a particular way
  • Won't time out, you can just leave it running until it's done
  • Seems to run much much faster
  • Keeps modified times on files the same

The only drawback is that it takes a bit longer to setup.

type ItemInfo =
| {
type: "element";
key: string | undefined;
}
| { type: "other" };
function getItemInfo(item: unknown): ItemInfo {
if (typeof item === "object" && item != null) {
if ("key" in item) {
#!/opt/homebrew/bin/bun run
// <xbar.title>CPU Usage, Kill process</xbar.title>
// <xbar.version>v1.0</xbar.version>
// <xbar.author>Sean Zhu</xbar.author>
// <xbar.author.github>szhu</xbar.author.github>
// <xbar.desc>Shows the top 5 highest-CPU processes. Select a process to kill it.</xbar.desc>
// <xbar.image>https://raw.githubusercontent.com/Aleksandern/devman/master/images/BitBarCpuUsageKill.png</xbar.image>
// <xbar.dependencies>deno</xbar.dependencies>
// Based on: https://xbarapp.com/docs/plugins/System/cpu-usage-kill.5s.sh.html
@szhu
szhu / makeSetValue.ts
Created March 10, 2024 20:35
Immutably set a nested key on an object.
type PickByNullableType<D, T> = {
[K in keyof D]: NonNullable<D[K]> extends T ? K : never;
};
type PickKeysWithNullableValueTypes<D, T> = keyof D &
PickByNullableType<D, T>[keyof D];
function setLevel1Value<D extends object, K1 extends keyof D>(
data: D,
key1: K1,