Skip to content

Instantly share code, notes, and snippets.

View camsaul's full-sized avatar
💭
I am Cam

Cam Saul camsaul

💭
I am Cam
View GitHub Profile
@camsaul
camsaul / break_coins.clj
Created March 28, 2019 01:54
break-coins.clj
(ns my-coins-project.core)
;; Return all the different ways you can make change for a given amount of cents.
;; Basic idea is to start with number of pennies and then successively apply `apply-coin` for each coin in order from
;; largest to smallest. `apply-coin` will take a lazy seq of existing combinations and return a new lazy seq that includes
;; a new combination with each possible quantity of the coin in question for each existing combination.
;;
;; (apply-coin [:quarter 25] [{:penny 60}])
;; ;; -> [{:quarter 0, :penny 60}, {:quarter 1, :penny 35}, {:quarter 2, :penny 10}]
;;
@camsaul
camsaul / server.clj
Last active March 7, 2019 03:00
Test server & client for doing things like benchmarking Clojure HTTP servers or various endpoints. Tweak as needed
(ns metabase.server
(:require [ring.adapter.jetty :as ring-jetty])
(:import org.eclipse.jetty.server.Server
org.eclipse.jetty.server.handler.AbstractHandler))
(defn- ^AbstractHandler async-default [handler]
(#'ring-jetty/async-proxy-handler handler 0))
(defn- create-server
^Server [handler options]
@camsaul
camsaul / changelog_to_sql.clj
Created February 20, 2019 01:25
Get the SQL for a Liquibase changeset
(defn changeset->sql [^Liquibase liquibase, ^String changelog-file, ^String author, ^String id]
(let [database (.getDatabase liquibase)
sql-generator-factory (liquibase.sqlgenerator.SqlGeneratorFactory/getInstance)]
(for [change (-> liquibase
.getDatabaseChangeLog
(.getChangeSet changelog-file author id)
.getChanges)
statement (.generateStatements change database)
sql (.generateSql sql-generator-factory statement database)]
(.toSql sql))))
@camsaul
camsaul / loc.sh
Created May 24, 2018 01:02
How many LOC??
#! /usr/bin/env bash
find -E frontend src test -type f -regex '^.*(js|jsx|clj|css)$' -exec cat {} \; | sed '/^\s*$/d' | wc -l
@camsaul
camsaul / pom.md
Created May 16, 2018 22:00
Making a fake Maven repo to serve a JAR

Generate the POM file:

mvn install:install-file \ 
  -Dfile=RedshiftJDBC42-no-awssdk-1.2.12.1017.jar \
  -DgroupId=com.amazon.redshift -DartifactId=redshift-jdbc42-no-awssdk \
  -Dpackaging=jar \
  -Dversion=1.2.12.1017 \
  -DgeneratePom=true
@camsaul
camsaul / addr.clj
Created April 19, 2018 01:11
Generating real fake addresses
(ns addr
(:require [cheshire.core :as json]
[clj-http.client :as http]
[clojure.java
[io :as io]
[jdbc :as jdbc]]
[clojure.pprint :as pprint]
[metabase.db :as mdb]
[metabase.util.schema :as su]
[schema.core :as s]))
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
@camsaul
camsaul / log_requires.clj
Last active March 31, 2021 23:43
Log Clojure requires
(def ^:private ^:dynamic *require-chain* nil)
(defonce new-require
(let [orig-require (var-get #'clojure.core/require)]
(orig-require 'clojure.pprint)
(fn [& args]
(binding [*require-chain* (conj (vec *require-chain*) (ns-name *ns*))]
(let [require-chain-description (apply str (interpose " -> " *require-chain*))]
(println "\nin" require-chain-description)
((resolve 'clojure.pprint/pprint) (cons 'require args))
@camsaul
camsaul / external_ip.sh
Created October 17, 2017 01:01
Get your external IP address
#!/bin/bash
curl ifconfig.me
@camsaul
camsaul / toucan.txt
Last active October 13, 2017 02:10
ASCII Art Toucan
llccc::;,,''.....''''',,,,,,,,,,,,,,,,;;;,;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::::::::::::::::::
ccccccc::;;,''...'''''',,,,,,,,,,,,,,,,,,,,,;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::::::::::::::::::
;::cccccc:::;;,''''''''',,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::::::::::::::
',,;::cccccc:::;;,,'''''',,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::::::::::::::
..'',,;::::ccc::::;;,,'''',,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,;;;;;;;;;;;;:::::::::::::;;;;;;;::::::::::::::::
....''',,;;::::::::;;;,,,,,,,,,,,,,,,,,,,,,,,,'',,,'''',,,,;;;;:::::::::::;;;;;;;;;;;;;;;:::::::::::::::::::::::::::::::
'''''''''',,;;::::;;;;,,,,,,,,,,,,,,,,,,,,'''',,;cloodxxkkkkkkkkkkkkkkkxxxxdool:,'........''',,;;:::::::::::::::::::::::
''''''''''''',,;;;;;;,,,,,,,,,,,,,,,,,,,;clodkO0KKXK0OkxdddooooooooooooookKXKK00Okxoc;'..........',;::::::::::::::::::::
'''''''''''''''',,,,,,,,,,,,,,,,,,:codxO0KXXXXK0Okdollll