<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Programmazione on manuel uberti</title>
    <link>https://manueluberti.eu/tags/programmazione/</link>
    <description>Recent content in Programmazione on manuel uberti</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>it_IT</language>
    <managingEditor>manuel.uberti@mailbox.org (Manuel Uberti)</managingEditor>
    <webMaster>manuel.uberti@mailbox.org (Manuel Uberti)</webMaster>
    <lastBuildDate>Sat, 21 Sep 2024 00:00:00 +0000</lastBuildDate>
    <atom:link href="https://manueluberti.eu/tags/programmazione/feed.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Scrappy hearts and Clojure fiddles</title>
      <link>https://manueluberti.eu/posts/2024-09-21-heart-of-clojure/</link>
      <pubDate>Sat, 21 Sep 2024 00:00:00 +0000</pubDate><author>manuel.uberti@mailbox.org (Manuel Uberti)</author>
      <guid>https://manueluberti.eu/posts/2024-09-21-heart-of-clojure/</guid>
      <description>&lt;p&gt;The room is slowly filling up with attendees, organisers and volunteers are
moving around to check that everything is where it is supposed to be. I
recognise some faces, I spot a couple of speakers. I keep looking around eagerly
as if I wanted to take it all in right here right now. This is not my first
Clojure conference, and I do hope it will not be the last, but as I sit I feel
the same rush of emotions I have only felt once before, back in 2019. It was
Heart of Clojure then. It is &lt;a href=&#34;https://2024.heartofclojure.eu/&#34;&gt;Heart of Clojure&lt;/a&gt;
now.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&amp;ldquo;What does it mean to be here?&amp;rdquo;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;This is a question I would end up asking myself over and over again while in
Leuven. While I am back home writing this, I am not sure I have found an answer
just yet, so I want to go over the last few days to see if I finally have a
reply to that question.&lt;/p&gt;
&lt;p&gt;But first, a caveat. If you are looking for a review of the conference or a
report on its program, this is not it. I am sure plenty of useful feedback is
already popping up around the web and many more will come out along with
pictures, videos, and what have you. This writing, however, will mostly be about
me and what Heart of Clojure meant to me.&lt;/p&gt;
&lt;p&gt;With that out of the way, let&amp;rsquo;s dig in.&lt;/p&gt;
&lt;p&gt;Heart of Clojure was bigger and stronger this time. There were two locations
where talks, sessions, workshops and all sort of activities took place. But the
conference was bigger and stronger in another, more intimate sense too. The
first edition had already been &lt;a href=&#34;https://manueluberti.eu/posts/2019-08-04-clojure-heart/&#34;&gt;the people&amp;rsquo;s conference&lt;/a&gt;. This time it was as if the organisers had
wished not only to up the ante, but to make sure that everyone followed suit.
And using two locations for the event had much to do with this.&lt;/p&gt;
&lt;p&gt;Since there was always something going on, people were kindly asked to move
freely from one place to another. In the rare occasion when nothing was
happening, that &lt;em&gt;nothing&lt;/em&gt; was just an illusion. Within the locations, in the
halls while waiting for the next talk, outside on a bench for a break, or in the
street walking to another session, people were literally everywhere, and
anywhere a nice chat might start. Even an introverted such as myself could not
resist this welcoming energy.&lt;/p&gt;
&lt;p&gt;On the other hand, I also avoided many nice occasions to meet a new person or
enjoy a friendly conversation. Too shy? Maybe. Too overwhelmed? Indeed. It is
not easy for me to take in everything and everyone all at once, my body and my
mind simply refuse to comply, I get awkwardly silent and I do not like to be
around people when I feel this way. So I needed my breaks, I needed my walks
alone around Leuven with my music.&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt; I do not know if the organisers had
planned for this kind of attendee, but to me it looked like they did. I had time
both for myself &lt;em&gt;and&lt;/em&gt; the conference, my walks &lt;em&gt;and&lt;/em&gt; the people. I realise now
that a conference such as this might not be for everyone, especially for the
ones who usually like to pile up as many talks as possible, but that is not me.
And I am glad Heart of Clojure somehow took care of me.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&amp;ldquo;What&amp;rsquo;s your take away from the conference?&amp;rdquo;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;I was asked this question yesterday, on my last day in Leuven and the day after
Heart of Clojure had ended. I did not have to think too much to answer. Lu
Wilson put it nicely in their outstanding keynote, but they did deliver it
directly to me with even more power in a short&lt;sup id=&#34;fnref:2&#34;&gt;&lt;a href=&#34;#fn:2&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;2&lt;/a&gt;&lt;/sup&gt; conversation one evening.
When I write, whatever I write, I have to be comfortable with sharing sides of
me, otherwise simply feel OK not doing so. Balancing tiger with rhythm of
tortoise, as Angie McMahon sings.&lt;/p&gt;
&lt;p&gt;This self-reflexive state of mind became a constant throughout the whole Heart
of Clojure not long after the two opening keynotes had ended. My position in the
field was shaken multiple times as I was listening to Lu Wilson and Anna Colom.
Am I doing the right thing? Am I not questioning enough the work I do? Am I not
open enough, aware enough, serious enough? Am I putting my effort and my rather
basic set of skills where they should belong? Miranda Kastemaa (a.k.a. pulu)&amp;rsquo;s
live set felt like the much needed relief.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&amp;ldquo;What does it mean to be here?&amp;rdquo;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Back to the original question. I sense no single, unequivocal answer to it.
Heart of Clojure made me connect with beautiful people, made me conscious of my
limited space and time, filled me with smiles and doubts, words and code, prose
and poetry. More than once people said that this conference had contributed to
pivotal changes in their lives. What if just by setting my foot in Leuven in the
past few days something has been set into motion?&lt;/p&gt;
&lt;div class=&#34;footnotes&#34; role=&#34;doc-endnotes&#34;&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li id=&#34;fn:1&#34;&gt;
&lt;p&gt;Mostly Angie McMahon&amp;rsquo;s new &lt;em&gt;Light Sides&lt;/em&gt; EP and The Ex&amp;rsquo;s new &lt;em&gt;Great! / The
Evidence&lt;/em&gt;, but some old favourites like Pinegrove and Fugazi found their way
to my ears. Comfort music, so to speak.&amp;#160;&lt;a href=&#34;#fnref:1&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&#34;fn:2&#34;&gt;
&lt;p&gt;Because of me, not because of Lu.&amp;#160;&lt;a href=&#34;#fnref:2&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
</description>
    </item>
    <item>
      <title>Heart of Clojure is back</title>
      <link>https://manueluberti.eu/posts/2024-07-10-heart-of-clojure/</link>
      <pubDate>Wed, 10 Jul 2024 00:00:00 +0000</pubDate><author>manuel.uberti@mailbox.org (Manuel Uberti)</author>
      <guid>https://manueluberti.eu/posts/2024-07-10-heart-of-clojure/</guid>
      <description>&lt;p&gt;This will be just a quick announcement.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://2024.heartofclojure.eu/&#34;&gt;Heart of Clojure&lt;/a&gt;, the biggest Clojure
conference in Europe, is happening again, five years after the first edition. I
had much fun &lt;a href=&#34;https://manueluberti.eu/posts/2019-08-04-clojure-heart/&#34;&gt;back in 2019&lt;/a&gt;, so I am
really excited to have another chance to enjoy it.&lt;/p&gt;
&lt;p&gt;You will find me right in Leuven from 18 to 19 September if you want to chat
about beautiful topics such as:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;Emacs and that&amp;rsquo;s it&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Pet-driven development&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;À la recherche du REPL perdu&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Vegan parenthesis&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;See you there.&lt;/p&gt;
</description>
    </item>
    <item>
      <title>The people’s conference</title>
      <link>https://manueluberti.eu/posts/2019-08-04-clojure-heart/</link>
      <pubDate>Sun, 04 Aug 2019 00:00:00 +0000</pubDate><author>manuel.uberti@mailbox.org (Manuel Uberti)</author>
      <guid>https://manueluberti.eu/posts/2019-08-04-clojure-heart/</guid>
      <description>&lt;p&gt;&lt;figure&gt;
  &lt;img src=&#34;https://manueluberti.eu/images/hoc.png&#34; alt=&#34;&#34;&gt;
  &lt;figcaption class=&#34;center&#34;&gt;
    &lt;small&gt;&lt;em&gt;&lt;/em&gt;&lt;/small&gt;    
  &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;I have still to properly unpack my luggage and yet here I am, eager to make
