41554 blogs · [ { "id": "01a08727-bef8-7019-a064-8c2b806010a0", "title": "SQLite improving performance with pre-sort", "url": "https://andersmurphy.com/2026/06/07/sqlite-improving-performance-with-pre-sort.html", "published_at": "2026-06-07T00:00:00+00:00" }, { "id": "01a08727-bef8-7019-a064-8c2b806b691a", "title": "The perils of UUID primary keys in SQLite", "url": "https://andersmurphy.com/2026/06/05/the-perils-of-uuid-primary-keys-in-sqlite.html", "published_at": "2026-06-05T00:00:00+00:00" }, { "id": "01a08727-bef8-7019-a064-8c2b80a5b0f9", "title": "100000 TPS over a billion rows: the unreasonable effectiveness of SQLite", "url": "https://andersmurphy.com/2025/12/02/100000-tps-over-a-billion-rows-the-unreasonable-effectiveness-of-sqlite.html", "published_at": "2025-12-02T00:00:00+00:00" }, { "id": "01a08727-bef8-7019-a064-8c2b81148aae", "title": "Clojure: SQLite C API with project Panama and Coffi", "url": "https://andersmurphy.com/2025/05/20/clojure-sqlite-c-api-with-project-panama-and-coffi.html", "published_at": "2025-05-20T00:00:00+00:00" }, { "id": "01a08727-bef8-7019-a064-8c2b81bacc90", "title": "Why you should consider using brotli compression with SSE", "url": "https://andersmurphy.com/2025/04/15/why-you-should-use-brotli-sse.html", "published_at": "2025-04-15T00:00:00+00:00" }, { "id": "01a08727-bef8-7019-a064-8c2b82a2fc0a", "title": "Clojure: Realtime collaborative web apps without ClojureScript", "url": "https://andersmurphy.com/2025/04/07/clojure-realtime-collaborative-web-apps-without-clojurescript.html", "published_at": "2025-04-07T00:00:00+00:00" }, { "id": "01a08727-bef8-7019-a064-8c2b82cc1f60", "title": "Clojure: Synchronous server sent events with virtual threads and channels", "url": "https://andersmurphy.com/2024/10/07/clojure-synchronous-server-sent-events-with-virtual-threads-and-channels.html", "published_at": "2024-10-07T00:00:00+00:00" }, { "id": "01a08727-bef8-7019-a064-8c2b8355edf6", "title": "How to max throughput when pulling data from a third party service", "url": "https://andersmurphy.com/2024/09/26/how-to-max-throughput-when-pulling-data-from-a-third-party-service.html", "published_at": "2024-09-26T00:00:00+00:00" }, { "id": "01a08727-bef8-7019-a064-8c2b83baf6d9", "title": "Clojure: virtual thread and dynamic var performance", "url": "https://andersmurphy.com/2024/05/30/clojure-virtual-thread-dynamic-var-performance.html", "published_at": "2024-05-30T00:00:00+00:00" }, { "id": "01a08727-bef8-7019-a064-8c2b846611bf", "title": "Clojure: structured concurrency and scoped values", "url": "https://andersmurphy.com/2024/05/14/clojure-structured-concurrency-and-scoped-values.html", "published_at": "2024-05-14T00:00:00+00:00" }, { "id": "01a08727-bef8-7019-a064-8c2b853f52df", "title": "Clojure: managing throughput with virtual threads", "url": "https://andersmurphy.com/2024/05/06/clojure-managing-throughput-with-virtual-threads.html", "published_at": "2024-05-06T00:00:00+00:00" }, { "id": "01a08727-bef8-7019-a064-8c2b86159d87", "title": "Clojure: CI with Github Actions and Postgres", "url": "https://andersmurphy.com/2024/04/06/clojure-ci-with-github-actions-and-postgres.html", "published_at": "2024-04-06T00:00:00+00:00" }, { "id": "01a08727-bef8-7019-a064-8c2b86d64135", "title": "Clojure: pruning HTML with clojure.walk", "url": "https://andersmurphy.com/2024/04/01/clojure-pruning-html-with-clojure-walk.html", "published_at": "2024-04-01T00:00:00+00:00" }, { "id": "01a08727-bef8-7019-a064-8c2b86d6a558", "title": "Emacs: streaming radio with emms", "url": "https://andersmurphy.com/2024/03/31/emacs-streaming-radio-with-emms.html", "published_at": "2024-03-31T00:00:00+00:00" }, { "id": "01a08727-bef8-7019-a064-8c2b87921769", "title": "Clojure: the REPL makes contributing to open source easy", "url": "https://andersmurphy.com/2024/03/04/clojure-the-repl-makes-contributing-to-open-source-easy.html", "published_at": "2024-03-04T00:00:00+00:00" }, { "id": "01a08727-bef8-7019-a064-8c2b88053586", "title": "Clojure: clj-kondo datalog linting", "url": "https://andersmurphy.com/2024/01/03/clojure-clj-kondo-datalog-linting.html", "published_at": "2024-01-03T00:00:00+00:00" }, { "id": "01a08727-bef8-7019-a064-8c2b882a3338", "title": "Clojure: virtual threads with ring and jetty", "url": "https://andersmurphy.com/2023/09/16/clojure-virtual-threads-with-ring-and-jetty.html", "published_at": "2023-09-16T00:00:00+00:00" }, { "id": "01a08727-bef8-7019-a064-8c2b88c1e9db", "title": "Clojure: virtual threads with ring and http-kit", "url": "https://andersmurphy.com/2023/09/15/clojure-virtual-threads-with-ring-and-http-kit.html", "published_at": "2023-09-15T00:00:00+00:00" }, { "id": "01a08727-bef8-7019-a064-8c2b89183dde", "title": "Fennel: making PICO-8 games", "url": "https://andersmurphy.com/2023/09/08/fennel-making-pico-8-games.html", "published_at": "2023-09-08T00:00:00+00:00" }, { "id": "01a08727-bef8-7019-a064-8c2b89dc3533", "title": "Clojure: SQLite application defined SQL functions with JDBC", "url": "https://andersmurphy.com/2023/07/16/clojure-sqlite-application-defined-sql-functions-with-jdbc.html", "published_at": "2023-07-16T00:00:00+00:00" }, { "id": "01a08727-bef8-7019-a064-8c2b89ebbbc9", "title": "SQLite: building from source on macOS", "url": "https://andersmurphy.com/2023/07/09/sqlite-building-from-source-on-macos.html", "published_at": "2023-07-09T00:00:00+00:00" }, { "id": "01a08727-bef8-7019-a064-8c2b8a54c3ea", "title": "Clojure: sending emails with postal and Gmail SMTP", "url": "https://andersmurphy.com/2022/06/14/clojure-sending-emails-with-postal-and-gmail-smtp.html", "published_at": "2022-06-14T00:00:00+00:00" }, { "id": "01a08727-bef8-7019-a064-8c2b8ab16e59", "title": "Clojure: pretty print strings", "url": "https://andersmurphy.com/2022/05/22/clojure-pretty-print-strings.html", "published_at": "2022-05-22T00:00:00+00:00" }, { "id": "01a08727-bef8-7019-a064-8c2b8ae433ed", "title": "Clojure: extend honeysql to support postgres 'alter column' and 'add constraint'", "url": "https://andersmurphy.com/2022/05/02/clojure-extend-honeysql-to-support-postgres-alter-column-and-add-constraint.html", "published_at": "2022-05-02T00:00:00+00:00" }, { "id": "01a08727-bef8-7019-a064-8c2b8b2a37c8", "title": "Clojure: removing namespace from keywords in response middleware", "url": "https://andersmurphy.com/2022/03/27/clojure-removing-namespace-from-keywords-in-response-middleware.html", "published_at": "2022-03-27T00:00:00+00:00" }, { "id": "01a08727-bef8-7019-a064-8c2b8bfb9f18", "title": "Clojure: making missing environment variables fail at compile time", "url": "https://andersmurphy.com/2022/03/20/clojure-making-missing-environment-variables-fail-at-compile-time.html", "published_at": "2022-03-20T00:00:00+00:00" }, { "id": "01a08727-bef8-7019-a064-8c2b8cac2a5b", "title": "Heroku: buildpack for Clojure tools", "url": "https://andersmurphy.com/2022/03/19/heroku-buildpack-for-clojure-tools.html", "published_at": "2022-03-19T00:00:00+00:00" }, { "id": "01a08727-bef8-7019-a064-8c2b8cb1909b", "title": "Clojure: compiling java source with tools.build", "url": "https://andersmurphy.com/2021/12/12/clojure-compiling-java-source-with-tools-build.html", "published_at": "2021-12-12T00:00:00+00:00" }, { "id": "01a08727-bef8-7019-a064-8c2b8dace5ca", "title": "Clojure: check if instant happened today at timezone", "url": "https://andersmurphy.com/2021/12/04/clojure-check-if-instant-happened-today-at-timezone.html", "published_at": "2021-12-04T00:00:00+00:00" }, { "id": "01a08727-bef8-7019-a064-8c2b8df7221d", "title": "Emacs: the joy of reducing workflow friction with elisp", "url": "https://andersmurphy.com/2021/11/30/emacs-the-joy-of-reducing-workflow-friction-with-elisp.html", "published_at": "2021-11-30T00:00:00+00:00" }, { "id": "01a08727-bef8-7019-a064-8c2b8e76e9d5", "title": "Emacs: building from source on macOS", "url": "https://andersmurphy.com/2021/11/14/emacs-building-from-source-on-macos.html", "published_at": "2021-11-14T00:00:00+00:00" }, { "id": "01a08727-bef8-7019-a064-8c2b8f348fbf", "title": "Clojure: code highlights for this website", "url": "https://andersmurphy.com/2021/11/11/clojure-code-highlights-for-this-website.html", "published_at": "2021-11-11T00:00:00+00:00" }, { "id": "01a08727-bef8-7019-a064-8c2b8f3560fa", "title": "Clojure: website link checker", "url": "https://andersmurphy.com/2021/10/31/clojure-website-link-checker.html", "published_at": "2021-10-31T00:00:00+00:00" }, { "id": "01a08727-bef8-7019-a064-8c2b8ff1b006", "title": "Clojure: map-occurrence", "url": "https://andersmurphy.com/2021/10/30/clojure-map-occurrence.html", "published_at": "2021-10-30T00:00:00+00:00" }, { "id": "01a08727-bef8-7019-a064-8c2b9049c1d6", "title": "Clojure: ensuring multimethods are required", "url": "https://andersmurphy.com/2021/10/24/clojure-ensuring-multimethods-are-required.html", "published_at": "2021-10-24T00:00:00+00:00" }, { "id": "01a08727-bef8-7019-a064-8c2b9076a972", "title": "Clojure: destructive macros", "url": "https://andersmurphy.com/2021/07/18/clojure-destructive-macros.html", "published_at": "2021-07-18T00:00:00+00:00" }, { "id": "01a08727-bef8-7019-a064-8c2b91724312", "title": "Clojure: crawling Hacker News with re-seq", "url": "https://andersmurphy.com/2021/07/17/clojure-crawling-hackernews-with-re-seq.html", "published_at": "2021-07-17T00:00:00+00:00" }, { "id": "01a08727-bef8-7019-a064-8c2b91f56127", "title": "Clojure: cond-merge revisited", "url": "https://andersmurphy.com/2020/12/30/clojure-cond-merge-revisited.html", "published_at": "2020-12-30T00:00:00+00:00" }, { "id": "01a08727-bef8-7019-a064-8c2b9263e4a9", "title": "Clojure: adding dissoc-in to our cond-merge macro", "url": "https://andersmurphy.com/2020/12/29/clojure-adding-dissoc-in-to-the-cond-merge-macro.html", "published_at": "2020-12-29T00:00:00+00:00" }, { "id": "01a08727-bef8-7019-a064-8c2b934100dd", "title": "Clojure: cond->, deep-merge, remove-nils and the shape of data", "url": "https://andersmurphy.com/2020/12/27/clojure-cond-deep-merge-remove-nils-and-the-shape-of-data.html", "published_at": "2020-12-27T00:00:00+00:00" }, { "id": "01a08727-bef8-7019-a064-8c2b93834007", "title": "Clojure: string similarity", "url": "https://andersmurphy.com/2020/12/13/clojure-string-similarity.html", "published_at": "2020-12-13T00:00:00+00:00" }, { "id": "01a08727-bef8-7019-a064-8c2b93862985", "title": "Clojure: adding compile time errors with macros", "url": "https://andersmurphy.com/2020/11/11/clojure-adding-compile-time-errors-with-macros.html", "published_at": "2020-11-11T00:00:00+00:00" }, { "id": "01a08727-bef8-7019-a064-8c2b9420526a", "title": "Clojure: previous, current and next", "url": "https://andersmurphy.com/2020/10/11/clojure-previous-current-and-next.html", "published_at": "2020-10-11T00:00:00+00:00" }, { "id": "01a08727-bef8-7019-a064-8c2b94ed456a", "title": "Clojure: jdbc using any and all as alternatives to in", "url": "https://andersmurphy.com/2020/09/06/clojure-jdbc-using-any-and-all-as-an-alternative-to-in.html", "published_at": "2020-09-06T00:00:00+00:00" }, { "id": "01a08727-bef8-7019-a064-8c2b95b83464", "title": "Emacs: setting up Apheleia to use Prettier and Zprint", "url": "https://andersmurphy.com/2020/08/20/emacs-setting-up-apheleia-to-use-zprint.html", "published_at": "2020-08-20T00:00:00+00:00" }, { "id": "01a08727-bef8-7019-a064-8c2b9668142d", "title": "Homebrew: write your own brew formula", "url": "https://andersmurphy.com/2020/08/18/homebrew-write-your-own-brew-formula.html", "published_at": "2020-08-18T00:00:00+00:00" }, { "id": "01a08727-bef8-7019-a064-8c2b969655bc", "title": "Clojure: code formatting pre-commit hook with zprint", "url": "https://andersmurphy.com/2020/08/16/clojure-code-formatting-pre-commit-hook-with-zprint.html", "published_at": "2020-08-16T00:00:00+00:00" }, { "id": "01a08727-bef8-7019-a064-8c2b96a6e767", "title": "Clojure: java interop with bean", "url": "https://andersmurphy.com/2020/03/27/clojure-java-interop-with-bean.html", "published_at": "2020-03-27T00:00:00+00:00" }, { "id": "01a08727-bef8-7019-a064-8c2b96df6df1", "title": "Clojure: code as data", "url": "https://andersmurphy.com/2020/03/01/clojure-code-as-data.html", "published_at": "2020-03-01T00:00:00+00:00" }, { "id": "01a08727-bef8-7019-a064-8c2b97348d7c", "title": "Clojure: persistent rate limiting", "url": "https://andersmurphy.com/2020/02/08/clojure-persistent-rate-limiting.html", "published_at": "2020-02-08T00:00:00+00:00" }, { "id": "01a08727-bef8-7019-a064-8c2b976392b7", "title": "Clojure: permutations", "url": "https://andersmurphy.com/2019/12/19/clojure-permutations.html", "published_at": "2019-12-19T00:00:00+00:00" }, { "id": "01a08727-bef8-7019-a064-8c2b97d53185", "title": "Ruby: functional programming", "url": "https://andersmurphy.com/2019/12/07/ruby-functional-programming.html", "published_at": "2019-12-07T00:00:00+00:00" }, { "id": "01a08727-bef8-7019-a064-8c2b97fe22ee", "title": "Clojure: flattening key paths", "url": "https://andersmurphy.com/2019/11/30/clojure-flattening-key-paths.html", "published_at": "2019-11-30T00:00:00+00:00" }, { "id": "01a08727-bef8-7019-a064-8c2b982690aa", "title": "Clojure: manipulating HTML and XML with zippers", "url": "https://andersmurphy.com/2019/11/17/clojure-manipulating-html-and-xml-with-zippers.html", "published_at": "2019-11-17T00:00:00+00:00" }, { "id": "01a08727-bef8-7019-a064-8c2b9921d6cd", "title": "Clojure: sorting tuples", "url": "https://andersmurphy.com/2019/10/27/clojure-sorting-tuples.html", "published_at": "2019-10-27T00:00:00+00:00" }, { "id": "01a08727-bef8-7019-a064-8c2b99bd578b", "title": "Clojure: generating HTML and XML", "url": "https://andersmurphy.com/2019/09/08/clojure-generating-html-and-xml.html", "published_at": "2019-09-08T00:00:00+00:00" }, { "id": "01a08727-bef8-7019-a064-8c2b99f0b2ca", "title": "Clojure: using java.time with clojure.java.jdbc", "url": "https://andersmurphy.com/2019/08/03/clojure-using-java-time-with-jdbc.html", "published_at": "2019-08-03T00:00:00+00:00" }, { "id": "01a08727-bef8-7019-a064-8c2b9a22e440", "title": "Clojure: connection pooling with hikari-cp", "url": "https://andersmurphy.com/2019/07/14/clojure-connection-pooling-with-hikari-cp.html", "published_at": "2019-07-14T00:00:00+00:00" }, { "id": "01a08727-bef8-7019-a064-8c2b9b075875", "title": "Clojure: emoji in strings", "url": "https://andersmurphy.com/2019/07/02/clojure-emoji-in-strings.html", "published_at": "2019-07-02T00:00:00+00:00" }, { "id": "01a08727-bef8-7019-a064-8c2b9b654391", "title": "Clojure: a debug macro for threading macros using tap>", "url": "https://andersmurphy.com/2019/06/04/clojure-a-debug-macro-for-threading-macros-using-tap.html", "published_at": "2019-06-04T00:00:00+00:00" }, { "id": "01a08727-bef9-7153-9356-fd82aee374bb", "title": "Clojure: intro to tap> and accessing private vars", "url": "https://andersmurphy.com/2019/06/01/clojure-intro-to-tap-and-accessing-private-vars.html", "published_at": "2019-06-01T00:00:00+00:00" }, { "id": "01a08727-bef9-7153-9356-fd82af5783c1", "title": "Clojure: sorting a sequence based on another sequence", "url": "https://andersmurphy.com/2019/05/25/clojure-sorting-a-sequence-based-on-another-sequence.html", "published_at": "2019-05-25T00:00:00+00:00" }, { "id": "01a08727-bef9-7153-9356-fd82afadaa06", "title": "Clojure: personalising text", "url": "https://andersmurphy.com/2019/05/18/clojure-personalising-text.html", "published_at": "2019-05-18T00:00:00+00:00" }, { "id": "01a08727-bef9-7153-9356-fd82afcbf929", "title": "Clojure: case conversion and boundaries", "url": "https://andersmurphy.com/2019/05/04/clojure-case-conversion-and-boundaries.html", "published_at": "2019-05-04T00:00:00+00:00" }, { "id": "01a08727-bef9-7153-9356-fd82b067e11e", "title": "Clojure: contains? and some", "url": "https://andersmurphy.com/2019/04/05/clojure-contains-and-some.html", "published_at": "2019-04-05T00:00:00+00:00" }, { "id": "01a08727-bef9-7153-9356-fd82b14eb2de", "title": "Clojure: sorting", "url": "https://andersmurphy.com/2019/03/09/clojure-sorting.html", "published_at": "2019-03-09T00:00:00+00:00" }, { "id": "01a08727-bef9-7153-9356-fd82b15f6a42", "title": "Lisp-1 vs Lisp-2", "url": "https://andersmurphy.com/2019/03/08/lisp-1-vs-lisp-2.html", "published_at": "2019-03-08T00:00:00+00:00" }, { "id": "01a08727-bef9-7153-9356-fd82b182c492", "title": "Clojure: merging maps by key (join)", "url": "https://andersmurphy.com/2019/02/16/clojure-merging-maps-by-key.html", "published_at": "2019-02-16T00:00:00+00:00" }, { "id": "01a08727-bef9-7153-9356-fd82b1f91b94", "title": "Clojure: string interpolation", "url": "https://andersmurphy.com/2019/01/15/clojure-string-interpolation.html", "published_at": "2019-01-15T00:00:00+00:00" }, { "id": "01a08727-bef9-7153-9356-fd82b2632fe6", "title": "Clojure: sending emails with SendGrid", "url": "https://andersmurphy.com/2019/01/06/clojure-sending-emails-with-sendgrid.html", "published_at": "2019-01-06T00:00:00+00:00" }, { "id": "01a08727-bef9-7153-9356-fd82b33a25a3", "title": "Clojure: validating phone numbers", "url": "https://andersmurphy.com/2018/11/24/clojure-validating-phone-numbers.html", "published_at": "2018-11-24T00:00:00+00:00" }, { "id": "01a08727-bef9-7153-9356-fd82b3dc1003", "title": "Clojure: juxt and separate", "url": "https://andersmurphy.com/2018/11/18/clojure-juxt-and-separate.html", "published_at": "2018-11-18T00:00:00+00:00" }, { "id": "01a08727-bef9-7153-9356-fd82b4124f77", "title": "Clojure: map-values and map-keys", "url": "https://andersmurphy.com/2018/11/10/clojure-map-values-and-keys.html", "published_at": "2018-11-10T00:00:00+00:00" }, { "id": "01a08727-bef9-7153-9356-fd82b48f5aaa", "title": "Desert island code: compose and pipe", "url": "https://andersmurphy.com/2018/01/04/desert-island-code-compose-and-pipe.html", "published_at": "2018-01-04T00:00:00+00:00" }, { "id": "01a08727-bef9-7153-9356-fd82b4bb6fd4", "title": "Desert island code: curry", "url": "https://andersmurphy.com/2018/01/02/desert-island-code-curry.html", "published_at": "2018-01-02T00:00:00+00:00" }, { "id": "01a08727-bef9-7153-9356-fd82b53aa8ba", "title": "Desert island code: reduce map and filter", "url": "https://andersmurphy.com/2017/12/28/desert-island-code-reduce-map-and-filter.html", "published_at": "2017-12-28T00:00:00+00:00" }, { "id": "01a08727-bef9-7153-9356-fd82b56173fe", "title": "Managing obfuscation with annotations", "url": "https://andersmurphy.com/2016/10/08/managing-obfuscation-with-annotations.html", "published_at": "2016-10-08T00:00:00+00:00" }, { "id": "01a08727-bef9-7153-9356-fd82b5cc92be", "title": "Using Proguard instead of multidex", "url": "https://andersmurphy.com/2016/05/19/using-proguard-instead-of-multidex.html", "published_at": "2016-05-19T00:00:00+00:00" }, { "id": "01a08727-bef9-7153-9356-fd82b6ac86fd", "title": "Signing your app", "url": "https://andersmurphy.com/2016/05/17/signing-your-app.html", "published_at": "2016-05-17T00:00:00+00:00" }, { "id": "01a08727-bef9-7153-9356-fd82b7327637", "title": "Introduction to Kotlin on Android", "url": "https://andersmurphy.com/2015/10/06/introduction-to-kotlin-on-android.html", "published_at": "2015-10-06T00:00:00+00:00" }, { "id": "01a08727-bef9-7153-9356-fd82b73c8387", "title": "Setting up Retrolambda", "url": "https://andersmurphy.com/2015/09/16/setting-up-retrolambda.html", "published_at": "2015-09-16T00:00:00+00:00" }, { "id": "01a08727-bef9-7153-9356-fd82b8245b3a", "title": "Enabling multidex on Android", "url": "https://andersmurphy.com/2015/09/10/enabling-multidex-on-android.html", "published_at": "2015-09-10T00:00:00+00:00" }, { "id": "01a08727-bef9-7153-9356-fd82b8f3ef15", "title": "Binding Android views with Butter Knife", "url": "https://andersmurphy.com/2015/09/02/binding-android-views-with-butter-knife.html", "published_at": "2015-09-02T00:00:00+00:00" }, { "id": "01a08727-bef9-7153-9356-fd82b93e6b87", "title": "Advantages of an Android free zone", "url": "https://andersmurphy.com/2015/08/27/advantages-of-an-android-free-zone.html", "published_at": "2015-08-27T00:00:00+00:00" } ] posts Claim your blog
Back to anders murphy
Blog · corpus.blog/blogs/andersmurphy.com/posts

anders murphy

andersmurphy.com

2026

2025

2024

2023

2022

2021

2020

2019

2018

2017

2016

2015