bouncer
← Back

ClojureTV · 1.1K views · 29 likes

Analysis Summary

20% Minimal Influence
mildmoderatesevere

“Be aware that the speaker's critique of Python's package management is used as a rhetorical foil to highlight Clojure's strengths, which is standard for a community-specific conference talk.”

Transparency Transparent
Human Detected
100%

Signals

The content is a live technical presentation featuring spontaneous speech, personal storytelling, and specific domain expertise that lacks the formulaic structure or synthetic perfection of AI generation.

Natural Speech Patterns The transcript contains natural filler words ('um', 'uh'), self-corrections, and a physical interruption ('clears throat').
Personal Anecdotes The speaker shares a specific, idiosyncratic story about her pets (Rascal and Ziggy) and her personal frustrations with Python's package management.
Contextual Authenticity The video is a recorded lightning talk at a known industry conference (Clojure/Conj) with a named speaker whose background matches the technical content.

Worth Noting

Positive elements

  • This video provides a practical, code-level example of how to bridge the gap between the JVM and Python's dominant machine learning ecosystem.

Be Aware

Cautionary elements

  • The speaker frames Python's ecosystem issues as a primary reason to switch to Clojure, which may overlook the complexities of managing the interop layer itself.

Influence Dimensions

How are these scored?
About this analysis

Knowing about these techniques makes them visible, not powerless. The ones that work best on you are the ones that match beliefs you already hold.

This analysis is a tool for your own thinking — what you do with it is up to you.

Analyzed March 13, 2026 at 16:07 UTC Model google/gemini-3-flash-preview-20251217
Transcript

