Skip to content

Instantly share code, notes, and snippets.

Avatar

Jamie Gaskins jgaskins

View GitHub Profile
@jgaskins
jgaskins / app.cr
Created Jan 18, 2021
Roda-like routing mixin for Crystal
View app.cr
require "http"
require "./route"
class App
include HTTP::Handler
include Route
def call(context)
route context do |r, response|
@jgaskins
jgaskins / bench_allocations.cr
Created Dec 3, 2020
Benchmarking allocation time of Crystal objects with various quantities of instance variables
View bench_allocations.cr
require "benchmark"
value = nil
Benchmark.ips do |x|
x.report "1 ivar" { value = OneIVar.new }
x.report "2 ivars" { value = TwoIVars.new }
x.report "4 ivars" { value = FourIVars.new }
x.report "8 ivars" { value = EightIVars.new }
x.report "16 ivars" { value = SixteenIVars.new }
end
@jgaskins
jgaskins / bench_parse_int.cr
Created Jun 28, 2020
Compare parsing an int as intermediate strings vs using a byte parser directly on the IO
View bench_parse_int.cr
require "benchmark"
int = 0
[1, 12, 1234, 12345678, 1234567812345678].each do |number|
puts "Parsing #{number}..."
io = IO::Memory.new
io << ":#{number}\r\n" # Redis integer format
io.rewind
Benchmark.ips do |x|
@jgaskins
jgaskins / redis.cr
Created May 28, 2020
Simple Redis implementation in Crystal
View redis.cr
require "socket"
module Redis
alias Type = String | Int64 | Nil | Array(Type)
class Future
property! value : Type
end
module Commands
@jgaskins
jgaskins / redis_ext.cr
Created May 28, 2020
Adding stream support to Crystal Redis
View redis_ext.cr
class Redis
module Commands
def xadd(stream, id, params : Hash)
params = params.each_with_object(Array(String).new(params.size * 2)) do |(key, value), array|
array << key << value.to_s
end
string_command(["XADD", stream, id] + params)
end
def xrange(stream, start, finish)
@jgaskins
jgaskins / event_handlers.js
Created Jan 31, 2020
Managing your own DOM event handlers in JS
View event_handlers.js
/* Data structure to hold our event handlers. It's important that when you
remove an element from the DOM that you delete its associated event
handler id to avoid memory leaks.
{
12345: { // DOM element's event handler id
click: [
function(event) { ... },
]
},
@jgaskins
jgaskins / fetch.cypher
Created Nov 17, 2019
Fetching a remote user
View fetch.cypher
// The $url is passed in as the only parameter to this query. The query
// handles everything else.
CALL apoc.load.jsonParams($url, {Accept: 'application/json'}, null, null, {}) YIELD value AS data
// Upsert the person into the DB, using the :Person label in case they aren't
// a fully-fledged account yet
MERGE (person:Person { id: data.id })
ON CREATE SET
person.created_at = datetime()
@jgaskins
jgaskins / set_operations.rb
Created Oct 13, 2019
SQL result set operations for ActiveRecord
View set_operations.rb
module SetOperations
def union_scope(*scopes)
apply_operation :UNION, scopes
end
def intersect_scope(*scopes)
apply_operation :INTERSECT, scopes
end
def except_scope(*scopes)
View cluster.yaml
---
kind: Service
apiVersion: v1
metadata:
name: main-app
annotations:
service.beta.kubernetes.io/do-loadbalancer-protocol: "http"
service.beta.kubernetes.io/do-loadbalancer-algorithm: "least_connections"
service.beta.kubernetes.io/do-loadbalancer-tls-ports: "443"
service.beta.kubernetes.io/do-loadbalancer-certificate-id: "YOUR_CERT_ID_GOES_HERE"
@jgaskins
jgaskins / server.cr
Last active Dec 4, 2019
Serve a sample JSON payload in Crystal
View server.cr
require "http"
require "uuid"
require "uuid/json"
class App
include HTTP::Handler
def call(context)
Fiber.yield # Simulate getting data from the DB
response_payload.to_json context.response