Skip to content

Instantly share code, notes, and snippets.

View jgaskins's full-sized avatar

Jamie Gaskins jgaskins

View GitHub Profile
@jgaskins
jgaskins / active_support-executor-example.rb
Last active May 1, 2024 22:36
ActiveSupport::Executor example
require "active_support/executor"
require "active_record"
require "pg"
ActiveRecord::Base.establish_connection(
uri: "postgres:///",
adapter: :postgresql,
pool: 5,
)
@jgaskins
jgaskins / 0.output.txt
Created March 9, 2024 23:12
Minimal Redis cache implementation in pure Ruby, outperforming Hiredis by 2-3x
$ ruby -v bench_redis.rb
ruby 3.3.0 (2023-12-25 revision 5124f9ac75) [arm64-darwin23]
KEY : bench-redis
VALUE SIZE: 102400
ITERATIONS: 10000
GET
Rehearsal -------------------------------------------
@jgaskins
jgaskins / Dockerfile
Created February 12, 2023 13:09
KeyDB with RedisJSON and RediSearch
FROM ubuntu:20.04 AS redisjson
RUN apt-get update
RUN apt-get upgrade -y git
RUN apt-get install -y curl gcc
RUN apt-get install -y libclang-dev
WORKDIR /
RUN curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs -o install-rust.sh && sh ./install-rust.sh -y
RUN git clone https://github.com/RedisJSON/RedisJSON.git --branch v2.4.4
@jgaskins
jgaskins / 000-provision.sh
Last active November 17, 2022 23:25
Running Mastodon on Kubernetes
#!/usr/bin/env bash
# Install nginx ingress controller
# NOTE: This uses DigitalOcean. If you use another Kubernetes provider,
# substitute the appropriate command from here: https://kubernetes.github.io/ingress-nginx/deploy/#cloud-deployments
kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.5.1/deploy/static/provider/do/deploy.yaml
# FOR DIGITALOCEAN DEPLOYMENTS:
export LB_HOSTNAME=example.com # Make this the DNS name that will point to your LB
export LB_NAME=my-lb # Give this a useful name to identify it on the DigitalOcean control panel
@jgaskins
jgaskins / patch-lb.sh
Created November 1, 2022 21:55
Give DigitalOcean load balancers provisioned for Kubernetes clusters a name and hostname so the Cert Manager HTTP solver will work
#!/usr/bin/env bash
# Fill out these two
export LB_HOSTNAME=example.com
export LB_NAME=my-lb
echo '{"metadata":{"annotations":{"service.beta.kubernetes.io/do-loadbalancer-hostname":"$LB_HOSTNAME","service.beta.kubernetes.io/do-loadbalancer-name":"$LB_NAME"}}}' |
envsubst |
awk "{ print \"'\" \$1 \"'\" }" |
xargs kubectl patch svc -n ingress-nginx ingress-nginx-controller -p
@jgaskins
jgaskins / require.cr
Created May 11, 2022 21:18
Project-local requires in Crystal
# Experiment with macros to allow for project-local requires
# https://forum.crystal-lang.org/t/project-relative-require/4617
{% begin %}
ROOT = "{{system("pwd").strip.id}}"
{% end %}
macro spec(file)
macro load_spec
\{% path = __DIR__.gsub(%r{\A{{ROOT.id}}}, "").gsub(%r{[^/]+}, "..").id %}
require "\{{path[1..]}}/spec/{{file.id}}"
@jgaskins
jgaskins / elasticsearch_example.cr
Last active January 30, 2022 19:07
Elasticsearch Example in Crystal
require "http"
require "json"
require "uuid/json"
require "db"
require "interro" # github: jgaskins/interro
require "faker" # github: askn/faker
ES = ElasticSearch::Client.new
pg = DB.open("postgres:///")
Interro.config { |c| c.db = pg }
@jgaskins
jgaskins / immutable_each_array.cr
Last active January 5, 2022 20:08
Array that does not let you mutate while inside an `each` block
class ImmutableEachArray(T)
include Enumerable(T)
@iterating = Atomic(Int32).new(0)
@array = Array(T).new
def <<(value : T) : self
raise CannotMutateWhileIterating.new("you iteratin bruh") if @iterating.get > 0
@array << value
@jgaskins
jgaskins / 000-highlights.md
Last active May 28, 2021 02:28
Benchmarking Redis drivers: Ruby gem, Hiredis, and a custom Ruby implementation

Drivers

Name Description
ruby The redis gem with the plain-Ruby driver
hiredis The redis gem with the hiredis driver (compiled as a C extension)
myredis Pure-Ruby, optimized for the specific operation

Benchmarks

@jgaskins
jgaskins / benchmark.rb
Last active June 25, 2022 14:54
Benchmarking redis gem vs hiredis vs custom Redis client
require 'bundler/inline'
require 'socket'
class MyRedis
CRLF = "\r\n"
def initialize
@connection = TCPSocket.new('localhost', 6379)
@connection.sync = false
end