A cache miss is not a cache miss
When writing high performance code, we are careful to avoid cache misses when possible. When discussing cache misses, however, we are usually content with counting the number of cache misses. In this post I will explain why this is not sufficient, as data dependency also make a huge difference.
Understanding gradient descent
Gradient descent is a standard tool for optimizing complex functions iteratively within a computer program. Its goal is: given some arbitrary function, find a minumum. For some small subset of functions - those that are convex - there's just a single minumum which also happens to be global. For most realistic…
3D Printed Camera
The design of the camera body evolved from a simplified massing of functional elements to refinements based on ergonomics and scale, as I learned more about the strength of the material.
The math of CSS locks
CSS Locks are a Responsive Web Design technique that lets you transition smoothly between two property values when the screen gets smaller or bigger.
How and why I made a zine
How (and why) I made a zine
Elasticsearch Based Image Search Using RGB Signatures
In my previous post , I described some experiments I was doing to reduce images to a Bag of Visual Words (BOVW) . My goal is to build a Con...
Announcing the Journal of Open Source Software
Making AI work better for science @ Fulcrum. Previously Senior Fellow @ Schmidt Sciences, Product for @github's Copilot, Head of Data Science @stsci. Zoonive...
CHIP-8 in Common Lisp: The CPU
A while back I decided to try to write a Game Boy emulator in Common Lisp based on this series of articles . I made some good progress but eventually got bogged down because I was trying to learn a bunch of complex new things at once:
MitM Attack against KeePass 2’s Update Check
This post is about a Man in the Middle (MitM) vulnerability in KeePass 2’s automatic update check. KeePass – the free and open source password manager – uses, in all versions up to the current 2.33, unencrypted HTTP requests to check for new software versions. An attacker can abuse this automatic update check – if…
What Working at Facebook Has Taught Me About Design Critique
Four Things Working at Facebook Has Taught Me About Design Critique Read the full post and more over on my personal blog at tannerc.com. Critique is an important part of any design process, whether …
The Biggest Mistake I Ever Made
There was a time in my life when I played quite a bit of basketball. I was leading engineering at a start-up in Scottsdale, AZ, my wife was…
Usenet Tradecraft: Survival in an Extremely Adversarial Environment (2013)
Survival in an Extremely Adversarial Environment If your secure communications platform isn’t being used by terrorists and pedophiles, you&# …
So Long, Whitechapel Bell Foundry
It is with deep regret that I announce the closure of Whitechapel Bell Foundry , the world’s most famous bell foundry and Britain’s oldest manufacturing company. Below you can read my interview with Alan Hughes, the last in a line of bell founders stretching back to 1420, who will retire next year at sixty-eight years…
What Math Do You Need for Physics?
Chad Orzel has a very sensible piece at Forbes, headlined What Math Do You Need For Physics? It Depends, which addresses the question of what math a physicist like him (experimental AMO physics) re…
Macchiato: ClojureScript on the Server
Dmitri's blog about programming, Clojure, and software development
Markov Chain Monte Carlo Sampling
📍 This article has moved. Read the current version at This is the third part in a short series of blog posts about quantum Monte Carlo (QMC). The series is derived from an introductory lecture I ga…
A Guide to Bayesian Statistics
A guide for getting started with Bayesian Statistics! Start your way with Bayes' Theorem and end up building your own Bayesian Hypothesis test!
My love-hate relationship with LuaJIT (2015)
I love LuaJIT for its performance, but its complexity sometimes puts me off.
A Tribute to VMware Workstation, Fusion, and Hosted UI
Updated February 2, 2016: Once you learn about our team and who we are, come take a trip down memory lane with us! Yesterday morning, the Hosted UI team, responsible for VMware’s Workstation …
Moving from Native Apps to Progressive Web Apps
From now on, I won’t be building any more native apps. All my apps going forward will be progressive web apps. Progressive web apps are web…
What are malicious USB keys and how to create a realistic one?
This blog post shows how to create a reliable and realistic-looking malicious USB key that can be used in a drop attack.
The Sad State of the Backbone Ecosystem
For the past 2 years, ~90% of my coding time has been spent working on a large scale Backbone.js app. In February 2014, the Backbone community was in a fairly good place. The core library had reached 1.0 the previous year and had a strong team around it. Marionette had emerged as a de-facto standard for web…
A Proposal For the Dartmouth Summer Research Project on A.I. (1955)
A PROPOSAL FOR THE DARTMOUTH SUMMER RESEARCH PROJECT ON ARTIFICIAL INTELLIGENCE
Zeroing Memory is Hard: VC++ 2015 arrays
Quick, what’s the difference between these two C/C++ definitions of initialized local variables? char buffer[32] = { 0 };char buffer[32] = {}; One difference is that the first is legal in C a…
The FBI can almost certainly crack the San Bernardino iPhone without Apple
The title kind of says it all. How do I know? Because of this photo : That's a picture of the logic board of an iPhone 5C, the same mod...