RSSAmplifier

Blog

John Jacobsen

Recent content on John Jacobsen

johnj.comRSS feed ↗149 posts

Latest posts

"Sites of Arrival" Group Show

Sites of Arrival A group show of (mostly) figurative art at the Palette and Chisel Academy of Fine Arts: Matthew Braun John Jacobsen Veronica Severini Donald Colley Muriel Christensen Location and Hours Palette and Chisel Academy of Fine Arts August 8-17, 2025 Opening August 8, 6-9 PM 1012 N. Dearborn St. Chicago, IL 60610 Office phone: 312 642 4400 Office email: fineart1012@sbcglobal.net Works in…

Lisp Testing Fun

I've been making some progress with steelcut , my Common Lisp template generator (does every Lisper write one of these as a rite of passage?), and I keep running into interesting problems which have been fun to solve. Whenever my code starts to accumulate any sort of complexity, I try to err on the side of writing more tests, even for 'recreational' projects such as this one. The tests help make…

To The Metal... Compiling Your Own Language(s)

Like many programmers, I have programming hobbies . One of these is implementing new languages. My most recent language project, l1 , was a Lisp dialect whose primary data types are symbols and arbitrarily-large integers. I've been happy with l1 , but it is interpreted; since I was actively working on it last (2022), I've been wondering about the best way to generate compiled standalone executable…

Wrangling Half a Thousand Dreams

On Monday, February 4th, 1985, at the tender age of eighteen, I wrote down in the back of my journal two meagre fragments of the previous night's dreams: I’m at Fred’s and the cab is 45 minutes late. Leaping over an empty oil drum on a highway. This is the first of several hundred dream entries I've accumulated over nearly forty years. Though I'm not entirely sure what provided the impulse at the…

Programming Languages and Art Media

What computer programming languages 'go with' (feel like) what art mediums? Here is my first crack at the question. Language Medium Clojure graphite Babashka charcoal Common Lisp dip pens with india ink Emacs Lisp ball point C engraving C++ etching Perl watercolor Go gouache Python oil painting Java lithography Sh woodcut Bash linoleum cut Rust Procreate on the iPad _ _ (Copilot) collage I've…

eBook of Dreams

Since at least the 1980s I've kept a (very intermittent) dream journal in various forms, including dedicated paper notebooks notes or drawings in sketchbooks fragments of entries in daily Org Mode diary pages individual iCloud Notes, one per dream a single, dedicated Org Mode file. Lately I thought it might be interesting to review these and possibly use them as ideas for artworks, and I've found…

Making A Tiny E-Paper Status Display for the Raspberry Pi Zero

I've gotten interested in Raspberry Pis again, having recently picked up a Pi Zero 2 W. Something about these cheap little boards that are fully-functional Linux computers, ' as powerful ' as the VAXes I originally learned Unix on, appeals to the young hacker in me who fell in love with computers in the 1980s and is still able to be amazed by their potential. I've also been trying to get more…

In Praise of Small Shell Scripts

Over the decades I've relied heavily on bash aliases and functions to automate common tasks, resulting in a .bash_profile that's over a thousand lines long. But lately I find myself writing many small scripts instead. These tiny scripts, which live in a directory on my $PATH , have several advantages: They compose nicely, in line with the Unix philosophy . They are reasonably portable. If it works…

2024 Blogging Intentions

I can't believe I haven't written anything here in over a year. I increasingly want to move my experimental, art, hobby, and professional content away from platforms that exist to extract value from me and my friends. I'd also like to be less precious with this space, to treat it in the casual, experimental fashion I would treat Instagram or Facebook. So I'm going to be playing around with posting…

Practices for Software Projects

What follows is a selection of practices which I find helpful when working with software projects, whether in public or in private, in solo or in collaborative work. Many of these practices are quite standard, but some are, at best, unevenly practiced by either commercial or academic software teams. Although they are especially important for collaborative work, I like to follow these practices on…

Adding Tail Call Optimization to A Lisp Written in Go

The last few days have been devoted to improving l1 , the homegrown lisp I wrote about earlier this year. A number of changes have landed in the last week: Implemented let , defn and sugar for quote ; Figured out basic REPL integration with Emacs; Added numeric comparison operators ; Reviewed my Minimum Viable Repo checklist for this project; Fixed four bugs . I also implemented the bulk of the…

Tests by Example in Clojure and Common Lisp

Histogram made by a 1980's version of the author. While playing around with some dice-rolling simulations recently in Common Lisp (a topic for some future post, perhaps), I looked around for a way of making histograms. Finding none close to hand (it being Common Lisp), it wasn't too hard to 'roll my own' library (it being… Common Lisp) to create text-based histograms in the tradition of libraries…

