Skip to content

Instantly share code, notes, and snippets.

View favila's full-sized avatar

Francis Avila favila

View GitHub Profile
@favila
favila / eid_utils.clj
Last active March 17, 2023 21:15
Utilities to construct or decompose datomic entity ids on on-prem systems using bit arithmetic
(ns favila.eid-utils
"Utilities to construct or decompose entity ids on on-prem systems.
Many of these utilities replicate datomic.api functions because the peer api
lacks them.
The entity id format is:
sign-bit, reserved-bit, 20-partition-bits, 42-t-bits
@favila
favila / compact-datomic-dev.sh
Created July 18, 2022 18:50
Vaccum or compact unused space from an h2 database (especially for datomic)
#!/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}
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 January 14, 2022 17:28
clojure datafy and nav to explore an open-ended state space
(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 September 10, 2021 13:03
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`
(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 February 28, 2020 22:11
merge, but throws on conflicts
(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 August 28, 2019 17:05
shell one-liner to check a datomic client connection
#!/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 05:27
Java map-like that lazily and atomically creates values for keys. Supports global shutdown also.
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 September 27, 2018 22:24
create a clojure-data-structure representation of a pdf document (from pdfbox) just for visibility into the pdf's structure
(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 September 26, 2018 21:20
s/keys+, an s/keys variant that allows inline respec-ing of a key to narrow the range of its type
(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))))