Skip to content

Instantly share code, notes, and snippets.

View odbol's full-sized avatar

Tyler Freeman odbol

View GitHub Profile
odbol /
Created February 5, 2024 18:11
Useful Regexes

Find all <style> tags and their contents:


odbol /
Last active January 15, 2024 22:25
WooCommerce: how to update prices in bulk directly in the database using SQL

WooCommerce: how to update prices in bulk without a plugin

The WooCommerce Wordpress plugin doesn't have a way to update all prices for all products and all variations in bulk. You have to do it by hand, in the Wordpress admin editor, or pay for a "bulk edit" plugin to do it.

Or, you can hack the database directly using some fancy SQL. It took me a while to figure this out.

-- Update all prices for all variations and products that are 4.99, change to 5.99
odbol / FractionsSequence.kt
Created December 5, 2022 18:15
Kotlin sequence generator for stepping through float ranges without accumulating floating-point errors
fun generateSequenceOfFractions(
range: ClosedFloatingPointRange<Float>,
step: Float
): Sequence<Float> {
val multiplier = 1f / step
val start = floor(range.start * multiplier).toInt()
val endInclusive = ceil(range.endInclusive * multiplier).toInt()
return generateSequence(start) { it + 1 }
.takeWhile { it <= endInclusive }
.map{ it.toFloat() / multiplier }
odbol / Utils.ts
Created October 3, 2022 22:45
Utility functions for parsing querystrings and other useful JS goodies
/** Returns the first querystring parameter with the given key, or null if not found. */
export function getParam(param: string): string|null {
var dataCallbackMatches = new RegExp(param + '=([^&]+)').exec(document.location.href);
if (dataCallbackMatches) {
return dataCallbackMatches[1];
} else {
return null;
odbol / PendingRequest.ts
Created August 4, 2022 23:11
PendingRequest: a way to implement Promise-based APIs across process boundaries like iframes or ServiceWorkers.
import {Deferred} from './Deferred.js'; // See
* A PendingRequest.
export interface PendingRequest<T> {
* Id of the request for resolving/rejecting later.
requestId: number;
odbol / Deferred.ts
Created August 4, 2022 23:06
Deferred: a Promise that you can resolve or reject after the fact.
* A Promise that you can resolve or reject after the fact.
export class Deferred<T> {
private _resolve?: (result: T) => void;
private _reject?: (error: Error) => void;
promise: Promise<T>;
constructor() {
this.promise = new Promise((resolve, reject) => {
odbol / AnimationUtils.ts
Created July 15, 2022 22:19
Collection of mathy math functions for mathing and animating
export type float = number;
* Interpolate a value with specified extrema, to a new value between new extrema.
* @param value the current value
* @param inputMin minimum the input value can reach
* @param inputMax maximum the input value can reach
* @param outputMin minimum the output value can reach
* @param outputMax maximum the output value can reach
odbol / CsvCredentialsProvider.mjs
Created April 28, 2022 14:13
Node.js script to read AWS Credentials from the CVS file that the AWS Console provides you. Baffling that they don't offer this by default...
import {promises as fs} from 'fs';
import os from 'os';
import { parse } from 'csv-parse/sync';
* Creates a credential provider to pass to S3Client which reads a credentials
* CSV downloaded from the AWS console.
* @param csvFile string path of the CSV file from AWS console.
* @returns a Provider<Credentials> to give to S3Client as the credentials option.
I am attesting that this GitHub handle odbol is linked to the Tezos account tz1cdfM7UEtbMt6fMUyGJ4sf5UVNMHEwnEGZ for tzprofiles
odbol / RxFirebaseUtils.kt
Created August 3, 2021 20:38
Utilities for converting Firebase results to RxJava Observables
package com.odbol.rx
import io.reactivex.Emitter
import io.reactivex.Observable
import io.reactivex.Single
import io.reactivex.SingleEmitter