sense of the enthusiasm of experiencing Heart of Clojure. I tried my best to pin
down on my diary everything that the conference had to offer, because at first
I wanted to write a round-up similar to the one I did for &lt;a href=&#34;https://manueluberti.eu/posts/2018-04-23-dcd-round-up/&#34;&gt;Dutch Clojure Days
2018&lt;/a&gt;. However, summarising Heart of
Clojure seems like an unimaginative exercise. And this is because a summary is
by definition a cursory look. Considering what I&amp;rsquo;ve had the pleasure to enjoy,
it doesn&amp;rsquo;t feel right.&lt;/p&gt;
&lt;p&gt;So, what was Heart of Clojure like exactly? After one day and a half in and
plenty more to do, I came up with a definition: the people&amp;rsquo;s conference.
Fragments of this definition were already floating around my head as soon as
I was in front of Hal5, the incredibly cosy space the Heart of Clojure team set
up as the main location for the event. It&amp;rsquo;s not easy to put it clearly into
words, but just take a look at the registration process. You reached a desk,
they gave you a badge, you picked the holder of the right colour for you (i.e.,
green meant you were fine appearing in pictures taken during the conference,
pink you were not), you were given pens and markers to write your name on the
badge and add whatever customisations you feel like adding to it. Now, go back
and count how many &lt;em&gt;you&lt;/em&gt; and &lt;em&gt;they&lt;/em&gt; there are in the last sentence, and you&amp;rsquo;ll
start getting an idea about the general approach of Heart of Clojure.&lt;/p&gt;
&lt;p&gt;The more I think about it, the more I find the effort to make everything safe
and nice for the attendees remarkable, especially because it looked like nobody
was actually controlling anything. I wasn&amp;rsquo;t expecting surveillance cameras and
SWAT teams, of course, but the simple fact that the responsibility of looking
after everyone appeared invisible made for a peaceful environment. And you
always had kind and smiling Heart of Clojure&amp;rsquo;s staff members around ready to
help you out or have a chat with you. The results were in plain sight. Everybody
looked calm, serene, and even without asking you could tell they were having a
great time just being there.&lt;/p&gt;
&lt;p&gt;Unsurprisingly, the wide range of topics in the program left me with an
impossible amount of thoughts. Teaching programmers to draw, Clojure in fashion,
empathy and resilience, inclusiveness and climate change, open source
sustainability and fragment shaders, compilers and arcade games. In a two-day
span, the selection of talks leveraged topics of such a pervasive power that it
was basically impossible not to constantly connect and be moved. With the
entertaining work of the hosts and unforgettable MCs Saskia Linder and Bozhidar
Batsov there was no such thing as boredom in the air.&lt;/p&gt;
&lt;p&gt;At the same time, though, I have to admit I was a bit sceptical about the extra
activities. Again, the Heart of Clojure&amp;rsquo;s masterminds put the people in charge,
and so anyone could devise an activity covering the spare time in the evenings,
during the long afternoon break on Saturday, or on Sunday morning. Before
leaving for Leuven, my overtly paranoid brain asked me: how could they trust
everybody like this? What if a too fervid attendee can&amp;rsquo;t manage it well?
Wouldn&amp;rsquo;t it spoil the fun for the rest of us? It turned out there was too much
joyfulness around to be paranoid, a well-deserved lesson for that silly brain of
mine. I will never be able to thank the awesome Malwine enough for the
sketchnote workshop, and I&amp;rsquo;ll have to find a way to be at another of her
workshops sooner or later.&lt;/p&gt;
&lt;p&gt;Probably co-opted by the aforementioned brain, my mind wandered in similar
doubts when it came to the lightning talks, but in five minutes Connie silenced
both my brain and my mind. I think I&amp;rsquo;ve held my breath and stood still
throughout her entire session, struck in my seat by the genius of an eleven-year
old&amp;rsquo;s crafts. More than anything else, she was the heart at the Heart of
Clojure.&lt;/p&gt;
&lt;p&gt;I have to stop now, because it&amp;rsquo;s time to rest and see if I can soothe the
intense emotions of the past three days. Did I mention the couple of tears on
the &lt;em&gt;My Heart Will Go On&lt;/em&gt; karaoke? You cannot play with a sentimental fool like
this, people, there are feelings at stake. Come on.&lt;/p&gt;
&lt;p&gt;But before turning off the lights:&lt;/p&gt;
&lt;p&gt;Thank you Arne and thank you Martin: you conceived the impossible and made it
happen. Please make it happen again.&lt;/p&gt;
&lt;p&gt;Thank you Heart of Clojure&amp;rsquo;s program committee and reviewers: Arne and Martin
couldn&amp;rsquo;t have made it without you.&lt;/p&gt;
&lt;p&gt;Thank you speakers: singling out one of you would be unfair and completely
pointless. You all inspired me, in one way or the other.&lt;/p&gt;
&lt;p&gt;Thank you Saskia: you taught me the beauty of reaching out, and I will treasure
the words on emotion management for a long while.&lt;/p&gt;
&lt;p&gt;Thank you Bozhidar: no, not for just CIDER this time. For everything, including
the unparalleled dancing skills.&lt;/p&gt;
&lt;p&gt;Thank you Carlo, Davide, Fabrizio, and Kleopatra: I&amp;rsquo;m still not sure of how you
did it, but you made me forget sociability is an issue for me. For a while, at
least.&lt;/p&gt;
&lt;p&gt;Thank you Marco and thank you 7bridges: I just couldn&amp;rsquo;t have managed it by
myself.&lt;/p&gt;
&lt;p&gt;Thank you James Cameron: yes, I still cry with that film, why are you doing this
to me?&lt;/p&gt;
</description>
    </item>
    <item>
      <title>Getting ready for Heart of Clojure</title>
      <link>https://manueluberti.eu/posts/2019-07-03-heart-of-clojure/</link>
      <pubDate>Wed, 03 Jul 2019 00:00:00 +0000</pubDate><author>manuel.uberti@mailbox.org (Manuel Uberti)</author>
      <guid>https://manueluberti.eu/posts/2019-07-03-heart-of-clojure/</guid>
      <description>&lt;p&gt;&lt;figure&gt;
  &lt;img src=&#34;https://manueluberti.eu/images/hoc-logo.png&#34; alt=&#34;&#34;&gt;
  &lt;figcaption class=&#34;center&#34;&gt;
    &lt;small&gt;&lt;em&gt;&lt;/em&gt;&lt;/small&gt;    
  &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;Quick announcement.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;m going to be in Leuven from 1 to 3 August, ready to enjoy Heart of
Clojure.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve been following the development of the conference since the first
announcements, and the awesome team behind it has been keeping me really excited
along the way. The incredible variety of topics in the program is already enough
to skyrocket my expectations.&lt;/p&gt;
&lt;p&gt;As I did with Dutch Clojure Days &lt;a href=&#34;https://manueluberti.eu/posts/2018-04-23-dcd-round-up/&#34;&gt;last year&lt;/a&gt;, I&amp;rsquo;ll take notes diligently and report my experience here as soon as I get
back.&lt;/p&gt;
&lt;p&gt;If you fancy wise Clojure chats or wild Emacs ramblings, get in touch. There is
a dedicated &lt;code&gt;#heartofclojure&lt;/code&gt; channel on Clojurians which I&amp;rsquo;ve already joined,
or you can always rely on good old emails.&lt;/p&gt;
&lt;p&gt;See you there, Clojurists!&lt;/p&gt;
</description>
    </item>
    <item>
      <title>Moving to deps.edn and shadow-cljs</title>
      <link>https://manueluberti.eu/posts/2018-11-14-deps-shadow-cljs/</link>
      <pubDate>Wed, 14 Nov 2018 00:00:00 +0000</pubDate><author>manuel.uberti@mailbox.org (Manuel Uberti)</author>
      <guid>https://manueluberti.eu/posts/2018-11-14-deps-shadow-cljs/</guid>
      <description>&lt;p&gt;Last summer I moved &lt;a href=&#34;https://sr.ht/~manuel-uberti/boodle/&#34;&gt;boodle&lt;/a&gt; from Figwheel
to &lt;a href=&#34;https://manueluberti.eu/posts/2018-08-03-figwheel-main/&#34;&gt;Figwheel Main&lt;/a&gt;. I was pretty
satisfied with this setup, but the rise of shadow-cljs in the Clojure community
has been tickling my curiosity over and over again. While configuring
&lt;code&gt;shadow-cljs&lt;/code&gt; I took the chance to set &lt;code&gt;lein&lt;/code&gt; aside and finally explore &lt;code&gt;clj&lt;/code&gt;
and &lt;code&gt;deps.edn&lt;/code&gt;, another thing on my to-do list that has been waiting for me for
some time.&lt;/p&gt;
&lt;p&gt;Let&amp;rsquo;s start with &lt;code&gt;deps.edn&lt;/code&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&#34;language-clojure&#34;&gt;{:deps
 {
  ;; … Clojure dependencies …
 }

 :paths [&amp;quot;src/clj&amp;quot; &amp;quot;resources&amp;quot;]

 :aliases {:run {:main-opts [&amp;quot;-m&amp;quot; &amp;quot;boodle.core&amp;quot;]}
           :test {:extra-paths [&amp;quot;test/clj&amp;quot;]
                  :extra-deps {lambdaisland/kaocha {:mvn/version &amp;quot;0.0-266&amp;quot;}}}
           :outdated {:extra-deps {olical/depot {:mvn/version &amp;quot;1.4.0&amp;quot;}}
                      :main-opts [&amp;quot;-m&amp;quot; &amp;quot;depot.outdated.main&amp;quot;]}}}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;One thing worth of notice here is &lt;code&gt;:paths&lt;/code&gt;. I included the &lt;code&gt;resources&lt;/code&gt; directory
