Skip to content

Instantly share code, notes, and snippets.

View dominicgan's full-sized avatar

Dominic Gan dominicgan

View GitHub Profile
@dominicgan
dominicgan / export-stash.sh
Created June 2, 2024 04:11
Export git stashes into individual files
#!/bin/bash
# To use the script:
# 1. Save the script to a file, for example, export_stashes.sh.
# 2. Make the script executable: chmod +x export_stashes.sh.
# 3. Run the script: ./export_stashes.sh.
# Get the list of all stashes
stashes=$(git stash list)
@dominicgan
dominicgan / branch-name-validator.js
Last active June 2, 2024 04:13
Git pre-push branch name validator
/**
* Validate a branch name through the pre-push hook using husky and
* prevent incorrectly formatted branch names from reaching the server.
*/
const fs = require('fs');
const path = require('path');
const SUCCESS_CODE = 0;
const FAILED_CODE = 1;
@dominicgan
dominicgan / delete-old-branches-more-than-60d.sh
Created November 2, 2023 03:24
Find and delete all branches more than 60 days
reference_date=$(date -v-60d "+%s")
branches_to_delete=()
git for-each-ref --format='%(committerdate:raw)%09%(refname:short)' | while read date branch; do
commit_date=$(echo "$date" | cut -d' ' -f1)
if [ "$commit_date" -lt "$reference_date" ]; then
branches_to_delete+=("$branch")
echo "$branch has not been updated for more than 60 days"
fi
done
@dominicgan
dominicgan / compare.js
Created August 16, 2023 07:50
Compare two key:value arrays and list differences
function compareSelectedKeysWithValues(object1, object2, keysToCompare) {
const result = {};
keysToCompare.forEach(key => {
const arr1 = object1[key] || [];
const arr2 = object2[key] || [];
const added = arr2.filter(item2 => !arr1.some(item1 => Object.keys(item1)[0] === Object.keys(item2)[0]));
const deleted = arr1.filter(item1 => !arr2.some(item2 => Object.keys(item2)[0] === Object.keys(item1)[0]));
const modified = arr1.filter(item1 =>
{
"$schema": "http://json-schema.org/draft-07/schema#",
"definitions": {
"ApplicationStageType": {
"enum": [
"application",
"placeholderStage",
"uploadDocs"
],
"type": "string"
@dominicgan
dominicgan / wts-mkb-sg-discord.md
Last active November 1, 2019 08:13
WTS (sgd) – prices include local postage (resin/keycaps only)
Item Price Details
DSA Scientific $330 alphas, tkl specialty, 40s ortho
DSA Hana $120 base, novelties, numpad
GMK Modern Dolch $440 base, spacebars
GMK Minimal $300 base, 40s
Topre 9009 Keycaps $45 HHKB only. HJKL in 9009 vim colors
SKB65 $200 unbuilt kit 65%. no pcb (can use standard pcbs)
HHKB Pro 2 Type-S $270 comes with box. no usb cable sorry
Keylabs Corvus Mojito $30 looks like a keypora but not really. colorway looks like sa/gmk lime
@dominicgan
dominicgan / stylebot.css
Created April 4, 2019 06:24
Monochrome geekhack css for stylebot
/*
* Remove the colors on geekhack for office use
*/
/* Normal, standard links. */
a:link, a:visited {
color: #333;
}
@dominicgan
dominicgan / keymap.c
Last active February 21, 2019 06:39
Quefrency Feb 2019 V2.2 Layout
#include QMK_KEYBOARD_H
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[0] = LAYOUT(KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSLS, KC_GRV, KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSPC, KC_LCTL, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_UP, KC_DEL, MO(1), KC_LALT, KC_LGUI, MO(2), KC_SPC, KC_SPC, KC_NO, KC_LGUI, KC_LALT, KC_LEFT, KC_DOWN, KC_RGHT),
[1] = LAYOUT(KC_TILD, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_INS, KC_PSCR, KC_CAPS, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_PAUS, KC_SLCK, KC_DEL, KC_NO, KC__MUTE, KC_VOLD, KC__VOLUP, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, RGB_TOG, RGB_RMOD, RGB_MOD, RGB_HUD, RGB_HUI, RGB_SAD, RGB_SAI, RGB_VAD, RGB_VAI, KC_APP, KC_PGUP, KC_GR
@dominicgan
dominicgan / day1-puzzle1.js
Last active December 13, 2018 02:14
Advent of Code 2018 Solutions
fetch('https://adventofcode.com/2018/day/1/input')
.then(res => {
// convert html response body to text
res.text().then(rawData => {
// convert rawData to array
const data = rawData.trim().split('\n').map(elem => parseInt(elem));
console.log(data);
localStorage.setItem('advofcode-puzzle1', JSON.stringify(data)); // store item in localstorage
// reduce data into single value
{"keyboard":"quefrency/rev1","keymap":"quefrency_rev1_layout_mine","layout":"LAYOUT","layers":[["KC_ESC","KC_1","KC_2","KC_3","KC_4","KC_5","KC_6","KC_7","KC_8","KC_9","KC_0","KC_MINS","KC_EQL","KC_BSLS","KC_GRV","KC_TAB","KC_Q","KC_W","KC_E","KC_R","KC_T","KC_Y","KC_U","KC_I","KC_O","KC_P","KC_LBRC","KC_RBRC","KC_BSPC","KC_LCTL","KC_A","KC_S","KC_D","KC_F","KC_G","KC_H","KC_J","KC_K","KC_L","KC_SCLN","KC_QUOT","KC_ENT","KC_LSFT","KC_Z","KC_X","KC_C","KC_V","KC_B","KC_N","KC_M","KC_COMM","KC_DOT","KC_SLSH","KC_UP","KC_DEL","MO(1)","KC_LALT","KC_LGUI","KC_SPC","MO(2)","KC_SPC","KC_NO","KC_RGUI","KC_RALT","KC_LEFT","KC_DOWN","KC_RGHT"],["KC_TILD","KC_F1","KC_F2","KC_F3","KC_F4","KC_F5","KC_F6","KC_F7","KC_F8","KC_F9","KC_F10","KC_F11","KC_F12","KC_INS","KC_DEL","KC_NO","KC_NO","KC_NO","KC_NO","KC_NO","KC_NO","KC_NO","KC_NO","KC_NO","KC_NO","KC_NO","KC_SLCK","KC_PAUS","KC_PSCR","KC_NO","KC_MUTE","KC_VOLD","KC_VOLU","KC_NO","KC_NO","KC_NO","KC_NO","KC_NO","KC_NO","KC_NO","KC_NO","KC_NO","KC_NO","KC_NO","RGB_TOG",