<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="4.3.4">Jekyll</generator><link href="https://clojure-diary.gitlab.io/feed.xml" rel="self" type="application/atom+xml" /><link href="https://clojure-diary.gitlab.io/" rel="alternate" type="text/html" /><updated>2026-04-09T19:54:07+05:30</updated><id>https://clojure-diary.gitlab.io/feed.xml</id><title type="html">Clojure Diary</title><subtitle>Hello, I am Karthikeyan A K, a software architect, for some reason I am getting hooked up with Clojure, and these writings are my experience with this language. One may contact me @ +91 8428050777 for Clojure consolation in weekends.</subtitle><entry><title type="html">Learn Ring - 9. Refactoring Pages</title><link href="https://clojure-diary.gitlab.io/2026/04/09/learn-ring-9-refactoring-pages.html" rel="alternate" type="text/html" title="Learn Ring - 9. Refactoring Pages" /><published>2026-04-09T19:53:00+05:30</published><updated>2026-04-09T19:53:00+05:30</updated><id>https://clojure-diary.gitlab.io/2026/04/09/learn-ring-9-refactoring-pages</id><content type="html" xml:base="https://clojure-diary.gitlab.io/2026/04/09/learn-ring-9-refactoring-pages.html"><![CDATA[<!-- Courtesy of embedresponsively.com -->

<div class="responsive-video-container">
    <iframe src="https://www.youtube-nocookie.com/embed/v3wBdvN_5EM" frameborder="0" webkitallowfullscreen="" mozallowfullscreen="" allowfullscreen=""></iframe>
  </div>

<p><strong>Notes</strong></p>

<ul>
  <li><a href="https://codeberg.org/learnring/little_ring_things/src/branch/005_pages">Code</a></li>
</ul>]]></content><author><name></name></author><summary type="html"><![CDATA[]]></summary></entry><entry><title type="html">Learn Ring - 8. Hiccup</title><link href="https://clojure-diary.gitlab.io/2026/04/06/learn-ring-8-hiccup.html" rel="alternate" type="text/html" title="Learn Ring - 8. Hiccup" /><published>2026-04-06T20:18:00+05:30</published><updated>2026-04-06T20:18:00+05:30</updated><id>https://clojure-diary.gitlab.io/2026/04/06/learn-ring-8-hiccup</id><content type="html" xml:base="https://clojure-diary.gitlab.io/2026/04/06/learn-ring-8-hiccup.html"><![CDATA[<!-- Courtesy of embedresponsively.com -->

<div class="responsive-video-container">
    <iframe src="https://www.youtube-nocookie.com/embed/3g5-jzviPSM" frameborder="0" webkitallowfullscreen="" mozallowfullscreen="" allowfullscreen=""></iframe>
  </div>

<p><strong>Code</strong></p>

<ul>
  <li><code class="language-plaintext highlighter-rouge">project.clj</code></li>
</ul>

<div class="language-clojure highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">(</span><span class="nf">defproject</span><span class="w"> </span><span class="n">little_ring_things</span><span class="w"> </span><span class="s">"0.1.0-SNAPSHOT"</span><span class="w">
</span><span class="no">:description</span><span class="w"> </span><span class="s">"FIXME: write description"</span><span class="w">
</span><span class="no">:url</span><span class="w"> </span><span class="s">"http://example.com/FIXME"</span><span class="w">
</span><span class="no">:min-lein-version</span><span class="w"> </span><span class="s">"2.0.0"</span><span class="w">
</span><span class="no">:dependencies</span><span class="w"> </span><span class="p">[[</span><span class="n">org.clojure/clojure</span><span class="w"> </span><span class="s">"1.12.4"</span><span class="p">]</span><span class="w">
                </span><span class="p">[</span><span class="n">compojure</span><span class="w"> </span><span class="s">"1.6.1"</span><span class="p">]</span><span class="w">
                </span><span class="p">[</span><span class="n">ring/ring-defaults</span><span class="w"> </span><span class="s">"0.3.2"</span><span class="p">]</span><span class="w">
                </span><span class="p">[</span><span class="n">hiccup</span><span class="w"> </span><span class="s">"2.0.0"</span><span class="p">]]</span><span class="w">
</span><span class="no">:plugins</span><span class="w"> </span><span class="p">[[</span><span class="n">lein-ring</span><span class="w"> </span><span class="s">"0.12.5"</span><span class="p">]]</span><span class="w">
</span><span class="no">:ring</span><span class="w"> </span><span class="p">{</span><span class="no">:handler</span><span class="w"> </span><span class="n">little-ring-things.handler/app</span><span class="p">}</span><span class="w">
</span><span class="no">:profiles</span><span class="w">
</span><span class="p">{</span><span class="no">:dev</span><span class="w"> </span><span class="p">{</span><span class="no">:dependencies</span><span class="w"> </span><span class="p">[[</span><span class="n">javax.servlet/servlet-api</span><span class="w"> </span><span class="s">"2.5"</span><span class="p">]</span><span class="w">
                        </span><span class="p">[</span><span class="n">ring/ring-mock</span><span class="w"> </span><span class="s">"0.3.2"</span><span class="p">]]}})</span><span class="w">

