One () to Rule Them All Aaron Bedra Relevance, Inc. Wednesday, - - PowerPoint PPT Presentation

one to rule them all
SMART_READER_LITE
LIVE PREVIEW

One () to Rule Them All Aaron Bedra Relevance, Inc. Wednesday, - - PowerPoint PPT Presentation

One () to Rule Them All Aaron Bedra Relevance, Inc. Wednesday, November 16, 11 I have a double agenda Wednesday, November 16, 11 But first lets talk about Clojure(Script) Wednesday, November 16, 11 We have this great language with rich


slide-1
SLIDE 1

One () to Rule Them All

Aaron Bedra Relevance, Inc.

Wednesday, November 16, 11

slide-2
SLIDE 2

I have a double agenda

Wednesday, November 16, 11

slide-3
SLIDE 3

But first let’s talk about Clojure(Script)

Wednesday, November 16, 11

slide-4
SLIDE 4

We have this great language with rich data structures

Wednesday, November 16, 11

slide-5
SLIDE 5

It can help us solve lots

  • f problems

Wednesday, November 16, 11

slide-6
SLIDE 6

Web problems are included in the set of all problems...

Wednesday, November 16, 11

slide-7
SLIDE 7

A short aside...

Wednesday, November 16, 11

slide-8
SLIDE 8

Clojure on the Web

8

Wednesday, November 16, 11

slide-9
SLIDE 9

Ring

9

Wednesday, November 16, 11

slide-10
SLIDE 10

{request} -> handler -> {response}

http endpoints are functions

10

Wednesday, November 16, 11

slide-11
SLIDE 11

(defn hello-world [request] (let [{:keys [request-method uri]} request] {:status 200 :headers {} :body (str "hello, " request-method " " uri)}))

basic handler

request keys response keys

11

Wednesday, November 16, 11

slide-12
SLIDE 12

(defn hello-world [request] (let [{:keys [request-method uri]} request] (when (and (= request-method :get) (= uri "/")) {:status 200 :headers {} :body "The index page"})))

return nil to ignore inputs

test for whatever you care about

12

Wednesday, November 16, 11

slide-13
SLIDE 13

Compojure

13

Wednesday, November 16, 11

slide-14
SLIDE 14

(defroutes routes (GET "/" [] "The index page"))

a little macro magic later...

14

Wednesday, November 16, 11

slide-15
SLIDE 15

(ns training.web (:use [ring.adapter.jetty :only (run-jetty)] [compojure.core :only (defroutes GET)])) (defroutes routes (GET "/" [] "<h2>Hello World</h2>")) (run-jetty routes {:port 8080 :join? false})

running embedded

15

Wednesday, November 16, 11

slide-16
SLIDE 16

Middleware

16

Wednesday, November 16, 11

slide-17
SLIDE 17

(defn wrap-cookies [handler] (fn [request] (let [request (if (request :cookies) request (assoc request :cookies (parse-cookies request)))] (-> (handler request) (set-cookies) (dissoc :cookies)))))

middleware

call original handler modify the result

17

Wednesday, November 16, 11

slide-18
SLIDE 18

common ring middleware

with-params with-keyword-params with-cookies with-multipart with-session

18

Wednesday, November 16, 11

slide-19
SLIDE 19

So common that Compojure wraps them for you

19

Wednesday, November 16, 11

slide-20
SLIDE 20

(defn api [routes] (-> routes wrap-keyword-params wrap-nested-params wrap-params))

20

Exposing an API

Wednesday, November 16, 11

slide-21
SLIDE 21

(defn site [routes & [opts]] (-> (api routes) (with-opts wrap-multipart-params (:multipart opts)) (with-opts wrap-session (:session opts))))

21

Exposing a Site

Wednesday, November 16, 11

slide-22
SLIDE 22

html (hiccup)

22

Wednesday, November 16, 11

slide-23
SLIDE 23

(html [:h1 "hi"])

  • > "<h1>hi</h1>"

html elements

