Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Clojure@NSU 01

Clojure@NSU 01

Nikita Prokopov

March 20, 2013
Tweet

More Decks by Nikita Prokopov

Other Decks in Programming

Transcript

  1. # Clojure web stack Servlet Netty Mongrel2 Http-kit Aleph Ring

    Moustache Compojure Enlive Hiccup Laser ClojureScript Domina Enfocus Crate Javelin Reflex
  2. # Ring Server ←→ app contract fn [request-map] → response-map

    Похоже на WSGi (Python) github.com/ring-clojure/ring/blob/master/SPEC
  3. # Ring Нет реализации — нет зависимостей, багов, етц Маленькая

    — легко реализовать Низкоуровневая Вход-выход — просто тестировать Веб-сокеты не засунешь
  4. # Диспатчинг ## Moustache (def my-app (app [“hi”] {:get “hello

    world only for GET!”} [“hi” name] {:get [“hello “ name]}))
  5. # Диспатчинг ## Compojure (defroutes app (GET “/” [] “<h1>Hello

    World</h1>”) (route/not-found “<h1>Page not found</h1>”))
  6. # Templating — цветочки ## Hiccup (html [:span {:class “foo”}

    “bar”]) <span class=”foo”>bar</span> (html [:div#foo.bar.baz “bang”]) <div id=”foo” class=”bar baz”>bang</div>
  7. # Templating — цветочки ## Hiccup (defn with-cdn [cdn-url form]

    (clojure.walk/postwalk (fn [node] (if (rel-asset-path? node) (cdn-url node) node) form)))
  8. # Templating — ягодки ## Enlive Парсинг и трансформация HTML

    Код отдельно от верстки Переиспользование snippets Модификации можно комбинировать Макросы!
  9. # Templating — ягодки ## Enlive (at a-node [:a :selector]

    a-transformation [:another :selector] another-transformation ...) (html/deftemplate index “tutorial/template1.html” [ctxt] [:p#message] (html/content (get ctxt :message “Nothing to see here”))
  10. # Templating — ягодки ## Laser Еще более функциональный (laser/document

    (laser/parse html) (laser/class= “meow”) (laser/content “omg”))
  11. # Aleph Сетевая библиотека Общение через каналы Conforms to Ring,

    только request и response разделены HTTP, WebSockets, TCP, UDP, Redis
  12. # Aleph async (defn handler [response-channel request] (enqueue response-channel {:status

    200 :headers {“content-type” “text/plain”} :body “Hello World”}))
  13. # Aleph async (def handler (app [“sync”] {:get “response”} [“async”]

    {:get (wrap-aleph-handler async-han- dler)})) (start-http-server (wrap-ring-handler handler) {:port 8080})
  14. # Aleph async (def broadcast-channel (channel)) (defn chat-handler [ch handshake]

    (receive ch (fn [name] (siphon (map* #(str name “: “ %) ch) broadcast-channel) (siphon broadcast-channel ch)))) (start-http-server chat-handler {:port 8080 :websocket true})
  15. # http-kit Pure Java & Clojure, very small Server &

    client Ring-compliant Websockets, long-polling, streaming extensions
  16. # edn Data exchange format Based on Clojure syntax Rich

    set of elements collections, symbols, keywords Extensible for new types Self-describing (no schema) Namespaces
  17. # edn { :created_at #inst “1985-04-12T23:20:50.52Z” :id 209722238071619586 :id_str “209722238071619586”

    :retweeted false :text “tweet” :com.google.maps/geo nil :entries { :user_mentions [ { :id 1001 :indices [0 16] :name “Petrov” } ] } }
  18. # Lessons learned from Node.js Писать клиент и сервер на

    одном языке очень удобно! Только почему на JavaScript?
  19. # Как правильно? Стандартные решения для стандартных проблем Реализаций import:

    0 ООП-фреймворков: 0 Альтерн. синтаксисов: 0 Альтерн. коллекций: 0 Monad tutorials: 0
  20. # Как работает? Компилируется на большой Clojure Генерирует Javascript для

    Google Closure Compiler Оптимизируется Google Closure Compiler Зависимости через Goolge Closure Library
  21. # Компиляция? Dead code elimination Smart code compression Снимает browser

    quirks Может увеличить производительность Debug :(
  22. # Отличия от Clojure Atoms, but no Refs nor STM

    No Vars No agents No symbol or var (def) metadata
  23. # Библиотеки No problem Нужен extern файл /** * @param

    {(string|Object.<string,*>)} arg1 * @param {Object.<string,*>=} settings * @return {jQuery.jqXHR} */ jQuery.ajax = function(arg1, settings) {};
  24. # Библиотеки ## jQuery $(“element“) .appen(“xyz”) .attr(“data-weight”, 70) .css(“left”, 156

    + “px”); (-> (js/$ “#element“) (.append “xyz“) (.attr “data-weight“ 70) (.css “left“ (str 156 “px”))
  25. # Библиотеки ## jayq (def $interface (jq/$ :#interface)) (-> $interface

    (jq/css {:background “blue”}) (jq/inner “Loading!”))
  26. # DOM manipulation Domina ~ jQuery Enfocus ~ Enlive Crate

    ~ Hiccup Webfui ~ DOM isolation Dommy ~ Efficient macro-compile
  27. # FRP ## Javelin (defn ^:export start [] (let [text

    (form-cell “#text”) length (cell (count text))] (.focus (by-id “#text”)) (cell (html! “#count” “Length: %s” length))))