All articles, newest first

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