in it because I serve it via &lt;code&gt;compojure&lt;/code&gt;/&lt;code&gt;http-kit&lt;/code&gt; and that&amp;rsquo;s where I put the
static assets used in my main index page. This solution works when I run
&lt;code&gt;mount.core/start&lt;/code&gt; via REPL and when I use the &lt;code&gt;:run&lt;/code&gt; alias from the command
line.&lt;/p&gt;
&lt;p&gt;Speaking of aliases, they are invaluable. With &lt;code&gt;:run&lt;/code&gt; I can use &lt;code&gt;clj -A:run&lt;/code&gt;
instead of &lt;code&gt;lein run&lt;/code&gt;, and with &lt;code&gt;clj -A:outdated -a outdated&lt;/code&gt; I can easily check
for outdated dependencies in my &lt;code&gt;deps.edn&lt;/code&gt; thanks to depot. Unit tests are now
handled by Kaocha, and as per its instructions I have a &lt;code&gt;bin/kaocha&lt;/code&gt; file which
picks up the &lt;code&gt;:test&lt;/code&gt; alias and runs all my tests.&lt;/p&gt;
&lt;p&gt;I love the simplicity of &lt;code&gt;deps.edn&lt;/code&gt;, it feels like a de-cluttered &lt;code&gt;project.clj&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Configuring shadow-cljs was a bit more complicated. It took me a while to
understand how to properly integrate it with CIDER. However, the manual is great
and the fine people on Slack&amp;rsquo;s &lt;code&gt;#shadow-cljs&lt;/code&gt; (thanks Ryan Haywood and Thomas
Heller!) made it all nice and smooth.&lt;/p&gt;
&lt;p&gt;This is my &lt;code&gt;shadow-cljs.edn&lt;/code&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&#34;language-clojure&#34;&gt;{:source-paths [&amp;quot;src/cljs&amp;quot;]
 :nrepl {:port 8777
         :middleware [refactor-nrepl.middleware/wrap-refactor]}
 :dependencies [
                 ;; … ClojureScript dependencies …
               ]
 :builds {:boodle {:target :browser
                   :output-dir &amp;quot;resources/public/js&amp;quot;
                   :asset-path &amp;quot;/js&amp;quot;
                   :modules {:main {:entries [boodle.core]}}}}}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Basic setup, straight from the manual pages. Notice that &lt;code&gt;:output-dir&lt;/code&gt; refers to
the same &lt;code&gt;resources&lt;/code&gt; directory configured in &lt;code&gt;deps.edn&lt;/code&gt;. This tells shadow-cljs
to place the build output exactly where I need.&lt;/p&gt;
&lt;p&gt;The other important change is in the CLJS libraries I use. shadow-cljs does not
support CLJSJS, so I had to install &lt;code&gt;pikaday&lt;/code&gt; and &lt;code&gt;moment&lt;/code&gt; via &lt;code&gt;yarn&lt;/code&gt;.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&#34;language-shell&#34;&gt;$ yarn add pikaday moment
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Since &lt;code&gt;boodle&lt;/code&gt; relies on &lt;code&gt;re-frame&lt;/code&gt;, I had to install three other libraries to
make shadow-cljs build my code happily:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&#34;language-shell&#34;&gt;$ yarn add react react-dom create-react-class
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;In the namespace where I use them, the &lt;code&gt;:require&lt;/code&gt; had to be changed:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&#34;language-clojure&#34;&gt;(:require ;; … other requires …
          [&amp;quot;react-dom&amp;quot; :refer [findDOMNode]]
          [&amp;quot;pikaday&amp;quot; :as pikaday])
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;And the code had to be adapted:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&#34;language-clojure&#34;&gt;(let [default-opts {:field (findDOMNode this)
                    ;; … other options …
                   }
      instance (pikaday. opts)]
    ;; … other ClojureScript code …
)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;However, a project setup is not ready unless I can work on it via Emacs. These
are the steps I made to have a working CLJ/CLJS development environment. When
&lt;a href=&#34;https://github.com/clojure-emacs/cider/issues/2447&#34;&gt;this issue&lt;/a&gt; will be fixed
some of it may become unnecessary.&lt;/p&gt;
&lt;p&gt;First, I added a couple of dependencies in &lt;code&gt;shadow-cljs.edn&lt;/code&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&#34;language-clojure&#34;&gt;:dependencies [;; … other dependencies …
               [cider/cider-nrepl &amp;quot;0.18.0&amp;quot;]
               [refactor-nrepl &amp;quot;2.4.0&amp;quot;]]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Then I removed everything Figwheel Main related from the &lt;code&gt;.dir-locals.el&lt;/code&gt; file
located in the root directory of &lt;code&gt;boodle&lt;/code&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&#34;language-emacs-lisp&#34;&gt;((nil
  (cider-default-cljs-repl . shadow-select)
  (cider-pprint-fn . zprint)
  (cider-preferred-build-tool . clojure-cli)
  (cider-known-endpoints . ((&amp;quot;hathaway&amp;quot; &amp;quot;localhost&amp;quot; &amp;quot;8777&amp;quot;)))
  (cider-ns-refresh-after-fn . &amp;quot;mount.core/start&amp;quot;)
  (cider-ns-refresh-before-fn . &amp;quot;mount.core/stop&amp;quot;))
 (emacs-lisp-mode
  (flycheck-disabled-checkers . &amp;quot;emacs-lisp-checkdoc&amp;quot;)))
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;I ran &lt;code&gt;cider-jack-in-clj&lt;/code&gt; to have a CLJ REPL and check I didn&amp;rsquo;t break something
on the Clojure side of &lt;code&gt;boodle&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;From a terminal, I used &lt;code&gt;shadow-cljs watch boodle&lt;/code&gt; to have &lt;code&gt;shadow-cljs&lt;/code&gt; build
&lt;code&gt;boodle&lt;/code&gt; and offer me a nice nREPL server listening on port &lt;code&gt;8777&lt;/code&gt;, the one
I specified in &lt;code&gt;shadow-cljs.edn&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Back in CIDER, &lt;code&gt;cider-connect-cljs&lt;/code&gt; brought up a REPL connected to &lt;code&gt;shadow-cljs&lt;/code&gt;
nREPL server, and let me select the build I want it operating on (default is
&lt;code&gt;dev&lt;/code&gt;, I just typed in &lt;code&gt;boodle&lt;/code&gt;). Connecting to &lt;code&gt;boodle&lt;/code&gt; via the browser
finalized the connection between my code and the CLJS environment.&lt;/p&gt;
&lt;p&gt;A great journey. Once again, &lt;code&gt;boodle&lt;/code&gt; proved fertile ground to understand the
Clojure ecosystem and play with it to learn something new. If you want more
details, the project is on &lt;a href=&#34;https://sr.ht/~manuel-uberti/boodle/&#34;&gt;my SourceHut&lt;/a&gt;.&lt;/p&gt;
</description>
    </item>
    <item>
      <title>Handy sudoing in Fish</title>
      <link>https://manueluberti.eu/posts/2018-10-27-sudo-fish/</link>
      <pubDate>Sat, 27 Oct 2018 00:00:00 +0000</pubDate><author>manuel.uberti@mailbox.org (Manuel Uberti)</author>
      <guid>https://manueluberti.eu/posts/2018-10-27-sudo-fish/</guid>
      <description>&lt;p&gt;It&amp;rsquo;s been more than a year and a half now since I moved from Zsh to