</span></code></pre></div></div>

<ul>
  <li><code class="language-plaintext highlighter-rouge">template.clj</code></li>
</ul>

<div class="language-clojure highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">(</span><span class="nf">ns</span><span class="w"> </span><span class="n">little-ring-things.template</span><span class="w">
</span><span class="p">(</span><span class="no">:require</span><span class="w"> </span><span class="p">[</span><span class="n">hiccup2.core</span><span class="w"> </span><span class="no">:as</span><span class="w"> </span><span class="n">h</span><span class="p">]))</span><span class="w">

</span><span class="p">(</span><span class="k">defn</span><span class="w"> </span><span class="n">template</span><span class="w"> </span><span class="p">[</span><span class="n">title</span><span class="w"> </span><span class="n">body</span><span class="p">]</span><span class="w">
</span><span class="p">(</span><span class="nb">str</span><span class="w">
    </span><span class="s">"&lt;!DOCTYPE html&gt;\n"</span><span class="w">
    </span><span class="p">(</span><span class="nf">h/html</span><span class="w">
    </span><span class="p">[</span><span class="no">:html</span><span class="w">
    </span><span class="p">[</span><span class="no">:head</span><span class="w">
    </span><span class="p">[</span><span class="no">:meta</span><span class="w"> </span><span class="p">{</span><span class="no">:charset</span><span class="w"> </span><span class="s">"UTF-8"</span><span class="p">}]</span><span class="w">
    </span><span class="p">[</span><span class="no">:title</span><span class="w"> </span><span class="n">title</span><span class="p">]]</span><span class="w">
    </span><span class="p">[</span><span class="no">:body</span><span class="w">
    </span><span class="n">body</span><span class="p">]])))</span><span class="w">

</span></code></pre></div></div>

<p><strong>Notes</strong></p>

<ul>
  <li><a href="https://github.com/weavejester/hiccup">Hiccup</a></li>
  <li><a href="https://codeberg.org/learnring/little_ring_things/src/branch/004_hiccup">Code</a></li>
</ul>]]></content><author><name></name></author><summary type="html"><![CDATA[]]></summary></entry><entry><title type="html">Learn Ring - 7. Templates</title><link href="https://clojure-diary.gitlab.io/2026/04/04/learn-ring-7-templates.html" rel="alternate" type="text/html" title="Learn Ring - 7. Templates" /><published>2026-04-04T08:07:00+05:30</published><updated>2026-04-04T08:07:00+05:30</updated><id>https://clojure-diary.gitlab.io/2026/04/04/learn-ring-7-templates</id><content type="html" xml:base="https://clojure-diary.gitlab.io/2026/04/04/learn-ring-7-templates.html"><![CDATA[<!-- Courtesy of embedresponsively.com -->

<div class="responsive-video-container">
    <iframe src="https://www.youtube-nocookie.com/embed/gqfy5J8UA9s" frameborder="0" webkitallowfullscreen="" mozallowfullscreen="" allowfullscreen=""></iframe>
  </div>

<p><strong>Code</strong></p>

<p>In <code class="language-plaintext highlighter-rouge">src/little_ring_things/template.clj</code></p>

<div class="language-clojure highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">(</span><span class="nf">ns</span><span class="w"> </span><span class="n">little-ring-things.template</span><span class="p">)</span><span class="w">

