Clojure night

73
Clojure Community Night Aria Haghighi CTO @aria42 Saturday, October 5, 13

Transcript of Clojure night

Page 1: Clojure night

Clojure Community Night

Aria Haghighi CTO

@aria42Saturday, October 5, 13

Page 2: Clojure night

Eng @ Prismatic

Saturday, October 5, 13

Page 3: Clojure night

Eng @ Prismatic

All Clojure in the back

Saturday, October 5, 13

Page 4: Clojure night

Eng @ Prismatic

All Clojure in the back

Some Clojure in the front

Saturday, October 5, 13

Page 5: Clojure night

Saturday, October 5, 13

Page 6: Clojure night

<31. Why

Saturday, October 5, 13

Page 7: Clojure night

<31. Why

2. Open

Source

Saturday, October 5, 13

Page 8: Clojure night

<31. Why

2. Open

Source

3.What’s

needed

Saturday, October 5, 13

Page 9: Clojure night

Why Clojure

<3

Saturday, October 5, 13

Page 10: Clojure night

Programming to Behavior

Saturday, October 5, 13

Page 11: Clojure night

Programming to Behavior

Saturday, October 5, 13

Page 12: Clojure night

Programming to Behavior

EncapsulateThe

Object

Saturday, October 5, 13

Page 13: Clojure night

Programming to Behavior

Interface

EncapsulateThe

Object

Saturday, October 5, 13

Page 14: Clojure night

Programming to Behavior

At it’s best, OOP is about

coding to behavior, not

state or identity

Saturday, October 5, 13

Page 15: Clojure night

Programming to Data

Saturday, October 5, 13

Page 16: Clojure night

Programming to Data

Inherent data structures can

be used to derive the

structure of a program

Saturday, October 5, 13

Page 17: Clojure night

Programming to Data

Inherent data structures can

be used to derive the

structure of a program

Saturday, October 5, 13

Page 18: Clojure night

Programming to Data

Saturday, October 5, 13

Page 19: Clojure night

Programming to Data

Ins & Outs

Saturday, October 5, 13

Page 20: Clojure night

Programming to Data

Ins & Outs

Represent

Saturday, October 5, 13

Page 21: Clojure night

Programming to Data

Ins & Outs

Represent

Transform

Saturday, October 5, 13

Page 22: Clojure night

The killer feature of Clojure isn’t that

it’s a functional language, but the

best data-oriented one

Programming to Data

Saturday, October 5, 13

Page 23: Clojure night

Data Behavior

Saturday, October 5, 13

Page 24: Clojure night

Data Behavior

sequences

mapsdefn

destructuring

macrosSaturday, October 5, 13

Page 25: Clojure night

Data Behavior

sequences

mapsdefn

destructuring

macros

deftype

protocol

reify

Saturday, October 5, 13

Page 26: Clojure night

Data Behavior

sequences

mapsdefn

destructuring

macros

records

multi-methods

deftype

protocol

reify

Saturday, October 5, 13

Page 27: Clojure night

Data Behavior+

The crown of Clojure’s design is

the clean separation of data

and behavior

Saturday, October 5, 13

Page 28: Clojure night

Open Source

Saturday, October 5, 13

Page 29: Clojure night

Open Source

Saturday, October 5, 13

Page 30: Clojure night

Plumbing and Graphdata-oriented

composition and dependency

prismatic/plumbing

Saturday, October 5, 13

Page 31: Clojure night

Graph: Overview

Saturday, October 5, 13

Page 32: Clojure night

Graph: OverviewUnivariate statistics: Given data as double[] xs

Saturday, October 5, 13

Page 33: Clojure night

Graph: OverviewUnivariate statistics: Given data as double[] xs

m =1

n

nX

i=1

xi

m2 =1

n

nX

i=1

x

2i

v = m2 �m2

Saturday, October 5, 13

Page 34: Clojure night

Graph: OverviewUnivariate statistics: Given data as double[] xs

m =1

n

nX

i=1

xi

m2 =1

n

nX

i=1

x

2i

v = m2 �m2

xs

n

m2 m

v

Saturday, October 5, 13

Page 35: Clojure night

Graph: OverviewUnivariate statistics: Given data as double[] xs

xs

n

m2 m

v

Saturday, October 5, 13

Page 36: Clojure night

Graph: OverviewUnivariate statistics: Given data as double[] xs

xs

n

m2 m

v

(defn stats [{:keys [xs]}] (let [n (count xs) m (/ (sum xs) n) m2 (/ (sum sq xs) n) v (- m2 (* m m))] {:n n :m m :m2 m2 :v v}))

