David R. MacIver's Blog
April 2026
February 2026
November 2025
October 2025
September 2025
May 2025
November 2024
September 2024
August 2024
July 2024
June 2024
May 2024
September 2023
August 2023
July 2023
June 2023
May 2023
February 2023
November 2022
September 2022
July 2022
June 2022
May 2022
April 2022
March 2022
February 2022
January 2022
November 2021
October 2021
September 2021
August 2021
July 2021
June 2021
May 2021
April 2021
March 2021
February 2021
January 2021
December 2020
November 2020
October 2020
September 2020
August 2020
July 2020
June 2020
May 2020
February 2020
January 2020
November 2019
October 2019
September 2019
August 2019
June 2019
May 2019
March 2019
February 2019
January 2019
November 2018
October 2018
September 2018
August 2018
July 2018
June 2018
May 2018
April 2018
February 2018
January 2018
December 2017
November 2017
October 2017
September 2017
August 2017
July 2017
June 2017
May 2017
April 2017
- Life Changes Announcement: Academia Edition
- Programmer at Large: Can we not?
- Ordering and mapping regular languages
- An epistemic vicious circle
- A worked example of designing an unusual data structure
- Programmer at Large: Didn't you notice?
- The Easy Way to Compile Automata to Regular Expressions
- My time: Now available to the highest bidder
March 2017
- Fully Automated Luxury Boltzmann Sampling for Regular Languages
- Programmer at Large: How old is this?
- How and why to learn about data structures
- An untapped family of board game mechanics
- Programmer at Large: Who wrote this?
- Looking into doing a PhD
- Laziness is better when it's visible
- How likely are Condorcet cycles in supermajorities?
February 2017
January 2017
- Programmer at Large: Are you serious?
- Determinism is topologically impossible
- Programmer at Large: What's that noise?
- Upcoming reduced publishing rate and Patreon
- Programmer at Large: What's your name?
- How to make good things
- Programmer at Large: What is this?
- Convergence of alternating sums
- Faster random sampling by handling rejection well
December 2016
- On persuasion and anger
- Proving or refuting regular expression equivalence
- Randomized exhaustive exploration of a many branching tree
- Aligning incentives
- A simple purely functional data structure for append and forward traversal
- Randomly productive
- Voting theory and practice infodump
- Updating in favour of two-round delayed runoffs
- The worst election
- Small elections comparing Majority Judgement, Range Voting and Condorcet winners
November 2016
- 2017 Goal: Recurring Revenue
- The littlest infinity
- Democracy for lunch
- Metric space completeness is a restricted form of topological compactness
- Generalized Single Transferable Vote
- Deterministic Hare-Clarke STV voting, take 2
- A deterministic improvement to Hare-Clark Single Transferable Vote
- A Small STV Election for Meek's Method
- A failure mode of single transferable vote
- I still believe in democracy
- Road Trip Day 5
- Road Trip Day 2
- A reset protocol for my body
- I like short books
- Dividend paying sovereign wealth funds and decoupling effects
- Review of a book that reviews (code) reviewing
October 2016
- Road trip!
- Why you should use a single repository for all your company's projects
- Underestimating the inductive step
- Some things that might help you make better software
- Giving up on giving up on caffeine
- Static typing will not save us from broken software
- Declaring code bankruptcy for the rest of 2016
- Some small single transferable vote elections
- On racist intermediaries in hiring processes
- Two extremes of problem solving
September 2016
August 2016
July 2016
- Making taxes progressive through redistribution
- It might be worth learning an ML-family language
- First Past The Post is not the problem, districts are
- Seeking recommendations for better sleep data
- Contributors do not save time
- Against Virtue Environmentalism
- Fuzzing through multi-objective shrinking
- Doing less by doing more
- An experiment in breaking a caffeine addiction
- Occasional Reading Post #8
- How to navigate goal directed learning
June 2016
May 2016
- How to read a mathematics textbook
- Weekly reading post #4
- The Derivative as an Alternative Minimal Deterministic Automaton
- The Myhill–Nerode theorem and the Minimal Deterministic Automaton
- Weekly reading post #3
- You're now all on commission
- Weekly reading post #2
- Charitable donations
- Hello from Windows
- The Borda Count as a Randomized Limit of Approval Voting
- Randomizing Lean Coffee
- Filibuster, the game
- Weekly reading post #1
- New group: "Making Work Better"
- A random sample of what I read last week
April 2016
- An estimation game for sprint planning
- Buy me books, redux
- Writing libraries is terrible
- In defence of developer exceptionalism
- Brand split
- Language reconstruction based fuzzing without reconstructing languages
- Self-optimizing boolean expressions
- Shrinking failing input using a SAT solver
- Delta debugging with inferred separators
March 2016
February 2016
January 2016
December 2015
- 2015 in review
- On criticizing programming languages (without criticizing their users)
- Mentors as a service
- Effectiveness of personal greenhouse reduction vs donation
- How to help your favourite open source project
- Direct proofs from the well ordering theorem
- Zorn's lemma is what happens when you get bored of transfinite induction
- Let's help people go to PyCon Namibia
November 2015
October 2015
September 2015
- There is no single acceptable defect rate
- Future directions for Hypothesis
- Finding more bugs with less work
- Hypothesis: Staying on brand
- The repr thing
- Designing a feature auction
- Soliciting advice: Bindings, Conjecture, and error handling
- Structure aware simplification for Conjecture
- Conjecture WIP: Simplification isn't simple
- A new approach to property based testing
- A survey of Quickchecks
August 2015
- Mighty morphing power strategies
- The two voices of progress
- Apparently I'm still doing this fanfic thing
- Notes on London flat hunting
- Hypothesis 1.10.2 and 1.10.3 are out
- What if we had more finished libraries?
- Fuzzing examples from the ground up
- How to generate a list plus an element of it
- A vague roadmap for Hypothesis 2.0
- New release of hypothesis-pytest
- Book review: Smarter than you think, by Clive Thompson
- Throwing in the towel
- Hypothesis 1.10.0 is out
- New Patreon page for work on Hypothesis
July 2015
- Massive performance boosts with judicious applications of laziness
- Hypothesis 1.9.0 is out
- A terrible/genius idea
- Two new Hypothesis releases and continuous deployment of libraries
- Notes on Hypothesis performance tuning
- Making Hypothesis sustainable
- Heuristics are for learning, not for teaching
- Hypothesis 1.8.0 is out
- A wish list for programming languages
- Hypothesis 1.7.2 is out
- Properties for testing optimisation
- Using z3 to try to solve Feedback Arc Set for Tournaments
- Want to take a weekend to write tests?
- Hypothesis 1.7.1 is out
June 2015
- Back-pedalling on Python 2.6
- Some stuff on example simplification in Hypothesis
- Thinking with the machine
- Pydata London 2015
- Hypothesis continues to teach me
- We made this
- Hypothesis for Django
- Using Hypothesis with Factory Boy
- Thoughts on Strangeloop and Moldbug
- Large scale utilitarianism and dust motes
May 2015
- Using tmux to test your console applications
- The era of rapid Hypothesis development is coming to an end
- New discussion groups for randomized testing
- Constraint based fixtures with Hypothesis
- If you want Python 2.6 support, pay me
- Speeding up Hypothesis simplification by warming up
- Notes on the implementation of Hypothesis stateful testing
April 2015
- On Haskell, Ruby, and Cards Against Humanity
- The #1 reason I don't write Haskell
- Getting Google Analytics on readthedocs
- How to improve your Quickcheck implementation with this one weird trick
- Some empirically derived testing principles
- Why I am no longer #YesToAV
- Tests are a license to delete
- Notes on pilling a cat
- Things that are not documentation
- Important things I have learned about Twitter on Android today
- Revising some thoughts on test driven development
- The war cannot be won, yet still we must fight our little battles
- Surprise! Feminism.
- Interviewing: Test, don't sample
- It's OK for your open source library to be a bit shitty
- Stargate physics 101
- Honey I shrunk the clones: List simplification in Hypothesis
March 2015
- How to make other people seem like humans
- Hypothesis 1.0 is out
- What I would do with the Stargate program
- A sketch of a new simplify API for Hypothesis
- 27 bugs in 24 hours
- I can dream, right?
- Simplify starts from the wrong end
- ##computer-enthusiasm, an experiment in liking things again
- Stable serialization and cryptographic hashing for tracking seen objects
- An alternate timeline for Stargate SG1
- The downside of making accurate inferences about people
- Topological compactness is an induction principle
- Continuous functions are those which preserve approximate measurements
- Software I actually like
- Commodity futures trading! In space!
- The beginning of a novel that I'll doubtless never write
- How to stop Hipchat beeping at you.
February 2015
- Triangular Beeminding; Or, Drink Less, Using the Power of Triangles
- Monadic data generation strategies and why you should care
- What are developer adjacent skills?
- The three stage value pipeline for Hypothesis generation
- What is the testmachine?
- Some books I have enjoyed recently
- Some thoughts on open source
- Revised Hypothesis 1.0 plan
- Changes to the Hypothesis example database
January 2015
- Better prediction of probabilities through auctions
- A plan for Hypothesis 1.0
- On taking the ideas in Hypothesis
- Using multi-armed bandits to satisfy property based tests
- Anatomy of a bug hunt
- The things you forget to test
- The pain of randomized testing
- I just want to brag a bit about the Hypothesis test suite
- Hypothesis now has a mailing list
- Testing the installer for your python library
- On the new data generation in hypothesis
- Hypothesis short term road map
- Extending a preorder efficiently and correctly
- It turns out integer linear programming solvers are really good
- Optimal solutions to FAST
- Using voting systems for combinatorial optimisation problems
December 2014
- A genie brokers a deal
- Punishing people for improving the situation
- A new plan for Christmas 2015
- Field notes from last night's recipe
- The questions you should ask when starting a project
- So what happens now?
- A small tactical voting example
- Should you join Google?
- Some more small elections
- An interesting hypothetical election
- A patch for quadratic voting
- Well that didn't last long
November 2014
October 2014
September 2014
August 2014
July 2014
June 2014
May 2014
April 2014
March 2014
- I think I might have a book problem
- Write libraries, not services
- Chickpea and vegetable stew
- Sketch design for a sort of housing co-operative
- What is good code?
- More book recommendations
- Notes on a randomized variant of majority judgement
- A two person agreement protocol
- A class of games I wonder if exists
- My kitchen has a new toy
- Open data and fair elections are incompatible
February 2014
January 2014
December 2013
November 2013
October 2013
- Consider the tournament
- Chicken breasts in red wine and caramelized onion sauce
- It's like Intrade meets OKCupid
- Examining bias in non-majoritarian random pair
- Stating the probabilistic Gibbard-Sattherthwaite Theorem
- A technical lemma I am finding surprisingly useful
- The other randomized voting system
- Ordinal and cardinal numbers
- Well orderings, comparability of cardinals and aleph_1
September 2013
- Maybe I'm doing it wrong
- An amusing problem to solve
- The false proxies of mirror images
- Designing a tech meet-up for inclusiveness
- How learning Scala made me a better programmer
- Some things that are the same size as each other
- An introduction to infinity
- How to submit a decent bug report
- I think I don't think like I think I think. I think
- Notes on instrumentalist reasoning
- Other ways to improve democracy by picking your politicians at random
- Notes on aspirational mental models
- Warning: This blog has secret mind control powers
- How to get free tea from Pret a Manger
- Blog editorial guidelines
- I am angry too
- With enough context, everything makes sense
- Towards a more perfect democracy
August 2013
July 2013
June 2013
- I suppose it's not terribly surprising that Wordpress are bad at security
- Venison stew
- Report on some initial playtesting of the auction game
- Updating my dietary policy
- Arguments I am unlikely to listen to
- Boycotting kickstarter
- More linux wifi hilarity
- The long RSS winter may be over
- The cult of the giant global brain on moral philosophy
- Problems with Linux wifi on an Intel network card
- Customers who read this blog might also like...
- But enough about me...
- How to hard "boil" an egg, redux
- A refinement to the auction game
- Problem solving when you can't handle the truth
- Bayesian reasoners shouldn't believe logical arguments
- An amusing financial instrument for creating a common currency
- Collaborative coin flipping
- A manifesto
May 2013
- Chesterton's patch
- A crude voting simulation
- When does one normal distribution dominate another?
- Come join the cult of the giant global brain
- Another group interaction experiment I'd like someone to perform
- An auction game design
- Terra: A brief review
- A simple example of non-VNM total orders
- A theorem on dominance of random variables
- A sketchy and overly simplistic theory of moral change
- Another model for bribing MPs
- Comment moderation
- How to legally(?) and efficiently bribe a democracy
- Some simple theorems about dominance of probability distributions
- More on infinitary decision strategies
- Using two level discourse as a tool of thought
- The moral argument for rationality
- A theorem about certain families of random variables
- An infinitary extension to the previous theorem about random variables
- An amusing conceit for a sci-fi story
- On vegetarians who eat chicken
- On the Von Neumann Morgenstern Utility Theorem, Part 1
- Objections to the VNM utility theorem, part 2
April 2013
- A magic system with consistency and depth
- An interesting experiment that no one seems to have performed
- An announcement and a brief retrospective
- The winning strategy for random ballot is not what I thought it was
- How to stop Android's fucking profanity policing bullshit
- Percentages of the popular vote in UK elections
- Value functions lead to non-transitive preferences
- Book review: What The Best College Teachers Do
- Some ill thought out musings about identity
- I've been stealing recipes from my mother: Ice cream pie
- Deterministic voting is just too random
- Now with added Flattr
- A bugfix for my queuing business model
- A freemium model for scheduling
- A proposal for electoral reform
March 2013
- The horror lurking at the heart of the new hypothesis
- Another new hypothesis feature: flags
- A possible more principled approach to generation and simplification in hypothesis
- Stateful testing with hypothesis
- You probably shouldn't do this, but it works really well
- My personal dietary policy
- Nontransitive dice are unsurprising
- Yesterday Was Change Everything Day
- Quickcheck style testing in python with hypothesis
- Blasting patents for fun and profit
- Falsifying hypotheses in python
- An interview question
- An audible experiment
- A (rewritten) manifesto for error reporting
- A parable about problem solving in software development
- A manifesto for error reporting
- A meta-recipe
- Now syndicating drmaciver.com to twitter
- A heuristic for problem solving
- Exploring your twitter archive with unix
- What are developers bad at?
- A file that should exist in all your ruby projects
February 2013
- So I accidentally designed a voting system
- Different ways of defining topologies
- Update on voice recording in interviews
- A discussion on free time and hiring and employment practices
- Questions for prospective employers
- An election protocol for implementing random ballot in an accountable manner
- Why random ballot is a good idea
- New blog look
- Implementing find_or_create correctly is impossible
- Interviewing companies
- Majority Judgement implementation in python
- Update on resampling voting systems
- A resampling statistic for voting systems
December 2012
- Twitter as the death of blogging
- Ignorance is bliss for whom?
- So I accidentally wrote a monad tutorial
- How do you interview people without a programming background?
- Constructing the negative numbers
- Hello there, who are you?
- Calvin and Hobbes, gocomics and dotjs
- If Programming Language Articles Were People
November 2012
August 2012
July 2012
June 2012
May 2012
- Against Human Readability, Part 2 of Many: The toolchain argument
- Against human readability, ongoing discussion
- An interesting game mechanic
- Against human readability (part 1 of many?)
- The proper approach to fixing bugs
- OpenVPN repeatedly losing connections with inactivity timeout
- The DDGHF policy on prostitution
- Turning deterministic strategy games into nondeterministic games of voting
- Greetings from the Ministry for Dancing, Getting High and Fucking
- An interesting experiment in social choice
April 2012
March 2012
February 2012
January 2012
- Integer sets with O(1) range allocation and O(log(n)) deletion
- An algorithm for incrementally building separation graphs
- Butternut squash, coconut and chickpea curry
- A cute algorithm for a problem you've never cared to solve
- Story concept: Dead man walking
- I don't write Scala
- Really simple spatial indices
December 2011
November 2011
October 2011
August 2011
July 2011
June 2011
May 2011
- Judgement and Asymmetric Errors
- Sleep as an Droid export data
- Drinks from the weekend
- Maximum entropy methods for single-winner elections?
- On the value of helpful error messages
- My Brownie Recipe
- Ha ha, only serious
- (Runtime) Cost-free abstractions in clay
- New Comment Policy
- What books have made you a better person?
- A plan for not failing
April 2011
January 2011
December 2010
October 2010
August 2010
July 2010
June 2010
May 2010
April 2010
March 2010
February 2010
January 2010
December 2009
November 2009
October 2009
September 2009
August 2009
July 2009
June 2009
May 2009
April 2009
- Command line tools for NLP and Machine Learning
- Determining logical project structure from commit logs
- A reminder: Planet Scala move
- Open sourcing Pearson’s Correlation calculations
- Gates
- Pulling the plug on old planet scala feeds
- More kittens: Improving edge weight calculations
- Segmenting kittens: Experiments with clustering image contents
- More fun with xsel
- Scala trivia of the day: Traits can extend classes
- planet scala now on github
- A workaround for misbehaving X citizens
March 2009
February 2009
January 2009
- Criticizing programming languages
- Porting Pearsons to Postgres. Performance?
- Cleaning up a set of tags, part 1
- Importing work posts
- Yet another MySQL Fail
- Old mathematics posts
- Computational linguistics and Me
- Writing things right
- Planet Scala: By Scala programmers, usually about Scala
- Planet Just Scala
December 2008
November 2008
September 2008
August 2008
July 2008
June 2008
May 2008
- Book Review: The Art of Assembly Language
- A cute hack: Changing the scope of System.out
- GUI interpreter frontend coming along nicely
- Trampoline Systems and Scala
- Code move
- Request for help: Numerical linear algebra
- Not really an announcement: GUI frontend to Scala Interpreter
- A reminder of how Wordpress handles RSS feeds
- Removing myself from Artima Scala Buzz
- Baked parmesan and tomato polenta
April 2008
March 2008
February 2008
- Hector's Reminder Service: QT Jambi and Scala
- Open source project breakdown.
- Formatting
- Wait, you believed them when they said "Write once, run anywhere"? That's so cute.
- Anyone willing to put a word in for Groovy?
- Tell us why your language sucks
- Easy binary serialization of Scala types
- More penne and cheese
- Food hacks
January 2008
December 2007
November 2007
October 2007
September 2007
August 2007
June 2007
May 2007
April 2007
March 2007
- re·cur·sion –noun: See recursion
- What's in a syntax?
- Unexpectedly popular
- From the jargon file: Bogosort
- fix f = let x = f x in x
- Speling is important
- Cool Gadget of the Day: JTidy Servlet
- Javascript 'with' clause
- Cool gadget of the day: Chickenfoot
- Enforce your invariants damnit
- Parsers, Parsec and Haskell
- Build scripts
February 2007
January 2007
November 2006
September 2006
July 2006
June 2006
May 2006
April 2006
March 2006
February 2006
January 2006
December 2005
November 2005
October 2005
- Announcement
- Vegetarian Mole
- Pseudo-African Peanut and carrot stew
- Mombasa Pumpkin Desert
- Butternut squash risotto
- Super-real fields 3: Artin-Schreier theory of ordered fields
- David's Mole Brownies
- A Mathematician's Scratchpad
- Super-real fields 1: Basic background material
- Super-real fields 2: Hyperreals and Ultrapowers
- Fried Pasta
- "Playing with your food" begins
- Roast pumpkin with a spicy potato and squash filling