&lt;a href=&#34;https://fishshell.com/&#34;&gt;Fish&lt;/a&gt;, and I am still amazed by how smooth and simple
it made my everyday workflow.&lt;/p&gt;
&lt;p&gt;One little trick I&amp;rsquo;ve been taking with me from my Bash days is aliasing &lt;code&gt;sudo&lt;/code&gt;
to &lt;code&gt;_&lt;/code&gt;. There are a lot of commands I need to run via &lt;code&gt;sudo&lt;/code&gt;, and typing one
character instead of four makes it obviously quicker. But what if I already
started to write a command which needs proper privileges and forgotten about
that precious &lt;code&gt;sudo&lt;/code&gt;?&lt;/p&gt;
&lt;p&gt;Lukas Stabe fixed it for me, &lt;a href=&#34;https://github.com/fish-shell/fish-shell/issues/288#issuecomment-158704275&#34;&gt;years
ago&lt;/a&gt;.
First, let&amp;rsquo;s add his &lt;code&gt;prepend_command&lt;/code&gt; to
&lt;code&gt;~/.config/fish/functions/prepend_command.fish&lt;/code&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&#34;language-fish&#34;&gt;function prepend_command
    set -l prepend $argv[1]
    if test -z &amp;quot;$prepend&amp;quot;
        echo &amp;quot;prepend_command needs one argument.&amp;quot;
        return 1
    end

    set -l cmd (commandline)
    if test -z &amp;quot;$cmd&amp;quot;
        commandline -r $history[1]
    end

    set -l old_cursor (commandline -C)
    commandline -C 0
    commandline -i &amp;quot;$prepend &amp;quot;
    commandline -C (math $old_cursor + (echo $prepend | wc -c))
end
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Then, it&amp;rsquo;s only a matter of adding a key binding to
&lt;code&gt;~/.config/fish/functions/fish_user_key_bindings.fish&lt;/code&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&#34;language-fish&#34;&gt;function fish_user_key_bindings
    fish_default_key_bindings

    # Prepend sudo with C-s
    bind \cs &#39;prepend_command sudo&#39;
end
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Now hitting &lt;code&gt;Ctrl-s&lt;/code&gt; anywhere in the command I am typing immediately
adds &lt;code&gt;sudo&lt;/code&gt; at the beginning of the line.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;prepend_command&lt;/code&gt; comes with the benefit of mimicking the &lt;code&gt;sudo&lt;/code&gt; plugin of &lt;a href=&#34;https://github.com/robbyrussell/oh-my-zsh/blob/master/plugins/sudo/sudo.plugin.zsh&#34;&gt;Oh
My
Zsh&lt;/a&gt;.
Fish doesn&amp;rsquo;t support &lt;a href=&#34;https://fishshell.com/docs/current/faq.html#faq-history&#34;&gt;history
expansion&lt;/a&gt;, but
sometimes I just press &lt;code&gt;Enter&lt;/code&gt; before remembering to hit
&lt;code&gt;Ctrl-s&lt;/code&gt;, and that&amp;rsquo;s where I&amp;rsquo;d love some history expansion. I can hit
&lt;code&gt;Ctrl-s&lt;/code&gt; right after the malevolent &lt;code&gt;Enter&lt;/code&gt;, and have my
previous command with &lt;code&gt;sudo&lt;/code&gt; automatically prepended ready to go.&lt;/p&gt;
&lt;p&gt;If you are accustomed to the Zsh key binding, you can have it in Fish too:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&#34;language-fish&#34;&gt;# Re-run previous command with sudo using ESC-ESC
bind \e\e &#39;prepend_command sudo&#39;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Time savers, believe you me.&lt;/p&gt;
</description>
    </item>
    <item>
      <title>Moving to Figwheel Main</title>
      <link>https://manueluberti.eu/posts/2018-08-03-figwheel-main/</link>
      <pubDate>Fri, 03 Aug 2018 00:00:00 +0000</pubDate><author>manuel.uberti@mailbox.org (Manuel Uberti)</author>
      <guid>https://manueluberti.eu/posts/2018-08-03-figwheel-main/</guid>
      <description>&lt;p&gt;If you are a Clojure/ClojureScript programmer, you know &lt;a href=&#34;https://github.com/bhauman&#34;&gt;Bruce
Hauman&lt;/a&gt; and chances are he is one of your personal
heroes. If you are not already in love with him, just watch his &lt;a href=&#34;https://www.youtube.com/watch?v=j-kj2qwJa_E&#34;&gt;awesome talk on
Figwheel&lt;/a&gt; and join the club.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/bhauman/lein-figwheel&#34;&gt;Figwheel&lt;/a&gt; changed the way I work with
ClojureScript with prompt live code reloading and REPL interaction, greatly
enhancing my web-application development.&lt;/p&gt;
&lt;p&gt;Bruce pushed Figwheel further when he unveiled &lt;a href=&#34;https://github.com/bhauman/figwheel-main&#34;&gt;Figwheel
Main&lt;/a&gt;, a complete re-write of Figwheel
compatible both with Leiningen and the new &lt;a href=&#34;https://clojure.org/guides/deps_and_cli&#34;&gt;Clojure CLI
tools&lt;/a&gt;. I have resisted the urge to try
it for a while, but then I remembered I have my own battleground for
experimenting and learning Clojure wonders:
&lt;a href=&#34;https://sr.ht/~manuel-uberti/boodle/&#34;&gt;boodle&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I have decided to stay with Leiningen for now, but I may move to a full
&lt;code&gt;clj&lt;/code&gt; and &lt;code&gt;deps.edn&lt;/code&gt; setup in the future.&lt;/p&gt;
&lt;p&gt;The first thing to change in order to accommodate Figwheel Main is my
&lt;code&gt;project.clj&lt;/code&gt;. A new version of ClojureScript is necessary:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&#34;language-clojure&#34;&gt;:dependencies
[ ;; … more dependencies …
  [org.clojure/clojurescript &amp;quot;1.10.312&amp;quot;]
  ;; … more dependencies …
]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Then, new values for &lt;code&gt;:source-paths&lt;/code&gt; and &lt;code&gt;:resource-paths&lt;/code&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&#34;language-clojure&#34;&gt;:source-paths [&amp;quot;src/clj&amp;quot; &amp;quot;src/cljs&amp;quot;]
:resource-paths [&amp;quot;target&amp;quot; &amp;quot;resources&amp;quot;]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;As the Figwheel Main README suggests, let&amp;rsquo;s add a couple of useful aliases:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&#34;language-clojure&#34;&gt;:aliases
  {&amp;quot;fig&amp;quot; [&amp;quot;trampoline&amp;quot; &amp;quot;run&amp;quot; &amp;quot;-m&amp;quot; &amp;quot;figwheel.main&amp;quot;]
   &amp;quot;build&amp;quot; [&amp;quot;trampoline&amp;quot; &amp;quot;run&amp;quot; &amp;quot;-m&amp;quot; &amp;quot;figwheel.main&amp;quot; &amp;quot;-b&amp;quot; &amp;quot;boodle&amp;quot;]}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;And the actual Figwheel Main dependencies:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&#34;language-clojure&#34;&gt;:profiles
  {:dev
   {:dependencies [[binaryage/devtools &amp;quot;0.9.10&amp;quot;]
                   [cider/piggieback &amp;quot;0.3.8&amp;quot;]
                   [com.bhauman/figwheel-main &amp;quot;0.1.4&amp;quot;]
                   [com.bhauman/rebel-readline-cljs &amp;quot;0.1.4&amp;quot;]
                   [figwheel-sidecar &amp;quot;0.5.16&amp;quot;]]
    :repl-options {:nrepl-middleware [cider.piggieback/wrap-cljs-repl]}}}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;I still want &lt;a href=&#34;https://github.com/emezeske/lein-cljsbuild&#34;&gt;lein-cljsbuild&lt;/a&gt; for a
production-ready build, so I can just simplify the &lt;code&gt;:build&lt;/code&gt; map:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&#34;language-clojure&#34;&gt;:cljsbuild
  {:builds
   {:min
    {:source-paths [&amp;quot;src/cljs&amp;quot;]
     :compiler {:main boodle.core
                :output-to &amp;quot;target/public/cljs-out/boodle-main.js&amp;quot;
                :asset-path &amp;quot;target/public/cljs-out/boodle&amp;quot;
                :optimizations :simple
                :pretty-print false}}}}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;With &lt;code&gt;project.clj&lt;/code&gt; ready, I move to &lt;code&gt;boodle.cljs.edn&lt;/code&gt;. This is what Figwheel
Main needs to know the entry point of my application:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&#34;language-clojure&#34;&gt;{:main boodle.core}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Following the instructions, I also customize some options in
&lt;code&gt;figwheel-main.edn&lt;/code&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&#34;language-clojure&#34;&gt;{:watch-dirs [&amp;quot;src/cljs&amp;quot;]
 :css-dirs [&amp;quot;resources/public/css&amp;quot;]
 :open-url false}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Refer to the