(Yet Another) Lisp In Go

For the past month I've been spending some free time writing another Lisp implementation, this time in Go. My previous attempt was a subset of Scheme made in preparation for a class on the classic Structure and Interpretation of Computer Programs . That project was great fun and I learned a lot. I started learning Go late last year and began thinking about writing another Lisp. Go has garbage…

Migrating, Again

For the fifth or sixth time I am performing a major migration of this site from one implementation to another. I'd like to do more writing, but the blogging sofware I wrote a few years ago has been slowing me down, literally: it takes several seconds to generate the whole site (something I do repeatedly when I am making changes or additions to the site). I want to be able to post more freely, in…

About

See my Now Page for what I'm up to these days.

From Elegance to Speed

Making Things Fast A while back, we used a toy particle physics trigger to explore concepts in lazy evaluation and functional programming in Clojure. We came up with the following function which selected groups of eight events clustered close together in time: (defn smt-8 [times] (->> times (partition 8 1) (map (juxt identity (comp (partial apply -) (juxt last first)))) (filter (comp (partial >…

Common Lisp How-Tos

Intro I've been writing this post as I go, and you may still see changes if you check back from time to time. This post is for writing about things I'm figuring out, and for keeping notes on what I want to figure out next, as I get ramped up on Common Lisp. When I'm done there will hopefully be stuff here other people can use. There's a lot to love and admire about Common Lisp, but the language…

A Daily Journal in Org Mode

In a comment on yesterday's Hacker News thread about journaling, I sketched out my daily journaling practice of late. This post contains the full details on this procedure for those who are interested in using Org Mode for daily journaling. The Basics Every day gets its own Org Mode file. What goes in is not specified, but things I've included so far include: To do lists Things I probably won't do…

Implementing Scheme in Python

Background Lately I've been a bit of a Lisp kick again, reading On Lisp and Practical Common Lisp , working problems and re-casting my Clojure-based blog software into Common Lisp to see how that goes. The urge to do these things caught me somewhat by surprise: in the past few years I haven't done much programming outside of my day job because I've been focused more on painting and drawing. It…

Show at NUPOC

I am pleased to announce: Of the Flesh but not the World... A show of nine works in a small gallery space at the Feinberg School of Medicine at the Northwestern University Prosthetics-Orthotics Center (NUPOC). The works include four paintings made from life at NUPOC over the course of the last few months. There are also paintings and drawings done from life at the Palette and Chisel Academy of…

Color Notations

I have been experimenting with notations for color mixtures, so I can make notes about colors on the go without actually carrying a whole set of oil paints everywhere. Here's an example from a very quick sketch during tonight's commute home: Though it may look black and white, there are a dozen colors captured in this quick sketch. In this post, I briefly describe the notation. The letters are…

Code and Data

Introduction This article was adapted from discussions we had at the weekly Clojure study group at OpinionLab, in June, 2018. Clojure is a Lisp. Code is data in Lisp, and data can also be code. Lisp code consists of lists of symbols (or atoms, as they are called in other Lisps), other data primitives such as numbers and keywords, or (nested) lists of the same. 1 The first item in an expression…

(oodles of delicious atoms)

A Recursive Feast In 1983, Douglas R. Hofstadter, author of 'Gödel, Escher, Bach: An Eternal Golden Braid' wrote a series of articles on Lisp in Scientific American (later republished in the book Metamagical Themas , which is where I encountered them for the first time). While much of the writing focused on the nature of recursion in programming, the third and last article in the series provided…

Painting and Time

Painting is quite old and hard to fool. –Tad Spurgeon In Living Craft , Spurgeon calls out time as the first 'material' used to make paintings. He speaks of 'extra-logical,' emotional time, time experienced by the mind of the painter, rather than purely physical time measured by clocks. His remarks frame an invitation to contemplate how one experiences time in the studio and what time means to…

Contact Me

Physical John Jacobsen NPX Designs, LLC. 5341 S. Cornell Ave #3 Chicago, IL 60615 Logical john@johnj.com Instagram: @eigenhombre Mastodon: @eigenhombre@mastodon.art GitHub: eigenhombre Numeric +1 312 436 1522 (office/mobile/home)

Learning Muscular Anatomy

Skeleton and muscle overlay study (underlying photo by Pixiduc ) A knowledge of the human form is vital for figurative artists. A detailed understanding of anatomy is especially helpful when working from life or constructing the figure from imagination. Various approaches have been taken to learning artistic anatomy. While I'd rather not rob graveyards and do my own dissections , there are,…

Bio

I grew up 1 [some old pictures of me]]] in Madison, Wisconsin and studied art and physics at the University of Wisconsin — Madison, receiving my doctorate in physics there in 1996 under Prof. Francis Halzen . I also worked for a year at CERN in Geneva, Switzerland, under Prof. Sau Lan Wu on the ALEPH experiment. My doctoral work and postdoc focused on the AMANDA neutrino detector constructed at…

Reflections on a Year of Daily Memory Drawings

365 Drawings The sketchbooks shown below are the result of doing one drawing from memory every day for a year, a project I finished this month. A year's worth of Daily Compositions This drawing practice was based on the Daily Composition, which, as I explained last January, is an exercise from The Natural Way to Draw , by Kimon Nicolaïdes (published posthumously in 1941). The requirements for this…

Repainting

Painting in Progress - from imagination As I return to the painting on my easel, reworking both the major figures and probably everything else as well, I am put to mind of a lesson by a former teacher, Carol Pylant . She told me to be paint over the edges of my foreground figures when working on backgrounds, so the backgrounds don’t get too “stiff.” Of course, this applies not just to edges. “If…

Daily Memory Drawings

Riverside Plaza Memory Sketch Every day for the past three months I have drawn some scene or event that I saw that day, purely from memory. Usually this is something I saw on the way to work, or, if I'm home that day, something I saw when out for a run or a walk somewhere in the neighborhood. Since I usually make the drawing at the end of the day, several hours will have passed by the time I get…

Questions to Ask

Questions to Ask … of a painting in progress, with strategies for recovery. Diagrammatic landscape sketch made 'en plein air' at the Geographic South Pole I’ve been learning a lot lately by studying books, blogs, and doing studies from life. It’s made me reflect upon my past strategies (or lack thereof) for making artworks. These are roughly in order of importance, in that if the answer to a…

Macro-writing Macros

… in which we explore the power of macros, and macro-writing macros, to DRY out repetitive code. I’ve been writing Clojure code full time for nearly two years now. I have a pretty good feel for the language, its virtues and its faults. Mostly, I appreciate its virtues (though I still wish the REPL started faster). For me one of the language’s attractions has always been that it’s a Lisp — a…

Time Limits

Picking up the art blogging again after a long hiatus. Recently I’ve been thinking about constraints a lot, and finding out how helpful they are. I think they are especially helpful for artists. For example, since I started my new job last year, I am in the habit of taking photos on the way to or from work. I use the following constraints: Use only the iPhone with no extra lenses (digital…

Lazy Physics

… in which we explore lazy sequences and common functional idioms in Clojure via the example of looking for (nearly) coincident clusters of times in a series. A fundamental technical problem in experimental particle physics is how to distinguish the signatures of particles from instrumental noise. Imagine a tree full of hundreds of sparrows, each nesting on a branch, each chirping away…

Fun with Instaparse

One of my favorite talks from this month’s excellent Clojure/conj was Carin Meier 's presentation, which combined storytelling, live coding, philosophy, the history of computing, and flying robotic drones. She used the relatively new Instaparse library to create her own language to explore something called “Speech Acts” (which I won’t go into here, but do catch the video of her talk when it goes…

Nucleotide Repetition Lengths

After a long hiatus, let’s continue our foray into amateur genomics with Clojure , in which we continue to encounter elegant expressions of Clojure’s power as well as a few additional wrinkles in the Clojure ecosystem (in this case, Incanter). In our last post we upgraded our genome decoder and used it to show frequencies of the four nucleotides, illustrating Chargaff’s Rule . Another simple…

Updating the Genome Decoder

In our last post we saw that so-called “N-blocks” (regions of the genome for which sequences are not available) were not getting decoded correctly by our decoder . The solution is to look back into the so-called “file index” which specifies where the N-blocks are, and how long each block is. The modified decoder looks like this: (defn genome-sequence ' Read a specific sequence, or all sequences in…

Getting Our Hands Dirty (with the Human Genome)

In the past two posts , we created and validated a decoder for genome data in 2bit format. Let’s start actually looking at the human and yeast genomes per se . First, if you haven’t downloaded it yet, you’ll need a copy of the human genome data file: cd /tmp wget http://hgdownload.cse.ucsc.edu/goldenPath/hg19/bigZips/hg19.2bit (Depending on your local bandwidth conditions, this can take quite…

Validating the Genome Decoder

Today we’ll validate the genome decoder we described yesterday , once again with our friend the yeast Saccharomyces cerevisiae (you may want to enjoy a slice of freshly-baked bread and a stein of Pilsner with this post). We are aided in this case by the availability of the SacCer3 genome in both 2bit and FASTA formats. We can get the FASTA version in the same place we got the 2bit file : mkdir…

A Two Bit Decoder

The entire human genome is available as a single .2bit file here (click on “Full Data Set”, then download hg19.2bit ). Unlike the stellar signal in His Master’s Voice , the 2bit format is reasonably clearly documented. We want to write Clojure code to: Provide base pairs in symbolic (rather than raw binary) form as lazy sequences – i.e., sequences which need not all fit in memory at once, but can…

Exploratory Genomics with Clojure

In Stanislaw Lem’s His Master’s Voice , humanity receives a “letter from the stars,” in the form of regularly repeating binary data encoded in a beam of extraterrestrial neutrinos. The protagonists know nothing a priori about the content of the letter. The plot unfolds as the message slowly, as a result of careful study, yields a few (not many) of the signal’s secrets. What would you do if you…

Rosalind Problems in Clojure

This weekend I’ve been having a lot of fun working the Bioinformatics problems from Rosalind . Most people work them in Python, but so far they have been very amenable to Clojure except where BioPython libraries are used for access to online databases. The problems have been straightforward so far but I have enjoyed the elegance and brevity that Clojure lends the solutions. In particular, I like…

Introduction to Context Managers in Python

Context managers are a way of allocating and releasing some sort of resource exactly where you need it. The simplest example is file access: with file('/tmp/foo', 'w') as foo: print >> foo, “Hello!” This is essentially equivalent to: foo = file('/tmp/foo', 'w') try: print >> foo, “Hello!” finally: foo.close() Locks are another example. Given: import threading lock = threading.Lock() then with…

Processes vs. Threads for Integration Testing

Python has become notorious for being somewhat problematic when it comes to concurrency. The language supports threads, but performance is known to be dismal in some cases. In particular, as David Beazley discovered , when I/O-bound and CPU-bound threads run in the same program, the GIL performs very badly (worse than if you ran the tasks one after the other on a single thread/CPU). Alternative…

Resources for Learning Clojure

I thought I’d take a moment to present one possible path, or set of alternate paths, for learning Clojure, a modern Lisp implemented on top of the Java Virtual Machine. Update: Since this was written in 2012, a number of additional excellent books have come out. These include Carin Meier’s Living Clojure ; Vandgrift and Miller, Clojure Applied ; and Daniel Higginbotham’s, Clojure for the Brave and…

Continuous Testing in Python, Clojure and Blub

A separate monitor is handy for showing tests results continuously while working. The paintbrushes are strictly optional. What follows is a somewhat rambling introduction to continuous, test-driven development, focusing mainly on Python and influenced by Clojure tools and philosophy. At the end, a simple script is introduced to help facilitate continuous TDD in (almost) any language. For the last…

Programming Languages

Working on Clojure Koans while riding on a C-17, bound for Antarctica Today I am inspired to ponder many languages at once and review which ones I use regularly, which ones I’m curious about, which ones I avoid, and what I’d like to use, if it were to exist. Programming Languages I Use Regularly Python By far the language I use most for work. I like it for its clean philosophy, its expressiveness,…

Milvans and Container Malls

Dec. 2, 2011, 08:10 NZDT Tranz Coastal train from Christchurch to Picton Observatory Hill in McMurdo The new Cashel Mall in Christchurch Another gorgeous summer day here as the countryside rolls by: grassy, green hills punctuated by trees passing singly and in groups, as well as cattle, horses, and the ubiquitous sheep, which appeal strongly for some reason today, signaling tranquility,…

Oxygen

Nov. 29, 2011 17:30 NZDT Crary Lab, McMurdo Station Made it back to McMurdo where liquid water runs in the streets, mountains can be seen in all directions, helicopters take off and land every twenty minutes or so, and the oxygen flows thick and warm into your lungs. Our flight to McMurdo had only five passengers. After packing a lunch and waiting with bated breath for the announcements from Comms…

Ghost

Nov. 28, 2011 15:51 NZDT B2 Science, Amundsen-Scott South Pole Station Walking home Last full day here, insh’Allah . We had flights today, so whatever weather problems were plaguing McMurdo seem to have sorted themselves out. I’m ready to leave, despite the short and comfortable trip (relatively speaking). So far on this trip, unlike some previous trips, I have not had to: Go to Medical for…