data visualization pitchfalls

Series: blog

I quite liked the “opinionated essay about good and bad practices in data visualization” friends don’t let friends from Chenxin Li. UX for data communication.

digital logic

Series: blog

If you want to refresh your electronics and technical informatics knowledge, the Digital Logic Notes might be interesting. The basics you should be aware of, before touching Verilog for your toy project.

expenses of Signal in 2023

Series: blog

From time to time I like to run the numbers. Getting a feeling how expensive it is to provide some infrastructure. The Privacy is Priceless, but Signal is Expensive blog post provides quite some details. Probably easier to get the semantics than from just the balance sheet. Bonus: the linked Twilio documentation about fraud by SMS pumping

aspell and markdown

Series: [blog]

I mistype all the time. So it was time to catch at least the most obvious ones with aspell. (I know it is apparently no longer under active development, unlike hunspell. But it worked better with my typos. My test corpus was this blog as of today.) For this blog (written in markdown) it was the one liner for i in $(ls *.md); do aspell check --mode=markdown --lang=en $i ; done

emoji and grapheme clusters

Series: [blog]

Niki wrote Emoji under the hood, where he explains how emoji work. the intro to Unicode and the encoding UTF-8 / UTF-16. how representation works for emoji fonts when glyphs are bitmaps and not vector shapes the unexpected results of font fallbacks the VARIATION SELECTOR-16 U+FE0F to point for the right font when a codepoint is implemented in multiple fonts that you should never ever try to string split grapheme clusters same holds for U+200D, the ZERO-WIDTH JOINER (ZWJ) which is used to compose emoji flags are two-letter ligatures Or: you should always use the ICU library for string operations.

layerform

Series: [blog]

For writing infrastructure as code, Terraform is a quite useful tool. Especially if you want to abstract different providers and orchestrate. But what if you want to create stages on demand? All while still operating in GitOps mode. layerform (currently under GPLv3) is a tool, which aims to allow each engineer to provision their own “staging” environment. Adding layers in the .tfstate of Terraform, a bit alike handling state files as layers of an OCI image and being able to do branching.
I just went through Liz Fong-Jones’s (@lizthegrey) slides about Modern Platform Engineering from goto Copenhagen. She is naming nine patterns of generative teams reproducible deploys - if it’s not in git, it isn’t base images + tooling + gitOps fast CI/CD measure your pipeline + divide and conquer observability - socio-technical ability expect unexpected failure modes make it easy to form hypotheses and validate them on any stage include your known issues using feature flagging - controlling the blast radius Do you really want to roll your own crypto flagging system?
Have you ever wondered, why your IDE asks you, if you “trust” the code you checked out via git? While the risks of embedded bare repositories is well described (more details here), I suspect that it will stay exploitable for quite some time. There is an opt-in mitigation in setting safe.bareRepository to explicit with git 2.38.0. Also a proof of concept is available. Just don’t forget the even more obvious risk with .

Donut in C

Series: blog

Andy Sloane has written a nice explanation how to write the donut.c without the math library. In short he does it by using a fixed rotation matrix for each iteration step with normalization between. i,j,k,x,y,o,N; main(){float z[1760],a #define R(t,x,y) f=x;x-=t*y\ ;y+=t*f;f=(3-x*x-y*y)/2;x*=f;y*=f; =0,e=1,c=1,d=0,f,g,h,G,H,A,t,D;char b[1760];for(;;){memset(b,32,1760);g=0, h=1;memset(z,0,7040);for(j=0;j<90;j++){ G=0,H=1;for(i=0;i<314;i++){A=h+2,D=1/(G* A*a+g*e+5);t=G*A *e-g*a;x=40+30*D *(H*A*d-t*c);y= 12+15*D*(H*A*c+ t*d);o=x+80*y;N =8*((g*a-G*h*e) *d-G*h*a-g*e-H*h *c);if(22>y&&y> 0&&x>0&&80>x&&D>z[o]){z[o]=D;b[o]=(N>0 ?N:0)[".,-~:;=!*#$@"];}R(.02,H,G);}R( .07,h,g);}for(k=0;1761>k;k++)putchar (k%80?b[k]:10);R(.04,e,a);R(.02,d, c);usleep(15000);printf('\n'+( " donut.c! \x1b[23A"));}} /*no math lib needed .@a1k0n 2021.*/ I strongly suggest to also check out the original donut.

introduction-to-golang

Series: blog

I collected a few resources I would have enjoyed when starting with go. So just another curated list of GoLang 101: the Go Tour by Manfred Dreese and Andreas Grohmann they reference the official Tour of Go quite some times the play with go series the official GoLang learning journeys if you have some coding experience: Go by example helped me a lot to get of the ground. This was my point of entry.