×
Copy
Open
Link
Embed
Share
Beginning
This slide
Copy link URL
Copy link URL
Copy iframe embed code
Copy iframe embed code
Copy javascript embed code
Copy javascript embed code
Share
Tweet
Share
Tweet
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