&lt;a href=&#34;https://github.com/bhauman/figwheel-main/blob/master/doc/figwheel-main-options.md&#34;&gt;documentation&lt;/a&gt;
to see what other options are available.&lt;/p&gt;
&lt;p&gt;The last change I have to make is in my index page. Figwheel Main outputs the
compiled JavaScript file in &lt;code&gt;target/public/cljs-out/boodle-main.js&lt;/code&gt;, so I only
need to modify the reference to it:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&#34;language-clojure&#34;&gt;(hiccup/include-js &amp;quot;cljs-out/boodle-main.js&amp;quot;)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Now it&amp;rsquo;s enough to run &lt;code&gt;lein build&lt;/code&gt; and &lt;code&gt;lein run&lt;/code&gt; from the project root
directory.&lt;/p&gt;
&lt;p&gt;However, since &lt;a href=&#34;https://github.com/clojure-emacs/cider&#34;&gt;CIDER&lt;/a&gt; is a vital
component of my daily workflow, I set it up in &lt;code&gt;.dir-locals.el&lt;/code&gt; to run
&lt;code&gt;figwheel-main&lt;/code&gt; on &lt;code&gt;C-c C-x j m&lt;/code&gt;. This will automatically launch a
Clojure REPL and a ClojureScript REPL when CIDER starts:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&#34;language-emacs-lisp&#34;&gt;(cider-default-cljs-repl . figwheel-main)
(cider-figwheel-main-default-options . &amp;quot;:boodle&amp;quot;)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;That&amp;rsquo;s it. Welcome Figwheel Main and, of course, a huge “thank you!” to Bruce Hauman for the
superb work.&lt;/p&gt;
&lt;p&gt;If you want to know more, &lt;code&gt;boodle&lt;/code&gt; is available on
&lt;a href=&#34;https://sr.ht/~manuel-uberti/boodle/&#34;&gt;SourceHut&lt;/a&gt;.&lt;/p&gt;
</description>
    </item>
    <item>
      <title>Re-implementing boodle database layer</title>
      <link>https://manueluberti.eu/posts/2018-07-15-honeysql/</link>
      <pubDate>Sun, 15 Jul 2018 00:00:00 +0000</pubDate><author>manuel.uberti@mailbox.org (Manuel Uberti)</author>
      <guid>https://manueluberti.eu/posts/2018-07-15-honeysql/</guid>
      <description>&lt;p&gt;When I wrote &lt;a href=&#34;https://manueluberti.eu/posts/2017-11-26-boodle/&#34;&gt;boodle&lt;/a&gt;, I didn&amp;rsquo;t think the
database layer thoroughly. The model was simple enough to figure out: one
namespace for each table. However, I stuck the queries at the top of these
namespaces, using plain strings to compose them.&lt;/p&gt;
&lt;p&gt;A working solution, yes, but far from being optimal. Let&amp;rsquo;s be honest: it&amp;rsquo;s just
plain ugly and prone to error. White spaces, characters to escapes. Not a mess,
but neither a smooth ride.&lt;/p&gt;
&lt;p&gt;At 7bridges I recently had the chance to play with Honey SQL. At first I wrongly
mistook it for syntactic sugar. A DSL on top of SQL? The horrors of ORM sprang
to mind in a rush of anxiety, but I set aside my fears and gave it a chance
anyway.&lt;/p&gt;
&lt;p&gt;It took me ten minutes to fall in love with &lt;code&gt;honeysql&lt;/code&gt;. And turning to &lt;code&gt;boodle&lt;/code&gt;
for a proper refactoring was the following thought.&lt;/p&gt;
&lt;p&gt;A quick example of how prettier queries are now:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&#34;language-clojure&#34;&gt;(defn select-aims-with-transactions
  []
  (-&amp;gt; (hh/select :a.id [:a.name :aim] :a.target :t.amount)
      (hh/from [:transactions :t])
      (hh/right-join [:aims :a] [:= :a.id :t.id_aim])
      (hh/where [:= :a.achieved false])
      hc/build
      db/query))
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;No strings, no white spaces, no escaping characters and quoting values. Heaven.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;honeysql&lt;/code&gt; is also extensible, which makes it simple to add support for
operators.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&#34;language-clojure&#34;&gt;(:require [honeysql.format :as fmt])

;; … other code …

(defmethod fmt/fn-handler &amp;quot;ilike&amp;quot; [_ col qstr]
  (str (fmt/to-sql col) &amp;quot; ilike &amp;quot; (fmt/to-sql qstr)))
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;During the refactoring process, I noticed something else that needed a better
solution: dates.&lt;/p&gt;
&lt;p&gt;I was relying on PostgreSQL &lt;code&gt;TO_DATE&lt;/code&gt; to format my dates in the queries.
&lt;code&gt;honeysql&lt;/code&gt; is database-agnostic, so it pushed me to look for a better option.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&#34;language-clojure&#34;&gt;(:require [java-time :as jt])

;; … other code …

(extend-protocol jdbc/IResultSetReadColumn
  Date
  (result-set-read-column [v _ _]
    (-&amp;gt; v
        jt/local-date
        ud/format-date))

  Timestamp
  (result-set-read-column [v _ _]
    (-&amp;gt; v
        jt/local-date
        ud/format-date)))
        
(extend-protocol jdbc/ISQLValue
  java.time.LocalDateTime
  (sql-value [v] (jt/sql-timestamp v))
  java.time.LocalDate
  (sql-value [v] (jt/sql-timestamp v)))
        
;; … other code …
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;format-date&lt;/code&gt; is just a utility function:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&#34;language-clojure&#34;&gt;(:require [java-time :as jt])

;; … other code …

(defn format-date
  &amp;quot;Return `date` in dd/MM/yyyy format.&amp;quot;
  [date]
  (jt/format &amp;quot;dd/MM/yyyy&amp;quot; date))
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;If you have any experience with Java, you know dealing with dates and times had
not been a piece of cake before Java 8. I briefly mentioned &lt;code&gt;LocalDate&lt;/code&gt; when
reporting on my experience with &lt;a href=&#34;https://manueluberti.eu/posts/2016-10-22-java8-experience/&#34;&gt;Java 8&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Now that I am working with Clojure, dates and times strike back. And thanks to
Vadim Platonov, I can safely use Java 8 Date-Time API with
&lt;a href=&#34;https://github.com/dm3/clojure.java-time&#34;&gt;clojure.java-time&lt;/a&gt;.&lt;/p&gt;
</description>
    </item>
    <item>
      <title>Through the lands of static typing</title>
      <link>https://manueluberti.eu/posts/2018-06-14-haskellprogress/</link>
      <pubDate>Thu, 14 Jun 2018 00:00:00 +0000</pubDate><author>manuel.uberti@mailbox.org (Manuel Uberti)</author>
      <guid>https://manueluberti.eu/posts/2018-06-14-haskellprogress/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://manueluberti.eu/posts/2017-12-08-learninghaskell/&#34;&gt;Last December&lt;/a&gt; I started my own trip
towards Haskell, jumping in with much enthusiasm and curiosity. The &lt;em&gt;Haskell
Book&lt;/em&gt; has been the perfect companion, and since chapter 12 just ended I would
like to write about my progress with this wonderful programming language.&lt;/p&gt;
&lt;p&gt;A new house and everything that comes with it gleefully slowed me down on my
studies, but Haskell has never left me alone during these months. The Haskell
Book is really excellent at guiding me one concept at a time, and I am finally
beginning to understand the benefits of static typing.&lt;/p&gt;
&lt;p&gt;Coming from Clojure made the first chapters pretty straightforward. This is not
to Haskell detriment, of course. It just felt good to be able to reason about
lists, recursions, and folds without too much of an effort. Types and
typeclasses is where the real fun began, and I can say so far so good.
Specifying the type of every function, even when it can be safely omitted, is
simple and useful, and it is helping me get a better grasp of the power of
static typing.&lt;/p&gt;
&lt;p&gt;I must admit writing datatypes scared me at first. Years of Java developing
spoiled me on classes and objects, and I swear those datatypes &lt;em&gt;seemed&lt;/em&gt; classes
to my object-oriented eyes. Shame on me. Kinds and &lt;em&gt;higher-kinded&lt;/em&gt; types deserve
further study, though. I can write my on datatypes now, albeit trivial ones, but
&lt;em&gt;types of type constructors&lt;/em&gt; deserve deeper inquiries.&lt;/p&gt;
&lt;p&gt;There is one more thing I am really enjoying: the syntax. I know you would
expect otherwise from a Clojurist, but Haskell syntax is just lovely. It&amp;rsquo;s maths
all over again, and I am in love with it just as much as I love my parenthesis.&lt;/p&gt;
&lt;p&gt;That&amp;rsquo;s it for now. Monads, here I come.&lt;/p&gt;
</description>
    </item>
    <item>
      <title>Dutch Clojure Days 2018 round-up</title>
      <link>https://manueluberti.eu/posts/2018-04-23-dcd-round-up/</link>
      <pubDate>Mon, 23 Apr 2018 00:00:00 +0000</pubDate><author>manuel.uberti@mailbox.org (Manuel Uberti)</author>
      <guid>https://manueluberti.eu/posts/2018-04-23-dcd-round-up/</guid>
      <description>&lt;p&gt;As you may recall, I had enthusiastic expectations and resolutions for &lt;a href=&#34;https://manueluberti.eu/posts/2018-01-23-dcd-expectations/&#34;&gt;Dutch
