Slide 1

Slide 1 text

Clojure among Java @darkproger

Slide 2

Slide 2 text

Hi! I happen to use JVM.

Slide 3

Slide 3 text

Enterprise

Slide 4

Slide 4 text

No content

Slide 5

Slide 5 text

No content

Slide 6

Slide 6 text

FAIRY TALE WARNING

Slide 7

Slide 7 text

Y U NO Java? Boilerplate IDE Tooling Time

Slide 8

Slide 8 text

o_O →

Slide 9

Slide 9 text

No content

Slide 10

Slide 10 text

o_O → Java → Clojure

Slide 11

Slide 11 text

maven IDE XML boardom → leiningen → text editor → clj forms (EDN) → pun

Slide 12

Slide 12 text

enterprise →

Slide 13

Slide 13 text

HTTP

Slide 14

Slide 14 text

HTTP adapters CGI FastCGI SCGI WSGI Rack Servlet Ring ISAPI Apache Modules

Slide 15

Slide 15 text

JSR 315 Java Servlet 3.0 Spec http://jcp.org/en/jsr/detail?id=315

Slide 16

Slide 16 text

JSR 315 Java Servlet 3.0 Spec http://jcp.org/en/jsr/detail?id=315 (230 pages)

Slide 17

Slide 17 text

github: ring-clojure/ring https://github.com/ring-clojure/ring/blob/master/SPEC

Slide 18

Slide 18 text

github: ring-clojure/ring https://github.com/ring-clojure/ring/blob/master/SPEC (120 lines)

Slide 19

Slide 19 text

(defn handler [{headers :headers method :request-method body :body :as request-map}] {:status 200 :body "ok computer"})

Slide 20

Slide 20 text

No content

Slide 21

Slide 21 text

Tomcat

Slide 22

Slide 22 text

No content

Slide 23

Slide 23 text

local.MyServlet.service org.apache.catalina.core.ApplicationFilterChain.internalDoFilter org.apache.catalina.core.ApplicationFilterChain.doFilter org.apache.catalina.core.StandardWrapperValve.invoke org.apache.catalina.core.StandardContextValve.invoke org.apache.catalina.authenticator.AuthenticatorBase.invoke org.apache.catalina.core.StandardHostValve.invoke org.apache.catalina.valves.ErrorReportValve.invoke org.apache.catalina.valves.AccessLogValve.invoke org.apache.catalina.core.StandardEngineValve.invoke org.apache.catalina.connector.CoyoteAdapter.service org.apache.coyote.http11.AbstractHttp11Processor.process org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run java.util.concurrent.ThreadPoolExecutor.runWorker java.util.concurrent.ThreadPoolExecutor$Worker.run java.lang.Thread.run

Slide 24

Slide 24 text

No content

Slide 25

Slide 25 text

github: weavejester/lein-ring https://github.com/weavejester/lein-ring

Slide 26

Slide 26 text

% cat project.clj (defproject web "0.1.0-SNAPSHOT" :dependencies [[org.clojure/clojure "1.5.1"] [org.clojure/tools.nrepl "0.2.2"] [digest "1.3.0"] [ring "1.2.0-beta2"] [ring/ring-servlet "1.2.0-beta2-SNAPSHOT"] [clj-stacktrace "0.2.5"] [compojure "1.1.5"]] :plugins [[lein-ring "0.8.5-SNAPSHOT"] [lein-checkouts "1.1.0"] [lein-checkout-deps "1.0.0"]] :ring {:handler web.core/handler :web-xml "resources/web.xml"})

Slide 27

Slide 27 text

% lein ring uberwar

Slide 28

Slide 28 text

Async webbit aleph http-kit (mostly java)

Slide 29

Slide 29 text

Ring Adapters ring-jetty ring-servlet ring-netty ring-httpcore ring-mongrel2

Slide 30

Slide 30 text

Ring Adapters ring-jetty ring-servlet ring-netty ring-httpcore ring-mongrel2

Slide 31

Slide 31 text

github: proger/ring /ring-servlet https://github.com/proger/ring/tree/servlet-async/ring-servlet

Slide 32

Slide 32 text

Introspection

Slide 33

Slide 33 text

No content

Slide 34

Slide 34 text

Java RMI jstatd + rmiregistry JMX

Slide 35

Slide 35 text

Desperate Java java -agentlib:jdwp=\ transport=dt_socket,\ address=8000,\ server=y,\ suspend=n

Slide 36

Slide 36 text

java -cp jline.jar:tools.jar jline.ConsoleRunner com.sun.tools.example. debug.tty.TTY -attach 8000 Desperate Java

Slide 37

Slide 37 text

