Skip to content

Instantly share code, notes, and snippets.

View deviationist's full-sized avatar

Robert S. deviationist

  • Oslo-area, Norway
View GitHub Profile
@deviationist
deviationist / useDebounce.ts
Created March 7, 2024 18:35
A simple debouce use-hook for React and TypeScript
import { useEffect, useRef } from 'react';
export const useDebounce = (callback: Function, delay: number) => {
const timeoutRef = useRef<null|NodeJS.Timeout>(null);
useEffect(() => {
return () => {
if (timeoutRef.current) {
clearTimeout(timeoutRef.current);
}
};
}, []);
@deviationist
deviationist / unique-email-field.ts
Last active February 9, 2024 23:16
Sanity unique e-mail field
defineField({
name: 'email',
title: 'Email',
type: 'string',
readOnly: ({document}) => document?.origin === 'Checkin',
description: 'Can only be changed in Checkin if the origin is "Checkin".',
validation: Rule => Rule.required().email().custom(async (email: any, context: any) => {
const response = await client.fetch(`*[_type == "user" && email == $email && !(_id in [$draftId, $id])]`, {email, draftId: context.document._id, id: context.document._id.replace('drafts.', '')});
if (response?.length > 0) {
return 'Email already in use';
@deviationist
deviationist / macos-bootable-usb.txt
Created January 12, 2024 18:13
Create macOS bootable USB on a M1 Macbook (High Sierra in this example)
You might need to format the USB-stick with Mac Extended (Journaled) before starting this process.
This guide is primarily based on Apple's own guide (https://support.apple.com/en-us/101578), but it solves other issues which is not adressed by Apple.
1. Download Mist: https://github.com/ninxsoft/Mist
Go the the release-page and download the latest "dmg"-file.
https://github.com/ninxsoft/Mist/releases
2. Extract the app-file and place it in your Applications-folder
3. Open the app-file (you might need to right click it and click "Open"), then click "Open" again to proceed.
@deviationist
deviationist / gist:51cf2caf8d8e7db117d87cb2a1a5d23a
Created November 12, 2023 12:16
Downsample an AIFF-file using FFMPEG.
ffmpeg -y -nostdin -i a.aiff -ar 44100 -write_id3v2 1 -c:v copy b.aiff
@deviationist
deviationist / shallow-router.tsx
Created June 30, 2023 10:09
A bare simple class made for Next.js with static methods to use as a shallow router (triggering changes in the URL without Next acting on them).
export class ShallowRouter {
static push(url: string): void {
window.history.pushState({ ...window.history.state, as: url, url }, '', url);
}
static replace(url: string): void {
window.history.replaceState({ ...window.history.state, as: url, url }, '', url);
}
}
@deviationist
deviationist / useEffectNonInit.ts
Last active March 11, 2024 15:45
React's useEffect, but it does not run on initial render. Now with TypeScript-support.
/* eslint-disable react-hooks/exhaustive-deps */
import { useEffect, useRef, DependencyList } from 'react';
export const useEffectNonInit = (effect: Function, deps: DependencyList = []) => {
const isInitial = useRef<boolean>(true);
useEffect(() => {
if (isInitial.current) {
isInitial.current = false;
return;
}
effect();
@deviationist
deviationist / audio-file-extension-check.sh
Created June 2, 2023 22:10
File counter grouped by file extension, tailored for audio files.
#!/usr/bin/env bash
echo "File type count:"
fileExtensions=( aiff mp3 wav m4a flac alac )
totalFileCount=$(find . -name "*.aiff" -o -name "*.mp3" -o -name "*.wav" -o -name "*.m4a" -o -name "*.flac" -o -name "*.alac" | wc -l)
for fileExtension in "${fileExtensions[@]}"
do
fileCount=$(find . -name "*.${fileExtension}" | wc -l)
@deviationist
deviationist / remove-all-sharing.js
Last active May 9, 2023 09:28
This is a script that will traverse all your Google Drive files and remove all sharing (owner access only).
// Ensure you've installed gdrive first: https://github.com/glotlabs/gdrive
import { spawnSync } from 'child_process';
const delimiter = ';;;';
let files = [];
function getRawFiles(parent) {
const args = ['files', 'list', `--field-separator=${delimiter}`];
if (parent) {
args.push(`--parent=${parent}`);
@deviationist
deviationist / Code.gs
Last active May 2, 2023 07:21
A set of functions for Google Sheets to sum columns by text formatting. Currently supports font weight, line-through, underline.
// These functions let's you sum columns based on their text formatting.
// The only flaw is that there's no text formatting change event, so you have to update the value of a field to trigger recalculation.
// styleRangeString (string) - The range where the text formatting should be evaluated. Example: A10:A20
// sumRangeString (string) - The range where the numerical values will be summed. Should correspond with styleRangeString unless you only specify column. Example: B10:B20
// attribute (string) - The text formatting attribute for conditional check during sum.
// Note: styleRangeString and sumRangeString must be passed as a STRING, meaning it has to be wrapped in quotes ("A10:A20").
// Example:
@deviationist
deviationist / node-disk-cache.js
Last active April 12, 2023 20:13
A simple file-based cache driver for Node with expiration-support. No external packages needed.
import fs from 'fs';
export default class DiskCache {
static basePath = './.cache';
static prettyPrintJson = false;
#filePath;
#cacheName;
#data = {};
constructor(cacheName) {