Skip to content

Instantly share code, notes, and snippets.

-module(kvl).
-export([from_list/1]).
from_list(KVs) ->
from_list(KVs, #{}).
from_list([K, V | KVs], Acc) ->
from_list(KVs, Acc#{K => V});
from_list([], Acc) ->
Acc.
@rlipscombe
rlipscombe / Makefile
Created September 14, 2023 13:44
Presentations with Marp, etc.
PRESENTATION := cat-feeder-architecture
all: $(PRESENTATION).html
SVGS = $(patsubst %.d2,%.svg,$(wildcard *.d2))
SVGS += $(patsubst %.mmd,%.svg,$(wildcard *.mmd))
# brew install marp-cli
MARP := marp
%.html: %.md $(SVGS)
@rlipscombe
rlipscombe / list_share.erl
Created August 10, 2023 08:41
Erlang code to share a list between N
% Share a list between N.
share(List, N) when N > 0 ->
L = (length(List) + N - 1) div N,
lists:reverse(share(List, N, L, [])).
share([], _N = 0, _L, Acc) ->
Acc;
share([], N, L, Acc) ->
share([], N - 1, L, [[] | Acc]);
share(List, N, L, Acc) when L =< length(List) ->
@rlipscombe
rlipscombe / x509.erl
Created November 17, 2022 17:40
Generate a certificate signing request in Erlang, EC key.
-module(x509).
-export([
create_private_key/0,
private_key_to_pem/1,
create_request/2,
request_to_pem/1
]).
-include_lib("public_key/include/public_key.hrl").
@rlipscombe
rlipscombe / to_dot.ex
Created August 5, 2021 18:31
Processes to graphviz
def to_dot(pid, path) do
# Starting with the given process, find all of the processes that it's linked to/from, and that it's monitoring/monitored; put them in the dot file.
f = File.open!(path, [:write])
IO.write(f, "digraph G {\n")
IO.write(f, "concentrate=true")
seen = MapSet.new()
to_dot(pid, f, seen)
IO.write(f, "}\n")
@rlipscombe
rlipscombe / rm-duplicate-tracknr.exs
Last active July 20, 2021 08:43
Elixir snippet to find MP3 files with the same track number in their filenames
re = ~r/^.*([0-9][0-9]) .*$/U
files = Path.wildcard("**/*.mp3") |> Enum.filter(&Regex.match?(re, &1))
groups = files |>
Enum.group_by(fn f ->
d = Path.dirname(f)
f = Path.basename(f)
[_, n] = Regex.run(re, f)
{d, n}
end)
-module(assert_timers).
-export([start_trace/0, stop_trace/0]).
-export([no_timers/1, has_timer/1]).
%% @doc use a dbg handler to track active timers; see http://stackoverflow.com/a/4059587/8446
start_trace() ->
ets:new(timer_trace, [public, named_table, bag]),
Fun = fun({'trace', Pid, 'call', {erlang, send_after, [Time, Dest, Msg]}} = _Msg, State) ->
lager:debug("~p erlang:send_after(~p, ~p, ~p)", [Pid, Time, Dest, Msg]),
State;
CoenraadS.bracket-pair-colorizer
vscode-icons-team.vscode-icons
ms-vscode.cpptools
pgourlain.erlang
JakeBecker.elixir-ls
rust-lang.rust
serayuzgur.crates
@rlipscombe
rlipscombe / Rakefile
Last active March 24, 2019 19:03
Transcode FLAC to MP3
require 'find'
VERBOSE = false
mp3_files = []
Find.find('.') do |f|
if File.extname(f) == '.flac'
flac = f
mp3 = "../Music/#{File.dirname(flac)}/#{File.basename(flac, '.flac')}.mp3"
@rlipscombe
rlipscombe / https-server.txt
Last active November 14, 2023 09:09
Ad-hoc HTTPS server
## On the server
# AWS EC2
SERVER_IP=$(curl http://169.254.169.254/latest/meta-data/public-ipv4)
# Digital Ocean
SERVER_IP=$(curl http://169.254.169.254/metadata/v1/interfaces/public/0/ipv4/address)
# Generate a self-signed server certificate
openssl genrsa -out server.key 4096