Clojure: Minimal ClojureScript Two Person Chat - clojure

EDIT 01
Sounds like web sockets is what I want.
Technical Background:
I am familiar Clojure + ring + composure.
I am starting to learn ClojureScript. (Have lein-cljsbuild setup; have also spent time installing ClojureScript "manually" just to see how it works.) Have the basic (alert (greeting "ClojureScript")) demo working.
What I want to create:
I want to create a basic two person Notepad (i.e. Instant Messenger, or two-person IRC channel). I want there to be a Clojure Server. When a client connects it shows it a text bok; the user types in some words, the clojure updates to the other user.
Question
I need some help getting started on this. Google Closure is a big library, I would like to understand things like:
(1) how do I setup a basic connection to get my cljs code and my clj code to send each other data
(2) once my cljs code received new data, how do I get it do update the DOM?
I think these are the two main things -- and if I had this, it would provide a framework for understanding the rest of clojurescript.
Thanks!

I wrote an example app that does this using clojurescript, ring, and websockets via a Webbit server:
https://github.com/aiba/clojurescript-chat-example
Hope this helps!

You (I) probably want WebSockets.
More to be updated (if I produce actual working code.)

Related

LSP server example

I have a project in which I need to write an LSP server in OCaml for a developing language.
So I did a lot of research on this but I'm having a bit of a hard time getting through it.
The Microsoft tutorial https://microsoft.github.io/language-server-protocol/specification speaks sometimes on the server side, sometimes on the client side, sometimes JSON RPC through which requests and notifications must pass between the client and the server, and all of that mixed up, plus TypeScript and not OCaml, what I want to use as a language confuses me a bit, I feel like I don't understand anything.
So I turned to code. I saw a lot of code like the one from https://github.com/facebook/flow/tree/master/src/lsp, the one from https://github.com/ocaml/ocaml-lsp but I don't understand really the code, there are a lot of files with a lot of lines, I don't know what does what.
Can you show me an example of how to initiate connection with the first initiate request, send notification in OCaml. I will use Emacs as client but I know how to do that when the server is ready. I think a little example will help me do the rest.

test output of clojure functions visually in a browser

I'm developing a Clojure application, which downloads images from the web and analyzes them for certain criteria.
Whatever this might mean, the important part is, that there will be some quite expensive functions in the app, which take a while until they are processed.
In the end, there will be an API that exposes the app's functionality to a web frontend. This is meant to be a second step though.
Since the app has a lot to do with graphics, it makes sense to visualize the outputs of the functions I'm writing during the development process.
Basically I'm looking for an easy way / environment to archive this.
More precisely: Whenever I created a new function, I want to test it's functionality inside a browser: E.g. plot the output, draw some intermediate steps, maybe create some small interactive scripts, that help me to supervise that the algorithms are doing what I intend to. Note: I don't want to to transform the functions to ClojureScript and let them run in the browser, the browser should be just a "display".
Some approaches that came to my mind:
Writing a little backend-server that exposes all the functions of a namespace. So the front-end could access all these functions simply by sending an ajax request to the server, that includes the function and it's parameters in a string, or maybe better in edn format. The back-end receives the request, calls the requested function and sends back the result whenever the calculation is done. Is there maybe already a project, that does exactly this?
Using a project like "Gorilla Repl" This would be a good option, and maybe I'm going to use it. However, I could not yet figure out if it's mechanism covers a way to interactively influence the rendered outputs. It rather works as a worksheet with static renderings.
How would you guys do this? Any suggestions are appreciated.
I have been working on similar problems and I think that you could use the combination of Lighttable + Clojure + Nerdy-painter (plugin).
Nerdy-painter allows you to display images on Lighttable (IDE). Very useful for data exploration or anything that has to do with graphics/plots.
Disclaimer: I am the author of nerdy-painter, still I think the fastest/elegant solution is the one I described above. All other solutions add (IMHO) too much overhead to the development cycle.
A possibility is to use a Jupyter's clojure kernel to interact with clojure. Jupyter runs in a browser and you can add custom binding to simplify access to the DOM.
Here's a clojure kernel: https://github.com/roryk/clojupyter

Hello World - Clojurescript