Saturday, October 5, 13

Page 37: Clojure night

The Monster let(defn start [{:keys [a,z]}] (let [s1 (store a ...) s2 (store b ...) db (sql-db c) t2 (cron s2 db...)

... srv (server ...)] (fn shutdown [] (.stop srv) ... (.flush s1))))

Saturday, October 5, 13

Page 38: Clojure night

The Monster let

dozens of parameters, not compositional

(defn start [{:keys [a,z]}] (let [s1 (store a ...) s2 (store b ...) db (sql-db c) t2 (cron s2 db...)

... srv (server ...)] (fn shutdown [] (.stop srv) ... (.flush s1))))

Saturday, October 5, 13

Page 39: Clojure night

The Monster let

dozens of parameters, not compositional

structure of (de)composition is locked up in an opaque function

(defn start [{:keys [a,z]}] (let [s1 (store a ...) s2 (store b ...) db (sql-db c) t2 (cron s2 db...)

... srv (server ...)] (fn shutdown [] (.stop srv) ... (.flush s1))))

Saturday, October 5, 13

Page 40: Clojure night

The Monster let

dozens of parameters, not compositional

structure of (de)composition is locked up in an opaque function

(defn start [{:keys [a,z]}] (let [s1 (store a ...) s2 (store b ...) db (sql-db c) t2 (cron s2 db...)

... srv (server ...)] (fn shutdown [] (.stop srv) ... (.flush s1))))

Saturday, October 5, 13

Page 41: Clojure night

The Monster let

dozens of parameters, not compositional

structure of (de)composition is locked up in an opaque function

(defn start [{:keys [a,z]}] (let [s1 (store a ...) s2 (store b ...) db (sql-db c) t2 (cron s2 db...)

... srv (server ...)] (fn shutdown [] (.stop srv) ... (.flush s1))))

Saturday, October 5, 13

Page 42: Clojure night

The Monster let

dozens of parameters, not compositional

structure of (de)composition is locked up in an opaque function

(defn start [{:keys [a,z]}] (let [s1 (store a ...) s2 (store b ...) db (sql-db c) t2 (cron s2 db...)

... srv (server ...)] (fn shutdown [] (.stop srv) ... (.flush s1))))

Saturday, October 5, 13

Page 43: Clojure night

The Monster let

dozens of parameters, not compositional

structure of (de)composition is locked up in an opaque function

(defn start [{:keys [a,z]}] (let [s1 (store a ...) s2 (store b ...) db (sql-db c) t2 (cron s2 db...)

... srv (server ...)] (fn shutdown [] (.stop srv) ... (.flush s1))))

Saturday, October 5, 13

Page 44: Clojure night

The Monster let

dozens of parameters, not compositional

structure of (de)composition is locked up in an opaque function

(defn start [{:keys [a,z]}] (let [s1 (store a ...) s2 (store b ...) db (sql-db c) t2 (cron s2 db...)

... srv (server ...)] (fn shutdown [] (.stop srv) ... (.flush s1))))

Saturday, October 5, 13

Page 45: Clojure night

The Monster let

dozens of parameters, not compositional

structure of (de)composition is locked up in an opaque function

(defn start [{:keys [a,z]}] (let [s1 (store a ...) s2 (store b ...) db (sql-db c) t2 (cron s2 db...)

... srv (server ...)] (fn shutdown [] (.stop srv) ... (.flush s1))))

Saturday, October 5, 13

Page 46: Clojure night

The Monster let

dozens of parameters, not compositional

structure of (de)composition is locked up in an opaque function

(defn start [{:keys [a,z]}] (let [s1 (store a ...) s2 (store b ...) db (sql-db c) t2 (cron s2 db...)

... srv (server ...)] (fn shutdown [] (.stop srv) ... (.flush s1))))

Saturday, October 5, 13

Page 47: Clojure night

From let to Graph(defn stats [{:keys [xs]}] (let [n (count xs) m (/ (sum xs) n) m2 (/ (sum sq xs) n) v (- m2 (* m m))] {:n n :m m :m2 m2 :v v}))

Saturday, October 5, 13

Page 48: Clojure night

From let to Graph(defn stats [{:keys [xs]}] (let [n (count xs) m (/ (sum xs) n) m2 (/ (sum sq xs) n) v (- m2 (* m m))] {:n n :m m :m2 m2 :v v}))

xs

n

m2 m

v

Saturday, October 5, 13

Page 49: Clojure night