</span><span class="p">(</span><span class="k">defn</span><span class="w"> </span><span class="n">template</span><span class="w"> </span><span class="p">[</span><span class="n">title</span><span class="w"> </span><span class="n">body</span><span class="p">]</span><span class="w">
</span><span class="p">(</span><span class="nb">str</span><span class="w"> </span><span class="s">"&lt;!DOCTYPE html&gt;
&lt;html&gt;
&lt;head&gt;
    &lt;meta charset=\"UTF-8\"&gt;
    &lt;title&gt;"</span><span class="w"> </span><span class="n">title</span><span class="w"> </span><span class="s">"&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
    "</span><span class="w"> </span><span class="n">body</span><span class="w"> </span><span class="s">"
&lt;/body&gt;
&lt;/html&gt;"</span><span class="p">))</span><span class="w">

</span></code></pre></div></div>

<p>In <code class="language-plaintext highlighter-rouge">src/little_ring_things/handler.clj</code></p>

<div class="language-clojure highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">(</span><span class="nf">ns</span><span class="w"> </span><span class="n">little-ring-things.handler</span><span class="w">
</span><span class="p">(</span><span class="no">:require</span><span class="w"> </span><span class="p">[</span><span class="n">compojure.core</span><span class="w"> </span><span class="no">:refer</span><span class="w"> </span><span class="no">:all</span><span class="p">]</span><span class="w">
            </span><span class="p">[</span><span class="n">compojure.route</span><span class="w"> </span><span class="no">:as</span><span class="w"> </span><span class="n">route</span><span class="p">]</span><span class="w">
            </span><span class="p">[</span><span class="n">ring.middleware.defaults</span><span class="w"> </span><span class="no">:refer</span><span class="w"> </span><span class="p">[</span><span class="n">wrap-defaults</span><span class="w"> </span><span class="n">site-defaults</span><span class="p">]]</span><span class="w">
            </span><span class="p">[</span><span class="n">little-ring-things.template</span><span class="w"> </span><span class="no">:as</span><span class="w"> </span><span class="n">t</span><span class="p">])</span><span class="w">
</span><span class="p">(</span><span class="no">:import</span><span class="w"> </span><span class="p">[</span><span class="n">java.time</span><span class="w"> </span><span class="n">LocalDateTime</span><span class="p">]))</span><span class="w">

</span><span class="p">(</span><span class="nf">defroutes</span><span class="w"> </span><span class="n">app-routes</span><span class="w">
</span><span class="p">(</span><span class="nf">GET</span><span class="w"> </span><span class="s">"/"</span><span class="w"> </span><span class="p">[]</span><span class="w">
    </span><span class="p">(</span><span class="nf">t/template</span><span class="w"> </span><span class="s">"Home"</span><span class="w"> </span><span class="s">"&lt;p&gt;Hello World&lt;/p&gt;"</span><span class="p">))</span><span class="w">

</span><span class="p">(</span><span class="nf">GET</span><span class="w"> </span><span class="s">"/about"</span><span class="w"> </span><span class="p">[]</span><span class="w">
    </span><span class="p">(</span><span class="nf">t/template</span><span class="w"> </span><span class="s">"About"</span><span class="w"> </span><span class="s">"&lt;p&gt;This is Clojure ring tutorial&lt;/p&gt;"</span><span class="p">))</span><span class="w">

</span><span class="p">(</span><span class="nf">GET</span><span class="w"> </span><span class="s">"/hello/:name"</span><span class="w"> </span><span class="p">[</span><span class="nb">name</span><span class="p">]</span><span class="w">
    </span><span class="p">(</span><span class="nf">t/template</span><span class="w"> </span><span class="s">"Hello"</span><span class="w"> </span><span class="p">(</span><span class="nb">str</span><span class="w"> </span><span class="s">"&lt;p&gt;Hello "</span><span class="w"> </span><span class="nb">name</span><span class="w"> </span><span class="s">"&lt;/p&gt;"</span><span class="p">)))</span><span class="w">

</span><span class="p">(</span><span class="nf">GET</span><span class="w"> </span><span class="s">"/time"</span><span class="w"> </span><span class="p">[]</span><span class="w">
    </span><span class="p">(</span><span class="nf">t/template</span><span class="w"> </span><span class="s">"Time"</span><span class="w"> </span><span class="p">(</span><span class="nb">str</span><span class="w"> </span><span class="s">"&lt;p&gt;The current time is "</span><span class="w"> </span><span class="p">(</span><span class="nf">LocalDateTime/now</span><span class="p">)</span><span class="w"> </span><span class="s">"&lt;/p&gt;"</span><span class="p">)))</span><span class="w">
</span><span class="p">(</span><span class="nf">route/not-found</span><span class="w"> </span><span class="s">"Not Found"</span><span class="p">))</span><span class="w">

</span><span class="p">(</span><span class="k">def</span><span class="w"> </span><span class="n">app</span><span class="w">
</span><span class="p">(</span><span class="nf">wrap-defaults</span><span class="w"> </span><span class="n">app-routes</span><span class="w"> </span><span class="n">site-defaults</span><span class="p">))</span><span class="w">

</span></code></pre></div></div>

<p><strong>Notes</strong></p>

<ul>
  <li><a href="https://codeberg.org/learnring/little_ring_things/src/branch/003_templates">Code</a></li>
</ul>]]></content><author><name></name></author><summary type="html"><![CDATA[]]></summary></entry><entry><title type="html">Learn Ring - 5. Dynamic Pages</title><link href="https://clojure-diary.gitlab.io/2026/04/02/learn-ring-5-dynamic-pages.html" rel="alternate" type="text/html" title="Learn Ring - 5. Dynamic Pages" /><published>2026-04-02T11:46:00+05:30</published><updated>2026-04-02T11:46:00+05:30</updated><id>https://clojure-diary.gitlab.io/2026/04/02/learn-ring-5-dynamic-pages</id><content type="html" xml:base="https://clojure-diary.gitlab.io/2026/04/02/learn-ring-5-dynamic-pages.html"><![CDATA[<!-- Courtesy of embedresponsively.com -->

<div class="responsive-video-container">
    <iframe src="https://www.youtube-nocookie.com/embed/RYA6wtU8xtk" frameborder="0" webkitallowfullscreen="" mozallowfullscreen="" allowfullscreen=""></iframe>
  </div>

<p><strong>Notes</strong></p>

<p>In <code class="language-plaintext highlighter-rouge">handler.clj</code></p>