Beginner here.
Can I compile an existing Clojure script to run it on the web using ClojureScript?
Let's say that I have a script that prints Hello world in my terminal, and I want to print that text on the browser. Should I rewrite a whole script with ClojureScript syntax, or should I just compile it using another compiler?
(ns clojure-hello-world.core
(:gen-class))
(defn -main [& args]
(println "Hello World"))
(Long answer :P)
Even though Clojure and ClojureScript share a good amount of features, there are some that are specific to one or the other. For example there are no real classes in JavaScript so the :gen-class specification in the ns form doesn't make much sense.
One important fact is that the syntax of both Clojure and ClojureScript is exactly the same, differences have to do mostly with the host VM in which they run (Java VM in the case of Clojure and JavaScript VM in the case of ClojureScript).
There is a list of the differences between the two Clojure implementations here.
There's also a tool called cljx to "write a portable codebase targeting Clojure/ClojureScript". Recently there has been some discussion on the Clojure Dev group around finally implementing feature expressions which would on one hand deprecate the use of cljx but on the other complicate the work that tools have to do to extract information from Clojure source files.
I would start with lein-cljsbuild to get started. This will get you going with a nice edit eval and look at browser loop. It's well worth getting this setup first because it makes learning ClojureScript much more fun. I promise it's worth the hassle. If you need more interactive support the folks in #clojure on freenode are very kind and helpful.
Basically, the Browser executes JavaScript. You compile your ClojureScript code to JavaScript. The Browser loads your JavaScript via an HTML page. So, you have to create an HTML Page and point your Browser at it.
The simplest way I got started was to use Luminous (http://www.luminusweb.net/docs/clojurescript.md).
However, Chestnut (https://github.com/plexus/chestnut) looks promising.

Clojure, Closure, WebSocket, Online Chat Demo

Context
I've been using Clojure for 4+ years. I recently setup Ring + Compojure, and have a good understanding of how they work. I also have a deep understanding of SVG.
Now, I'm aware of things like ClojureScriptOne, the Google Closure Library, and various online demos setting up Clojure + JQuery + WebSocket.
Question:
Can anyone provide a minimal demo for setting up:
* WebSocket in ClojureScript with the google Closure Library?
* Perferably with something involving a basic 2 person chat.
Now, I've looked into the Google Closure book. Unfortunately, when the book was released, it focused mainly on pull mechanisms (AJAX), and its only suggestion for push based mechanism was a long-living ajax session (via things like Comet). Apparently WebSockets were not mature or something at the time.
Thanks!
There's such an example for Aleph
The only thing you need to do wrt Closure's WebSocket object, is change the constructor for the wrapped socket to whatever Firefox's websocket is for Firefox (can't remember what it is, but it's not WebSocket), or at least that's what you used to have to do, but it works with Chrome anyway. Websockets work with Chrome, Firefox, Opera but not IE but you can use a lib that fixes things to use Flash if IE is that important
Have a look at httpkit websocket support

Any way to display C++ on a webpage?

Is there a relatively easy way to display the output of a C++ program on a webpage? And I don't mean manually, in other words, you see it on a webpage as it runs not as in I make a code tag and write it in myself.
EDIT: Just so everybody can get this clear I am going to post this up here. I am NOT trying to make a webpage in C++. Please excuse me if this sounds spiteful or anything but I am getting a lot of answers relating to that.
Step one, get yourself a server-side language. Be that PHP, ASP, Python, Ruby, whatever. Get it set up so you can serve it.
Step two, find your language's exec equivalent. Practically all of them have them. It'll let you run a command as if it were from the command line, usually with arguments and capture the output. Here's PHP's:
http://php.net/manual/en/function.exec.php
Of course, if you're passing user-input as arguments, sanitise!
I've just seen that you accepted Scott's answer. I usually wouldn't chase up a SO thread so persistently but I fear you're about to make a mistake that you'll come to regret down the line. Giving direct access to your program and its own built-in server is a terrible idea for two reasons:
You waste a day implementing this built-in server and then getting it to persist and testing it
More importantly, you've just opened up another attack vector into your server. When it comes to security, keep it simple.
You're far better having your C++ app running behind another (mature) server side language as all the work is done for you and it can filter the input to keep things safe.
You could write a CGI app in C++, or you could use an existing web server language to execute the command and send the output to the client.
You want to use Witty.
Wt (pronounced 'witty') is a C++
library for developing interactive web
applications.
The API is widget-centric and similar
to desktop GUI APIs. To the developer,
it offers complete abstraction of any
web-specific implementation details,
including event handling, graphics
support, graceful degradation (or
progressive enhancement), and pretty
URLs.
Unlike many page-based frameworks, Wt
was designed for creating stateful
applications that are at the same time
highly interactive (leveraging
techinques such as AJAX to their
fullest) and accessible (supporting
plain HTML browsers), using automatic
graceful degradation or progressive
enhancement.
The library comes with an application
server that acts as a stand-alone web
server or integrates through FastCGI
with other web servers.
I am not sure this is what you are looking for but you may want CGI You may want to look at this SO question, C++ may not be the best language for what you want to do.
based off the questions you posted Writing a web app like what you want is no simple task. What I would recommend is use some other library (this is one i found with a quick google) to get a web console on your server and give the user it is running under execute deny permissions on every folder except the folder you have your app installed.
This is still is a risky method if you don't set up the security correctly but it is the easiest solution without digging around too much on existing libraries to just have the application interactive.
EDIT --
The "Best" solution is learn AJAX and have your program post its own pages with it but like I said, it will not be easy.
It sounds like you want something like a telnet session embedded in a webpage. A quick google turns up many Java telnet apps, though I'm not qualified to evaluate which would be most ideal to embed in html.
You would set up the login script on the host machine to run your c++ app and the user would interact with it through the shell window. Note though that this will only work for pure command line apps. If you want to use a GUI app in this way, then you should look into remote desktop software or VNC.
It may be worth looking into Adobe's "Alchemy" project on Adobe Labs
This may help you with what you're trying to achieve.
:)
Are you looking for something like what codepad.org does? I believe they explain how they did it here.
There is a library called C++ Server Pages - Poco. I used it for one of my college project, its pretty good. There is also good documentation to get started with, u can find it here http://pocoproject.org/docs/