From let to Graph(defn stats [{:keys [xs]}] (let [n (count xs) m (/ (sum xs) n) m2 (/ (sum sq xs) n) v (- m2 (* m m))] {:n n :m m :m2 m2 :v v}))

{:n (fn [xs] (count xs)) :m (fn [xs n] (/ (sum xs) n)) :m2 (fn [xs n] (/ (sum sq xs) n)) :v (fn [m m2] (- m2 (* m m)))}

xs

n

m2 m

v

Saturday, October 5, 13

Page 50: Clojure night

From let to Graph(defn stats [{:keys [xs]}] (let [n (count xs) m (/ (sum xs) n) m2 (/ (sum sq xs) n) v (- m2 (* m m))] {:n n :m m :m2 m2 :v v}))

{:n (fn [xs] (count xs)) :m (fn [xs n] (/ (sum xs) n)) :m2 (fn [xs n] (/ (sum sq xs) n)) :v (fn [m m2] (- m2 (* m m)))}

kkkk

xs

n

m2 m

v

Saturday, October 5, 13

Page 51: Clojure night

Example: API Service

Saturday, October 5, 13

Page 52: Clojure night

Example: API Service

(def api-service (service {:service-name “api” :backend-port 42424 :server-threads 100} {:store1 (instance store {:type :s3 ...}) :memo (fnk [store1] {:resource ...}) ... :api-server (...)}))

Saturday, October 5, 13

Page 53: Clojure night

sane DOM templating and manipulation

prismatic/dommy

Dommy

Saturday, October 5, 13

Page 54: Clojure night

fast primitive array math

prismatic/hiphip

HipHip (Array)

w · x =nX

i=1

wixi

Saturday, October 5, 13

Page 55: Clojure night

HipHip Examples

Saturday, October 5, 13

Page 56: Clojure night

HipHip Examples Dot Product w · x =

nX

i=1

wixi

Saturday, October 5, 13

Page 57: Clojure night

HipHip Examples Dot Product w · x =

nX

i=1

wixi

Inner loop in machine learning

Saturday, October 5, 13

Page 58: Clojure night

HipHip Examples Dot Product w · x =

nX

i=1

wixi

Inner loop in machine learning

argmax

`w · x`

prediction

Saturday, October 5, 13

Page 59: Clojure night

HipHip Examples Dot Product w · x =

nX

i=1

wixi

Inner loop in machine learning

argmax

`w · x`

prediction

P (x;w) / exp{w · x}training

Saturday, October 5, 13

Page 60: Clojure night

Dot Product w · x =nX

i=1

wixi

HipHip Examples

Saturday, October 5, 13

Page 61: Clojure night

Dot Product w · x =nX

i=1

wixi

(defn dot-product [^doubles ws ^doubles xs] (areduce ws idx sum 0.0 (+ sum (*  (aget ws idx) (aget xs idx))))

HipHip Examples

Saturday, October 5, 13

Page 62: Clojure night

Dot Product w · x =nX

i=1

wixi

HipHip Examples

Saturday, October 5, 13

Page 63: Clojure night

Dot Product w · x =nX

i=1

wixi

double dotProd(double[] ws, double[] xs) { double sum = 0.0; for (int i=0; i < xs.length; ++i) { sum += ws[i] * xs[i]; } return sum;}

HipHip Examples

Saturday, October 5, 13

Page 64: Clojure night

Dot Product w · x =nX

i=1

wixi

HipHip Examples

Saturday, October 5, 13

Page 65: Clojure night

Dot Product w · x =nX

i=1

wixi

(defn dot-product [ws xs] (hiphip.double/asum [w ws x xs] (* w x)))     

HipHip Examples

Saturday, October 5, 13

Page 66: Clojure night

declarative data description and

validation

prismatic/schema

Schema

Saturday, October 5, 13

Page 67: Clojure night

What Clojure needs

Saturday, October 5, 13

Page 68: Clojure night

Where’s my debugger!?!

Saturday, October 5, 13

Page 69: Clojure night

MOAR Compiler Speed

(require 'api.deploy)

go get a coffee, it’s going to be a bit

Saturday, October 5, 13

Page 70: Clojure night

Compiler Tooling

real IDE tools

Make Paredit a library

Saturday, October 5, 13

Page 71: Clojure night

Multi-project support in Leiningen

Saturday, October 5, 13

Page 72: Clojure night

Native Client Story

Saturday, October 5, 13

Page 73: Clojure night

ThanksQuestions?

Saturday, October 5, 13