Making a DNS query in Ruby from scratch

Hello! A while back I wrote a post about how to write a toy DNS resolver in Go. In that post I left out “how to generate and parse DNS queries” because I thought it was boring, but a few people pointed out that they did not know how to parse and generate DNS queries and they were … | Continue reading


@jvns.ca | 1 year ago

Why do domain names sometimes end with a dot?

Hello! When I was writing the zine How DNS Works earlier this year, someone asked me – why do people sometimes put a dot at the end of a domain name? For example, if you look up the IP for example.com by running dig example.com, you’ll see this: $ dig example.com example.com.5678 … | Continue reading


@jvns.ca | 1 year ago

How to send raw network packets in Python with tun/tap

Hello! Recently I’ve been working on a project where I implement a bunch of tiny toy working versions of computer networking protocols in Python without using any libraries, as a way to explain how computer networking works. I’m still working on writing up that project, but today … | Continue reading


@jvns.ca | 1 year ago

Some ways to get better at debugging

Hello! I’ve been working on writing a zine about debugging for a while (here’s an early draft of the table of contents). As part of that I thought it might be fun to read some academic papers about debugging, and last week Greg Wilson sent me some papers about academic research i … | Continue reading


@jvns.ca | 1 year ago

A toy remote login server

Hello! The other day we talked about what happened when you press a key in your terminal. As a followup, I thought it might be fun to implement a program that’s like a tiny ssh server, but without the security. You can find it on github here, and I’ll explain how it works in this … | Continue reading


@jvns.ca | 1 year ago

What happens when you press a key in your terminal?

I’ve been confused about what’s going on with terminals for a long time. But this past week I was using xterm.js to display an interactive terminal in a browser and I finally thought to ask a pretty basic question: when you press a key on your keyboard in a terminal (like Delete, … | Continue reading


@jvns.ca | 1 year ago

Monitoring Tiny Web Services

Continue reading


@jvns.ca | 1 year ago

Notes on running containers with bubblewrap

Hello! About a year ago I got mad about Docker container startup time. This was because I was building an nginx playground where I was starting a new “container” on every HTTP request, and so for it to feel reasonably snappy, nginx needed to start quickly. Also, I was running thi … | Continue reading


@jvns.ca | 1 year ago

A/a Testing

Continue reading


@jvns.ca | 1 year ago

sqlite-utils: a nice way to import data into SQLite for analysis

Hello! This is a quick post about a nice tool I found recently called sqlite-utils, from the tools category. Recently I wanted to do some basic data analysis using data from my Shopify store. So I figured I’d query the Shopify API and import my data into SQLite, and then I could … | Continue reading


@jvns.ca | 1 year ago

Pages that didn't make it into "How DNS Works"

Hello! A couple weeks ago I released a new zine called How DNS Works. When I started writing that zine (in, uh, January 2021), I originally had in mind a broader zine on “everything you need to know to own a domain”. So it had a bunch of pages on domain registration, TLS, and ema … | Continue reading


@jvns.ca | 2 years ago

New zine: How DNS Works!

Hello! On Thursday we released a new zine about one of my favourite computer systems: DNS! You can get it for $12 here: https://wizardzines.com/zines/dns, or get an 11-pack of all my zines here. Here’s the cover and table of contents: why DNS? I wanted to write about DNS for t … | Continue reading


@jvns.ca | 2 years ago

A list of new(ish) command line tools – Julia Evans

Continue reading


@jvns.ca | 2 years ago

How to Ask Good Questions

Continue reading


@jvns.ca | 2 years ago

Learning at Work

Continue reading


@jvns.ca | 2 years ago

Implementing a toy version of TLS 1.3

Hello! Recently I’ve been thinking about how I find it fun to learn computer networking by implementing working versions of real network protocols. And it made me wonder – I’ve implemented toy versions of traceroute, TCP and DNS. What about TLS? Could I implement a toy version of … | Continue reading


@jvns.ca | 2 years ago

Celebrate Tiny Learning Milestones

Continue reading


@jvns.ca | 2 years ago

Some tiny personal programs I've written

Continue reading


@jvns.ca | 2 years ago

Some things about getaddrinfo that surprised me

Continue reading


@jvns.ca | 2 years ago

Things that used to be hard and are now easy

Continue reading


@jvns.ca | 2 years ago

The multiple meanings of “nameserver” and “DNS resolver”

Continue reading


@jvns.ca | 2 years ago

Linux tracing systems and how they fit together (2017)

Continue reading


@jvns.ca | 2 years ago

A DNS resolver in 80 lines of Go

Continue reading


@jvns.ca | 2 years ago

Reasons for servers to support IPv6

Continue reading


@jvns.ca | 2 years ago

Hosting my static sites with nginx

Continue reading


@jvns.ca | 2 years ago

Some ways DNS can break

Continue reading


@jvns.ca | 2 years ago

How to find a domain's authoritative nameservers

Continue reading


@jvns.ca | 2 years ago

Why might you run your own DNS server?

Continue reading


@jvns.ca | 2 years ago

2021: Year in review

Continue reading


@jvns.ca | 2 years ago

Mess with DNS

Continue reading


@jvns.ca | 2 years ago

DNS doesn't "propagate"

Continue reading


@jvns.ca | 2 years ago

How to use dig

Continue reading


@jvns.ca | 2 years ago

Debugging a weird 'file not found' error

Continue reading


@jvns.ca | 2 years ago

Some notes on using esbuild

Continue reading


@jvns.ca | 2 years ago

How do you tell if a problem is caused by DNS?

Continue reading


@jvns.ca | 2 years ago

How to get useful answers to your questions

Continue reading


@jvns.ca | 2 years ago

Tools to explore BGP

Continue reading


@jvns.ca | 2 years ago

All my zines are now available in print!

Continue reading


@jvns.ca | 2 years ago

Nginx Playground

Continue reading


@jvns.ca | 2 years ago

Teaching by filling in knowledge gaps

Continue reading


@jvns.ca | 2 years ago

Debugging by starting a REPL at a breakpoint is fun

Continue reading


@jvns.ca | 2 years ago

Quadratic algorithms are slow (and hashmaps are fast)

Continue reading


@jvns.ca | 2 years ago

Patterns in Confusing Explanations

Continue reading


@jvns.ca | 2 years ago

Computers Are Fast (2014)

Continue reading


@jvns.ca | 2 years ago

Write good examples by starting with real code

Continue reading


@jvns.ca | 2 years ago

Reasons why bugs might feel "impossible"

Continue reading


@jvns.ca | 2 years ago

Things you should know about stock options before negotiating an offer (2015)

Continue reading


@jvns.ca | 2 years ago

You can now buy print version of my zines!

Continue reading


@jvns.ca | 2 years ago