I have, but can't really help you... Forgot about it and I'm not on a windows anymore. However I've heard that wsl2 finally got a gui update, this means vcxsrv shouldn't be needed anymore. More info here: https://github.com/microsoft/wslg https://www.google.com/amp/s/www.techrepublic.com/google-amp/article/linux-on-windows-this-new-upgrade-allows-you-to-run-graphical-apps-simply-and-effectively/
Wow. After hours of combing through info on what X11 is and how to get VcXsrv working. LOl
Thanks!
When I try to run the Quick Start Guide hello world program on the ClojureScript website, though, I get the following error:
`clj --main cljs.main --compile hello-world.core --repl WARNING: When invoking clojure.main, use -M Failed to launch a browser: No X11 DISPLAY variable was set, but this program performed an operation which requires it. You can instead launch a non-browser REPL (Node or Nashorn). You can disable automatic browser launch with this REPL option :launch-browser false and you can specify the listen IP address with this REPL option :host "127.0.0.1" Waiting for browser to connect to http://localhost:9000 ... ClojureScript 1.10.758`
clj --main cljs.main --compile hello-world.core --repl
WARNING: When invoking clojure.main, use -M
Failed to launch a browser:
No X11 DISPLAY variable was set, but this program performed an operation which requires it.
You can instead launch a non-browser REPL (Node or Nashorn).
You can disable automatic browser launch with this REPL option
:launch-browser false
and you can specify the listen IP address with this REPL option
:host "127.0.0.1"
Waiting for browser to connect to <http://localhost:9000> ...
ClojureScript 1.10.758
...and actually, after completing set-up of VcXsrv, I'm getting the exact same error...as if I wasted the last few hours. π
Just need to find out about this X11 DISPLAY variable I guess...or find some way to force WSL2 to use the newfangled feature you mentioned, @dromar56
...or is there a chance the Ubuntu 20.04 that goes into WSL2 doesn't even have any graphical browser (or any browser), and that's yet another thing I have to install?
OK, so I think I've set my DISPLAY variable correctly, and now I get a different error upon running
clj --main cljs.main --compile hello-world.core --repl
error:
Failed to launch a browser: The BROWSE action is not supported on the current platform!
@dromar56 That is only available in Insider builds of Windows right now (that's what I'm running). @factorhengineering and I already had this exact discussion yesterday (or the day before).
Unfortunately, since I updated to the latest WSL2 with Wayland/X11 support builtin, I've forgotten what I used to have DISPLAY set to (you need it on the standard WSL2 setup, but not on the new Wayland version).
Sounds like you've figured it out @factorhengineering -- now you need a browser installed on Liinux.
Was it DISPLAY=:1
in the end?
I think you should be able to sudo apt install google-chrome
or something like that. That's the browser I have installed on WSL2/Ubuntu and it's what starts up automatically when I run a ClojureScript setup...
DISPLAY got set to an IP address with a trailing :0
Ah, :0
β¦ canβt remember why I thought :1
. Anyways, glad you have that bit working. google-chrome
next, eh?
Well...it's not working.
Or...you're saying the Ubuntu really didn't ship with a single browser on it?
...and just installing one will resolve this?
@seancorfield Will I installed Chrome, and YIKES. Tons of errors when trying to run it (`google-chrome`):
libGL error: No matching fbConfigs or visuals found libGL error: failed to load driver: swrast
...and many more errors, like 'Failed to connect to the bus [...], and 'Exiting GPU process due to errors [...]', and 'Passthrough is not supported'. Sigh.
I did talk to a few people in an Ubuntu chatroom, and they advised against running a Linux browser for this purpose, and said it should be possible to instead get the WSL2-Ubuntu-based program to talk to a Windows browser. (Their main argument was speed, which I don't care much about at this point, but if it would just work...) None of them were ClojureScript devs, though. What do you think?
O...M...G... Even with all those errors, the browser actually did run (under VcXsrv). I was just not noticing a tiny Chrome pop-up that demanded I decide whether to make Chrome my default browser and whether to send crash and usage reports to Google before, you know, actually launching the browser.
It completely freezes the CLI, though. And if I [Ctrl]+[c] to get the CLI back, the browser window disappears.
I just opened a 2nd Ubuntu CLI. Good enough I guess?
Sorry for the wall of text, but I just want to explain what just happened when I finally got my ClojureScript Quick Start guide program working under WSL2. --- tl;dr The question is: Should I develop CLJS using a Linux-side brower in a VcXsrv X11 window, or in a Windows browser? ---
A crazy (to me at least) thing happened while trying to get my CLJS Quick Start Guide hello world program working on WSL2. When I finally ran my tiny hello-world test program and pointed the Linux browser at localhost:9000, it showed what it was supposed to show (Yay!)....but then this, Windows browser (the one I talking to you in) got hijacked and automatically opened a new tab to localhost:9000 (also with the correct output)!!
When I put a JS alert in the REPL, the alert only pops up in the Linux browser, not the Windows one. Still, though. Utterly surprised it reached out and touched the Windows browser at all. I thought WSL2 (specifically, not the case in WSL1 AFAIK) OS instances were built as if on a separate network/IP. I did not expect localhost:9000 alone to work for the Windows browser side. I was actively deciding to not bother trying to get that working since I had been given advice to just do it all on the WSL2-Linux side. Stranger still is what happened later... The Windows browser I mentioned above is Firefox. The Linux one is Chrome. I just brought a Windows Chrome browser into the mix, and tried pointing that one at localhost:9000 and it works perfectly, displaying the correct page (like the Windows Firefox) but also responding with the JS alerts I put through (unlike the Windows Firefox, but like the Linux Chrome). ...but only one of the Chrome browsers will generate the JS alert, and after some testing it just appears to be whichever browser I more recently hit [F5] (refresh) on!
So...I wasn't trying to get a Windows browser to work for this, and expected that would take some network-fu and was going down the road to getting a Linux browser to work, but...is there any reason I should use the Windows browser instead since it was kind of just dropped into my lap as a possible alternative?
Right. When you start up cljs, google-chrome
should launch from WSL2 automatically.
And yes, if you start a program from the command-line, itβs going to βfreeze the CLIβ unless you add &
at the end of the command to run it in the background.
I have to say that I have not seen any Windows browser respond to ClojureScript running inside WSL2.
Right? I was floored.
OK, thanks! I think I'll just let it freeze that CLI and open a new one. I guess I'd like to keep things as visible as possible. I still can't believe all those errors are normal/fine/ignorable, but I guess I'll move on to my next challenge.
Similar question: Windows Emacs or WSL2 Linux (Ubuntu) Emacs? (either one acting upon program source code files in the WSL2) I went through the process of setting up Doom Emacs on the WSL2 Ubuntu 20.04, but I just realized I could probably simply use my existing Windows Doom Emacs installation to act on the files in the WSL2 file system (in \\wsl$\Ubuntu-20.04 ).
For me, Emacs in WSL2 works much better. If you are facing some issues with the setup, maybe I can help.
I highly recommend Emacs on WSL2 than Emacs on Windows.
The Windows Emacs will be slower on WSL2 files and similarly Emacs on WSL2 will be slower when editing files on the Windows filesystem. So, stick to editing files that are local to that Emacs.
I did not expect to have options for either thing (input (source code editing) or output (browser))!
So I guess now that I have a browser working, I should move on to installing figwheel-main on the WSL2 Ubuntu 20.04?
Or...according to the CLJS Quick Start Guide I might need Node.js? I can't remember if, when I did my tiny webapp under Windows ages ago, I did anything with Node. How important is it? Can I just skip it and move on with installing Figwheel-Main, figuring out CIDER, and figuring out more about deps.edn (and maybe tools.deps IIRC)?
(https://clojurescript.org/guides/quick-start#running-clojurescript-on-node.js)
I skipped node and used Figwheel. I think if you use Shadow-cljs you kind of have to embrace node and its package manager (you can use Shadow without node, so I'm told, but it's not "normal"). I can't offer an opinion on Emacs/CIDER because I haven't used it for years.
Hi all. What is a good way to go about building mobile apps using Clojure (or Clojurescript)? Most of the examples focus on Cljs + ReactNative but I also see that re-natal
hasnβt been updated in quite sometime (and is supposedly fallen behind ReactNative APIs?).
"GitHub - vouch-opensource/krell: Simple ClojureScript React Native Tooling" https://github.com/vouch-opensource/krell
Thanks. Will look into this!
What would be the best way to parse this string -XX:+UseG1GC
to 2 tokens: xx
and +UseG1GC
? first token between -
and :
and second is what is left after :
.
I think there might be a function that does exactly that.
regex or some parser combinator library, https://github.com/blancas/kern for example
If -
is always going to be the first character, clojure.string/split might also be more than enough (for a quick and dirty solution):
(clojure.string/split (subs "-XX:+UseG1GC" 1) #":")
=> ["XX" "+UseG1GC"]
(clojure.string/split (subs "-XX:+UseG1GC:lala" 1) #":")
=> ["XX" "+UseG1GC" "lala"]
you can even set a limit
(clojure.string/split (subs "-XX:+UseG1GC:alala" 1) #":" 2)
=> ["XX" "+UseG1GC:alala"]
Just curious: why are you doing that? π
I just need to show these parameters in UI. As we can restart the whole app with different JVM start up parameters if needed
Is there a way to have Clojure automatically run the latest version of my code? So that whenever I save a file, the code in that file updates whatever is running?
there are tools that help with that, eg. tools.namespace/refresh or the ring refresh wrap-reload plugin, but nothing universally adopted
if you're talking about a web server there is also the wrap-reload middleware
there are certain constructs like defmulti and defprotocol that break in weird ways if you just blindly reload on file write
thanks - I was thinking of that but forgot the name
that's the "ring refresh" I was thinking of
that's true, certain things get a little kinky with reloading, like if you change a route definition or add a route, i find that sometimes i need to restart the server... but usually it works great if there is no clash
in clojurescript land shadow-cljs and figwheel will both "hot-reload" code ... a very useful feature for cljs development
right - and for any given construct there's a right way to reload that doesn't break things, but just reloading every file in the order saved is never it
Will have to look into those, thanks!
there are also more heavy handed things in the design domain, like stuartsierra/component or weavejester/integrant which are designed to make apps that always reload correclty (though usually they require you to explicitly reload and don't rely on file change on disk)
these definitely have advantages beyond reloadability (like making testing easier, and making it easier to impose a larger scale design of a program)
Yes, I really like the look of integrant, but haven't tried it yet. Mount is the one used in luminus so I just went with it :)
OK, well mount also has facilities for reload - if you set up your tool to run (mount/stop)
, then reload your namespaces, then (mount/start)
, that should take care of everything (as long as you use mount correctly)
I don't like mount because instead of resolving things like dependency cycles via data, it cuts the gordian knot and uses globals
more detail about reloading with mount here: https://github.com/tolitius/mount#the-importance-of-being-reloadable
using tools.namespace which I mentioned above
and depending on where you are in your journey, asking for things like this could mean that you are missing the benefits of repl driven development. Clojure is kinda designed to have things always up-to-date with a primitive of eval
. Re-evaling forms will "update" a live system as you go. Getting used to how the repl works can often make this desire for reload-on-save go away
But surely just saving is even less work than sending stuff to the REPL? But you are correct, I am not good with REPL-driven development.
kinda. the way many of these things work is that on save, they will look for other namespaces that depend on the saved namespace and refresh all of them by sending all the forms to the repl. So in one sense saving a file is less work, but you want to trigger a lot of work based on saving the file.
the act of saving is less work, the things you need to do to verify the state of the code or experiment with the data in context is significantly harder outside a repl based flow - to the degree that many devs don't even end up doing it or replace it with nearly acceptable alternatives like tests or printlns
it's just that once you are using the repl to best advantage, the whole reloading files thing becomes much less important
I will have to learn it then π Wish I still had my purelyfunctional subscription, they had a course on REPL-driven development :thumbsup:
(and this isn't to say that repl replaces testing, just that people will use tests for the kind of exploritory thing you can do in a repl - which is possible but much more work)
this is pretty great: https://clojure.org/guides/repl/introduction
actually my one beef with repl driven dev is that it can lead to workflows where people are tempted to skip writing good tests (because hey I verified it worked in the repl right?)
you took a good stab at that didn't you?
creating tests from a repl session?
which isn't a problem with rdd itself, just a growing pain of adopting the repl
@dpsutton I had some ideas but nothing I'd suggest for mainstream use (maybe with more thought and design, eventually...)
I did make a tool that dumps data from an app or repl in a way that can easily be re-inflated from a test, yeah https://github.com/noisesmith/poirot
this is my major problem with common lisp (and the CL eco-system). the existing test libraries aren't great and most libraries don't include more than perfunctory tests because of the heavy reliance on developing in the repl
yeah, it could be framed as a moral hazard, to borrow a concept from economics
(I do have beef with how moral hazard is applied to policy - funny how moral hazards that benefit the poor are never acceptable, and ones that benefit the rich are never articulated...)
hi. i need to send some http requests. which http client do you recommend? clj-http, http-kit, aleph, other?
i've been really happy with http-kit.
have you tried any alternative? any specific reason? or was it just the first option you tried that worked fine
thanks also
i forgot to mention i'm mostly interested in making async http calls
it's the one in use when i joined my current project and have stuck with it when doing other things since
@danie The write-up on the git page for krell says shadow-cljs can be used for react native, but I don't see anything to that effect on the git page for (or other things I've read about) shadow-cljs. Do you happen to know how much shadow-cljs actually helps with mobile? (I realize you're not recommending it, though. Ha ha.)
Is there any way I can see the request body sent by http kit?
both options worked perfect, thanks π
thereβs a number of different ways to work with the request body. :as text
is probably the most straightforward, but it depends on your use case
Sorry, I'm not sure if I made it clear. I want to see the body that I'm sending
to make sure it's formatted correctly
the way I would do that is with netcat, nc
In terminal
nc -l 1234 > request.body
Then send a request to "http://localhost:1234/myreq"that will write the request body to the file named request.body
FWIW babashka also comes with httpkit, both client and server. It's a quick way to test it out if you're interested in trying the lib.
A quick way to see both the request body and response is to launch the server and fire a request at it with the client:
$ bb -e '(org.httpkit.server/run-server (fn [r] (clojure.pprint/pprint r))) @(org.httpkit.client/get "<http://localhost:8090>")'
\cc @ggfpc12495https://clojurians.slack.com/archives/C053AK3F9/p1620075593013200
Super groovy cartoon movie
How one uses https://cljdoc.org/d/clojure-interop/cljs-web-api/1.0.0/api/speech.SpeechSynthesis#speaking this in cljs?
I did this https://gist.github.com/gs/724901095173add6284e1c0ab712b9ae but probably there is a better cljs way
Iβve put this on heroku to test https://frozen-oasis-40568.herokuapp.com/
Is there anything like dynamic-wind
in clojure(script)? (Where code will run, even if the scope is left via an exception.)
Alternatively, is there anything like reset!
, but only inside of a lexical scope?
Something besides try
/ catch
you mean?
Yes, because I don't want to intercept any exceptions, just reset an atom on the way out.
I think dynamic wind is more like try / finally(?)
it's not about catching, but rather ensuring your finally block always runs, regardless of code path / errors, right?
Close, it's more like try/catch(e)->rethrow-e/finally
I think noisesmith might be right that try
with no catch
, only a finally
, will propagate the exception, but still run your finally
code on the way out.
cljs.user=> (try (throw (js/Error.)) (finally (print "OK")))
OK
Execution error (Error) at (<cljs repl>:1).
looks like a start at leastunless a try/finally block doesn't intercept exceptions?
throw followed by finally seems odd
a throw is saying your code block is done for good
Oh yes, you're right, that works.
Thanks
right, without catch the exception does what it would have otherwise, it's just that your finally clause runs too
Cool, thanks. π
try/finally is how locking ensures correctness in clj for example (no need for this in cljs with no threading)
also thread bindings are managed this way to ensure they are unwinded after the binding expression, there are more examples of this, probably with-open too
Makes sense, thanks. π
Hey does anyone have experience with https://github.com/binaryage/chromex? I am having trouble extending the js/clojure marshalling system and could use some help! How do I go about extending the gen-marshalling
config?