Skip to content

Instantly share code, notes, and snippets.

@kddnewton
kddnewton / sudoku.py
Last active August 29, 2015 14:06
Sudoku Solver
#!/usr/bin/python
#
# Takes first command line argument as path to an input file.
# Input file is expected to contain 81 numbers, with 0
# representing empty spaces, and 1-9 representing given numbers.
from sys import argv, stdout, exit
# tries different possibilities, backtracks if necessary
def backtracking(domains, assignments, constraints):
@kddnewton
kddnewton / status_codes.rake
Last active August 29, 2015 14:20
Rack status codes
namespace :doc do
desc "Print HTTP status codes with associated symbols"
task :status_codes do
Rack::Utils::SYMBOL_TO_STATUS_CODE.each do |symbol, status_code|
puts "#{status_code} :#{symbol}"
end
end
end
# Output from `bin/rake doc:status_codes`
@kddnewton
kddnewton / select.rb
Created October 27, 2017 19:19
Better selects for ActiveRecord
class << ActiveRecord::Base
prepend Module.new {
class SelectChain < BasicObject
INVALID_ARGUMENTS =
'.select.not arguments must be a list of one or more symbols'.freeze
def initialize(scope)
@scope = scope
end
@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

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.

# 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.
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
@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|
@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 / 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)