this repo has no description

Compare changes

Choose any two refs to compare.

+2
config.toml
···
for_hire = true
theme_color = "blue"
+
source = "https://tangled.sh/hauleth.dev/blog"
+
logo_text = "~hauleth"
logo_home_link = "/"
+3 -3
content/post/beam-process-memory-usage.md
···
Elixir 1.14.5 (compiled with Erlang/OTP 25)
```
-
> Note no JIT as Nix on macOS currently[^currently] disable it and I didn't bother to enable
-
> it in the derivation (it was disabled because there were some issues, but IIRC
-
> these are resolved now).
+
> Note no JIT as Nix on macOS currently[^currently] disable it and I didn't
+
> bother to enable it in the derivation (it was disabled because there were some
+
> issues, but IIRC these are resolved now).
[^currently]: Nixpkgs rev `bc3ec5ea`
+6 -5
content/post/eli5-ownership.md
···
doesn't matter, but there will be only one owner. You can do whatever you want
with such note but with that power comes, not so great, responsibility: after
you are done with this book you will need to get rid of it. Since you are a law
-
abiding citizen you will recycle the note in the appropriate receptacle, but it is your
-
responsibility to do it. Of course this is not the only way to deal with a note. You
-
can also give it to someone and then it will be hers or his responsibility.
+
abiding citizen you will recycle the note in the appropriate receptacle, but it
+
is your responsibility to do it. Of course this is not the only way to deal with
+
a note. You can also give it to someone and then it will be hers or his
+
responsibility.
To rephrase it in the Rust way, it would look like this:
···
But some notes are even shorter than that. They are so short and easy to clone
that it is much easier to clone them every time, instead of explicitly
-
calling the method. Like when you give your phone number to a hot girl at the
-
bar, the `Copy` trait automatically clones your note so the other has their own copy.
+
calling the method. Like when you give your phone number to a hot girl at the
+
bar, the `Copy` trait automatically clones your note so the other has their own copy.
Again, this is for small types that can be mechanically copied each time when needed.
```rust
+37
content/post/port-love.md
···
+
+++
+
title = "For F**k Interface"
+
date = 2025-11-03
+
+
[taxonomies]
+
tags = [
+
"beam"
+
]
+
+++
+
+
Erlang provides multiple forms of FFI:
+
+
- C Nodes - external applications, that (despite the name) can be implemented in
+
any language, not just C. It communicates with BEAM VM via Distributed Erlang,
+
and for all needs and purposes looks like "regular" Erlang node in cluster
+
(just can be implemented in any language). It provides greatest isolation, as
+
technically these two nodes do not even need to be on the same machine.
+
- Ports - an external program, that is ran by BEAM VM and then communicates
+
via unnamed Unix pipes[^pipes]. It relies on OS for process isolation, which
+
mean that in the isolation level ladder it is placed in the middle.
+
[^pipes]: I do not know what this mechanism is called on Windows, sorry.
+
- NIF (Native Implemented Function) - with that you write dynamic libraries,
+
that are loaded into the same address space as BEAM VM and then you can call
+
functions from this module like "normal" BEAM functions. That gives the best
+
performance out of three, but at the same time it isolates least. Writing well
+
behaving NIF is not easy, as you need to take into consideration the function
+
run time or use dirty scheduler, unhandled runtime errors will cause problems
+
for whole VM, and stuff like that.
+
+
+
Technically there is another FFI option, but that one is legacy:
+
+
- Port Drivers - mostly a legacy stuff, these are modules, that are loaded
+
within the same address space as BEAM VM, but communication between different
+
languages is done like with Ports (just within single memory space). That mean
+
that you have disadvantages of both Ports (indirect communication) and NIFs
+
(system destabilisation in case of error), but without any real benefit.
-1
content/post/vim-for-elixir.md
···
Google to find it). Instead I highly suggest You to dig into your own
configuration and for each line ask yourself:
-
- Do I know what this line **does**?
- Do I really **need** this line?
+2 -2
flake.lock
···
"nixpkgs": {
"locked": {
"lastModified": 0,
-
"narHash": "sha256-cnL5WWn/xkZoyH/03NNUS7QgW5vI7D1i74g48qplCvg=",
-
"path": "/nix/store/h15y13p2w17dhpiyh8pk42v1k4c38a0h-source",
+
"narHash": "sha256-yEJmtoFu4cJre1NuU4fb8q57Oux+NTbocnALtJ64aEI=",
+
"path": "/nix/store/9ja8k3j7nk0xhicz1cvswzl7kjs1rj06-source",
"type": "path"
},
"original": {
+8
flake.nix
···
};
in
{
+
apps.publish = let
+
program = pkgs.writeShellScript "publish" ''
+
cp -r ${self.packages.${system}.blog} public
+
'';
+
in {
+
type = "app";
+
program = "${program}";
+
};
packages = {
inherit blog;
};
+4 -3
sass/_post.scss
···
@import "variables";
.post {
+
position: relative;
width: 100%;
text-align: justify;
-
text-wrap: pretty;
+
text-wrap: stable;
hyphens: auto;
hyphenate-limit-chars: 10;
margin: 20px auto;
···
.footnote-definition {
@media (min-width: #{$tablet-max-width + 1px}) {
position: absolute;
-
left: 105%;
+
right: calc(-12vw - 3em);
-
width: 10vw;
+
width: 12vw;
margin-top: -7rem;
}
+8
static/_headers
···
+
*
+
Permission-Policy: interest-cohort=()
+
X-Frame-Options: DENY
+
X-XSS-Protection: 1; mode=block
+
X-Clacks-Overhead: GNU Terry Pratchet
+
Content-Security-Policy: default-src 'self'; script-src 'self'; connect-src 'self'; img-src 'self'; frame-src 'none'; frame-ancestors 'none'; form-action 'none'; base-uri 'self';
+
Permissions-Policy: accelerometer=(), ambient-light-sensor=(), autoplay=(), battery=(), camera=(), cross-origin-isolated=(), display-capture=(), document-domain=(), encrypted-media=(), execution-while-not-rendered=(), execution-while-out-of-viewport=(), fullscreen=(), geolocation=(), gyroscope=(), keyboard-map=(), magnetometer=(), microphone=(), midi=(), navigation-override=(), payment=(), picture-in-picture=(), publickey-credentials-get=(), screen-wake-lock=(), sync-xhr=(), usb=(), web-share=(), xr-spatial-tracking=(), clipboard-read=(), clipboard-write=(), gamepad=(), speaker-selection=()
+
Referrer-Policy: strict-origin-when-cross-origin
+3
static/_redirects
···
+
/js/script.js https://plausible.io/js/script.js 200
+
/api/event https://plausible.io/api/event 200
+
/.well-known/webfinger https://fosstodon.org/.well-known/webfinger?resource=acct:hauleth@fosstodon.org 200
+9
statichost.yml
···
+
image: ghcr.io/getzola/zola:v0.21.0
+
command: build
+
public: public
+
image_entrypoint: true
+
+
# TODO: Usa nix there
+
# image: ghcr.io/lix-project/lix:latest
+
# command: nix --extra-experimental-features nix-command --extra-experimental-features flakes run .#publish
+
# public: public
+4 -2
templates/index.html
···
public tracking available at <a href="https://plausible.io/hauleth.dev">Plausible.io</a>
</div>
<div class="copyright--source">
-
<a href="https://github.com/hauleth/hauleth">source code</a>
+
<a href="{{ config.extra.source }}">source code</a>
</div>
</div>
{% endblock copyright %}
···
{% block css %}
<link rel="stylesheet" type="text/css" href="/style.css" />
-
<link rel="stylesheet" type="text/css" href="/syntax-theme.css" />
+
{% if page.content and page.content is containing("data-lang") -%}
+
<link rel="stylesheet" type="text/css" href="/syntax-theme.css" />
+
{% endif %}
{% if config.extra.theme_color != "orange" -%}
{% set color = "/color/" ~ config.extra.theme_color ~ ".css" -%}
<link rel="stylesheet" type="text/css" href="{{ color }}" />
+53 -16
templates/shortcodes/cv.md
···
## Experience
-
- Supabase - 2023-2025
-
+ Logflare - logs aggregation service
-
+ Supavisor - a cloud-native, multi-tenant Postgres connection pooler
- Hauleth.dev - Consultant - 2021+
+
+ DockYard/Karambit.ai - 2025
+
* Architectural analysis of Karambit product
+
* Prepared security analysis with detailed report with fixes
+ Eiger - 2022-2023
* Forte.io
-
- Implementation of the Interledger protocol for cross-chain transactions
+
- Implemented Interledger protocol for cross-chain transactions
* Aleo Blockchain
-
- Implementation of the GraphQL API for the on-chain data
-
+ Erlang Solutions/Kloeckner GmbH - 2021 - Consultant for Elixir, Ruby, and SQL (PostgreSQL)
-
* Substantial query performance optimisations by optimising PostgreSQL indices
-
- Remote Inc. - Senior Backend Engineer - 2020-2021
-
- Kobil GmbH - Erlang/Elixir Developer - 2019-2020
-
+ Maintaining MongoDB driver for Elixir
-
+ Implemented transactions for MongoDB driver in Elixir
+
- Implemented GraphQL API for the on-chain data
+
- Created syntax colouring library for Aleo assembly-like language
+
for smart contracts
+
+ Erlang Solutions/Kloeckner GmbH - 2021 - Consultant for Elixir, Ruby,
+
and SQL (PostgreSQL)
+
* Optimised DB query performance by providing PostgreSQL structure
+
analysis and improving indices usage
+
+ Remote Inc. - Senior Backend Engineer - 2020-2021
+
* Architectural analysis of existing codebase
+
+ Kobil GmbH - Erlang/Elixir Developer - 2019-2020
+
* Maintained MongoDB driver for Elixir
+
* Implemented transactions for MongoDB driver in Elixir
+
- Supabase - 2023-2025
+
+ Logflare - logs aggregation service:
+
* Implemented on-the-fly decompression of incoming data that improved
+
ingestion possibilities and reduced transfer usage (created library
+
[`plug_caisson`][] for that purpose)
+
* Implemented DataDog-compatible ingestion endpoint for seamless
+
transition from DataDog provider to Logflare
+
* Improved BigQuery pipeline workflow to reduce congestion on database
+
connections
+
* Added support for AWS Cloud Events metadata extraction
+
* Improved CI usage by splitting different actions to separate steps ran
+
in parallel
+
* Replaced dynamic generation of connection modules for PostgreSQL
+
storage system with Ecto's dynamic repositories to avoid atom exhaustion
+
+ Supavisor - a cloud-native, multi-tenant Postgres connection pooler
+
* Deployment management
+
* Optimised metrics gathering system that resulted in an order of
+
magnitude performance boost
+
* Updated used OTP and Elixir versions from OTP 24 to OTP 27 and Elixir
+
from 1.14 to 1.18
+
* Reduced usage of mocking in tests to improve tests performance and
+
volatility, resulting in reduced CI usage and improved developer
+
experience
+
* Implemented e2e tests against existing Node.js PostgreSQL clients to
+
improve production issues
+
* Implemented multi-region deployment system to provide blue/green
+
deployments
+
* Improved system observability features by making it more resilient and
+
performant
+
* Replaced usage of `ct_slave` with newer `peer` module in OTP
- AppUnite - Full-stack Developer/DevOps - 2016-2019:
+ JaFolders/AlleFolders
* 2x performance improvement by optimising PostgreSQL usage
* Reduced geo-queries using PostGIS thanks to better indices and
-
materialised views usage
-
* Implementation of the UI and brochure viewer in Vue and SVG
+
materialised views usage
+
* Implemented UI and brochure viewer in Vue and SVG
+ OneMedical/Helium Health
* Architectural redesign of application from Rails/MongoDB to
-
Phoenix/PostgreSQL
-
* Preparing hybrid deployment with on-premise/in-cloud system
-
* Migration of the existing deployments from MongoDB to PostgreSQL
+
Phoenix/PostgreSQL
+
* Prepared hybrid deployment with on-premise/in-cloud system
+
* Migrated of the existing deployments from MongoDB to PostgreSQL
- Nukomeet - Full-stack Developer - 2015-2016
- Prograils - Junior Developer - 2013
···
- Viking reenactor
- Keyboard fan
- Sci-fi/Fantasy fan and Poznań's Sci-fi/Fantasy club member
+
+
[`plug_caisson`]: https://github.com/supabase/plug_caisson