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 / 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))
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
@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]))
@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 / 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 / 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 / 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 / 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 / break_coins_core_logic.clj
Created March 28, 2019 01:55
break-coins-with-core-logic.clj
(ns my-coins-project.core
(:require [clojure.core.logic :as l]
[clojure.core.logic.fd :as fd]))
(def ^:private coins
{:penny 1, :nickel 5, :dime 10, :quarter 25})
(defn- fd-sum
"Like fd/+ but for more than 2 lvars."
[[lv1 lv2 & more] total]
@camsaul
camsaul / joins.clj
Last active May 9, 2019 21:06
MBQL join syntax
(def JoinStrategy
"Strategy that should be used to perform the equivalent of a SQL `JOIN` against another table or a nested query.
These correspond 1:1 to features of the same name in driver features lists; e.g. you should check that the current
driver supports `:outer-join` before generating a Join clause using that strategy."
(s/enum :left-join :right-join :inner-join :outer-join))
(def Join
"Perform the equivalent of a SQL `JOIN` with another Table or nested `:source-query`. JOINs are either explicitly
specified in the incoming query, or implicitly generated when one uses a `:fk->` clause.