The Curious Engineer

All blogs / Python

Luke Plant's home page

lukeplant.me.uk/blog

PythonSoftware / engineering practiceAI / ML

Posts
309 from 17 May 2004 to 12 Oct 2026
Posting
monthly (6 in the last year)
Kind
personal blog
Feed
https://lukeplant.me.uk/blog/atom/index.xml

2026 5

  1. Git is still awful
  2. Inverse Sapir-Whorf and programming languages
  3. Announcing: NT/OT Bible quotation database
  4. When perfection is table stakes
  5. Announcing fluent-codegen

2025 7

  1. Help my website is too small
  2. Breaking “provably correct” Leftpad
  3. Devotions on 1 Thessalonians 1, August 2025
  4. Why I’m not letting the juniors use GenAI for coding
  5. Statically checking Python dicts for completeness
  6. Knowledge creates technical debt
  7. Christ the True and Better Frodo

2024 10

  1. Recursive project search in Emacs
  2. Check if a point is in a cylinder - geometry and code
  3. Should we use AI and LLMs for Christian Apologetics?
  4. Keeping things in sync: derive vs test
  5. Never, Sometimes, Always
  6. pyastgrep and custom linting
  7. Programming mantras are proverbs
  8. Enforcing conventions in Django projects with introspection
  9. Older »
  10. Python packaging must be getting better - a datapoint

