41554 blogs · [ { "id": "01a0878e-735b-7188-8a64-e5a9ad2b1775", "title": "What/Why/Notes", "url": "https://jml.io/posts/what-why-notes/", "published_at": "2026-03-07T09:20:30+00:00" }, { "id": "01a0878e-735b-7188-8a64-e5a9adac0ef9", "title": "How I've been using LLMs at work", "url": "https://jml.io/posts/llm-usage/", "published_at": "2025-12-23T11:20:30+00:00" }, { "id": "01a0878e-735b-7188-8a64-e5a9adc9d9f6", "title": "On Process", "url": "https://jml.io/posts/on-process/", "published_at": "2025-04-23T08:37:36+00:00" }, { "id": "01a0878e-735b-7188-8a64-e5a9ae1012c6", "title": "Vibing code quality", "url": "https://jml.io/posts/vibing-code-quality/", "published_at": "2025-04-15T11:33:13+00:00" }, { "id": "01a0878e-735b-7188-8a64-e5a9ae6e3512", "title": "Burning definitions", "url": "https://jml.io/posts/burning-definitions/", "published_at": "2025-04-14T11:10:18+00:00" }, { "id": "01a0878e-735b-7188-8a64-e5a9af405d97", "title": "Too much steering, not enough pedalling", "url": "https://jml.io/posts/too-much-steering/", "published_at": "2023-09-01T07:29:22+00:00" }, { "id": "01a0878e-735b-7188-8a64-e5a9afcf3de5", "title": "Too much steering, not enough pedalling", "url": "https://jml.io/too-much-steering/", "published_at": "2023-09-01T07:27:54+00:00" }, { "id": "01a0878e-735b-7188-8a64-e5a9b01304d7", "title": "Galahad Principle", "url": "https://jml.io/posts/galahad-principle/", "published_at": "2023-08-31T12:49:12+00:00" }, { "id": "01a0878e-735b-7188-8a64-e5a9b0b38e9e", "title": "The Galahad Principle", "url": "https://jml.io/galahad-principle/", "published_at": "2023-08-31T12:38:03+00:00" }, { "id": "01a0878e-735b-7188-8a64-e5a9b13ad649", "title": "Positive and negative feedback", "url": "https://jml.io/posts/positive-and-negative-feedback/", "published_at": "2023-04-10T07:12:17+00:00" }, { "id": "01a0878e-735b-7188-8a64-e5a9b1522090", "title": "Notes on test coverage", "url": "https://jml.io/posts/haskell-test-coverage-notes/", "published_at": "2018-10-17T00:00:00+00:00" }, { "id": "01a0878e-735b-7188-8a64-e5a9b1fc25e1", "title": "Announcing quay-admin", "url": "https://jml.io/posts/announcing-quay-admin/", "published_at": "2018-05-18T00:00:00+00:00" }, { "id": "01a0878e-735b-7188-8a64-e5a9b2be6cd0", "title": "Site updates", "url": "https://jml.io/posts/site-updates/", "published_at": "2018-05-05T00:00:00+00:00" }, { "id": "01a0878e-735b-7188-8a64-e5a9b2f3c721", "title": "Eighty Percent", "url": "https://jml.io/posts/eighty-percent/", "published_at": "2017-12-31T00:00:00+00:00" }, { "id": "01a0878e-735b-7188-8a64-e5a9b3f0dd9a", "title": "Category theory in everyday life", "url": "https://jml.io/posts/category-theory-in-everyday-life/", "published_at": "2017-10-21T00:00:00+00:00" }, { "id": "01a0878e-735b-7188-8a64-e5a9b40ca14f", "title": "SPAKE2 in Haskell: How Haskell Helped", "url": "https://jml.io/posts/spake2-how-haskell-helped/", "published_at": "2017-10-13T00:00:00+00:00" }, { "id": "01a0878e-735b-7188-8a64-e5a9b4de2a86", "title": "SPAKE2 in Haskell: What is SPAKE2?", "url": "https://jml.io/posts/what-is-spake2/", "published_at": "2017-06-04T00:00:00+00:00" }, { "id": "01a0878e-735b-7188-8a64-e5a9b58efc33", "title": "SPAKE2 in Haskell: the journey begins", "url": "https://jml.io/posts/spake2-begins/", "published_at": "2017-05-27T00:00:00+00:00" }, { "id": "01a0878e-735b-7188-8a64-e5a9b5c91325", "title": "Announcing haskell-cli-template", "url": "https://jml.io/posts/announcing-haskell-cli-template/", "published_at": "2017-01-31T00:00:00+00:00" }, { "id": "01a0878e-735b-7188-8a64-e5a9b6697376", "title": "Announcing graphql-api: Haskell library for GraphQL", "url": "https://jml.io/posts/graphql-api/", "published_at": "2017-01-30T00:00:00+00:00" }, { "id": "01a0878e-735b-7188-8a64-e5a9b6b7b2d8", "title": "Announcing grafanalib", "url": "https://jml.io/posts/grafanalib/", "published_at": "2017-01-12T00:00:00+00:00" }, { "id": "01a0878e-735b-7188-8a64-e5a9b73982c1", "title": "servant-template: production-ready Haskell web services in 5 minutes", "url": "https://jml.io/posts/haskell-servant-template/", "published_at": "2016-10-16T00:00:00+00:00" }, { "id": "01a0878e-735b-7188-8a64-e5a9b7c05dcd", "title": "Patterns are half-formed code", "url": "https://jml.io/posts/anti-patterns/", "published_at": "2016-08-18T18:00:00+00:00" }, { "id": "01a0878e-735b-7188-8a64-e5a9b7dd20e6", "title": "Evolving toward property-based testing with Hypothesis", "url": "https://jml.io/posts/incremental-property-based-testing/", "published_at": "2016-06-05T16:00:00+00:00" }, { "id": "01a0878e-735b-7188-8a64-e5a9b83c32e8", "title": "A wish for Haskell documentation", "url": "https://jml.io/posts/haskell-documentation/", "published_at": "2015-10-30T00:00:00+00:00" }, { "id": "01a0878e-735b-7188-8a64-e5a9b86f8c14", "title": "Debugging Python with gdb", "url": "https://jml.io/posts/python-debugging/", "published_at": "2015-08-27T00:00:00+00:00" }, { "id": "01a0878e-735b-7188-8a64-e5a9b956575f", "title": "Bazel! Correct, reproducible, fast builds", "url": "https://jml.io/posts/bazel/", "published_at": "2015-07-22T00:00:00+00:00" }, { "id": "01a0878e-735b-7188-8a64-e5a9ba5163a4", "title": "Docstrings for tests", "url": "https://jml.io/posts/test-docstrings/", "published_at": "2015-06-24T00:00:00+00:00" }, { "id": "01a0878e-735b-7188-8a64-e5a9baf28360", "title": "Russian translation of \"Your Code Sucks\"", "url": "https://jml.io/posts/russian-your-code-sucks/", "published_at": "2015-06-21T00:00:00+00:00" }, { "id": "01a0878e-735b-7188-8a64-e5a9bb39ba39", "title": "Isn't it Pythonic?", "url": "https://jml.io/posts/pythonic/", "published_at": "2014-08-13T00:00:00+00:00" }, { "id": "01a0878e-735b-7188-8a64-e5a9bb460181", "title": "Cutting edge debugging", "url": "https://jml.io/posts/impossible-bugs/", "published_at": "2014-07-11T00:00:00+00:00" }, { "id": "01a0878e-735b-7188-8a64-e5a9bc3a1a63", "title": "conda and binstar: initial experiences", "url": "https://jml.io/posts/conda-binstar/", "published_at": "2014-07-08T00:00:00+00:00" }, { "id": "01a0878e-735b-7188-8a64-e5a9bc6ac2bb", "title": "Migrated to Pelican", "url": "https://jml.io/posts/pelican-migration/", "published_at": "2014-07-05T15:21:00+00:00" }, { "id": "01a0878e-735b-7188-8a64-e5a9bd362262", "title": "Deliberately being naughty", "url": "https://jml.io/posts/deliberately-being-naughty/", "published_at": "2013-04-29T13:23:00+00:00" }, { "id": "01a0878e-735b-7188-8a64-e5a9bd6b9a5d", "title": "testtools moved to Github", "url": "https://jml.io/posts/testtools-moved-to-github/", "published_at": "2013-02-13T14:48:00+00:00" }, { "id": "01a0878e-735b-7188-8a64-e5a9bd7bde05", "title": "Are single letter variable names evil?", "url": "https://jml.io/posts/are-single-variable-names-evil/", "published_at": "2013-02-11T10:49:00+00:00" }, { "id": "01a0878e-735b-7188-8a64-e5a9bdf36258", "title": "How to write docstrings for tests", "url": "https://jml.io/test-docstrings/", "published_at": "2012-12-22T00:00:00+00:00" }, { "id": "01a0878e-735b-7188-8a64-e5a9bea9575e", "title": "Getting set up with Twisted development", "url": "https://jml.io/posts/getting-set-up-with-twisted-development/", "published_at": "2012-12-15T10:55:00+00:00" }, { "id": "01a0878e-735b-7188-8a64-e5a9bf8e1ffd", "title": "What's wrong with ORMs", "url": "https://jml.io/posts/whats-wrong-with-orms/", "published_at": "2012-11-20T15:07:00+00:00" }, { "id": "01a0878e-735b-7188-8a64-e5a9c02c0905", "title": "A Modest Success", "url": "https://jml.io/posts/a-modest-success/", "published_at": "2012-11-09T14:18:00+00:00" }, { "id": "01a0878e-735b-7188-8a64-e5a9c0f15813", "title": "Undistract me (redux)", "url": "https://jml.io/posts/undistract-me-redux/", "published_at": "2012-10-04T11:35:00+00:00" }, { "id": "01a0878e-735b-7188-8a64-e5a9c1982e5d", "title": "Everything You Always Wanted to Know about Twisted", "url": "https://jml.io/everything-you-always-wanted-to-know-about-twisted/", "published_at": "2012-09-22T16:53:00+00:00" }, { "id": "01a0878e-735b-7188-8a64-e5a9c1d7f099", "title": "How to disconnect in Twisted, really", "url": "https://jml.io/how-to-disconnect-in-twisted-really/", "published_at": "2012-09-22T16:51:00+00:00" }, { "id": "01a0878e-735b-7188-8a64-e5a9c1fae443", "title": "Test Doubles", "url": "https://jml.io/test-doubles/", "published_at": "2012-09-22T16:48:00+00:00" }, { "id": "01a0878e-735b-7188-8a64-e5a9c2165ad6", "title": "Rigor mortis?", "url": "https://jml.io/posts/rigor-mortis/", "published_at": "2012-08-31T13:35:00+00:00" }, { "id": "01a0878e-735b-7188-8a64-e5a9c3029814", "title": "testtools: history and future", "url": "https://jml.io/posts/testtools-history-and-future/", "published_at": "2012-07-21T20:16:00+00:00" }, { "id": "01a0878e-735b-7188-8a64-e5a9c3e5fd80", "title": "Complexity and capability", "url": "https://jml.io/posts/complexity-and-capability/", "published_at": "2012-07-21T18:11:00+00:00" }, { "id": "01a0878e-735b-7188-8a64-e5a9c472f838", "title": "juju debug-hooks", "url": "https://jml.io/posts/juju-debug-hooks/", "published_at": "2012-06-26T13:43:00+00:00" }, { "id": "01a0878e-735b-7188-8a64-e5a9c4758b5f", "title": "Tricks for exploring new languages?", "url": "https://jml.io/posts/tricks-for-exploring-new-languages/", "published_at": "2012-06-25T09:15:00+00:00" }, { "id": "01a0878e-735b-7188-8a64-e5a9c48f27b1", "title": "Further reflections on my first Juju charm", "url": "https://jml.io/posts/further-reflections-on-my-first-juju/", "published_at": "2012-06-22T18:19:00+00:00" }, { "id": "01a0878e-735b-7188-8a64-e5a9c5063265", "title": "Unfiltered reflections on my first Juju charm", "url": "https://jml.io/posts/unfiltered-reflections-on-my-first-juju/", "published_at": "2012-06-22T13:03:00+00:00" }, { "id": "01a0878e-735b-7188-8a64-e5a9c54a1a49", "title": "Married", "url": "https://jml.io/posts/married/", "published_at": "2012-05-28T09:07:00+00:00" }, { "id": "01a0878e-735b-7188-8a64-e5a9c5c4c919", "title": "Local Juju", "url": "https://jml.io/posts/local-juju/", "published_at": "2012-03-02T16:45:00+00:00" }, { "id": "01a0878e-735b-7188-8a64-e5a9c6103fca", "title": "Bad Snake Joke", "url": "https://jml.io/posts/bad-snake-joke/", "published_at": "2012-02-25T13:36:00+00:00" }, { "id": "01a0878e-735b-7188-8a64-e5a9c70df8e6", "title": "testtools 0.9.14 released", "url": "https://jml.io/posts/testtools-0914-released/", "published_at": "2012-02-16T10:55:00+00:00" }, { "id": "01a0878e-735b-7188-8a64-e5a9c77e60d4", "title": "testtools 0.9.13 released", "url": "https://jml.io/posts/testtools-0913-released/", "published_at": "2012-02-06T15:55:00+00:00" }, { "id": "01a0878e-735b-7188-8a64-e5a9c7ea15cc", "title": "Simple made easy", "url": "https://jml.io/posts/simple-made-easy/", "published_at": "2012-02-01T13:50:00+00:00" }, { "id": "01a0878e-735b-7188-8a64-e5a9c8030591", "title": "Undistract me", "url": "https://jml.io/posts/undistract-me/", "published_at": "2012-01-23T17:44:00+00:00" }, { "id": "01a0878e-735b-7188-8a64-e5a9c8cd7f57", "title": "What are my projects?", "url": "https://jml.io/posts/what-are-my-projects/", "published_at": "2011-12-26T04:54:00+00:00" }, { "id": "01a0878e-735b-7188-8a64-e5a9c9bb749f", "title": "pyflakes update", "url": "https://jml.io/posts/pyflakes-update/", "published_at": "2011-11-21T14:29:00+00:00" }, { "id": "01a0878e-735b-7188-8a64-e5a9ca6752f8", "title": "Automatic packaging update", "url": "https://jml.io/posts/automatic-packaging-update/", "published_at": "2011-11-10T12:40:00+00:00" }, { "id": "01a0878e-735b-7188-8a64-e5a9ca7f8968", "title": "How to feel better (or, some tips on refactoring)", "url": "https://jml.io/posts/how-to-feel-better-or-some-tips-on/", "published_at": "2011-11-04T18:29:00+00:00" }, { "id": "01a0878e-735b-7188-8a64-e5a9caf9e94d", "title": "testtools 0.9.12 out", "url": "https://jml.io/posts/testtools-0912-out/", "published_at": "2011-09-14T11:01:00+00:00" }, { "id": "01a0878e-735b-7188-8a64-e5a9cb6c81fc", "title": "doctest really isn't very good", "url": "https://jml.io/posts/doctest-really-isnt-very-good/", "published_at": "2011-09-09T17:39:00+00:00" }, { "id": "01a0878e-735c-705b-8768-60242115930e", "title": "Progress on auto packaging", "url": "https://jml.io/posts/progress-on-auto-packaging/", "published_at": "2011-08-23T18:09:00+00:00" }, { "id": "01a0878e-735c-705b-8768-602421d7b3e1", "title": "How dependency guessing works", "url": "https://jml.io/posts/how-dependency-guessing-works/", "published_at": "2011-08-18T12:18:00+00:00" }, { "id": "01a0878e-735c-705b-8768-602422014a9d", "title": "Automagic packaging of binary apps for Ubuntu", "url": "https://jml.io/posts/automagic-packaging-of-binary-apps-for/", "published_at": "2011-08-18T11:57:00+00:00" }, { "id": "01a0878e-735c-705b-8768-602422ad520c", "title": "launchpadlib helper", "url": "https://jml.io/posts/launchpadlib-helper/", "published_at": "2011-08-02T11:05:00+00:00" }, { "id": "01a0878e-735c-705b-8768-602422e31efa", "title": "Command line apps", "url": "https://jml.io/posts/command-line-apps/", "published_at": "2011-08-01T10:59:00+00:00" }, { "id": "01a0878e-735c-705b-8768-6024230ce81b", "title": "Ubuntu on my iMac", "url": "https://jml.io/posts/ubuntu-on-my-imac/", "published_at": "2011-07-10T13:52:00+00:00" }, { "id": "01a0878e-735c-705b-8768-6024231ae6b1", "title": "Leaving Launchpad, going to work on Ubuntu", "url": "https://jml.io/posts/leaving-launchpad-going-to-work-on/", "published_at": "2011-06-20T11:10:00+00:00" }, { "id": "01a0878e-735c-705b-8768-602423f89efd", "title": "testtools 0.9.11 released", "url": "https://jml.io/posts/testtools-0911-released/", "published_at": "2011-06-12T13:08:00+00:00" }, { "id": "01a0878e-735c-705b-8768-60242440d12d", "title": "testtools 0.9.10 released", "url": "https://jml.io/posts/testtools-0910-released/", "published_at": "2011-04-11T12:44:00+00:00" }, { "id": "01a0878e-735c-705b-8768-6024253f7e7a", "title": "testtools 0.9.9 released", "url": "https://jml.io/posts/testtools-099-released/", "published_at": "2011-04-08T12:00:00+00:00" }, { "id": "01a0878e-735c-705b-8768-602425c37c29", "title": "mdz on listening to users", "url": "https://jml.io/posts/mdz-on-listening-to-users/", "published_at": "2011-03-08T09:02:00+00:00" }, { "id": "01a0878e-735c-705b-8768-6024262cb684", "title": "Music is too hard", "url": "https://jml.io/posts/music-is-too-hard/", "published_at": "2011-02-02T12:04:00+00:00" }, { "id": "01a0878e-735c-705b-8768-602426472d82", "title": "Expressing agreement and disagreement numerically", "url": "https://jml.io/posts/expressing-agreement-and-disagreement/", "published_at": "2011-01-25T18:02:00+00:00" }, { "id": "01a0878e-735c-705b-8768-60242662d133", "title": "Larval prototype for Launchpad dashboards", "url": "https://jml.io/posts/larval-prototype-for-launchpad/", "published_at": "2010-12-23T16:09:00+00:00" }, { "id": "01a0878e-735c-705b-8768-6024271e5e10", "title": "testtools 0.9.8 released", "url": "https://jml.io/posts/testtools-098-released/", "published_at": "2010-12-22T19:19:00+00:00" }, { "id": "01a0878e-735c-705b-8768-602427d4cb63", "title": "testtools bug update", "url": "https://jml.io/posts/testtools-bug-update/", "published_at": "2010-12-10T23:03:00+00:00" }, { "id": "01a0878e-735c-705b-8768-602427ef98ec", "title": "testtools manuals", "url": "https://jml.io/posts/testtools-manuals/", "published_at": "2010-11-29T00:31:00+00:00" }, { "id": "01a0878e-735c-705b-8768-602428949505", "title": "Tests that print stuff", "url": "https://jml.io/posts/tests-that-print-stuff/", "published_at": "2010-11-26T16:01:00+00:00" }, { "id": "01a0878e-735c-705b-8768-6024297fefd2", "title": "Boiling kettles, unit tests and data", "url": "https://jml.io/posts/boiling-kettles-unit-tests-and-data/", "published_at": "2010-11-26T13:34:00+00:00" }, { "id": "01a0878e-735c-705b-8768-602429c1e7bd", "title": "Big or small?", "url": "https://jml.io/posts/big-or-small/", "published_at": "2010-11-24T16:12:00+00:00" }, { "id": "01a0878e-735c-705b-8768-602429dd9d45", "title": "\"Don't Make Me Think\", thoughts for Launchpad", "url": "https://jml.io/posts/dont-make-me-think-thoughts-for/", "published_at": "2010-11-19T15:29:00+00:00" }, { "id": "01a0878e-735c-705b-8768-60242a05fb58", "title": "What else have you got?", "url": "https://jml.io/posts/what-else-have-you-got/", "published_at": "2010-11-18T18:16:00+00:00" }, { "id": "01a0878e-735c-705b-8768-60242a694cac", "title": "Reviewing specs, rock on!", "url": "https://jml.io/posts/reviewing-specs-rock-on/", "published_at": "2010-11-18T18:14:00+00:00" }, { "id": "01a0878e-735c-705b-8768-60242b078586", "title": "Having an extra feature never hurts, rebutted", "url": "https://jml.io/posts/having-extra-feature-never-hurts/", "published_at": "2010-11-16T18:10:00+00:00" }, { "id": "01a0878e-735c-705b-8768-60242b861968", "title": "And then what?", "url": "https://jml.io/posts/and-then-what/", "published_at": "2010-11-16T15:03:00+00:00" }, { "id": "01a0878e-735c-705b-8768-60242beff68c", "title": "Make it really easy to fix bugs on Ubuntu", "url": "https://jml.io/posts/make-it-really-easy-to-fix-bugs-on/", "published_at": "2010-11-15T14:36:00+00:00" }, { "id": "01a0878e-735c-705b-8768-60242c3cf89d", "title": "Ubuntu in a VM on OS X?", "url": "https://jml.io/posts/ubuntu-in-vm-on-os-x/", "published_at": "2010-11-06T11:28:00+00:00" }, { "id": "01a0878e-735c-705b-8768-60242cbcc536", "title": "Still going", "url": "https://jml.io/posts/still-going/", "published_at": "2010-11-04T17:24:00+00:00" }, { "id": "01a0878e-735c-705b-8768-60242d6b0839", "title": "What to do, what to do", "url": "https://jml.io/posts/what-to-do-what-to-do/", "published_at": "2010-11-03T09:03:00+00:00" }, { "id": "01a0878e-735c-705b-8768-60242deebfb8", "title": "Launchpad and UDS-N", "url": "https://jml.io/posts/launchpad-and-uds-n/", "published_at": "2010-11-02T14:23:00+00:00" }, { "id": "01a0878e-735c-705b-8768-60242eaf8d19", "title": "The art is long, the life short", "url": "https://jml.io/posts/art-is-long-life-short/", "published_at": "2010-10-28T19:41:00+00:00" }, { "id": "01a0878e-735c-705b-8768-60242f6c907a", "title": "testtools compatibility", "url": "https://jml.io/posts/testtools-compatibility/", "published_at": "2010-10-25T11:37:00+00:00" }, { "id": "01a0878e-735c-705b-8768-602430609ca8", "title": "Off to UDS", "url": "https://jml.io/posts/off-to-uds/", "published_at": "2010-10-23T13:00:00+00:00" }, { "id": "01a0878e-735c-705b-8768-602430d5ff60", "title": "testtools 0.9.7 released", "url": "https://jml.io/posts/testtools-097-released/", "published_at": "2010-10-17T13:00:00+00:00" }, { "id": "01a0878e-735c-705b-8768-602431acc0a2", "title": "Get Xchat-Gnome completing with colon", "url": "https://jml.io/posts/get-xchat-gnome-completing-with-colon/", "published_at": "2010-09-29T17:14:00+00:00" }, { "id": "01a0878e-735c-705b-8768-602432841c84", "title": "Maverick notes", "url": "https://jml.io/posts/maverick-notes/", "published_at": "2010-09-16T10:20:00+00:00" } ] posts Claim your blog
Back to jml.io
Blog · corpus.blog/blogs/jml.io/posts

jml.io

jml.io

2026

2025

2023

2018

2017

2016

2015

2014

2013

2012

2011

2010