clojure in the cloud

Post on 02-Jan-2016

47 Views

Category:

Documents

3 Downloads

Preview:

Click to see full reader

DESCRIPTION

Clojure in the Cloud. JavaOne. Sept. 29, 2014 @ 12: 3 0 p m. Everett Toews Developer Advocate @ everett_toews. Intro. Developer. PMC and Committer on Apache jclouds. Intro. Advocate. Intro. Operations. Co-author of The OpenStack Ops Guide. docs.openstack.org /ops. Clojure. - PowerPoint PPT Presentation

TRANSCRIPT

Clojurein the Cloud

Everett Toews

Developer Advocate

@everett_toews

JavaOneSept. 29, 2014 @ 12:30 pm

Intro

Developer

PMC and Committer on Apache jclouds

Intro

Advocate

Intro

Operations

Co-author of The OpenStack Ops Guide

docs.openstack.org/ops

Clojure

Clojure

List

(2 3)

Clojure

Vector

[2 3]

Clojure

Map

{:key1 "value1"

:key2 "value2"}

Clojure

Parens

(fn arg1 arg2)

(sf arg1 arg2)

Clojure

Prefix

(+ 2 3)

; 5

Clojure

Functional

(defn add-7

[x]

(+ x 7))

(add-7 3)

; 10

(map add-7 [2 3])

; (9 10)

Clojure

Types

(add-7 "3"); ClassCastException java.lang.String cannot be cast to java.lang.Number

Clojure

Destructuring

1 (defn print-args

2 [f & rest]

3 (println f)

4 (println

5 (apply sorted-map rest)))

(print-args "first"

:k3 "v3" :k1 "v1"

:k2 "v2")

; first

; {:k1 v1, :k2 v2, :k3 v3}

Clojure

Lambda

(map

(fn [x] (+ x 7))

[2 3])

; (9 10)

Clojure

Macro