Clojure Days&lt;/a&gt;. My first Clojure-only
conference, my first proper face-to-face with the community. How could I not be
excited?&lt;/p&gt;
&lt;p&gt;&lt;figure&gt;
  &lt;img src=&#34;https://manueluberti.eu/images/dcd.jpg&#34; alt=&#34;&#34;&gt;
  &lt;figcaption class=&#34;center&#34;&gt;
    &lt;small&gt;&lt;em&gt;&lt;/em&gt;&lt;/small&gt;    
  &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;On Saturday 21st at 8:30 am sharp we were at the TQ building reception, greeted
by Carlo Sciolla, one of the organisers. A couple of words on the venue:
a simple but elegant building, close to Dam Square and right in front of a
fascinating flower market. The conference happened on the fourth floor, with a
balcony to enjoy the outstanding view on the city, and food and drinks for
everybody. My first, huge “thank you, DCD!” goes to the vegetarian option which
was palatable for a vegan, but let&amp;rsquo;s keep the cheering and the hand-clapping for
the end.&lt;/p&gt;
&lt;p&gt;Eleven speakers were waiting for us. Vijay Kiran set the stage and the playful
mood of the day, leaving soon room to Alex Yakushev. “Embrace the JVM” was a
talk to treasure. Observability, performance profiling, memory inspection. I am
by no means a JVM expert, however the tools Alex showed us will definitely help
me get a better understanding of the machinery behind Clojure.&lt;/p&gt;
&lt;p&gt;Simon Belak was up next talking about transducers and statistical analysis. This
was probably the hardest one for me. I haven&amp;rsquo;t found a way to appreciate the
value of transducers yet, and statistical analysis is not my strongest skill.
But I still appreciated the concept of sketch algorithms and I will hunt
histograms pretty soon.&lt;/p&gt;
&lt;p&gt;Srihari Sriraman with “Practical Generative Testing Patterns” blew my mind and,
if you fancy ratings and such, was the highlight of the day. We all know
&lt;code&gt;test.check&lt;/code&gt; is good, but the approach of Srihari to automation, seeding
relevant data and testing plausible behaviours left me eager to grab my keyboard
and implement something similar.&lt;/p&gt;
&lt;p&gt;After lunch we were treated to one more talk before the lightning sessions.
Wilker Lúcio explained the beauty and easy-of-use of GraphQL, an interesting
alternative to REST for better APIs.&lt;/p&gt;
&lt;p&gt;The lightning talks kicked off with some magical REPL-debugging from Valentin
Waeselynck. His &lt;code&gt;scope-capture&lt;/code&gt; looked promising, and I can only hope for an
integration with CIDER. Dr Roland Kay reminded us of the usefulness of
clojure.spec, although if I had to base my opinion of clojure.spec on his talk,
it roughly looked like the type-system Clojure is missing. No trolling intended.
Thomas van der Veen hit the MQTT broker pedal, mixing Java and Clojure, but I am
still not sure I got the purpose of the experiment aside from the sake of
learning. Ray McDermott closed the lightning sessions with an amazing
browser-driven, multi-user REPL he is devising which can make live
pair-programming scattered around the world a breeze.&lt;/p&gt;
&lt;p&gt;The last three talks reflected experiences of using Clojure for business. Josh
Glover, Philip Mates and Pierre-Yves Ritschard shared with us the journeys of
their companies and projects and how designing, developing, and testing have
only improved since their move to our beloved language.&lt;/p&gt;
&lt;p&gt;Drinks followed before a bit of REPL-driven comedy courtesy of Ray McDermott.
Suffice it to say we sang the Clojure version of Bowie&amp;rsquo;s “Rebel Rebel” aptly
entitled “REPL REPL”. If you weren&amp;rsquo;t there, well, you don&amp;rsquo;t know what you
missed.&lt;/p&gt;
&lt;p&gt;Dutch Clojure Days left me with the impression that the Clojure community is
alive and hard-working, and its heart is in the right place. Ideas flourish,
projects boom, boundaries get stretched. We can only be thankful to the DCD
staff for being able to set up such a pleasant event, asking us only to join
them to share our passion.&lt;/p&gt;
</description>
    </item>
    <item>
      <title>Getting ready for Dutch Clojure Days</title>
      <link>https://manueluberti.eu/posts/2018-01-23-dcd-expectations/</link>
      <pubDate>Tue, 23 Jan 2018 00:00:00 +0000</pubDate><author>manuel.uberti@mailbox.org (Manuel Uberti)</author>
      <guid>https://manueluberti.eu/posts/2018-01-23-dcd-expectations/</guid>
      <description>&lt;p&gt;As a functional programming jock, I have a confession to make: I have never been
to a Clojure conference. There was a bit of Clojure in the now defunct
LambdaCon, but the talks there were not as riveting as the ones I caught on
YouTube from the likes of Clojure/conj, clojuTRE and Clojure/west.&lt;/p&gt;
&lt;p&gt;No need to sound depressing, though. Thanks to &lt;a href=&#34;https://7bridges.eu&#34;&gt;7bridges&lt;/a&gt;,
I will happily attend &lt;a href=&#34;http://clojuredays.org/&#34;&gt;Dutch Clojure Days 2018&lt;/a&gt; on
April 21st. As much as my enthusiasm is hard to contain, I plan to fulfil a
bunch of resolutions without losing myself in total exuberance.&lt;/p&gt;
&lt;h3 class=&#34;heading&#34; id=&#34;learn-something-new&#34;&gt;Learn something new&lt;/h3&gt;
&lt;p&gt;I know the list of speakers is not ready yet, but surely something new and good
is waiting for me. This is usually what happens with the talks once the
conference I missed makes the videos available, therefore I am pretty confident
there is going to be a lot of food for my brain.&lt;/p&gt;
&lt;h3 class=&#34;heading&#34; id=&#34;learn-something-better&#34;&gt;Learn something better&lt;/h3&gt;
&lt;p&gt;As far as my Clojure projects go, there is still plenty I have to
master. Transducers? Spec? Design patterns? Performance? UX? Hit me, please. The
amateur in me is eager to become a Clojure programmer worth his salt.&lt;/p&gt;
&lt;h3 class=&#34;heading&#34; id=&#34;join-the-community&#34;&gt;Join the community&lt;/h3&gt;
&lt;p&gt;Last but not least, I will set aside my never-ending fight with sociability and
enjoy the Clojure community for real. I&amp;rsquo;ll be in Amsterdam from Friday afternoon
to Sunday evening, so you will have enough time to join me in some healthy
discussions about your favourite programming language. Or Emacs, if you fancy
wild topics.&lt;/p&gt;
</description>
    </item>
    <item>
      <title>A year of functional programming</title>
      <link>https://manueluberti.eu/posts/2017-12-21-functionalyear/</link>
      <pubDate>Thu, 21 Dec 2017 00:00:00 +0000</pubDate><author>manuel.uberti@mailbox.org (Manuel Uberti)</author>
      <guid>https://manueluberti.eu/posts/2017-12-21-functionalyear/</guid>
      <description>&lt;p&gt;First things first: the title is a lie.&lt;/p&gt;
