A friend sent me a link to Uncle Bob’s blog post on Clojure (2019), where he explains his road from hating Lisp to appreciating it to the point where its simplicity and power makes it his favorite language. He declared it a language for the ages, just as I did. Given that Uncle Bob is a co-founder of the influential Agile Manifesto and has used several different types of languages, his declaration has more reach, and he explained it more concisely than I could, anyways. And what about Paul Graham, whose ideas have a large audience and hasn’t stopped writing about Lisp’s secret superpowers? He’s been apparently creating a new language Bel, a version of Lisp that is defined in itself, and the premise’s challenge is like a math/logic puzzle that resonates with the history of Lisp as an unintended result of implementing math theorems in a computer. But he seemed to have liked Uncle Bob’s post, and in recent years, when asked, he also recommends Clojure as the flavor of Lisp to use for modern times (1, 2, 3, 4, 5).
Rust is a new-ish language that is very compelling in certain contexts, but learning it has a really deceptive learning curve, so I wanted to provide the links that I have found most effective for slow learning beginners like myself, especially because the “official” Rust book(s) are to me paradoxically hard to learn from despite being thorough.
I presented at the Unicode Conference 2 weeks ago, on Oct. 16, on important yet overlooked issues that concern languages that use abugida scripts and have agglutinative morphology, using Thamil language as a case study. Although the talk was mainly about the issues around dictionary data sets, other issues included input methods, and the need for phoneme level segmentation for these use cases. See below for more details:
The talk covered the following topics:
OmnICU is a new project to create Internationalization (i18n) functionality in multiple target languages and multiple resource-constrained runtimes. Two different approaches to solve that problem are wrapping a single common binary in multiple target language wrappers, and to write a source-to-source transpiler in a one-to-many fashion. Here are reasons why choosing Clojure (Lisp) would be a good decision for writing a transpiler.
Finding text editors that properly support the input and navigation of various scripts’ Unicode-encoded text is no longer as rare as it used to be. Unicode has been well-established for a long time as the standard for encoding all of the world’s languages. However, when it comes to text editors specifically for programmers (IDEs), ironically, the situation is pretty bad. It looks like in Visual Studio Code’s most recent update, they finally have proper support for input and navigation of abugida scripts, or as they’re alternatively called, alphasyllabaries. The animated picture in the VS Code update page shows someone typing and navigating Tamil text, but the change should actually apply to several languages across East Africa, South Asia, and Southeast Asia.
I’ve finished my 3.5 year stint writing Scala, and I haven’t stopped missing writing Clojure. The knowledge of Clojure continues to heighten and inform my programmer sensibilities. One thing that I appreciated about Scala is that it was as good of a medium as you might practically find to allow writing Clojure without writing Clojure. I liked to think of Scala as the canvas on which I painted my Clojure ideas. Because Scala makes itself amenable to many styles of programming at once (at least, FP and OOP), it was possible to write code by imagining what the Clojure code would look like, and then writing that in Scala syntax. Interestingly, the more I did this, and the more faithfully I did so, the more people implicitly (no pun intended!) acknowledged the code as “good Scala code”. Because, you know, most Scala programmers agree that good Scala code puts “val”s at the top of a function body, uses immutable collections exclusively, prefers functions over (object) methods, and makes functions small, stateless, and composable. More on that later. Here, I want to simply release some of the code that I wrote in Scala to fill in a few perceived gaps in Scala’s Seq abstraction, where the perception is based on what I was accustomed to using in Clojure.
In my previous job, I had a basic grasp of writing a SQL query, but I was never quite comfortable with “advanced” queries. (By “advanced”, it’s more like intermediate at best — it’s the nuances of joins, group-bys, having vs. where.) I was told that whatever SQL I didn’t know would be “easy” to pick up and would happen naturally, although in practice that never quite happened. It wasn’t until I started to come up with a system for solving interview-style programming problems that I started to similarly come up with a system for writing any SQL query. The following is the result, which is less of a “tutorial” for “beginner SQL” and more of a systematic process for constructing a SQL query:
Here are my sequential steps for writing SQL queries in a somewhat methodical way. YMMV.
Note: ‘key’, ‘column’, and ‘field’ are used interchangeably.
The last 18 months have been eventful even if my updates have been sparse. Here’s a quick rundown of some of the things that I’ve been up to:
- Published a blog post on the Google Open Source blog regarding clj-thamil (Thamil NLP and macros for “multi-lingual” Clojure) and clojure-turtle (Logo in Clojure) (Mar. 2016)
- Attended Clojure/West 2016 in Seattle and gave an Unsession presentation called “Keeping Simple Things Simple”. The conference was as rewarding for the people I got to meet as it was for the talks and ideas that I learned, which is saying something for a Clojure conference. (Apr. 2016)
- Volunteered with other people from Nest at the Brothers Code event in Oakland by the Hidden Genius Project to get Black male youth in the Bay Area interested in tech. (Dec. 2016)
- Attended the GCP Next conference in SF (Mar. 2017). I enjoyed the conference, especially the festive exhibits and some of the conversations with Google employees.
- Attended Clojure/West 2017 in Portland. The conference was great, and it was probably the first time where I attended the “hallway track” for a majority of the time. (Apr. 2017)
- I got quoted in a GCP Dataflow blog post on Dataflow Shuffle. (June 2017)
- Presented (via paper and slides) about prefix trees and other topics for Tamil / Indic Unicode at the Tamil Internet Conference in Toronto (Aug. 2017)
- Attended Clojure/conj 2017 in Baltimore and co-presented with Tim Pratley “Learning Clojure through Logo”. I also manned the booth for Nest. It was a great time talking with people, old friends and new, and seeing a great Rich Hickey talk in person for once. The talk introduced Power Turtle (github proj page), lein-cban, and cban. More work to be done on Power Turtle. (Oct. 2017)
- Volunteered again with the Nest team at the Brothers Code event by Hidden Genius Project. Displayed Power Turtle along with copies of this handout. (Dec. 2017)
Happy New Year, and hoping that 2018 is a good year!
The Tamil Internet Conference for 2017 in Toronto, Ontario, Canada just concluded. I presented a more in-depth explanation of my previous post on prefix trees along with specific examples of how I have used them.
Here is the full paper that I submitted for the conference proceedings, entitled “Prefix Trees (Tries) for Tamil Language Processing”. Here is the slide deck for the presentation I gave in the conference.
The following is the full text of the paper from the link above:
I recently was tasked with performing an ETL task that should be done as efficiently and quickly as possible. The work led me to learn more about parallel and distributed processing in Clojure. In addition to having a greater appreciation for what Clojure enables (once again), I also pushed the boundaries of what I thought is possible using the available tools. I ultimately ended up writing a Spark job whose executors are each running N threads (currently, N=3). But the path to that solution taught as much by what didn’t work as much as what did work.