Skip to content

Instantly share code, notes, and snippets.

View cr0t's full-sized avatar
🏠
Working from home

Sergey ⚗️ Kuznetsov cr0t

🏠
Working from home
View GitHub Profile
@cr0t
cr0t / application.ex
Last active July 22, 2023 20:35
Clusty: Auto-clustering Elixir micro-application (a demo of `libcluster` and `:pg`)
defmodule Clusty.Application do
use Application
@topologies local_epmd: [strategy: Cluster.Strategy.LocalEpmd]
@impl true
def start(_type, _args) do
children = [
{Cluster.Supervisor, [@topologies, [name: ClusterSupervisor]]},
Pidgy
@cr0t
cr0t / take_while_vs_exception.exs
Created June 19, 2023 16:50
An Elixir benchmark idea of which born during discussion with one of my mentees on Exercism.io
Mix.install([:benchee])
defmodule Proteins do
@stop "STOP"
@err_msg "invalid codon"
@codons %{
"UGU" => "Cysteine",
"UGG" => "Tryptophan",
"UUU" => "Phenylalanine",
@cr0t
cr0t / elixir.yml
Created November 29, 2022 09:42
GitHub Actions Elixir Workflow Example
name: Elixir CI
on:
push:
branches: ["master"]
pull_request:
branches: ["master"]
env:
MIX_ENV: test
@cr0t
cr0t / bench_async_vs_map.exs
Last active November 21, 2022 13:55
Performance comparison between simple `Enum.map` and `Task.async_stream` in Elixir (oversimplified case)
Mix.install([
{:benchee, "~> 1.0"}
])
defmodule Cruncher do
def async(n) do
1..n
|> Task.async_stream(&(&1 ** 2))
|> Enum.reduce(0, fn {:ok, s}, acc -> s + acc end)
end
@cr0t
cr0t / cond_vs_pattern.exs
Created November 15, 2022 22:30
Performance comparison between `cond` and multiple-clauses functions in Elixir
Mix.install([
{:benchee, "~> 1.0"}
])
defmodule BirdCond do
def busy_days(list) do
cond do
list == [] -> 0
hd(list) < 5 -> busy_days(tl(list))
true -> 1 + busy_days(tl(list))
# Origin: https://blog.sequin.io/how-we-used-elixirs-observer-to-hunt-down-bottlenecks/
defmodule Overload do
# Define a CPU-intenstive work function, which can call itself
# recursively (forever)
def recursive do
:public_key.generate_key({:rsa, 4096, 65537})
recursive()
end
end
@cr0t
cr0t / uni.erl
Created July 27, 2022 16:10
Universal Server ("My favorite Erlang Program")
% Read more:
% - https://joearms.github.io/published/2013-11-21-My-favorite-erlang-program.html
% - https://ferd.ca/my-favorite-erlang-container.html
%
% How to run:
% $ erl
% > c(uni).
% {ok,uni}
% > uni:test().
% 30414093201713378043612608166064768844377641568960512000000000000
@cr0t
cr0t / vega_kino_tesla_examples.md
Last active December 3, 2023 10:17
Example of using Tesla, VegaLite, and Kino libraries in Elixir's Livebook
@cr0t
cr0t / sensor_hub_i2c.ex
Last active May 23, 2023 15:20
Raspberry Pi, DockerPi SensorHub, I2C, Circuits.I2C, Elixir
defmodule Reader do
defmodule SensorHub do
@moduledoc """
Opens the first I2C bus ("i2c-1") and reads from SensorHub device address (0x17).
Updates its internal state periodically (every second in the example below).
Below you can find a table of registers, that we found on their website:
https://wiki.52pi.com/index.php/DockerPi_Sensor_Hub_Development_Board_SKU:_EP-0106
`sudo purge`
memory_by_process = Hash.new(0)
processes = `ps aux`
m_bytes = processes.split("\n").reduce(0) { |memo, prc|
fields = prc.split(/\s+/)
mem_bytes = fields[5].to_i
prc_name = fields[10...fields.length].join(' ')