BTrace: Bytecode tracing kenai.com/projects/btrace/

Slide 38

Slide 38 text

DTrace + hotspot provider + jstack() (solaris/osx) % env \ LD_AUDIT_64=/usr/lib/dtrace/64/libdtrace_forceload.so \ java -XX:+ExtendedDTraceProbes

Slide 39

Slide 39 text

DTrace + hotspot provider + jstack() ( solaris) % env \ LD_AUDIT_64=/usr/lib/dtrace/64/libdtrace_forceload.so \ java -XX:+ExtendedDTraceProbes % vagrant box add omnios \ http://omnios.omniti.com/media/omnios-latest.box

Slide 40

Slide 40 text

Inject a Clojure agent in live Java github: djpowell/liverepl https://github.com/djpowell/liverepl

Slide 41

Slide 41 text

nREPL

Slide 42

Slide 42 text

No content

Slide 43

Slide 43 text

No content

Slide 44

Slide 44 text

% lein repl nREPL server started on port 63155 REPL-y 0.1.10 Clojure 1.5.1 Exit: Control+D or (exit) or (quit) Commands: (user/help) Docs: (doc function-name-here) (find-doc "part-of-name-here") Source: (source function-name-here) (user/sourcery function-name-here) Javadoc: (javadoc java-object-or-class-here) Examples from clojuredocs.org: [clojuredocs or cdoc] (user/clojuredocs name-here) (user/clojuredocs "ns-here" "name-here") user=>

Slide 45

Slide 45 text

% lsof -nPi | grep 63155 java 35453 proger 27u IPv6 0x94fc11a576507639 0t0 TCP 127.0.0.1:63155 (LISTEN) java 35453 proger 32u IPv6 0x94fc11a576506e79 0t0 TCP 127.0.0.1:63157->127.0.0.1:63155 (ESTABLISHED) java 35453 proger 33u IPv6 0x94fc11a54fec6259 0t0 TCP 127.0.0.1:63155->127.0.0.1:63157 (ESTABLISHED)

Slide 46

Slide 46 text

(def nrepl-agent (safe-agent {})) (defroutes api (POST "/nrepl" _request (when (nil? (:nrepl @nrepl-agent)) (send-off nrepl-agent (fn [mp] (assoc mp :nrepl (nr/start-server)))) (await nrepl-agent)) (plain-text @nrepl-agent))

Slide 47

Slide 47 text

% curl -X POST http://tomcat.local/app/nrepl {:nrepl #clojure.tools.nrepl.server.Server{ :server-socket #, :port 63798, :open-transports #, :transport #, :greeting nil, :handler #, :ss #}}

Slide 48

Slide 48 text

% lein repl :connect 63798 REPL-y 0.1.10 Clojure 1.5.1 reply.eval-modes.nrepl=> (ns app.core) nil app.core=> (ns-publics *ns*) {handler ...}

Slide 49

Slide 49 text

% lein repl :connect 63798 ... app.core=> (add-classpath "file:/tank/ proger/.m2/repository/org/clojure/tools.trace/ 0.7.5/tools.trace-0.7.5.jar") nil app.core=> (use 'clojure.tools.trace) nil app.core=> (trace-ns *ns*) nil ; watch STDOUT! app.core=> (untrace-ns *ns*) nil https://github.com/cemerick/pomegranate http://clojure.github.io/tools.trace/

Slide 50

Slide 50 text

No content

Slide 51

Slide 51 text

k thx bai! @darkproger kirillov.im github.com/proger

Slide 52

Slide 52 text

No content

Slide 53

Slide 53 text

this slide intentionally left almost blank

Slide 54

Slide 54 text

Legal http://www.camunda.com/wp-content/uploads/2012/08/java.gif http://www.youtube.com/watch? feature=player_detailpage&v=gZy2I8csVQU#t=4s http://slant.investorplace.com/files/2013/03/Enterprise_5_hr.jpg http://d310a9hpolx59w.cloudfront.net/product_photos/1952530/ Mustache_20_2B_20Glasses_original.png (derived) http://joyent.com/blog/friday-funday-the-origins-of-the-dtrace-pony https://si0.twimg.com/profile_images/1246802441/lisp_.png http://www.deargrumpycat.com/wp-content/uploads/2013/04/Grumpy- Cat.jpg http://content.comrz.com/AcuCustom/Sitename/DAM/374/ApacheTomcat.png http://blog.catmoji.com/wp-content/uploads/2012/09/lying-tard.jpeg http://2.bp.blogspot.com/-iNP88dCJP3Y/Tbz_heuq9HI/AAAAAAAABRM/ jtyOOhjEyKA/s1600/Portal-2%255B1%255D.jpg