<div class="language-clojure highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">(</span><span class="nf">ns</span><span class="w"> </span><span class="n">little-ring-things.handler</span><span class="w">
</span><span class="p">(</span><span class="no">:require</span><span class="w"> </span><span class="p">[</span><span class="n">compojure.core</span><span class="w"> </span><span class="no">:refer</span><span class="w"> </span><span class="no">:all</span><span class="p">]</span><span class="w">
            </span><span class="p">[</span><span class="n">compojure.route</span><span class="w"> </span><span class="no">:as</span><span class="w"> </span><span class="n">route</span><span class="p">]</span><span class="w">
            </span><span class="p">[</span><span class="n">ring.middleware.defaults</span><span class="w"> </span><span class="no">:refer</span><span class="w"> </span><span class="p">[</span><span class="n">wrap-defaults</span><span class="w"> </span><span class="n">site-defaults</span><span class="p">]])</span><span class="w">
</span><span class="p">(</span><span class="no">:import</span><span class="w"> </span><span class="p">[</span><span class="n">java.time</span><span class="w"> </span><span class="n">LocalDateTime</span><span class="p">]))</span><span class="w">

</span><span class="p">(</span><span class="nf">defroutes</span><span class="w"> </span><span class="n">app-routes</span><span class="w">
</span><span class="p">(</span><span class="nf">GET</span><span class="w"> </span><span class="s">"/"</span><span class="w"> </span><span class="p">[]</span><span class="w"> </span><span class="s">"Hello World"</span><span class="p">)</span><span class="w">
</span><span class="p">(</span><span class="nf">GET</span><span class="w"> </span><span class="s">"/about"</span><span class="w"> </span><span class="p">[]</span><span class="w"> </span><span class="s">"This is Clojure ring tutorial"</span><span class="p">)</span><span class="w">
</span><span class="p">(</span><span class="nf">GET</span><span class="w"> </span><span class="s">"/hello/:name"</span><span class="w"> </span><span class="p">[</span><span class="nb">name</span><span class="p">]</span><span class="w"> </span><span class="p">(</span><span class="nb">str</span><span class="w"> </span><span class="s">"Hello "</span><span class="w"> </span><span class="nb">name</span><span class="p">))</span><span class="w">
</span><span class="p">(</span><span class="nf">GET</span><span class="w"> </span><span class="s">"/time"</span><span class="w"> </span><span class="p">[]</span><span class="w"> </span><span class="p">(</span><span class="nb">str</span><span class="w"> </span><span class="s">"The current time is "</span><span class="w"> </span><span class="p">(</span><span class="nf">LocalDateTime/now</span><span class="p">)))</span><span class="w">
</span><span class="p">(</span><span class="nf">route/not-found</span><span class="w"> </span><span class="s">"Not Found"</span><span class="p">))</span><span class="w">

</span><span class="p">(</span><span class="k">def</span><span class="w"> </span><span class="n">app</span><span class="w">
</span><span class="p">(</span><span class="nf">wrap-defaults</span><span class="w"> </span><span class="n">app-routes</span><span class="w"> </span><span class="n">site-defaults</span><span class="p">))</span><span class="w">

</span></code></pre></div></div>

<ul>
  <li><a href="https://codeberg.org/learnring/little_ring_things/src/branch/002_dynamic_pages">Code</a></li>
  <li><a href="https://clojure-book.gitlab.io/book.html#_java_power">Java Interop</a></li>
</ul>]]></content><author><name></name></author><summary type="html"><![CDATA[]]></summary></entry><entry><title type="html">Learn Ring - 6. Leiningen, Compojure, Jetty.</title><link href="https://clojure-diary.gitlab.io/2026/03/31/learn-ring-6-leiningen-compojure-jetty.html" rel="alternate" type="text/html" title="Learn Ring - 6. Leiningen, Compojure, Jetty." /><published>2026-03-31T16:28:00+05:30</published><updated>2026-03-31T16:28:00+05:30</updated><id>https://clojure-diary.gitlab.io/2026/03/31/learn-ring-6-leiningen-compojure-jetty</id><content type="html" xml:base="https://clojure-diary.gitlab.io/2026/03/31/learn-ring-6-leiningen-compojure-jetty.html"><![CDATA[<!-- Courtesy of embedresponsively.com -->

<div class="responsive-video-container">
    <iframe src="https://www.youtube-nocookie.com/embed/So6vC6icZy4" frameborder="0" webkitallowfullscreen="" mozallowfullscreen="" allowfullscreen=""></iframe>
  </div>

<p><strong>Notes</strong></p>

<ul>
  <li><code class="language-plaintext highlighter-rouge">lein new compojure little_ring_things</code></li>
  <li><a href="https://leiningen.org/">Leiningen</a></li>
  <li><a href="https://clojure-diary.gitlab.io/2026/03/19/whats-compojure.html">Compojure</a></li>
  <li><a href="https://clojure-diary.gitlab.io/2026/03/20/whats-jetty.html">Jetty</a></li>
  <li><a href="https://clojure-diary.gitlab.io/2026/03/20/project-clj-in-initial-ring-app.html">project.clj</a></li>
  <li><a href="https://tomcat.apache.org/">Tomcat</a></li>
  <li><a href="https://www.geeksforgeeks.org/java/introduction-java-servlets/">Java Servelets</a></li>
