Wizard Zines - Comics on wizard zines
diverged remote branches
the diff algorithm
the staging area
reset
the reflog
meet the remote
lost commits
inside the commit
less
terminal redirects
meet the shell
job control
redirects
meet the terminal emulator
colours in the terminal
the mouse
TERM
editing text in a REPL
keyboard shortcuts
meet the TTY driver
stty
canonical mode
copy and paste in the terminal
every core unix program I use
filename tips (in the shell)
line editing
meet the program
more filename tips (in the shell)
PATH and finding programs
PATH tips
quitting in the terminal
shell history
stdin, stdout, stderr
terminal escape codes
the terminal: cast of characters
types of terminal programs
what's HTTP?
oh shit! I committed something to main that should have been on a brand new branch!
folder gotchas
git add -p
git worktree
interactive rebase
merge conflict tips
submodules
learning on my own
knowing where you are in git
git references
scenes from distributed systems
the floating point number line
git cheat sheet
your domain's authoritative nameservers
strace command line flags I love
some people who make programming easier
PATH
32 bits is small
8 bytes, many meanings
ASCII
bases
big integers
bit flags
bitwise operations
bytes
fixed point
floating point alternatives
floating point is weird
floating point math
floating point representation
floating point: the bits
hexadecimal
how bitwise operations are used
how floats are printed
integer overflow
integers
little vs big endian
meet the byte
NaN and infinity
science <3 floating point
signed vs unsigned integers
the gaps between floats
a debugging manifesto
add a comment
add lots of print statements
add pretty printing
amazing debugging features
analyze the logs
ask lots of questions
brainstorm some suspects
colours, graphs, and sounds
comment out code
debug by writing a test
debugging is hard. take breaks.
debugging tip: ask lots of questions
debugging tip: build your mental model
debugging tip: change one thing at a time
debugging tip: code one thing at a time
debugging tip: get specific about what the bug is
debugging tip: more assumptions to check
debugging tip: slow down
debugging tip: track what you changed
debugging tip: you've probably seen this bug before
debugging tips: check your assumptions
delete the buggy code
do a victory lap
do the annoying thing
document your quest
draw a diagram
explain the bug out loud
find a new source of info
find a version that works
find related bugs
find the type of bug
guesses are often wrong
how to handle intermittent bugs
how to read an error message
identify one small question
if you understand a bug, you can fix it
inspect unreproducible bugs
investigate the bug together
jump into a REPL
keep a log book
know your spy tools
learn one small thing
learn one thing at a time
let your bugs teach you
list what you've learned
look at recent changes
make a minimal reproduction
make sure your code is running
make your code easy to debug
one thing at a time
preserve the crime scene
read the docs
read the error message
read the library's code
reduce randomness
reproduce the bug
reread the error message
retrace the code's steps
rule things out
share your debugging stories
shorten your feedback loop
sprinkle assertions everywhere
take a break
tell a friend what you learned
tidy up your code
timebox your investigation
track your progress
try out a new tool
types of debugging tools
understand the bug before trying to fix it
understand your error messages
use a debugger
when debugging, your attitude matters
why some bugs feel "impossible"
write a failing test
write a message asking for help
write a tiny program
writing code with bugs is normal
A & AAAA records
a tiny DNS resolver
authoritative nameservers
CNAME records
dig command line arguments
DNS records
DNS: cast of characters
everything in a DNS packet
getaddrinfo
let's meet dig
life of a DNS query
MX records
negative caching
NS records
resolvers can lie
resolvers vs authoritative nameservers
search domains
subdomains
TCP DNS
the DNS hierarchy
the root nameservers
TXT records & more
why DNS updates are slow: caching
DNS cache levels
things that can break your DNS
SPF & DKIM records
DNS is distributed
how airports lie to you with DNS
glue records
how to read dig output
DNS queries aren't harmless
DNS queries
DNS record types
receiving email at your domain
why we need DNS
the 4 types of DNS servers
top-level domains
picking a domain registrar
domain privacy
why updating DNS is slow
background processes
bash brackets cheat sheet
bash builtins
bash debugging
bash errors
bash for loops
bash functions
bash globs
bash if statements
bash input
bash parameter expansion
bash pipes
bash quotes
bash redirects
bash variables
environment variables
non-POSIX features
POSIX compatibility
shell script arguments
shellcheck
subshells
trap
why I love bash
browser default stylesheets
centering in CSS
CSS backwards compatibility
CSS borders
CSS grid areas
CSS isn't arbitrary
CSS isn't design
CSS isn't easy
CSS selectors
css specifications
CSS specificity
CSS testing checklist
CSS transitions
CSS units
CSS variables
flexbox basics
hiding elements with CSS
inline vs block
media queries
padding syntax
position: absolute
stacking contexts
the box model
the CSS inspector
async functions
highlight the main ideas
write for one person
hash functions
binary search
capabilities
cgroups
container configuration options
container IP addresses
container kernel features
container networking
container registries
containers = processes
containers aren't magic
containers: the big idea: include EVERY dependency
how to make a namespace
layers
layers (containers)
namespaces
network namespaces
overlay filesystems
PID namespaces
pivot-root
seccomp-bpf
user namespaces
why containers?
take on hard projects
CASE
COALESCE
EXPLAIN
EXPLAIN your slow queries
getting started with SELECT
GROUP BY
HAVING
how indexes make your queries fast
INNER JOIN and LEFT JOIN
my rules for simple JOINs
NULL surprises
NULL: unknown or missing
ORDER BY and LIMIT
OVER() assigns every row a window
questions to ask about your data
SELECT
SELECT queries start with FROM
single quote your strings
SQL example: get the time between baby feedings
SQL example: LEFT JOIN + GROUP BY
SQL: ways to count
subqueries
ways to count rows
WHERE
window functions
network protocols
clock_gettime
what's a shell?
libc
terminals
assembly
CPU scheduling
IMSI catchers (fake cellphone towers)
terminal escape codes let you change colour
file locking
command line arguments
inodes
kubernetes components
scenes from kubernetes
writing tip: ask good questions
writing tip: say something surprising
opening a file
anatomy of a http request
anatomy of a HTTP response
content delivery networks
cookies
CORS
how URLs work
HTTP caching headers
HTTP exercises
HTTP redirects
HTTP request methods 1
HTTP request methods 2
HTTP response headers
HTTP security headers
http status codes
HTTP/2
HTTPS
the most important HTTP request headers
the same-origin policy
TLS certificates
using HTTP APIs
what's a header?
why the same origin policy matters
why the same-origin policy matters
how I got better at debugging
the OOM killer
segmentation faults
how kubernetes can break - etcd
BPF cheat sheet
conntrack
curl
dig
ethtool
every Linux networking tool I know
ip
iptables
miscellaneous networking tools
mitmproxy
netcat
ngrep
nmap
openssl
ping
socat
ss
ssh
tc
TCP: how to reliably get a cat
tcpdump
tshark
a branch is a pointer to a commit
a SHA always refers to the same code
branches have no rules
combining branches
combining diverged branches
detached HEAD state
diverged branches
every commit has a parent
every git command I use
every git jargon
fixing diverged remotes
git branches: the rules
git discussion bingo
git mistakes you can't fix
HEAD and heads
HEAD is the commit you have checked out
inside .git
let's explore a commit
losing your work
meet the branch
meet the commit
meet the merge
merge commits
oh shit! I accidentally committed to the wrong branch!
oh shit! I committed a file that should be ignored!
oh shit! I committed but I want to make one small change!
oh shit! I did something terribly wrong, does git have a magic time machine?
oh shit! I have a merge conflict!
oh shit! I need to change the message on my last commit!
oh shit! I started rebasing and now I have 1000000 conflicts to fix!
oh shit! I tried to run a diff but nothing happened!
oh shit! I want to split my commit into 2 commits!
oh shit! I want to undo something from 5 commits ago!
orphan commits
remote branch caching
rules for rebasing
the current branch: HEAD
what's a branch?
ask for specific feedback
build the support system you need
figure out what your manager is great at
getting a new manager
how to work well with your manager
keep conversations mostly constructive
on emotional labour
on surviving performance reviews
remember your manager's only human
set clear expectations
talk about problems early
understand your manager's goals
what to talk about in 1:1s
what's your manager's job?
work with your manager to get promoted
awk
bash tricks
cat
du & df
find
grep
head & tail
kill
less
lsof
misc commands
more bash tricks
ps
sed
sort & uniq
tar
top
xargs
/proc
copy on write
file buffering
file descriptors
floating point
man page sections
memory allocation
mmap
page faults
permissions
pipes
processes
shared libraries
signals
sockets
system calls
threads
unix domain sockets
virtual memory
building confidence in kubernetes
asking good questions
asking good questions (part 2)
invest in understanding
it's not too late to start learning
learning at work
let's build expertise!
love your bugs
scenes from design docs
tips for reading code
ways to build expertise
learning to design software
what's slow on a computer
vim sessions
getting started with ftrace
read the source code
linux tracing systems
directories and symlinks
how does dns work
blogging principles
computers are fast
the filesystem cache
acid
the cap theorem
bash tips
bpf filters
rr
man pages are awesome
mutexes
network address translation
networking concepts
anatomy of a packet
how to talk to your operating system
no feigning surprise
the stack
what does an operating system do?
having productive conversations when i disagree
page table
tcp
ways i want my team to be
the senior engineer
user space vs kernel space
2fa
inter-process communication
what's a mac address?
ipv6
directories and symlinks
how to give good feedback
how to be a wizard programmer