Download - Clojure/West 2013 in 30 mins
![Page 1: Clojure/West 2013 in 30 mins](https://reader033.vdocument.in/reader033/viewer/2022042813/54ba79874a795938568b465b/html5/thumbnails/1.jpg)
Leonardo Borges@leonardo_borgeshttp://www.leonardoborges.comhttp://www.thoughtworks.com
Clojure/West 2013 in 10-ish mins
Saturday, 30 March 13
![Page 2: Clojure/West 2013 in 30 mins](https://reader033.vdocument.in/reader033/viewer/2022042813/54ba79874a795938568b465b/html5/thumbnails/2.jpg)
Day 1
Saturday, 30 March 13
![Page 3: Clojure/West 2013 in 30 mins](https://reader033.vdocument.in/reader033/viewer/2022042813/54ba79874a795938568b465b/html5/thumbnails/3.jpg)
DDD in Clojure - Amit Rathore @amitrathore
Saturday, 30 March 13
![Page 4: Clojure/West 2013 in 30 mins](https://reader033.vdocument.in/reader033/viewer/2022042813/54ba79874a795938568b465b/html5/thumbnails/4.jpg)
DDD in Clojure - Amit Rathore @amitrathore
OO can still teach us a thing or two
Saturday, 30 March 13
![Page 5: Clojure/West 2013 in 30 mins](https://reader033.vdocument.in/reader033/viewer/2022042813/54ba79874a795938568b465b/html5/thumbnails/5.jpg)
DDD in Clojure - Amit Rathore @amitrathore
In OO:- nouns- processes owned by nouns- nouns are classes- processes are methods
Saturday, 30 March 13
![Page 6: Clojure/West 2013 in 30 mins](https://reader033.vdocument.in/reader033/viewer/2022042813/54ba79874a795938568b465b/html5/thumbnails/6.jpg)
DDD in Clojure - Amit Rathore @amitrathore
In OO:- nouns- processes owned by nouns- nouns are classes- processes are methods
In Clojure:- verbs- domain model: functions that transform data
Saturday, 30 March 13
![Page 7: Clojure/West 2013 in 30 mins](https://reader033.vdocument.in/reader033/viewer/2022042813/54ba79874a795938568b465b/html5/thumbnails/7.jpg)
DDD in Clojure - Amit Rathore @amitrathore
A few general guidelines for your domain:- no side-effects- no dependencies on external services- validate outside the model boundary (validateur, bouncer, clj-scheme)- no illegal state in domain functions (slingshot)
Saturday, 30 March 13
![Page 8: Clojure/West 2013 in 30 mins](https://reader033.vdocument.in/reader033/viewer/2022042813/54ba79874a795938568b465b/html5/thumbnails/8.jpg)
DDD in Clojure - Amit Rathore @amitrathore
Namespace organisation at Zolo:
- main namespace called core (most projects do this)- zolo.models.(user | contacts | …)- zolo.gateway.(facebook | linkedin | twitter | …)- zolo.utils.(calendar | strings | maps | …)- zolo.api.*- zolo.services.(user-service | …)
Saturday, 30 March 13
![Page 9: Clojure/West 2013 in 30 mins](https://reader033.vdocument.in/reader033/viewer/2022042813/54ba79874a795938568b465b/html5/thumbnails/9.jpg)
DDD in Clojure - Amit Rathore @amitrathore
When you have no idea:
- zolo.homeless.*
Saturday, 30 March 13
![Page 10: Clojure/West 2013 in 30 mins](https://reader033.vdocument.in/reader033/viewer/2022042813/54ba79874a795938568b465b/html5/thumbnails/10.jpg)
DDD in Clojure - Amit Rathore @amitrathore
Still relevant:
- SOLID principles- Few public fns (lots of private, helper fns)- small fns (3-4 lines)- optimize for readability
Saturday, 30 March 13
![Page 11: Clojure/West 2013 in 30 mins](https://reader033.vdocument.in/reader033/viewer/2022042813/54ba79874a795938568b465b/html5/thumbnails/11.jpg)
RESTful Clojure - Siva Jagadeesan
Saturday, 30 March 13
![Page 12: Clojure/West 2013 in 30 mins](https://reader033.vdocument.in/reader033/viewer/2022042813/54ba79874a795938568b465b/html5/thumbnails/12.jpg)
RESTful Clojure - Siva Jagadeesan
Richardson Maturity Model
Saturday, 30 March 13
![Page 13: Clojure/West 2013 in 30 mins](https://reader033.vdocument.in/reader033/viewer/2022042813/54ba79874a795938568b465b/html5/thumbnails/13.jpg)
RESTful Clojure - Siva Jagadeesan
Richardson Maturity Model
?Saturday, 30 March 13
![Page 14: Clojure/West 2013 in 30 mins](https://reader033.vdocument.in/reader033/viewer/2022042813/54ba79874a795938568b465b/html5/thumbnails/14.jpg)
RESTful Clojure - Siva Jagadeesan
Richardson Maturity Model:- Level 0- Level 1: Resources- Level 2: HTTP Verbs- Level 3: Hypermedia
Saturday, 30 March 13
![Page 15: Clojure/West 2013 in 30 mins](https://reader033.vdocument.in/reader033/viewer/2022042813/54ba79874a795938568b465b/html5/thumbnails/15.jpg)
RESTful Clojure - Siva Jagadeesan
Level 0- GET /api?action=create_order¶m1=val1- GET /create_order?param1=val1
Saturday, 30 March 13
![Page 16: Clojure/West 2013 in 30 mins](https://reader033.vdocument.in/reader033/viewer/2022042813/54ba79874a795938568b465b/html5/thumbnails/16.jpg)
RESTful Clojure - Siva Jagadeesan
Level 1 - Resources- GET /orders?action=create¶m1=val1
Saturday, 30 March 13
![Page 17: Clojure/West 2013 in 30 mins](https://reader033.vdocument.in/reader033/viewer/2022042813/54ba79874a795938568b465b/html5/thumbnails/17.jpg)
RESTful Clojure - Siva Jagadeesan
Level 2 - HTTP Verbs- GET /orders- POST /orders ( includes body payload)
Saturday, 30 March 13
![Page 18: Clojure/West 2013 in 30 mins](https://reader033.vdocument.in/reader033/viewer/2022042813/54ba79874a795938568b465b/html5/thumbnails/18.jpg)
RESTful Clojure - Siva Jagadeesan
Level 3 - Hypermedia- GET /orders- POST /orders ( includes body payload)
Saturday, 30 March 13
![Page 19: Clojure/West 2013 in 30 mins](https://reader033.vdocument.in/reader033/viewer/2022042813/54ba79874a795938568b465b/html5/thumbnails/19.jpg)
RESTful Clojure - Siva Jagadeesan
Level 3 - Hypermedia- GET /orders- POST /orders ( includes body payload)
{ "id": 1, "items": [ { "id": 2 } ], "link": { "rel": "delete", "href": "/orders/1" }}
Saturday, 30 March 13
![Page 20: Clojure/West 2013 in 30 mins](https://reader033.vdocument.in/reader033/viewer/2022042813/54ba79874a795938568b465b/html5/thumbnails/20.jpg)
Engines of Abstraction - Jim Duey
Saturday, 30 March 13
![Page 21: Clojure/West 2013 in 30 mins](https://reader033.vdocument.in/reader033/viewer/2022042813/54ba79874a795938568b465b/html5/thumbnails/21.jpg)
Engines of Abstraction - Jim DueyAh, one more monads talk!
- Monoids in clojure - list, concat, set, union, hash-map...
- Functors - a context datatype and a fn (fmap) to apply a function to each value inside that context
- Applicative Functors - a context datatype and two functions: one that wraps a value in the context type 'amap' applies fns wrapped in the context to parameters wrapped in the context
- Monads - context data type, fn that wraps values, fn (bind) to apply a fn to wrapped values. The applied fn takes a value and returns a wrapped value.
Saturday, 30 March 13
![Page 22: Clojure/West 2013 in 30 mins](https://reader033.vdocument.in/reader033/viewer/2022042813/54ba79874a795938568b465b/html5/thumbnails/22.jpg)
Engines of Abstraction - Jim Duey
Who wants a monads talk at #cljsyd? :)
Saturday, 30 March 13
![Page 23: Clojure/West 2013 in 30 mins](https://reader033.vdocument.in/reader033/viewer/2022042813/54ba79874a795938568b465b/html5/thumbnails/23.jpg)
Clojure in the Large - Stuart sierra
Saturday, 30 March 13
![Page 24: Clojure/West 2013 in 30 mins](https://reader033.vdocument.in/reader033/viewer/2022042813/54ba79874a795938568b465b/html5/thumbnails/24.jpg)
Clojure in the Large - Stuart sierra
Lisp is a ball of mud- not a lot of structure: namespaces and vars. That’s it.- namespaces: not first-class modules- def and defn are global by default
Also talked about encapsulation and global state
Saturday, 30 March 13
![Page 25: Clojure/West 2013 in 30 mins](https://reader033.vdocument.in/reader033/viewer/2022042813/54ba79874a795938568b465b/html5/thumbnails/25.jpg)
Clojure in the Large - Stuart sierra
Encapsulation anti-pattern:
;; Tempation to share it promiscuously!(def state-a (ref {}))
;; Hidden dependencies(defn op1 [] (dosync (alter state-a ...)))
Saturday, 30 March 13
![Page 26: Clojure/West 2013 in 30 mins](https://reader033.vdocument.in/reader033/viewer/2022042813/54ba79874a795938568b465b/html5/thumbnails/26.jpg)
Clojure in the Large - Stuart sierra
Encapsulation: use local-state instead
;; Well-defined initial state. 'Go together' semantics(defn constructor [] {:a (ref {}) :b (atom 0)})
;; Makes function dependencies clear(defn op1 [state] (dosync (alter (:a state) ...)))
Saturday, 30 March 13
![Page 27: Clojure/West 2013 in 30 mins](https://reader033.vdocument.in/reader033/viewer/2022042813/54ba79874a795938568b465b/html5/thumbnails/27.jpg)
Clojure in the Large - Stuart sierra
with-* macros:- assumes body starts and ends in a single thread- assumes doesn’t return lazy seqs- limits caller to one resource at a time
Saturday, 30 March 13
![Page 28: Clojure/West 2013 in 30 mins](https://reader033.vdocument.in/reader033/viewer/2022042813/54ba79874a795938568b465b/html5/thumbnails/28.jpg)
Clojure in the Large - Stuart sierra
Anti-pattern - thread-bound state:
(def ^:dynamic *resource*)
(defn- internal-op1 [] ... *resource* ...)
;;another hidden dependency(defn op1 [arg] (internal-op1 ...))
Saturday, 30 March 13
![Page 29: Clojure/West 2013 in 30 mins](https://reader033.vdocument.in/reader033/viewer/2022042813/54ba79874a795938568b465b/html5/thumbnails/29.jpg)
Clojure in the Large - Stuart sierra
Local state with dynamic extent: nested with-resources;; Pass around "context" argument(defn op1 [context] ;; not confined to a single thread ;; acquire resources (let [resource (::resource context)] ;; use namespace qualified keys (assoc context ::result1 ...)))
;; still need to manage resource lifecycle(defn finish [context] (update-in context [::resource] dispose))
Saturday, 30 March 13
![Page 30: Clojure/West 2013 in 30 mins](https://reader033.vdocument.in/reader033/viewer/2022042813/54ba79874a795938568b465b/html5/thumbnails/30.jpg)
Clojure in the Large - Stuart sierra
When is it safe to use global Vars?- True constants: (def ^:const gravity 6....)- True singletons: (def runtime (Runtime/getRuntime))- For REPL dev- Private dynamic vars are OK: (def ^:private ^:dynamic *state*)
(binding [*state* ....] ...)
Saturday, 30 March 13
![Page 31: Clojure/West 2013 in 30 mins](https://reader033.vdocument.in/reader033/viewer/2022042813/54ba79874a795938568b465b/html5/thumbnails/31.jpg)
Pedestal
No point in showing it here. Go to http://pedestal.io/
Saturday, 30 March 13
![Page 32: Clojure/West 2013 in 30 mins](https://reader033.vdocument.in/reader033/viewer/2022042813/54ba79874a795938568b465b/html5/thumbnails/32.jpg)
Beyond contracts - Paul deGrandis
Saturday, 30 March 13
![Page 33: Clojure/West 2013 in 30 mins](https://reader033.vdocument.in/reader033/viewer/2022042813/54ba79874a795938568b465b/html5/thumbnails/33.jpg)
Beyond contracts - Paul deGrandis
core.specs: automatically generate tests and documentation and contracts from REPL explorations:
https://github.com/ohpauleez/sterling
Saturday, 30 March 13
![Page 34: Clojure/West 2013 in 30 mins](https://reader033.vdocument.in/reader033/viewer/2022042813/54ba79874a795938568b465b/html5/thumbnails/34.jpg)
Day 2
Saturday, 30 March 13
![Page 35: Clojure/West 2013 in 30 mins](https://reader033.vdocument.in/reader033/viewer/2022042813/54ba79874a795938568b465b/html5/thumbnails/35.jpg)
PuppetDB - centralised DB for Puppet developed in Clojure
Saturday, 30 March 13
![Page 36: Clojure/West 2013 in 30 mins](https://reader033.vdocument.in/reader033/viewer/2022042813/54ba79874a795938568b465b/html5/thumbnails/36.jpg)
PuppetDB - centralised DB for Puppet developed in Clojure
Why Clojure?- Issues with Ruby: slow, GIL, garbage collection
Puppet DB is a layer on top of PostgreSQL
Write pipeline:- async, parallel, MQ-based, automatic retry
Read pipeline:- DLS, AST-based, transferred over the wire using JSON- you can write your own
Saturday, 30 March 13
![Page 37: Clojure/West 2013 in 30 mins](https://reader033.vdocument.in/reader033/viewer/2022042813/54ba79874a795938568b465b/html5/thumbnails/37.jpg)
Securing Clojure Web Apps/Services with Friend - Chas Emerick
Saturday, 30 March 13
![Page 38: Clojure/West 2013 in 30 mins](https://reader033.vdocument.in/reader033/viewer/2022042813/54ba79874a795938568b465b/html5/thumbnails/38.jpg)
Securing Clojure Web Apps/Services with Friend - Chas Emerick
- Authentication and Authorization library for Clojure- Ring middleware
Saturday, 30 March 13
![Page 39: Clojure/West 2013 in 30 mins](https://reader033.vdocument.in/reader033/viewer/2022042813/54ba79874a795938568b465b/html5/thumbnails/39.jpg)
Securing Clojure Web Apps/Services with Friend - Chas Emerick
Batteries included: - Authentication workflows - form-based "interactive" login - HTTP basic (Digest, soon) - OpenId (Google, Yahoo, Wordpress etc...) - "Channel enforcement" (e.g. require HTTPS)
- Authorization Options - Roles based on Clojure's ad-hoc hierarchies - functions, macros, and ring middleware for enforcinf role-based auth policy - Arbitrary imperative control
Saturday, 30 March 13
![Page 40: Clojure/West 2013 in 30 mins](https://reader033.vdocument.in/reader033/viewer/2022042813/54ba79874a795938568b465b/html5/thumbnails/40.jpg)
Securing Clojure Web Apps/Services with Friend - Chas Emerick
https://github.com/cemerick/friend
Saturday, 30 March 13
![Page 41: Clojure/West 2013 in 30 mins](https://reader033.vdocument.in/reader033/viewer/2022042813/54ba79874a795938568b465b/html5/thumbnails/41.jpg)
pallet.clj - Infrastructure project file
Saturday, 30 March 13
![Page 42: Clojure/West 2013 in 30 mins](https://reader033.vdocument.in/reader033/viewer/2022042813/54ba79874a795938568b465b/html5/thumbnails/42.jpg)
pallet.clj - Infrastructure project file
pallet-lein plugin: https://github.com/pallet/pallet-lein
create pallet.clj file
> lein pallet up <-- local
or on EC2...
Saturday, 30 March 13
![Page 43: Clojure/West 2013 in 30 mins](https://reader033.vdocument.in/reader033/viewer/2022042813/54ba79874a795938568b465b/html5/thumbnails/43.jpg)
clj-v8 and the dieter asset pipeline
Saturday, 30 March 13
![Page 44: Clojure/West 2013 in 30 mins](https://reader033.vdocument.in/reader033/viewer/2022042813/54ba79874a795938568b465b/html5/thumbnails/44.jpg)
clj-v8 and the dieter asset pipeline
JS/CSS minification, concatenation and cache busting: https://github.com/edgecase/dieter
Saturday, 30 March 13
![Page 45: Clojure/West 2013 in 30 mins](https://reader033.vdocument.in/reader033/viewer/2022042813/54ba79874a795938568b465b/html5/thumbnails/45.jpg)
Day 3
Saturday, 30 March 13
![Page 46: Clojure/West 2013 in 30 mins](https://reader033.vdocument.in/reader033/viewer/2022042813/54ba79874a795938568b465b/html5/thumbnails/46.jpg)
Ritz - The missing Clojure tooling: https://github.com/pallet/ritz
Saturday, 30 March 13
![Page 47: Clojure/West 2013 in 30 mins](https://reader033.vdocument.in/reader033/viewer/2022042813/54ba79874a795938568b465b/html5/thumbnails/47.jpg)
Macros vs. Monads
Saturday, 30 March 13
![Page 48: Clojure/West 2013 in 30 mins](https://reader033.vdocument.in/reader033/viewer/2022042813/54ba79874a795938568b465b/html5/thumbnails/48.jpg)
Macros vs. Monads
Synthread: https://github.com/LonoCloud/synthread- Presented as an alternative do the state monad:
(require '[synthread :as ->])
(-> {} f1 f2 f3)
Saturday, 30 March 13
![Page 49: Clojure/West 2013 in 30 mins](https://reader033.vdocument.in/reader033/viewer/2022042813/54ba79874a795938568b465b/html5/thumbnails/49.jpg)
Macros vs. Monads
And it’s got lots of other useful macros: ->/do ->/if ->/when ->/for ->/assoc ->/update-in
Saturday, 30 March 13
![Page 50: Clojure/West 2013 in 30 mins](https://reader033.vdocument.in/reader033/viewer/2022042813/54ba79874a795938568b465b/html5/thumbnails/50.jpg)
The EndQuestions?
Leonardo Borges@leonardo_borges
http://www.leonardoborges.comhttp://www.thoughtworks.com
Saturday, 30 March 13