</ul>]]></content><author><name></name></author><summary type="html"><![CDATA[]]></summary></entry><entry><title type="html">Learn ring - 4. Ring Init</title><link href="https://clojure-diary.gitlab.io/2026/03/28/learn-ring-4-ring-init.html" rel="alternate" type="text/html" title="Learn ring - 4. Ring Init" /><published>2026-03-28T07:28:00+05:30</published><updated>2026-03-28T07:28:00+05:30</updated><id>https://clojure-diary.gitlab.io/2026/03/28/learn-ring-4-ring-init</id><content type="html" xml:base="https://clojure-diary.gitlab.io/2026/03/28/learn-ring-4-ring-init.html"><![CDATA[<!-- Courtesy of embedresponsively.com -->

<div class="responsive-video-container">
    <iframe src="https://www.youtube-nocookie.com/embed/tSy2WrJOuqk" frameborder="0" webkitallowfullscreen="" mozallowfullscreen="" allowfullscreen=""></iframe>
  </div>

<p><strong>Notes</strong></p>

<ul>
  <li>Install Leiningen <a href="https://leiningen.org/">https://leiningen.org/</a></li>
  <li>Calva <a href="https://calva.io/">https://calva.io/</a></li>
  <li>Creating an ring app <code class="language-plaintext highlighter-rouge">lein new compojure little_ring_things</code></li>
  <li>Do a <code class="language-plaintext highlighter-rouge">git init</code>, commit the code
    <ul>
      <li><code class="language-plaintext highlighter-rouge">git init</code>
        <ul>
          <li><img src="https://archive.org/download/add_calva_folders_to_git_ignore/git_init.png" alt="git init" /></li>
        </ul>
      </li>
      <li>Add Calva folders to <code class="language-plaintext highlighter-rouge">.gitignore</code>
        <ul>
          <li><img src="https://archive.org/download/add_calva_folders_to_git_ignore/add_calva_folders_to_git_ignore.png" alt="Add Calva folders to .gitignore" />
  -
            <div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>  .clj-kondo
  .lsp
</code></pre></div>            </div>
          </li>
        </ul>
      </li>
      <li>Make the first commit
        <ul>
          <li><img src="https://archive.org/download/add_calva_folders_to_git_ignore/make_first_commit.png" alt="Make first commit" /></li>
          <li><img src="https://archive.org/download/add_calva_folders_to_git_ignore/files_staged.png" alt="Files staged" /></li>
        </ul>
      </li>
    </ul>
  </li>
  <li>Start the app
  collapsed:: true
    <ul>
      <li><code class="language-plaintext highlighter-rouge">lein ring server</code></li>
      <li><img src="https://archive.org/download/add_calva_folders_to_git_ignore/app_running_in_browser.png" alt="App running in browser" /></li>
    </ul>
  </li>
  <li>Stop the ring app
    <ul>
      <li>In terminal press <code class="language-plaintext highlighter-rouge">Ctrl + c</code></li>
      <li><img src="https://archive.org/download/add_calva_folders_to_git_ignore/stop_ring.png" alt="Stop ring app" /></li>
    </ul>
  </li>
</ul>]]></content><author><name></name></author><summary type="html"><![CDATA[]]></summary></entry><entry><title type="html">Learn Ring - 3. Prerequisite</title><link href="https://clojure-diary.gitlab.io/2026/03/26/learn-ring-3-prerequisite.html" rel="alternate" type="text/html" title="Learn Ring - 3. Prerequisite" /><published>2026-03-26T07:26:00+05:30</published><updated>2026-03-26T07:26:00+05:30</updated><id>https://clojure-diary.gitlab.io/2026/03/26/learn-ring-3-prerequisite</id><content type="html" xml:base="https://clojure-diary.gitlab.io/2026/03/26/learn-ring-3-prerequisite.html"><![CDATA[<!-- Courtesy of embedresponsively.com -->

<div class="responsive-video-container">
    <iframe src="https://www.youtube-nocookie.com/embed/pj7KOiqmN4o" frameborder="0" webkitallowfullscreen="" mozallowfullscreen="" allowfullscreen=""></iframe>
  </div>

<p><strong>Notes</strong></p>

<ul>
  <li>Prerequisite
    <ul>
      <li>git
        <ul>
          <li><a href="https://git-scm.com/ ">https://git-scm.com/ </a></li>
        </ul>
      </li>
      <li>IDE
        <ul>
          <li>VSCode
            <ul>
              <li><a href="https://code.visualstudio.com/">https://code.visualstudio.com/</a></li>
            </ul>
          </li>
          <li>Antigravity
            <ul>
              <li><a href="https://antigravity.google/">https://antigravity.google/</a></li>
            </ul>
          </li>
        </ul>
      </li>
      <li>Clojure
        <ul>
          <li><a href="https://clojure-book.gitlab.io/">https://clojure-book.gitlab.io/</a></li>
        </ul>
      </li>
      <li>Web Tech
        <ul>
          <li>HTML
            <ul>
              <li><a href="https://www.w3schools.com/html/">https://www.w3schools.com/html/</a></li>
            </ul>
          </li>
          <li>CSS
            <ul>
              <li><a href="https://www.w3schools.com/css/">https://www.w3schools.com/css/</a></li>
            </ul>
          </li>
          <li>JavaScript
            <ul>
              <li><a href="https://www.w3schools.com/js/">https://www.w3schools.com/js/</a></li>
            </ul>
          </li>
          <li>SQL
            <ul>
              <li><a href="https://www.w3schools.com/sql/">https://www.w3schools.com/sql/</a></li>
            </ul>
          </li>
        </ul>
      </li>
    </ul>
  </li>