2023 14

  1. Python Type Hints: pyastgrep case study
  2. Super-fast Sphinx docs, and SNOB driven development
  3. Is the Lord's Day the Christian Sabbath?
  4. No one actually wants simplicity
  5. You can stop using user-scalable=no and maximum-scale=1 in viewport meta tags now
  6. Re-using CSS for the wrong HTML with Sass
  7. Django and Sass/SCSS without Node.js or a build step
  8. ChatGPT: abstract logic and the doubling down bias
  9. ChatGPT: it has no inner monologue or meta-cognition
  10. ChatGPT: it makes things up (that's its job)
  11. What if none of it is true?
  12. The different uses of Python type hints
  13. Python’s “Disappointing” Superpowers
  14. Accepting the paedo-baptised into credo-baptist churches

2022 11

  1. A model for the soul
  2. Test factory functions in Django
  3. Python Type Hints: case study on parsy
  4. Tools for rewriting Python code
  5. Better Python code grepping with pyastgrep
  6. Older »
  7. The argument from unwanted children
  8. Raising exceptions or returning error objects in Python
  9. REPL Python programming and debugging with IPython
  10. The technological case against Bitcoin and blockchain
  11. The Christian case against Bitcoin and blockchain

2021 7

  1. The curse of scalable technology
  2. Sharing in Christ’s sufferings
  3. On asking versus guessing cultures. And the Geneva Conventions.
  4. A Django PAGNI: efficient bulk properties
  5. Life on the diagonal – adventures in 2-D time
  6. YAGNI exceptions
  7. Who owns your Bible?

2020 10

  1. Evolution of a Django Repository pattern
  2. Everything is an X
  3. Test smarter, not harder
  4. Announcement: Django Views - The Right Way
  5. Please stop trying to blacklist ‘blacklist’
  6. Keyword-only arguments in Python
  7. Why I'm leaving Elm
  8. Double-checked locking with Django ORM
  9. Older »
  10. 50 reasons why Christians should take climate change seriously

2019 3

  1. Pylint false positives
  2. 6 digit OTP for Two Factor Auth (2FA) is brute-forceable in 3 days
  3. A Look at Python, Parameterized

2018 2

  1. Two experiences with Elm
  2. The Elimination Fallacy

2017 3

  1. WordPress 4.7.2 post mortem
  2. Django admin tips Twitter account
  3. The very minimum you need to know about words

2016 3

  1. Avoid Django's GenericForeignKey
  2. Dynamically generated Django admin actions
  3. A simple password-less, email-only login system

2015 4

  1. We need less powerful languages
  2. Interpretation of a stop sign
  3. My approach to Class Based Views
  4. IPython Notebook Essentials review

2014 9

  1. Handling Django's get_query_set rename is hard
  2. You can’t compare language features, only languages
  3. HP Pavilion 17-e153sa on Linux Mint
  4. How to learn Django without installing anything
  5. Older »
  6. Things that can be self-hosting
  7. Approval and acceptance in the tech community
  8. Import Chrome passwords into Firefox on Linux/Gnome
  9. Export and import for Gnome password manager (Seahorse)

2013 10

  1. Zero-based indexing in the real world
  2. Wedding hacks - seating planner using simulated annealing
  3. Wedding hacks - making A4 booklets from A5 PDF sheets
  4. Wedding hacks - John Lewis gift list hyperlink
  5. MVC is not a helpful analogy for Django
  6. Bundling dependencies
  7. Best practices with Django on WebFaction
  8. Now it's your turn
  9. Controlling Sozi remotely from an Android phone
  10. Translating sentences with substitutions

2012 15

  1. Full screen WebView Android app
  2. Dynamic typing in a statically typed language
  3. On Boys and Bikinis
  4. Why escape-on-input is a bad idea
  5. PHP, Python and Persuasion
  6. Moved to blogofile and disqus
  7. Older »
  8. Never fix a bug twice
  9. Django's CBVs were a mistake
  10. Reasons to love Django, part x of y
  11. WordShell - WordPress command line admin utility
  12. LearnScripture.net launched
  13. KTimeTracker replacement - TimeCult
  14. Async Raven/Sentry client with Django/Python
  15. Some quick Django optimisation lessons

2011 7

  1. Starter fabfile and scripts for a Django project on Webfaction
  2. A prayer to the programming gods
  3. Announcing django-easyfilters (with some heresy on the side)
  4. Family Fortunes
  5. Dissecting Python - part 1
  6. My Bash prompt
  7. Docs or it doesn't exist

2010 17

  1. django-anonymizer released
  2. django-output-validator released
  3. Fuzzy testing with assertNumQueries
  4. Class Based Views and Dry Ravioli
  5. Use JSON instead of YAML for Django test fixtures
  6. Older »
  7. The kind of comments that will get ignored on Django's Trac
  8. player_do – control multiple media players from a single (command line) interface
  9. Cleverbot never admits defeat
  10. Leaving KDE
  11. Why eating shrimps is not like homosexuality
  12. Exploratory programming with IPython
  13. Linux and calendars - bad combination...
  14. Mercurial tree visualisation
  15. Eclipse and Mercurial with existing checkout
  16. Blackberry Curve ↔ KDE-PIM sync on Kubuntu Karmic. FAIL
  17. Eclipse, PyDev, Django and virtualenv

2009 13

  1. According to their deeds
  2. Is static type checking a redundant testing mechanism?
  3. Haskell blog software
  4. Building GHC is fun...
  5. A plea to KDE developers
  6. Haskell string support
  7. Python and copyright
  8. 1 Corinthians 7:36-38 – “Marry” or “give in marriage”?
  9. GHC bug?
  10. Amarok 2 can corrupt MP3 files
  11. Emacs and personal trac wiki
  12. Review: Django 1.0 Template Development
  13. Multiple output formats in Django

2008 14

  1. Haskell regex problem - help needed!
  2. Ella
  3. Does the church meet for worship?
  4. Haskell API docs suck. A lot.
  5. Managing Django patches using Mercurial
  6. Haskell Regex replace
  7. Haskell Blog Rewrite - Session 7
  8. Django, Python 2.5 and memory usage
  9. MOC and last.fm
  10. Django newforms-admin upgrade
  11. Konsole/Yakuake and drag/drop
  12. Bible memorisation web app
  13. Django and Twill
  14. Personal wiki and desktop integration

2007 31

  1. AJAX validation with Django, newforms and MochiKit
  2. Django Validator 1.3
  3. Older »
  4. Older »
  5. Older »
  6. Fixing Facebook in Konqueror
  7. Facebook broken in Konqueror
  8. Haskell Blog Rewrite - Session 6
  9. Last.fm, Konqueror, Amarok
  10. Sharing internet connection to chroot
  11. Implementing a dictionary using first class functions
  12. Jordan - part 1
  13. Jordan - Wadi Rum
  14. Gutsy woes
  15. Rewriting my blog in Haskell
  16. HaWiki has disappeared!
  17. Haskell Blog Rewrite - Session 5 - 2007-07-20
  18. Haskell Blog Rewrite - Session 4 - 2007-07-19
  19. Mature Wine
  20. HSQL and HaskellDB anguish
  21. Haskell Blog Rewrite - Session 2 - 2007-07-06
  22. Beryl usefulness
  23. Configuring Samba in KDE, with Kubuntu Feisty
  24. O'Reilly code quiz
  25. Null pointers vs None vs Maybe
  26. What's so bad about the Nazis anyway?
  27. Edgy, Feisty, and Pheenet WLU-703Z
  28. Human chromosome 2 - a creationist response
  29. Django validator updated
  30. Portable computer
  31. Amarok / Ubuntu integration

2006 24

  1. Kio-Sword Sourceforge page
  2. Kio-Sword 0.3 released
  3. Working with email offline
  4. Howto expand/resize a VMPlayer image
  5. Adventures in Haskell - ODBC under Windows
  6. Replacement dos box for Windows - emacs shell mode
  7. Why learning Haskell/Python makes you a worse programmer
  8. Ie7
  9. Understanding Monads Via Python List Comprehensions
  10. Pyrex and Lisp
  11. A Django website that took (a lot) more than 20 minutes.
  12. Django-updates gem
  13. bacKing up
  14. View Source in Konqueror
  15. Older »
  16. Empty files and templates
  17. Leading whitespace in comments
  18. pychecker vs pylint vs Django
  19. Django Admin Hack - Fields varying with user permissions
  20. Clipboard diff
  21. Wajig is da bomb
  22. KDirStat
  23. Is Google talk talking?
  24. Kio-Sword 0.2 released

2005 46

  1. Last.fm taster
  2. Updated validator and CsrfMiddleware
  3. Django dreaming
  4. Django validator app. And fuse/webdav/bazaar
  5. Cross Site Request Forgeries
  6. Scott Adams on blogging
  7. Django
  8. chroot with X applications
  9. Kio-Sword 0.1-3
  10. Over and out
  11. Blogging critique part 4: Reading matter(s)
  12. Older »
  13. Blogging critique part 3: Nutters
  14. Blogging critique part 2: Mixed witness?
  15. SimplyMEPIS
  16. Phishing phloored
  17. Uptime
  18. Konqueror incremental search
  19. iTunes for Linux
  20. Kio-Sword 0.1-2
  21. Blogging critique part 1: Genuine influence?
  22. Web development on Linux
  23. Ubuntu and Win4Lin
  24. Subversion on AMD64
  25. Automount gotchas
  26. Fun with 64-bit Linux
  27. Accumulator Generator in PHP
  28. Ubuntu and Debian AMD64 repository
  29. More Ubuntu experiences
  30. Back to Debian - with Ubuntu this time
  31. Back online!
  32. Juice
  33. Older »
  34. Psalm 51:8
  35. Cleaning and Jasper Fforde
  36. Mandrake firewall fixed
  37. PHP View-Controller
  38. My blog code
  39. New blog system
  40. Spam
  41. Plans
  42. Money
  43. Linux friendly radio
  44. Networking fun
  45. New computer, new OS
  46. Feed my sheep

2004 44

  1. GMail invite, anyone?
  2. Sufficient for all?
  3. Being predictable
  4. My King / The Seven Way King
  5. Kompare - a tool of beauty
  6. Abusing GMail
  7. Iron Warning
  8. Older »
  9. Firefox - make the switch
  10. CSS signatures
  11. Irregular Expressions
  12. Working life
  13. First day
  14. The Man in Romans 7
  15. By the Spirit
  16. Blogging politics
  17. How to get hits
  18. Going up in the world
  19. Sesquipedalianism
  20. Geeky updates
  21. Deuteronomy 24:14,15
  22. Catch up
  23. Comics by RSS
  24. It's not enough
  25. MrKnowItAll's inbox
  26. The pains of hell
  27. Toothache
  28. To shave or not to shave
  29. Older »
  30. Reboot Blues
  31. LP Phone Home
  32. Psalm 51:12,13
  33. Back to sunny Bradford
  34. For no-one
  35. daily news
  36. CodeExporter 1.0
  37. John 15:9
  38. Everyone likes a blog
  39. New fractal gallery
  40. Kio-Sword 0.1
  41. Kio-Sword 0.0.1
  42. Kio-Sword
  43. CodeExporter 0.2
  44. VBA modules