<?xml version='1.0' encoding='UTF-8'?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><atom:link href="https://corfield.org/" rel="self" type="application/rss+xml"/><title>An Architect's View</title><link>https://corfield.org/</link><description>Clojure, Software Design, Frameworks and more...</description><lastBuildDate>Wed, 11 Mar 2026 22:06:33 -0400</lastBuildDate><generator>clj-rss</generator><item><guid>https://corfield.org/blog/2025/08/08/deps/</guid><link>https://corfield.org/blog/2025/08/08/deps/</link><title>The power of the :deps alias</title><description>Updated 2025-10-18, for Clojure CLI 1.12.2.1571, which added the ability to prep a tool.
Updated 2025-08-14 for Clojure CLI 1.12.1.1561, which added the basis function.Most of us who use the Clojure CLI are familiar with the -M (main), -X
(exec), and -T (tool) options, and may have used clojure -X:deps tree at
some point to figure out version conflicts in our dependencies. The :deps
alias can do a lot more, so let's take a look!</description><pubDate>Fri, 08 Aug 2025 00:00:00 -0400</pubDate></item><item><guid>https://corfield.org/blog/2025/03/12/lazytest/</guid><link>https://corfield.org/blog/2025/03/12/lazytest/</link><title>Migrating to LazyTest</title><description>I've been using the Expectations
testing library since early 2019 -- over six years. I love the expressiveness of
it, compared to clojure.test, and it exists because "Classic Expectations"
was not compatible with clojure.test tooling. At work, our tests use a
mixture of clojure.test and Expectations, but in my open source projects,
I've mostly stuck with clojure.test for familiarity's sake for contributors.Being compatible with clojure.test comes at a price, though. Expectations
uses macros to produce clojure.test-compatible code under the hood, so it
is limited by the same reporting as clojure.test and the same potential
problems with tooling that tries to override parts of clojure.test's
behavior -- namely that multiple tools do not play well together, so I've
had to avoid "improving" the expressiveness or reporting in ways that would
break compatibility with that tooling.</description><pubDate>Wed, 12 Mar 2025 00:00:00 -0400</pubDate></item><item><guid>https://corfield.org/blog/2024/11/09/conj-2024/</guid><link>https://corfield.org/blog/2024/11/09/conj-2024/</link><title>Clojure/conj 2024</title><description>After last year's regular posts about my
Clojurists Together-funded work on
clojure-doc.org and other projects, and the end
of my monorepo/polylith series,
I've mostly taken a break from blogging -- and from my open source work, to be
honest. I've been focusing on my day job and on some personal stuff.I attended Clojure/conj 2024 last month and
wanted to write about the event and the talks I attended. It's been eleven
years since Conj was last at the George Washington Masonic Memorial in Alexandria,
and I'd forgotten what a climb it is, up that hill! My watch says I got over
9,000 steps each day going back and forth from the hotel to the venue.</description><pubDate>Sat, 09 Nov 2024 00:00:00 -0500</pubDate></item><item><guid>https://corfield.org/blog/2023/12/31/long-term-funding-6/</guid><link>https://corfield.org/blog/2023/12/31/long-term-funding-6/</link><title>Long-Term Funding, Update #6</title><description>In my previous Long-Term Funding update
I said I would review and update of the
"cookbooks" section and make another pass of "TBD" items in the "language"
section.</description><pubDate>Mon, 25 Dec 2023 00:00:00 -0500</pubDate></item><item><guid>https://corfield.org/blog/2023/10/31/long-term-funding-5/</guid><link>https://corfield.org/blog/2023/10/31/long-term-funding-5/</link><title>Long-Term Funding, Update #5</title><description>In my previous Long-Term Funding update
I said I would review/overhaul the "ecosystem" and "tutorials" sections
(once I'd finished the "language" section).</description><pubDate>Sat, 28 Oct 2023 00:00:00 -0400</pubDate></item><item><guid>https://corfield.org/blog/2023/08/31/long-term-funding-4/</guid><link>https://corfield.org/blog/2023/08/31/long-term-funding-4/</link><title>Long-Term Funding, Update #4</title><description>In my previous Long-Term Funding update
I said I would review/overhaul the "ecosystem" and "tutorials" sections.</description><pubDate>Wed, 30 Aug 2023 00:00:00 -0400</pubDate></item><item><guid>https://corfield.org/blog/2023/07/15/deps-edn-monorepo-11/</guid><link>https://corfield.org/blog/2023/07/15/deps-edn-monorepo-11/</link><title>deps.edn and monorepos XI (Polylith)</title><description>This is part of an ongoing series of blog posts about our ever-evolving use of the Clojure CLI,
deps.edn, and Polylith, with our monorepo at
World Singles Networks.</description><pubDate>Sat, 15 Jul 2023 00:00:00 -0400</pubDate></item><item><guid>https://corfield.org/blog/2023/06/30/long-term-funding-3/</guid><link>https://corfield.org/blog/2023/06/30/long-term-funding-3/</link><title>Long-Term Funding, Update #3</title><description>In my previous Long-Term Funding update
I said I would review/overhaul the Libraries pages (both authoring and the directory)
and write the tools.build cookbook.The library authoring guide
has been rewritten to use the Clojure CLI, deps-new, and deps-deploy and
was well-received by the community, who provided some useful feedback that I
have also incorporated into the guide.The information from the library directory has been integrated into
The Clojure Toolbox
via a couple of Pull Requests that
added optional tool-tip descriptions
and libraries that were on clojure-doc
but missing from the Toolbox. Thanks to James Reeves for accepting those PRs!What else did I get done?</description><pubDate>Thu, 29 Jun 2023 00:00:00 -0400</pubDate></item><item><guid>https://corfield.org/blog/2023/04/30/long-term-funding-2/</guid><link>https://corfield.org/blog/2023/04/30/long-term-funding-2/</link><title>Long-Term Funding, Update #2</title><description>In my previous Long-Term Funding update
I said that I planned "to review and/or overhaul the Getting Started,
Introduction, and Web Development sections, with a focus on the latter."
(of the clojure-doc.org website).I mostly achieved that goal but didn't get to the additional goal I set of writing
a tools.build cookbook. I have sketched out the topics I hope to cover in
that cookbook, however.How did the past two months go?</description><pubDate>Sun, 30 Apr 2023 00:00:00 -0400</pubDate></item><item><guid>https://corfield.org/blog/2023/04/16/calva-joyride-portal/</guid><link>https://corfield.org/blog/2023/04/16/calva-joyride-portal/</link><title>Calva, Joyride, and Portal</title><description>Back in December, 2022, I described my original Calva, Joyride, and Portal setup.
I've been very happy with it all but, of course, I continue to tweak and update
my development environment and my projects, and now that
Clojure 1.12.0 Alpha 2 is available
with add-libs-style functionality built-in, I've updated various projects
and my dot-clojure
and vscode-calva-setup
GitHub repos to take advantage of that, so I figured an updated version of that post
was warranted.My development environment is VS Code, running on Windows, with all my
Clojure-related files and processes running on WSL2 (Ubuntu).
I use Calva,
Portal,
and Joyride
to enhance and automate my day-to-day work.</description><pubDate>Sun, 16 Apr 2023 00:00:00 -0400</pubDate></item><item><guid>https://corfield.org/blog/2023/02/28/long-term-funding-1/</guid><link>https://corfield.org/blog/2023/02/28/long-term-funding-1/</link><title>Long-Term Funding, Update #1</title><description>As part of Clojurists Together's Long-Term Funding for 2023
I talked about working on clojure-doc.org
which I had resurrected a few years ago, as a GitHub Pages project,
powered by Cryogen.</description><pubDate>Tue, 28 Feb 2023 00:00:00 -0500</pubDate></item><item><guid>https://corfield.org/blog/2022/12/18/calva-joyride-portal/</guid><link>https://corfield.org/blog/2022/12/18/calva-joyride-portal/</link><title>Calva, Joyride, and Portal</title><description>An updated version of this post describes my latest Calva, Joyride, and Portal setup.I've mentioned in several posts over the years that I switched my
development setup from Emacs to Atom, initially with ProtoREPL and later
with Chlorine, and then to VS Code, initially with Clover (a port of
Chlorine) and more recently with
Calva.
There were several detours along the way, but that is the overall arc.I've also mentioned a couple of times that I use
Portal
now, as an extension inside VS Code (after previously using Reveal and, before
that, Cognitect's REBL).I've also published my
VS Code and Calva setup
files on GitHub.But I haven't really talked about what that experience is like on a
day-to-day basis or any specifics of my integrated workflow.</description><pubDate>Sun, 18 Dec 2022 00:00:00 -0500</pubDate></item><item><guid>https://corfield.org/blog/2022/12/07/deps-edn-monorepo-10/</guid><link>https://corfield.org/blog/2022/12/07/deps-edn-monorepo-10/</link><title>deps.edn and monorepos X (Polylith)</title><description>This is part of an ongoing series of blog posts about our ever-evolving use of the Clojure CLI,
deps.edn, and Polylith, with our monorepo at
World Singles Networks.</description><pubDate>Wed, 07 Dec 2022 00:00:00 -0500</pubDate></item><item><guid>https://corfield.org/blog/2022/11/05/deps-edn-monorepo-9/</guid><link>https://corfield.org/blog/2022/11/05/deps-edn-monorepo-9/</link><title>deps.edn and monorepos IX (Polylith)</title><description>This is part of an ongoing series of blog posts about our ever-evolving use of the Clojure CLI,
deps.edn, and Polylith, with our monorepo at
World Singles Networks.</description><pubDate>Sat, 05 Nov 2022 00:00:00 -0400</pubDate></item><item><guid>https://corfield.org/blog/2022/10/30/social-media/</guid><link>https://corfield.org/blog/2022/10/30/social-media/</link><title>Social Media Revisited</title><description>About a year ago I posted that I had deleted both my Twitter and Facebook accounts.In March, my wife &amp; I visited friends and family in England (for the first time
in three years) as my mother had been diagnosed with AAA (abdominal
aortic aneurysm) and it had grown substantially -- the doctor has given her
"months" to live, although she's already lasted longer than that!</description><pubDate>Sun, 30 Oct 2022 00:00:00 -0400</pubDate></item><item><guid>https://corfield.org/blog/2021/11/28/deps-edn-monorepo-8/</guid><link>https://corfield.org/blog/2021/11/28/deps-edn-monorepo-8/</link><title>deps.edn and monorepos VIII (Polylith)</title><description>This is part of an ongoing series of blog posts about our ever-evolving use of the Clojure CLI,
deps.edn, and Polylith, with our monorepo at
World Singles Networks.</description><pubDate>Sun, 28 Nov 2021 00:00:00 -0500</pubDate></item><item><guid>https://corfield.org/blog/2021/11/14/clojure-doc/</guid><link>https://corfield.org/blog/2021/11/14/clojure-doc/</link><title>The new clojure-doc web site</title><description>Back when I was working on the clojure.java.jdbc Contrib library, I moved
its documentation to clojure-doc.org so that the community could contribute
to it, without the CLA that covers contributions to Contrib itself. Over time
I became a general contributor to clojuredocs/guides which was the repository
behind the clojure-doc.org web site.Unfortunately, about three years ago, the infrastructure that runs clojure-doc.org
became inaccessible to the maintainers of the site so, although pull requests
continued to be accepted, the site itself could no longer be updated. I talked
with Michael Klishin, the original creator of the site, about moving it to GitHub
pages but we never quite got around to it. Until today.</description><pubDate>Sun, 14 Nov 2021 00:00:00 -0500</pubDate></item><item><guid>https://corfield.org/blog/2021/11/10/social-media/</guid><link>https://corfield.org/blog/2021/11/10/social-media/</link><title>Social Media</title><description>I've been on both Twitter and Facebook for a very long time
and it definitely has had its ups and downs. A couple of
times over the last six years, I've felt the need to take
a complete break from Facebook and have deactivated my
account for up to a couple of months each time. I've also
taken several breaks from Twitter, although I didn't deactivate
my account.I've finally decided that the cons are outweighing the pros
for me on social media so I have shutdown (deleted) both my
Twitter account and my Facebook account. Permanently.</description><pubDate>Wed, 10 Nov 2021 00:00:00 -0500</pubDate></item><item><guid>https://corfield.org/blog/2021/10/13/deps-edn-monorepo-7/</guid><link>https://corfield.org/blog/2021/10/13/deps-edn-monorepo-7/</link><title>deps.edn and monorepos VII (Polylith)</title><description>This is part of an ongoing series of blog posts about our ever-evolving use of the Clojure CLI,
deps.edn, and Polylith, with our monorepo at
World Singles Networks.</description><pubDate>Wed, 13 Oct 2021 00:00:00 -0400</pubDate></item><item><guid>https://corfield.org/blog/2021/10/01/deps-edn-monorepo-6/</guid><link>https://corfield.org/blog/2021/10/01/deps-edn-monorepo-6/</link><title>deps.edn and monorepos VI (Polylith)</title><description>This is part of an ongoing series of blog posts about our ever-evolving use of the Clojure CLI,
deps.edn, and Polylith, with our monorepo at
World Singles Networks.</description><pubDate>Fri, 01 Oct 2021 00:00:00 -0400</pubDate></item><item><guid>https://corfield.org/blog/2021/08/25/deps-edn-monorepo-5/</guid><link>https://corfield.org/blog/2021/08/25/deps-edn-monorepo-5/</link><title>deps.edn and monorepos V (Polylith)</title><description>This is part of an ongoing series of blog posts about our ever-evolving use of the Clojure CLI,
deps.edn, and Polylith, with our monorepo at
World Singles Networks.</description><pubDate>Wed, 25 Aug 2021 00:00:00 -0400</pubDate></item><item><guid>https://corfield.org/blog/2021/08/02/tools-build/</guid><link>https://corfield.org/blog/2021/08/02/tools-build/</link><title>tools.build</title><description>With the recent release of tools.build,
I wanted to provide a quick example of using it for a CI-like pipeline.tools.build is focused on "building" things and when the subject has come up
on Slack, the feedback has been that the CLI already has a good story for running
tests etc, and the consensus seems to be that running multiple CLI commands is
the intended usage.</description><pubDate>Mon, 02 Aug 2021 00:00:00 -0400</pubDate></item><item><guid>https://corfield.org/blog/2021/07/21/deps-edn-monorepo-4/</guid><link>https://corfield.org/blog/2021/07/21/deps-edn-monorepo-4/</link><title>deps.edn and monorepos IV</title><description>This is part of an ongoing series of blog posts about our ever-evolving use of the Clojure CLI,
deps.edn, and Polylith, with our monorepo at
World Singles Networks.</description><pubDate>Sat, 24 Jul 2021 00:00:00 -0400</pubDate></item><item><guid>https://corfield.org/blog/2021/06/06/deps-edn-monorepo-3/</guid><link>https://corfield.org/blog/2021/06/06/deps-edn-monorepo-3/</link><title>deps.edn and monorepos III (Polylith)</title><description>Back in April, I talked about us dipping into Polylith at work in deps.edn and monorepos II,
and also our planned migration away from clj-http. Since then, we've completed the migration to
http-kit and we've also migrated away from clj-time (which is deprecated, because it is based on Joda Time). We've also started
refactoring our subprojects into Polylith components. This is another periodic update on where we are in our journey.</description><pubDate>Sun, 06 Jun 2021 00:00:00 -0400</pubDate></item><item><guid>https://corfield.org/blog/2021/04/21/deps-edn-monorepo-2/</guid><link>https://corfield.org/blog/2021/04/21/deps-edn-monorepo-2/</link><title>deps.edn and monorepos II</title><description>A couple of months ago, I wrote about our use of deps.edn with our monorepo at work.
I've updated that post to reflect changes we've made recently and I'm going to talk
in more detail about those changes in this post.</description><pubDate>Wed, 21 Apr 2021 00:00:00 -0400</pubDate></item><item><guid>https://corfield.org/blog/2021/03/25/little-things/</guid><link>https://corfield.org/blog/2021/03/25/little-things/</link><title>It's the "Little Things"...</title><description>Our Clojure team is a big fan of reducing dependencies and, in particular,
avoiding dependencies that are known to be troublesome (such as the special
circle of hell that is all the different versions of the Jackson JSON libraries).</description><pubDate>Thu, 25 Mar 2021 00:00:00 -0400</pubDate></item><item><guid>https://corfield.org/blog/2021/02/23/deps-edn-monorepo/</guid><link>https://corfield.org/blog/2021/02/23/deps-edn-monorepo/</link><title>deps.edn and monorepos</title><description>At World Singles Networks llc we have been using
a monorepo for several years and it has taken us several iterations to settle on a
structure that works well with the Clojure CLI and deps.edn.Updated April 21st, 2021 to reflect recent changes in our setup.
See deps.edn and monorepos II
for more details.</description><pubDate>Tue, 23 Feb 2021 00:00:00 -0500</pubDate></item><item><guid>https://corfield.org/blog/2020/11/24/talks-clojures-superpower/</guid><link>https://corfield.org/blog/2020/11/24/talks-clojures-superpower/</link><title>Talks: Clojure's Superpower</title><description>For about a decade, I used to speak regularly at conferences and user groups around the world. In 2013, I decided to take a break and just enjoy attending events (here's a small selection of my presentations covering the last three years of that decade).</description><pubDate>Tue, 24 Nov 2020 00:00:00 -0500</pubDate></item><item><guid>https://corfield.org/blog/2020/11/09/vscode-clover/</guid><link>https://corfield.org/blog/2020/11/09/vscode-clover/</link><title>VS Code and Clover</title><description>I've written before about how I switched from Emacs to Atom
at the end of 2016,
where I initially used ProtoREPL (which is no longer maintained)
and then I switched to Chlorine
at the end of 2018. I've been very impressed with the work that
Mauricio Szabo has done on Chlorine, adding a way to
extend the functionality using ClojureScript
so that you can add your own commands --
as I do in my atom-chlorine-setup repo
so that I can easily work with Reveal
(and previously with Cognitect's REBL). I've posted a few
Atom/Chlorine/REBL videos to YouTube
showing my workflow.</description><pubDate>Mon, 09 Nov 2020 00:00:00 -0500</pubDate></item><item><guid>https://corfield.org/blog/2020/10/25/next-jdbc/</guid><link>https://corfield.org/blog/2020/10/25/next-jdbc/</link><title>next.jdbc Compendium II</title><description>seancorfield/next.jdbc 1.1.610Updated 2022-09-12 to clarify camel-snake-kebab usage in more recent next.jdbc versions.</description><pubDate>Sat, 24 Oct 2020 00:00:00 -0400</pubDate></item><item><guid>https://corfield.org/blog/2020/05/23/next-jdbc/</guid><link>https://corfield.org/blog/2020/05/23/next-jdbc/</link><title>next.jdbc Compendium</title><description>seancorfield/next.jdbc 1.0.445This morning I released 1.0.445 and realized it's the sixth release since I last mentioned it in a blog post, so I thought it would be helpful to summarize all of the changes made so far in 2020. 1.0.13 came out at the end of December and I decided to switch from MAJOR.MINOR.PATCH versioning to MAJOR.MINOR.COMMITS versioning since I'd already made the commitment to no breaking changes -- only fixative/accretive changes -- when the library originally moved from Alpha to Beta a year ago.</description><pubDate>Sat, 23 May 2020 00:00:00 -0400</pubDate></item><item><guid>https://corfield.org/blog/2019/12/31/releases/</guid><link>https://corfield.org/blog/2019/12/31/releases/</link><title>Happy New Releases!</title><description>Wrapping Up 2019It's been a while since I blogged about the projects I maintain so I figured New Year's Eve 2019 was a good time to provide an update!</description><pubDate>Tue, 31 Dec 2019 00:00:00 -0500</pubDate></item><item><guid>https://corfield.org/blog/2019/09/13/using-spec/</guid><link>https://corfield.org/blog/2019/09/13/using-spec/</link><title>How do you use clojure.spec</title><description>An interesting Clojure question came up on Quora recently and I decided that my answer to "how do you use clojure.spec" there should probably be a blog post so that folks without a Quora account can still read it. [If you do have a Quora account, feel free to read it there instead and upvote it!]The original question on Quora was:</description><pubDate>Fri, 13 Sep 2019 00:00:00 -0400</pubDate></item><item><guid>https://corfield.org/blog/2019/08/07/releases/</guid><link>https://corfield.org/blog/2019/08/07/releases/</link><title>Release! Release! Release!</title><description>Lots of ReleasesOver the last week or so I've released minor updates to several of the projects I maintain, so I thought it would be nice to have a summary blog post rather than a scattering of minor announcements.</description><pubDate>Wed, 07 Aug 2019 00:00:00 -0400</pubDate></item><item><guid>https://corfield.org/blog/2019/07/04/next-jdbc/</guid><link>https://corfield.org/blog/2019/07/04/next-jdbc/</link><title>Next.JDBC to 1.0.0 and Beyond!</title><description>next.jdbc 1.0.0 and 1.0.1First off, seancorfield/next.jdbc 1.0.0 was released on June 13th, 2019 (and I announced it on ClojureVerse but did not blog about it), and yesterday I released seancorfield/next.jdbc 1.0.1 which is mostly documentation improvements.</description><pubDate>Thu, 04 Jul 2019 00:00:00 -0400</pubDate></item><item><guid>https://corfield.org/blog/2019/06/04/next-jdbc/</guid><link>https://corfield.org/blog/2019/06/04/next-jdbc/</link><title>Next.JDBC Release Candidate 1</title><description>seancorfield/next.jdbc 1.0.0-rc1next.jdbc -- the "next generation" of clojure.java.jdbc -- is a modern Clojure wrapper for JDBC. The first Release Candidate is now available to test -- containing only accretive and fixative changes from Beta 1. The API should be considered stable enough for production usage.</description><pubDate>Tue, 04 Jun 2019 00:00:00 -0400</pubDate></item><item><guid>https://corfield.org/blog/2019/05/25/next-jdbc/</guid><link>https://corfield.org/blog/2019/05/25/next-jdbc/</link><title>Next.JDBC Beta 1</title><description>seancorfield/next.jdbc 1.0.0-beta1next.jdbc -- the "next generation" of clojure.java.jdbc -- is a modern Clojure wrapper for JDBC. Beta 1 is now available to test -- only accretive and fixative changes will be made from this point on, so the API should be considered stable enough for production usage.</description><pubDate>Sat, 25 May 2019 00:00:00 -0400</pubDate></item><item><guid>https://corfield.org/blog/2019/04/21/next-jdbc/</guid><link>https://corfield.org/blog/2019/04/21/next-jdbc/</link><title>Next.JDBC</title><description>seancorfield/next.jdbc 1.0.0-alpha8I've talked about this in a few groups -- it's been a long time coming. This is the "next generation" of clojure.java.jdbc -- a modern wrapper for JDBC, that focuses on reduce/transducers, qualified-keywords, and datafy/nav support (so, yes, it requires Clojure 1.10).</description><pubDate>Sun, 21 Apr 2019 00:00:00 -0400</pubDate></item><item><guid>https://corfield.org/blog/2019/02/11/clojurians-slack-alternatives/</guid><link>https://corfield.org/blog/2019/02/11/clojurians-slack-alternatives/</link><title>Clojurians Slack Alternatives</title><description>Daniel Compton has continued his excellent trend of
writing an analysis of the State of Clojure survey comments
and one of the comments in his Community section stood out for me:"I suggest moving off of slack to a more accessible chat system. Losing history is a bad thing. Check out discord or matrix or gitter or mattermark or any other number of tools made for this purpose."</description><pubDate>Mon, 11 Feb 2019 00:00:00 -0500</pubDate></item><item><guid>https://corfield.org/blog/2019/01/22/atom-chlorine-windows/</guid><link>https://corfield.org/blog/2019/01/22/atom-chlorine-windows/</link><title>Atom, Chlorine, and Windows</title><description>About a month ago, I was praising Chlorine, the new Clojure package for
Atom and I've been using
it, day-in, day-out, for all my Clojure development. On a Mac, that's
straightforward because I start a Socket REPL on the Mac and I run Atom on the
Mac so when I connect via Chlorine and issue the Chlorine: Load File
command (via Ctrl-, f in my keymap), it sends (load-file "/path/to/file.clj")
to the REPL, for the file being edited, and that is evaluated and loads the
source from disk and compiles it. On Windows... Well, on Windows
there are a few obstacles to this workflow.The first obstacle (for me) is that clj doesn't run on Windows and that's
what I use for everything Clojure on a Mac and on Linux now. There's a
PowerShell implementation in progress but Windows has always been a bit of a
second-class citizen so it's still a ways off. But Windows has WSL (Windows
Subsystem for Linux) so I can
and do run (user-mode) Ubuntu on my Windows laptop and I do all of my Clojure
work on that...</description><pubDate>Tue, 22 Jan 2019 00:00:00 -0500</pubDate></item><item><guid>https://corfield.org/blog/2018/12/19/atom-chlorine/</guid><link>https://corfield.org/blog/2018/12/19/atom-chlorine/</link><title>Chlorine: Clojure integration for Atom</title><description>I've been using the Atom editor for about two years now.
I switched from Emacs after Clojure/conj 2016, having seen
Jason Gilman's talk about ProtoREPL [video].
It may sound like
heresy, but I'd never been happy with Emacs -- not 17.x back when I first
started using it, not 18.x, not 19.x when I first stopped using it, nor 24.x onward
when I came back to it after learning Clojure a few decades later. I built
several configurations from scratch, I tried several "curated" configurations,
none of them felt like "home". Emacs just leeched too much of my development
time for my tastes. I wanted a simple, modern text editor, that offered a wide
variety of "plugins" and supported all the languages I used, with a sane set of
defaults. Atom -- with ProtoREPL -- seemed to be exactly what I was looking for!And for two years, it has been my day-to-day development environment.</description><pubDate>Wed, 19 Dec 2018 00:00:00 -0500</pubDate></item><item><guid>https://corfield.org/blog/2018/12/06/null-nilable-optionality/</guid><link>https://corfield.org/blog/2018/12/06/null-nilable-optionality/</link><title>SQL NULL, s/nilable, and optionality</title><description>Rich Hickey gave a very thought-provoking talk at Clojure/conj 2018
called Maybe Not, where he mused
on optionality and how we represent the absence of a value.His talk covered many things, including how clojure.spec/keys currently
complects both structure and optionality (and his thoughts on fixing that
in a future version of clojure.spec), but his mention of s/nilable was what
triggered an "ah-ha!" moment for me.</description><pubDate>Thu, 06 Dec 2018 00:00:00 -0500</pubDate></item><item><guid>https://corfield.org/blog/2018/12/03/datafy-nav/</guid><link>https://corfield.org/blog/2018/12/03/datafy-nav/</link><title>Clojure 1.10's datafy and nav</title><description>One of the more mysterious new features in Clojure 1.10 seems to be the pairing of datafy and nav (and their underlying protocols, Datafiable and Navigable). Interest in these new functions has been piqued after Stuart Halloway showed off REBL at Clojure/conj (video). Stu presented this functionality as "generalized laziness": datafy produces a "data representation" of things and nav lets you (lazily) navigate around that data.The REBL "is a graphical, interactive tool for browsing Clojure data". And in Clojure we're used to the concept of "it's just data" so a graphical browser might sound useful but not exactly earthshaking. But REBL is just an example of what can be built with the new functionality in 1.10 and, indeed, Stu's claim of "generalized laziness" is well made but a little hard to grok until you actually build something with the new protocols and functions.</description><pubDate>Mon, 03 Dec 2018 00:00:00 -0500</pubDate></item><item><guid>https://corfield.org/blog/2018/10/25/clojure-conj/</guid><link>https://corfield.org/blog/2018/10/25/clojure-conj/</link><title>Excited About Clojure/conj</title><description>It has been a crazy busy year, both at work and personally, and it's hard for me to believe my last blog post was in April!Clojure/conj is coming up fast and the schedule was posted today, which has made me even more excited about it. Here's a run down of the sessions I plan to attend -- I'll write up my thoughts on everything shortly after the conference.</description><pubDate>Thu, 25 Oct 2018 00:00:00 -0400</pubDate></item><item><guid>https://corfield.org/blog/2018/04/18/all-the-paths/</guid><link>https://corfield.org/blog/2018/04/18/all-the-paths/</link><title>All The Paths</title><description>With the recent arrival of clj and tools.deps.alpha as a "standard" lightweight way to run Clojure programs and the seed for tooling based on deps.edn dependency files, it's time to take a look at the terminology used across Clojure's various tools.Running Java/JVM Programs</description><pubDate>Wed, 18 Apr 2018 00:00:00 -0400</pubDate></item><item><guid>https://corfield.org/blog/2017/11/17/boot-localrepo/</guid><link>https://corfield.org/blog/2017/11/17/boot-localrepo/</link><title>Boot localrepo?</title><description>Sometimes you just can't help having a "random 3rd part JAR file" in your project. The best practice is, of course, to upload it to your preferred Maven-compatible repository via whatever service or software you use for all your in-house shared artifacts. But sometimes you just want to play with that JAR file locally, or you haven't gotten around to running your own shared repository.If you're using Leiningen, you'll probably reach for the excellent lein-localrepo which lets you "install" your random JAR file into your local Maven cache (in ~/.m2/repository).</description><pubDate>Fri, 17 Nov 2017 00:00:00 -0500</pubDate></item><item><guid>https://corfield.org/blog/2017/07/17/clojure-java-jdbc-0-7-0/</guid><link>https://corfield.org/blog/2017/07/17/clojure-java-jdbc-0-7-0/</link><title>Release 0.7.0 of clojure.java.jdbc</title><description>The stable 0.7.0 release of java.jdbc -- the Clojure Contrib JDBC library -- has been baking for over a year, across of a trail of alpha and beta releases, and is now, finally, available!While you could read the java.jdbc Change Log to figure out what is new in this release, I thought it would be easier to consolidate all the changes into a blog post, with changes organized by category, and provide justification for the various changes.</description><pubDate>Mon, 17 Jul 2017 00:00:00 -0400</pubDate></item><item><guid>https://corfield.org/blog/2017/01/19/boot-new-moved/</guid><link>https://corfield.org/blog/2017/01/19/boot-new-moved/</link><title>seancorfield/boot-new has moved to boot/new</title><description>I'm pleased to announce that the "Boot new" task formerly known as seancorfield/boot-new has moved to the Boot organization, as boot-clj/boot-new and that the group/artifact ID is now boot/new.You can use this to easily create a new Boot-based project:</description><pubDate>Thu, 19 Jan 2017 00:00:00 -0500</pubDate></item><item><guid>https://corfield.org/blog/2016/07/29/clojure-new-relic-slow-startup/</guid><link>https://corfield.org/blog/2016/07/29/clojure-new-relic-slow-startup/</link><title>Clojure, New Relic, and Slow Application Startup</title><description>A couple of years ago, I blogged about instrumenting Clojure for New Relic monitoring and we've generally been pretty happy with New Relic as a service overall. A while back, we had tried to update our New Relic Agent (used with our Tomcat-based web applications) from 3.21.0 to 3.25.0 and we ran into exceedingly long application start times, so we rolled back and continued on with 3.21.0. Recently, we decided to update the Agent to 3.30.1 to take advantage of advertised performance improvements and security enhancements. Once again we ran into exceedingly long application start times.An application that took just over four minutes to start up fully with 3.21.0 was taking around forty minutes to start up with 3.30.1 -- an order of magnitude slower!</description><pubDate>Fri, 29 Jul 2016 00:00:00 -0400</pubDate></item><item><guid>https://corfield.org/blog/2016/07/18/start-your-engine/</guid><link>https://corfield.org/blog/2016/07/18/start-your-engine/</link><title>Start Your Engine</title><description>Today I'm inspired by the latest issue of Eric Normand's Clojure Gazette which talks about why his "Joy of Programming" comes from learning and exploration.I got into programming as a child because I was curious about solving puzzles and problems: given the (relatively) limited vocabulary of a programming language and its input and output features, and some interesting problem that came to mind, can I solve it in a usable (and hopefully elegant) way?</description><pubDate>Mon, 18 Jul 2016 00:00:00 -0400</pubDate></item><item><guid>https://corfield.org/blog/2016/06/17/more-boot/</guid><link>https://corfield.org/blog/2016/06/17/more-boot/</link><title>More Boot</title><description>Back in February I talked about boot-new and talked about a "future 1.0.0 release". We're not there yet, but generators got added in release 0.4.0 and, in the four minor releases since, the focus has been on refactoring to match the core Boot task structure and improving compatibility with Leiningen templates. At World Singles, we've continued to extend our usage of Boot until we have only a couple of Ant tasks left and we expect those to be within Boot's reach soon. In this post, I want to cover some of the things we've been doing with Boot recently.I feel I should start with an apology for the "radio silence" since February -- it's a combination of work being extremely engaging (and busy!) and some aspects of my personal life going somewhat to hell in a handbasket... But things have improved lately (thankfully!) and I hope to be more regular in my blogging (I certainly have a decent queue of article ideas in my head!).</description><pubDate>Fri, 17 Jun 2016 00:00:00 -0400</pubDate></item><item><guid>https://corfield.org/blog/2016/02/02/boot-new/</guid><link>https://corfield.org/blog/2016/02/02/boot-new/</link><title>boot-new</title><description>In my previous three blog posts about Boot -- Rebooting Clojure, Building On Boot, and Testing With Boot -- I looked at why World Singles decided to switch from Leiningen to Boot, as well discussing one of the missing pieces for us (testing). Once I had boot-expectations written, I was casting around for other missing pieces in the ecosystem and one glaring one was the lack of something to generate new projects from templates.Leiningen has long-supported the generation of new projects from templates and it's pretty slick. Want to get a new Framework One application up and running?</description><pubDate>Tue, 02 Feb 2016 00:00:00 -0500</pubDate></item><item><guid>https://corfield.org/blog/2016/01/31/testing-with-boot/</guid><link>https://corfield.org/blog/2016/01/31/testing-with-boot/</link><title>Testing With Boot</title><description>In Building On Boot, I gave some high level benefits we'd found with Boot, compared to Leiningen, and how it had helped up streamline our build process. That article closed with a note about Boot not having the equivalent of common Leiningen plugins, and that's what I'm going to cover here, since that was the first real obstacle we encountered.We use Jay Fields' Expectations library very heavily for most of our testing needs. We use clojure.test only for our Clojure-powered WebDriver testing. Leiningen has a test task built-in and we had been using lein-expectations for years. It was quite a shock to find out that Boot has no testing tasks built-in!</description><pubDate>Sun, 31 Jan 2016 00:00:00 -0500</pubDate></item><item><guid>https://corfield.org/blog/2016/01/30/building-on-boot/</guid><link>https://corfield.org/blog/2016/01/30/building-on-boot/</link><title>Building On Boot</title><description>In yesterday's blog post, Rebooting Clojure, I talked about our switch from Leiningen to Boot but, as Sven Richter observed in the comments, I only gave general reasons why we preferred Boot, without a list of pros and cons.Over the coming weeks, I'll write a series of posts about some of the specifics that worked better for us, as well as some of the obstacles we had to overcome in the transition.</description><pubDate>Sat, 30 Jan 2016 00:00:00 -0500</pubDate></item><item><guid>https://corfield.org/blog/2016/01/29/rebooting-clojure/</guid><link>https://corfield.org/blog/2016/01/29/rebooting-clojure/</link><title>Rebooting Clojure</title><description>We switched from Leiningen to Boot. What is Boot and why did we switch?Leiningen</description><pubDate>Fri, 29 Jan 2016 00:00:00 -0500</pubDate></item><item><guid>https://corfield.org/blog/2016/01/03/where-did-2015-go/</guid><link>https://corfield.org/blog/2016/01/03/where-did-2015-go/</link><title>Where Did 2015 Go?</title><description>I did not intend to stop blogging in 2015 but that's certainly what it looks like here!So what kept me so busy that I didn't get around to blogging anything?</description><pubDate>Sun, 03 Jan 2016 00:00:00 -0500</pubDate></item><item><guid>https://corfield.org/blog/2015/02/08/frege-and-clojure/</guid><link>https://corfield.org/blog/2015/02/08/frege-and-clojure/</link><title>Frege (and Clojure)</title><description>I've often said that I try to follow The Pragmatic Programmer's advice to learn a new language every year. I don't always achieve it, but I try. As I've settled into Clojure as my primary language over the last several years, I've made a fair attempt to learn Python, Ruby, Racket/Scheme, Standard ML and more recently Elm. I learned that I like Python, I don't like Ruby, Racket/Scheme is "just another Lisp" (I already have Clojure) and SML is very interesting but not really widely useful these days (it's a great language for learning Functional Programming concepts tho'!). I also spent some time with Go last year (don't like it).The Elm language is really nice - and useful for building interactive browser-based applications (and games). I've been meaning to blog about it for quite a while, and I hope to get around to that in due course. Elm is sort of inspired by Haskell, and that's really what this blog post is about. Sort of.</description><pubDate>Sun, 08 Feb 2015 00:00:00 -0500</pubDate></item><item><guid>https://corfield.org/blog/2014/09/25/the-strange-loop-2014/</guid><link>https://corfield.org/blog/2014/09/25/the-strange-loop-2014/</link><title>The Strange Loop 2014</title><description>Last week I attended The Strange Loop in St Louis. I attended in 2011 and was blown away. I missed 2012 but attended again in 2013 and was blown away once more. I already have 2015's dates in my calendar. How was 2014?Yup, blown away again. Alex Miller and his team have created an iconic event that crosses technology boundaries and bridges between academia and industry, to bring some of the brightest minds together to share their ideas. And for attendees too, the opportunity to meet a huge variety of our peers - from novice to expert - in all different technologies, creates an atmosphere of excitement, wonder, and enjoyment.</description><pubDate>Thu, 25 Sep 2014 00:00:00 -0400</pubDate></item><item><guid>https://corfield.org/blog/2014/09/23/clojure-in-the-enterprise/</guid><link>https://corfield.org/blog/2014/09/23/clojure-in-the-enterprise/</link><title>Clojure in the Enterprise?</title><description>This was originally posted on corfield.org back in April 2013 and I noticed it was recently referenced by Eric Normand in his recent blog post Convince your boss to use Clojure so I figured it was time to update the article and bring it onto my new blog.A question was asked in early 2013 on a Clojure group on LinkedIn about reasons to migrate to Clojure for enterprise applications in a Java shop. It's a fairly typical question from people in the Java world when they hear the buzz about Clojure, and of course asking the question on a Clojure group garnered a lot of positive responses about why Clojure is a good choice. I didn't feel anyone had really addressed a core aspect of the original question which was, essentially, "Why should I, as a Java web developer, using JPA, JSF etc, choose Clojure instead for an enterprise application?". The key considerations here are "enterprise application" and "Java web devloper, using JPA, JSF etc". Clojure is rightly praised for big data projects, simplified concurrency due to immutable data, and the conciseness of its solutions. The general advice when introducing Clojure to an organization is to take a grass roots approach: use it for some tooling first, or a small low-risk (but perhaps high-profile) project and show how well it works in a Java-dominated world. Then you get more and more developers trying it out and gradually the organization adopts it for more and more projects. It's good advice, and it's often how Clojure has crept into Java shops so far (as opposed to those fast-moving small shops that already have a tendency toward polyglot development).</description><pubDate>Tue, 23 Sep 2014 00:00:00 -0400</pubDate></item><item><guid>https://corfield.org/blog/2014/09/20/powered-by-javascript/</guid><link>https://corfield.org/blog/2014/09/20/powered-by-javascript/</link><title>Powered by JavaScript</title><description>The first annual Powered by JavaScript conference, organized by Manning Books, took place in St Louis this past week. How did this inaugural event work for someone like me who really doesn't JavaScript?I'm fairly public about my dislike of JavaScript - and it's an easy language to take pot shots at. Indeed, in the following two days of The Strange Loop conference, several speakers reminded us why JavaScript's flaws have led to so much innovation in both the compile-to-JS ("altJS") and the native JS framework space. Despite the (many) flaws, JS is ubiquitous and has evolved from a hastily constructed scripting engine to become the powerhouse of the modern web and with Node.js has moved into the server side development space and as a common part of a build chain that touches almost every web development shop, regardless of their core technology.</description><pubDate>Sat, 20 Sep 2014 00:00:00 -0400</pubDate></item><item><guid>https://corfield.org/blog/2014/06/21/clojurebridge/</guid><link>https://corfield.org/blog/2014/06/21/clojurebridge/</link><title>ClojureBridge</title><description>Adapted from a post I made on my old blog in January, 2014, about the first few workshops being planned.I've been an advocate of diversity in IT for a long time. I'm very pleased to work in a company that has an above average ratio of female to male employees, as well as very diverse cultural backgrounds amongst our staff. In most tech communities, diversity is pretty low. It's why organizations like RailsBridge and Women Who Code and numerous others exist. The lack of diversity hurts us all because a homogeneous community doesn't have diversity of thought either: diverse teams outperform homogeneous teams.</description><pubDate>Sat, 21 Jun 2014 00:00:00 -0400</pubDate></item><item><guid>https://corfield.org/blog/2014/06/20/some-thoughts-on-java-8/</guid><link>https://corfield.org/blog/2014/06/20/some-thoughts-on-java-8/</link><title>Some thoughts on Java 8</title><description>Originally posted on Google Plus on June 14th, 2014.Why Java 8 might win me back...</description><pubDate>Fri, 20 Jun 2014 00:00:00 -0400</pubDate></item><item><guid>https://corfield.org/blog/2014/06/03/getting-started/</guid><link>https://corfield.org/blog/2014/06/03/getting-started/</link><title>Getting Started</title><description>Sometimes it's very enlightening to look back at the beginning of a project to see how things got set up and how we started down the path that led to where we are today. In this post, I'm going to talk about the first ten tickets we created at World Singles as we kicked off our green field rewrite project five years ago.I've been involved with World Singles for about five years now, about three and a half years as a full-time engineer. The project was a green field rewrite of a dating system the company had evolved over about a decade that, back in 2009, was running on ColdFusion 8 on Windows, and using SQL Server. The new platform soft-launched in late 2011 as we migrated a few small sites across and our full launch - migrating millions of members in the process - was May 2012. At that point we switched from "build" mode to "operations" mode, and today we maintain a large codebase that is a combination of CFML and Clojure, running on Railo 4.2 on Linux, and using MySQL and MongoDB, running partly in our East Coast data center and partly on Amazon.</description><pubDate>Tue, 03 Jun 2014 00:00:00 -0400</pubDate></item><item><guid>https://corfield.org/blog/2013/09/22/the-strange-loop-2013/</guid><link>https://corfield.org/blog/2013/09/22/the-strange-loop-2013/</link><title>The Strange Loop 2013</title><description>This was my second time at The Strange Loop. When I attended in 2011, I said that it was one of the best conferences I had ever attended, and I was disappointed that family plans meant I couldn't attend in 2012. That meant my expectations were high. The main hotel for the event was the beautiful DoubleTree Union Station, an historic castle-like building that was once an ornate train station. The conference itself was a short walk away at the Peabody Opera House. Alex Miller, organizer of The Strange Loop, Clojure/West, and Lambda Jam (new this year), likes to use interesting venues, to make the conferences extra special.I'm providing a brief summary here of what sessions I attended, followed by some general commentary about the event. As I said last time, if you can only attend one conference a year, this should be the one.</description><pubDate>Sun, 22 Sep 2013 00:00:00 -0400</pubDate></item><item><guid>https://corfield.org/blog/2013/05/01/instrumenting-clojure-for-new-relic-monitoring/</guid><link>https://corfield.org/blog/2013/05/01/instrumenting-clojure-for-new-relic-monitoring/</link><title>Instrumenting Clojure for New Relic Monitoring</title><description>We've recently started evaluating the New Relic monitoring service at World Singles and when you use their Java agent with your web application container, you can get a lot of information about what's going on inside your application (JVM activity, database activity, external HTTP calls, web transaction traces). For a CFML application tho', all you tend to get in the web transaction traces is the Servlet entry point, some JDBC SQL reports, and some of the low-level Java libraries (if you're lucky!).However, we have a mixture of CFML and Clojure, running on the free open source Railo server so I thought it might be possible to somehow instrument the Clojure code to enable more visibility into our application traces.</description><pubDate>Wed, 01 May 2013 00:00:00 -0400</pubDate></item></channel></rss>