Julia Evans

Category: posts

Entering text in the terminal is complicated
Reasons to use your shell's job control
New zine: How Git Works!
Notes on git's error messages
Making crochet cacti
Some Git poll results
The "current branch" in git
How HEAD works in git
Popular git config options
Dealing with diverged git branches
Inside .git
Do we think of git commits as diffs, snapshots, and/or histories?
Some notes on NixOS
2023: Year in review
Mounting git commits as folders with NFS
git branches: intuition & reality
Some notes on nix flakes
How git cherry-pick and revert use 3-way merge
git rebase: what can go wrong?
Confusing git terminology
Some miscellaneous git facts
New talk: Making Hard Things Easy
In a git repository, where do your files live?
Notes on using a single-person Mastodon server
What helps people get comfortable on the command line?
Some tactics for writing in public
Behind "Hello World" on Linux
Why is DNS still hard to learn?
Lima: a nice way to run Linux VMs on Mac
Open sourcing the nginx playground
New zine: How Integers and Floats Work
Some blogging myths
New playground: memory spy
Introducing "Implement DNS in a Weekend"
New talk: Learning DNS in 10 years
New playground: integer.exposed
A list of programming playgrounds
Building a custom site for zine feedback
Some possible reasons for 8-bit bytes
How do Nix builds work?
Some notes on using nix
Writing Javascript without a build system
Print copies of The Pocket Guide to Debugging have arrived
Why does 0.1 + 0.2 = 0.30000000000000004?
Examples of problems with integers
Examples of floating point problems
Some business graphs for 2022
New zine: The Pocket Guide to Debugging
A debugging manifesto
Tips for analyzing logs
A couple of Rust error messages
Making a DNS query in Ruby from scratch
Why do domain names sometimes end with a dot?
How to send raw network packets in Python with tun/tap
Some ways to get better at debugging
A toy remote login server
What happens when you press a key in your terminal?
Monitoring tiny web services
Notes on running containers with bubblewrap
sqlite-utils: a nice way to import data into SQLite for analysis
Pages that didn't make it into "How DNS Works"
New zine: How DNS Works!
A list of new(ish) command line tools
Implementing a toy version of TLS 1.3
Celebrate tiny learning milestones
How to use undocumented web APIs
Some tiny personal programs I've written
Some things about getaddrinfo that surprised me
Things that used to be hard and are now easy
The multiple meanings of "nameserver" and "DNS resolver"
A toy DNS resolver
Reasons for servers to support IPv6
Hosting my static sites with nginx
Some ways DNS can break
How to find a domain's authoritative nameservers
Why might you run your own DNS server?
2021: Year in review
New tool: Mess with DNS!
DNS "propagation" is actually caches expiring
How to use dig
Debugging a weird 'file not found' error
Some notes on using esbuild
How do you tell if a problem is caused by DNS?
How to get useful answers to your questions
Tools to explore BGP
All my zines are now available in print!
New tool: an nginx playground
Teaching by filling in knowledge gaps
Debugging by starting a REPL at a breakpoint is fun
Quadratic algorithms are slow (and hashmaps are fast)
Patterns in confusing explanations
Write good examples by starting with real code
Reasons why bugs might feel "impossible"
You can now buy print version of my zines!
Blog about what you've struggled with
How to look at the stack with gdb
The OSI model doesn't map well to TCP/IP
I put all of my comics online!
Notes on building debugging puzzles
What problems do people solve with strace?
A tool to spy on your DNS queries: dnspeep
Get better at programming by learning how things work
Things your manager might not know
A little tool to make DNS queries
Day 57: Trying to set up GitHub Actions
Day 56: A little WebAssembly
Day 53: a little nginx, IPv6, and wireguard
Day 52: testing how many Firecracker VMs I can run
Day 51: Fixed my logging and made a couple of puzzles
Day 50: Building some tarballs for puzzles, and trying to make a kernel boot faster
Day 49: making the VMs boot faster
Day 48: Another Go program, and a little vim configuration
Day 47: Using device mapper to manage Firecracker images
Day 46: debugging an iptables problem
Firecracker: start a VM in less than a second
Day 44: Building my VMs with Docker
Day 43: Building VM images
Day 42: Writing a Go program to manage Firecracker VMs
Day 41: Trying to understand what a bridge is
Day 40: screen flickering & a talk about containers
Day 39: Customizing gotty's terminal
Day 38: Modifying gotty to serve many different terminal applications at once
Day 37: A new laptop and a little Vue
Server-sent events: a simple way to stream events from a server
Day 35: Launching my VMs more reliably
Daily blog posts about my time at RC
Day 34: Learning about qemu
Day 33: pairing is magic and beautiful git diffs
Day 32: A Rails model that doesn't use the database with ActiveHash
Docker Compose: a nice way to set up a dev environment
2020: Year in review
Day 24: a short talk about blogging myths, and a debugging tip
Day 23: a little Rails testing
Day 22: getting OAuth to work in Rails
Day 21: wrangling systemd & setting up git deploys to a VM
Day 19: Clustering faces (poorly) using an autoencoder
How I write useful programming comics
Day 20: trying to figure out how Google Cloud IAM works
Day 18: an answer to an autoencoder question
Day 17: trying to wrap my head around autoencoders
An attempt at implementing char-rnn with PyTorch
Day 13: BPTT, and debugging why a model isn't training is hard
Day 11: learning about learning rates
New zine: Hell Yes! CSS!
Day 10: Training an RNN to count to three
Day 9: Generating a lot of nonsense with an RNN
Day 8: Start with something that works
Day 5: drawing lots of faces with sketch-rnn
How do you write simple explanations without sounding condescending?
Day 3: an infinitely tall fridge
Day 2: Rails associations & dragging divs around
Day 1: a confusing Rails error message
A new way I'm getting feedback on my zines: beta readers!
I'm doing another Recurse Center batch!
A few things I've learned about email marketing
ninja: a simple way to do builds
Wizard Zines' first print run: Help! I have a Manager!
Implementing 'focus and reply' for Fastmail with JMAP
Some possible future zines
Some more CSS comics
An attempt to make a font look more handwritten
Some CSS comics
When your coworker does great work, tell their manager
scanimage: scan from the command line!
Twitter summary from 2020 so far
saturday comics: a weekly mailing list of programming comics
Tell candidates what to expect from your job interviews
entr: rerun your build when files change
A little bit of plain Javascript can do a lot
What happens when you update your DNS?
Questions to help people decide what to learn
Metaphors in man pages
Why strace doesn't work in Docker
New zine: How Containers Work!
When debugging, your attitude matters
Getting started with shaders: signed distance functions!
Questions you can ask about compensation
New zine: Become a SELECT Star!
PaperWM: tiled window management for GNOME
2019: Year in review
"server" is hard to define
How tracking pixels work
Challenge: find Twitter memes with suffix arrays
Solutions to the tiny window manager challenge
Challenge: Write a bouncy window manager
What makes a programming exercise good?
How containers work: overlayfs
Some notes on vector drawing apps
Some research on shipping print zines
SQLite is really easy to compile
Your Linux Toolbox: a box set of my free zines
SQL queries don't start with SELECT
Zine revenue for 2019
Notes on building SQL exercises
Taking a year to explain computer things
New zine: HTTP: Learn your browser's language!
How to put an HTML page on the internet
How to write zines with simple tools
git exercises: navigate a repository
curl exercises
Get your work recognized: write a brag document
What does debugging a program look like?
Why are monoidal categories interesting?
New zine: Bite Size Networking!
Organizing this blog into categories
!!Con 2019: submit a talk!
Networking tool comics!
A few early marketing thoughts
Some nonparametric statistics math
2018: Year in review
New talk: High Reliability Infrastructure Migrations
How do you document a tech project with comics?
An example of how C++ destructors are useful in Envoy
Some notes on running new software in production
Tailwind: style your site without writing any CSS!
When does teaching with comics work well?
New zine: Oh shit, git!
Some Envoy basics
What's a senior engineer's job?
Some possible career goals
Why sell zines?
New zine: Help! I have a manager!
Build impossible programs
An awesome new Python profiler: py-spy!
Editing my blog's HTTP headers with Cloudflare workers
Who pays to educate developers?
How to teach yourself hard things
I started a corporation!
A few recent podcasts
New zine: Bite Size Command Line!
IP addresses & routing
netdev day 2: moving away from "as fast as possible" in networking code
netdev day 1: IPsec!
How I use Wireshark
Batch editing files with ed
How to get a core dump for a segfault on Linux
New zine: Profiling & tracing with perf!!
Talk: Building a Ruby profiler
Reverse engineering the Notability file format
Open source sabbatical = awesome
Documentation site for rbspy!
Talks I'd love to see at RustConf
A few things I've learned about computer networking
How does the internet work? podcast
Prototyping an ltrace clone using eBPF
Measuring a blog's success: focus on conversations, not page views
Profiler week 6/7: more experiments, and a `report` subcommand!
Working remotely, 4 years in
Writing performance reviews with positive constructive feedback
Profiler week 5: Mac support, experiments profiling memory allocations
Writing eBPF tracing tools in Rust
Spying on a Ruby process's memory allocations with eBPF
Profiler week 4: callgrind support, containers, Mac progress!
I think I found a Mac kernel bug?
How do you spy on a program running in a container?
How do you read the memory maps of a Mac process?
Profiler week 3: refactoring, better testing, and an alpha release!
Profiler week 2: support for 1.9.3 -> 2.5.0, and line numbers!
Should I pause a Ruby process to collect its stack?
Rust in 2018: it's way easier to use!
Profiler adventures: resolving symbol addresses is hard!
Profiler week 1: testing & profiling stripped binaries
How does gdb call functions?
2017: Year in review
How I set up an automatic weekly blog digest
A perf cheat sheet
My first Rust macro
Debugging a segfault in my Rust program
Bindgen: awesome Rust tool for generating C bindings
How are Ruby's headers different from Python's headers?
How often do Ruby's stack struct definitions change?
How do Ruby & Python profilers work?
Taking a sabbatical to work on Ruby profiling tools
New zine: So you want to be a wizard
What's a reference in Rust?
Linux comics: a small zine
How do groups work on Linux?
Glitch: write fun small web projects instantly
Binder: an awesome tool for hosting Jupyter notebooks
Operating a Kubernetes network
Reasons Kubernetes is cool
How to teach technical concepts with cartoons
Profiling Go programs with pprof
How to answer questions in a helpful way
How I spent my time at the Recurse Center
Cool vim feature: sessions!
Data structure: the treap!
Finding out if/why a server is dropping packets
Debugging netlink requests
What's a network interface?
Telling people what you're working on
Learning at work
Figuring out how to contribute to open source
How Kubernetes certificate authorities work
Cherry picking commits & shell scripting in golang
How does the Kubernetes scheduler work?
Linux tracing zine
Linux tracing systems & how they fit together
Notes on BPF & eBPF
3 short screencasts (/proc, tcpdump, strace)
a tiny whack-a-mole game
What can developers learn from being on call?
Awesome NLP tutorials by Allison Parrish
Log-structured storage
Iptables basics
A few things I've learned about Kubernetes
Async IO on Linux: select, poll, and epoll
Handwritten books
"Let's learn tcpdump" zine: now available for everyone
A small website mystery
Like zines about computers? You might love Bubblesort Zines
Using the Strict-Transport-Security header
New zine: let's learn tcpdump!
No feigning surprise
The fish shell is awesome
Some good "Statistics for programmers" resources
Making small culture changes
netdev conference, day 3
netdev conference, day 2
How to filter packets super fast: XDP & eBPF!
netdev conference, day 1
Slow down your internet with tc
Bash scripting quirks & safety tips
Blogging principles I use
ftrace: trace your kernel functions!
Writing down my career
So you want to be a wizard
Swapping, memory limits, and cgroups
Hiring & opportunity
How do these "neural network style transfer" tools work?
Weird unix thing: 'cd //'
How big can a packet get?
A magical machine learning art tool
Dissecting an SSL certificate
New zine: "Networking! ACK!"
Choosing the "best software"
A tiny zine about machine learning
An idea for a programming book
How do you make an awesome team?
Rules of programming experiments
How to ask good questions
Systems We Love 2016
A container networking overview
2016: Year in review
What's interesting about UDP?
How much memory is my process using?
More drawings about computers
Things to learn about Linux
"A Critique of the CAP Theorem"
Ideas about how to use AWS
Why cute drawings?
A few drawings about Linux
What happens when you run a rkt container?
Service discovery at Stripe
A few questions about open source
Running containers without Docker
A litmus test for job descriptions
Consistency vs availability (wat?)
What's devops?
Operations for software developers for beginners
What even is a container: namespaces and cgroups
Switching to Hugo
What happens when you start a process on Linux?
A list of Linux container software
"I just want to run a container!"
Getting things done
A swiss army knife of debugging tools: talk & transcript
Some questions about Docker and rkt
How I got a CS degree without learning what a system call is
Learning systems programming with Rust
New zine: Linux debugging tools you'll love
Asking good questions is hard (but worth it)
How (and why) I made a zine
Why do UDP packets get dropped?
Release it, then build it
How do you decide what to work on?
How does gdb work?
A few sketches
Benchmarking correctly is hard (and techniques for doing it better)
How do HTTP requests get sent to the right place?
Linux debugging tools I love
PolyConf 2016
Why do we use the Linux kernel's TCP stack?
Using ltrace to debug a memory leak
Should you be scared of Unix signals?
How to spy on a Ruby program
A useful new strace feature
Ideas for making better conference talks & conferences
Learning to like design documents
Three ways to solve hard programming problems
"advice" for aspiring tech bloggers
Notes from my PyData Berlin keynote
A few reasons to be skeptical of machine learning
Investigating Erlang by reading its system calls
homu + highfive: awesome bots that make open source projects easier
A second try at using Rust
A workshop on strace & tcpdump
What are SSL ciphers & session keys?
The Etsy site performance report is amazing
How does knowledge get locked up in people's heads?
CDNs aren't just for caching
you can take the derivative of a regular expression?!
Some links on Java garbage collection
Java garbage collection can be really slow
Looking inside machine learning black boxes
Some of my favorite blogs
I conquered thread pools! For today, at least.
Thread pools! How do I use them?
I/O matters.
How do you do capacity planning?
tcpdump is amazing
How does perf work? (in which we read the Linux kernel source)
Women-only spaces are a hack
Surprises in Ruby HTTP libraries
What is "the stack"?
perf top: an awesome way to spy on CPU usage
How to measure your CPU time: clock_gettime!
Why I love log files
Have high expectations for your computers
TIL: clock skew exists
How CPU load averages work (and using them to triage webserver performance!)
Fast integer sets with Roaring Bitmaps (and, making friends with your modern CPU)
Sendfile (a system call for web developers to know about!)
Guessing Linux kernel registers
Calling C from Rust
A few notes on my CUSEC talk
Why I ❤ Rust
Talking about stock options = awesome
Java isn't slow
Winning the bias-variance tradeoff
Surviving meetings while remote
Things you should know about stock options before negotiating an offer
2015: Year in review
How to trick a neural network into thinking a panda is a vulture
Women in Machine Learning 2015 (fun!!!)
Why Ruby’s Timeout is dangerous (and Thread.raise is terrifying)
How I got better at debugging
Why you should understand (a little) about TCP
Docker is amazing
PAPERS ARE AMAZING: Profiling threaded programs with Coz
A millisecond isn't fast (and how we made it 100x faster)
Is machine learning safe to use?
An argument for hiring junior developers
Some easy statistics: Bootstrap confidence intervals
AdaCamp Montreal 2015
A zine about strace
Learning at open source sprints (no preparation required)
A few spy tools for your operating system (other than strace!)
Seeing system calls with perf instead of strace
Senior engineering & fantasy heroes
Nancy Drew and the Case of the Slow Program
1:1 topic ideas
You can choose who submits talks to your conference
How the locate command works (and let's write a faster version in one minute!)
How gzip uses Huffman coding
How I learned to program in 10 years
A/A testing
Why a C++ programmer might say "I could never write Python"
Data Day Texas 2015
On reading the source code, not the docs
Programming doesn't belong to men (it belongs to me)
Fear makes you a worse programmer
Reproducing awesomeness
Diving into concurrency: trying out mutexes and atomics
Spying on Hadoop with strace
LD_PRELOAD is super fun. And easy!
PyData NYC (I gave a machine learning talk! yay!)
Harm reduction for developers
Fun with machine learning: logistic regression!
Fun with machine learning: does your model actually work?
What women in technology really think (150 of them, at least)
Working remote, 8 months in (seeing humans is important!)
How to set up a blog in 5 minutes
How does SQLite work? Part 2: btrees! (or: disk seeks are slow don't do them!)
How does SQLite work? Part 1: pages!
Strange Loop 2014
You can be a kernel hacker!
How is a binary executable organized? Let's explore it!
What happens if you write a TCP stack in Python?
Pair programming is amazing! Except... when it's not.
Open sourced talks!
Ruby Rogues podcast: systems programming tricks!
Fun with stats: How big of a sample size do I need?
How I did Hacker School: ignoring things I understand and doing the impossible
!!Con talks are up
Machine learning isn't Kaggle competitions
Asking questions is a superpower
Working remote, 3 months in
Should my conference do anonymous review?
Anonymous talk review is amazing.
Diving into HDFS
I can spy on my CPU cycles with perf!
Computers are *fast*!
Stopping to think
Don't feel guilty about not contributing to open source
Debug your programs like they're closed source!
♥ PyCon
Becoming a better developer (it's not just writing more programs)
"Ask if you have questions" isn't enough
Reports from remote-land: remote pairing works great!
Recovering files using /proc (and spying, too!)
My Rust OS will never be finished (and it's a success!)
Writing an OS in Rust in tiny steps (Steps 1-5)
Debugging shared library problems with strace
Hacker School's Secret Strategy for Being Super Productive (or: Help.)
Pair programming
More practical uses for strace!
Using strace to avoid reading Ruby code
A resume workshop idea
A bookmarklet to flee from Mailman archives
Spying on ssh with strace
"How was Hacker School?"
A few blogs I really like
Three steps to learning GDB
Sounding confident in interviews
CUSEC = fun
What my technical interviews have looked like
You should give talks. They will be awesome. Here's why!
4 paths to being a kernel hacker
Some things my kernel can't do
Sketches for a graph layout engine
Questions I'm asking in interviews
Coding strategies
When is "guys" gender neutral? I did a survey!
A pandas cookbook
Understanding how killall works using strace
Day 46: Never Graduate
Day 45: I now have Rust code for executing executables!
Day 44: qemu + gdb = so great
Day 43: SOMETHING IS ERASING MY PROGRAM WHILE IT’S RUNNING (oh wait oops)
Day 42: How to run a simple ELF executable, from scratch (I don't know)
Day 41: Linkers are upsetting
Day 39: Writing malloc wrong, for fun
Day 40: 12 things I learned today about linkers.
Day 40: Linkers are amazing.
Day 38: After 6 days, I have problems that I can't understand at all
Day 37: After 5 days, my OS doesn't crash when I press a key
Day 36: On programming without malloc
Day 35: Types in Rust, for beginners
How to call Rust from assembly, and vice versa
Videos from PyData NYC are up!
What happens when you run 'Hello, world'
Writing a kernel using rustboot & rust-core
Day 34b: Writing curl using my TCP stack
Day 34: The tiniest operating system
Day 33: How to make music with ClojureScript
Day 32: Magical Orchestra!!!
Day 31: Binary trees with core.logic!
Day 30: Making music in Clojure with Overtone. Clojure bugs with laziness! Fun!
Day 29: Trying out Emacs!
Day 28: Made a git workflow visualization webapp!
Day 27: Automatically testing changes in state! Visualizing my Git workflow! Floats!
Day 25: ACK all the things
Day 26: Trying to describe the TCP state machine in a readable way. Failing.
Women in Technology workshop at PyData NYC
Day 24: Unit testing this TCP library
Day 22: Got some TCP packets back!
Day 23: Started writing a TCP stack in Python
NYC Python talk
Day 21: Trying to TCP
Day 19: A few reasons why networking is hard
Day 20: Traceroute in 15 lines of code using Scapy
Day 18: ARP cache poisoning (or: In ur connection, sniffing ur packets)
Day 17: How to write a buffer overflow exploit
Day 16: gzip + poetry = awesome
Do Rails programmers use node.js? Visualizing correlations in command usage
Day 15: How a .gz file is structured, redux
Day 14: When it's hard to write tests, that's when I should be testing
Day 13: Off by one errors
Day 12: Why Julia likes Julia
Day 10: Goals. Goals? Maybe I need to be *reading* more code?
Day 11: How does gzip work?
Day 9: Bytecode is made of bytes! CPython isn't scary!
Day 8: Julia writes Julia! And remembers that open source is hard.
Day 7: An echo server in Clojure
Day 6: I wrote a rootkit!
Day 5: I wrote a kernel module!!!
Where to find bike sharing systems' data feeds
Day 4: Processes vs threads, and kernel modules!
Day 3: What does the Linux kernel even do?
Day 2: netcat fun!
Day 1: What does a shell even do?
Hacker School Day 1: Messing around with the stack in C
Hacker School Day -4: unit testing in C. checkmk!
Julia Serano's 'Excluded'
PyData Boston 2013
Open Data Exchange 2013
Transit maps: 1941 vs 2011
Graphing bike path data with IPython Notebook and pandas
Trying out Octopress
Montreal All-Girl Hack Night #2: now with cookies
Montreal All-Girl Hack Night #1: AMAZING