Skip to content

Instantly share code, notes, and snippets.

@jhollinger
jhollinger / .tmux.conf
Last active January 30, 2024 03:07
My Dotfiles
# vim style tmux config
# use C-a, since it's on the home row and easier to hit than C-b
set-option -g prefix C-a
unbind-key C-a
bind-key C-a send-prefix
set -g base-index 0
# Easy config reload
bind-key R source-file ~/.tmux.conf \; display-message "tmux.conf reloaded."
@jhollinger
jhollinger / nyancat
Last active March 26, 2023 15:44
Nyancat
#!/usr/bin/env bash
red='\e[31m'
green='\e[32m'
yellow='\e[33m'
blue='\e[34m'
bold='\033[1m'
normal='\e[0m'
lines=(
@jhollinger
jhollinger / keep-recent.sh
Created March 24, 2023 19:16
Keep most recent files
# Delete all but the most recent N files in the given dir (and its subdirs)
function keep_most_recent {
dir="$1"
n=$2
offset=$((n+1))
find "$dir" -type f -printf "%T+ %p\n" |
sort -r |
awk '{ print $2 }' |
tail -n +$offset |
xargs --no-run-if-empty rm -f
@jhollinger
jhollinger / extract-google-photos
Created February 5, 2023 21:06
Extract photos/video from a Google Takeout tarball
#!/usr/bin/env bash
set -euo pipefail
if [[ $# -ne 2 ]] || [[ ! -f "$1" ]] || [[ ! -d "$2" ]]; then
echo "usage: extract-google-photos [tarfile] [dest-dir]"
exit 1
fi
if ! command -v exiftool > /dev/null || ! command -v gawk > /dev/null; then
@jhollinger
jhollinger / chrome-auto.sh
Last active July 2, 2021 20:07
Remote Headless Chrome
#
# Easiest. If this doesn't work right, try manual.sh
#
docker run --rm -it -p=0.0.0.0:9222:9222 alpeware/chrome-headless-trunk
# Then open local Chrome go to localhost:9222, then to chrome://inspect. From there you can open new tabs and inspect them.
@jhollinger
jhollinger / csp-strict-dynamic.js
Last active March 8, 2023 22:56
Rewrites index.html to with CSP strict-dynamic enabled
/**
* Usage: node csp-strict-dynamic.js dist/index.html [path/to/nginx.conf]
*
* Replaces all external script tags in index.html with dynamic loaders, calculates their SHA 256 hashes, and adds those
* hashes as allowed script sources + strict dynamic. Also works for inline scripts.
*
* Your index.html and/or given nginx/apache config file should contain your CSP policy with a script-src section like below:
*
* script-src 'strict-dynamic' {{csp-strict-dynamic-sources}};
*/
@jhollinger
jhollinger / Gemfile
Created April 9, 2019 00:23
DatabaseTasks Green Example
source 'https://rubygems.org'
gem 'activerecord', '~> 5.2', require: 'active_record'
gem 'sqlite3'
gem 'rake'
def fizzbuzz(input)
input.map do |n|
fizz = n % 3 == 0 ? 'Fizz' : nil
buzz = n % 5 == 0 ? 'Buzz' : nil
if fizz or buzz
"#{fizz}#{buzz}"
else
n.to_s
end
end
@jhollinger
jhollinger / loc
Created April 7, 2016 18:54
Lines of Code
#!/bin/bash
find $@ -type f -print0 | wc -l --files0-from=-
@jhollinger
jhollinger / sidekiq_csrf_token_fix.rb
Created November 23, 2015 17:17
Fix for Sidkiq::Web's lack of CSRF token
require 'securerandom'
module Sidekiq
class CsrfTokenFix
def initialize(app)
@app = app
end
def call(env)
request = Rack::Request.new(env)