Bits, Bytes, and Words

Jake Zimmerman

Profiling in Haskell for a 10x Speedup

I wrote up a toy project in Haskell and profiled it to learn about Haskell’s profiling tools and about profiling code in general. Profiling in Haskell with Stack is super easy; to prove it I’ll walk through the problem I was trying to solve, my slow first solution, and how I used Haskell’s profiling tools to find and fix some egregiously slow parts of the code.

Continue reading →
Union Types in Flow & Reason

Union types are powerful yet often overlooked. At work, I’ve been using Flow which thankfully supports union types. But as I’ve refactored more of our code to use union types, I’ve noticed that our bundle size has been steadily increasing!

Continue reading →
Code Review from the Command Line

I do the bulk of my code reviews from the command line, especially when reviewing larger changes. I’ve built up a number of tools and config settings that help me dig into the nuances of the code I’m reviewing, so that I can understand it better than if I were just browsing online.

Continue reading →
Variables and Binding

Variables are central1 to programming languages, yet they’re often overlooked. Academic PL theory papers usually take for granted having proper implementations of variables. Most popular languages butcher variables, confusing them with assignables. Despite being taken for granted, implementing substitution on variables is easy to get wrong.

Continue reading →
Reach for Markdown, not LaTeX

I’ve written in the past (twice) about how to streamline the writing process when using LaTeX. Since then, I’ve found that I enjoy writing even more when I don’t have to reach for LaTeX at all. By reaching first for Markdown, then for LaTeX when necessary, writing is easier and more enjoyable.

Continue reading →


Typed Errors in Sorbet
Sorbet Does Not Have Checked Exceptions


Exploring Ruby with clangd
Linkers & Ruby C Extensions
Search Down the Stack
Sorbet Does Not Have FixMe Comments
Intersection Types in Sorbet are Surprisingly Common


What makes type checking Ruby hard?
Surgery on Code from the Command Line
On Programming Language Choice
Notes on Continuations
A Debugger for Bash in Six Lines of Bash
Improving CLIs with isatty
Standard ML in Travis CI
Profiling in Haskell for a 10x Speedup


Concurrent Programming in ML: A Race
Prefer .then() over .catch()
Union Types in Flow & Reason
Case Exhaustiveness in Flow
Lenses & Composition
Some Intuition on Lenses
Code Review from the Command Line


Presenting Data & Information: Notes
ABTs in Haskell
Variables and Binding
System Fω and Parameterization
Variables in Types
Recitation Notes
Tests, Types, & Correctness
If, Else, & Purity
Haskell Development with Neovim
Reach for Markdown, not LaTeX


Troubleshooting Haskell Stack Setup on OS X
Let’s Have a Chat about Encryption
SML Dev Setup
Starter Zsh Setup


Leaking Free Disk Space
Docker Tips and Cheatsheet
Show where a Python package is used
Why zsh?
Noteworthy Dotfile Hacks
Getting Started with RCM
Vim as an IDE
New GitHub Username
Mastering git log for Collaboration
The LaTeX homework Document Class
Offline LaTeX Development - Part 2


Google Chrome: A Memory Hog
Ruby Virtualenvs
Vim as a Man Page Viewer
The Joys of the Craft
Using Multiple Git Remotes
Using Google OAuth2 for CMU Authentication
Offline LaTeX Development
Solarized LaTeX Listings
A LaTeX Homework Template
Setting up MobaXterm for SSH on Windows
Molokai: An iTerm2 Color Scheme
HPSTR: An Octopress Theme
Adding a Network Printer to a Linux Server
Shiny New Octopress Blog