2,779 karma · joined January 7, 2011
https://grodziski.com
[ my public key: https://keybase.io/jgrodziski; my proof: https://keybase.io/jgrodziski/sigs/qJkYrphaaRZLp63TBGjHy8TU9tKge9T7x33RMmidOY4 ]
c2d5c3
Socials: - github.com/Jgrodziski
---
Almost as fast as Java, and for performance critic processes 99.9% of the time we bump on infrastructure performance problem BEFORE hitting the wall with Clojure (see https://clojure-goes-fast.com/blog/ for tips and tooling about performance)
> - Hosted on the JVM, so you're going to be dealing with Java eventually
For me it's a major selling point: JVM is battle tested and a wonder of engineering. The Java ecosystem richness is incredible (see tooling above for monitoring and profiling for an example). And the platform is constantly moving forward (see latest JDK with virtual threads, generational ZGC, etc.). And of course GraalVM... (https://www.graalvm.org)
> - No automatic tail call optimization because of the limitations of the JVM, so it feels like you're writing a mess of macros rather than real functional code
Never have been a problem and I don't see the point with macros, and code we write looks _very_ functional...
If you want to look at libraries where some people have settled, here are our _opinionated_ takes on libraries that we use on almost every project:
- HTTP: Ring is the de facto way to manage HTTP request (see https://github.com/ring-clojure/ring/wiki/Concepts) supplemented with various "Middlewares" for web-related concerns (security, logging, content encoding, etc. see https://github.com/ring-clojure/ring/wiki/Standard-middlewar...). Jetty and Aleph are common web servers (and https://github.com/clj-commons/aleph) that implement Ring interface.
- Routing: Reitit (https://github.com/metosin/reitit)
- Single-Page App: shadow-cljs for the build concerns (https://github.com/thheller/shadow-cljs), Reagent with Re-frame for complex/large app (https://reagent-project.github.io and https://github.com/day8/re-frame). Even if we now prefer using HTMX (https://htmx.org) and server-side rendering (Hiccup way of manipulating HTML is just amazing, https://github.com/weavejester/hiccup).
- Schema management: Malli (https://github.com/metosin/malli)
- Lifecycle management: Mount, Integrant or Component (https://github.com/tolitius/mount https://github.com/weavejester/integrant and https://github.com/stuartsierra/component)
- Config management: Aero (https://github.com/juxt/aero) and environ (https://github.com/weavejester/environ)
- Log: μ/log (https://github.com/BrunoBonacci/mulog)
- Time: https://github.com/juxt/tick
- Testing: https://clojure.github.io/clojure/clojure.test-api.html and Kaocha for the runner (https://github.com/lambdaisland/kaocha).
- Package and project management: tools.deps is simple and powerful (https://clojure.org/guides/deps_and_cli)
For infrastructure stuff (PostgreSQL, Keycloak, Solr, Kafka, etc.), just wrapping the underlying Java library or driver is often enough, and there are lots of wrappers for easing the integration. And we implement Hexagonal architecture style to put all of that in place.
Don't be afraid a libraries not moving a lot recently, it's a sign that the library is mature and battle-tested. Clojure is a joy to use every day :)
Running it in production is a no-brainer, the only problem we got was some bad behaviours of some clients that issue a token for every API call as it can put some stress on Keycloak, has to implements some rate limiting in front ok Keycloak to avoid that.
I try to ease its usage with Clojure with https://github.com/jgrodziski/keycloak-clojure I wrote some documentation about Keycloak concepts here: https://cljdoc.org/d/keycloak-clojure/keycloak-clojure/1.30....
> jank is a general-purpose programming language which embraces the interactive, value-oriented nature of Clojure as well as the desire for native compilation and minimal runtimes. jank is strongly compatible with Clojure.
[0] Video of the talk: https://vimeo.com/167722768
I prefer to deal with account data and logic in a dedicated component that map with users stored in Keycloak. Even if you can associate custom attributes with user and groups, I don't think it's a good idea to do so (performance, separation of concerns, etc.).
For me Keycloak jobs is to handle authentication and authorization data and/or logic (authorization service is very well designed but a little bit complex), for simple use-case a role check in the application is enough.
We run it in production on GCP and it integrates nicely with the Clojure ecosystem (both on the frontend with a SPA and on the backend dealing with REST API security).
Shameless plug: I maintain the keycloak-clojure wrapper: https://github.com/jgrodziski/keycloak-clojure (You'll find some explanations of the Keycloak concepts in the README).
In the end, Clojure is amazing and fun, and it's production-ready for a long-time. I made a talk at the Clojure Paris meetup 3 weeks ago (slides here: https://speakerdeck.com/jgrodziski/clojure-project-in-the-fi... only the 3 first slides are in french, the rest in english).
I find the "Graph" way of presenting the topics very interesting. I think trying to deal with all the conceivable topics is a dead end, but maybe allowing to install the software, like discourse, in communities websites may be a better strategy?
- Physical Activity: Using Freeletics app for bodyweight training in alternance with running in the morning. Use my bike whenever I can for transport. Practice Systema martial art when I'm in Paris (try to practice Systema breathing also, I suggest the book from Vladimir Vasiliev "Let every breath"). Take a cold shower after training for boosting energy levels. Try to meditate 10 mn in the morning before my workout.
- Good Sleep: Use Sleep Cycle app, try to have at least 7,5 hour of sleep (a multiple of a 1h30 cycle for me), try to detect your "sleep train" (for me it's 22h30 in the evening, usually I go to bed at midnight and wake up at 7:30).
- Good diet: vegetarian, lots of leguminous and oleaginous for proteins, green leaf (made 1 to 1,5L of green smoothies in the morning) a salad in the evening. Avoid sugar and carbs (or only some rice from time to time). Take some vitamins supplements and amino acid for sports. Drink green tea through the day and coffee (though I try to reduce...), also try to reduce my alcohol consumption (or only the week-end). Don't count any calories...
I started changing my way of looking at identity by reading the rationale of clojure (https://clojure.org/about/state#_working_models_and_identity) -> "Identities are mental tools we use to superimpose continuity on a world which is constantly, functionally, creating new values of itself."
The timeless book "Data and reality" is also priceless: https://www.amazon.com/Data-Reality-Perspective-Perceiving-I....
More specifically concerning the article, I do agree with the point of view of the author distinguishing access by identifier and hierarchical compound name better represented as a search. On the id stuff, I find the amazon approach of using URN (in summary: a namespaced identifier) very appealing: http://philcalcado.com/2017/03/22/pattern_using_seudo-uris_w.... And of course, performance matters concerning IDs and UUID: https://tomharrisonjr.com/uuid-or-guid-as-primary-keys-be-ca....
Happy data modeling :)
EDIT: - add an excerpt from the clojure rationale
- Alcoholic fermentation (beer, wine,etc.): without oxygen, yeast produce ethanol from sugar, like when you leave some fruits rotten without too much oxygens...but fruits rotten because fungi proliferates quicker due to the presence of oxygen
- lacto-fermentation (cheese, yoghurt, etc.): without oxygen and in a warm environment, lacto-bacillus produce lactic acid from sugar
- acetic fermentation (vinegar) : WITH oxygen (seldom one), acetobacter bacterias produce acetic acid from ethanol
Louis Pasteur said "Fermentation is Life without oxygen", so whenever there is oxygen, you'll see the usual rot produced by fungi (yes, very crude simplification). So the main aspect of fermentation is to ensure an anaerobic environment, often with water or when you remove oxygen from a recipient by aspiring it.
The other types of fermentation are more seldom: propionic fermentation (from lactic acid to propionic acid like in the gruyere cheese), butyric fermentation (like in rancid butter), malolactic fermentation (from malic acid to lactic acid, because the malic acid, found in grappes and apples gives a very acidic taste and is used to lower that acidic taste in some wines).
Understand the bacterias ecosystem is also a good way to understand home food preservation, in a salty and no oxygen environment (like salted water) you incentive lactobacillus that will consume sugars to produce lactic acid (and thus lower the ph), hence not a good environment for Clostridium Botulinum and fungi...so yes you can use heat to kill Clostridium Botulinum but you can also use other bacterias and the environment, the problem with heat is that you often kill "all" the bacterias leaving a highway for "pathogen" ones if the heating was not done properly.
Lacto-fermentation is a fascinating world: https://www.thespruce.com/g00/how-lacto-fermentation-works-1...
And as a french guy, here we know a lot about cheese and lacto-fermentation :-) as all cheese, after coagulation, start from the transformation of lactose (a sugar) to lactic acid thanks to the bacterias (and lot of french cheese use...salted water).
UPDATE: the official recommandations to remove the toxin produced by Clostridium Botulinum: boil during 10 minutes, to kill the spore: heat above 120°C during at least 30 minutes, to prevent its proliferation in the first place: water with NaCl at a 15% concentration, OR 2% of acetic acid (vinegar) OR oxygen (but in that case the fungi will gently occupy the place).
Since 2007, Deolan runs a data platform dedicated to the air transport industry : flight informations, passenger data, messages. We are developing innovative solutions aiming to digitalize transport related data for airlines, airports, tour operators and every stakeholders of the travel industry.
Everyday we handle hundred of thousands messages: flight data and passenger informations, special meals orders worldwide. Héraklion, Cancun, New York, and even Limoges airports are typical destinations we work with 24/7. Our team is built with more than 30 people with various profiles: IT specialists, Airline operation experts, creative graphic designers and efficient sales. They share a common passion for aircraft and our customers. The team has a clear target: digitalize air transport operations and transform the travel industry. Our values: team spirit, respect, eager to learn, understand and share key business issues. Our practices: agility and fun!
Your mission: join the IT team, assist our lonely system administrator to: - Provide, install, configure and run the hardware infrastructure - Contribute to maintain and improve the current infrastructure - Document your achievements - Keep an eye on innovations and new solutions - Provide support to our developpers on projects (needs, setup, deployments etc.)
What about the IT environment? Physical servers, cloud based services, with : - Linux - AWS - Docker - Salt-stack - Git - Cisco asa - Checkpoint - JIRA/Confluence - Relational and document database (Mongo, EsasticSearch), and coming soon graphs - WebSphere MQ
Our offices are located near République in Paris, with dense public transport access including metro, bus, bikes, and even feet. Anyway you will be welcome! The team has a great sense of humour, our offices are luxurious and coffee never stops flowing.
Payroll based on experience.
Send us an email at jobs@deolan.com (http://www.deolan.com/job-opening/admin-system-paris.html#en). Explain us what you do, where you worked before and why you would add value to the Deolan team. Just add your résumé. We will get back to you as soon as we can.
I stumble upon that article from my bookmarks while pouring my latest side project (http://www.learn-computing-directory.org/languages-and-progr...) and thought about submitting it to HN. By the way, feel free to give me feedbacks about the directory! (in still in very alpha state but already online). I only fill for the moment the "Algorithms and Data Structures", "Compilers" and "Theory of computation" topics.
Two great articles that complements perfectly the one submitted are LISP interpreters in Python from Norvig: http://norvig.com/lispy.html and http://norvig.com/lispy2.html Also, the book "Understanding Computation" (http://computationbook.com/) can be a great companion as there is a section about Lambda Calculus.
Jérémie.