All blogs / Software / engineering practice
Robert Heaton
Software engineer. One-track lover down a two-way lane
Software / engineering practiceSecurityEmulationEssays / personal
- Posts
- 225 from 5 Jan 2013 to 11 Jun 2025
- Posting
- now and then
- Kind
- personal blog
- Feed
- https://robertheaton.com/feed.xml
2025 3
2024 4
2023 5
2022 12
- How sad should I be about ChatGPT?
- Gameboy Doctor: debug and fix your gameboy emulator
- How to date a recording using background electrical noise
- Love the details
- I love him more and more every day on average
- Soon he’ll be three and soon he’ll be twenty-one
- I'm a security engineer and I still almost got scammed
- We're responsible for the Christmas magic now
- Off-The-Record Messaging part 1: the problem with PGP
- Off-The-Record Messaging part 2: deniability and forward secrecy
- Off-The-Record Messaging part 3: how OTR works
- Off-The-Record Messaging part 4: key insights
2021 8
- I wouldn't call my friends strong male role models but they'll have to do
- How to write better sentences: 6 examples
- Height: 2ft 10 inches. Occupation: baby
- Vulnerability in Bumble dating app reveals any user's exact location
- Another family without a backstory
- Reliable osquery deployment for the paranoid
- Deleting Facebook
- Don't worry son, all your friends are weirdos too
2020 36
- Buying a first home
- It can’t be for nothing: notes from The Last of Us Part 2
- Another RCE vulnerability in KensingtonWorks
- I got married and had kids so you don't have to
- Programming Projects for Advanced Beginners #7: Auto-project-builder
- What is an advanced beginner?
- PFAB #19: Working with raw bytes
- Preventing impossible game levels using cryptography
- PFAB #18: Adventures in shrinking serialized data
- PFAB #17: pre-computation sounds like cheating but isn't
- Remote code execution vulnerability in KensingtonWorks mouse manager
- PFAB #16: How to make your code faster and why you often shouldn't bother
- A blogging style guide, vol. 2
- PFAB #15: Don't overwork your functions
- The coronavirus and happy birthday edition
- PFAB #14: Evil `eval`
- How does a TCP Reset Attack work?
- PFAB #13: When code is too clever to be clean
- Hundreds of companies assert usage rights over all ideas sent through their services
- Systems design for advanced beginners
- How to make yourself happier by making your iPhone worse
- Smile by Papa (Gary Computer Remix)
- PFAB #11: Separating logic and data
- Interview on the Cyberwire podcast about Wacom data collection
- Re-rolling the dice
- Online tracking is about finding excuses to send HTTP requests
- PFAB #10: First-class functions and dependency injection
- Don't let "Magic Enhancer for YouTube" slurp up your browsing history
- PFAB #9: Batch vs Stream processing
- Send me your privacy abuse tipoffs
- Wacom drawing tablets track the name of every application that you open
- PFAB #8: Input validation - tradeoffs between convenience and surprise
- How to set up The Hive on AWS ElasticSearch
- Great cement ideas that will make your partner happy
- PFAB#7: How to write a library
- 2019 review
2019 38
- PFAB#6: Real-world debugging practice
- PFAB#5: How to make your programs shorter
- PFAB#4: Exception handling and coping with failure
- PFAB#3: How to rigorously analyze your journey to work
- Why I have office hours and why you should too
- PFAB#2: How to structure your programs
- How to man-in-the-middle proxy your IOT devices
- PFAB#1: Define your boundaries
- I will give you feedback on your code
- Programming Feedback for Advanced Beginners #0
- Untitled Potato Portrait
- How to come up with blog post ideas
- HP printers try to send data back to HP about your devices and what you print
- Oscar Heaton, quarterly baby review
- Programming Projects for Advanced Beginners #6: User Logins
- Real-World Programming Projects for Advanced Beginners
- Peeking through stock option exercise windows
- Programming Videos for Advanced Beginners #1: Battleships
- Maximizing profits and evaluating success as a Craigslist seller
- How to write an afl wrapper for any language
- Port scans and industrial fans
- I was 7 words away from being spear-phished
- Childbirth: a father's-eye view
- Endless Summer by The Midnight: a brief analysis
- Skeptical advice for programming jobseekers
- Synth1: an unofficial manual
- Open Source for Advanced Beginners #1: bashplotlib
- Open Source for Advanced Beginners
- How does Tor work?
- The Robot Reserve Army of Labor
- What beginner's mind is really like
- ROBERT: prove that your randomized trial really was random
- How to get to Silver in Rocket League 1v1s
- Making peace with Simpson's Paradox
- Introducing Afl-Ruby: fuzz your Ruby programs using afl
- It was all so easy
- Third-party dream cookies
- A brief history of wi-fi privacy vulnerabilities
2018 35
- The Wavefunction Collapse Algorithm explained very clearly
- Programming Projects for Advanced Beginners
- A blogging style guide
- Programming Projects for Advanced Beginners #5: Snake
- HTTPS in the real world
- The therapeutic properties and applications of Dark Souls
- Reproducible beliefs
- Programming Projects for Advanced Beginners #4: Photomosaics
- I Might Be Spartacus: a differential privacy marketplace
- /office-hours
- Programming Projects for Advanced Beginners #3a: Tic-Tac-Toe AI
- Programming Projects for Advanced Beginners #3b: Tic-Tac-Toe AI
- Lessons from my first 20 office hours
- What playing The Witness will teach my kid about problem solving
- How to build a TCP proxy
- How to build a TCP proxy #2: Fake DNS Server
- How to build a TCP proxy #3: Proxy Server
- How to build a TCP proxy #4: Fake Certificate Authority
- I'm giving feedback on blog posts
- Talk: Traits of Successful Software Developers
- How I kicked my email compulsion
- "Stylish" is back, and you still shouldn't use it
- What does a 0.01 increase in the Gini Coefficient actually look like?
- She wanted to do something better
- Programming Projects for Advanced Beginners #2: Game of Life
- I'm doing office hours
- How Tinder keeps your exact location (a bit) private
- I went to Skyrim, once
- "Stylish" browser extension steals all your internet history
- How to read
- Programming Projects for Advanced Beginners #1: ASCII art
- Why economists need bureaucracy
- Making YouTube less bad for you using CSS
- Re: all those regrettable posts that you thought were gone
- Let's grow the Richmond: SB827
2017 13
- Another 10 somewhat advanced Magic: The Gathering plays
- Identity Graphs: how online trackers follow you across devices
- Cookie Syncing: how online trackers talk about you behind your back
- How does online tracking actually work?
- A zero-knowledge proof for the existence of God
- What's the worst word you'd say to beat your in-laws at Boggle?
- What is a self-hosting compiler?
- WeSeeYou: Democratizing Deanonymization
- Tracking friends and strangers using WhatsApp
- Reverse engineering LogicPro synth files
- Confessions of an Economic Hitman - a review
- A small, security-adjacent bug in Instagram
- Notes from Rep. Jackie Speier's Town Hall
2016 13
- A tale of love, betrayal, social engineering and WhatsApp
- There were millions
- Building a Magic: The Gathering sealed deck AI
- 10 somewhat advanced Magic: The Gathering plays
- How to make Slack less bad for you
- Hide the internet
- Randomness-Driven Recruiting
- A delightful piece of spam from Xfinity
- Writing stories is not like programming
- In context
- There was only time like the present
- I am with the police
- He whispered, carelessly
2015 13
- How they solved True Detective Season 1
- A day at The Free Market
- How to value your startup stock options
- Why and how to make smaller pull requests
- American Prankster
- Three Body Problem by Cixin Liu - the Cultural Revolution, in space
- Robber Barons understand technical debt too
- Favorite bits from my insane, never-to-be-published novel
- Staying safe cycling San Francisco's Wiggle
- Migrating bajillions of database records at Stripe
- The SSL FREAK vulnerability explained
- Scientific debugging
- Something that I don't talk about much
2014 22
- Green Waves on an arbitrary Valencia Street
- Fun with your friend's Facebook and Tinder session tokens
- Why you should read Playing to Win by David Sirlin
- Tales from a San Francisco housing search (DELETED SCENES)
- Tales from a San Francisco housing search
- Lessons from a surprisingly successful blog
- Is Ruby pass-by-reference or pass-by-value?
- How to win friends and influence repos
- Getting Nothing Done: a misguided quest for productivity
- Why I love refactoring
- Code review without your glasses
- A beginners' guide to funemployment
- Jaccard Similarity and MinHash for winners
- 9 ways to get that engineer
- Why you should be vegetarian
- Downfall of a once readable blog post
- How does HTTPS actually work?
- Lessons from a Silicon Valley job search
- Is Python pass-by-reference or pass-by-value?
- Cookieless user tracking for douchebags
- Mathematicians hate civil liberties: 100 prisoners and 100 boxes
- The Blue-Eyed Islanders Puzzle
2013 17
- Kanban at London's National Gallery
- The hidden way Bootstrap saved your life
- The Padding Oracle Attack
- How to hack a Rails app using its secret_token
- When you have a nail in your eye, everything looks like a nail
- You should be a mentor
- Infinite monkeys and infinite repos
- Check you’re wearing trousers first
- Take pride or f--- it
- How chronic pain has made me happier
- Coding with gumption
- You are not getting any better
- Featurewhack
- Nothing new under the sun
- How to save 1 day/year of quality Rails time
- Quantum Annealing, or, Do Weird Stuff
- Why it’s the taxpayer’s fault we’ve got no money