HNHacker News
TopNewBestAskShowJobs

jgrodziski

2,779 karma · joined January 7, 2011

Software enthusiast

https://grodziski.com

[ my public key: https://keybase.io/jgrodziski; my proof: https://keybase.io/jgrodziski/sigs/qJkYrphaaRZLp63TBGjHy8TU9tKge9T7x33RMmidOY4 ]

c2d5c3

Socials: - github.com/Jgrodziski

---

submissionscomments
jgrodziski··on Rotring 600 Ballpoint Pen
Yes definitely agree, I own the Rotring 600 and 800 pencil and they are fantastic, as already said the ballpoint version is dependant on the refill. The construction is sturdy and they feel very robust and heavy. But... I've recently transitioned to Pilot Capless fountain pen and it's night and day with the write feeling: https://www.pilotpen.eu/our-products/capless/ with ink bottle refill. The nib size is important, I found the medium too large and landed on the fine nib size.
jgrodziski··on Why is Jepsen written in Clojure?
We also write about our choice of Clojure for application development here: https://defsquare.io/blog/why-we-bet-on-clojure
jgrodziski··on A History of Clojure (2020) [pdf]
Yes I agree, timbre and clojure.spec are great and I used them a lot, nowadays I move to μ/log and Malli for instance. My comment was to provide some guidance for someone outside of the Clojure community to navigate in the library ecosystem. I updated my comment to reflect that it's an opinionated take and just that.
jgrodziski··on A History of Clojure (2020) [pdf]
> - Incredibly slow

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...

jgrodziski··on A History of Clojure (2020) [pdf]
The Clojure's approach is to favour libraries over frameworks. We use Clojure on various style of applications (mainly web and API based), hosted on widespread infrastructure technologies of Cloud Providers (Kubernetes, PostgreSQL, Kafka, etc.) and it's a breeze: here are our reasons for choosing Clojure https://defsquare.com/blog/why-we-bet-on-clojure

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 :)

jgrodziski··on Keycloak – Open-source identity and access management interview
I use Keycloak a lot for authentication and authorisation and I like its flexibility and richness of features.

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....

jgrodziski··on The Janet Language
There is also the jank language [0] that plays in similar fields.

> 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]: https://jank-lang.org/

jgrodziski··on Ask HN: Recommendations for books and tutorials on Theory of Computation
Understanding Computation by Tom Stuart is very good.

[https://computationbook.com]

jgrodziski··on Domain-Driven Design
I made this introduction to DDD [0] with my friend Thomas a few years ago. It was specifically intended at developers and to be very practical.

[0] Video of the talk: https://vimeo.com/167722768

jgrodziski··on Joker: A small interpreted dialect of Clojure written in Go
GraalVM issue an error if it can't resolve the proper method call or if another Thread is involved in the computation so I find it pretty safe to use. Of course, GraalVM doesn't exempt you from doing some tests.
jgrodziski··on Starlink review, four months in
I'm one of the few client here in France for a few days. I moved from Paris to a quite isolated area (Vercors mountains) with only ADSL (no mobile coverage), and it's night and day, I now get between 100 Mbps and 200 mbps with 30/40 ms latency... I don't have a lot of time with the service to give an exhaustive feedback, but for the moment I'm able to do video conferencing and call perfectly. And the setup experience is great!
jgrodziski··on Keycloak: Open-source identity and access management
I have the same setup (re-frame SPA, websocket, etc.), the only page that is themed with Keycloak is the login and password change page, everything else is handled by API calls.

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.

jgrodziski··on Keycloak: Open-source identity and access management
You can theme the Keycloak UI to be similar to your app's one, particularly the login/registration screens so the user experience is very smooth. But you can also define the user/account UI and logic in your app and just delegate the authn and authz data through the Keycloak APIs.
jgrodziski··on Keycloak: Open-source identity and access management
Feel free to ask me anything about Keycloak in the Clojure ecosystem. The README of keycloak-clojure needs some lifting but hopefully you'll find everything you need.
jgrodziski··on Keycloak: Open-source identity and access management
Keycloak is a great piece of engineering. It's a robust IAM, fully-featured, easy to deploy and integrate with. My opinion is that people should rely on battle-tested 3rd party solution like Keycloak for their authentication and authorization needs.

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).