(defmacro when

[test & body]

(list 'if test

(cons 'do body)))

(when true (+ 2 3))

; 5

Clojure

lein

lein new app github-comment-clj

lein clean

lein install

lein test

lein run

lein repl

Clojure

REPL

PrintEvalRead

Loop

Cloud

Cloud

SaaS

Cloud

IaaS

Cloud

Resources

Accessible Via

HTTP API

HTTP APIs

HTTP APIs

Documentation

HTTP APIs

Logging

HTTP APIs

Auth

HTTP APIs

Endpoint

HTTP APIs

Environment

HTTP APIs

Connect!

HTTP APIs

Request

HTTP APIs

Response

HTTP APIs

Headers

HTTP APIs

Body

HTTP APIs

JSON

Clojurein theCloud

Conjecture in the Cloud

Clojecture

Conjecture

Clojure in the Cloud

Clojure > Java

Clojure in the Cloud

Domain Modeling

vs

Maps

Example

Example

Surprise!

{"key": "value"}

Map<String, String>

{"key": {BLAH}}

ParseException

Example

Example

Changing Objects

{"obj": "BLAH"}

{"obj": {BLAH}}

{"obj": [BLAH]}

Clojure in the Cloud

Example

Huge Objects

Clojure in the Cloud

Maps

WARNINGDemos Ahead

Clojure in the Cloud

Compile/Run/println

vs

REPL

Clojure in the Cloud

Demo

lein repl

Clojure in the Cloud

pom.xml/mvn/Class

vs

lein try

Clojure in the Cloud

Demo

lein try

Clojure in the Cloud

Works For Me

vs

I Feel Your Pain

Clojure in the Cloud

Demo

lein repl :connect

Use Case

GitHub Twitter

Rackspace

Jenkins

Developer

1.PR2. Webhook

4. Comment

3. Status

5. Save

Talkin’ HTTP

Talkin’ HTTP

HTTP Library

HTTP Library

clj-http

Talkin’ HTTP

Java SDK

Java SDK

Hosebird Client

(hbc)

Talkin’ HTTP

Clojure Bindings for

Java SDK

Clojure Bindings for Java SDK

Apache jclouds

Talkin’ HTTP

Clojure SDK

Clojure SDK

twitter-api

tentacles

twitter-api

twitter-api

:dependencies

1 [org.clojure/clojure "1.4.0"] ;; Clojure

2 [org.clojure/data.json "0.2.1"] ;; JSON

3 [http.async.client "0.5.2"] ;; HTTP

4 [clj-oauth "1.4.0"]] ;; OAuth

twitter-api

Macros

1 (defmacro def-twitter-restful-method

2 [verb resource-path & rest]

3 (let [json-path (str resource-path ".json")

4 dashed-name (...)

5 clean-name (...)

6 fn-name (symbol clean-name)]

7 `(def-twitter-method ~fn-name ~verb ~json-path :api ~*rest-api* :callbacks (get-default-callbacks :sync :single) ~@rest)))

1 (defmacro def-twitter-method

2 [fn-name default-verb resource-path & rest]

3 (let [rest-map (apply sorted-map rest)]

4 `(defn ~fn-name

5 [& {:as args#}]

6 (let [...]

7 (http-request verb# uri# arg-map#))))

1 (def-twitter-restful-method :get "statuses/home_timeline")

2 (statuses-home-timeline :oauth-creds twitter‑creds :params {:count 3})

; {:headers {:content-length "7558", ...}

; :status {:code 200, ...}

; :body

; [{:text "Untappd but for Pho", ...} ...]}

1 (def-twitter-restful-method :post "statuses/update")

2 (statuses-update :oauth-creds twitter‑creds :params {:status ”Hi!"})

; {:headers {:content-length ”1904", ...}

; :status {:code 200, ...}

; :body

; [{:text "Hi!", ...} ...]}

twitter-api

Documentation

twitter-api

Logging

tentacles

tentacles

:dependencies

1 [org.clojure/clojure "1.5.1"] ;; Clojure

2 [org.clojure/data.codec "0.1.0"] ;; Base64

3 [clj-http "0.4.0"] ;; HTTP

4 [cheshire "4.0.0"] ;; JSON

5 [com.cemerick/url "0.0.6"] ;; URLs

6 [environ "0.4.0"] ;; Env

tentacles

Functions

1 (defn api-call

2 [method end-point positional query]

3 (let [query (query-map query)

4 all-pages? (query "all_pages")

5 req (make-request ...)

6 exec-request-one (fn ...(request req))

7 exec-request (fn ...)]

8 (exec-request req)))

1 (issues/create-comment "everett-toews” "github-comment-clj" 6 "Hi!" github-creds)

; {:url "https://...",

; :id 378246,

; :user {:id 9775324, ...}

; :body "Hi!"}

tentacles

Documentation

tentacles

Logging

jclouds

jclouds

:dependencies

1 [org.clojure/clojure "1.3.0"] ;; Clojure

2 [org.clojure/tools.logging "0.2.3"] ;; Log

3 [org.clojure/core.incubator "0.1.0"];; Inc

4 [org.apache.jclouds.labs/

rackspace-cloudfiles-us 1.8.0"] ;; BlobStore

jclouds

Java

Classes/Methods

1 (defn create-container

2 [^BlobStore blobstore container-name &

3 {:keys [location public-read?]}]

4 (let [cco (CreateContainerOptions.)

5 cco (if public-read? ...)]

6 (.createContainerInLocation blobstore location container-name cco)))

1 (defn put-blob

2 [^BlobStore blobstore container-name blob &

3 {:keys [multipart?]}]

4 (let [options (if multipart? ...)]

5 (.putBlob blobstore container-name blob options)))

1 (def my-blob (blob "my-file.log" :payload "my-file-contents"))

; #'blobstore.core/blob

2 (create-container blobstore "my-container")

; true

3 (put-blob blobstore "my-container" my-blob)

; "60e46aeaed758964902dd7ae99858f03"

jclouds

Documentation

jclouds

Logging

Clojurein theCloud

Thank You

Clojure Made Simple

Intro to Apache jclouds

Everett Toews

Developer Advocate

@everett_toews

top related