&lt;p&gt;If you happen to be one of my passionate readers, you may recall I started
&lt;a href=&#34;https://manueluberti.eu/posts/2017-03-12-anewjob/&#34;&gt;working with Clojure&lt;/a&gt; on April 1. So yes, not
every month of the year has been devoted to functional programming. I just
needed something bold to pull you in, sorry.&lt;/p&gt;
&lt;p&gt;Now, how does it feel having worked with Clojure for &lt;del&gt;almost&lt;/del&gt; a year?&lt;/p&gt;
&lt;p&gt;Here at 7bridges we had our fair share of projects. The open source ones are
just a selected few: &lt;code&gt;clj-odbp&lt;/code&gt;, a driver for OrientDB binary protocol;
&lt;code&gt;carter&lt;/code&gt;, an SPA to show how our driver works; &lt;code&gt;remys&lt;/code&gt;, a little tool to
interact with MySQL databases via REST APIs. I also had the chance to play with
ArangoDB recently, and there were no problems building a sample project to
understand its APIs.&lt;/p&gt;
&lt;p&gt;At home, boodle was born to strengthen my ever-growing knowledge and do
&lt;a href=&#34;https://manueluberti.eu/posts/2017-11-26-boodle/&#34;&gt;something useful&lt;/a&gt; for the family.&lt;/p&gt;
&lt;p&gt;When I started in the new office, the switch from professional Java to
professional Clojure was a bit overwhelming. New libraries, new tools, new
patterns, new ways of solving the same old problems, new problems to approach
with a totally different mindset. It all seemed too much.&lt;/p&gt;
&lt;p&gt;Then, something clicked.&lt;/p&gt;
&lt;p&gt;Having the same language on both client- and server-side helped me figure out
the matters at hand with a set of ideas I could easily reuse. Once I understood
the problem, I could look for the steps to solve it. Each step required a data
structure and the function to handle this data structure. The first time I used
&lt;code&gt;reduce-kv&lt;/code&gt; because it was the &lt;em&gt;most natural&lt;/em&gt; choice left a great smile on my
face.&lt;/p&gt;
&lt;p&gt;There is still much to learn, though. Due to lack of experience with JavaScript,
my ClojureScript-fu needs to improve. I have come to appreciate unit testing,
but it&amp;rsquo;s time to put this love at work on my &lt;code&gt;.cljs&lt;/code&gt; files too. I also
definitely want to know more about Clojure web applications security and
performances.&lt;/p&gt;
&lt;p&gt;2017 has been a great year to be a functional programmer. My recent &lt;a href=&#34;https://manueluberti.eu/posts/2017-12-08-learninghaskell/&#34;&gt;liaison
with Haskell&lt;/a&gt; is directing me more and
more on my way. The functional programming way.&lt;/p&gt;
</description>
    </item>
    <item>
      <title>Learning Haskell</title>
      <link>https://manueluberti.eu/posts/2017-12-08-learninghaskell/</link>
      <pubDate>Fri, 08 Dec 2017 00:00:00 +0000</pubDate><author>manuel.uberti@mailbox.org (Manuel Uberti)</author>
      <guid>https://manueluberti.eu/posts/2017-12-08-learninghaskell/</guid>
      <description>&lt;p&gt;Since my first baby steps in the world of Functional Programming, Haskell has
been there. Like the enchanting music of a Siren, it has been luring me with
promises of a new set of skills and a better understanding of the &lt;em&gt;lambda
calculus&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;I refused to oblige at first. A bit of Scheme and my eventual &lt;a href=&#34;https://manueluberti.eu/posts/2017-03-12-anewjob/&#34;&gt;move to
Clojure&lt;/a&gt; occupied my mind and my daily
activities. Truth be told, the odious warfare between dynamic types troopers and
static types zealots didn&amp;rsquo;t help steering my enthusiasm towards Haskell.&lt;/p&gt;
&lt;p&gt;Still, my curiosity is stoic and hard to kill and the Haskell Siren was becoming
too tempting to resist any further. &lt;em&gt;The Pragmatic Programmer&lt;/em&gt; in me knew it was
the right thing to do. My knowledge portfolio is always reaching out for
something new.&lt;/p&gt;
&lt;p&gt;My journey began with the much praised &lt;em&gt;Programming in Haskell&lt;/em&gt;. I kept track of
the exercises only to soon discover this wasn&amp;rsquo;t the right book for me. A bit too
terse and schematic, I needed something that could ease me in in a different
way. I needed more focus on the basics, the roots of the language.&lt;/p&gt;
&lt;p&gt;As I usually do, I sought help online. I don&amp;rsquo;t know many Haskell developers, but
I know there are crazy guys in the Emacs community. Steve Purcell was kind and
patient enough to introduce me to &lt;em&gt;Haskell Programming From First Principles&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;This is a huge book (nearly 1300 pages), but it just took the authors&amp;rsquo; prefaces
to hook me. Julie Moronuki words in particular resonated heavily with me. Unlike
Julie I have experience in programming, but I felt exactly like her when it
comes to approaching Haskell teaching materials.&lt;/p&gt;
&lt;p&gt;So here I am, armed with Stack and Intero and ready to abandon myself to the
depths and wonders of static typing and pure functional programming. I will
track my progress and maybe report back here. I already have a project in mind,
but my Haskell needs to get really good before starting any serious work.&lt;/p&gt;
&lt;p&gt;May the lambda be with me.&lt;/p&gt;
</description>
    </item>
    <item>
      <title>boodle</title>
      <link>https://manueluberti.eu/posts/2017-11-26-boodle/</link>
      <pubDate>Sun, 26 Nov 2017 00:00:00 +0000</pubDate><author>manuel.uberti@mailbox.org (Manuel Uberti)</author>
      <guid>https://manueluberti.eu/posts/2017-11-26-boodle/</guid>
      <description>&lt;p&gt;The usefulness of in-house accounting has become evident only in recent years.
On different occasions, my wife and I discussed a solution for keeping track of
expenses and available budget for short- and long-term goals. Simply put: the
bank statement was not enough any more.&lt;/p&gt;
&lt;p&gt;In the past we relied on &lt;a href=&#34;https://www.ledger-cli.org/&#34;&gt;ledger&lt;/a&gt;, knowing too well
the power of plain text. For a while we succeeded in our money management,
because ledger is really that good. However, soon we started thinking about
savings and goals, about a custom user interface to have a better understanding
of our financial situation.&lt;/p&gt;
&lt;p&gt;Naturally, I decided to use some of the experience I gained at work to develop
our own application. I wanted a simple &lt;a href=&#34;https://en.wikipedia.org/wiki/Single-page_application&#34;&gt;single-page
application&lt;/a&gt; that would
enable us to:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;track &lt;em&gt;expenses&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;query expenses to get &lt;em&gt;reports&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;track short- and long-term &lt;em&gt;goals&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;boodle (a synonym of money, in case you are wondering) has the following
architecture:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;client: &lt;a href=&#34;https://github.com/Day8/re-frame&#34;&gt;re-frame&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;server: &lt;a href=&#34;https://github.com/ring-clojure/ring&#34;&gt;ring&lt;/a&gt; on top of &lt;a href=&#34;http://www.http-kit.org/&#34;&gt;HTTP
kit&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;database: &lt;a href=&#34;https://www.postgresql.org/&#34;&gt;PostgreSQL&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I have set up &lt;a href=&#34;https://github.com/juxt/bidi&#34;&gt;bidi&lt;/a&gt; for client-side routing,
&lt;a href=&#34;https://github.com/weavejester/compojure&#34;&gt;compojure&lt;/a&gt; for server-side routing
and &lt;a href=&#34;https://github.com/metosin/compojure-api&#34;&gt;compojure-api&lt;/a&gt; to connect client
and server via pleasant APIs.&lt;/p&gt;
&lt;p&gt;Thanks to &lt;a href=&#34;https://github.com/tolitius/mount&#34;&gt;mount&lt;/a&gt; I have three main
components that I can start and stop to make development and debugging easier:
application configuration, database and HTTP server.&lt;/p&gt;
&lt;p&gt;I decided to give &lt;a href=&#34;https://github.com/MichaelDrogalis/dire&#34;&gt;dire&lt;/a&gt; a try,
appreciating the separation between logic and error handling. I also took the
chance to couple
&lt;a href=&#34;https://clojure.github.io/clojure/clojure.test-api.html&#34;&gt;clojure.test&lt;/a&gt; with
&lt;a href=&#34;https://github.com/clojure/test.check&#34;&gt;test.check&lt;/a&gt;, for some basic
property-based testing, and &lt;a href=&#34;https://github.com/weavejester/eftest&#34;&gt;lein-eftest&lt;/a&gt;
to have fast and pretty test results.&lt;/p&gt;
&lt;p&gt;The setup is completed by the continuous integration offered by &lt;a href=&#34;https://travis-ci.org/&#34;&gt;Travis
CI&lt;/a&gt; and &lt;a href=&#34;https://versions.deps.co/&#34;&gt;Deps Versions&lt;/a&gt; to
identify outdated dependencies. Everything is available on
&lt;a href=&#34;https://sr.ht/~manuel-uberti/boodle/&#34;&gt;SourceHut&lt;/a&gt;, if you want to dig deeper
into the details.&lt;/p&gt;
&lt;p&gt;boodle is currently deployed on my home server, and in the last months it has
proved to be a reliable tool. It also deepened my love for Clojure and
ClojureScript. Long forgotten are the days where separation of concerns, both
client- and server-side, seemed impossible and destined to fail.&lt;/p&gt;
</description>
    </item>
    <item>
      <title>Daily Clojure workflow</title>
      <link>https://manueluberti.eu/posts/2017-04-29-clojureenv/</link>
      <pubDate>Sat, 29 Apr 2017 00:00:00 +0000</pubDate><author>manuel.uberti@mailbox.org (Manuel Uberti)</author>
      <guid>https://manueluberti.eu/posts/2017-04-29-clojureenv/</guid>
      <description>&lt;p&gt;It&amp;rsquo;s already been a month since I started &lt;a href=&#34;https://manueluberti.eu/posts/2017-03-12-anewjob/&#34;&gt;my new job&lt;/a&gt;. All is going well and just as expected, and it&amp;rsquo;s been