clojure vector

23

Wednesday, November 16, 11

slide-24
SLIDE 24

(html [:a {:href "http://clojure.org"} "Clojure"])

<a href="http://clojure.org">Clojure</a>

html attributes

clojure map

24

Wednesday, November 16, 11

slide-25
SLIDE 25

(html [:h1#title.main "hi"]) <h1 class="main" id="title">hi</h1>

id, class shortcuts

id follows # class follows .

25

Wednesday, November 16, 11

slide-26
SLIDE 26

(defn home [] (layout/home [:ul (map (fn [lab] [:li (make-url lab)]) all)])) (defroutes lab-routes (GET "/" [] (home)))

simple composition

mix clojure literals... ...with fncalls

26

and call them from routes

Wednesday, November 16, 11

slide-27
SLIDE 27

(defroutes lab-routes (GET "/" [] (home)) (GET "/labs/:name" [name] (render-lab name)) (route/files "/") (route/not-found "<h1>Not Found</h1>")) (def application (-> lab-routes handlers/with-logging))

composable routing

simple function wrapping compose routes

27

Wednesday, November 16, 11

slide-28
SLIDE 28

implementation comparison

28

feature clojure impl

  • o impl

endpoint function interfaces, classes request map interfaces, classes response map interfaces, classes cookies map interfaces, classes session map interfaces, classes routing functions, macros interfaces, classes, config, XML middleware functions, macros interfaces, classes, config, XML, AOP

Wednesday, November 16, 11

slide-29
SLIDE 29

(deftest render-the-labs [] (doseq [lab all] (let [url (lab-url lab) resp (application {:request-method :get :uri url})] (is (= {:status 200 :headers {"Content-Type" "text/html; charset=utf-8"}} (select-keys resp [:status :headers]))))))

fns are easy to test!

29

Wednesday, November 16, 11

slide-30
SLIDE 30

It turns out there’s actually a lot of ways to solve problems on the web

Wednesday, November 16, 11

slide-31
SLIDE 31

Except we are a little light in one area

Wednesday, November 16, 11

slide-32
SLIDE 32

We are all hopelessly polyglot except when it comes to client side browser code

Wednesday, November 16, 11

slide-33
SLIDE 33

No matter what we use for our backends we all unify on JavaScript*

Wednesday, November 16, 11

slide-34
SLIDE 34

Why?

Wednesday, November 16, 11

slide-35
SLIDE 35

Clojure rocks, JavaScript reaches

Wednesday, November 16, 11

slide-36
SLIDE 36

So we took Clojure on the road

Wednesday, November 16, 11

slide-37
SLIDE 37

Yep, CoffeeScript already did it

Wednesday, November 16, 11

slide-38
SLIDE 38

But there’s so much more

Wednesday, November 16, 11

slide-39
SLIDE 39

ClojureScript has a full Clojure reader

Wednesday, November 16, 11

slide-40
SLIDE 40

Clojure data is much more powerful than JSON or XML

Wednesday, November 16, 11

slide-41
SLIDE 41

With ClojureScript you can adopt Clojure data as your wire protocol

Wednesday, November 16, 11

slide-42
SLIDE 42

And there’s a hidden gem

Wednesday, November 16, 11

slide-43
SLIDE 43

Closure

Wednesday, November 16, 11

slide-44
SLIDE 44

????

Wednesday, November 16, 11

slide-45
SLIDE 45

ClojureScript works with Closure’s advanced compiler

Wednesday, November 16, 11

slide-46
SLIDE 46

But wait, there’s more!

Wednesday, November 16, 11

slide-47
SLIDE 47

Browser connected REPL

Wednesday, November 16, 11

slide-48
SLIDE 48

DEMO

Wednesday, November 16, 11

slide-49
SLIDE 49

Questions?

Wednesday, November 16, 11

slide-50
SLIDE 50

Additional information

  • aaron@clojure.com
  • @abedra
  • thinkrelevance.com

Wednesday, November 16, 11