<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Clojure on Squid's Blog</title><link>https://gigasquidsoftware.com/categories/clojure/</link><description>Recent content in Clojure on Squid's Blog</description><generator>Hugo</generator><language>en-us</language><lastBuildDate>Sun, 02 Jul 2023 12:31:00 +0000</lastBuildDate><atom:link href="https://gigasquidsoftware.com/categories/clojure/atom.xml" rel="self" type="application/rss+xml"/><item><title>Ciphers with Vector Symbolic Architectures</title><link>https://gigasquidsoftware.com/blog/2023/07/02/ciphers-with-vector-symbolic-architectures/</link><pubDate>Sun, 02 Jul 2023 12:31:00 +0000</pubDate><guid>https://gigasquidsoftware.com/blog/2023/07/02/ciphers-with-vector-symbolic-architectures/</guid><description>&lt;p&gt;&lt;img loading="lazy" src="https://raw.githubusercontent.com/gigasquid/vsa-clj/main/examples/secret-message.png"&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;A secret message inside a 10,000 hyperdimensional vector&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;We&amp;rsquo;ve seen in previous posts how we can encode data structures using &lt;a href="http://gigasquidsoftware.com/blog/2022/12/31/vector-symbolic-architectures-in-clojure/"&gt;Vector Symbolic Architectures in Clojure&lt;/a&gt;. This is an exploration of how we can use this to develop a cipher to transmit a secret message between two parties.&lt;/p&gt;
&lt;h3 id="a-hyperdimensional-cipher"&gt;A Hyperdimensional Cipher&lt;/h3&gt;
&lt;p&gt;Usually, we would develop a dictionary/ cleanup memory of randomly chosen hyperdimensional vectors to represent each symbol. We could do this, but then sharing the dictionary as our key to be able to decode messages would be big. Instead, we could share a single hyperdimensional vector and then use the protect/ rotation operator to create a dictionary of the alphabet and some numbers to order the letters. Think of this as the initial seed symbol and the rest being defined as &lt;code&gt;n+1&lt;/code&gt;.&lt;/p&gt;</description></item><item><title>Vector Symbolic Architectures in Clojure</title><link>https://gigasquidsoftware.com/blog/2022/12/31/vector-symbolic-architectures-in-clojure/</link><pubDate>Sat, 31 Dec 2022 15:41:00 +0000</pubDate><guid>https://gigasquidsoftware.com/blog/2022/12/31/vector-symbolic-architectures-in-clojure/</guid><description>&lt;p&gt;&lt;img loading="lazy" src="https://live.staticflickr.com/65535/52596142860_c4cf8642b0_z.jpg"&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;generated with Stable Diffusion&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Before diving into the details of what Vector Symbolic Architectures are and what it means to implement Clojure data structures in them, I&amp;rsquo;d like to start with some of my motivation in this space.&lt;/p&gt;
&lt;h2 id="small-ai-for-more-personal-enjoyment"&gt;Small AI for More Personal Enjoyment&lt;/h2&gt;
&lt;p&gt;Over the last few years, I&amp;rsquo;ve spent time learning, exploring, and contributing to open source deep learning. It continues to amaze me with its rapid movement and achievements at scale. However, the scale is really too big and too slow for me to enjoy it anymore.&lt;/p&gt;</description></item><item><title>Clojure Interop with Python NLP Libraries</title><link>https://gigasquidsoftware.com/blog/2020/01/24/clojure-interop-with-python-nlp-libraries/</link><pubDate>Fri, 24 Jan 2020 15:34:00 +0000</pubDate><guid>https://gigasquidsoftware.com/blog/2020/01/24/clojure-interop-with-python-nlp-libraries/</guid><description>&lt;p&gt;&lt;img alt="clojure-python" loading="lazy" src="http:////live.staticflickr.com/65535/49435394578_400fdf1c7f_c.jpg"&gt;&lt;/p&gt;
&lt;p&gt;In this edition of the blog series of Clojure/Python interop with &lt;a href="https://github.com/cnuernber/libpython-clj"&gt;libpython-clj&lt;/a&gt;, we&amp;rsquo;ll be taking a look at two popular Python NLP libraries: &lt;a href="https://www.nltk.org/"&gt;NLTK&lt;/a&gt; and &lt;a href="https://spacy.io/"&gt;SpaCy&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="nltk---natural-language-toolkit"&gt;NLTK - Natural Language Toolkit&lt;/h2&gt;
&lt;p&gt;I was taking requests for doing examples of python-clojure interop libraries on twitter the other day, and by &lt;em&gt;far&lt;/em&gt; NLTK was the most requested library. After looking into it, I can see why. It&amp;rsquo;s the most popular natural language processing library in Python and you will see it everywhere there is text someone is touching.&lt;/p&gt;</description></item><item><title>Parens for Pyplot</title><link>https://gigasquidsoftware.com/blog/2020/01/18/parens-for-pyplot/</link><pubDate>Sat, 18 Jan 2020 15:39:00 +0000</pubDate><guid>https://gigasquidsoftware.com/blog/2020/01/18/parens-for-pyplot/</guid><description>&lt;p&gt;&lt;a href="https://github.com/cnuernber/libpython-clj"&gt;libpython-clj&lt;/a&gt; has opened the door for Clojure to directly interop with Python libraries. That means we can take just about any Python library and directly use it in our Clojure REPL. But what about &lt;a href="https://matplotlib.org/"&gt;matplotlib&lt;/a&gt;?&lt;/p&gt;
&lt;p&gt;Matplotlib.pyplot is a standard fixture in most tutorials and python data science code. How do we interop with a python graphics library?&lt;/p&gt;
&lt;h2 id="how-do-you-interop"&gt;How do you interop?&lt;/h2&gt;
&lt;p&gt;It turns out that matplotlib has a headless mode where we can export the graphics and then display it using any method that we would normally use to display a .png file. In my case, I made a quick macro for it using the shell &lt;code&gt;open&lt;/code&gt;. I&amp;rsquo;m sure that someone out that could improve upon it, (and maybe even make it a cool utility lib), but it suits what I&amp;rsquo;m doing so far:&lt;/p&gt;</description></item><item><title>Hugging Face GPT with Clojure</title><link>https://gigasquidsoftware.com/blog/2020/01/10/hugging-face-gpt-with-clojure/</link><pubDate>Fri, 10 Jan 2020 19:33:00 +0000</pubDate><guid>https://gigasquidsoftware.com/blog/2020/01/10/hugging-face-gpt-with-clojure/</guid><description>&lt;p&gt;&lt;img loading="lazy" src="https://live.staticflickr.com/65535/49364554561_6e4f4d0a51_w.jpg"&gt;&lt;/p&gt;
&lt;p&gt;A new age in Clojure has dawned. We now have interop access to any python library with &lt;a href="https://github.com/cnuernber/libpython-clj"&gt;libpython-clj&lt;/a&gt;.&lt;/p&gt;
&lt;br&gt;
&lt;p&gt;Let me pause a minute to repeat.&lt;/p&gt;
&lt;br&gt;
&lt;p&gt;** You can now interop with ANY python library. **&lt;/p&gt;
&lt;br&gt;
&lt;p&gt;I know. It&amp;rsquo;s overwhelming. It took a bit for me to come to grips with it too.&lt;/p&gt;
&lt;br&gt;
&lt;p&gt;Let&amp;rsquo;s take an example of something that I&amp;rsquo;ve &lt;em&gt;always&lt;/em&gt; wanted to do and have struggled with mightly finding a way to do it in Clojure:&lt;br&gt;
I want to use the latest cutting edge GPT2 code out there to generate text.&lt;/p&gt;</description></item><item><title>Integrating Deep Learning with clojure.spec</title><link>https://gigasquidsoftware.com/blog/2019/10/11/integrating-deep-learning-with-clojure.spec/</link><pubDate>Fri, 11 Oct 2019 13:51:00 +0000</pubDate><guid>https://gigasquidsoftware.com/blog/2019/10/11/integrating-deep-learning-with-clojure.spec/</guid><description>&lt;p&gt;clojure.spec allows you to write specifications for data and use them for validation. It also provides a generative aspect that allows for robust testing as well as an additional way to understand your data through manual inspection. The dual nature of validation and generation is a natural fit for deep learning models that consist of paired discriminator/generator models.&lt;/p&gt;
&lt;br&gt;
&lt;p&gt;&lt;strong&gt;&lt;strong&gt;TLDR: In this post we show that you can leverage the dual nature of clojure.spec&amp;rsquo;s validator/generator to incorporate a deep learning model&amp;rsquo;s classifier/generator.&lt;/strong&gt;&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>Focus On the Generator</title><link>https://gigasquidsoftware.com/blog/2019/09/06/focus-on-the-generator/</link><pubDate>Fri, 06 Sep 2019 18:07:00 +0000</pubDate><guid>https://gigasquidsoftware.com/blog/2019/09/06/focus-on-the-generator/</guid><description>&lt;p&gt;&lt;a data-flickr-embed="true" href="https://www.flickr.com/photos/smigla-bobinski/19705409981/in/album-72157647756733695/" title="SIMULACRA by Karina Smigla-Bobinski"&gt;&lt;img src="https://live.staticflickr.com/330/19705409981_4e0ae93572.jpg" width="500" height="267" alt="SIMULACRA by Karina Smigla-Bobinski"&gt;&lt;/a&gt;&lt;script async src="//embedr.flickr.com/assets/client-code.js" charset="utf-8"&gt;&lt;/script&gt;&lt;/p&gt;
&lt;p&gt;In this first post of this series, we took a look at a &lt;a href="https://gigasquidsoftware.com/blog/2019/08/16/simple-autoencoder/"&gt;simple autoencoder&lt;/a&gt;. It took and image and transformed it back to an image. Then, we &lt;a href="https://gigasquidsoftware.com/blog/2019/08/30/focus-on-the-discriminator/"&gt;focused in on the disciminator&lt;/a&gt; portion of the model, where we took an image and transformed it to a label. Now, we focus in on the generator portion of the model do the inverse operation: we transform a label to an image. In recap:&lt;/p&gt;</description></item><item><title>Focus on the Discriminator</title><link>https://gigasquidsoftware.com/blog/2019/08/30/focus-on-the-discriminator/</link><pubDate>Fri, 30 Aug 2019 10:16:00 +0000</pubDate><guid>https://gigasquidsoftware.com/blog/2019/08/30/focus-on-the-discriminator/</guid><description>&lt;p&gt;&lt;a data-flickr-embed="true" href="https://www.flickr.com/photos/marcomagrini/698692268/in/photolist-24JYSq-hTTAJN-4gjQW9-9GRKCW-4gfNhz-x2yZ-6Nnwy1-6Lm68p-66BVjW-8hawRk-4sE2Jz-5Z6uvQ-6B4iH3-qzDvGU-aNpvLT-9UFZLh-egKvNt-bMh6PR-ceG9AL-gDqtze-96JhRW-7EWMH6-3MTfDt-9rUJ4W-dFPssj-8LLrys-aDAda3-9rUJ45-7xLAFR-prSHik-7yDFHC-7erqEc-6YJx8e-39SyR4-dkQnGi-7hy6zT-4UokrH-hkMoBr-9tBN3K-jq8Bpu-aDMSk2-pwQdmt-9tFrUD-6TzF6G-WDAsCC-8Mm4tD-8M8hyS-4yzkGK-67MPUw-crfg" title="sunflowers"&gt;&lt;img src="https://live.staticflickr.com/1007/698692268_b31d429272.jpg" width="500" height="325" alt="sunflowers"&gt;&lt;/a&gt;&lt;script async src="//embedr.flickr.com/assets/client-code.js" charset="utf-8"&gt;&lt;/script&gt;&lt;/p&gt;
&lt;p&gt;In the &lt;a href="https://gigasquidsoftware.com/blog/2019/08/16/simple-autoencoder/"&gt;last post&lt;/a&gt;, we took a look at a simple autoencoder. The autoencoder is a deep learning model that takes in an image and, (through an encoder and decoder), works to produce the same image. In short:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Autoencoder: image -&amp;gt; image&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For a discriminator, we are going to focus on only the first half on the autoencoder.&lt;/p&gt;
&lt;p&gt;&lt;img alt="discriminator" loading="lazy" src="https://live.staticflickr.com/65535/48647347383_9577b7b672_b.jpg"&gt;&lt;/p&gt;
&lt;p&gt;Why only half? We want a different transformation. We are going to want to take an image as input and then do some &lt;em&gt;discrimination&lt;/em&gt; of the image and classify what type of image it is. In our case, the model is going to input an image of a handwritten digit and attempt to decide which number it is.&lt;/p&gt;</description></item><item><title>Simple Autoencoder</title><link>https://gigasquidsoftware.com/blog/2019/08/16/simple-autoencoder/</link><pubDate>Fri, 16 Aug 2019 16:16:00 +0000</pubDate><guid>https://gigasquidsoftware.com/blog/2019/08/16/simple-autoencoder/</guid><description>&lt;p&gt;&lt;a data-flickr-embed="true" href="https://www.flickr.com/photos/horlik/2901925672/in/photolist-5qr8pf-qkv3m8-32RwmC-dZBC2B-ja8ch-48vDg-f56TGS-oUfNKn-652ZqG-QnCrbX-y3C828-jeGkmu-dxwE9L-jKaGtZ-haQ6j3-61w8UJ-WmitYz-tLymA-dZCHC4-CGvx3R-CC3GPE-BSxzda-eu625R-vHAgnk-cR7WAE-jZiLgu-BsZwLP-fhfvPT-dN1Rf9-o8Mkby-8zDocw-5DvC7S-CEij58-oaw922-akUgeW-ayQiGU-aay1vS-2fVFske-2eoRpCe-rqwa4o-9VJPtv-opgEcq-MDfFe-9yzUaK-4is9Z9-cutXnm-f9U23-L7hpoe-3i3H-enSJKf" title="Perfect mirror"&gt;&lt;img src="https://live.staticflickr.com/3274/2901925672_325f5faeb8.jpg" width="500" height="364" alt="Perfect mirror"&gt;&lt;/a&gt;&lt;script async src="//embedr.flickr.com/assets/client-code.js" charset="utf-8"&gt;&lt;/script&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;If you look long enough into the autoencoder, it looks back at you.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;The Autoencoder is a fun deep learning model to look into. Its goal is simple: given an input image, we would like to have the same output image.&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s sort of an identity function for deep learning models, but it is composed of two parts: an encoder and decoder, with the encoder translating the images to a &lt;em&gt;latent space representation&lt;/em&gt; and the encoder translating that back to a regular images that we can view.&lt;/p&gt;</description></item><item><title>Clojure MXNet April Update</title><link>https://gigasquidsoftware.com/blog/2019/04/26/clojure-mxnet-april-update/</link><pubDate>Fri, 26 Apr 2019 15:51:00 +0000</pubDate><guid>https://gigasquidsoftware.com/blog/2019/04/26/clojure-mxnet-april-update/</guid><description>&lt;p&gt;Spring is bringing some beautiful new things to the &lt;a href="http://mxnet.incubator.apache.org/"&gt;Clojure MXNet&lt;/a&gt;. Here are some highlights for the month of April.&lt;/p&gt;
&lt;h2 id="shipped"&gt;Shipped&lt;/h2&gt;
&lt;p&gt;We&amp;rsquo;ve merged &lt;a href="https://github.com/apache/incubator-mxnet/pulls?utf8=%E2%9C%93&amp;amp;q=is%3Apr+is%3Aclosed+clojure"&gt;10 PRs&lt;/a&gt; over the last month. Many of them focus on core improvements to documentation and usability which is very important.&lt;/p&gt;
&lt;p&gt;The MXNet project is also preparing a new release &lt;code&gt;1.4.1&lt;/code&gt;, so keep on the lookout for that to hit in the near future.&lt;/p&gt;
&lt;h2 id="clojure-mxnet-made-simple-article-series"&gt;Clojure MXNet Made Simple Article Series&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://arthurcaillau.com/about/"&gt;Arthur Caillau&lt;/a&gt; added another post to his fantastic series - &lt;a href="https://arthurcaillau.com/mxnet-made-simple-pretrained-models/"&gt;MXNet made simple: Pretrained Models for image classification - Inception and VGG&lt;/a&gt;&lt;/p&gt;</description></item><item><title>Clojure MXNet March Update</title><link>https://gigasquidsoftware.com/blog/2019/03/22/clojure-mxnet-march-update/</link><pubDate>Fri, 22 Mar 2019 10:42:00 +0000</pubDate><guid>https://gigasquidsoftware.com/blog/2019/03/22/clojure-mxnet-march-update/</guid><description>&lt;p&gt;I&amp;rsquo;m starting a monthly update for &lt;a href="http://mxnet.incubator.apache.org/"&gt;Clojure MXNet&lt;/a&gt;. The goal is to share the progress and exciting things that are happening in the project and our community.&lt;/p&gt;
&lt;p&gt;Here&amp;rsquo;s some highlights for the month of March.&lt;/p&gt;
&lt;h2 id="shipped"&gt;Shipped&lt;/h2&gt;
&lt;p&gt;Under the shipped heading, the 1.4.0 release of MXNet has been released, along with the &lt;a href="https://search.maven.org/search?q=clojure%20mxnet"&gt;Clojure MXNet Jars&lt;/a&gt;. There have been improvements to the JVM memory management and an Image API addition. You can see the full list of changes &lt;a href="https://github.com/apache/incubator-mxnet/releases/tag/1.4.0#clojure"&gt;here&lt;/a&gt;&lt;/p&gt;</description></item><item><title>Object Detection with Clojure MXNet</title><link>https://gigasquidsoftware.com/blog/2019/01/19/object-detection-with-clojure-mxnet/</link><pubDate>Sat, 19 Jan 2019 13:34:00 +0000</pubDate><guid>https://gigasquidsoftware.com/blog/2019/01/19/object-detection-with-clojure-mxnet/</guid><description>&lt;p&gt;&lt;img loading="lazy" src="https://c1.staticflickr.com/8/7837/32928474208_4960caafb3.jpg"&gt;&lt;/p&gt;
&lt;p&gt;Object detection just landed in MXNet thanks to the work of contributors &lt;a href="https://github.com/kedarbellare"&gt;Kedar Bellare&lt;/a&gt; and &lt;a href="https://github.com/hellonico/"&gt;Nicolas Modrzyk&lt;/a&gt;. Kedar ported over the &lt;code&gt;infer&lt;/code&gt; package to Clojure, making inference and prediction much easier for users and Nicolas integrated in his &lt;a href="https://github.com/hellonico/origami"&gt;Origami&lt;/a&gt; OpenCV library into the the examples to make the visualizations happen.&lt;/p&gt;
&lt;p&gt;We&amp;rsquo;ll walk through the main steps to use the &lt;code&gt;infer&lt;/code&gt; object detection which include creating the detector with a model and then loading the image and running the inference on it.&lt;/p&gt;</description></item><item><title>How to GAN a Flan</title><link>https://gigasquidsoftware.com/blog/2018/12/18/how-to-gan-a-flan/</link><pubDate>Tue, 18 Dec 2018 16:34:00 +0000</pubDate><guid>https://gigasquidsoftware.com/blog/2018/12/18/how-to-gan-a-flan/</guid><description>&lt;p&gt;It&amp;rsquo;s holiday time and that means parties and getting together with friends. Bringing a baked good or dessert to a gathering is a time honored tradition. But what if this year, you could take it to the next level? Everyone brings actual food. But with the help of Deep Learning, you can bring something completely different - you can bring the &lt;em&gt;image&lt;/em&gt; of baked good! I&amp;rsquo;m not talking about just any old image that someone captured with a camera or created with a pen and paper. I&amp;rsquo;m talking about the computer itself &lt;strong&gt;creating&lt;/strong&gt;. This image would be never before seen, totally unique, and crafted by the creative process of the machine.&lt;/p&gt;</description></item><item><title>Clojure MXNet - The Module API</title><link>https://gigasquidsoftware.com/blog/2018/07/05/clojure-mxnet-the-module-api/</link><pubDate>Thu, 05 Jul 2018 19:39:00 +0000</pubDate><guid>https://gigasquidsoftware.com/blog/2018/07/05/clojure-mxnet-the-module-api/</guid><description>&lt;p&gt;&lt;img loading="lazy" src="https://cdn-images-1.medium.com/max/800/1*OoqsrMD7JzXAvRUGx_8_fg.jpeg"&gt;&lt;/p&gt;
&lt;p&gt;This is an introduction to the high level Clojure API for deep learning library &lt;a href="http://mxnet.incubator.apache.org/"&gt;MXNet&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The module API provides an intermediate and high-level interface for performing computation with neural networks in MXNet.&lt;/p&gt;
&lt;p&gt;To follow along with this documentation, you can use this namespace to with the needed requires:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-clojure" data-lang="clojure"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;(&lt;span style="color:#66d9ef"&gt;ns &lt;/span&gt;docs.module
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; (&lt;span style="color:#e6db74"&gt;:require&lt;/span&gt; [clojure.java.io &lt;span style="color:#e6db74"&gt;:as&lt;/span&gt; io]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [clojure.java.shell &lt;span style="color:#e6db74"&gt;:refer&lt;/span&gt; [sh]]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [org.apache.clojure-mxnet.eval-metric &lt;span style="color:#e6db74"&gt;:as&lt;/span&gt; eval-metric]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [org.apache.clojure-mxnet.io &lt;span style="color:#e6db74"&gt;:as&lt;/span&gt; mx-io]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [org.apache.clojure-mxnet.module &lt;span style="color:#e6db74"&gt;:as&lt;/span&gt; m]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [org.apache.clojure-mxnet.symbol &lt;span style="color:#e6db74"&gt;:as&lt;/span&gt; sym]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [org.apache.clojure-mxnet.ndarray &lt;span style="color:#e6db74"&gt;:as&lt;/span&gt; ndarray]))
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="prepare-the-data"&gt;Prepare the Data&lt;/h2&gt;
&lt;p&gt;In this example, we are going to use the MNIST data set. If you have cloned the MXNet repo and &lt;code&gt;cd contrib/clojure-package&lt;/code&gt;, we can run some helper scripts to download the data for us.&lt;/p&gt;</description></item><item><title>Clojure MXNet Joins the Apache MXNet Project</title><link>https://gigasquidsoftware.com/blog/2018/07/01/clojure-mxnet-joins-the-apache-mxnet-project/</link><pubDate>Sun, 01 Jul 2018 10:44:00 +0000</pubDate><guid>https://gigasquidsoftware.com/blog/2018/07/01/clojure-mxnet-joins-the-apache-mxnet-project/</guid><description>&lt;p&gt;&lt;img loading="lazy" src="https://cdn-images-1.medium.com/max/800/1*OoqsrMD7JzXAvRUGx_8_fg.jpeg"&gt;&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;m delighted to share the news that the Clojure package for &lt;a href="https://mxnet.apache.org/"&gt;MXNet&lt;/a&gt; has now joined the main Apache MXNet project. A big thank you to the efforts of everyone involved to make this possible. Having it as part of the main project is a great place for growth and collaboration that will benefit both MXNet and the Clojure community.&lt;/p&gt;
&lt;h2 id="invitation-to-join-and-contribute"&gt;Invitation to Join and Contribute&lt;/h2&gt;
&lt;p&gt;The Clojure package has been brought in as a &lt;em&gt;contrib&lt;/em&gt; &lt;a href="https://github.com/apache/incubator-mxnet/tree/master/contrib/clojure-package"&gt;clojure-package&lt;/a&gt;. It is still very new and will go through a period of feedback, stabilization, and improvement before it graduates out of contrib.&lt;/p&gt;</description></item><item><title>Meet Clojure MXNet - NDArray</title><link>https://gigasquidsoftware.com/blog/2018/06/03/meet-clojure-mxnet-ndarray/</link><pubDate>Sun, 03 Jun 2018 16:13:00 +0000</pubDate><guid>https://gigasquidsoftware.com/blog/2018/06/03/meet-clojure-mxnet-ndarray/</guid><description>&lt;p&gt;&lt;img loading="lazy" src="https://cdn-images-1.medium.com/max/800/1*OoqsrMD7JzXAvRUGx_8_fg.jpeg"&gt;&lt;/p&gt;
&lt;p&gt;This is the beginning of a series of blog posts to get to know the &lt;a href="https://mxnet.apache.org/"&gt;Apache MXNet&lt;/a&gt; Deep Learning project and the new Clojure language binding &lt;a href="https://github.com/apache/incubator-mxnet/tree/master/contrib/clojure-package"&gt;clojure-package&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;MXNet is a first class, modern deep learning library that AWS has officially picked as its chosen library. It supports multiple languages on a first class basis and is incubating as an Apache project.&lt;/p&gt;
&lt;p&gt;The motivation for creating a Clojure package is to be able to open the deep learning library to the Clojure ecosystem and build bridges for future development and innovation for the community. It provides all the needed tools including low level and high level apis, dynamic graphs, and things like GAN and natural language support.&lt;/p&gt;</description></item><item><title>Cats and Dogs with Cortex Redux</title><link>https://gigasquidsoftware.com/blog/2017/11/07/cats-and-dogs-with-cortex-redux/</link><pubDate>Tue, 07 Nov 2017 18:51:00 +0000</pubDate><guid>https://gigasquidsoftware.com/blog/2017/11/07/cats-and-dogs-with-cortex-redux/</guid><description>&lt;p&gt;I wrote a &lt;a href="http://gigasquidsoftware.com/blog/2016/12/27/deep-learning-in-clojure-with-cortex/"&gt;blog post&lt;/a&gt; a while back about using a Clojure machine learning library called &lt;a href="https://github.com/thinktopic/cortex"&gt;Cortex&lt;/a&gt; to do the Kaggle Cats and Dogs classification challenge.&lt;/p&gt;
&lt;p&gt;I wanted to revisit it for a few reasons. The first one is that the Cortex library has progressed and improved considerably over the last year. It&amp;rsquo;s still not at version 1.0, but it my eyes, it&amp;rsquo;s really starting to shine. The second reason is that they recently published an &lt;a href="https://github.com/thinktopic/cortex/tree/master/examples/resnet-retrain"&gt;example&lt;/a&gt; of using the RESNET50 model, (I&amp;rsquo;ll explain later on), to do fine-tuning or transfer learning. The third reason, is that there is a great new plugin for leiningen the supports using &lt;a href="https://github.com/didiercrunch/lein-jupyter"&gt;Jupyter notebooks with Clojure projects&lt;/a&gt;. These notebooks are a great way of doing walkthroughs and tutorials.&lt;/p&gt;</description></item><item><title>Deep Learning in Clojure with Cortex</title><link>https://gigasquidsoftware.com/blog/2016/12/27/deep-learning-in-clojure-with-cortex/</link><pubDate>Tue, 27 Dec 2016 10:44:00 +0000</pubDate><guid>https://gigasquidsoftware.com/blog/2016/12/27/deep-learning-in-clojure-with-cortex/</guid><description>&lt;p&gt;&lt;strong&gt;Update: Cortex has moved along since I first wrote this blog post, so if you are looking to run the examples, please go and clone the &lt;a href="https://github.com/thinktopic/cortex"&gt;Cortex&lt;/a&gt; repo and look for the cats and dogs code in the examples directory.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;There is an awesome new &lt;em&gt;Clojure-first&lt;/em&gt; machine learning library called &lt;a href="https://github.com/thinktopic/cortex"&gt;Cortex&lt;/a&gt; that was open sourced recently. I&amp;rsquo;ve been exploring it lately and wanted to share my discoveries so far in this post. In our exploration, we are going to tackle one of the classic classification problems of the internet. How do you tell the difference between a cat and dog pic?&lt;/p&gt;</description></item><item><title>Genetic Programming with clojure.spec</title><link>https://gigasquidsoftware.com/blog/2016/07/18/genetic-programming-with-clojure.spec/</link><pubDate>Mon, 18 Jul 2016 09:40:00 +0000</pubDate><guid>https://gigasquidsoftware.com/blog/2016/07/18/genetic-programming-with-clojure.spec/</guid><description>&lt;p&gt;&lt;img loading="lazy" src="http://c1.staticflickr.com/9/8815/28320682816_44780d1b75.jpg"&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blog.cognitect.com/blog/2016/5/23/introducing-clojurespec"&gt;Clojure.spec&lt;/a&gt; is a new library for Clojure that enables you to write specifications for your program. In an earlier &lt;a href="http://gigasquidsoftware.com/blog/2016/05/29/one-fish-spec-fish/"&gt;post&lt;/a&gt;, I showed off some of it&amp;rsquo;s power to generate test data from your specifications. It&amp;rsquo;s a pretty cool feature. Given some clojure.spec code, you can generate sample data for you based off of the specifications. But what if you could write a program that would &lt;em&gt;generate&lt;/em&gt; your clojure.spec program based off of data so that you could generate more test data?&lt;/p&gt;</description></item><item><title>One Fish Spec Fish</title><link>https://gigasquidsoftware.com/blog/2016/05/29/one-fish-spec-fish/</link><pubDate>Sun, 29 May 2016 16:29:00 +0000</pubDate><guid>https://gigasquidsoftware.com/blog/2016/05/29/one-fish-spec-fish/</guid><description>&lt;p&gt;&lt;img loading="lazy" src="https://upload.wikimedia.org/wikipedia/en/9/9a/One_Fish_Two_Fish_Red_Fish_Blue_Fish_%28cover_art%29.jpg"&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blog.cognitect.com/blog/2016/5/23/introducing-clojurespec"&gt;Clojure.spec&lt;/a&gt; is an exciting, new core library for Clojure. It enables pragmatic specifications for functions and brings a new level of robustness to building software in Clojure, along with unexpected side benefits. One of which is the ability to write specifications that generate Dr. Seuss inspired rhymes.&lt;/p&gt;
&lt;p&gt;In this blog post, we&amp;rsquo;ll take a tour of writing specifications for a clojure function, as well as the power of data generation. First, some inspirational words:&lt;/p&gt;</description></item><item><title> Kolmogorov-Uspensky Machine</title><link>https://gigasquidsoftware.com/blog/2016/03/16/kolmogorov-uspensky-machine/</link><pubDate>Wed, 16 Mar 2016 18:19:00 +0000</pubDate><guid>https://gigasquidsoftware.com/blog/2016/03/16/kolmogorov-uspensky-machine/</guid><description>&lt;p&gt;It happened again. I was sitting down reading a paper and I came across the phrase &lt;em&gt;Kolmogorov-Uspensky machine&lt;/em&gt; and I had no idea what it was. My initial reaction was just to move on. It probably wasn&amp;rsquo;t important, I told myself, just a detail that I could skim over. I took a sip of my tea and continued on. The next paragraph it appeared &lt;em&gt;again&lt;/em&gt;. It was just sticking up like a thread waiting to be pulled. Still, I resisted. After all, I wasn&amp;rsquo;t even near my computer. I would have to get up an walk into the other room. After considering it for a moment, inertia won out and I continued my reading. There it was &lt;em&gt;once more&lt;/em&gt;. This time right in the same paragraph, silently mocking me. I knew I had to do something so I strode to my computer and pulled the thread.&lt;/p&gt;</description></item><item><title>Fairy Tale Word Vectors</title><link>https://gigasquidsoftware.com/blog/2016/02/10/fairy-tale-word-vectors/</link><pubDate>Wed, 10 Feb 2016 21:27:00 +0000</pubDate><guid>https://gigasquidsoftware.com/blog/2016/02/10/fairy-tale-word-vectors/</guid><description>&lt;p&gt;&lt;img loading="lazy" src="http://c2.staticflickr.com/2/1558/24654386380_bda44419a8_n.jpg"&gt;&lt;/p&gt;
&lt;p&gt;This post continues our exploration from the last blog post &lt;a href="http://gigasquidsoftware.com/blog/2016/02/06/why-hyperdimensional-socks-never-match/"&gt;Why Hyperdimensional Socks Never Match&lt;/a&gt;. We are still working our way through &lt;a href="http://redwood.berkeley.edu/pkanerva/papers/kanerva09-hyperdimensional.pdf"&gt;Kanerva&amp;rsquo;s paper&lt;/a&gt;. This time, with the basics of hypervectors under our belts, we&amp;rsquo;re ready to explore how words can be expressed as context vectors. Once in a high dimensional form, you can compare two words to see how similar they are and even perform reasoning.&lt;/p&gt;
&lt;p&gt;To kick off our word vector adventure, we need some words. Preferring whimsy over the Google news, our text will be taken from ten freely available fairy tale books on &lt;a href="http://www.gutenberg.org/"&gt;http://www.gutenberg.org/&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>Why Hyperdimensional Socks Never Match</title><link>https://gigasquidsoftware.com/blog/2016/02/06/why-hyperdimensional-socks-never-match/</link><pubDate>Sat, 06 Feb 2016 14:26:00 +0000</pubDate><guid>https://gigasquidsoftware.com/blog/2016/02/06/why-hyperdimensional-socks-never-match/</guid><description>&lt;p&gt;&lt;img loading="lazy" src="http://c2.staticflickr.com/8/7238/7188420611_a99f936971_n.jpg"&gt;&lt;/p&gt;
&lt;p&gt;The nature of computing in hyperdimensions is a strange and wonderful place. I have only started to scratch the surface by reading a paper by &lt;a href="http://redwood.berkeley.edu/pkanerva/papers/kanerva09-hyperdimensional.pdf"&gt;Kanerva&lt;/a&gt;. Not only is it interesting from a computer science standpoint, it&amp;rsquo;s also interesting from a cognitive science point of view. In fact, it could hold the key to better model AI and general reasoning. This blog is a casual stroll through some of the main points of Kanerva&amp;rsquo;s paper along with examples in Clojure to make it tangible. First things first, what is a hyperdimension?&lt;/p&gt;</description></item><item><title>Speech Act Classification for Text with Clojure</title><link>https://gigasquidsoftware.com/blog/2015/10/20/speech-act-classification-for-text-with-clojure/</link><pubDate>Tue, 20 Oct 2015 13:11:00 +0000</pubDate><guid>https://gigasquidsoftware.com/blog/2015/10/20/speech-act-classification-for-text-with-clojure/</guid><description>&lt;p&gt;We humans are quite wonderful. We do amazing things every day without even realizing it. One of them, you are doing right now. You are reading text. Your brain is taking these jumbles of letters and spaces in this sentence, which in linguist terms is called an &lt;a href="https://en.wikipedia.org/wiki/Utterance"&gt;utterance&lt;/a&gt;, and making sense out of it. The individual meanings of sentences might be quite complex.&lt;/p&gt;
&lt;p&gt;Take for example the utterance, &amp;ldquo;I like cheese&amp;rdquo;. To understand it properly, you need to know the meanings of the individual words. In particular, you would need to know that cheese is a tasty food stuff that is made from milk. This would be a detailed and full understanding. But there is a higher level of understanding that we can look at called &lt;a href="https://en.wikipedia.org/wiki/Utterance"&gt;Speech Acts&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>Conversations with Datomic - Part 3</title><link>https://gigasquidsoftware.com/blog/2015/08/25/conversations-with-datomic-part-3/</link><pubDate>Tue, 25 Aug 2015 10:28:00 +0000</pubDate><guid>https://gigasquidsoftware.com/blog/2015/08/25/conversations-with-datomic-part-3/</guid><description>&lt;p&gt;&lt;img loading="lazy" src="https://avatars0.githubusercontent.com/u/1478702?v=3&amp;s=200"&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;This is a continuation of the &lt;a href="http://gigasquidsoftware.com/blog/2015/08/15/conversations-with-datomic/"&gt;first&lt;/a&gt; and
&lt;a href="http://gigasquidsoftware.com/blog/2015/08/19/conversations-with-datomic-part-2/"&gt;second&lt;/a&gt; conversations in which topics such as creating databases,
learning facts, querying, and time traveling were discussed. Today&amp;rsquo;s topics include architecture, caching, and scaling.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Human:&lt;/strong&gt; Hello again &lt;a href="http://www.datomic.com/"&gt;Datomic&lt;/a&gt;. Ready to talk again?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Datomic:&lt;/strong&gt; Sure. I think you wanted to ask me some questions about how I would fit in with your other systems.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Human:&lt;/strong&gt; Yes. Like I was saying earlier, I think your abilities to learn facts, reason about them, and keep track of the history of all those facts is really great.
I am interested in having you work with me every day, but first I want to understand your components so that I can make sure you are a good fit for us.&lt;/p&gt;</description></item><item><title>Conversations with Datomic Part 2</title><link>https://gigasquidsoftware.com/blog/2015/08/19/conversations-with-datomic-part-2/</link><pubDate>Wed, 19 Aug 2015 08:56:00 +0000</pubDate><guid>https://gigasquidsoftware.com/blog/2015/08/19/conversations-with-datomic-part-2/</guid><description>&lt;p&gt;&lt;img loading="lazy" src="https://avatars0.githubusercontent.com/u/1478702?v=3&amp;s=200"&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;The following is a continuation of the first &lt;a href="http://gigasquidsoftware.com/blog/2015/08/15/conversations-with-datomic/"&gt;conversation&lt;/a&gt; which touched on schema creation and querying. This conversation includes learning new facts, time, and the sometimes unfortunate reality of lawyers.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Human:&lt;/strong&gt; Hi &lt;a href="http://www.datomic.com/"&gt;Datomic&lt;/a&gt;. I am back from my tea and cookies break. I really enjoyed talking with you, could we continue our conversation?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Datomic:&lt;/strong&gt; Certainly. Let me see, where did we leave off?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Human:&lt;/strong&gt; Let me check my &lt;a href="https://gist.github.com/gigasquid/92a1effb14fe4f6ced59"&gt;notes&lt;/a&gt;. Oh yes, we had created a database and filled it with facts about some dogs and owners. You showed me how to ask you things about the facts, like which dogs liked cheese.&lt;/p&gt;</description></item><item><title>Conversations with Datomic</title><link>https://gigasquidsoftware.com/blog/2015/08/15/conversations-with-datomic/</link><pubDate>Sat, 15 Aug 2015 10:29:00 +0000</pubDate><guid>https://gigasquidsoftware.com/blog/2015/08/15/conversations-with-datomic/</guid><description>&lt;p&gt;&lt;img loading="lazy" src="https://avatars0.githubusercontent.com/u/1478702?v=3&amp;s=200"&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Human:&lt;/strong&gt; Hi &lt;a href="http://www.datomic.com/"&gt;Datomic&lt;/a&gt;. I have been hearing good things about you. I would like to talk to you and get to know you. Is that alright?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Datomic:&lt;/strong&gt; Sure! I would be happy to talk with you. What language would you like to converse in?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Human:&lt;/strong&gt; I like Clojure.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Datomic:&lt;/strong&gt; That is one of my favorites too. You know how to setup a Leiningen project right?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Human:&lt;/strong&gt; Oh yes. What dependency should I use?&lt;/p&gt;</description></item><item><title>How Not to Panic While Writing a Clojure Book</title><link>https://gigasquidsoftware.com/blog/2015/05/22/how-not-to-panic-while-writing-a-clojure-book/</link><pubDate>Fri, 22 May 2015 09:11:00 +0000</pubDate><guid>https://gigasquidsoftware.com/blog/2015/05/22/how-not-to-panic-while-writing-a-clojure-book/</guid><description>&lt;p&gt;I made it to that magical moment when the Clojure book I had been working on so long was published and I could actually hold it in my hand.&lt;/p&gt;
&lt;p&gt;&lt;img loading="lazy" src="https://pbs.twimg.com/media/CDWsQPCUgAERViK.jpg"&gt;&lt;/p&gt;
&lt;p&gt;It was an immense project and I am very happy that it is finally done. Since then, I met some people that are interested in writing books as well.
They asked if I had any insights or tips having gone through the process as a first time author. I have collected them in this post in hopes that they will be helpful to those going through the process themselves.&lt;/p&gt;</description></item><item><title>Partition with Game of Thrones Pugs</title><link>https://gigasquidsoftware.com/blog/2015/01/26/partition-with-game-of-thrones-pugs/</link><pubDate>Mon, 26 Jan 2015 18:55:00 +0000</pubDate><guid>https://gigasquidsoftware.com/blog/2015/01/26/partition-with-game-of-thrones-pugs/</guid><description>&lt;p&gt;Clojure&amp;rsquo;s &lt;em&gt;partition&lt;/em&gt; and &lt;em&gt;partition-all&lt;/em&gt; functions are very useful.
However, I have been bitten a few times using &lt;em&gt;partition&lt;/em&gt; when I
really wanted &lt;em&gt;partition-all&lt;/em&gt;. So to help myself and all of you to
remember it, I have made some diagrams with &lt;a href="http://www.designswan.com/archives/the-pugs-of-westeros-cute-pugs-dressed-up-like-characters-in-game-of-thrones.html"&gt;pugs from the Game of Thrones&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;In code, &lt;a href="http://clojuredocs.org/clojure.core/partition"&gt;partition&lt;/a&gt; takes a collection and returns a lazy sequence of
lists, each containing n items.&lt;/p&gt;
&lt;p&gt;To demonstrate this with pugs, we will partition 5 pugs into groups of
twos.&lt;/p&gt;</description></item><item><title>Clojure FizzBuzz without Conditionals</title><link>https://gigasquidsoftware.com/blog/2014/11/13/clojure-fizzbuzz-without-conditionals/</link><pubDate>Thu, 13 Nov 2014 21:43:00 +0000</pubDate><guid>https://gigasquidsoftware.com/blog/2014/11/13/clojure-fizzbuzz-without-conditionals/</guid><description>&lt;p&gt;&lt;img loading="lazy" src="https://c1.staticflickr.com/5/4136/4825113119_9630b7927f.jpg"&gt;&lt;/p&gt;
&lt;p&gt;Sure you may have done FizzBuzz before. Maybe you have even done it
in Clojure. But have you done it without the use of &lt;em&gt;any&lt;/em&gt;
conditionals?&lt;/p&gt;
&lt;p&gt;As your brain starts to work on the &lt;em&gt;how&lt;/em&gt; this we be done, you might
be wondering &lt;em&gt;why&lt;/em&gt; you should do this in the first place?&lt;/p&gt;
&lt;p&gt;There are two very good reasons for this. The first is that it is a
&lt;em&gt;kata&lt;/em&gt;.&lt;/p&gt;
&lt;h2 id="katas-build-your-code-practice"&gt;Katas build your code practice&lt;/h2&gt;
&lt;p&gt;&lt;img loading="lazy" src="https://c4.staticflickr.com/4/3552/3434757877_711709da58_b.jpg"&gt;&lt;/p&gt;</description></item><item><title>Green Eggs and Transducers</title><link>https://gigasquidsoftware.com/blog/2014/09/06/green-eggs-and-transducers/</link><pubDate>Sat, 06 Sep 2014 15:47:00 +0000</pubDate><guid>https://gigasquidsoftware.com/blog/2014/09/06/green-eggs-and-transducers/</guid><description>&lt;p&gt;&lt;img loading="lazy" src="http://upload.wikimedia.org/wikipedia/en/c/c2/Greenegg.gif"&gt;&lt;/p&gt;
&lt;p&gt;A quick tour of Clojure Transducers with core.async with Dr. Seuss as a guide.&lt;/p&gt;
&lt;p&gt;Follow along at home by:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;lein new green-eggs&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;modify your project.clj to include the following:&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-clojure" data-lang="clojure"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;(&lt;span style="color:#66d9ef"&gt;defproject &lt;/span&gt;green-eggs &lt;span style="color:#e6db74"&gt;&amp;#34;0.1.0-SNAPSHOT&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;:description&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;try them&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;:url&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;http://en.wikipedia.org/wiki/Green_Eggs_and_Ham&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;:license&lt;/span&gt; {&lt;span style="color:#e6db74"&gt;:name&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;Eclipse Public License&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;:url&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;http://www.eclipse.org/legal/epl-v10.html&amp;#34;&lt;/span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;:dependencies&lt;/span&gt; [[org.clojure/clojure &lt;span style="color:#e6db74"&gt;&amp;#34;1.7.0-alpha1&amp;#34;&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [org.clojure/core.async &lt;span style="color:#e6db74"&gt;&amp;#34;0.1.338.0-5c5012-alpha&amp;#34;&lt;/span&gt;]])
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;Start up a repl and hack in!&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="green-eggs-and-ham"&gt;Green Eggs and Ham&lt;/h2&gt;
&lt;p&gt;Transducers are a new feature of Clojure 1.7. Instead of trying to explain them with words, let&amp;rsquo;s take a look of them in action. First we need some data. Let&amp;rsquo;s def a vector of all the places you could try green eggs and ham.&lt;/p&gt;</description></item><item><title>The Proper Pronunciation of Clojure's Assoc</title><link>https://gigasquidsoftware.com/blog/2014/07/28/the-proper-pronunciation-of-clojures-assoc/</link><pubDate>Mon, 28 Jul 2014 20:27:00 +0000</pubDate><guid>https://gigasquidsoftware.com/blog/2014/07/28/the-proper-pronunciation-of-clojures-assoc/</guid><description>&lt;p&gt;Sometimes I pause before talking to someone about Clojure code. Not because I am unsure of the code, but because I am unsure of
how to pronounce the code. The particular code in question is
Clojure&amp;rsquo;s &lt;em&gt;assoc&lt;/em&gt;. I have heard it pronounced two ways. One is
&amp;ldquo;assosh&amp;rdquo;, the other is &amp;ldquo;assok&amp;rdquo;. So, to determine it, I decided to conduct a
scientific poll of the Clojure community.&lt;/p&gt;
&lt;p&gt;I posted the poll on
&lt;a href="https://twitter.com/gigasquid/status/493891057906896896"&gt;twitter&lt;/a&gt; to
the Cojure community who follow me. The control group poll was not viewed
by those who do not follow me, and/or, are not on twitter.&lt;/p&gt;</description></item><item><title>Clojure X-Men</title><link>https://gigasquidsoftware.com/blog/2014/07/27/clojure-x-men/</link><pubDate>Sun, 27 Jul 2014 20:12:00 +0000</pubDate><guid>https://gigasquidsoftware.com/blog/2014/07/27/clojure-x-men/</guid><description>&lt;p&gt;&lt;img loading="lazy" src="https://c2.staticflickr.com/6/5557/14761955842_6a8bf4a66a_n.jpg"&gt;&lt;/p&gt;
&lt;p&gt;Nobody knows how it happened. Some people think it was due to the rapid expansion and adoption of Clojure. Other people say that the language itself was caused by something deeper and more magical. No one knows for sure. All that we really know is that people starting being born with extraordinary powers. Powers that no human had had before. They were strange and unique to each person they touched. The only thing that they all had in common, was that each was an aspect of the Clojure programming language.&lt;/p&gt;</description></item><item><title>World Domination with Hexapods and Clojure</title><link>https://gigasquidsoftware.com/blog/2014/03/20/world-domination-with-hexapods-and-clojure/</link><pubDate>Thu, 20 Mar 2014 21:00:00 +0000</pubDate><guid>https://gigasquidsoftware.com/blog/2014/03/20/world-domination-with-hexapods-and-clojure/</guid><description>&lt;p&gt;Once you have your &lt;a href="http://gigasquidsoftware.com/blog/2014/03/19/walking-with-hexapods/"&gt;hexapod assembled and running using the hand held
controller&lt;/a&gt;,
of course, your thoughts naturally turn to world domination.&lt;/p&gt;
&lt;h2 id="the-most-powerful-tool-in-the-world-is-the-clojure-repl"&gt;The most powerful tool in the world is the Clojure REPL&lt;/h2&gt;
&lt;p&gt;World domination requires the most powerful tools available. That of
course calls for Clojure and the Clojure REPL. I recommend Emacs
as the editor of choice of such an endeavor. However, it if you are
content with city, state, or single country domination, other editors
that support Clojure are also fine.&lt;/p&gt;</description></item><item><title>Hitchhiker's Clojure has a New Home</title><link>https://gigasquidsoftware.com/blog/2014/02/16/hitchhikers-clojure-has-a-new-home/</link><pubDate>Sun, 16 Feb 2014 14:57:00 +0000</pubDate><guid>https://gigasquidsoftware.com/blog/2014/02/16/hitchhikers-clojure-has-a-new-home/</guid><description>&lt;p&gt;The Hitchhiker&amp;rsquo;s Guide to Clojure posts now have a new home to make it
easier to read them in a chronological fashion.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://hitchhikersclojure.com/"&gt;http://hitchhikersclojure.com/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;There is also a public &lt;a href="https://github.com/gigasquid/hitchhikers-clojure"&gt;repo&lt;/a&gt; - feel free to contribute spelling and
grammar fixes, or your great ideas.&lt;/p&gt;</description></item><item><title>Hitchhiker's Guide to Clojure - Part 3</title><link>https://gigasquidsoftware.com/blog/2014/02/15/hitchhikers-guide-to-clojure-part-3/</link><pubDate>Sat, 15 Feb 2014 13:48:00 +0000</pubDate><guid>https://gigasquidsoftware.com/blog/2014/02/15/hitchhikers-guide-to-clojure-part-3/</guid><description>&lt;p&gt;Amy and Frank fled down the stairs from her office and met an
unexpected obstacle to their exit, a locked door. As
they peered out the window, they saw yesterday&amp;rsquo;s Amy pull up in the
parking space, get out, retrieve her laptop, and start to head in
the front door.&lt;/p&gt;
&lt;p&gt;&amp;ldquo;Oh good, we can take your car&amp;rdquo;, said Frank.&lt;/p&gt;
&lt;p&gt;Amy took a second to recover from the shock of seeing what her hair really
looked like from behind and then asked, &amp;ldquo;But, how can we get to it?
The door is locked, and we
can&amp;rsquo;t go back up to the office&amp;hellip; I would meet myself.&amp;rdquo;&lt;/p&gt;</description></item><item><title>Hitchhiker's Guide to Clojure - Part 2</title><link>https://gigasquidsoftware.com/blog/2014/02/08/hitchhikers-guide-to-clojure-part-2/</link><pubDate>Sat, 08 Feb 2014 21:20:00 +0000</pubDate><guid>https://gigasquidsoftware.com/blog/2014/02/08/hitchhikers-guide-to-clojure-part-2/</guid><description>&lt;p&gt;Amy and Frank were hurtled quite rapidly through time and space after
attaching themselves to a transaction headed through the
&lt;a href="http://docs.datomic.com/transactions.html"&gt;Datomic Transactor&lt;/a&gt;. From
there things slowed down a bit, then took a sharp left and
ricocheted off again with incredible speed until they landed in another
&lt;a href="http://docs.datomic.com/architecture.html"&gt;Datomic Peer&lt;/a&gt;, and finally
appeared in the same room. Amy was quite startled by the
anti-climatic nature of the whole dematerializing and rematerializing
in the same exact spot, and didn&amp;rsquo;t really know what to do next. She
surveyed her office and found it exactly the same,
except for two distinct details. For one, the pistachio shells had
disappeared, and for another, the date on the computer showed
yesterday at 8:00 am. She tried to connect these facts rationally
with the pistachios in her pocket and finally said,&lt;/p&gt;</description></item><item><title>Hitchhiker's Guide to Clojure</title><link>https://gigasquidsoftware.com/blog/2014/02/01/hitchhikers-guide-to-clojure/</link><pubDate>Sat, 01 Feb 2014 19:33:00 +0000</pubDate><guid>https://gigasquidsoftware.com/blog/2014/02/01/hitchhikers-guide-to-clojure/</guid><description>&lt;p&gt;&lt;img loading="lazy" src="http://farm6.staticflickr.com/5480/12258585125_36e8fdee1e.jpg"&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;The following is a cautionary example of the unpredictable
combination of Clojure, a marathon viewing of the BBC&amp;rsquo;s series &amp;ldquo;The
Hitchhiker&amp;rsquo;s Guide to the Galaxy&amp;rdquo;, and a questionable amount of
cheese.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;There have been many tourism guides to the
&lt;a href="http://clojure.org/"&gt;Clojure&lt;/a&gt; programming language. Some that easily
come to mind for their intellectual erudition and prose are &amp;ldquo;The Joy
of Touring Clojure&amp;rdquo;, &amp;ldquo;Touring Clojure&amp;rdquo;, &amp;ldquo;Clojure Touring&amp;rdquo;, and the
newest edition of &amp;ldquo;Touring Clojure Touring&amp;rdquo;. However, none has
surpassed the wild popularity of &amp;ldquo;The Hitchhiker&amp;rsquo;s Guide to Clojure&amp;rdquo;.
It has sold over 500 million copies and has been on the &amp;ldquo;BigInt&amp;rsquo;s
Board of Programming Language Tourism&amp;rdquo; for the past 15 years. While,
arguably, it
lacked the in-depth coverage of the other guides, it made up for it in
useful practical tips, such as what to do if you find a nil in your
pistachio. Most of all, the cover had the following words printed in
very large letters: &lt;strong&gt;Don&amp;rsquo;t Worry About the Parens&lt;/strong&gt;.&lt;/p&gt;</description></item><item><title>Neural Networks in Clojure with core.matrix</title><link>https://gigasquidsoftware.com/blog/2013/12/02/neural-networks-in-clojure-with-core.matrix/</link><pubDate>Mon, 02 Dec 2013 19:28:00 +0000</pubDate><guid>https://gigasquidsoftware.com/blog/2013/12/02/neural-networks-in-clojure-with-core.matrix/</guid><description>&lt;p&gt;After having spent some time recently looking at top-down AI, I
thought I would spend some time looking at bottom&amp;rsquo;s up AI, machine
learning and neural networks.&lt;/p&gt;
&lt;p&gt;I was pleasantly introduced to &lt;a href="https://twitter.com/mikera"&gt;@mikea&amp;rsquo;s&lt;/a&gt; &lt;a href="https://github.com/mikera/core.matrix"&gt;core.matrix&lt;/a&gt; at Clojure Conj
this year and wanted to try making my own neural network using the
library. The purpose of this blog is to share my learnings along the
way.&lt;/p&gt;
&lt;h2 id="what-is-a-neural-network"&gt;What is a neural network?&lt;/h2&gt;
&lt;p&gt;A neural network is an approach to machine learning that involves
simulating, (in an idealized way), the way our brains work on a
biological level. There are three layers to neural network: the input
layer, the hidden layers, and the output layer. Each layer consists
of neurons that have a value. In each layer, each neuron is connected to
the neuron in the next layer by a connection strength. To get data
into the neural network, you assign values to the input layer, (values
between 0 and 1). These values are then &amp;ldquo;fed forward&amp;rdquo; to the hidden layer neurons though an algorithm that
relies on the input values and the connection strengths. The values
are finally &amp;ldquo;fed forward&amp;rdquo; in a similar fashion to the output layer.
The &amp;ldquo;learning&amp;rdquo; portion of the neural network comes from &amp;ldquo;training&amp;rdquo; the
network data. The training data consists of a collection of
associated input values and target values. The training process at a
high level looks like this:&lt;/p&gt;</description></item><item><title>Looking Forward to London</title><link>https://gigasquidsoftware.com/blog/2013/10/03/looking-forward-to-london/</link><pubDate>Thu, 03 Oct 2013 20:43:00 +0000</pubDate><guid>https://gigasquidsoftware.com/blog/2013/10/03/looking-forward-to-london/</guid><description>&lt;p&gt;I really love the London. I have only been once many years ago,
but I was enchanted. Here is a partial list of my favorite
things:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Ducks in Regent&amp;rsquo;s Park&lt;/li&gt;
&lt;li&gt;Tea Rooms&lt;/li&gt;
&lt;li&gt;The Food Hall at Harrod&amp;rsquo;s&lt;/li&gt;
&lt;li&gt;The British Museum&lt;/li&gt;
&lt;li&gt;English Breakfasts&lt;/li&gt;
&lt;li&gt;The way the British put an extra &amp;ldquo;r&amp;rdquo; in phrases like &amp;ldquo;vanilla in it&amp;rdquo;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;As you know, I also adore Clojure. So I am absolutely thrilled to combine the two.&lt;/p&gt;</description></item><item><title>Controlling Multiple Drones with Clojure and Goals and Beliefs</title><link>https://gigasquidsoftware.com/blog/2013/09/05/controlling-multiple-drones-with-clojure-and-goals-and-beliefs/</link><pubDate>Thu, 05 Sep 2013 15:35:00 +0000</pubDate><guid>https://gigasquidsoftware.com/blog/2013/09/05/controlling-multiple-drones-with-clojure-and-goals-and-beliefs/</guid><description>&lt;h2 id="how-to-control-multiple-drones-with-clojure"&gt;How to Control Multiple Drones with Clojure&lt;/h2&gt;
&lt;p&gt;The &lt;a href="https://github.com/gigasquid/clj-drone"&gt;clj-drone&lt;/a&gt; library now
has multi-drone support! You can now send multiple drones commands,
receive their navigation data, and even have them perform their
actions autonomously with goals and beliefs.&lt;/p&gt;
&lt;p&gt;It takes a bit of extra setup to control more than one drone. We need to assign them each an
ip and get them talking as an adhoc network.
&lt;a href="https://twitter.com/jimweirich"&gt;Jim Weirich&lt;/a&gt; creating a neat little
script to run on the drone to do just this. Here are the
instructions:&lt;/p&gt;</description></item><item><title>Babar - A Little Language with Speech Acts for Machines</title><link>https://gigasquidsoftware.com/blog/2013/06/04/babar-a-little-language-with-speech-acts-for-machines/</link><pubDate>Tue, 04 Jun 2013 18:57:52 +0000</pubDate><guid>https://gigasquidsoftware.com/blog/2013/06/04/babar-a-little-language-with-speech-acts-for-machines/</guid><description>&lt;p&gt;&lt;img loading="lazy" src="http://farm8.staticflickr.com/7352/9925781735_77dfa3157b_o.jpg"&gt;&lt;/p&gt;
&lt;h2 id="preface-a-gentle-obsession"&gt;Preface: A Gentle Obsession&lt;/h2&gt;
&lt;p&gt;About a year ago, I picked up John McCarthy&amp;rsquo;s paper on &lt;a href="http://web.archive.org/web/20131014084908/http://www-formal.stanford.edu/jmc/elephant/elephant.html"&gt;Elephant 2000&lt;/a&gt;. I have to admit that I only understood about 10% of it. But I was so intrigued by the ideas that it sent me on a quest. I re-read it numerous times, slept with it under my pillow, and finally decided that I needed to read his other papers to get an insight into his thoughts. I began a considered effort with &lt;a href="http://gigasquidsoftware.com/blog/2012/09/18/7-john-mccarthy-papers-in-7-days-prologue/"&gt;Seven McCarthy Papers in Seven Weeks&lt;/a&gt;. It ended up taking about three months, rather than seven 7 weeks. Again I came back to Elephant 2000. I began to understand more as other ideas and concepts sunk in, like &lt;a href="http://web.archive.org/web/20131014084908/http://www-formal.stanford.edu/jmc/ascribing/ascribing.html"&gt;ascribing beliefs and goals to machines&lt;/a&gt;. But to really explore the ideas, I really wanted to try to implement parts of Elephant in my own programming language. The problem was, having no formal training in computer science, (my background is Physics), I had never created a programming language before. The stars aligned and I found the &lt;a href="https://github.com/Engelberg/instaparse"&gt;Instaparse&lt;/a&gt; Clojure library. The result is &lt;a href="https://github.com/gigasquid/babar"&gt;Babar&lt;/a&gt;, a language designed to explore communication with machines via &lt;a href="http://en.wikipedia.org/wiki/Speech_act"&gt;Speech Acts&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>Growing a Language with Clojure and Instaparse</title><link>https://gigasquidsoftware.com/blog/2013/05/02/growing-a-language-with-clojure-and-instaparse/</link><pubDate>Thu, 02 May 2013 02:08:18 +0000</pubDate><guid>https://gigasquidsoftware.com/blog/2013/05/02/growing-a-language-with-clojure-and-instaparse/</guid><description>&lt;p&gt;Creating your own programming language with Clojure and &lt;a href="https://github.com/Engelberg/instaparse"&gt;Instaparse&lt;/a&gt; is like building rainbows with s-expressions.  The Instaparse library is an elegant way of building executable parsers trees with pattern matching and &lt;a href="http://en.wikipedia.org/wiki/Extended_Backus%E2%80%93Naur_Form"&gt;&lt;em&gt;standard EBNF notation&lt;/em&gt;&lt;/a&gt; for context-free grammars. Since this is my first foray into parser trees and grammars, I thought I would share my learnings in this post.&lt;/p&gt;
&lt;h2 id="starting-with-a-single-word"&gt;Starting with a Single Word&lt;/h2&gt;
&lt;p&gt;Let&amp;rsquo;s start with the simplest example:  a number.  When we start up our REPL in our brand new language, we want to be able to enter an integer, and have evaluate as an integer.&lt;/p&gt;</description></item><item><title>The Joy of Flying AR Drones with Clojure</title><link>https://gigasquidsoftware.com/blog/2013/02/05/the-joy-of-flying-ar-drones-with-clojure/</link><pubDate>Tue, 05 Feb 2013 03:45:19 +0000</pubDate><guid>https://gigasquidsoftware.com/blog/2013/02/05/the-joy-of-flying-ar-drones-with-clojure/</guid><description>&lt;p&gt;Clojure is fun.  Flying &lt;a href="http://ardrone2.parrot.com/usa/"&gt;AR Parrot Drones&lt;/a&gt; are fun.  Put them together and there is pure joy.&lt;/p&gt;
&lt;p&gt;&lt;img loading="lazy" src="http://farm8.staticflickr.com/7441/9925804126_e4707c8b72_o.jpg"&gt;&lt;/p&gt;
&lt;p&gt;Ever since I found out that you could program and control your drone over UDP, I couldn&amp;rsquo;t wait to try it out in Clojure.  I had dreams of controlling it with my Emacs REPL.  That dream came true and it has been a true joy to fly in a function language. This blog post shows some of the features that the &lt;a href="https://github.com/gigasquid"&gt;clj-drone project&lt;/a&gt; has so far.  There is still a bit of work to go to make it complete.  But, I wanted to share and hopefully encourage others to start playing with it too.&lt;/p&gt;</description></item><item><title>Hobby Languages for Clojurists</title><link>https://gigasquidsoftware.com/blog/2012/12/26/hobby-languages-for-clojurists/</link><pubDate>Wed, 26 Dec 2012 21:58:43 +0000</pubDate><guid>https://gigasquidsoftware.com/blog/2012/12/26/hobby-languages-for-clojurists/</guid><description>&lt;p&gt;I spend most of my work day in Ruby and CoffeeScript. However, my true love belongs to Clojure, which I consider my &amp;ldquo;hobby&amp;rdquo; language right now. I started to wonder, what are the &amp;ldquo;hobby&amp;rdquo; languages for people who spend most of their work day with Clojure. My informal twitter poll revealed selection as diverse and interesting as the Clojurists themselves.&lt;/p&gt;
&lt;p&gt;**Developers Who Enjoy Clojure Also Enjoy: **
&lt;em&gt;(In no particular order)&lt;/em&gt;&lt;/p&gt;</description></item><item><title>7 McCarthy Papers in 7ish Weeks #5 &amp; #6 - SDFW Tic-Tac-Toe</title><link>https://gigasquidsoftware.com/blog/2012/11/25/7-mccarthy-papers-in-7ish-weeks-%235-%236-sdfw-tic-tac-toe/</link><pubDate>Sun, 25 Nov 2012 14:08:53 +0000</pubDate><guid>https://gigasquidsoftware.com/blog/2012/11/25/7-mccarthy-papers-in-7ish-weeks-%235-%236-sdfw-tic-tac-toe/</guid><description>&lt;p&gt;&lt;img loading="lazy" src="http://farm8.staticflickr.com/7388/9925780935_9744792c36_o.png"&gt;&lt;/p&gt;
&lt;p&gt;This holiday edition blog post covers two McCarthy papers instead of just one.  We will be talking about &lt;a href="http://web.archive.org/web/20131014084908/http://www-formal.stanford.edu/jmc/freewill.pdf"&gt;Free Will - Even for Robots&lt;/a&gt; and the companion paper &lt;a href="http://web.archive.org/web/20131014084908/http://www-formal.stanford.edu/jmc/freewill2.pdf"&gt;Simple Deterministic Free Will&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="in-which-we-deftly-sidestep-the-philosophers"&gt;In which we deftly sidestep the philosophers&lt;/h2&gt;
&lt;p&gt;We know that computers and programs are completely deterministic.  A philosophical question is whether we, as humans are ruled by determinism, (although complex it may be), or not.  If we take the decision that humans are deterministic, then we can argue that either there is no free will - or that free will is &amp;ldquo;compatible&amp;rdquo; with determinism.  Philosophers, of course, could discuss such questions interminably, trying to get a theory to fit for all people and all occasions.  Thankfully, McCarthy takes a very admirable and practical view on free will.  Let&amp;rsquo;s try out something simple for a computer program and see how it works.  He explores a philosophy &amp;ldquo;Compatibilist&amp;rsquo;s&amp;rdquo; view, which regards a person to have free will if his actions are decided by an internal process, even if this process itself is deterministic.  But by exploring this view with computer programs, he makes clear:&lt;/p&gt;</description></item><item><title>7 John McCarthy Papers in 7 weeks - Prologue</title><link>https://gigasquidsoftware.com/blog/2012/09/19/7-john-mccarthy-papers-in-7-weeks-prologue/</link><pubDate>Wed, 19 Sep 2012 01:50:08 +0000</pubDate><guid>https://gigasquidsoftware.com/blog/2012/09/19/7-john-mccarthy-papers-in-7-weeks-prologue/</guid><description>&lt;p&gt;In the spirit of &lt;a href="http://pragprog.com/book/btlang/seven-languages-in-seven-weeks"&gt;Seven Languages in Seven Weeks&lt;/a&gt;, I have decided to embark on a quest. But instead of focusing on expanding my mindset with different programming languages, I am focusing on trying to get into the mindset of &lt;a href="http://en.wikipedia.org/wiki/John_McCarthy_(computer_scientist)"&gt;John McCarthy&lt;/a&gt;, father of LISP and AI, by reading and thinking about seven of his &lt;a href="http://web.archive.org/web/20131014084908/http://www-formal.stanford.edu/jmc/"&gt;papers&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id="why"&gt;Why?&lt;/h3&gt;
&lt;h4 id="get-out-of-your-box"&gt;Get out of your box&lt;/h4&gt;
&lt;p&gt;If you are comfortable, you are not challenging yourself to grow. You are doomed to stay in your same mindset and your little box and your world gets smaller. As an Object Oriented programmer, I was happy in my little box. Then one day, I discovered Clojure and Functional Programming and my world became bigger and richer because of it. I hope to glean a similar box expansion, by exploring the thoughts of McCarthy. Especially, since I have the nagging suspicion that we are somehow doing programming &lt;a href="http://www.catonmat.net/blog/wp-content/uploads/2008/12/john-mccarthy-programming-wrong.jpg"&gt;&amp;ldquo;completely wrong.&amp;rdquo;&lt;/a&gt;&lt;/p&gt;</description></item><item><title>A Clojure REPL Driven Roomba</title><link>https://gigasquidsoftware.com/blog/2012/08/09/a-clojure-repl-driven-roomba/</link><pubDate>Thu, 09 Aug 2012 20:03:52 +0000</pubDate><guid>https://gigasquidsoftware.com/blog/2012/08/09/a-clojure-repl-driven-roomba/</guid><description>&lt;p&gt;&lt;img loading="lazy" src="http://farm3.staticflickr.com/2826/9925780955_4a32b8dc8a_o.jpg"&gt;
One of the things that I love about Clojure is that it can go anywhere that Java can.  That is why, when I found out that the Roomba already had a &lt;a href="http://hackingroomba.com/code/roombacomm/"&gt;Java library&lt;/a&gt; written for it - I was excited to be able to hook it up to my Emacs / Swank and be able to control it from my editor.&lt;/p&gt;
&lt;p&gt;It is great fun! If you have a Roomba at home and you want to play along&amp;hellip;&lt;/p&gt;</description></item><item><title>Baba Yaga and the Clojure Reducers</title><link>https://gigasquidsoftware.com/blog/2012/07/07/baba-yaga-and-the-clojure-reducers/</link><pubDate>Sat, 07 Jul 2012 23:56:36 +0000</pubDate><guid>https://gigasquidsoftware.com/blog/2012/07/07/baba-yaga-and-the-clojure-reducers/</guid><description>&lt;p&gt;&lt;img alt="Baba Yaga&amp;rsquo;s House" loading="lazy" src="http://www.thebells.net/Halloween/BabaYaga/BabaYaga3.GIF"&gt;&lt;/p&gt;
&lt;p&gt;Once upon a time, a young girl decided to take a break from her code and stroll in the forest. It was quite a pleasant day, she packed her lunch in her bag and set off. While she was walking, she started thinking about a concurrency bug that her OO project was having. As she pondered the complexities of mutablilty, state, and threads, she must of strayed from the trail and lost track of time. By the time she looked around, she realized that she was totally lost.&lt;/p&gt;</description></item><item><title>How to include non clojars/maven clojure version in your lein project</title><link>https://gigasquidsoftware.com/blog/2012/07/07/how-to-include-non-clojars/maven-clojure-version-in-your-lein-project/</link><pubDate>Sat, 07 Jul 2012 19:02:33 +0000</pubDate><guid>https://gigasquidsoftware.com/blog/2012/07/07/how-to-include-non-clojars/maven-clojure-version-in-your-lein-project/</guid><description>&lt;p&gt;Do you need to have a specific version of Clojure in your leiningen project that you can&amp;rsquo;t get from Clojars?&lt;/p&gt;
&lt;p&gt;I ran into this problem when I wanted to run a sample project on Clojure&amp;rsquo;s reducers - which is not in the current Clojars version of 1.4.0.  I needed to use the most recent version, (unreleased), of 1.5.0.  These are the steps to get you running.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Clone the &lt;a href="https://github.com/clojure/clojure/"&gt;clojure git repository &lt;/a&gt;&lt;/p&gt;</description></item><item><title>Getting Ready for CodeMash</title><link>https://gigasquidsoftware.com/blog/2012/01/10/getting-ready-for-codemash/</link><pubDate>Tue, 10 Jan 2012 03:09:20 +0000</pubDate><guid>https://gigasquidsoftware.com/blog/2012/01/10/getting-ready-for-codemash/</guid><description>&lt;p&gt;Only one more day until &lt;a href="http://codemash.org/"&gt;CodeMash&lt;/a&gt;.  I am really looking forward to my first one.  I have heard nothing but wonderful things about this conference that brings together developers, geeks and their families for a week in January in Sandusky, Ohio.&lt;/p&gt;
&lt;p&gt;I am also looking forward to the opportunity of presenting my &amp;ldquo;Once Upon a Time in Clojureland&amp;rdquo; talk.  It is an introduction to Clojure in a Fairy Tale format.  I am hoping to share my enthusiasm for the language and inspire others to try it out for themselves.&lt;/p&gt;</description></item><item><title>Sunday in the Park with George and Clojure</title><link>https://gigasquidsoftware.com/blog/2011/09/13/sunday-in-the-park-with-george-and-clojure/</link><pubDate>Tue, 13 Sep 2011 02:17:52 +0000</pubDate><guid>https://gigasquidsoftware.com/blog/2011/09/13/sunday-in-the-park-with-george-and-clojure/</guid><description>&lt;h1 id="heading"&gt; &lt;/h1&gt;
&lt;figure class="left"&gt;
&lt;img loading="lazy" src="http://farm3.staticflickr.com/2843/9925803956_c92c63045e_o.jpg"/&gt;
&lt;/figure&gt;
&lt;p&gt;White: a Blank Page or Canvas.&lt;/p&gt;
&lt;p&gt;As I spent a pleasant Sunday outside doing yard work, songs from one of my favorite musicals, &lt;a href="http://en.wikipedia.org/wiki/Sunday_in_the_Park_with_George"&gt;“Sunday in the Park with George”&lt;/a&gt;, came to mind. While the songs were playing in my head, my thoughts again drifted to one of my favorite programming languages, Clojure. To my surprise, I was struck by similarities between the musical, which is about the artist Geroges Seuret and his creation of one of his famous painting, and that of the functional JVM language of Clojure. Granted, musicals, art and programming languages don&amp;rsquo;t generally get discussed together, but please humor me and let me elaborate. Following the thread of my inspiration, I will be using the first few opening lines from the musical as my headings and guides for my discussion.&lt;/p&gt;</description></item><item><title>Super Easy Clojure Web Apps with Heroku Cedar</title><link>https://gigasquidsoftware.com/blog/2011/06/11/super-easy-clojure-web-apps-with-heroku-cedar/</link><pubDate>Sat, 11 Jun 2011 23:57:52 +0000</pubDate><guid>https://gigasquidsoftware.com/blog/2011/06/11/super-easy-clojure-web-apps-with-heroku-cedar/</guid><description>&lt;p&gt;Deploying Clojure apps with a single command to the cloud is now possible with Heroku Cedar and let me tell you, it is pure joy.&lt;/p&gt;
&lt;p&gt;I experimented with this the other day by creating a Compojure web application that compares the followers that two twitter users have in common.&lt;/p&gt;
&lt;p&gt;Here is the secret sauce you need to push your apps to Heroku:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;**Procfile: **
You need to create a file in the root of your directory that contains the way to start up your application:&lt;/p&gt;</description></item><item><title>Hacking JavaScript for the Love of Clojure</title><link>https://gigasquidsoftware.com/blog/2011/05/01/hacking-javascript-for-the-love-of-clojure/</link><pubDate>Sun, 01 May 2011 14:02:39 +0000</pubDate><guid>https://gigasquidsoftware.com/blog/2011/05/01/hacking-javascript-for-the-love-of-clojure/</guid><description>&lt;p&gt;Lately, I have been working on the awesome open source project &lt;a href="http://www.4clojure.com/"&gt;4Clojure.com&lt;/a&gt;. The site helps you to learn Clojure by solving “koan” type problems in an interactive format. One of the enhancements that I was looking at putting in was a way to enter code in a text box and have it color highlight as type. I found the &lt;a href="http://ace.ajax.org/"&gt;ACE project&lt;/a&gt;, which looked like exactly what I wanted. However, sad panda, they didn&amp;rsquo;t have a Clojure mode. Not deterred, I decided that I would try to take a crack at it. I ported most of the rules from the Clojure brush in Syntax Highlighter over and implemented some basic auto-indent.&lt;/p&gt;</description></item><item><title>Yellow Belt Katas for Ruby and Clojure</title><link>https://gigasquidsoftware.com/blog/2011/04/16/yellow-belt-katas-for-ruby-and-clojure/</link><pubDate>Sat, 16 Apr 2011 03:11:29 +0000</pubDate><guid>https://gigasquidsoftware.com/blog/2011/04/16/yellow-belt-katas-for-ruby-and-clojure/</guid><description>&lt;p&gt;I have put a couple projects out on GitHub to help people get started with Clojure and Ruby.
The Katas are taken more or less from the Coding Kata site &lt;a href="http://codingkata.org/katas/"&gt;http://codingkata.org/katas/&lt;/a&gt;. The projects both include the basic project setup for you to get started with TDD beginner katas.&lt;/p&gt;
&lt;p&gt;The Ruby project has tests in the form of rspec-given, which is quite fun. The Clojure project has tests in the form of Midje, which has a lovely syntax.&lt;/p&gt;</description></item><item><title>Knights Who Say Monad</title><link>https://gigasquidsoftware.com/blog/2011/04/12/knights-who-say-monad/</link><pubDate>Tue, 12 Apr 2011 02:02:05 +0000</pubDate><guid>https://gigasquidsoftware.com/blog/2011/04/12/knights-who-say-monad/</guid><description>&lt;p&gt;&lt;img loading="lazy" src="http://farm6.staticflickr.com/5539/9925781235_e80904a961_o.jpg"&gt;&lt;/p&gt;
&lt;p&gt;(*Sketch By My Awesome Husband)&lt;/p&gt;</description></item><item><title>On Thinking in Ruby and Clojure</title><link>https://gigasquidsoftware.com/blog/2011/04/08/on-thinking-in-ruby-and-clojure/</link><pubDate>Fri, 08 Apr 2011 02:02:09 +0000</pubDate><guid>https://gigasquidsoftware.com/blog/2011/04/08/on-thinking-in-ruby-and-clojure/</guid><description>&lt;p&gt;Recently, I decided to work on a set of code Katas. I couldn&amp;rsquo;t decide whether to do them in Ruby or Clojure, so I decided to do them in both. I did the Kata in Ruby first and then immediately followed up with the same one in Clojure. It was an interesting exercise, not only for the learning of the languages, but to highlight how I thought about the problems differently depending on the language.&lt;/p&gt;</description></item><item><title>Bowling Game Kata in Clojure with STM and defrecord</title><link>https://gigasquidsoftware.com/blog/2011/03/01/bowling-game-kata-in-clojure-with-stm-and-defrecord/</link><pubDate>Tue, 01 Mar 2011 02:43:29 +0000</pubDate><guid>https://gigasquidsoftware.com/blog/2011/03/01/bowling-game-kata-in-clojure-with-stm-and-defrecord/</guid><description>&lt;p&gt;We took our kids bowling for the first time the other day. I have to admit, that I am not a great bowler. I had only been bowling two or three times in my life previous to that event and I was very thankful that those bumpers were up. The computer program malfunctioned in the final frames of our last game. I realized then, that I really had no idea how to score bowling. Later that night, in my surfing, I came across a reference to the &lt;a href="http://butunclebob.com/ArticleS.UncleBob.TheBowlingGameKata"&gt;Bowling Game Kata&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>Vampire Slaying in Clojure with STM - Part 2</title><link>https://gigasquidsoftware.com/blog/2011/01/18/vampire-slaying-in-clojure-with-stm-part-2/</link><pubDate>Tue, 18 Jan 2011 03:01:47 +0000</pubDate><guid>https://gigasquidsoftware.com/blog/2011/01/18/vampire-slaying-in-clojure-with-stm-part-2/</guid><description>&lt;p&gt;In Part 1, we used defrecords to create a vampire slayer named “Buffy” and a few vampires for her to kick around. Today we are going to use Buffy and her vampires to explore STM (Software Transactional Memory) in Clojure for managing state.&lt;/p&gt;
&lt;p&gt;Recap&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;(defrecord Vampire [name, health])
(def vampire1 (Vampire. &amp;quot;Stu&amp;quot; 50))
(def vampire2 (Vampire. &amp;quot;Vance&amp;quot; 100))
(def vampire3 (Vampire. &amp;quot;Izzy&amp;quot; 75))
(defrecord Slayer [name, weapon])
(def kungfu 25)
(def buffy (Slayer. &amp;quot;Buffy&amp;quot; kungfu))
(defn hit [vampire, hitpoints]
(- (:health vampire) hitpoints))
;vampires don't fight back but it takes time to kill them
(def combat-time 20)
(defn hit-vampire [vampire, slayer]
(Thread/sleep (* combat-time 10))
(assoc vampire :health (hit vampire (:weapon slayer))))
(defn kill-vampire [vampire, slayer]
(if (&amp;gt; (:health vampire) 1)
(recur (hit-vampire vampire slayer) slayer)
(assoc vampire :health 0)))
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Let&amp;rsquo;s take our vampires and stand them up in a line for Buffy to fight. We are also going to create a function that just has Buffy killing a vampire, rather then a generic slayer.&lt;/p&gt;</description></item><item><title>Vampire Slaying with Clojure - Part 1 defrecord</title><link>https://gigasquidsoftware.com/blog/2011/01/12/vampire-slaying-with-clojure-part-1-defrecord/</link><pubDate>Wed, 12 Jan 2011 03:33:43 +0000</pubDate><guid>https://gigasquidsoftware.com/blog/2011/01/12/vampire-slaying-with-clojure-part-1-defrecord/</guid><description>&lt;p&gt;It&amp;rsquo;s time to learn more Clojure. This time, Buffy the Vampire Slayer* is going to help us.&lt;/p&gt;
&lt;p&gt;First things first, of course we need vampires!&lt;/p&gt;
&lt;p&gt;Let&amp;rsquo;s create a vampire data type with defrecord. Our vampires are going to have two attributes, their name and the number of health points that they have. This is of course, how Buffy is going to slay them. If a vampire&amp;rsquo;s health points goes to zero, then they are dead. Well, they already are undead&amp;hellip; so let&amp;rsquo;s say they are slayed at that point and turn into dust.&lt;/p&gt;</description></item><item><title>Mutually Recursive Zombies on a Trampoline</title><link>https://gigasquidsoftware.com/blog/2010/12/08/mutually-recursive-zombies-on-a-trampoline/</link><pubDate>Wed, 08 Dec 2010 04:06:50 +0000</pubDate><guid>https://gigasquidsoftware.com/blog/2010/12/08/mutually-recursive-zombies-on-a-trampoline/</guid><description>&lt;p&gt;It&amp;rsquo;s late at night. The kids are all tucked snuggly in their beds and I am ready to explore mutual recursion on my own in Clojure after doing some reading of &lt;a href="http://pragprog.com/titles/shcloj/programming-clojure"&gt;Programming Clojure&lt;/a&gt;. What better subject to explore them with then zombies? In this example we have two zombies – zombie1 and zombie2. Let&amp;rsquo;s represent each zombie as a sequence:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;(def zombie1 '(&amp;quot;z1_head&amp;quot;, &amp;quot;z1_r_arm&amp;quot; &amp;quot;z1_l_arm&amp;quot; &amp;quot;z1_torso&amp;quot; &amp;quot;z1_r_leg&amp;quot; &amp;quot;z1_l_leg&amp;quot;))
(def zombie2 '(&amp;quot;z2_head&amp;quot;, &amp;quot;z2_r_arm&amp;quot; &amp;quot;z2_l_arm&amp;quot; &amp;quot;z2_torso&amp;quot; &amp;quot;z2_r_leg&amp;quot; &amp;quot;z2_l_leg&amp;quot;))
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;zombie1 is ready to take a bite of zombie2&amp;rsquo;s left leg, since it is nice and tasty there at the end. Once zombie1 takes a bite, the body part will be added to its own sequence – but in the second position, so that the head is always first and ready to take another bite. So, if zombie2 just stood still and let itself be eaten, after one bite, zombie1 would look like this&lt;/p&gt;</description></item><item><title>Clojure Dictionary Challenge</title><link>https://gigasquidsoftware.com/blog/2010/10/12/clojure-dictionary-challenge/</link><pubDate>Tue, 12 Oct 2010 03:11:52 +0000</pubDate><guid>https://gigasquidsoftware.com/blog/2010/10/12/clojure-dictionary-challenge/</guid><description>&lt;p&gt;There was a question today on Twitter about how to go about finding the word with the most consecutive consonants in the dictionary file. Of course, being a typical developer, when presented with a problem – I am usually not satisfied until I find a solution. Since I am interested in learning Clojure, I thought I would try to solve this problem functionally.&lt;/p&gt;
&lt;p&gt;Armed with Stuart Halloway&amp;rsquo;s “Programming Clojure” and trusty Google by my side, I embarked on my first Clojure mission.&lt;/p&gt;</description></item></channel></rss>