This page is not created by, affiliated with, or supported by Slack Technologies, Inc.
2021-01-22
Channels
- # announcements (28)
- # babashka (77)
- # beginners (122)
- # calva (40)
- # circleci (3)
- # clj-kondo (47)
- # cljs-dev (9)
- # clojure (119)
- # clojure-australia (1)
- # clojure-europe (88)
- # clojure-nl (3)
- # clojure-uk (33)
- # code-reviews (64)
- # core-logic (37)
- # cursive (10)
- # datomic (13)
- # emacs (1)
- # fulcro (4)
- # graalvm (1)
- # graphql (5)
- # helix (4)
- # integrant (25)
- # jobs (1)
- # jobs-rus (1)
- # off-topic (3)
- # pathom (12)
- # random (1)
- # re-frame (48)
- # reagent (1)
- # remote-jobs (1)
- # reveal (1)
- # rewrite-clj (4)
- # ring (6)
- # ring-swagger (1)
- # shadow-cljs (21)
- # sql (8)
- # tools-deps (25)
- # vim (15)
- # xtdb (12)
we are working on it, weโll make a tweet ~1 a week to keep you update
Cool ๐ This seems next in the line of joker-lang. But please give a cool name ๐
yea, I think I read a tweet that it produces Dart source code
https://twitter.com/BaptisteDupuch/status/1350397308207292417?s=20 and https://twitter.com/dspiteself/status/1350476892969848833?s=20
Wonder how that will play with REPLs and other dynamic use like "eval" and support for Vars
It depends. When you run in dev mode, you are in the dart vm and you can redef and eval. The compiler can only run in this mode. When you run your cljd code as a native executable you canโt eval or redef.
Is there a way to pretty print transients in the repl, so I see the actual content and not just the type name?
@rob703 I'm realizing that the reason I don't have an answer to this is that I've always taken transients as a hack (14% or so speed increase), so as soon as I need to debug something I stop using them
someone else might have a better answer
might be easiest to call persistent! while debugging - that makes the next transient op blow up, but it prints clearly
(of course you can create a new transient to use in the place of the old one too)
That's what I did for a while but I find it highly annoying when everything blows up while debugging I'd be ok with "copy-transient-and-print-it"
(unless you are bashing in place, which means you are using transients wrong and that's the likely cause of your bug)
(defn debug-transient [t message] (let [p (persistent! t)] {prn message p) (transient p))
- something like that should be safe, it gives you a new transient back to use with the same contents
the only reason you couldn't use that is if you are using the transient but not using the return value of conj! / assoc! etc., which, in this case, is the probably source of your bug
Hm fair enough, if the sort order remains the same that'll be good enough for now. I made sure to use the return value, so that's fine. The real problem is that I needed to translate a really hardcore imperative algorithm into clojure/fp and it's gotten real ugly (who would have thought)
but more generally, I'd be suspicious of using transients for anything complex enough to need debugging - use normal collections then rewrite with transients when the tests pass
if you think transients will help you do an imperative algorithm, you're already on the wrong track
I've chosen them only for speed reasons, instead of an atom... I should have chosen the atom though it seems
the idea that a transient could replace an atom is already an error
they have the same api as normal collections, just different function names
they accidentally let you update in place, but that's not a defined behavior, it's just incidental - they are allowed to do so, and never promise to do so
Yes I found out afterwards and rewritten my code accordingly. But that's the thing. When I want to speed up code that is using an atom right now, I have to rewrite it anyway in order to use transients properly. So I figured I might as well go all in and write my algorithm only with transients. So yah, now I'm here, trying to debug things ๐
@rob703 the thing that's meant to be an atom but faster is volatile!
- but that only works in single threaded code
which means the effective way to use both is to use normal collections and container types first, get your code working, and if it's still too slow swap in a volatile! or transient if it's apropriate
I see, thank you. I'll keep that in mind as a hard earned lesson. I think my main problem was half-assing the translation from the oop/imperative to the clojure version. So I gotta clean that up now
@kwladyka I'm not sure if this question belongs in #clojure - also please don't flood the channel with JSON
Hi! I want to build specs from a sequence of maps. Of course, spec/def
being a macro, I cannot just map over the sequence. I could achieve it by using a macro myself, but I was wondering if it can be done with functions only. There is spec/def-impl
, which is a function, but its docstring discourages its useโฆ any ideas?
(I'll totally take no for an answer.)
(defmacro functionize [macro]
`(fn [& args#] (eval (cons '~macro args#))))
(let [a [true]] (apply (functionize and) a))
=> true
https://stackoverflow.com/questions/9273333/in-clojure-how-to-apply-a-macro-to-a-list has always struck me as the least tortured way to deal with macros, by simply turning them into functions.Hi! Sorry, I only just noticed your message (I'm not that used to navigating slack).
thats actually a great little piece of code, thank you that I will definitely add to my vault! (I'll not be able to use it for my immediate use case since eval
is not available in ClojureScript afaik)
Cheers!
Glad I could offer something. I had forgotten about eval in Clojurescript, and I havenโt used it since the self-hosted compiler project started. So I had to ask duck duck go the state of play, and came across https://gist.github.com/mfikes/66a120e18b75b6f4a3ecd0db8a976d84. I know nothing about the viability of this implementation of eval. But it is a very exciting step in that compilerโs development that it can provide it. But other than enthusiasm I have no direct experience with it. Though functionalizing a macro seems like a good fit for it.
@services yeah, there is no way doing that without a macro, or using the discouraged impl
s/register can be used for this in spec 2
but what I would do (and do all the time), is just write some code to generate the s/def forms, run that code in the repl, and then copy and paste those forms back in to your code
It's a data-oriented Spec replacement, basically, made by metosin who also made spec-tools: https://github.com/metosin/malli
Got a weird question: I am trying to format a request with Cheshire to have a key "\$oid"
, but it only seems possible to get \\$oid
. Is there a way to escape $ solely?
When I actually send the request it still is \\$oid
there is no clojure syntax to escape $
in a string, because it's not special
\
prints as \\
unless you are printing for display
When I actually made the request, the key for the JSON object was still \\$oid
the string that prints normally (with println) as "\\$oid" would print for reading (with prn) as "\\\\$oid"
I guess I am not trying to escape the dollar as I am trying to escape the slash. I need it to be received \$ because in another env I need to escape the dollar.
@grant.isom no clojure string will ever prn as "\" undoubled, and the repl uses prn
@hiredman, @borkdude Thanks to both of you!
1. I'm on ClojureScript, so no eval
for me ๐
2. The Sequence is not static, since it is supposed to be edited by my customer who wants to compile the app on his own and generate different versions (we'll see how that works out).
Altogether this is not super important, since I already have implmented a working macro-solutionโฆ just thought I might simplify it and gain a better understanding of spec
@simongray Malli sure does look like an interesting choice fo my use case. One of my goals is to match an existing Swagger2 Schemaโฆ which apparently Malli schemas can be transformed intoโฆ
Okay found out cheshire was escaping my escapes haha
Thanks @noisesmith and @hiredman!
@simongray, @borkdude Looks like the Malli Readme will be my bed-time reading for tonightโฆthanks!
For the record: what I'm trying to do is to declare the constraints on my data in one place and then impose them on my API-request as well as on the input
fields in my form (e.g. max-length
attributes and field validation)
I haven't used Malli myself, only spec, but it seems like it would fit your use case.
Hi everyone! Is there a guide or some sort best practises when it comes to deploying clojure apps to the cloud ? I'm looking at AWS
and was wondering if there is some sort of step by step guide to the setup including jar/war creation, deployment and monitoring it... maybe even a CI/CD
setup. I've a local docker
based setup for experimentation, but I've not tried a production build/setup as yet. Any pointers in this direction would be appreciated. Thanks in advance ๐
my best results always come from following instructions for java, but using lein
or clj
to build the fat jar instead of maven
this generalizes to google cloud, or desktop apps, etc.
how do you deploy ? Do you use containers or something else ?
this is not for work...just experimenting as I'm doing a cloud certification course and wanted to do a clojure deployment as part of the learning process
that varies based on how devops should work
the simplest thing IMHO is to wrap the java service in a daemon
at a certain point of complexity, using docker or whatever plus a container mainagement infrastructure becomes simpler
I've never seen that happen for a personal project
that's true. I'm loathe to setting up a EC2 instance and then install jdk etc and setting it up as that's a lot maintenance further down
you never need a jdk
i meant jre to run the app
right - but a good clojure app never needs more than the jar itself and a jre
anything else means I'm probably doing it wrong
so what's the lightest setup you would recommend ?
(eg. depending on local resources in a fs when I should be using a service for storage)
the lightest setup is a fat jar, a jre, and a systemd script that starts java
if you want "easy" you can maybe try Heroku. If you want complex (load balancers, Terraform, etc) look at the article I posted in the main channel.
yeah - I really don't like the heroku approach, they use git and lein on the server
@borkdude thank you, will check it out
I'm trying to suggest simple rather than easy or complex
i am looking at simple setup which can be scaled in and out based on workload
I've been deploying personal projects as java -jar uberjar.jar and init scripts (now systemd, I guess)
and have databases etc as managed services separately
yeah, sounds like you want some real infrastructure then - I haven't used terraform in anger but it's definitely meant to do what you want
you could also try datomic cloud. your app will live inside the db (as a managed service) ;)
ah i see .. that's interesting. But for experimentation, i would rather stay out of datomic cloud, as I've heard it's quite expensive and the setup is difficult as well
but thanks for all the tips guys ๐:skin-tone-3:
I haven't seen any mass scale app orchestration that isn't hard to set up and expensive - I think it kind of comes with the domain
@borkdude yeah that's what I want to do as well .. If you could share notes of your setup, that would be nice
sorry, I removed the msg. I said: we are migrating from bare metal Docker swarm to AWS docker swarm
yeah i read that before you deleted it ๐ . thanks for the link you posted. Will go through it
I haven't personally done this migration, so I don't have any notes right now. The reason we are moving away from bare metal has to do with someone leaving our team, so we have no choice
i guess there is always a price for convenience ๐
@noisesmith thanks .. will research terraform and docker options for deployment
another concern is that docker was not designed for security, newer kubernetes addresses this by using an alternative container format with a compatible config
@noisesmith i see. thanks for the tip
also, even with a container, it's still better to run your build tool and package a jar into the container, rather than making a container that runs your build tool on startup
i agree. that makes more sense
@dionysius.almeida This article appeared a while ago: https://circleci.com/blog/deploy-a-clojure-web-application-to-aws-using-terraform/ (since you asked about AWS)