<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><atom:link href="http://curiousprogrammer.net/" rel="self" type="application/rss+xml"/><title>Curious (Clojure) Programmer</title><link>http://curiousprogrammer.net/</link><description>Simplicity matters</description><lastBuildDate>Fri, 17 Jan 2025 06:52:35 +0000</lastBuildDate><generator>clj-rss</generator><item><guid>http://curiousprogrammer.net/posts/2024-12-09-cloudfront-oac-and-s3-public-website-hosting</guid><link>http://curiousprogrammer.net/posts/2024-12-09-cloudfront-oac-and-s3-public-website-hosting</link><title>CloudFront Origin Access Control (OAC) and hosting public website in a private S3 bucket.</title><description>What could go wrong when migrating a public S3 bucket with static website hosting
to a more secure alternative using CloudFront Origin Access Control (OAC) and making the bucket private?</description><pubDate>Mon, 09 Dec 2024 00:00:00 +0000</pubDate></item><item><guid>http://curiousprogrammer.net/posts/2024-09-03-cloudfront-caching-if-none-match</guid><link>http://curiousprogrammer.net/posts/2024-09-03-cloudfront-caching-if-none-match</link><title>CloudFront: the mysterious case of a missing If-None-Match header</title><description>For months, we’ve been suffering from mediocre performance of part of our website (codescene.io)
due to inability to effectively cache expensive page loads.
A large part of it was a problem with CloudFront I discovered in December 2023 after conversation with the AWS Support team.
Here’s a story of solving this problem.</description><pubDate>Tue, 03 Sep 2024 00:00:00 +0000</pubDate></item><item><guid>http://curiousprogrammer.net/posts/2023-10-31-dns-recursive-resolution</guid><link>http://curiousprogrammer.net/posts/2023-10-31-dns-recursive-resolution</link><title>DNS: on (not so obvious) recursive name resolution</title><description>This is an experimental type of a blog post I call a "deep dive".
It goes deeper than usual, it’s longer than my other posts,
and it explores more aspects of the topic,
trying to deepen your (and my) understanding of the subject (DNS resolution).</description><pubDate>Tue, 11 Jun 2024 00:00:00 +0000</pubDate></item><item><guid>http://curiousprogrammer.net/posts/2022-09-29-spying-on-your-database</guid><link>http://curiousprogrammer.net/posts/2022-09-29-spying-on-your-database</link><title>p6spy - Spying on Your Database</title><description>Talking to a relational database with Clojure is relatively easy.
There’s a great library next.jdbc for that.
In legacy applications, you may encounter an older library,
clojure.java.jdbc.</description><pubDate>Thu, 19 Oct 2023 00:00:00 +0000</pubDate></item><item><guid>http://curiousprogrammer.net/posts/2023-10-13-liquibase-custom-migrations-clojure</guid><link>http://curiousprogrammer.net/posts/2023-10-13-liquibase-custom-migrations-clojure</link><title>Liquibase: custom database migrations with Clojure (without AOT)</title><description>Liquibase IntroLiquibase is a well-know tool for tracking, versioning, and deploying database schema changes.It uses changelog files
to list database changes  in the form of changesets (SQL, XML, YAML, JSON),
which consists of Change Types.
Standard changsets use SQL or a DB-agnostic equivalent written in XML, YAML, or JSON.Here’s an example of a very simple changset adding a new table with a single column:Custom migrationsSometimes, there’s a more complicated migration that’s very difficult or impossible to express in SQL (or its Xml/YAML/JSON equivalent).
That is, you need to write actual code to perform the migration.
In that case, Liquibase offers customChange Change Type.To implement a custom migration you need to:Create a Java class that implements the liquibase.change.custom.CustomSqlChange or liquibase.change.custom.CustomTaskChange interface
(showing only a subset of methods here):Compile the created class, package it into a JAR file, and then add it to a Liquibase classpath.Reference the class in your changelog:</description><pubDate>Sun, 15 Oct 2023 00:00:00 +0000</pubDate></item><item><guid>http://curiousprogrammer.net/posts/2023-10-04-ssh-keys</guid><link>http://curiousprogrammer.net/posts/2023-10-04-ssh-keys</link><title>One SSH Key to rule them all: Or how to make sure that one and only one key is used (even if you use 1Password SSH agent and ProxyJump)</title><description>Persuading your ssh client to use one and only one SSH key may be tricky.
In any case, it may help to understand what keys/identities are actually used
when you connect to the remote host.</description><pubDate>Thu, 05 Oct 2023 00:00:00 +0000</pubDate></item><item><guid>http://curiousprogrammer.net/posts/2023-09-22-evernote-open-link-under-cursor</guid><link>http://curiousprogrammer.net/posts/2023-09-22-evernote-open-link-under-cursor</link><title>Evernote productivity shortcut: quick &amp; easy way to open the URL/link under the cursor</title><description>Here’s a small Keyboard Maestor macro I made today:</description><pubDate>Fri, 22 Sep 2023 00:00:00 +0000</pubDate></item><item><guid>http://curiousprogrammer.net/posts/2023-09-18_run-clojure-repl-with-plain-java</guid><link>http://curiousprogrammer.net/posts/2023-09-18_run-clojure-repl-with-plain-java</link><title>Starting Clojure REPL with plain java</title><description>This is gonna be a rather short and trivial post but I wanted to share it anyway
because it can be useful, ocassionally.</description><pubDate>Fri, 15 Sep 2023 00:00:00 +0000</pubDate></item><item><guid>http://curiousprogrammer.net/posts/2023-09-15-git-delete-old-merged-branches</guid><link>http://curiousprogrammer.net/posts/2023-09-15-git-delete-old-merged-branches</link><title>Git - How to Delete Merged Branches Older than X Days?</title><description>At CodeScene, we used to not delete merged git branches, at all.
The practice came  from Branch Analysis.
To get that data, we didn’t want to remove a merged branch immediately.
However, we ended up, never deleting them which also causes a problem: over time you accumulate thousands of branches.
That creates a mess and makes it hard (or impossible) to select proper branch in CodeScene itself
(the max number of branches we load and display is 1000).</description><pubDate>Fri, 15 Sep 2023 00:00:00 +0000</pubDate></item><item><guid>http://curiousprogrammer.net/posts/2022-10-10-feature-flaggs-middlewares-cloudfront</guid><link>http://curiousprogrammer.net/posts/2022-10-10-feature-flaggs-middlewares-cloudfront</link><title>Feature flags, Middlewares, and Cloudfront caching.</title><description>This post has also been published on CodeScene Engineering blog: CodeScene Engineering blog.</description><pubDate>Mon, 10 Oct 2022 00:00:00 +0000</pubDate></item><item><guid>http://curiousprogrammer.net/posts/2022-08-24-lein-uberjar-dependency-problem</guid><link>http://curiousprogrammer.net/posts/2022-08-24-lein-uberjar-dependency-problem</link><title>Leiningen, uberjars and a mysterious "dev-only" dependency problem.</title><description>This post has also been published on CodeScene Engineering blog: https://codescene.com/engineering-blog.</description><pubDate>Wed, 24 Aug 2022 00:00:00 +0000</pubDate></item><item><guid>http://curiousprogrammer.net/posts/2022-05-29-weekly</guid><link>http://curiousprogrammer.net/posts/2022-05-29-weekly</link><title>Weekly Bits 13/2022 - Title</title><description>_Some of the interesting things I did, learned, or found recently.</description><pubDate>Thu, 23 Jun 2022 00:00:00 +0000</pubDate></item><item><guid>http://curiousprogrammer.net/posts/2022-05-22-weekly</guid><link>http://curiousprogrammer.net/posts/2022-05-22-weekly</link><title>Weekly Bits 12/2022 - Abstractions, Lisp in Small Pieces, lein repl vs JIT, </title><description>Some of the interesting things I did, learned, or found in the past week (16.5 - 22.5.2022).</description><pubDate>Thu, 09 Jun 2022 00:00:00 +0000</pubDate></item><item><guid>http://curiousprogrammer.net/posts/2022-05-15-weekly</guid><link>http://curiousprogrammer.net/posts/2022-05-15-weekly</link><title>Weekly Bits 11/2022 - Lisp in Small Pieces, Abstractions, Project Loom, and Fixing ring's redirects</title><description>Some of the interesting things I did, learned, or found between 9.5.2022 and 15.5.2022.</description><pubDate>Mon, 23 May 2022 00:00:00 +0000</pubDate></item><item><guid>http://curiousprogrammer.net/posts/2022-05-09-weekly</guid><link>http://curiousprogrammer.net/posts/2022-05-09-weekly</link><title>Weekly Bits 10/2022 - Clojure, Cider 1.4, AWS architectures, Lisp in Small Pieces, and The Fieldstone Method</title><description>Some of the interesting things I did, learned, or found in the past week.</description><pubDate>Mon, 09 May 2022 00:00:00 +0000</pubDate></item><item><guid>http://curiousprogrammer.net/posts/2022-04-20-weekly</guid><link>http://curiousprogrammer.net/posts/2022-04-20-weekly</link><title>Bits &amp; Pieces 09/2022 - April</title><description>This time, it is more of a "Monthly bits" piece because I didn’t have time to publish regular weekly updates in April.</description><pubDate>Tue, 03 May 2022 00:00:00 +0000</pubDate></item><item><guid>http://curiousprogrammer.net/posts/2022-04-13-weekly</guid><link>http://curiousprogrammer.net/posts/2022-04-13-weekly</link><title>Weekly Bits 08/2022 - Clojure keyword deserialization, 'reified', difftastic, and JDK 18 release</title><description>Some of the interesting things I did, learned, or found in the past week.</description><pubDate>Wed, 13 Apr 2022 00:00:00 +0000</pubDate></item><item><guid>http://curiousprogrammer.net/posts/2022-04-04-weekly</guid><link>http://curiousprogrammer.net/posts/2022-04-04-weekly</link><title>Weekly Bits 07/2022 - clojure.set/union gotcha, memory "leaks" using eval, EC2 Instance Connect, and CloudFront vs Host header</title><description>Some of the interesting things I did, learned, or found in the past week(s).</description><pubDate>Fri, 08 Apr 2022 00:00:00 +0000</pubDate></item><item><guid>http://curiousprogrammer.net/posts/2022-03-14-weekly</guid><link>http://curiousprogrammer.net/posts/2022-03-14-weekly</link><title>Weekly Bits 06/2022 - CODE RED, Debugging on production, 'Dirty pipe' vulnerability, and macOS local snapshots</title><description>Some of the interesting things I did, learned, or found in the past week.</description><pubDate>Wed, 16 Mar 2022 00:00:00 +0000</pubDate></item><item><guid>http://curiousprogrammer.net/posts/2022-03-08-figwheel-main-transition</guid><link>http://curiousprogrammer.net/posts/2022-03-08-figwheel-main-transition</link><title>On the not-so-easy transition from lein-figwheel to figwheel-main</title><description>Recently, I went trough the process of upgrading a rather old project using ClojureScript with
lein-figwheel
to figwheel-main.</description><pubDate>Mon, 14 Mar 2022 00:00:00 +0000</pubDate></item><item><guid>http://curiousprogrammer.net/posts/2022-02-21-weekly</guid><link>http://curiousprogrammer.net/posts/2022-02-21-weekly</link><title>Weekly Bits 05/2022 - Ukraine, CloudFront &amp; OriginCommError, Double-submit cookies, Frontend monitoring, Emacs' query-replace-regexp</title><description>Some of the interesting things I did, learned, or found in the (week before the) past week.
This time it’s not very complete and comes a bit later - the reason is simple:</description><pubDate>Mon, 28 Feb 2022 00:00:00 +0000</pubDate></item><item><guid>http://curiousprogrammer.net/posts/2022-02-17-cloudfront-origincommerror</guid><link>http://curiousprogrammer.net/posts/2022-02-17-cloudfront-origincommerror</link><title>CloudFront and mysterious OriginCommError</title><description>If you are running production workloads on AWS there’s a good chance you’re using
Amazon CloudFront
- Content Delivery Network (CDN) that helps you improve performance, security, and reliability of your website:</description><pubDate>Wed, 23 Feb 2022 00:00:00 +0000</pubDate></item><item><guid>http://curiousprogrammer.net/posts/2022-02-19-base64</guid><link>http://curiousprogrammer.net/posts/2022-02-19-base64</link><title>Base 64 - padding and URLs</title><description>TL;DR: If you know the size of your input beforehand, it should be safe to leave out the padding character ('=')
so you don’t need to percent-encode it for safe usage in URLs.</description><pubDate>Sun, 20 Feb 2022 00:00:00 +0000</pubDate></item><item><guid>http://curiousprogrammer.net/posts/2022-02-14-weekly</guid><link>http://curiousprogrammer.net/posts/2022-02-14-weekly</link><title>Weekly Bits 04/2022 - Domain Modeling, Cryogen, AWS Secrets Manager, Api Security, VisiData, and more</title><description>Some of the interesting things I did, learned, or found in the past week.</description><pubDate>Sun, 20 Feb 2022 00:00:00 +0000</pubDate></item><item><guid>http://curiousprogrammer.net/posts/2022-02-16-aws-secrets-manager-least-privilege</guid><link>http://curiousprogrammer.net/posts/2022-02-16-aws-secrets-manager-least-privilege</link><title>AWS Secrets Manager and the principle of least-privilege</title><description>AWS Secrets Manager is a great place to store secrets that are needed by somebody else (machines or people)
if you are running your infrastructure on AWS.</description><pubDate>Wed, 16 Feb 2022 00:00:00 +0000</pubDate></item><item><guid>http://curiousprogrammer.net/posts/2022-02-06-weekly</guid><link>http://curiousprogrammer.net/posts/2022-02-06-weekly</link><title>Weekly Bits 03/2022 - Domain Modeling, Finite State Machines, Time Series, Api Security, and Impact Mapping</title><description>ClojurePF.tv Domain Modeling seriesAs in the week before,
I’ve been reading through  some of the Domain Modeling posts on the PurelyFunctional.tv blog,
notably:452: Domain Invariantsdomain model consists of information, operations, and invariantssome places to encode invariants: types, (property-based) tests, language features, data structures, runtime checks / assertions, documentation, proofs453: Model as Toywrite the model down to spot potential problems - the earlier the betteryou have a model anyway, it’s just often ad hoc and partially written455: How and when to apply domain modelingErik got a question if he applied domain modeling to a real project.And he talked about a document signing example:They could do a basic contract signing flow: Create a contract, enter email addresses, and it sends it to everyone to sign.But customers wanted more control:They wanted to say what order people had to sign in.And they wanted other things besides signing, like a review step⇒ hard to fit these new ideas into the simple modelThe direct path was just more HTTP endpoints and SQL update statements and a bunch of conditionalsBut thinking hard brought an idea of state machine (see also Code Hale’s article below)especially the non-determinism allowing parties to sign in different orderThe (state machine) idea was hard to sell, especially to engineers!but just the process of modeling it with a state machine made them find some quick wins (like separating SQL updates into more atomic actions) which eventually simplified their model/codeClojure cheatsheet - collections functions: every?, not-every?, not-any?every? (hopefully obvious)not-every? (read "at least one that is not")it’s a complement to every?not-any? (read "none")Note: any? is a completely different predicate (it’s not really a collection function - it returns true for any argument, including nil)Downloading zip file from an URL via clj-http in Clojure - e.g. Amplitude Export APII needed to download product analytics data from Amplitude.
Amplitude’s Export API
generates a zip file that you can download and extract.
Here’s a way to download such a file in Clojure:Here’s a link that may help too: https://stackoverflow.com/questions/32742744/how-to-download-a-file-and-unzip-it-from-memory-in-clojureApache Commons CompressI used this piece of code based on commons-compress library in the past when dealing with compressed files:</description><pubDate>Wed, 09 Feb 2022 00:00:00 +0000</pubDate></item><item><guid>http://curiousprogrammer.net/posts/2022-01-31-weekly</guid><link>http://curiousprogrammer.net/posts/2022-01-31-weekly</link><title>Weekly Bits 02/2022 - Domain Modeling, Java DNS caching, RDS upgrades with Terraform</title><description>ClojureA few Clojure-related links:Donut.system: your new favourite component library? (by Daniel Higginbotham)The new Clojure "iteration" functionIs there any performance penalty to using vars instead of function references?only matters when they’re on a hot path or very fast. If they take microseconds or more to execute I wouldn’t be bothered by itPurelyFunctional.tv newsletter - domain modeling seriesThis is not really Clojure-specific, but I started reading through
a bunch of posts about domain modeling by Eric Normand (a big FP &amp; Clojure advocate).
It starts with PF.tv newsletter # 446
and he’s still publishing new posts.There’s a lot of great content and insights.
My favorite one, so far, has been
447: Domain model fit
where he talks about reference back to reality and, as an example, misuse of the Decorator pattern.
It also links to two former episodes talking about the Decorator pattern in more detail:407: two layers of design412: use and abuse of the decorator patternnippy serialization issues with                                                                                Joda DateTimeWe store user session data in Redis via nippy.After upgrading the library to a newer version, we found a serialization issue in one particular use case:The solution was to, as they suggest, whitelist all the classes in the org.joda.time package:Notice that the default allowlist contains, for example, java.time classes:See the nippy issue for more details.</description><pubDate>Mon, 31 Jan 2022 00:00:00 +0000</pubDate></item><item><guid>http://curiousprogrammer.net/posts/2022-01-24-weekly</guid><link>http://curiousprogrammer.net/posts/2022-01-24-weekly</link><title>Weekly Bits 01/2022 - analyzing dependencies with clj-kondo, AWS architect mindset, 5 JavaScript features you should learn</title><description>Some of the interesting stuff I did, learned or found in the past week.</description><pubDate>Mon, 24 Jan 2022 00:00:00 +0000</pubDate></item><item><guid>http://curiousprogrammer.net/posts/2022-01-18-cloudwatch-insights-vs-unix-timestamps</guid><link>http://curiousprogrammer.net/posts/2022-01-18-cloudwatch-insights-vs-unix-timestamps</link><title>AWS Cloudwatch Insights and Unix Timestamps</title><description>For way too long,
I’ve been frustrated by inability of the Cloudwatch Insights UI console to produce
human-readable output of latest/earliest functions.Consider this example: [1]</description><pubDate>Tue, 18 Jan 2022 00:00:00 +0000</pubDate></item><item><guid>http://curiousprogrammer.net/posts/2022-01-12-moving-to-cryogen</guid><link>http://curiousprogrammer.net/posts/2022-01-12-moving-to-cryogen</link><title>Moving My Blog to Cryogen and Cloudflare Pages</title><description>The Wordpress problemI wanted to migrate away from the existing Wordpress-based hosting for
my curiosprogrammer.net blog
for a long time yet I have not found time to do that until now.
Today, I’m finally moving towards much simpler approach using
Cryogen as the underlying blog engine.</description><pubDate>Mon, 17 Jan 2022 00:00:00 +0000</pubDate></item><item><guid>http://curiousprogrammer.net/posts/2020-05-11-weekly</guid><link>http://curiousprogrammer.net/posts/2020-05-11-weekly</link><title>Weekly Bits &amp; Pieces 02/2020 (4.5. - 11.5.)</title><description>Interesting stuff I did and found in the past week.</description><pubDate>Mon, 11 May 2020 00:00:00 +0000</pubDate></item><item><guid>http://curiousprogrammer.net/posts/2020-05-04-weekly</guid><link>http://curiousprogrammer.net/posts/2020-05-04-weekly</link><title>Weekly Bits &amp; Pieces 01/2020 (27.4. - 3.5.)</title><description>This is the very first weekly summary published on my blog.
It reviews interesting stuff I did and found in the past week.</description><pubDate>Mon, 04 May 2020 00:00:00 +0000</pubDate></item><item><guid>http://curiousprogrammer.net/posts/2020-04-27-going-forward-book-summaries-and-weekly-bits-pieces</guid><link>http://curiousprogrammer.net/posts/2020-04-27-going-forward-book-summaries-and-weekly-bits-pieces</link><title>Going forward: Book summaries and Weekly Bits &amp; Pieces</title><description>It’s been a while since my last post and I’ve been very inconsistent in publishing new content.
But I want to publish interesting content which both I (reviewing &amp; sorting out materials) and other readers could benefit from.As an experiment, I created two new pages which I want to keep adding content continuously:</description><pubDate>Mon, 27 Apr 2020 00:00:00 +0000</pubDate></item><item><guid>http://curiousprogrammer.net/posts/2019-10-25-gdg-jihlava-codescene-talk</guid><link>http://curiousprogrammer.net/posts/2019-10-25-gdg-jihlava-codescene-talk</link><title>GDG Jihlava - CodeScene talk</title><description>I gave a talk at GDG Jihlava yesterday about CodeScene, a unique behavioral code analysis tool that I’m grateful to work on.The talk was given in Slovak (full details are available at the Meetup page).</description><pubDate>Fri, 25 Oct 2019 00:00:00 +0000</pubDate></item><item><guid>http://curiousprogrammer.net/posts/2019-02-25-new-clojure-quips-screencast</guid><link>http://curiousprogrammer.net/posts/2019-02-25-new-clojure-quips-screencast</link><title>New Clojure Quips Screencast</title><description>It’s been a while since I recorded the last Clojure Tip of the Day episode.I’ve been thinking a lot about the possibilities how to evolve this further and have found that it’s a really time-consuming effort and there are also other high-quality websites covering those sorts of topics (as an example, check out wonderful Clojure Concurrency course from PurelyFunctional.tv).</description><pubDate>Mon, 25 Feb 2019 00:00:00 +0000</pubDate></item><item><guid>http://curiousprogrammer.net/posts/2018-05-11-pureblog-a-simple-blog-implementation-in-clojure-for-purelyfunctional-tv</guid><link>http://curiousprogrammer.net/posts/2018-05-11-pureblog-a-simple-blog-implementation-in-clojure-for-purelyfunctional-tv</link><title>PureBlog: A Simple Blog Implementation in Clojure for PurelyFunctional.tv</title><description>Discussing the first draft of my new hobby app PureBlog implemented for the purpose of getting some practice and feedback from Eric Normand (PurelyFunctional.tv).
It also was my first attempt to use Duct/Integrant micro-frameworks for building a real Clojure app.</description><pubDate>Fri, 11 May 2018 00:00:00 +0000</pubDate></item><item><guid>http://curiousprogrammer.net/posts/2018-04-19-clojure-tip-of-the-day-clojure-concurrency</guid><link>http://curiousprogrammer.net/posts/2018-04-19-clojure-tip-of-the-day-clojure-concurrency</link><title>Clojure Tip of the Day - Clojure Concurrency</title><description>I’ve made a short "welcome" video for a new Clojure Concurrency series.You can find it on YouTube: https://youtu.be/LKomnPz4Kek.</description><pubDate>Thu, 19 Apr 2018 00:00:00 +0000</pubDate></item><item><guid>http://curiousprogrammer.net/posts/2018-03-05-clojure-tip-of-the-day-episode-7-clj-refactor</guid><link>http://curiousprogrammer.net/posts/2018-03-05-clojure-tip-of-the-day-episode-7-clj-refactor</link><title>Clojure Tip of the Day – Episode 7: clj-refactor</title><description>Another episode of Clojure Tip of the Day screencast is out.Videon on YouTube: https://www.youtube.com/watch?v=5PHWV-z_jTw</description><pubDate>Mon, 05 Mar 2018 00:00:00 +0000</pubDate></item><item><guid>http://curiousprogrammer.net/posts/2018-02-15-defn-podcast-episode-30-bruce-hauman</guid><link>http://curiousprogrammer.net/posts/2018-02-15-defn-podcast-episode-30-bruce-hauman</link><title>Defn Podcast Episode 30 – Bruce Hauman</title><description>This is a summary of the defn podcast interview with Bruce Hauman.Once again, it’s been a great and long episode where Ray and Vijay talked to Bruce Hauman.
You’ll find my notes below.</description><pubDate>Thu, 15 Feb 2018 00:00:00 +0000</pubDate></item><item><guid>http://curiousprogrammer.net/posts/2018-02-10-defn-podcast-episode-30-zach-tellman</guid><link>http://curiousprogrammer.net/posts/2018-02-10-defn-podcast-episode-30-zach-tellman</link><title>Defn Podcast Episode 30 - Zach Tellman</title><description>This is a summary of the defn podcast interview with Zach Tellman.It was a wonderful 30th episode of the defn podcast where they interviewed Zach Tellman.
As is so often the case with Zach’s talks, it’s a great discussion full of insights.</description><pubDate>Sat, 10 Feb 2018 00:00:00 +0000</pubDate></item><item><guid>http://curiousprogrammer.net/posts/2018-02-05-clojure-tip-of-the-day-episode-6-how-to</guid><link>http://curiousprogrammer.net/posts/2018-02-05-clojure-tip-of-the-day-episode-6-how-to</link><title>Clojure Tip of the Day – Episode 6: How To Reload Multimethod Definition</title><description>A new episode of Clojure Tip of the Day screencast is out.This is a short episode showing how to reload defmulti definition if you need to change the dispatch function.</description><pubDate>Mon, 05 Feb 2018 00:00:00 +0000</pubDate></item><item><guid>http://curiousprogrammer.net/posts/2018-01-24-clojure-tip-of-the-day-episode-5-threading-macros-part-2-some-some-cond-cond</guid><link>http://curiousprogrammer.net/posts/2018-01-24-clojure-tip-of-the-day-episode-5-threading-macros-part-2-some-some-cond-cond</link><title>Clojure Tip of the Day – Episode 5: Threading Macros: part 2 – some-&gt;, some-&gt;&gt;, cond-&gt;, cond-&gt;&gt;</title><description>Today, I’ve published a follow-up for the previous episode showing the remaining 4 Clojure threading macros: some-&gt;, some→&gt;, cond-&gt;, and cond→&gt;.The episode is on YouTube: https://www.youtube.com/watch?v=hgu3jT1YI_U</description><pubDate>Wed, 24 Jan 2018 00:00:00 +0000</pubDate></item><item><guid>http://curiousprogrammer.net/posts/2018-01-18-clojure-tip-of-the-day-episode-4-threading-macros-part-1-thread-first-thread-last-thread-as</guid><link>http://curiousprogrammer.net/posts/2018-01-18-clojure-tip-of-the-day-episode-4-threading-macros-part-1-thread-first-thread-last-thread-as</link><title>Clojure Tip of the Day - Episode 4: Threading Macros: part 1 - thread-first, thread-last, thread-as</title><description>After a long break, I’ve finally recorded another episode of the Clojure Tip of The Day screencast.
I’ve spent last month or so by revisiting my goals for the next year and I want to bring more consistency to my blog and other creative activities.This episode is about thread-first (-&gt;), thread-last (→&gt;), and thread-last (as-&gt;) macros.
Again, you can find it on YouTube: https://www.youtube.com/watch?v=w0CxOHmny80</description><pubDate>Thu, 18 Jan 2018 00:00:00 +0000</pubDate></item><item><guid>http://curiousprogrammer.net/posts/2017-11-20-clojure-tip-of-the-day-episode-3-threading-macros-tracing</guid><link>http://curiousprogrammer.net/posts/2017-11-20-clojure-tip-of-the-day-episode-3-threading-macros-tracing</link><title>Clojure Tip of the Day - Episode 3: Threading Macros Tracing</title><description>The third episode of my Clojure Tip of the Day screencast is out.</description><pubDate>Mon, 20 Nov 2017 00:00:00 +0000</pubDate></item><item><guid>http://curiousprogrammer.net/posts/2017-11-09-lambdup-functional-meetup-in-prague</guid><link>http://curiousprogrammer.net/posts/2017-11-09-lambdup-functional-meetup-in-prague</link><title>LambdUp Functional Meetup in Prague</title><description>There’s going to be a very interesting functional meetup *LambdUp* in Prague (CZ) on 6th December 2017 organized by Blueberry.I first heard about the event from Eric Normand at Clojure/conj 2017 in Baltimore.
It’s not a coincidence that Eric is also one of the speakers invited to the meetup:</description><pubDate>Thu, 09 Nov 2017 00:00:00 +0000</pubDate></item><item><guid>http://curiousprogrammer.net/posts/2017-11-09-clojure-tip-of-the-day-episode-2-cider-enlighten-mode</guid><link>http://curiousprogrammer.net/posts/2017-11-09-clojure-tip-of-the-day-episode-2-cider-enlighten-mode</link><title>Clojure Tip of the Day - Episode 2: Cider Enlighten Mode</title><description>The new episode of my Clojure Tip of the Day screencast is out.</description><pubDate>Thu, 09 Nov 2017 00:00:00 +0000</pubDate></item><item><guid>http://curiousprogrammer.net/posts/2017-11-05-introducing-clojure-tip-of-the-day-screencast</guid><link>http://curiousprogrammer.net/posts/2017-11-05-introducing-clojure-tip-of-the-day-screencast</link><title>Introducing Clojure Tip of the Day Screencast</title><description>I’ve started a new Clojure screencast Clojure Tip of the Day.
It’s going to be a collection of short (~5 min) videos covering various Clojure tips, tools, and techniques.
I’d like to add a new episode at least once a week.The first episode is about Cider debugger.
It was inspired by a comment on my Clojure Development Workflow with Spacemacs and Cider video tutorial.</description><pubDate>Sun, 05 Nov 2017 00:00:00 +0000</pubDate></item><item><guid>http://curiousprogrammer.net/posts/2017-11-01-functional-programming-brno-meetup-clojure</guid><link>http://curiousprogrammer.net/posts/2017-11-01-functional-programming-brno-meetup-clojure</link><title>Functional Programming Brno Meetup: Clojure</title><description>Last week, I gave a talk about Clojure at Functional Programming Brno meetup.</description><pubDate>Wed, 01 Nov 2017 00:00:00 +0000</pubDate></item><item><guid>http://curiousprogrammer.net/posts/2017-09-18-busy-clojure-developer-guide-to-podcasts</guid><link>http://curiousprogrammer.net/posts/2017-09-18-busy-clojure-developer-guide-to-podcasts</link><title>Busy (Clojure) Developer Guide to Podcasts</title><description>In this post, I’ll share with you the list of my favorite podcasts.
Some of them are focusing on Clojure, but others are more general.
This is just a very brief summary.
In the future, I’d like to write more posts highlighting my favorite episodes.</description><pubDate>Mon, 18 Sep 2017 00:00:00 +0000</pubDate></item><item><guid>http://curiousprogrammer.net/posts/2017-05-12-clojure-development-workflow-with-spacemacs-and-cider</guid><link>http://curiousprogrammer.net/posts/2017-05-12-clojure-development-workflow-with-spacemacs-and-cider</link><title>Clojure Development Workflow with Spacemacs and CIDER</title><description>This is a follow-up to my previous post What’s the Best Clojure IDE? I’ll show you my usual Clojure development workflow using Spacemacs+CIDER as primary tools.</description><pubDate>Fri, 12 May 2017 00:00:00 +0000</pubDate></item><item><guid>http://curiousprogrammer.net/posts/2017-03-21-whats-the-best-clojure-ide</guid><link>http://curiousprogrammer.net/posts/2017-03-21-whats-the-best-clojure-ide</link><title>What's the Best Clojure IDE?</title><description>In this article, I’ll evaluate the Emacs, Cursive, and Spacemacs_, and explain why I ended up with_ Spacemacs for most of the projects I’m currently working on.</description><pubDate>Tue, 21 Mar 2017 00:00:00 +0000</pubDate></item><item><guid>http://curiousprogrammer.net/posts/2017-03-08-my-bookshelf-create-a-project-skeleton-for-clojure-web-application</guid><link>http://curiousprogrammer.net/posts/2017-03-08-my-bookshelf-create-a-project-skeleton-for-clojure-web-application</link><title>My Bookshelf: Create a Project Skeleton for Clojure Web Application</title><description>In the last post, I discussed my Clojure learning strategy in general and introduced my new hobby project My Bookshelf.</description><pubDate>Wed, 08 Mar 2017 00:00:00 +0000</pubDate></item><item><guid>http://curiousprogrammer.net/posts/2017-02-15-my-clojure-learning-strategy</guid><link>http://curiousprogrammer.net/posts/2017-02-15-my-clojure-learning-strategy</link><title>My (Clojure) learning strategy</title><description>In this post, I’ll discuss the general learning strategy and show an example how to apply it to Learning the Clojure programming language.</description><pubDate>Wed, 15 Feb 2017 00:00:00 +0000</pubDate></item><item><guid>http://curiousprogrammer.net/posts/2017-02-08-random-excepts-from-brno-clojure-meetup</guid><link>http://curiousprogrammer.net/posts/2017-02-08-random-excepts-from-brno-clojure-meetup</link><title>Random excerpts from Brno Clojure meetup</title><description>Meetup notesLast week, I was quite happy to attend (:brno Clojure) meetup.
There were only five people including me.
Nevertheless, we had a great time and covered a lot of topics.
There was no main theme, just live free and spontaneous discussion about our experience with Clojure.
We discussed following topics:server-side template ducteasy-to-use template for getting started with Clojure web applicationshow is it different from chestnut?liskasysKarel Miarka’s own projectUses DatomicEmacs/Spacemacs vs.
CursiveSpacemacs has lots of preconfigured plugins =&gt; easier to use than plain EmacsKorma SQLmacro magicconsider using something else (Honey SQL, plain clojure.java.jdbc, …​)Check https://yogthos.net/posts/2016-02-22-LuminusEmbracingHugSQL.html“Specs” for re-frame application state dbIt can be better to not enforce using spec for app-db because the additional value is not so high and it can lead to tedious updates of spec whenever you add something to app-dbUsefulness of namespaced keywordsavoid conflicts: same keywords in different namespacesPitfalls of debugging CLJSunclear error messageshard to find root causeLogginglog whole Clojure data structure instead of standard log lines?you can then process logs with clojure (search, filter, …​)Using Ansible for automatic deploymentComponent reloaded workflowfigwheel-like experience on backendFigwheelre-load on save vs.
reload explicitly (triggered by keyboard shortcut)explicit reload gives us a better controlIdeas for next meetupsApplications / System showcasesdemonstrate the apps we are working ondiscussion, best practicesCoding dojo - we can work together on 4clojure problems or similarInvite Pavel Tisnovsky to Brno Clojure meetupI’m really looking forward to the next Brno Clojure meetup.I’d be love to see more people there as well.</description><pubDate>Wed, 08 Feb 2017 00:00:00 +0000</pubDate></item><item><guid>http://curiousprogrammer.net/posts/2017-01-31-why-do-i-want-to-learn-clojure-and-why-you-should-too</guid><link>http://curiousprogrammer.net/posts/2017-01-31-why-do-i-want-to-learn-clojure-and-why-you-should-too</link><title>Why do I want to learn Clojure and why you should too</title><description>Since 2010, I’ve been interested in functional programming and non-Java JVM languages, most notably Scala &amp; Groovy.</description><pubDate>Tue, 31 Jan 2017 00:00:00 +0000</pubDate></item><item><guid>http://curiousprogrammer.net/posts/2017-01-28-how-to-create-a-blog-to-boost-your-career</guid><link>http://curiousprogrammer.net/posts/2017-01-28-how-to-create-a-blog-to-boost-your-career</link><title>How to Create a Blog To Boost Your Career</title><description>Here I am, finally writing the first blog post for my new blog.
I’ve managed to sit down and do the hard work - without any excuses.</description><pubDate>Sat, 28 Jan 2017 00:00:00 +0000</pubDate></item></channel></rss>