Get insight into Pathom 3 in Fulcro with Pathom Viz
Fulcro has great dev tooling in Fulcro Inspect, however the part for exploring Pathom resolvers and attributes - its Index Explorer - is not compatible with Pathom 3. Here we learn what to do about it.
Continue reading →
First craft a language then build your software
A language suit for purpose enables us to express our thoughts clearly and concisely. In programming, this language consists of our actual programming language, the libraries we use, and the abstractions we build. I believe that most of the incidental complexity in code stems from an unsuitable language. A misfit language forces you to speak in a lengthy and roundabout way, never quite getting at what you actually want to say.
Imagine you lacked the word "snow" and had to always say "white, fluffy, crystalline, frozen water". Now imagine you are writing instructions for waxing of cross-country skiis and you lack the words for snow, skiis, and the different kinds and states of snow. How verbose and incredibly hard to understand that would be! And this is exactly how most of our code looks. As Alan Kay puts it: "Most software today is very much like an Egyptian pyramid with millions of bricks piled on top of each other, with no structural integrity, but just done by brute force and thousands of slaves." [Kay] Let’s explore this idea further.
Continue reading →
My year 2022 in review
2022 has been a busy year both geopolitically ❤️🇺🇦 and locally. I have done a ton of Fulcro, played with Rust, got into managing projects and people.
This is my first whole year in Ardoq and I am still loving it. I came to fullfil my dream of being full-time Clojure developer and (aside of that, because I still love Clojure!) I am staying for the friendly, open "big family" culture and awesome people. I started the year by working on our slow, stepwise transition from Mongo to Postgres (I still might one day write about why we sadly did not pick Datomic in the end 😭). It was an important and exciting task. As changing the DB your business is built on, while everything keeps running, always is. Later I took over one of our teams, helping it deliver faster, smaller, more frequently. I have also been pulled into hiring and people management, which is not as much fun as Clojure but is far more important. I still have a great deal to learn here.
Continue reading →
Fulcro Lesson: Detached Root Component (Form)
I am working on a Fulcro RAD application and want to display a RAD Form in a popup, to create a new customer for an order I am making. Normally Fulcro components are "composed all the way up to the root," including their query in the parent’s and getting their props from the parent. But that does not make sense here - I want a detached form I can pop up, fill, close, and go back to editing the order. I wasn’t able to figure out how to compose this without help and thus want to record the solution.
Continue reading →
Clojure is in fact a trinity - of language, interactive development, and structural editing
You can never really learn Clojure if you only focus on the language. Why? Because Clojure is in fact a synergetic combination of three things: the language itself, a way of working centered on interactive development, and structural editing support in editors for manipulating the code safely and efficiently. You cannot get the full benefits of Clojure unless you embrace all three.
Continue reading →
PostgreSQL: From JSON to table and back
I have a jsonb
column in Postgres and I would like to update parts of it based on some other parts of the value. In Clojure I would have used update
, which does new-value = f(old-value)
. How can I achieve something similar - i.e. deriving the new value from the old one - in Postgres? It turns out I can, with the help of a temporary table and jsonb_to_recordset
that can turn a jsonb value into a table and row_to_json + jsonb_agg
that can turn that back to jsonb. Let’s see how it works.
The data
I have a table called report
with the primary key _id
and jsonb column columns
. It looks like this:
_id | columns |
---|---|
123 | [{"key": "name", "type": "field", "label": "Name"}, {"key": "Supports", "type": "reference-type-outgoing", "label": "Supports"}, …] |
456 | [{"key": "name", "type": "custom", "label": "Name", "dataType": "Text", "sort": "ASC"}] |
789 | [] |
Notice that the objects in the array may have different keys.
What I want to do is to update every column of the type reference-type-outgoing
or reference-type-incoming
by appending the direction - outgoing or incoming - to the key. F.ex. the column above would become {"key": "Supports—outgoing", "type": "reference-type-outgoing", …
.
Continue reading →
Signing git commits with a ssh key using 1Password
The Sign your Git commits with 1Password post is really useful but it does not tell you how to verify that signing works, how to troubleshoot it, or how to make it possible to verify the signatures locally. I will explain that here. The short story is that you need to set up gpg.ssh.allowedSignersFile
and add your key there to be able to use git log --show-signature
.
First of all, the setup as described in the blog post works and you can display the signature after having made a commit with git show --pretty=raw
- notice the line with gpgsig …
and those below it:
Continue reading →