Week 51: What are you working on this week?


#1

You’re all doing these amazing things, whether it’s for work, open source, or some personal project, and that’s great and all except for the fact that we can’t see what you are doing!

So what are you working on this week? Maybe are you implementing an exciting feature, fixing mundane bugs (or writing them?), or are you caught in a massive yak shave? Share! :slight_smile:


#2

Having lots of fun with Kafka :slight_smile:


#3

I’ve been trying to give feedback on PRs to Boot so these can get merged. Also planning to go through the 100+ open issues at some point and close/label them as appropriate.

I also want to continue working on my OCaml ledger-cli import script and maybe release a boot task that provides some tooling to statically expose Boot dependenices.


#4

Working on the REST backend of a full stack Clojure app. UI is done in Clojurescript with re-frame. I also plan to use Datomic as a DB later.

I am amazed at how fast development is using the REPL and figwheel. And it’s so flexible that it dwarfs every Java framework I have ever used (or written myself). The point of this thing is to prove that Clojure is a valid option for enterprise development. The goal of course being that I can write Clojure in my day job.


#5

Trying to get my sablono fork more polished so I can finally publish it: Features:

  1. No interpreter.
  2. Optimized output when in production
  3. Create non-cljs components with [:> Foo props ch0 ch1].
  4. Support for fragments [:* a b c]
  5. Custom transformers for allowing rewriting of the hiccup [:div {:ttip "tooltip"} ...]

#6

Are you saying somehow that you’re working on a Sablono fork that supports React 16 ?


#7

Some of you have noticed that clojurians-log.clojureverse.org has stopped updating. It’s still logging in the background, but the HTML is no longer being generated.

This whole thing is powered by a mix of python and node scripts which I inherited, and which I would really like to replace with something in clojure so people in the community (and myself :slight_smile: ) can easily help maintain and improve it.

I have a long train ride today so I’m going to work on a new frontend that takes the logs (bunch of JSON files) and serves them as HTML.


#8

If you want to follow along, the code is here:


#9

Java API? Kafka Streams? Kafka SQL? Do tell!


#10

precept-devtools. Not public yet but should be ready soon. Other than that just Javascript for work :frowning: Looking into shadow-cljs and other ways for Javascript people to easily get a React app and a REPL up and running, maybe for a blog post.


#11

Well - I am working on a project to receive a lot of events through SSE channels, put them in some Kafka queues, and then pull them off again to feed remote databases through an HTTP API. The devil is in the details: no events are to be lost, and both producer and remote databases are stateful - so I need to keep a high-water mark of the last event I read (so I can subscribe again) and, when syncing, I have to ask each database up to which event they are up to; then do a back-scan, push all backlog and then start streaming new events. All this, non-blocking (as we have thousands of databases, and average latency should be < 100ms).

How it was: interesting. I wrote the Kafka module by wrapping the Java interfaces, and though Kafka looks simple, there are a lot of ways you may want to consume data (one or more topics at once, only one topic, only one partition; one topic or partition from index to index, from timestamp to timestamp and whatever else). Plus topics keeping state are compacted, and you have to keep only the last version of the key. Kafka is very low level, but version 1.0 is pretty nice. I use JSON for data representation, and Spec to make sure everything works as expected and that data is what I expect it to be. For Kafka, i ended up separating the reading operation into a function that does the heavy lifting and a kind of reducer that receives a page of data, processes it and returns what to do next (keep on reading , stop, skip). I am considering releasing the Kafka wrappers if anybody is interested.

As we have potentially tens of SSE ingestors spreading data across thousands of databases, I use bounded thread pools both on ingestors and on pushers when I need blocking operations, and async HTTP (http-kit) for everything else. Running thread pools with Clojure is easy-peasy, though you have to be careful with exceptions.

The best thing I learnt, still, is Spec - it saved my *** countless times, and is extremely useful to validate / conform data. Using the same spec to validate function input, external data and HTTP apis was a big gain (did I tell you we also have an HTTP inspection/configuration layer, as Kafka’s are pretty poor?)


#12

Preparing a PR that adds support for Clojure’s 1.9 REPL into proto-repl plugin for Atom editor. proto-repl looks really good, I wish I knew about it when I used to use Atom :slight_smile:


#13

My big piece of work this week has been focused on refactoring our older Clojure code (started in 2011) that used global singleton atoms to match our newer code that uses Component systematically.

It’s slow going and it really does underscore just how bad global shared state really is. We have close to 75,000 lines of Clojure these days and this will be a major refactor over the coming weeks.

My advice, when it comes to global shared state: Just Say No!


#14

Trying to push the effort towards supporting React.js v16 in rum and Ŝablono. Any help really appreciated !

I’m just realizing that this section of Clojureverse is a really good way to start organizing efforts for open source collaboration. Loving Clojureverse more and more :love_letter: