Skip to content

Instantly share code, notes, and snippets.

@jnunemaker
jnunemaker / active_job_checkins.rb
Created September 28, 2023 14:31
Automatic honey badger check ins for active job. Just setup the check in with honey badger and configure an env var to the identifier they provide.
# Set HONEYBADGER_FOO_BAR_JOB=asdf where asdf is the check in value Honeybadger gives you.
class ApplicationJob < ActiveJob::Base
after_perform { |job| job.honeybadger_checkin }
# Check in with Honeybadger to let us know that the job was performed
# if there is an identifier configured for the job.
def honeybadger_checkin
identifier = honeybadger_checkin_identifier
return unless identifier.present?
@jnunemaker
jnunemaker / levenshtein.sql
Created September 11, 2023 13:02
Some example usage of levenshtein to calculate the difference between two strings.
-- https://www.postgresql.org/docs/current/fuzzystrmatch.html#id-1.11.7.26.7
-- Calculates the distance between two strings.
SELECT levenshtein('New York', 'New York'); -- 0
SELECT levenshtein('New York', 'New Jersey'); -- 5
SELECT levenshtein('New York', 'Dallas'); -- 8
-- find the opponent with the name closest to 'New York'
SELECT * FROM opponents WHERE team_id = 1
ORDER BY levenshtein(name, 'New York')
diff --git a/Gemfile b/Gemfile
index e3a71e1..34ba75c 100644
--- a/Gemfile
+++ b/Gemfile
@@ -107,3 +107,4 @@ gem "pundit"
gem "rack-canonical-host"
gem "ruby-readability"
gem "rinku", require: "rails_rinku"
+gem "virtus"
diff --git a/app/controllers/articles_controller.rb b/app/controllers/articles_controller.rb
@jnunemaker
jnunemaker / initializer.rb
Created December 3, 2021 15:16
github-ds postgres version of GitHub::KV
module BoxOutSports
def self.kv
@kv ||= KeyValueJsonb.new(use_local_time: Rails.env.test?) {
ActiveRecord::Base.connection
}
end
end
@jnunemaker
jnunemaker / partition_by_day.rb
Created December 2, 2021 19:42
Ruby class to partition by day using native declarative partitioning in postgres
# https://www.postgresql.org/docs/13/ddl-partitioning.html#DDL-PARTITIONING-DECLARATIVE
class PartitionByDay
class Row
include Virtus.model
attribute :name, String
attribute :expression, String
end
def self.all(table)
@jnunemaker
jnunemaker / github_sql_patches.rb
Last active January 7, 2022 15:15
Hack GitHub sql to work with postgres cast operator
# Shorcut because typing GitHub everywhere gets old
SQL = GitHub::SQL
module GitHub
class SQL
private
# Overwrite interpolate to be ok with postgres casting (::regclass, etc.).
def interpolate(sql, extras = nil)
sql.gsub(/(:?):([a-z][a-z0-9_]*)/) do |match|
@jnunemaker
jnunemaker / gist:87fb475129c0601fa72695afe912b02f
Created September 7, 2017 18:48
sha256 hexdigest to number for use in mapping a string to a partition number (not consistent hashing, but just in simple hash => partition)
irb(main):001:0> require "digest"
=> true
irb(main):002:0> Digest::SHA256.hexdigest("asdf")
=> "f0e4c2f76c58916ec258f246851bea091d14d4247a2fc3e18694461b1816e13b"
irb(main):003:0> Digest::SHA256.hexdigest("asdf").to_i(16)
=> 108959270400061671294053818573968651411470832267186275529291850190552309358907
irb(main):004:0> Digest::SHA256.hexdigest("asdf").to_i(16).to_s(16)
=> "f0e4c2f76c58916ec258f246851bea091d14d4247a2fc3e18694461b1816e13b"
irb(main):005:0> Digest::SHA256.hexdigest("asdf").to_i(16) % 10
=> 7

Keybase proof

I hereby claim:

  • I am jnunemaker on github.
  • I am jnunemaker (https://keybase.io/jnunemaker) on keybase.
  • I have a public key whose fingerprint is 2F06 D8EA 2B19 8EAB 40C2 7379 7BF1 39D1 EC76 CA82

To claim this, I am signing this object:

@jnunemaker
jnunemaker / mute_all_unread.js
Last active February 3, 2016 14:41
terrible github web notifications #protip: command + click any notifications you care about to open in new tab, then run the following in js console to mute the rest
$('li.unread button.mute-note').each(function() { this.click() });
@jnunemaker
jnunemaker / catspam.sh
Created April 28, 2014 19:16
catspammer.com bash automation
catspam() {
curl -vvvv -d "{\"Body\":\"${1}\"}" -H "Content-Type: application/json" http://catspammer.com/api/cat
}