Right. So, this is a short presentation. It won't be going into any kind of depth at all because it's a lightning talk, but I um it's kind of an experience report of how to work with uh lib uh Python CLJ. So, starting off, meet Rascal. He is a good boy. Well, mostly a good boy, but he can be a little bit lazy. Actually, he's been gaining weight, and so from doctor's orders, he has to uh be on a a restricted diet. Uh breakfast, he gets um kibble and green beans. Uh he wants a lot more. Uh, I could only take this photo immediately after having fed him because otherwise he would have gone crazy knowing that there was more food around. But there's more food in the kitchen right there. Next, meet Ziggy. Ziggy owns that food, but he doesn't always finish it. At least not immediately. He'll come in and have some and he leaves. He's actually a little underweight. Um, we can't put the food up any higher. He just has to have it where it is. But it's in the kitchen. Rascal knows he's not allowed in the kitchen. And uh, he generally stays out unless there's no other people around. Um, but all the same, Ziggy doesn't feed doesn't finish all of that food, but Rascal does. Now, there are options for trying to make sure that Ziggy only gets his food and uh and Rascal doesn't get any of it. Um, I could get an RFID smart feeder for $150. But floating around the house, I've got a couple of Raspberry Pies. And it turns out that you can get a camera for just uh just over $15. Well, with the camera, what can I do there? There's a whole lot of solutions uh on Raspberry Pi for uh processing video. Uh a nice one is motion. Uh this will detect movement in the image coming from a camera. It'll take a snapshot and it'll upload it for you. So if I'm uploading an image, what can I do with it? Uh I could try to use image recognition to identify has Rascal come into the room. The problem is image recognition libraries don't, especially with something specialized like this. Looking down on a dog over a uh over a bowl doesn't work very effectively. [clears throat] But you can build uh specialized image detectors. In fact, I have uh I'm doing classes at university where these are some of the images I was having to process looking for things like pneumonia, emphyma and various things like this and trying to identify this with neural networks. But building all of these things was done in Python. I'm actually not a fan of Python. Uh I know some other closure developers who say that of the non-closure languages, Python is one of their favorites. It's not mine. Um it feels clunky to me. Uh of course there's um a lot of libraries rely on state change and uh the entire ecosystem for um managing libraries I find very difficult after coming from the closure ecosystem. So I looked into using lib Python CLJ so that I could leverage what I'd already done. Um this uh this has been written by Chris Nerburgg and it's um uh it's been around now for a couple of years. I'd heard about it first on the Cogniccast. Now if we look at Python itself, we see that they've got their own package management system and there's a few different approaches. You can do virtual environments. Um you can do uh if you create a virtual environment that you start populating with pip, uh it starts with those five directories at the top level, but it goes down from there. And there's some SIM links in there, but every single project you have is going to have one of these VN directories in them, and it takes up a lot of space. You're copying copying in the same things over and over again. I find this very frustrating. Um if you go with condo where you've got a more centralized environment uh it's a lot bigger and for an a single environment on um for a machine learning project that I have the subdirectories there uh all total to 2.6 six gig. Uh this can get expensive in your your system and every single project needs a different selection of Python libraries, different versions of Python. A lot of things don't work against one another. Uh I find this really frustrating to work with, but you know, it's the best that we have to work with for the moment. So, if you're going to start up um the Python CLJ, then the first thing it needs to do is find that environment. Now, it is set up to automatically look for a VN environment. Um you can also configure it manually with a Python.ed file and the documentation explains what that looks like. But uh I had a few projects going and I wanted to be able to find what is my active cond. And it turns out if you try to do that at runtime, it starts getting a little bit hairy. But once you've got your initialization going, you can start using this system and it is really quite nice to work with. Um, so we'll start with a standard uh require lib, Python, CLJ2. And here I'm just referring to a number of the really common um functions and macros that uh that we want to use in there. And you'll notice that I'm saying call this first that pi initialize. If I do anything after that, this is where it's going to start loading libraries out of your system. And if you haven't um pre-initialized at this point, then it's going to go off and um pull it out of the global Python environment, which is almost certainly not carrying things that you need right now. Um so you initialize and then you pull in uh the various things that you'll need. So you'll see that I've pulled in uh one more function [snorts] uh require Python. Using that I can now start pulling in uh things from Python itself. I start with built-ins here for instance as Python and then we can say I want to bind that namespace. So I can say Python something and I have access to things in the Python namespace. And built-ins are important because it turns out that a lot of Python APIs need access to data structures that are a part of Python like tpples or Python lists where a Python list is a lot like closures, vectors. Um we don't have syntactic access to that with square brackets or anything like this. uh so we want to instantiate a tpple or instantiate a list using appropriate functions. So here I've just uh deafened them to call into Python appropriately. Then I can convert starting with this structure which is a model for um for the medical uh images that I was looking at earlier. uh I can take almost exactly that code and switch it to a closure syntax and you'll see that uh of course we can get rid of the commas uh the named arguments um turn into map style uh arguments. So for instance on that third line there input has a shape argument um which is a tpple as 720 x 720 x1 um you know previously with in python that was shape equals and then we set up a tpple in in round parenthesis. It's a relatively straight once you've set things up. It's a relatively straightforward um set of composition to uh duplicate what you had been doing in Python now in closure. So then you can following these patterns we can start converting more things. So I was doing a model compile using the atom u optimizer categorical cross entropy as my loss function. um metrics of being uh measured using cate uh categorical accuracy. All of these things show up in um uh enclosure relatively with with a relatively simple transform. Um I'm going from model.fit to calling pi on model with the fit u fit operation. um to detect whether or not there's a dog in the kitchen, I don't need to know one of a dozen different diseases. Instead, I um I just need a binary. Is it a dog or not a dog? Um if anyone saw Silicon Valley, there was a joke around dog or hot dog or not hot dog. [clears throat] Um so now the output is going to be a u single output. That's the first argument indent there. Uh activation sigmoid. Um and when we compile we go to cross entropy and binary accuracy times up. Okay. Um so right at the end that last 2% of the project of course takes 98% of the time. Um got to go through it all. I'm accumulating a lot of photos. I've got to train on them. Want to test. I'm going to tweak the layers to make sure that it works better. Uh I've got to tweak those parameters and then repeat. And this is a standard uh neural network approach to any of these things. Got a UIUX. I'll be um working away and then all of a sudden I get told that someone's in the kitchen when he's not supposed to be. Project outcome. Um Python was always orchestrating things which are occurring in CUDA and C++. Py was um sorry Python doesn't do a lot of the work itself but the libraries are all wrapped in Python libraries um as JVM starts to increase in capabilities here which it is doing uh we can start shifting across and of course I have a very frustrated dog who doesn't get the food that he thinks he deserves. >> [applause]

Video description

Convolutional Neural Networks (CNNs) are at the heart of modern image recognition systems, but most tooling, documentation, and ongoing development is tightly bound to Python. For Clojure developers interested in machine learning, this often means navigating awkward boundaries between languages. This talk demonstrates using Chris Nuernberger's excellent libpython-clj library to integrate with Python’s tensor libraries, especially TensorFlow and Keras, while keeping orchestration and high-level system design in idiomatic Clojure. We’ll see that how immutability and data-centric design integrate naturally with neural network workflows. This has real world applications, as we will see when I use a CNN to detect when my overweight dog is sneaking into the kitchen to steal the cat’s food. Biography Paula is an engineer with Ardoq, and a PhD student at Virginia Commonwealth University. She focuses on a broad spectrum of AI technologies, from knowledge graphs to LLMs. She has been developing in Clojure for 16 years and intends to keep at it, even when the AI world insists on using Python. Recorded Nov 13, 2025 at Clojure/Conj 2025 in Charlotte, NC. https://clojure-conj.org

© 2026 GrayBeam Technology Privacy v0.1.0 · ac93850 · 2026-04-03 22:43 UTC