This page is not created by, affiliated with, or supported by Slack Technologies, Inc.
2017-06-13
Channels
- # beginners (78)
- # boot (27)
- # cider (13)
- # cljs-dev (41)
- # cljsrn (4)
- # clojure (216)
- # clojure-android (1)
- # clojure-conj (6)
- # clojure-greece (1)
- # clojure-italy (11)
- # clojure-russia (127)
- # clojure-spec (63)
- # clojure-uk (34)
- # clojurescript (68)
- # core-async (5)
- # cursive (5)
- # data-science (1)
- # datomic (4)
- # dirac (11)
- # editors (7)
- # events (1)
- # graphql (12)
- # hoplon (39)
- # jobs (1)
- # liberator (3)
- # lumo (101)
- # off-topic (14)
- # om (3)
- # onyx (3)
- # parinfer (14)
- # re-frame (10)
- # reagent (2)
- # remote-jobs (1)
- # ring-swagger (17)
- # sql (21)
- # untangled (38)
- # vim (3)
- # yada (23)
кстати да, @misha есть ли история почему для map так вышло, была например memfn, депрекейтнули..
народ, а с каким storage driver'ом вы запускаете docker? devicemapper, что по умолчанию у докера для RHEL/CENTOS, не рекомендуется. Судя по описанию zfs самый рекомендуемый. А как его готовите вы?
@razum2um потому что map
на скобках написан, а .
и ..
- на джаве. ну и джава методы не IFn вроде
но это очень неполный ответ
чуваки пишут, что "как методы могут быть first class в кложе, если они не фёст класс даже в джаве?"
Ребята давайте зафоловим и распространим наш новый групповой аккаунт - эту неделю его будет вести Миша!
мип-мип. а на чём можно подключаться к постгресу, и как модно делать самые примитивные миграции? у меня тут новый пустой лайн-проект)
@leov - отсюда можешь повыдергивать - https://github.com/niquola/clj-pg
тогда наверное стоит с базовых вещей начать, db-spec + jdbc и поделать запросы строками, потом навернуть уже каконить пул (hikaricp, c3po и т.д), а потом выбрать dsl для написания sql (honey, hug и т.д)
посоветуйте за архитектурку. нужно реализовать семейство web-скрейперов. в ООП я бы реализовал это примерно так: https://gist.github.com/be9/afec3f30ac6496b4aa3a845116da7ceb а как это грамотно сделать в Clojure?
т.е. скрейпер - это некий набор “методов“, каждый из которых выдирает из сайта свои данные. не все скрейперы поддерживают все методы. и есть состояние, т.е. куки должны обновляться по мере вызова
я б завел один атом для всего, а все остальное сделал бы стейтлесс
и еще бы анально огородил весь IO и передавал httpFetcher бы тоже параметром (который бы в себе уже юзал куки/сессии), при таком подходе покрыть все тестами бы было вааще просто (а со скраперами охота чтоб тесты были, ломается ж от чиха всегда все).
ага - в иделе скраперы круто было бы сделать чистыми функциями, берут на вход транспорт, делают чота, возвращают новые данные + новую сессию. Внешний манагер уже кладет в атом и все делает
Ну ага, это во мне хаскелист проснулся наверно 🙂
ну ага. На каждую итерацию берешь значение стейта из атома, создаешь транспорт с этим стейтом (cookieJar все дела) и передаешь скраперу
а транспорт - это будет замыкание? ну типа
(defn make-transport [session]
(fn [url params]
; что-то мутим с url, params и session
))
@leov я тоже использую joplin. Мне удобно, плюс он умеем миграцию в кучу разных баз делать
@be9 дада, замыкание - poor man object 🙂
ну миграции в clj-pg я не нашел
т.е. по сути 2 стиля - ооп где у каждого скрапепа свой внутренний стейт (может неявный в виде мутирующего транспорта, куки опять же) либо один явный где-то повыше (манагер скраперов какой). Я бы выбрал второе ибо когда пойдут запросы один скрапер вернул что сайт упал, надо остановить все скраперы или логику что только 1 скрапер может дергать один ресурс одновременно и пр. то при втором подходе такое можно будет сделать легко
но я хз, если у тебя там лабораторная работа или в продакшене нужно быть уже вчера то нафег надо конечно 🙂
а, и обязательно скрапь все регэкспами - DOM/XPath/CSS selectors для хипстеров
А ну значит уже в курсе 🙂
ещё вопросик: как подтащить в такой архитектуре connection-pool? его в манагере что ли создавать? https://github.com/dakrone/clj-http#persistent-connections
дак ага, как раз такое и делать там. А как бы это сделал в ОПП стиле?
у каждого скрапера свой бы пул был?
ну даже теже сессионные куки. Проще по дефолту отдать это трансапорту чтоб он сам внутри все мутировал и дергал. А руками уже доп работа
ну это ж контекст, который нужно проталкивать с каждым последующим запросом той же цепочки
тут, наверное, подходы идентичные подходам написания компонентов для юая: "локальный стейт компонента хранить в компоненте, в родительском компоненте или в глобальном атоме?"
а нажатия на кнопочки, меняющие стейт компонента - это аналог запроса, который потом стейт куки мутирует
ну дада, явный контекст пизже конечно 🙂
все плюсы и минусы тупо те же: "шумный функциональный код" против "лаконичного хер отдебажишь кода"
еще конечно тестирование первого просто сказка. У меня счас проект хоть и на TS но IO везде транспортом\параметром передается, test coverage под 100% и всякие сложный кейсы покрываются на ура. Не говоря уж про отсетсвие багов связанных с этим
странно, я б один общий делал
> только переход между состояниями - респонс вместо он-клика скрейперы можно писать синхронным образом
so 1990
@artemyarulin а как бы ты делал?
ну ессно асинхронно все
один сайт отвечает 10 сек, чо теперь ждать чтоль
каждый метод в скрейпере запрашивает одну страницу, что-нибудь там шаманит, потом запрашивает вторую и т.д. пока не угомонится
аа, ты про это ок
я думал прям тред блокируем, ждем все дела)
clj-http.client предлагает коллбэки https://github.com/dakrone/clj-http#async-http-request
вообще я б очередь тасок замутил, а может и не одну
а если превратить скрейпинг в чистый код, с единственным ио - запросом - можно тупо в очередь в атоме писать
> а если превратить скрейпинг в чистый код, не очень понимаю, как это сделать. методы устроены примерно так: 1. запросить страницу A 2. выдрать данные и запросить страницу B 3. и т.д. каждый следующий шаг зависит от предыдущего
всякие http://asp.net и джавовские бекенды сайтов, которые мне нужно скрейпить, любят сабмитить кучу форм, всякие редиректы там, псевдо-редиректы (где страница состоит из одной формы, которая тут же постится в window.onload)
всякие фоллоу-редиректс обрабатываются самим clj-http? или ты руками будешь вот это вот всё?
если за тебя это делается, то у тебя остаются 2 типа функций: - из страницы выпарсить инфу в базу и форму для сабмита - по форме для сабмита получить следующую страницу
если руками, то, впринципе то же самое, только вместо 1 реквеста шага - 5, что бы все редиректы обойти
типа в очередь кладешь таск {:url ... :cookies {...} :formdata {...}}, воркер берет таск из очереди, получает страницу, на основе которой кладет в очередь еще N подобных тасков
суешь очередь в канал, на него трансдюсер, который запросы отправляет, и на конж выступать с докладом едешь
еще слышал, как чуваки пьедестал исключительно для пайплайнов на интерсепторах использовали: http://pedestal.io/reference/interceptors
у меня просто уже есть реализация простецкая. я зашёл сюда узнать, как можно сделать лучше. и понеслась..
У меня сейчас синхронная лапша, интересно как сделать асинхронно без регистрации и СМС :)
если я пишу под ноду, то есть ли способ не городить колбеков вокруг, например, fs.readFile(...)?
Одна беда: жабоскрипт остаётся сам собой и аромат жженого синтаксического сахара никуда не девается..
согласен с @misha - если задача на раз/два то пофег. А если Ынтырпрайз то retry logic, редикерты, очереди, ошибки, логи и прочая. Воркеры и очереди просто проще будет изменять и реализовывать все эти фичи
я уж не говорю про блокировку тредов - с ними у тебя реквестов 5 в секунду в среднем будет от силы
но ок не 5 конечно по “маловато будет“(с)
а если взять RabbitMQ или в каффку складывать например все, да все на амазоне поднять с автоскейлингом то уууу :))
Этим distinction не владею. Простота — это адекватность технических средств решаемой задаче. Тяжесть "лечения" не должна превышать тяжесть "заболевания".
господа, как такое кошернее (билдином каким-то, без рекура самописного) записать?
((fn [x f times]
(loop [n times r x]
(if (zero? n)
r
(recur (dec n) (f r)))))
10 inc 5)
=> 15
@be9 не смотрел https://www.infoq.com/presentations/Simple-Made-Easy что ли?
@misha (reduce inc 10 (range 5))