Skip to content

Instantly share code, notes, and snippets.

@kddnewton
kddnewton / json.rb
Last active October 6, 2023 09:25
JSON parser with pattern matching
require "json"
struct = { "a" => 1, "b" => 2, "c" => [1, 2, 3], "d" => [{ "e" => 3 }, nil, false, true, [], {}] }
source = JSON.dump(struct)
tokens = []
index = 0
until source.empty?
tokens <<
@kddnewton
kddnewton / assembler.rs
Created May 3, 2022 18:20
Generic assembler
/// This is the opcode of the instruction.
enum Op {
Add,
Sub,
Mov,
}
/// This is a reference to a register. It is passed around when generating the
/// IR through the Assembler struct. When it gets loaded into an Insn struct as
/// part of a generated instruction, it is wrapped into an Opnd::Reg.
@kddnewton
kddnewton / library.rb
Created March 31, 2022 18:26
Migration stuff
# frozen_string_literal: true
module ActiveRecord
class Migration
class MigrationError < StandardError
end
RenameColumn = Struct.new(:table_name, :column_name, :new_column_name, keyword_init: true)
RemoveColumn = Struct.new(:table_name, :column_name, keyword_init: true)
AddColumn = Struct.new(:table_name, :column_name, :type, :options, keyword_init: true)
@kddnewton
kddnewton / natalie.svg
Created February 4, 2022 20:29
Natalie logo
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
@kddnewton
kddnewton / wordle.rb
Last active January 23, 2022 08:45
Wordle solver
words = []
letters = ("a".."z").to_a
File.foreach("/usr/share/dict/words", chomp: true) do |word|
words << word.downcase if word.match?(/\A[a-z]{5}\z/i)
end
while words.length > 1
weights = letters.to_h { |letter| [letter, 0] }
words.each do |word|
def count_constant_refs(iseq)
cached = false
iseq.last.each_with_object([]) do |insn, counts|
case insn
in [:opt_getinlinecache, *]
cached = true
counts << 0
in [:getconstant, *]
counts[counts.length - 1] += 1 if cached
# frozen_string_literal: true
require 'ripper'
# A Ripper parser that will replace usage of Sorbet patterns with whitespace so
# that location information is maintained but Sorbet methods aren't called.
class Eraser < Ripper
# Represents a line in the source. If this class is being used, it means that
# every character in the string is 1 byte in length, so we can just return the
# start of the line + the index.

Faster Rails tests

Feedback loop speed in one of the biggest contributing factors to overall development time. The faster you get results, the faster you can move on to other things. A fast enough test suite is therefore critical to teams' success, and is worth investing some time at the beginning to save in the long run.

Below is a list of techniques for speeding up a Rails test suite. It is not comprehensive, but should definitely provide some quick wins. This list of techniques assumes you're using minitest, but most everything should translate over to rspec by simply replacing test/test_helper.rb with spec/spec_helper.rb.

@kddnewton
kddnewton / annoy_scanners_server.rb
Last active June 22, 2022 15:31
Annoy scanners
# I really don't like getting routing error notifications when scanners try to
# find vulnerabilities in our application. As such, this extends our routing
# to actually give a response, but it's likely not what they were looking for.
# If they're not using a headless browser, the `alert` is going to kill their
# productivity. If they are, they just might enjoy the youtube video anyway.
class AnnoyScannersServer
SCANNER_PATHS = %w[
/a2billing/admin/Public/index.php
/a2billing/common/javascript/misc.js
/a2billing/customer/templates/default/css/popup.css