interesting to see how my carefully tuned Emacs configuration dealt with
everyday Clojure programming.&lt;/p&gt;
&lt;p&gt;Truth be told, I&amp;rsquo;ve never used Emacs consistently for work. Before Clojure
I mainly did Java and Emacs support for Java is not as good as what it offers
for other programming languages. Yes, I kept Emacs around for other stuff, but
it would be a dull lie to tell I was proudly using Emacs all day in the office.&lt;/p&gt;
&lt;p&gt;Anyway, Clojure is the new kid in town now so it&amp;rsquo;s Emacs all the way. The
obvious first choice is CIDER and I genuinely don&amp;rsquo;t have enough words to say how
wonderful it is. I couple it with clj-refactor and Smartparens to get the most
out of my coding experience.&lt;/p&gt;
&lt;p&gt;I especially love how CIDER enables me to switch easily between Clojure and
ClojureScript, with two REPLs ready to go and documentation just under my
fingertips. clj-refactor enriches exploratory development with hot reloading of
dependencies and handy change of missing requires.&lt;/p&gt;
&lt;p&gt;Then there is Projectile. Even on small Clojure projects we are using to test
available libraries there are plenty of files around. Mickey Petersen talks
about &lt;em&gt;tempo&lt;/em&gt; when it comes to using Emacs. Projectile guarantees you don&amp;rsquo;t lose
your tempo while working on projects of different sizes.&lt;/p&gt;
&lt;p&gt;What else? I don&amp;rsquo;t think Magit needs my over enthusiastic words. Ivy is proving
to be the right tool at the right time, with Swiper ever so helpful. And now
I am only waiting for the day we will need proper documents to bring out the
almighty AUCTeX.&lt;/p&gt;
&lt;p&gt;In the immortal words of &lt;a href=&#34;https://www.youtube.com/watch?v=8wLwbpCxRf0&#34;&gt;Bozhidar Batsov&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Emacs is power.&lt;br&gt;
Emacs is magic.&lt;br&gt;
Emacs is fun.&lt;br&gt;
Emacs is forever.&lt;/p&gt;
&lt;/blockquote&gt;
</description>
    </item>
    <item>
      <title>Clojure it is</title>
      <link>https://manueluberti.eu/posts/2017-03-12-anewjob/</link>
      <pubDate>Sun, 12 Mar 2017 00:00:00 +0000</pubDate><author>manuel.uberti@mailbox.org (Manuel Uberti)</author>
      <guid>https://manueluberti.eu/posts/2017-03-12-anewjob/</guid>
      <description>&lt;p&gt;Last Friday I finally told my boss that I am going to leave his company for
another job.&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s not the first time in my working life that I want to move to greener
pastures. For different reasons I changed jobs quite a lot in the last 10
years. However, this is the first time that I made my decision based on the
programming language being used in the office.&lt;/p&gt;
&lt;p&gt;As much as I had fun &lt;a href=&#34;https://manueluberti.eu/posts/2016-10-22-java8-experience/&#34;&gt;working with Java 8&lt;/a&gt;, in the last months there has been little of it. Bouncing back and forth
between Java 7 and PHP 5.6 for legacy code maintenance is not exactly my idea of
fun.&lt;/p&gt;
&lt;p&gt;Both Clojure and functional programming changed the way I think about solving
problems with code. I often found myself thinking outside the boundaries of OOP,
craving for pure and higher-order functions, all of which are just out of reach
in the aforementioned versions of Java and PHP.&lt;/p&gt;
&lt;p&gt;The adoption of Clojure by Italian software houses is still close to none.
It&amp;rsquo;s been a while since I started looking for a job with Clojure, but until now
the only opportunities I found required moving to another country. I even tried
to convince myself I was willing to pack my bags again, but family comes first
and deep in my heart I knew I couldn&amp;rsquo;t ask my wife to leave everything behind.&lt;/p&gt;
&lt;p&gt;Imagine my shock when I heard that 7bridges was hiring. Marco Dalla Stella, CTO
and Co–founder of the company, is the man who guided me through my first steps
with Clojure. It was him, 2 years ago, who pointed me to &lt;em&gt;Programming Clojure&lt;/em&gt;
and &lt;em&gt;The Joy of Clojure&lt;/em&gt;. It was him who joined me for a trip to Bologna where
LambdaCon happened. He&amp;rsquo;s also an Emacs user, which means he must be one of the
good guys.&lt;/p&gt;
&lt;p&gt;And now I can&amp;rsquo;t wait to start working with Clojure for real. I celebrated the
beginning of this new adventure with a new Dell XPS 13 which will surely be
perfect for what I have in mind.&lt;/p&gt;
&lt;p&gt;Eventually, Clojure it is.&lt;/p&gt;
</description>
    </item>
    <item>
      <title>Reflecting on my Java 8 experience</title>
      <link>https://manueluberti.eu/posts/2016-10-22-java8-experience/</link>
      <pubDate>Sat, 22 Oct 2016 00:00:00 +0000</pubDate><author>manuel.uberti@mailbox.org (Manuel Uberti)</author>
      <guid>https://manueluberti.eu/posts/2016-10-22-java8-experience/</guid>
      <description>&lt;p&gt;After four months of being back to Java for work, I would like to share my
impressions about Java 8. Mind you, this is my first time with Java 8 on a
project, so I do not consider myself an expert on the subject. What I can
promptly say, though, is this: I have &lt;em&gt;never&lt;/em&gt; had so much fun using Java before.&lt;/p&gt;
&lt;p&gt;One of the reasons I have been partly away from Java since 2012 is that I have
been more and more dragged towards functional programming (FP from now on). It
all started with my fascination with Emacs and Emacs Lisp, then Scheme and
Clojure hit my curiosity harder. Recently, Scala has been insinuating in my
brain. You can already see a pattern here, can&amp;rsquo;t you? FP stole my heart.&lt;/p&gt;
&lt;p&gt;I knew Java 8 stormed the object-oriented (OO from now on) community with plenty
of FP material, but it took a new, big project and the
brilliant &lt;a href=&#34;https://www.manning.com/books/java-8-in-action&#34;&gt;Java 8 In Action&lt;/a&gt; to
convince me I could go more functional than I was hoping for.&lt;/p&gt;
&lt;p&gt;The team I work with comes from a purely OO mindset, so I was a bit reluctant to
introduce FP ideas and solutions. I jumped right in the middle of the
development, with a large codebase already there before the time of my
arrival. The only hint of Java 8 I found was a single use of &lt;code&gt;forEach&lt;/code&gt; with a
lambda expression in it.&lt;/p&gt;
&lt;p&gt;I then began using lambda expressions, streams and the &lt;code&gt;Optional&lt;/code&gt; class in
utility classes and enumerators I could quickly write unit tests for. The
benefits were immediately evident: my code was getting clearer and concise, and
programming in a declarative fashion made it easier to read and understand. My
aim exactly.&lt;/p&gt;
&lt;p&gt;To the rest of the team it all looked like syntactic sugar at first. One team
member advised me to spread lambdas as little as possible. Fortunately, he soon
came to appreciate my efforts and suggested not to be afraid of refactoring code
smells if I felt like it.&lt;/p&gt;
&lt;p&gt;As much as I like working with lambdas and streams, not to mention &lt;code&gt;LocalDate&lt;/code&gt;,
the Java 8 feature that really shines in our codebase is &lt;code&gt;CompletableFuture&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;We have a bunch of operations that need to be asynchronous. Basically, they
collect data from different web services to then build a composite response for
the client. The first implementation of asynchronous operations was using
&lt;code&gt;Future&lt;/code&gt; and &lt;code&gt;Callable&lt;/code&gt;. It was working fine, but the logic behind error
handling was a mess of &lt;code&gt;try {…} catch {…}&lt;/code&gt; copied and pasted in different
places. Moreover, the &lt;code&gt;Callable&lt;/code&gt; classes were just &lt;code&gt;switch&lt;/code&gt; statements bound to
get bigger and bigger.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;CompletableFuture&lt;/code&gt; made everything better. I wrapped each asynchronous
operation in a &lt;code&gt;CompletableFuture&lt;/code&gt;, removing the unneeded &lt;code&gt;Callable&lt;/code&gt;. It is not
hard now to comprehend the logic behind the algorithm, because it is definitely
simpler than before. Error handling is just a matter of dealing with three
possible exceptions.&lt;/p&gt;
&lt;p&gt;Java 8 is neither Scala nor Clojure, but as a functional programmer wannabe it
makes me appreciate Java again.&lt;/p&gt;
</description>
    </item>
  </channel>
</rss>