</ul>]]></content><author><name></name></author><summary type="html"><![CDATA[]]></summary></entry><entry><title type="html">Learn Ring - 02. Who Am I?</title><link href="https://clojure-diary.gitlab.io/2026/03/23/learn-ring-02-who-am-i.html" rel="alternate" type="text/html" title="Learn Ring - 02. Who Am I?" /><published>2026-03-23T09:23:00+05:30</published><updated>2026-03-23T09:23:00+05:30</updated><id>https://clojure-diary.gitlab.io/2026/03/23/learn-ring-02-who-am-i</id><content type="html" xml:base="https://clojure-diary.gitlab.io/2026/03/23/learn-ring-02-who-am-i.html"><![CDATA[<!-- Courtesy of embedresponsively.com -->

<div class="responsive-video-container">
    <iframe src="https://www.youtube-nocookie.com/embed/OS1hR2o-otA" frameborder="0" webkitallowfullscreen="" mozallowfullscreen="" allowfullscreen=""></iframe>
  </div>

<p><strong>Notes</strong></p>

<ul>
  <li>Freelancer</li>
  <li><a href="https://mindaslab.github.io/">Karthikeyan A K</a> (Car + Thick)
    <ul>
      <li><a href="https://en.wikipedia.org/wiki/Chennai">Chennai, India</a></li>
    </ul>
  </li>
  <li>Tech freak</li>
  <li>Web Developer
    <ul>
      <li><a href="https://rubyonrails.org/">Ruby on Rails</a></li>
    </ul>
  </li>
  <li>Data Scientist
    <ul>
      <li>SciCloj Book: <a href="https://scicloj.github.io/stats_with_clojure/">Stats With Clojure</a></li>
    </ul>
  </li>
  <li><a href="https://numerical.works">Numerical Works</a></li>
  <li><a href="https://injee.codeberg.page">Injee</a></li>
</ul>]]></content><author><name></name></author><summary type="html"><![CDATA[]]></summary></entry><entry><title type="html">Learn Ring - 01. Why This Course?</title><link href="https://clojure-diary.gitlab.io/2026/03/21/learn-ring-01-why-this-course.html" rel="alternate" type="text/html" title="Learn Ring - 01. Why This Course?" /><published>2026-03-21T13:35:00+05:30</published><updated>2026-03-21T13:35:00+05:30</updated><id>https://clojure-diary.gitlab.io/2026/03/21/learn-ring-01-why-this-course</id><content type="html" xml:base="https://clojure-diary.gitlab.io/2026/03/21/learn-ring-01-why-this-course.html"><![CDATA[<!-- Courtesy of embedresponsively.com -->

<div class="responsive-video-container">
    <iframe src="https://www.youtube-nocookie.com/embed/bGMIeWheXok" frameborder="0" webkitallowfullscreen="" mozallowfullscreen="" allowfullscreen=""></iframe>
  </div>

<p><strong>Notes</strong></p>

<ul>
  <li>I am.a web developer</li>
  <li>Most of my money came from <a href="https://rubyonrails.org/">Ruby on Rails</a></li>
  <li><a href="https://clojure.org/">Clojure</a> blew me off
    <ul>
      <li>Pulled me away from <a href="https://julialang.org">Julia</a></li>
      <li>Writing a stock trading bot</li>
    </ul>
  </li>
  <li>My ring success
    <ul>
      <li><a href="https://injee.codeberg.page">Injee</a></li>
    </ul>
  </li>
  <li><a href="https://biffweb.com/">Biff</a></li>
  <li>This course is completely free
    <ul>
      <li>Libre</li>
      <li>Gratis</li>
    </ul>
  </li>
  <li>You can donate for this course
    <ul>
      <li><a href="https://paypal.me/mindaslab">https://paypal.me/mindaslab</a></li>
    </ul>
  </li>
