Skip to content

Instantly share code, notes, and snippets.


Reid Draper reiddraper

Block or report user

Report or block reiddraper

Hide content and notifications from this user.

Learn more about blocking users

Contact Support about this user’s behavior.

Learn more about reporting abuse

Report abuse
View GitHub Profile

Keybase proof

I hereby claim:

  • I am reiddraper on github.
  • I am reiddraper ( on keybase.
  • I have a public key ASCTgRUWMsnLUEBwyA44G_kTvXoTxwmpb2DIRVET0WxXYwo

To claim this, I am signing this object:

View gist:ccd2b169430b87454ac9c1ed48b667b7
terraform plan -var-file terraform.tfvars -out terraform.tfplan
Refreshing Terraform state in-memory prior to plan...
The refreshed state will be used to calculate this plan, but
will not be persisted to local or remote state storage. Refreshing state... (ID: vol-1291439a)
aws_ebs_volume.pg6_sdh: Refreshing state... (ID: vol-33cb1587)
aws_ebs_volume.pg7_sdf: Refreshing state... (ID: vol-3b9f4db3)
aws_eip.nat-2a: Refreshing state... (ID: eipalloc-cb74a9ac) Refreshing state... (ID: vol-65a266e6)
View gist:c42b8d248e7fc470fa61
Here's an explanation from 30k ft. of the generator namespace. There are three monads
involved, one of which simply contains the other two (but is not a monad transformer). They're
not named explicitly like this in the module, but let's call them: RoseTree, Generator and Gen.
Gen is the monad that is a wrapper around Gen (RoseTree a), to use Haskell types. A RoseTree
is simply an n-ary. In Haskell, it'd be defined like:
data RoseTree a = RoseTree a [RoseTree a]
In Clojure I represent it as a two-element vector, the first element being the node's value,
and the second being a lazy-sequence of the children. Since we use a lazy-seq, we can
View gist:57c0a01f47eed326c8ba
make[1]: *** [libraries/Cabal/Cabal/dist-boot/] Segmentation fault (core dumped)
make[1]: *** Waiting for unfinished jobs....
make[1]: *** [utils/hsc2hs/dist/] Segmentation fault (core dumped)
make: *** [all] Error 2
make -j8 131.49s user 2.92s system 99% cpu 2:15.43 total
View talk.markdown

Debugging Erlang Applications In Real Time

Reid Draper @reiddraper

We'll be using a tool called redbug, which is an abstraction and safety layer of Erlang's built-in dbg tracing facilities. You can follow along at home:

View gist:7914186
select(2, [0 1], NULL, NULL, {900, 0}) = 1 (in [0], left {899, 949910})
wait4(1401, 0x7fffe90edd0c, WNOHANG, NULL) = 0
read(0, "10:53:10.322 [error] Supervisor "..., 8192) = 438
lseek(2, 0, SEEK_END) = 90736
write(2, "10:53:10.322 [error] Supervisor "..., 438) = 438
select(2, [0 1], NULL, NULL, {900, 0}) = 1 (in [0], left {899, 958221})
wait4(1401, 0x7fffe90edd0c, WNOHANG, NULL) = 0
read(0, "10:53:14.135 [error] Supervisor "..., 8192) = 461
lseek(2, 0, SEEK_END)
dd if=/dev/zero of=/tmp/output bs=25k count=1k
for i in {1..10}; do time curl -X PUT localhost:8098/riak/foo/a --data-binary @/tmp/output > foo; done
View gist:7775233
12:50:24 <{mochiweb_acceptor,init,3}> {riak_client,new,2}
12:50:24 <{mochiweb_acceptor,init,3}> {riak_client,instance,2}
12:50:24 <{mochiweb_acceptor,init,3}> {riak_client,get,4}
12:50:24 <{mochiweb_acceptor,init,3}> {riak_client,mk_reqid,1}
12:50:24 <{mochiweb_acceptor,init,3}> {riak_client,recv_timeout,2}
reiddraper / sort-idempotent.clj
Created Oct 23, 2013
Uses simple-check to test that sorting is idempotent.
View sort-idempotent.clj
(require '[simple-check.core :as sc])
(require '[simple-check.generators :as gen])
(require '[ :as prop])
(def sort-idempotent-prop
(prop/for-all [v (gen/vector gen/int)]
(= (sort v) (sort (sort v)))))
(sc/quick-check 100 sort-idempotent-prop)
;; => {:result true, :num-tests 100, :seed 1382488326530}
View default_props.json
"props": {
"allow_mult": true,
"basic_quorum": false,
"big_vclock": 50,
"chash_keyfun": {
"fun": "chash_std_keyfun",
"mod": "riak_core_util"
"dw": "quorum",
You can’t perform that action at this time.