All articles, alphabetical order

  1. “Solutions”
  2. 1, 6, 21, 107, … ?
  3. 2147483647
  4. 24 Puzzles
  5. 8 Queens Puzzle
  6. 8 Queens Puzzle++
  7. A language people use and bitch about
  8. A Little Teaser. Keen Eyes? You’ll See! Follow the clues to reveal the hidden message.
  9. A Mini-Project to Decode a Mini-Language
  10. A Python syntax highlighter
  11. A race within a race
  12. A Subversion Pre-Commit Hook. How to install and test a simple Subversion pre-commit hook script.
  13. A tale of two upgrades
  14. A useful octal escape sequence
  15. A world without version control
  16. A yen for more symbols
  17. Accidental Emacs. A list of Emacs modes and tricks I use all the time but discovered by accident.
  18. ACCU 2013
  19. ACCU Bristol and Bath
  20. ACCU Conference 2008. A preview of ACCU 2008.
  21. Advent of Code
  22. Advent of Code 2017
  23. Agile at a distance 👍
  24. Aligning the first line of a triple-quoted string in Python
  25. An Exploration of the Phenomenology of Software Development
  26. An ideal working environment
  27. Angle brackets hurt my eyes
  28. Animated pair streams. Another look at the functional programming problem of generating an infinite sequence of pairs. An example of using the Python Imaging Library to generate an animated GIF.
  29. Anti-Social Build Orders. An article advocating zero-tolerance for anti-social build offences.
  30. Are List Comprehensions the Wrong Way Round?
  31. Attack of the Alien Asterisks. Unusual font rendering on Windows
  32. Awesome presentations
  33. Beware the March of IDEs!
  34. Big City Skyline Puzzle. Comments on a novel computer science puzzle. When machine resources are scarce, a compiled language offers precise control.
  35. BIG G little g - What begins with G? Capitalisation: Google or google?
  36. Bike charts by Google. Using the google chart API for something ... different
  38. Binary Literals
  39. Binary search returns … ?
  40. Binary search revisited
  41. Blackmail made easy using Python counters. A programming puzzle and a discussion of Python's evolution.
  42. Books, blogs, comments and code samples
  43. Brackets Off! Thoughts on operator precedence.
  44. Browsing Python Documentation using the Python Sidebar
  45. Bugwards Compatible
  46. Built in Type Safety?
  47. C++ Concurrency in Action. A glowing review of Anthony Williams' book on C++11's support for concurrency
  48. Casualties in the great computer shootout. An investigation into various dimensions of some speed benchmark programs.
  49. Charming Python
  50. Clown, Flee, Jump
  51. Code completion for dynamic languages
  52. Code Craft
  53. Code in Comments. Don't comment out dead code, delete it!
  54. Code Reviews - the rules
  55. Code Rot. What happens when we stop tending to our code? It decays. This article investigates why.
  56. Collaborative documentation tools
  57. Python was named after a comedy troupe. This note discusses what makes a good name for a computer language.
  58. Complacency in the computer industry
  59. Complex numbers for planar geometry
  60. Computer Language Complexity
  61. Computer World
  62. Converting integer literals in C++ and Python
  63. Copy, load, redirect and tee using C++ streambufs. The C++ iostream library separates formatting from lower level read/write operations. This article shows how to use C++ stream buffers to copy, load, redirect and tee streams.
  64. Could a Python eat an elephant?
  65. Could OCR conquer the calligraphylion? A note on the challenge which Arabic script sets for optical character recognition engines.
  66. Creating a dict of lists in Python
  67. Creating a Temporary Subversion Repository
  68. Cryptic Message
  69. Curling for web sites. A script using curl and bash to detect when a website status changes.
  70. DDD Wales, 2018
  71. Define pedantic
  72. DEFLATE: run-length encoding, but better. An investigation into the extended run-length encoder at the heart of the Zlib compression library.
  73. Desktop preferences
  74. Different Angles on Legacy Code
  75. Distorted Software. What does software look like? This article suggests that architecture diagrams get the emphasis wrong.
  76. Dr G’s Award Winning Puzzles
  77. Drawing Chess Positions. A follow-up article on scripting graphics.
  78. Drawing Chessboards. An article about creating graphics programmatically.
  79. Drawing Software Designs
  80. Driving down the road of innovation
  81. Easy as Py
  82. Election Manifesto - a timely activity for agile retrospectives
  83. Elegance and Efficiency. Must elegant code be efficient? This article investigates.
  84. Emoticrab invasion, CSS breakdown. CSS positioning doesn't always work in a Feed reader.
  85. Entertaining Documentation
  86. Equality and Equivalence
  87. Erlang Erlang. A parallel processing problem.
  88. Essential Python Reading List. An essential Python reading list. I've ordered the items so you can pause or stop reading at any point: at every stage you'll have learned about as much possible about Python for the effort you've put in.
  89. Eurovision 2008 charts
  90. Ever wish you’d branched first? A short article describing how to branch a Subversion working copy based on the development trunk.
  91. Evolving Python in and for the real world
  92. Favicon. Why my favicon is a jigsaw piece.
  93. Fearless Debugging
  94. Feeding an internet addiction
  95. File shifting using lftp and rsync. Sometimes it's easier to shift files using the command line, rather than a GUI.
  96. Find the average of a collection of tuples or dicts using Python
  97. Fixed Wheels and Simple Designs
  98. Fixing Compiler Warnings the Hard Way. Listen when your compiler grumbles, but sometimes you should ignore its suggestions.
  99. Fixing header file dependencies. A simple script to check header files are self contained
  100. fold left, right
  101. Folded files and rainbow code
  102. Follow me follow me
  103. Friday Puzzles
  104. From __future__ import braces
  105. From bytes to strings in Python and back again
  106. From CVS to Subversion
  107. From Hash Key to Haskell. A note on keys, characters, smileys, digraphs and Haskell.
  108. Fun with Erlang, ACCU 2008
  109. Functional Programming “Aha!” Moments
  110. Generating solutions to the 8 Queens Puzzle
  111. Generic documentation
  112. Getting started with Typo
  113. Go for short variable names
  114. Go! Steady. Ready?
  115. Gofmt knows best
  116. Good maths, bad computers
  117. Google Mail holiday auto-responder
  118. Google Reader
  119. Group When
  120. Happy Mac
  121. He Sells Shell Scripts to Intersect Sets. The Unix command shell contains a lot of what I like in a programming environment: it’s dynamic, high-level, interpreted, flexible, succinct. This article shows the Unix tools in action.
  122. Hiding iterator boilerplate behind a Boost facade
  123. High altitude programming
  124. Hong Kong Supplementary Character Set
  125. Hosting for Life? TextDrive revived!
  126. How green you are
  127. How many restarts?
  128. How to Mirror a Subversion Repository
  129. Hunting down globals with nm
  130. iBlame Exchange
  131. Ignoring .svn directories
  132. Ima Lumberjack, (s)he’s OK. Gender-neutral technical writing using fictional names.
  133. In, on and out of boxes
  134. Inner, Outer, Shake it all abouter. Encapsulation is about allocating responsibility and easing utility rather than protecting data.
  135. Internal Subversion Externals
  136. Introducing Java
  137. Joined Output and the Fencepost Problem. Items and the spaces between them: some notes on the fencepost problem and joining up strings.
  138. Jokey Code?
  139. Keyword Substitution - Just say No!
  140. Knuth visited, Brains Limited
  141. Koenig’s first rule of debugging. The problems caused by the C++ compilation model, dependencies and cryptic compile diagnostics. If an expert like Andrew Koenig can’t get it right, what hope for the rest of us?
  142. Launching missiles and other unhappy accidents. Launching a missile is an example of a dangerous programming side-effect. Bus accidents are used to motivate team-work.
  143. Lazy sequences working hard
  144. Lenient Browsers and Wobbly Tables
  145. Lessons from the OuLiPo. All about a talk I'll be giving at ACCU 2015
  146. Lexical Dispatch in Python. Dispatching to functions based on their names
  147. Life goes on
  148. Life on Canvas
  149. Life, user manuals, recursive pictures
  150. Lock but don’t but
  151. Longest common subsequence. An investigation into the classic computer science problem of calculating the longest common subsequence of two sequences, and its relationship to the edit distance and longest increasing subsequence problems.
  152. Look and Say Numbers
  153. Looping forever and ever
  154. Macros with halos
  155. Man or man(1)?
  156. map, filter, accumulate, lambda
  157. Martin Fowler on Soft Documentation
  158. Maximum of an empty sequence?
  159. Maybe we live in a scripting universe. Comments on Larry Wall's 11th State of the Onion address.
  160. Me, Myself and OpenID. Setting up a personal OpenID server using phpMyID
  161. Meetup? Turn Up!
  162. Merging sorted streams in Python. Did you know that Python's for loops can have an else clause? Here's how it can be used in a stream-merging function.
  163. Message to Self. What’s this?
  164. Metablog. Reflections on 14 months of blogging, and why I'm no longer using Typo.
  165. Metaphormers
  166. Metaprogramming is Your Friend. An investigation into metaprogramming techniques used by lazy C, C++, Lisp and Python programmers.
  167. Mistargeted ads
  168. Mixing Python and C++
  169. More adventures in C++
  170. My (Test) First Ruby Program
  171. My First Typo Sidebar
  172. Narrow Python
  173. Negative Sequence Indices in Python
  174. Negative, Captain
  175. Next permutation: When C++ gets it right. An investigation into a classic algorithm for generating the distinct permutations of a sequence in lexicographical order.
  176. No www, yes comments, no categories
  177. Nonce Sense. Cryptography
  178. Not my links
  179. Oberon, Cromarty, Lisa, Waggledance, Ariel
  180. OCR. Wrong characters, right meaning! (chuckles). When OCR gets the characters wrong but the meaning right.
  181. Octal Literals
  182. On Exactitude in Programming
  183. One svnserve, multiple repositories
  184. Ongoing Peer Review
  185. Ordered sublists. A brute force approach. A brute force solution to the longest increasing subsequence problem.
  186. Oulipo and the Eodermdrome challenge. The word EODERMDROME is itself an eodermdrome. Can you find any others?
  187. Overload Online
  188. Paging through the Manual using Access Keys
  189. Paralipsis
  190. Parsing C++
  191. Partitioning with Python
  192. Patience sort and the Longest increasing subsequence. How a simple card game provides an efficient algorithm for finding the longest increasing subsequence of a given sequence.
  193. Patience Sorted
  194. Pay rise please
  195. Pcl-cvs and Psvn Incompatibilities
  196. Perec @IgniteSwansea #3
  197. Perl 6, Python 3
  198. Perlish Wisdom
  199. Permission and Forgiveness
  200. Personal overnight builds
  201. Personal version control
  202. Pi seconds is a nanocentury
  203. Pitching Python in three syllables
  204. Polyominoes
  205. Posting from the command line using mtsend
  206. Power programming. What makes a language powerful? The programmer!
  207. Pragmatic fashion
  208. Printed C++ Journals
  209. Productivity++ != Better
  210. Programming Nirvana, Plan B. Simon Peyton Jones discusses functional programming, Haskell, and promotes a radical route to programming Nirvana at ACCU 2008.
  211. Programming Paired and Shared
  212. Py2exe
  213. PyCon UK
  214. PyCon UK: statistics, pictures and perennial problems
  215. Python 2.5
  216. Python Counters @PyDiff
  217. Python keyword workaround
  218. Python maths updates
  219. Python on Ice. A review of the Python 2, Python 3 language fork. Python 3 has met with some resistance. A moratorium on further changes to the language is being imposed, to smooth the transition.
  220. Python Streams vs Unix Pipes
  221. Python’s lesser known loop control
  222. Python, Surprise me!
  223. Readable Code
  224. Release then Test
  225. Removing duplicates using itertools.groupby. An interpreted Python session showing itertools in action.
  226. Retro-fitting coding standards
  227. Reverse, Esrever
  228. Reversing Hofstadter’s Law
  229. Review of Pete Becker’s TR1 Book
  230. Review: Expert Python Programming
  231. Rewriting String.Left()
  232. Robot wars
  233. RTM vs STW
  234. Run-length encoding in Python
  235. Running Sums in Python. A Python program to generate the running sum of a series.
  236. Sausages, sausages, sausages - slice, slice, slice
  237. Saving changes to read-only files
  238. Scatter pictures with Google Charts
  239. Seamless sequence output in Python 3.0
  240. Seeing with a fresh pair of ears
  241. Set.insert or set.add?
  242. Shameful Names
  243. Shells, Logs and Pipes
  244. Singly Linked Lists in C++
  245. Sledgehammers vs Nut Crackers
  246. Slicing a list evenly with Python
  247. Smart Pointers, Dumb Programmers. A note describing how a smart pointer tripped me up.
  248. So many feeds, so little news. So many feeds, so little news. A reflection on internet consumption.
  249. Soft Documentation. A software developer's investigation into documentation tools.
  250. Software development checklist += 3
  251. Sounds of the Tokyo Metro
  252. Source open, problem closed. An example of the open source advantage.
  253. Space sensitive programming
  254. Spam, Typo, Subversion Logs
  255. Speaking at the ACCU Conference 2015
  256. Spolsky podcast causes exercise bike incident
  257. Steady on Subversion. Despite the increasing popularity of distributed version control systems, I'm sticking with Subversion. Here's why.
  258. Steganography made simple
  259. Stop the clock, squash the bug. Which is better, a clock which loses a minute a day or one which is stopped? An investigation into how we find and fix software defects.
  260. String literals and regular expressions. An article about string literals, escape sequences, regular expressions, and the problems encountered when mixing these together.
  261. Subversion 1.4
  262. Sugar Pie. Approximating pi by scattering sugar.
  263. Sums and sums of squares in C++. Reduce is a higher order function which applies a another function repeatedly to a collection of values, accumulating the result. Well known to functional programmers, reduce is also a standard C++ algorithm.
  264. svn help patch
  265. SwanseaCon 2017
  266. Synchronising Workspaces
  267. Syntactic Sugar
  269. Takewhile drops one
  270. Tell me about … Virtualization. An attempt to describe virtualization, why it's useful, and when to consider using it.
  271. Test driven development in Python
  272. The case against TODO. A neat label for work in progress or an easy way to disguise the flaws in a codebase?
  273. The Etch-A-Sketch User Interface
  274. The Granny—Stroustrup Scale
  275. The Heroic Programmer
  276. The Lazy Builder’s Complexity Lesson. A discussion of algorithmic complexity, and a demonstration of how the C++ standard library allows programmers to write code which is both concise and efficient.
  277. The Maximum Sum contiguous subsequence problem. A stream-based solution to a classic computer science problem.
  278. The Price of Coffee. Offering something for nothing and getting paid nothing for it. Leap day ramblings.
  279. The Rings of Saturn
  280. The Third Rule of Program Optimisation
  281. The Trouble with Version Numbers
  282. There’s no escape??!
  283. Think, quote, escape
  285. Tony Hoare’s vision, car crashes, and Alan Turing. The highs and lows of Europython 2009. A personal review.
  286. Too big or too clever? Steve Yegge says that, for large applications, size is an enemy best controlled by dynamic languages. Alex Martelli says a language can be too dynamic for a large application. Who's right?
  287. Top Ten Percent. The most efficient way to sort the top 10% of a collection.
  288. Top Ten Tags. Choosing the right algorithm to select the N largest items from a collection.
  289. Trac — not just a pretty interface
  290. Tracing function calls using Python decorators. Developing code to trace function calls using Python decorators.
  291. Tripped up by Rstrip
  292. Turing Tests and Train Trackers
  293. Two star programming
  294. Undogfooding
  295. Unit Tests Questioned
  296. Unit Tests Questioned: Reading List
  297. Unleash the test army
  298. Version Control for Third Party Software
  299. What apple gets right
  300. What’s in the box?
  301. When computer applications reside on the web
  302. When web search results get read out of context
  303. When you comment on a comment
  304. White black knight then black white knight. Yet more on drawing chessboards
  305. Why MVP1 is wrong
  306. Why Python programmers should learn Python
  307. Why Software Development isn’t Like Construction. What’s the best metaphor for software development? Steve McConnell prefers “construction”. I disagree.
  308. Why zip when you can map?
  309. Wiki Markup. Wikis often invent their own markup syntax. A note on why I favour Markdown.
  310. Word Aligned, hosted by Github
  311. You wait all day for a bus…
  312. Your computer might be at risk. A hard drive failed this weekend. Guess what, it hadn't been backed up. Here's how I went about recovering the data, and some thoughts on the future of computing in general and operating systems in particular.
  313. Zippy triples served with Python. How do you generate previous, this, next, triples from a collection. A stream-based solution in Python.