Clojure@Echo 02 Библиотеки, web-стек, ClojureScript

Clojure@Echo 02 Библиотеки, web-стек, ClojureScript

Третья лекция цикла Clojure@Echo
Видео: https://vimeo.com/clojure-at-echo-02

4188c62c28a196e3e82363217c56fca5?s=128

Nikita Prokopov

July 25, 2012
Tweet

Transcript

  1. Echo // Ульяновск, 2012 # Clojure@Echo 02 ## Технологии вокруг

    Clojure clojure-toolbox.com clojars.org
  2. Echo // Ульяновск, 2012 # Leiningen ## Project automation Управление

    зависимостями Сборка Тестирование Packaging REPL Интеграция
  3. Echo // Ульяновск, 2012 # Leiningen ## Устройство Использует maven

    repos Значительно проще! Расширяемый
  4. Echo // Ульяновск, 2012 # Leiningen ## lein2 Профили Загрузка

    on demand
  5. Echo // Ульяновск, 2012 # Leiningen ## Пример (defproject leiningen.org

    “1.0.0” :description “Generate static HTML for lein” :dependencies [[enlive “1.0.1”] [cheshire “4.0.0”] [org.markdownj/markdownj “0.3.7”]] :main leiningen.web)
  6. Echo // Ульяновск, 2012 # Clojure contrib clojure.test tools.logging data.json

    data.xml core.match core.logic core.cache algo.monads …
  7. Echo // Ульяновск, 2012 # UI ## Seesaw Unified API

    Composable functions Binding + pipeline processing CSS селекторы по формам Динамизм!
  8. Echo // Ульяновск, 2012 # Avout Распределенный MVCC Ref-ы, atom-ы

    и транзакции между машинами Distributed locks Zookeeper или mongodb-backed
  9. Echo // Ульяновск, 2012 # Storm Обработка потоков данных в

    реальном времени Предоставляет инфраструктуру Произвольные топологии Быстрый Гарантирует обработку Живучий Любые языки
  10. Echo // Ульяновск, 2012 # SQL ## Korma (select users

    (aggregate (count :*) :cnt) (where (or (> :visits 20) (< :last_login dt))))
  11. Echo // Ульяновск, 2012 # SQL ## ClojureQL (-> (table

    :users) (project [:id :name :email]) (sort [:id#asc]) (take 5) (drop 2))
  12. Echo // Ульяновск, 2012 # Incanter Charting & visualization functions

    Mathematical functions Statistical functions Matrix & linear algebra functions Data manipulation functions
  13. Echo // Ульяновск, 2012 # Pallet Deployment/provisioning automation Облачные провайдеры

    ч/з jcloud Сервера ч/з ssh/bash Скриптуется ч/з clojure, порождающую bash
  14. Echo // Ульяновск, 2012 # Typed Clojure (ann use-map [(HMap

    {:a Number}) -> Number]) (defn use-map [a] (get a :a))
  15. Echo // Ульяновск, 2012 # IDE ## Swank + SLIME

    Компиляция eval Отладка Документация Есть lein-swank
  16. Echo // Ульяновск, 2012 # IDE ## Другое Eclipse —

    Counterclockwise Idea — La Clojure
  17. Echo // Ульяновск, 2012 # IDE ## LightTable

  18. Echo // Ульяновск, 2012 # IDE ## LightTable

  19. Echo // Ульяновск, 2012 # Web-стек

  20. Echo // Ульяновск, 2012 # Ring ## to rule them

    all github.com/ring-clojure/ring/blob/master/SPEC request map → response map
  21. Echo // Ульяновск, 2012 # Ring ## Request & response

    maps {:keys [uri query-string request-method headers body …]} {:keys [status headers body]} →
  22. Echo // Ульяновск, 2012 # Ring ## Выводы Нет реализации

    — нет зависимостей, багов, етц Маленькая — легко реализовать Низкоуровневая Вход-выход — просто тестировать Веб-сокеты не засунешь
  23. Echo // Ульяновск, 2012 # Ring ## Адаптеры ring-servlet ring-jetty

    ring‑mongrel2‑adapter ring-netty-adapter ring-devel для lein
  24. Echo // Ульяновск, 2012 # Middleware [(req→resp) & opts] →

    (req→resp) ring.middleware: + Sessions + Cookies + Uploads + Form parsing …
  25. Echo // Ульяновск, 2012 # Диспатчинг Moustache (def my-app (app

    [“hi”] {:get “hello world only for GET!”} [“hi” name] {:get [“hello “ name]})) Compojure (defroutes app (GET “/” [] “<h1>Hello World</h1>”) (route/not-found “<h1>Page not found</h1>”))
  26. Echo // Ульяновск, 2012 # Генерация HTML ## 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>
  27. Echo // Ульяновск, 2012 # Генерация HTML ## Enlive Парсинг

    и трансформация HTML Код отдельно от верстки Переиспользование snippets Модификации можно комбинировать Макросы!
  28. Echo // Ульяновск, 2012 # Генерация HTML ## 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”))
  29. Echo // Ульяновск, 2012 # Noir Ring + Compojure +

    Hiccup (defpage “/validate” [] (vali/rule (= 3 3) [:math “3 != 3”]) (vali/rule (= 1 2) [:math “1 != 2”]) (layout [:p “Let’s check your math: “] [:p (str (vali/get-errors :math))])
  30. Echo // Ульяновск, 2012 # WebSockets ## Aleph Сетевая библиотека

    общения по каналам Почти как Ring, только request и response разделены HTTP, WebSockets, TCP, UDP, Redis Ожидаются: socket.io, AMQP, SPDY, BSON
  31. Echo // Ульяновск, 2012 # WebSockets ## Aleph пример (def

    broadcast-channel (channel)) (defn chat-handler [ch handshake] (receive ch (fn [name] (siphon (map* #(str name “: “ %) ch) broad- cast-channel) (siphon broadcast-channel ch)))) (start-http-server chat-handler {:port 8080 :websocket true})
  32. Echo // Ульяновск, 2012 # ClojureScript

  33. Echo // Ульяновск, 2012 # Задача Разработка больших приложений в

    браузере
  34. Echo // Ульяновск, 2012 # Проблемы Рост кодебазы Коллективная разработка

    Взаимодействие со сторонними библиотеками Оптимизация, отладка
  35. Echo // Ульяновск, 2012 # Не-решения CoffeeScript — ничего не

    меняет в семантике
  36. Echo // Ульяновск, 2012 # Решение Семантические проблемы: состояние, иммутабельность,

    ФП, макросы, строгая типизация, протоколы
  37. Echo // Ульяновск, 2012 # Решение-2 Одно стандартное решение для

    стандартных проблем: неймспейсы, управление зависимостями, структуры данных, типовые операции
  38. Echo // Ульяновск, 2012 # Решение-3 ## Компиляция в JS

    Может увеличить производительность Снимает browser quirks
  39. Echo // Ульяновск, 2012 # Как это работает Компилируется на

    «большой» Clojure Генерирует Javascript под Google Closure Compiler Оптимизируется Google Closure Compiler Зависимости ч/з Goolge Closure Library Персистентные структуры данных
  40. Echo // Ульяновск, 2012 # Штуки Browser-connected REPL Reader (общий

    формат передачи данных клиент-сервер) Интероп Библиотеки подключаются и используются Enfocus — enlive в браузере
  41. Echo // Ульяновск, 2012 # Недостатки Дебаггинг (ждем source maps)

  42. Echo // Ульяновск, 2012 Никита Прокопов tonsky.livejournal.com Echo, Ульяновск 25

    июля 2012 aboutecho.com echorussia.ru Обсуждение лекций: tonsky.livejournal.com/tag/clojure