News for hackers. Stuff that matters.
Re:Why is Jepsen written in Clojure? by DeathArrow on Wednesday December 06, 2023 @04:28AM (#38541955)
Does Clojure have a decent web framework?
Re:Why is Jepsen written in Clojure? by dgb23 on Wednesday December 06, 2023 @07:32AM (#38543002)
Comprehensive frameworks include: biff, kit.

Both of these rely on some of the most popular and simple libraries for web dev.

Most seem to simply use said libraries directly, mix and match what is needed.

If you’re an experienced web developer but new to Clojure, then you’re going to spend a good weekend or so to set up a proper environment, combine the necessary libs and so on, if you have some guidance. The Clojure community is quite welcoming and helpful in that regard.

There’s an initial learning curve, because it’s a functional Lisp though. That comes with some necessary re-wiring, but also with some unique powers.

The cool thing about writing Clojure is that feeling: „Really that’s it?“ when you realize how simple it is. It’s also simply fun to use, because of how interactive it is.

Re:Why is Jepsen written in Clojure? by digdugdirk on Wednesday December 06, 2023 @07:38AM (#38543062)
Do you have any recommendations for good resources for a starting point? And maybe something like a generic "to-do app" style tutorial just to see how everything is laid out and how everything connects?
Re:Why is Jepsen written in Clojure? by dgb23 on Wednesday December 06, 2023 @08:14AM (#38543410)
There are many good tutorials, free and paid books.

However, if you just want to get started and have a minimal thing working without much fuss I recommend this one:

https://clojure-doc.org/articles/tutorials/basic_web_develop...

I haven't directly used it but I reviewed it once and it seems to be one of the most straight forward and carefully written web development tutorials for Clojure. It uses a very minimal set of libraries and it really goes from A to Z. Perfect if you want to just get yourself familiar and have something working.

Re:Why is Jepsen written in Clojure? by digdugdirk on Wednesday December 06, 2023 @11:33PM (#38552851)
Wow. There'll definitely need to be some translation before I understand everything, but you're absolutely right - this tutorial is one of the best I've ever seen.

Thank you for sharing it!

Re:Why is Jepsen written in Clojure? by seancorfield on Friday December 08, 2023 @01:49AM (#38566120)
As the current maintainer of clojure-doc.org, I'd be happy to hear your feedback on what needs additional explanation/clarification.

This year's funding by Clojurists Together allowed me to spend a lot of time completely rewriting large sections of the site to bring it up-to-date with modern Clojure tooling and libraries -- but I know there's still room for improvement.

Re:Why is Jepsen written in Clojure? by digdugdirk on Wednesday December 13, 2023 @10:22PM (#38637408)
Just seeing this now. Very busy with work at the moment to dive into learning a new language/paradigm, but I will honestly set a reminder to check in with you in a few months after I've dug into it some and I'll be sure to take notes with this in mind throughout.

I love the idea of a community investing in this type of outreach (beginner oriented) and I'll be happy to contribute when I can.

Re:Why is Jepsen written in Clojure? by stefcoetzee on Wednesday December 06, 2023 @07:48AM (#38543143)
Consider the tutorial on the Kit website: https://kit-clj.github.io/docs/guestbook.html#guestbook_appl...
Re:Why is Jepsen written in Clojure? by sometimesweenie on Wednesday December 06, 2023 @10:14AM (#38544889)
If you want a solid structure to start with, I’d suggest https://luminusweb.com/ as that’s what I initially learned from. For a todo app I believe the reagent repo has an example of that without the server bits. I could give you some more direction depending on what you’re trying to accomplish
Re:Why is Jepsen written in Clojure? by finnjohnsen2 on Wednesday December 06, 2023 @08:28AM (#38543561)
"No, but maybe" is how I would answer this question myself. Maybe there is a working framework I'm unaware of - but in my experience using Clojure the last few years is that the concept of frameworks is not in the culture of the Clojure community.

You compose your stack of smaller libs and build your own framework so to speak. The right questions in this context are; what http server to use, what routing lib is decent, what is a good lib for my database, what is a good lib for generating html from the server. etc.

If you wanna start using clojure as a web server. Start with 'ring', and you can recieve http requests. You quickly realize you're missing stuff to do what you need and will go searching for libs. You'll find great libs out there for anything you ordinarily need for a web-server setup.

Re:Why is Jepsen written in Clojure? by jwr on Wednesday December 06, 2023 @04:50AM (#38542088)
I am not sure what a web framework is, to be honest. The choices for many parts of a web application are really domain-specific and I'm not sure a single "framework" would work for everyone.

As far as web-related components go, my app uses Rum (as an interface to React), ring, http-kit, pushy (for history manipulation), sente (for websockets), buddy (for authentication tools).

If you are looking for a batteries-included "I want to have some sort of webapp right away" thing, I think https://kit-clj.github.io would fit the bill, but the general feeling in the Clojure community is that unlike Python with Django or Ruby with Rails, the choice of app components is not predetermined by the language.

Re:Why is Jepsen written in Clojure? by spelufo on Wednesday December 06, 2023 @07:21AM (#38542896)
What about the database side of things?
Re:Why is Jepsen written in Clojure? by jetrink on Wednesday December 06, 2023 @08:01AM (#38543264)
If you don't need something as low-level as next.jdbc, HugSQL is my preferred library. It lets you write queries in .sql files, and the queries are then loaded as functions. If you want to dynamically generate queries, there are also libraries like HoneySQL.
Re:Why is Jepsen written in Clojure? by stefcoetzee on Wednesday December 06, 2023 @07:50AM (#38543161)
next.jdbc is the go-to library to interact with SQL databases. https://cljdoc.org/d/com.github.seancorfield/next.jdbc/1.3.8...
Re:Why is Jepsen written in Clojure? by simongray on Wednesday December 06, 2023 @03:11PM (#38548867)
Probably worth mentioning that triplestores/Datomic-like databases are relatively mainstream in Clojure: https://github.com/simongray/clojure-graph-resources#datalog
Re:Why is Jepsen written in Clojure? by 22289d on Wednesday December 06, 2023 @06:16AM (#38542507)
> I'm not sure a single "framework" would work for everyone.

I guess you weren't lying because that is not what a web framework is.

If it works for just me, that's a web framework. The fact that there are so many web frameworks shows that none work for everyone.

Re:Why is Jepsen written in Clojure? by shortrounddev2 on Wednesday December 06, 2023 @08:59AM (#38543956)
Components of a web framework:

1. Routing

2. ORM

3. Auth handling

4. Request middleware

5. Templating (if your application requires it)

6. User input validation

Many other components that are escaping me right now

Re:Why is Jepsen written in Clojure? by abc_lisper on Wednesday December 06, 2023 @12:36PM (#38547010)
Most of these are handled by reitit and ring
Re:Why is Jepsen written in Clojure? by WJW on Wednesday December 06, 2023 @10:17AM (#38544934)
Some more standard components I would no longer want to do without in a full-featured framework:

- background job system

- email sending

- translation/localisation

- a decent configuration system suitable for differentiating dev/test/staging/prod/etc, and handling both secret and non-secret values in a sane way

Re:Why is Jepsen written in Clojure? by shortrounddev2 on Wednesday December 06, 2023 @10:54AM (#38545512)
Secret handling has been abstracted away from the framework for everything I worked on; usually our deployment system would mount secrets as a file system and then you read them as a file of key->value pairs. That, or they were just set as environment variables. I guess the framework could provide a standardized secret service, but I usually just write that myself
Re:Why is Jepsen written in Clojure? by WJW on Wednesday December 06, 2023 @11:02AM (#38545647)
> but I usually just write that myself

Not saying you shouldn't, but part of the point of a framework is all the things you don't have to write yourself.

What I like about (say) Rails secret handling is that the secrets file is an encrypted file in the repo itself. This makes it so that you can easily check out and run different versions of the repo from different times and not have to worry about that one time you renamed an envvar or something. Secrets get version controlled together with the app. The autogenerated .gitignore even includes patterns for the key files so you have to go out of your way to check them into the repo. The downside is that merging encrypted files can be a right pain in the arse, for example when two devs added different secrets in different branches.

Re:Why is Jepsen written in Clojure? by shortrounddev2 on Wednesday December 06, 2023 @11:44AM (#38546240)
I feel that web frameworks should be flexible enough that the CI/CD system can put things like secrets into files without worrying about the particular framework that's consuming them. If you don't write the secret service in the web framework, you have to write the secret manager in CI/CD to convert formats or what have you. Something I dislike about spring boot is how spring-y everything has to be.
Re:Why is Jepsen written in Clojure? by ElectricalUnion on Wednesday December 06, 2023 @12:48PM (#38547176)
> CI/CD system can put things like secrets into files

This sounds horrible. Why does specifically your CI/CD need to know those things?

This also sounds like your CI/CD system is "too smart" and your build process is "dumb pipes", what I believe to be a unsupportable, unmaintainable anti-pattern - if people can't build/test things on their own machine, things are likely not repeatable/reproducible at all and you're one CI/CD issue away from losing your project.

> Something I dislike about spring boot is how spring-y everything has to be.

I thought spring "runtime config override" was just dropping a properties (admittedly awful format, latin-1 encoded to boot) file near the compiled project uberjar/war/ear and you're done?

Re:Why is Jepsen written in Clojure? by shortrounddev2 on Wednesday December 06, 2023 @01:11PM (#38547474)
> This sounds horrible. Why does specifically your CI/CD need to know those things?

You set it up so that production secrets are kept in that store and are only accessible by a 1 or 2 high level people. Developers don't have access to production secrets, only dev or staging, which live on their own machines and are lower security risk

> if people can't build/test things on their own machine

I don't see why they wouldn't be able to build/test on their own machine. You just have a different secrets store and keys than the CI/CD does

> I thought spring "runtime config override" was just dropping a properties (admittedly awful format, latin-1 encoded to boot) file near the compiled project uberjar/war/ear and you're done?

Yes I hate this. I want to be able to decide how properties are loaded, not rely on some ethereal state managed behind the scenes and not be able to see if it's loading properly. If I want to use their terrible resources/config file, I'll specify that in middleware/startup

Re:Why is Jepsen written in Clojure? by PaulHoule on Wednesday December 06, 2023 @09:23AM (#38544235)
I think routing makes the minimal viable "framework" -- look at the many systems like Sinatra, JAX-RS, aiohttp, etc where you write functions and supply metadata to tie URLs to functions.
Re:Why is Jepsen written in Clojure? by Capricorn2481 on Wednesday December 06, 2023 @09:57AM (#38544648)
For clojure, that would be biff
Re:Why is Jepsen written in Clojure? by jwr on Thursday December 07, 2023 @05:22AM (#38554875)
Oh, that's a great list — see, that's why we disagree on the utility of "web frameworks". My app does not use a routing component at all, and none of the existing solutions fit my use case. I also don't have an ORM and I don't think even having an ORM is a good idea (I'm currently working on moving to FoundationDB, where you can get extreme gains by coupling your app closely with the database, rather than talking to it through a thin straw).

I don't use templating, at least not for web pages.

User input validation — that's something I've spent the better part of several years working on, but in a larger context of a toolkit for dealing with forms, tables, data presentation, filtering and sorting. I daresay the solution I have now (which uses ideas dating back to Smalltalk) is way more extensive and flexible than what every "framework" out there has.

Re:Why is Jepsen written in Clojure? by theonething on Thursday December 07, 2023 @10:58PM (#38565279)
> User input validation — that's something I've spent the better part of several years working on

And that's why I use good frameworks.

Re:Why is Jepsen written in Clojure? by jwr on Friday December 08, 2023 @07:40AM (#38568301)
I don't think there is a framework out there that does what I need it to do, but I'd be happy to learn — which ones did you specifically have in mind?
Re:Why is Jepsen written in Clojure? by rafaelmn on Wednesday December 06, 2023 @07:50AM (#38543162)
Because of it's lisp nature with special braces I find it to be nicer for creating DOM than HTML :

   [:div
     [:p "I am a component!"]
     [:p.someclass
       "I have " [:strong "bold"]
       [:span {:style {:color "red"}} " and red "] "text."]]
really has that "first class" feel when you're working with it rather than feeling tacked on like JSX - at least that's how I remember it.

My main problem with Clojure was the dynamic nature of it. I have not used it in very long time now (probably 7 years at this point) - but despite the amazing aspects of it I would not trade in TypeScript annotations.

A question for clojurists here - what is the level of static type checking adoption in CLJ world ? When I was using it last time there were some things like schema validators, but nothing like TypeScript. It looks like there's static typing annotations support now but are the types widely used by popular projects/provided for big libraries ?

Re:Why is Jepsen written in Clojure? by jwr on Thursday December 07, 2023 @05:16AM (#38554832)
From the point of view of a solo developer maintaining a large app over many years: I would not want to deal with static type checking and I would not find it useful, except for simpler subsets of my code.

I do use spec, and I've used other checking solutions before. I also use :pre/:post conditions a lot, as well as plenty of assertions. But in a large and complex application the errors I'm likely to run into are not as simple as a mismatched type. My most valuable checks and specs constrain multiple data fields.

Thinking about stuff I run into, I would say that the majority of errors are due to optionality — where a key is optional in some contexts, but mandatory in others.

Re:Why is Jepsen written in Clojure? by gleenn on Wednesday December 06, 2023 @04:34AM (#38541988)
Luminus has been around a long time and Kit is newer. Most Clojurists believe in libraries over frameworks though so that's why you don't hear about web frameworks much. I've messed with Luminus a few times and it is really easy to pull out parts and swap in almost any bit of it. They document a lot well and make it really easy to pick different parts out of the gate like different DBs, JavaScript libs, and a lot more. The maintainer roams HN frequently as well :)
Re:Why is Jepsen written in Clojure? by aphyr on Wednesday December 06, 2023 @09:27AM (#38544271)
Aphyr.com is built with Luminus. :-)
Re:Why is Jepsen written in Clojure? by gengstrand on Wednesday December 06, 2023 @11:39AM (#38546197)
Whatever happened to ring or donkey?
Re:Why is Jepsen written in Clojure? by gleenn on Wednesday December 06, 2023 @11:40AM (#38546203)
Luminus uses Ring.
Re:Why is Jepsen written in Clojure? by epgui on Wednesday December 06, 2023 @06:32AM (#38542580)
I know you’re probably going to think this answer is crazy or stupid, but you don’t need a web framework in clojure. In fact you don’t need all the libraries that many languages need.
Re:Why is Jepsen written in Clojure? by olavfosse on Wednesday December 06, 2023 @05:23AM (#38542237)
Re:Why is Jepsen written in Clojure? by daveliepmann on Wednesday December 06, 2023 @06:05AM (#38542447)
It has several. None of them dominate; most people assemble their own from individual libs.
Re:Why is Jepsen written in Clojure? by yogsototh on Wednesday December 06, 2023 @12:03PM (#38546524)
Let me add my 2cents on this subject.

I feel that due to its functional nature or perhaps this is just the community bias, Clojurists tend to prefer mixing lower level libraries to build their web application instead of relying on a specific big web framework like RoR for example. Luminus would be one RoR-like system.

But today, I think people would probably choose reitit for the writing the API and use a clojurescript framework for the frontend or perhaps still use reitit to generate HTML pages using hiccup.