Author of https://xitter.cf/t.co/07NIwlZY84 (Order) https://xitter.cf/t.co/CJs1Dxg7jN (5.5k) https://xitter.cf/t.co/2kmwWcjfa6 (1.8k) https://xitter.cf/t.co/D3vaX83t8e Support: https://xitter.cf/t.co/jpgpYwWjrH

Somewhere Backproping
Joined August 2022
11 tracks. 479+ hands-on tasks. Write a tokenizer, parser, allocator, scheduler, and syscall handler yourself. Read free, pay only to run code. Launch pricing ends 31 Oct: $3/mo or $149 lifetime (normally $299).
2
3
40
2,422
you can malloc 5 bytes, write to the 6th one, and the program can still run like nothing happened. memory bugs often don't crash. they corrupt something quietly and wait. two ways to catch them: • valgrind runs your binary as is and checks every memory access. no recompile, but 10 to 50x slower • asan: build with -fsanitize=address. the compiler adds the checks and tracks memory in a shadow map. about 2 to 3x slower
2
2
30
1,286
Launch pricing for LowLevelCraft ends 31 October. 479+ hands-on tasks: C, assembly, compilers, OS, networking, storage, security. Real code, real tests, in the browser. Lifetime includes Interview Prep. After the 31st, it's list price.
2
2
15
1,227
4 routes in your table can all match 192.168.1.150 at once. 0.0.0.0/0, 192.168.0.0/16, 192.168.1.0/24 and 192.168.1.128/25. linux picks the longest prefix. the /25 matches 25 bits, more than any other, so the packet goes to its gateway 192.168.1.129. the default /0 matches everything, so it only gets what nothing else matched. have you ever checked which route your own traffic takes with ip route get?
1
25
1,339
malloc on linux rarely returns NULL. the kernel overcommits. it hands you address space and only finds real pages when you touch them. so when ram and swap are both full, there's no call left to fail. the OOM killer picks the process with the highest oom_score and kills it. set oom_score_adj to -1000 and it never picks you.
2
4
57
3,735
your password can end up on disk even if you never write it to a file. when ram gets tight, the kernel moves pages nobody touched lately out to swap. it has no idea which bytes are secret. and swap is still on the disk after you shut down. that's why programs holding keys call mlock(). locked pages never get swapped out.
2
2
1
36
1,540
Most devs have never built: • a tokenizer • a memory allocator • a scheduler • a syscall handler LowLevelCraft has 479+ micro-tasks that make you build all of them. In the browser. No setup. C, C++, Rust, Python, ARM asm. The C track is free 👇
2
6
97
3,896
how does the compiler know x = 2 +; is broken before anything runs? it parses your code into a tree. = at the top, x on the left, + on the right, and the two numbers under the +. in 2 +; the + has nothing on its right. the tree can't form, so you get a syntax error. an undeclared x is different. that tree parses fine. it fails later, when the compiler checks names and types.
1
22
1,163
why does a database index use a b-tree and not a binary tree? a binary tree node holds one key. a b-tree node fills a whole disk page, so it holds hundreds. say 500 keys per node. 3 levels already cover 500 x 500 x 500 = 125 million keys. that's 3 page reads to find any row. you can build one yourself, splits and disk persistence included, in the storage track on lowlevelcraft.
2
1
16
1,176
most devs have never built a leader election. it's only a few rules: • the leader sends heartbeats. miss them past a timeout and you assume it's dead • bully: message every node with a higher id. nobody answers, you're the leader • ring: pass ids around the ring. the highest one wins • partitions are the hard part. both sides can pick a leader, so you need a majority to win
1
13
1,154
a python program dropped every object it made, and 15 MiB stayed allocated anyway. the objects pointed at each other. each one still had a refcount of 1, so none of them ever hit 0. one gc.collect() found 200,015 unreachable objects. that's python's cycle detector doing what refcounting can't. new video, part 5: how c, c++, python, java and go each free memory.
2
1
15
1,171