Clojure@NSU 01

Clojure@NSU 01

4188c62c28a196e3e82363217c56fca5?s=128

Nikita Prokopov

March 20, 2013
Tweet

Transcript

  1. # mainstreamless ## Clojure 01 Никита Прокопов tonsky.livejournal.com 20 марта

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

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

    Похоже на WSGi (Python) github.com/ring-clojure/ring/blob/master/SPEC
  4. # Ring { :uri :query-string :request-method :headers :body ... }

    → { :status :headers :body }
  5. # Ring Нет реализации — нет зависимостей, багов, етц Маленькая

    — легко реализовать Низкоуровневая Вход-выход — просто тестировать Веб-сокеты не засунешь
  6. # Middleware (fn [handler ...] → handler’) ring.middleware: + Sessions

    + Cookies + Uploads + Form parsing ...
  7. # Диспатчинг ## Moustache (def my-app (app [“hi”] {:get “hello

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

    World</h1>”) (route/not-found “<h1>Page not found</h1>”))
  9. # 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>
  10. # Templating — цветочки ## Hiccup (defn with-cdn [cdn-url form]

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

    Код отдельно от верстки Переиспользование snippets Модификации можно комбинировать Макросы!
  12. # 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”))
  13. # Templating — ягодки ## Laser Еще более функциональный (laser/document

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

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

    200 :headers {“content-type” “text/plain”} :body “Hello World”}))
  16. # 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})
  17. # 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})
  18. # http-kit Pure Java & Clojure, very small Server &

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

    set of elements collections, symbols, keywords Extensible for new types Self-describing (no schema) Namespaces
  20. # 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” } ] } }
  21. # edn clojure.core/read-string clojure.edn/read-string (since 1.5)

  22. # edn clojure.core/read-string clojure.edn/read-string (since 1.5) and cljs.reader/read-string

  23. # ClojureScript

  24. # Lessons learned from Node.js Писать клиент и сервер на

    одном языке очень удобно! Только почему на JavaScript?
  25. # ClojureScript JS is broken

  26. # ClojureScript JS is fundamentally broken

  27. # ClojureScript JS is fundamentally broken Синтаксические изменения не спасут

    Нужно править семантику
  28. # Что сломано? Типы Структуры данных Зависимости Неймспейсы Полиморфизм Типовые

    операции
  29. # CoffeeScript? Типы Структуры данных Зависимости Неймспейсы Полиморфизм Типовые операции

  30. # CoffeeScript? Типы Структуры данных Зависимости Неймспейсы Полиморфизм Типовые операции

  31. # CoffeeScript? Типы Структуры данных Зависимости Неймспейсы Полиморфизм Типовые операции

  32. # CoffeeScript? Типы Структуры данных Зависимости Неймспейсы Полиморфизм Типовые операции

  33. # CoffeeScript? Типы Структуры данных Зависимости Неймспейсы Полиморфизм Типовые операции

  34. # CoffeeScript? Типы Структуры данных Зависимости Неймспейсы Полиморфизм Типовые операции

  35. # CoffeeScript? Типы Структуры данных Зависимости Неймспейсы Полиморфизм Типовые операции

  36. # CoffeeScript? Типы Структуры данных Зависимости Неймспейсы Полиморфизм Типовые операции

    Меньше кнопок нажимать
  37. # Как правильно? Состояние Иммутабельность ФП Макросы Строгая типизация Протоколы

  38. # Как правильно? Стандартные решения для стандартных проблем

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

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

    Google Closure Compiler Оптимизируется Google Closure Compiler Зависимости через Goolge Closure Library
  41. Notice Clojure (Rich Hickey) and Closure (Google)

  42. # Компиляция? Dead code elimination Smart code compression Снимает browser

    quirks Может увеличить производительность Debug :(
  43. # Отличия от Clojure Однопоточный Compilation и macroexpansion только на

    Clojure (no eval) Browser-connected REPL Native JS regexes
  44. # Отличия от Clojure Atoms, but no Refs nor STM

    No Vars No agents No symbol or var (def) metadata
  45. # Отличия от Clojure (.foo o) => o.foo() (.-foo o)

    => o.foo
  46. # Персистентные структуры данных Native JS impl http://www.50ply.com/cljs-bench/ 2-6 times

    slower than JVM Google Chrome usually ×3-5 times faster than Safari / FF
  47. # Персистентные структуры данных

  48. # Персистентные структуры данных

  49. # Зачем? Разработка больших приложений Организация кода Командная работа Переиспользуемость

    кода Производительность, оптимизация
  50. # Библиотеки No problem Нужен extern файл /** * @param

    {(string|Object.<string,*>)} arg1 * @param {Object.<string,*>=} settings * @return {jQuery.jqXHR} */ jQuery.ajax = function(arg1, settings) {};
  51. # Библиотеки ## 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”))
  52. # Библиотеки ## jayq (def $interface (jq/$ :#interface)) (-> $interface

    (jq/css {:background “blue”}) (jq/inner “Loading!”))
  53. # DOM manipulation Domina Enfocus Crate Webfui Dommy

  54. # DOM manipulation Domina ~ jQuery Enfocus ~ Enlive Crate

    ~ Hiccup Webfui ~ DOM isolation Dommy ~ Efficient macro-compile
  55. # FRP javelin reflex shafty

  56. # FRP ## Javelin (defn ^:export start [] (let [text

    (form-cell “#text”) length (cell (count text))] (.focus (by-id “#text”)) (cell (html! “#count” “Length: %s” length))))
  57. # CLJS on Node.js Faster startup times Native clients (node-webkit)

  58. # Usecases ## Lighttable

  59. # Usecases ## Prismatic

  60. # Usecases ## Weathertable

  61. # mainstreamless ## Clojure 01 Никита Прокопов tonsky.livejournal.com 20 марта

    2013