jgrodziski··on Ask HN: A modern-looking UML diagram tool?
See also that repo with a skinparam for a "not ugly" plantuml style: https://github.com/matthewjosephtaylor/plantuml-style
jgrodziski··on Ask HN: Best Lisp for software development?
I've used Clojure several times for production-ready software and it's a breeze to operate. Concerning production-readiness, here are my takes about it: - a major requirement is a good integration with infrastructure softwares like databases, search engine, messaging, IAM. As Clojure is hosted on the JVM, the integration is very simple with already available drivers for Postgres, Kafka, Solr/Elastic Search (easier as the protocol is a REST API), Keycloak, etc. - Cloud integration, even for Serverless, is very easy: just transpile to Javascript (Google Cloud Function) or Java (AWS Lambda) - build and package management are very mature with Leiningen, the latest "tools.deps" have, IMHO, very interesting characteristics of simplicity (composibility at core and simple "main" interface for invoking build process) - You'll need top notch security: OpenId with Keycloak makes it very easy to have a very good IAM system (disclaimer: I make a Keycloak Clojure wrapper https://github.com/jgrodziski/keycloak-clojure) - Good operability is also a must-have: structured logging (look at Cambium), metrics (Prometheus), good performance of the JVM, good monitoring and profiling - On the development Side, the productivity of using clojurescript with reagent/re-frame and the development flow both on frontend and backend is a killer argument. The possibility of isomorphism (running the same code on the frontend and backend) makes it very easy to share the same domain between the backend and frontend.

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).

jgrodziski··on The Essence of Datalog (2018)
There is a very nice Datalog tutorial at: http://www.learndatalogtoday.org/ Lean a little bit toward Datomic, but very nice examples nevertheless.
jgrodziski··on Learn Anything White Paper
Yes, great initiative. I tried to do the same with my "Learn Computing Directory" [0] website some times ago...with hand curated links towards websites, books, video courses, etc. all on a github repo Should have add a way to upvote the links...

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?

[0]: https://www.learn-computing-directory.org/

jgrodziski··on Ask HN: How do you stay healthy?
Three pillars:

- 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...

jgrodziski··on Choosing between names and identifiers in URLs
Identifying changing "stuff" in the real world is for me a fundamental topic of any serious data modeling for any kind of software (be it an API, a traditional database stuff, etc). Identity is also at the center of the entity concept of Domain-Driven Design (see the seminal book of Eric Evans on that: https://www.amazon.com/Domain-Driven-Design-Tackling-Complex...).

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

jgrodziski··on How Not to Die of Botulism (2013)
Here is a small summary of the different kind of fermentation to better understand the article. The three main type of fermentation are:

- 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).

jgrodziski··on How Not to Die of Botulism (2013)
Yes, how not to die of botulism: understand home food preservation. That's to say: bad bacteria proliferates without oxygen, without salt and without acid, that's why garlics in oil is a death recipe, it's not only the absence of oxygen but also the high ph and absence of salt.

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).

jgrodziski··on The Domain-Driven Design Paradox (2016)
Yes I would definitely recommend Eric's book for the deep insights it contains, but it may not be the easiest to read, especially for non-native english readers as his english is quite formal. Scott Millet's book is also very good. For an introduction to DDD you can have a look at a conference video here my friend Thomas Pierrain and I made : http://videos.ncrafts.io/video/167722768 (shameless plug :-))
jgrodziski··on Ask HN: Who is hiring? (September 2016)
Deolan | Paris | Full-Time | System Administrator, DevOps | http://www.deolan.com

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.

jgrodziski··on Ask HN: Book Recommendations?
I've compiled and organised resources, including books, about computing on : http://www.learn-computing-directory.org Also feel free to contribute!
jgrodziski··on Lisp as the Maxwell Equations of Software (2012)
Hi, Submitter here,

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.

jgrodziski··on Bringing SSD Performance to the DIMM form factor
I look forward to the point where 3/4 of business application code will go the trash when we'll have a persistant memory with the latency of actual RAM disk (Memristor !!). Exit all that "copy from RAM to Disk/Network" code. It will definitely change the way we code and look at code. That's why nowadays I think a good interface to your entities, like the Repository pattern, is a must have.
jgrodziski··on 3D and video mixing with Three.js
Yep, here is the video explaining how they did it: http://vimeo.com/105729794
jgrodziski··on Ask HN: What makes an API good?
There was an excellent talk at the last QCon New-York conference about good API design: http://www.infoq.com/presentations/API-design-mistakes Worth watch it in my opinion :-)
Page 1 of 2Next →