adventures in making stuff with Daniel Higginbotham


  1. It seems like there's a strong aversion to using frameworks in the Clojure community. Other languages might need frameworks, but not ours! Libraries all the way, baby!

  2. While at Reify, I drafted an outline of a program called The Buddy System. The idea was to provide a framework for devs to support each other. I'm sharing it here in case others find it useful.

  3. What follows are the best techniques for learning programming languages that I've picked up over years of teaching programming.

  4. The Dark Knight came out at the same time that I was becoming intensely interested in Buddhism, and the movie struck me as a kind of extended Buddhist parable, with Bruce Wayne as an icon of the suffering that results from clinging and the Joker as a very fucked up enlightened being

  5. Some notes on how I write that I hope will be useful to aspiring authors

  6. Struggle with recursion? This blahg post might help.

  7. I've been programming professionally for a dozen years. Some of what I've learned is best forgotten, but there have been many tools and techniques that continue to be useful every day.

  8. Next week I'm re-launching as Brave Clojure: Become a Better Programmer.

  9. Open Source Clojure Projects is a directory of active projects welcoming new contributors. Its purpose is to make it easier for both new and experienced Clojurists to find ways to contribute.

  10. My thoughts on Ashley Williams's protest action in South Carolina.

  11. Today I'm releasing a free web application, Job Search Sanity. It lets you take a methodical approach to looking for a job search, helping you make progress and feel in control.

  12. Rubyists enjoy Ruby because it's simple, powerful, and a joy to use. Clojure has all of those qualities, plus it employs a completely different paradigm that's crazy fun to learn. If you're looking to learn a new language, Clojure's a great choice.

  13. I've been working on a site to help people who are looking for a job, and I'd love some beta testers to work out the kinks and test the idea. Please sign up if you're interested!

  14. Some reflections on why I wrote the recently-released Clojure for the Brave and True

  15. The Clojure for the Brave and True web site has been updated to match the printed book. The book got a massive overhaul, and it's even better!

  16. Clojure Applied is a good choice for those looking to become intermediate Clojurists. It really shines in its coverage of testing and of decomposing your system into components. Besides that, it's filled with little gems from Java and the Clojure standard library.

  17. Today, my fantastic production editor at No Starch reached out and pressed the basketball-sized "RELEASE IT!" button at No Starch headquarters, encasing Clojure for the Brave and True cucumber-infused amber and sending it on its way to the bookeries of Melrose Park, Illinois.

  18. Guess what! You can now start reading the fully-revised Clojure for the Brave aand True through No Starch Press's early access program!

  19. Build tools are known to inspire the entire gamut of emotions from bored impatience to Homeric rage (I'm looking at you, Grunt). Personally, I've never given them much thought; they've always seemed like tedious overhead, an unfortunate necessity for getting real work done. Boot is different.

  20. You can now read 'Mastering Concurrent Processes with core.async' at Clojure for the Brave and True

  21. I've started writing a little library for writing and loading database fixtures and I'd love any feedback :)

  22. This year's Clojure Conj was a complete blast! I got to meet and reconnect with great, friendly, brilliant people, and had enormous fun the whole time.

  23. If you work on projects that require you to open multiple terminal tabs, then tmux will help you be more productive! This brief guide will show you an easy way to get started.

  24. Here's a list of Clojurers you should follow on Twitter

  25. There's a new chapter up on interacting with Java!

  26. There's a new chapter up on concurrency, parallelism, and state. And zombies.

  27. Clojure for the Brave and True is going to be published! It will remain free online.

  28. I did not expect to have a life-altering insight while tidying my kitchen some night during the winter of 2011. Yet there I was, sponge in hand and mind on idle, when out of nowhere

  29. After many long months I've finished re-writing Grateful Place. The site now uses Clojure as an API server, with Datomic for the database, Angular for the front end, and Vagrant and Ansible for provisioning and deployment. We'll dive into the code base, covering the most important parts of each component and how everything works together.

  30. I've been having a brain-bending good time reading An Introduction to Functional Programming Through Lambda Calculus. Using examples from that book, this article will walk you through the basics of λ calculus. We'll then look at the surprising, counterintuitive way that the λ calculus lets us represent conditional expressions and boolean operations — all with functions as the only values. It was a very different way of thinking for me, and exciting to learn. I hope it's exciting for you, too!

  31. It's time to take a step back and get a high-level understanding of what Leiningen is. It's time to stare deeply into Leiningen's eyes and say "I see you," like Jake Sully in that Avatar documentary.

  32. An explanation of what lein trampoline does and how it does it.

  33. Leiningen reminds me a lot of Major Alex Louis Armstrong from Fullmetal Alchemist:

    • They are both manly
    • They are both artistic
    • Sometimes you don't know what the f* they're saying (but it's amazing anyway)
    • Mustaches
    • Sparkles

  34. If you're at all like me, the moment you got your first Clojure program running you belted out, "SOOO MUUUUUUUCH POOOOOOOWEEEEEEEER!" and thrust one or both fists into the air. Then, fifteen minutes later, you found yourself muttering things like "What's a maven?" and "Classpath what now?" and "What is Leiningen actually doing, anyway? Sure, those are the most handsome mustaches I ever laid eyes on, but can I really trust them?"

  35. Notes and links from Tapestry 2013

  36. Datomic is a unique new database. This article explains it by relating it to existing kinds of databases.

  37. Part of the excitement of working with Clojure is being exposed to Rich Hickey's thoughts on programming. Rich Hickey has a clear, consistent way of viewing fundamental programming concepts that I think any programmer would benefit from. Here is the beginning of my attempt to catalog Mr. Hickey's unique viewpoint.

  38. What will people post if they can't include links and can't use a nickname?

  39. In this post I go over a small refactoring to clean up some code in Whoops by implementing the DCI pattern. I'll cover the actual code changes and include my usual hand-wringing about what could be done better.

  40. Having put together a website using Noir, I wanted to to try and get closer to the metal. Here are some of my findings, including: templating heaven with Enlive and Middleman; using macros to enforce full stack consistency; roll-your-own-validations; more!

  41. Reflections on how embracing love has changed my life.

  42. I've been doing a daily gratitude practice for half a year now and have found it very useful. Here are some suggestions for your own practice.

  43. Aikido is love. You make this great great love of the universe your heart and then you must make your own mission the protection and love of all things. -- O'Sensei

  44. My first ever Mac app is out. Get it while it's hot!

  45. Matt Swanson has shared the secret to improving your running: move your feet! I elaborate on that advice and give a more complete way of figuring out your learning roadblocks and removing them.

  46. You probably already know about the following tools, but I found it useful to be reminded of them.

  47. Recently, I released OMG! SMACKDOWN!!!, which is the dumbest Clojure/Noir app created to date. This post dissects it in excruciating detail.

  48. Rambling thoughts on racism from a mixed-race guy who grew up in the South.

  49. What I've learned so far working with a distributed team in an enterprise environment.

  50. In this post I give a detailed description of a recent refactoring for my site OMG! SMACKDOWN!!! . I make no attempt to enliven the article with "cats" or "memes" or "humor" - it's straight up code and commentary.

  51. Clojure and noir are great fun. This post describes some of the code I wrote and gives some tips and tricks. There's other stuff too but I'm not going to try and summarize it here.

  52. Noir has a helper function, url-for, which you can use to generate URL's when given a named route. The problem arises when you have two different views which need to have links to each other.

  53. What causes frustration? How can we eliminate those causes?

  54. A talk I gave: Why you might want to learn more about visual design and how it's pretty similar to what you already know as programmers.

  55. I'm open sourcing Open Hercules an application I've put a lot of time into. This article explains my motivations, both practical and personal.

  56. Almost seven years since my first exposure to Ruby, I've found another language to be excited about.

  57. Learning about abstract math is rewarding in itself, but it could also be helpful to beginning programmers.

  58. In the year 2000, you will know all there is to know about yourself thanks to technology.

  59. The minimax algorithm is used to determine which moves a computer player makes in games like tic-tac-toe, checkers, othello, and chess. You can think of the algorithm as similar to the human thought process of saying, "OK, if I make this move, then my opponent can only make two moves, and each of those would let me win. So this is the right move to make."

  60. An attempt to describe an approach to programming within an integrated framework.

  61. I don't want to start a startup because of the experiences I've had with working for them. Also, the idea of financial freedom is not as appealing to me as it once was. Finally, there are already big challenges in my life.

  62. Thank you, everyone who has viewed Clean Up Your Mess. Thanks as well to everyone who has passed it on.

  63. If your configuration is convoluted as all hell, Higml might be for you. Also, this is my first attempt at writing first-class documentation.

  64. The learning curve for code libraries is often unnecessarily steep. I frequently feel that if the author had written better documentation, I'd be able to use his work much more quickly, or at least figure out that it's wrong for me and move on. I'm trying to write better documentation myself.

  65. It's been nearly a year since I've added anything to this site. There are a few reasons for that, though for now I'll only mention that I didn't like that the site existed in part to sell an iphone app and possibly future apps. Well, it turns out that I don't really care about overtly selling stuff. What I really want is a place to write about the pursuits I care about most.

  66. The world abounds with wacky models that help actual people actually overcome actual fear. Some people believe their obstacles are put there by God as tests for them to pass. Others believe that mortal life is a game played by immortal energy beings, just for the fun of it. And some folks believe that there is nothing more to life than what we see; when we die, that's the end, so we better make the most of it. Wacky!

  67. My first attempt to give myself super powers merely gave me sore palms. Riding in the back of my mother's beater as a five-year-old, I focused sunlight on the center of each hand using a magnifying glass likely found in a cereal box. After I was "charged up" I would point at trees, cars, fire hydrants, and other hapless objects and think to myself, "In five years, that thing's going to burst into flames."

  68. A few months ago, I was really psyched about some project (don't recall which), and said to myself, "I'm going to finish this thing, and nothing's going to get in my way." Immediately it occurred to me that a better attitude would be, "I'm going to finish this thing -- and I'll take all the help I can get."

  69. Today I finally wrapped up Control Time and submitted it to the app store :-). Hopefully they'll publish it soon.

  70. A lot of people view their motivation as something out of their control. It comes and goes, catlike in its fickleness. By breaking down motivation to its components, however, you'll be able to troubleshoot your lack of motivation and figure out ways to increase it.

  71. I'm a young software developer and caregiver. This web site is about my experimentations in creating and following a system for constant personal growth. This article gives some background on the circumstances that motivated me to start those experimentations and this site.

  72. A quick way to automatically follow people who follow you on twitter.

  73. A way to avoid namespace collisions.

  74. A few years ago I ordered DSL service. The DSL modem came with an ethernet cable, and one end was labeled "this end goes in your computer", and the other was labeled "this end goes in the modem." Obviously, it doesn't matter which end goes where, but the labels undoubtedly eliminated any possible confusion.

  75. I've been learning more about electronics, in part to get a ground-up understanding of computers. In the process I've become interested in learning to build robots.

  76. This is meant to save me from having to write the same boilerplate profiling code over and over.

  77. The following code lets you iterate over large collections of Active Record objects without having to load them all at once, thus reducing memory usage. It's allowed me to run cron jobs which iterate over thousands of records without getting the cron'd process killed for using too much of a system's resources.

  78. Give your models javascript-esque prototypal methods. When accessing an attribute on the prototypal object, the attribute's value is returned if not nil. Otherwise, the "linked" object's attribute value is returned.


  1. Clojure for the Brave and True

    A goofy book for learning Clojure. No functional programming or Java experience required!

  2. Grateful Place

    When we appreciate the good in our lives, the good grows and we have more of it.

  3. Clean Up Your Mess: a Guide to Visual Design for Everyone

    This popular guide will help you communicate with conscious skill. It will show you how to create designs that are easy to understand and attractive.