From 2d2a43f200b88627253f2906fbae87cef7c1e8ce Mon Sep 17 00:00:00 2001 From: Franck Cuny Date: Thu, 4 Aug 2016 11:12:37 -0700 Subject: Mass convert all posts from markdown to org. --- posts/2014-02-15-cursive-nrepl-cljs-oh-my.org | 155 ++++++++++++++++++++++++++ 1 file changed, 155 insertions(+) create mode 100644 posts/2014-02-15-cursive-nrepl-cljs-oh-my.org (limited to 'posts/2014-02-15-cursive-nrepl-cljs-oh-my.org') diff --git a/posts/2014-02-15-cursive-nrepl-cljs-oh-my.org b/posts/2014-02-15-cursive-nrepl-cljs-oh-my.org new file mode 100644 index 0000000..74e6f9e --- /dev/null +++ b/posts/2014-02-15-cursive-nrepl-cljs-oh-my.org @@ -0,0 +1,155 @@ +#+BEGIN_QUOTE + This notes are mostly for me to remember how to get an environment up + and running. +#+END_QUOTE + +I've tried to play with +[[https://github.com/clojure/clojurescript][Clojurescript]] a few times +already, but I never managed to get an environment working as I wanted. +Granted, I didn't try very hard, and my requirements are probably not +commons, so I'm not blaming the tools. + +This time I've decided to dedicate a little bit more times and try to +see how far I could go. My requirements are: + +- it needs to work in a linux VM +- I want to have a nREPL connection + + - so I can execute code from the REPL and execute them in the + browser + - I also want to be able to call functions from the browser REPL + +- It needs to work within Emacs and/or Intellij IDEA + +The Intellij IDEA requirement is new. I've never used an IDE before and +I've decided to give it a try. I've installed the +[[http://cursiveclojure.com][Cursive]] plugin for Intellij and so far +I'm happy with it. + +I'm pleased to say that after a few hours I had a completely working +environment meeting all my requirements. I'm pretty sure this notes will +become outdated quickly, so I'll try update this post as I discover more +things. + +** The VM + +I like Vagrant and there's no reason to not use it for this kind of +projects. I've created a +[[https://github.com/franckcuny/devbox][repository]] on GitHub with my +setup for that. It's a simple VM with VirtualBox and Vagrant. I'm using +Ansible to do the provisioning part. + +After cloning the repository, you can run =vagrant up= and a virtual +machine, running Ubuntu 13.10, will be started and provisionned (a bunch +of tools like tmux are installed, but what really interest us here is +the openjdk). Once it's up, a I run =vagrant ssh= then I start a =tmux= +session. + +** Create a project + +I create a project using the +[[https://github.com/magomimmo/cljs-start][cljs-start]] template for +leiningen. To be honest, all the hard work is done by this template, I'm +just putting the pieces together to have the setup I want build around +it. With this template, you get: + +- the ability to start a HTTP server for serving your static files +- a browser-repl from nREPL + +This plugin relies on [[https://github.com/cemerick/austin][Austin]]. + +All I needed to do was to run =lein new cljs-start project= (where +project is the name of my project). + +** The REPL + +Once you've started to work with a REPL it's hard to go back to a +language that don't have one. When working with Clojure, you get used +very quickly to it, especially since nREPL is so nice, and allows you to +work on a remote box. + +The only tricky thing when setting up the VM is to be sure to forward a +few ports for: + +- nREPL - so you can connect from the host to the REPL running on the + guest +- the browser REPL - so your REPL can talk to the browser + +I run the REPL in headless mode on the VM (in my =tmux= session), from +my project's directory: + +#+BEGIN_SRC sh + # specify a port that I will be forwarded from my host to the guest + AUSTIN_DEFAULT_SERVER_PORT=4343 lein repl :headless :host 0.0.0.0 :port 4242 +#+END_SRC + +The =AUSTIN_DEFAULT_SERVER_PORT= variable is the port that will be used +by your REPL to talk to the browser. That's why you need to forward this +port in Vagrant. The other options (*host* and *port*) are here to tell +the repl to listen on all the interfaces (so I can connect from the +host) on the given port. + +** Editor + +#+BEGIN_QUOTE + I'm focusing on Intellij IDEA here, but it works the same with + Emacs/[[https://github.com/clojure-emacs/cider][CIDER]]. +#+END_QUOTE + +To install the Cursive plugin, you need to go to +[[http://cursiveclojure.com/userguide/index.html][this page]] and follow +the instructions. + +I can now open a project in Intellij and start coding. I've configured +my project to use a remote REPL. + +#+CAPTION: remote nrepl + +[[/imgs/remote-nrepl.webp]] +Now I can connect to the remote REPL and do a quick test to see if it +works: + +#+CAPTION: test remote nrepl + +[[/imgs/test-remote-nrepl.webp]] +Great! It's time to start the web server to serve our static files and +see if I can connect the browser-repl to it too. Running the following +code in the REPL should do the trick: + +#+BEGIN_EXAMPLE + (run) ;; will start a server with jetty on port 3000, that I can reach from port 4000 + (browser-repl) ;; that’s the *really* cool part +#+END_EXAMPLE + +If I want to test something, all I have to do is to load the file into +the REPL and then call a function. For example: + +#+BEGIN_EXAMPLE + (.log js/console "Hi from Intellij IDEA!") +#+END_EXAMPLE + +and see the output in my browser's console! + +#+CAPTION: it works! + +[[/imgs/nrepl-it-works.webp]] +When working on the project, I can run evaluate the file or a form and +send it to the browser. Again, this would be the same with Emacs, +instead of having CIDER to use a local nREPL session, you'll just +connect to a remote one. + +** Conclusion + +I realize that it's not the easiest setup. I'm maintaining the build +system we have at work for our sites; we use javascript and nodejs, and +I'm really upset by the complexity of our process. If I had to put with +all of that to build a site I would be pretty mad. Still, I think this +setup can be simplified a lot. But using a VM also makes it easier to +give a working environment to a new developer, and it's easy to throw it +away, after all, I'm using it mostly to run the REPL and to have it +working in an environment similar to what it would be in production. + +I have to admit that so far, I enjoy Cursive, it's stable and it works +well. I'm still learning how to use the IDE, but some features are +usefull (creating the functions, checking the number of parameters, +displaying docstring, etc). We will see how long I stick to it. -- cgit v1.2.3