Skip to content

Instantly share code, notes, and snippets.

Avatar

Francis Avila favila

View GitHub Profile
@favila
favila / compact-datomic-dev.sh
Created Jul 18, 2022
Vaccum or compact unused space from an h2 database (especially for datomic)
View compact-datomic-dev.sh
#!/bin/sh
# Uses the h2 jar in a datomic distribution to give raw SQL access
# to the h2 database datomic "dev" storage uses.
# The 'SHUTDOWN COMPACT' command in particular performs all
# vaccum-like compaction of the h2 database file to remove
# unused blocks from deleted (garbage-collected) segments.
DATOMIC_HOME=${DATOMIC:-$HOME/lib/datomic/current}
DATOMIC_ADMIN_PASSWORD=${1:?Storage admin password must be provided}
View SketchSystems.spec
States
# No Signup uuid is known.
# These requests are parameterized by email address.
No Signup*
Create Signup request -> Create Signup Response?
Get Redirect to Google OAuth Signup -> TODO
Create Signup via Google OAuth -> TODO
# A Signup uuid is known. An Incomplete Signup satisfies `find-active-signup-id`
@favila
favila / array_game.clj
Created Jan 14, 2022
clojure datafy and nav to explore an open-ended state space
View array_game.clj
(defn nav-> [x p]
(nav x p (get x p)))
(defn array-game-inc [x k v]
(with-meta
(assoc x k (inc v))
(meta x)))
(defn array-game []
(with-meta
@favila
favila / cljt.clj
Created Sep 10, 2021
A "clj template" macro that lets you embed clj expressions in strings. Expands to (str "literal parts" expression parts ...). Designed to replace typical uses of `format`
View cljt.clj
(def format-spans #"(?x)
(?:( (?: [^\\\{]++ | \\\{ )+ )
|(?:\{ ( (?: [^\\}]*+ | \\} )+ ) }))")
(defmacro cljt [formatstr]
{:pre [(string? formatstr)]}
(if (= formatstr "")
formatstr
`(str ~@(binding [*read-eval* false]
(->> (re-seq format-spans formatstr)
@favila
favila / safe-merge.clj
Created Feb 28, 2020
merge, but throws on conflicts
View safe-merge.clj
(defn safe-merge
"Like merge, but throws if maps have the same keys but different values."
[& maps]
(reduce
(fn [m [m2k m2v :as re]]
(if-some [[_ mv :as le] (find m m2k)]
(if (= mv m2v)
m
(throw (ex-info "Attempted to safe-merge maps with conflicting entries"
@favila
favila / datomic-client-conn-test.sh
Created Aug 28, 2019
shell one-liner to check a datomic client connection
View datomic-client-conn-test.sh
#!/bin/sh
ENDPOINT=localhost:8998 \
ACCESS=accesskey \
SECRET=secret \
ALIAS=alias \
clj -Sdeps '{:deps {com.datomic/client-pro {:mvn/version "0.8.28"}}}' \
-e "(require '[datomic.client.api :as d])" \
-e '(defmacro E [sym] `(System/getenv ~(name sym)))' \
-e '(-> (d/client {:server-type :peer-server
@favila
favila / LazyInitMapValues.java
Created May 25, 2019
Java map-like that lazily and atomically creates values for keys. Supports global shutdown also.
View LazyInitMapValues.java
package breeze.collections;
import java.util.ArrayList;
import java.util.Map;
import java.util.concurrent.Callable;
import java.util.concurrent.CancellationException;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Future;
@favila
favila / pdftree.clj
Created Sep 27, 2018
create a clojure-data-structure representation of a pdf document (from pdfbox) just for visibility into the pdf's structure
View pdftree.clj
(with-open [pdf-document (PDDocument/load (clojure.java.io/file THE-FILE))]
(let [doc (.getDocument pdf-document)
getobj (fn [^COSObject x]
[:pdf.type/object (.getObjectNumber x) (.getGenerationNumber x)])
visit (fn [^COSBase x ^ICOSVisitor vis]
(if (.isDirect x)
(if (instance? COSObject x)
(getobj x)
(.accept x vis))
(cond
@favila
favila / keys_plus.cljc
Created Sep 26, 2018
s/keys+, an s/keys variant that allows inline respec-ing of a key to narrow the range of its type
View keys_plus.cljc
(ns com.breezeehr.specs.keys-plus
"Variants of clojure.spec/keys and keys* that allow additional inline spec-ing."
(:refer-clojure :exclude [keys])
(:require [clojure.core :as c]
[clojure.spec.alpha :as s]
[clojure.spec.gen.alpha :as gen]
[clojure.walk :as walk])
#?(:cljs (:require-macros [com.breezeehr.specs.keys-plus]))
#?(:clj (:import (java.util UUID))))
@favila
favila / last-touched-tx.clj
Created Feb 27, 2018
datomic query to return the tx at which an entity or its components were last touched
View last-touched-tx.clj
(require '[datomic.api :as d])
(defn last-touched-tx
"Return the tx of the oldest assertion on `entity` or any of its components."
[db entity]
(or (d/q '[:find (max ?tx) .
:in $ % ?root
:where
(component-entities ?root ?ce)
(union ?root ?ce ?e)
[?e _ _ ?tx]]