Skip to content

Instantly share code, notes, and snippets.

View inopinatus's full-sized avatar
🐼
fuzzy logic

Josh Goodall inopinatus

🐼
fuzzy logic
View GitHub Profile
@inopinatus
inopinatus / uu58.rb
Last active October 11, 2023 20:21
Convert UUIDs to/from base58
module Uu58
# Convert a string UUID to a base58 string representation.
#
# Output will be padded up to 22 digits if necessary.
#
# Behaviour is undefined if passing something other than a 128-bit
# hex string in network order with optional interstitial hyphens.
def self.uuid_to_base58(uuid, alphabet = SecureRandom::BASE58_ALPHABET)
ary = uuid.delete("-").to_i(16).digits(58).reverse
ary.unshift(0) while ary.length < 22
@inopinatus
inopinatus / inequalities.md
Last active May 14, 2023 16:10
ar inequalities
Inequality Interval Ruby range Active Record¹ Arel² Description
x >= a [a, ∞) a.. where(x: a..) x.gteq(a) Right unbounded closed
x > a (a, ∞) n/a where.not(x: ..a) x.gt(a) Right unbounded open
x <= a (-∞, a] ..a where(x: ..a) x.lteq(a) Left unbounded closed
x < a (-∞, a) ...a where(x: ...a) x.lt(a) Left unbounded open
a <= x <= b [a, b] a..b where(x: a..b) x.between(a..b) Closed
a < x < b (a, b) n/a where.not(x: ..a).where(x: ...b) x.gt(a).and(x.lt(b)) Open
a <= x < b [a, b) a...b where(x: a...
@inopinatus
inopinatus / verify_and_decrypt_session_cookie52.rb
Created July 29, 2018 10:12
Decrypt Rails 5.2 session cookies
require 'cgi'
require 'active_support'
def verify_and_decrypt_session_cookie(cookie, secret_key_base = Rails.application.secret_key_base)
cookie = CGI::unescape(cookie)
salt = 'authenticated encrypted cookie'
encrypted_cookie_cipher = 'aes-256-gcm'
serializer = ActiveSupport::MessageEncryptor::NullSerializer
key_generator = ActiveSupport::KeyGenerator.new(secret_key_base, iterations: 1000)
@inopinatus
inopinatus / variant.rb
Last active March 22, 2022 00:30
Validating uniqueness of an association record with external scope
# frozen_string_literal: true
require "bundler/inline"
gemfile(true) do
source "https://rubygems.org"
gem "rails", "6.0.0"
gem "sqlite3"
gem "pry"
end
@inopinatus
inopinatus / castaway.rb
Created April 23, 2021 02:17
dangerous polymorphic fun with primary key casts (nsfw)
class CastIdsToText < ActiveRecord::Migration[6.0]
def up
add_cast :text, :uuid, function: :inout, context: :implicit
add_cast :text, :bigint, function: :inout, context: :implicit
end
def down
remove_cast :text, :uuid
remove_cast :text, :bigint
end
@inopinatus
inopinatus / bouquet-controller.js
Created January 8, 2021 22:08
Proof-of-concept, using a Stimulus wrapper for IntersectionObserver to drive Turbo lazy-loading via click events, with graceful fallback to plain HTML.
import { Controller } from "stimulus"
// Proof of concept for lazy loaded turbo frames
export default class extends Controller {
static targets = ["click", "events", "root"]
static values = {
rootMargin: String,
threshold: Number,
appearEvent: String,
disappearEvent: String
@inopinatus
inopinatus / worry.rb
Last active January 8, 2021 02:16
Abusing pattern matching as a proc factory and subsequent invocation
# frozen_string_literal: true
require 'json'
module Proxy
refine Object do
def deconstruct_keys(methods)
methods.to_h { |m| [m, ->(*a) { throw m, public_send(m, *a) }] }
end
end
end
@inopinatus
inopinatus / route-authenticators.rb
Created December 22, 2020 09:33
Injecting route-specific dependencies to avoid controller duplication.
# config/routes.rb
defaults authenticator: UserAuthenticator do
resources :todos
end
scope :api, defaults: { authenticator: APIAuthenticator, format: :json } do
resources :todos
end
# app/lib/user_authenticator.rb
@inopinatus
inopinatus / organisation.rb
Created December 14, 2020 22:57
Value object that replaced an enum
# app/models/organisation.rb
# schema like:
#
# create_table "organisations", id: :uuid, default: -> { "public.gen_random_uuid()" }, force: :cascade do |t|
# t.string "transponder", default: "my_laps", null: false
#
class Organisation < ApplicationRecord
attribute :transponder, TransponderType.new
@inopinatus
inopinatus / resprocketize.diff
Created August 27, 2019 13:55
Re-enable sprockets handling JS in Rails 6.0
diff --git a/Gemfile b/Gemfile
index 79cc614..9e03100 100644
--- a/Gemfile
+++ b/Gemfile
@@ -11,6 +11,8 @@ gem 'sqlite3', '~> 1.4'
gem 'puma', '~> 3.11'
# Use SCSS for stylesheets
gem 'sass-rails', '~> 5'
+# Bring back uglifier for sprockets
+gem 'uglifier', '>= 1.3.0'