</ul>]]></content><author><name></name></author><summary type="html"><![CDATA[]]></summary></entry><entry><title type="html">project.clj in initial ring app</title><link href="https://clojure-diary.gitlab.io/2026/03/20/project-clj-in-initial-ring-app.html" rel="alternate" type="text/html" title="project.clj in initial ring app" /><published>2026-03-20T12:12:00+05:30</published><updated>2026-03-20T12:12:00+05:30</updated><id>https://clojure-diary.gitlab.io/2026/03/20/project-clj-in-initial-ring-app</id><content type="html" xml:base="https://clojure-diary.gitlab.io/2026/03/20/project-clj-in-initial-ring-app.html"><![CDATA[<div class="language-clojure highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">(</span><span class="nf">defproject</span><span class="w"> </span><span class="n">little_ring_things</span><span class="w"> </span><span class="s">"0.1.0-SNAPSHOT"</span><span class="w">
  </span><span class="no">:description</span><span class="w"> </span><span class="s">"FIXME: write description"</span><span class="w">
  </span><span class="no">:url</span><span class="w"> </span><span class="s">"http://example.com/FIXME"</span><span class="w">
  </span><span class="no">:min-lein-version</span><span class="w"> </span><span class="s">"2.0.0"</span><span class="w">
  </span><span class="no">:dependencies</span><span class="w"> </span><span class="p">[[</span><span class="n">org.clojure/clojure</span><span class="w"> </span><span class="s">"1.10.0"</span><span class="p">]</span><span class="w">
                 </span><span class="p">[</span><span class="n">compojure</span><span class="w"> </span><span class="s">"1.6.1"</span><span class="p">]</span><span class="w">
                 </span><span class="p">[</span><span class="n">ring/ring-defaults</span><span class="w"> </span><span class="s">"0.3.2"</span><span class="p">]]</span><span class="w">
  </span><span class="no">:plugins</span><span class="w"> </span><span class="p">[[</span><span class="n">lein-ring</span><span class="w"> </span><span class="s">"0.12.5"</span><span class="p">]]</span><span class="w">
  </span><span class="no">:ring</span><span class="w"> </span><span class="p">{</span><span class="no">:handler</span><span class="w"> </span><span class="n">little-ring-things.handler/app</span><span class="p">}</span><span class="w">
  </span><span class="no">:profiles</span><span class="w">
  </span><span class="p">{</span><span class="no">:dev</span><span class="w"> </span><span class="p">{</span><span class="no">:dependencies</span><span class="w"> </span><span class="p">[[</span><span class="n">javax.servlet/servlet-api</span><span class="w"> </span><span class="s">"2.5"</span><span class="p">]</span><span class="w">
                        </span><span class="p">[</span><span class="n">ring/ring-mock</span><span class="w"> </span><span class="s">"0.3.2"</span><span class="p">]]}})</span><span class="w">
</span></code></pre></div></div>

<p>This is a <strong>Leiningen project definition file</strong> (<code class="language-plaintext highlighter-rouge">project.clj</code>) for a Clojure web application. <a href="https://leiningen.org/">Leiningen</a> is the standard build tool for Clojure, similar to Maven for Java or npm for Node.js. Let me break it down piece by piece.</p>

<hr />

<h2 id="top-level-declaration">Top-Level Declaration</h2>

<div class="language-clojure highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">(</span><span class="nf">defproject</span><span class="w"> </span><span class="n">little_ring_things</span><span class="w"> </span><span class="s">"0.1.0-SNAPSHOT"</span><span class="w">
</span></code></pre></div></div>

<p><code class="language-plaintext highlighter-rouge">defproject</code> is a Leiningen macro that defines the project. It takes two required arguments:</p>

<ul>
  <li><strong><code class="language-plaintext highlighter-rouge">little_ring_things</code></strong> — the project name (artifact ID). Note the underscore; Clojure conventionally uses hyphens in namespaces, but the project name here uses underscores (a common Leiningen quirk).</li>
  <li><strong><code class="language-plaintext highlighter-rouge">"0.1.0-SNAPSHOT"</code></strong> — the version string. <code class="language-plaintext highlighter-rouge">SNAPSHOT</code> is a Maven convention meaning this is a work-in-progress, not a stable release. It signals to build tools that this artifact may change.</li>
</ul>

<hr />

<h2 id="metadata-fields">Metadata Fields</h2>

<div class="language-clojure highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="no">:description</span><span class="w"> </span><span class="s">"FIXME: write description"</span><span class="w">
</span><span class="no">:url</span><span class="w"> </span><span class="s">"http://example.com/FIXME"</span><span class="w">
</span></code></pre></div></div>

<p>These are placeholder strings auto-generated by <code class="language-plaintext highlighter-rouge">lein new</code>. They’re purely informational, used when publishing to a repository like Clojars. The <code class="language-plaintext highlighter-rouge">FIXME</code> comments are reminders to fill them in.</p>

<div class="language-clojure highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="no">:min-lein-version</span><span class="w"> </span><span class="s">"2.0.0"</span><span class="w">
</span></code></pre></div></div>

<p>Enforces a minimum Leiningen version. If someone tries to build this project with Leiningen older than 2.0.0, they’ll get an error. This guards against incompatible older tooling.</p>

<hr />

<h2 id="dependencies">Dependencies</h2>

<div class="language-clojure highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="no">:dependencies</span><span class="w"> </span><span class="p">[[</span><span class="n">org.clojure/clojure</span><span class="w"> </span><span class="s">"1.10.0"</span><span class="p">]</span><span class="w">
               </span><span class="p">[</span><span class="n">compojure</span><span class="w"> </span><span class="s">"1.6.1"</span><span class="p">]</span><span class="w">
               </span><span class="p">[</span><span class="n">ring/ring-defaults</span><span class="w"> </span><span class="s">"0.3.2"</span><span class="p">]]</span><span class="w">
</span></code></pre></div></div>

<p>These are the runtime dependencies, specified as <code class="language-plaintext highlighter-rouge">[group-id/artifact-id "version"]</code> vectors — standard Maven coordinate notation.</p>

<ul>
  <li>
    <p><strong><code class="language-plaintext highlighter-rouge">org.clojure/clojure "1.10.0"</code></strong> — Clojure itself is an explicit dependency, which is unusual compared to most languages. This pins the exact Clojure version the project runs on.</p>
  </li>
  <li>
    <p><strong><code class="language-plaintext highlighter-rouge">compojure "1.6.1"</code></strong> — A routing library for Clojure. It lets you define URL routes concisely, mapping HTTP methods and paths to handler functions. Think of it as the equivalent of Express.js routes or Flask’s <code class="language-plaintext highlighter-rouge">@app.route</code>.</p>
  </li>
  <li>
    <p><strong><code class="language-plaintext highlighter-rouge">ring/ring-defaults "0.3.2"</code></strong> — Ring is Clojure’s foundational web library (analogous to WSGI in Python or Rack in Ruby). <code class="language-plaintext highlighter-rouge">ring-defaults</code> specifically provides pre-configured <strong>middleware stacks</strong> — sensible default settings for things like session handling, cookies, security headers, and parameter parsing — so you don’t have to wire them up manually.</p>
  </li>
</ul>

<hr />

<h2 id="plugins">Plugins</h2>

<div class="language-clojure highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="no">:plugins</span><span class="w"> </span><span class="p">[[</span><span class="n">lein-ring</span><span class="w"> </span><span class="s">"0.12.5"</span><span class="p">]]</span><span class="w">
</span></code></pre></div></div>

<p>Plugins extend Leiningen itself with new tasks. <code class="language-plaintext highlighter-rouge">lein-ring</code> adds Ring-specific commands:</p>

<ul>
  <li><code class="language-plaintext highlighter-rouge">lein ring server</code> — starts a development web server with auto-reload</li>
  <li><code class="language-plaintext highlighter-rouge">lein ring uberjar</code> — packages the app as a standalone JAR</li>
  <li><code class="language-plaintext highlighter-rouge">lein ring uberwar</code> — packages it as a WAR file for servlet containers</li>
</ul>

<hr />

<h2 id="ring-configuration">Ring Configuration</h2>

<div class="language-clojure highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="no">:ring</span><span class="w"> </span><span class="p">{</span><span class="no">:handler</span><span class="w"> </span><span class="n">little-ring-things.handler/app</span><span class="p">}</span><span class="w">
</span></code></pre></div></div>

<p>This tells <code class="language-plaintext highlighter-rouge">lein-ring</code> where the <strong>entry point</strong> of the web application is. <code class="language-plaintext highlighter-rouge">little-ring-things.handler/app</code> refers to a Var named <code class="language-plaintext highlighter-rouge">app</code> in the namespace <code class="language-plaintext highlighter-rouge">little-ring-things.handler</code> — this would be the root Ring handler function (or a wrapped middleware chain) that receives every incoming HTTP request.</p>

<hr />

<h2 id="profiles">Profiles</h2>

<div class="language-clojure highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="no">:profiles</span><span class="w">
  </span><span class="p">{</span><span class="no">:dev</span><span class="w"> </span><span class="p">{</span><span class="no">:dependencies</span><span class="w"> </span><span class="p">[[</span><span class="n">javax.servlet/servlet-api</span><span class="w"> </span><span class="s">"2.5"</span><span class="p">]</span><span class="w">
                        </span><span class="p">[</span><span class="n">ring/ring-mock</span><span class="w"> </span><span class="s">"0.3.2"</span><span class="p">]]}}</span><span class="w">
</span></code></pre></div></div>

<p>Profiles allow environment-specific configuration. The <code class="language-plaintext highlighter-rouge">:dev</code> profile adds dependencies that are only needed during development and testing — they won’t be included in a production build:</p>

<ul>
  <li>
    <p><strong><code class="language-plaintext highlighter-rouge">javax.servlet/servlet-api "2.5"</code></strong> — The Java Servlet API. Required to run an embedded servlet container locally during development (Jetty, which <code class="language-plaintext highlighter-rouge">lein-ring</code> uses under the hood, needs it).</p>
  </li>
  <li>
    <p><strong><code class="language-plaintext highlighter-rouge">ring/ring-mock "0.3.2"</code></strong> — A testing utility that lets you construct fake HTTP requests to pass directly to your Ring handlers, so you can test them without spinning up an actual server.</p>
  </li>
</ul>

<hr />

<h2 id="summary">Summary</h2>

<p>In plain terms, this file describes a minimal <strong>Clojure web app</strong> that uses Ring as its HTTP abstraction layer and Compojure for routing. It’s the kind of scaffolding you’d get from running <code class="language-plaintext highlighter-rouge">lein new compojure little-ring-things</code> — a starting point for building a small web service or API.</p>]]></content><author><name></name></author><summary type="html"><![CDATA[(defproject little_ring_things "0.1.0-SNAPSHOT" :description "FIXME: write description" :url "http://example.com/FIXME" :min-lein-version "2.0.0" :dependencies [[org.clojure/clojure "1.10.0"] [compojure "1.6.1"] [ring/ring-defaults "0.3.2"]] :plugins [[lein-ring "0.12.5"]] :ring {:handler little-ring-things.handler/app} :profiles {:dev {:dependencies [[javax.servlet/servlet-api "2.5"] [ring/ring-mock "0.3.2"]]}})]]></summary></entry></feed>