This page is not created by, affiliated with, or supported by Slack Technologies, Inc.
2016-02-18
Channels
- # admin-announcements (3)
- # announcements (7)
- # aws (1)
- # beginners (76)
- # boot (340)
- # cider (9)
- # clara (35)
- # cljs-dev (7)
- # cljsjs (16)
- # cljsrn (11)
- # clojars (1)
- # clojure (192)
- # clojure-dev (6)
- # clojure-madison (8)
- # clojure-russia (373)
- # clojurebridge (1)
- # clojured (9)
- # clojurescript (172)
- # community-development (1)
- # core-async (2)
- # cursive (7)
- # data-science (2)
- # datomic (12)
- # devcards (1)
- # dirac (63)
- # emacs (3)
- # events (10)
- # gsoc (3)
- # hoplon (1)
- # jobs (1)
- # juxt (20)
- # ldnclj (4)
- # lein-figwheel (12)
- # leiningen (1)
- # off-topic (21)
- # om (232)
- # onyx (64)
- # parinfer (8)
- # proton (21)
- # re-frame (8)
- # reagent (1)
- # ring (3)
- # ring-swagger (3)
- # slack-help (4)
- # spacemacs (6)
- # testing (3)
Ребята, а кто-то сюда скидывал недавно ссылку на какой-то явовский хттп сервер весь на билдерах такой и типя няшый. Напомните? artemyarulin ?
не оно?) http://netty.io
может этот? http://undertow.io/
я его случайно нашел вот в этом бенче (https://www.techempower.com/benchmarks/#section=data-r11&hw=peak&test=plaintext), аж на 50% быстрее нетти. Сам не пробовал
слежу за ним в надежде что автор запилит статью о том как он добился таких цифр
кстати народ - никто не использует code coverage тулзы для кложуры? я вроде видел пару проектов на эту тему, как оно там вообще?
ну враппер то можно по быстрому написать на кложуре, чтоб было идеоматично
и тут недавно открываю стейджинг свой, а оно мне говорит "слишком много открытых файлов"
я с ними конечно не очень красиво обхожусь, но gc их наверное мог бы поубивать, что ли
(<!! (httpc/request (httpc/client) {:url url :method method :body data}))
отакое делаю
<!! это core.async?
ну канал может не закрывается
какоф профит то кста всего этого? Ну т.е. client-side rendering 3s, server-side 0.5s или как?
эм, браузер наверно. Или там что решаешь?
второстепенный профит - ты открываешь сайт и сразу видишь контент, и там еще за секунду-полторы реакт развешивает хендлеры и все дела
а node vs jvm тоже ацкий, во-первых не надо менеджить пул нод, а только 1 процесс жабы
пацаны еще так делают http://stackoverflow.com/a/35058951/1128985
(def pool (ref ['a 'b 'c]))
(defn take' [pool]
(dosync
(let [[h & t] @pool]
(ref-set pool (vec t))
h)))
(defn put [pool x]
(dosync
(alter pool conj x)
nil))
да, это уже найс, ща доделаю своё страшко и покажу, вдруг я зря развлекаюсь и надо просто этот ref взять :))
тут, правда, было бы неплохо дописать автоматический инит ресурсов, а не самому этот реф заполнять
@asolovyov: а расскажи в двух словах идею, для тех кто не в курсе, интересно
я его создаю, а потом прихожу туда и говорю "дай мне ресурс", если они у него кончились, он создает новый
это понял. а интересно про я тут себе сделал серверный рендеринг на кложурке [11:48] и подменяю клиентский xhr нормальным запросом по хттп к серверу
@asolovyov: а у тебя оно "компилится"?
но! если я делаю
(set! bidi/unmatch-pair
(fn [v m]
(when-let [r (bidi/unresolve-handler (second v) m)]
(str (bidi/unmatch-pattern (first v) m) r))))
думал протокол не подхватывает расширение для моего рекорда кастомного, который я в качестве хэндлера использую
добрый, чудесный, волшебный чатик, не найдётся ли у тебя пары идей, как такое может быть и куда копать?
@asolovyov: ты хочешь пулл для http-коннекшенов?
@asolovyov: подозреваю, что оно не закрое коннект, до тех пор, пока ты не прочитаешь :body. Ты точно ВСЕГДА читаешь бади полностью?
> и rum в jvm у меня жвм8 жс энжин рендерил реакт примерно в 10 раз медленнее v8. и это после разогрева. до разогрева в 100 раз медленнее. так что я поднял рядом процесс с нодой и рендерю через него )
@misha: > (def pool (ref ['a 'b 'c])) тебе тут ref не нужен, достаточно атома. это в десятки раз быстрее
> https://github.com/tonsky/rum/tree/server что это, как работает, где почитать? )
@asolovyov: If you are using httpclient 4.x, the connection manager is called ThreadSafeClientConnManager. See this link for further details (scroll down to "Pooling connection manager").
@misha: stm нужен для координации нескольких рефов в одной транзакции. тут у тебя один реф, ничего ни с чем координировать не надо, все это можно выразить через атом
> https://github.com/tonsky/rum/tree/server вдуплил, хорошая идея, годная, да
@misha: ну и если в рамках добавления в пул у тебя есть какие-то сайд-эффекты (а ты ведь именно ради этого все делаешь, так ведь), то нужно все чуть сложнее
примерно вот так такое делать можно:
(def pool
(atom {}))
(defn with-pool
[f name]
(if-let [res (@pool name)]
@res
(let [delay-f (delay (f))]
(swap! pool assoc name delay-f)
@delay-f)))
получается, что если одновременно 2 треда запросят ресурс из атом-треда – один из запросов выполнится сразу, а второй заретраится
> https://github.com/tonsky/rum/blob/server/src/rum/server_render.clj я правильно понимаю, что это кастомная реализация части того, что реакт делает на клиенте напрямую исполняемая в джаве?
@fxposter: wow, судя по тому ответу на SO, таки нужно просто глобальный клиент сделать и все?
(defn with-pool
[f name]
(if-let [res (@pool name)]
@res
(let [res (atom nil)]
(swap! pool #(if-let [v (% name)]
(do (reset! res v)
%)
(do (let [f' (delay (f))]
(reset! res f')
(assoc % name f')))))
@@res)))
@asolovyov: @fxposter если у тебя есть проблема с ликом дескрипторов, то пул коннектов тебе или заставит его разрастаться бесконечно или задедлочить или по таймауту закрывать будет ) завист от пула
@asolovyov: я пропустил, ты скидывал линк на свой пул? )
там это… кроме всего прочего не совсем понятно, что из себя представляет простой httpclient (сколько чего он хранит внутри и т.д.)
в любом случае - если это вопрос не лика коннекшенов, а именно лика http-клиентов - можно просто в thread local положить клиенты и все
@prepor: https://github.com/mpenet/jet/blob/master/src/clj/qbits/jet/client/http.clj#L336 - body-ch закрывается, когда запрос закончился
но если хочется асинхронной обработки (а иначе зачем тебе вообще это нужно?) то будет молча проебывать
взял бы http-kit просто и обернул его в две строчки в кор-асинк ) там и коннекшен пулинг автоматический )
@misha: вообще можно проще написать
(def pool
(atom {}))
(defn with-pool
[f name]
(->
pool
(swap! #(if (% name) %
(assoc % name (delay (f)))))
(get name)
(deref)))
@misha: ну у тебя другой интерфейс там предполагался, я его не особо осознал ) ну тут короче про то как нужно добавлять в атом вещи с сайдэффектами
а. так тот мопед не мой. если это исключительно иллюстрация атома вместо рефа - тогда всё понятно
кстати, а есть какие-то аргументы в пользу первого, а не второго (скобки вокруг функций одного аргумента в контексте threading макросов)?:
(-> [:a :b] (first))
(-> [:a :b] first)
никаких, курсив оставляет эту форму просто потому что не делает лишнего движения на проверку количества аргументов
заметил, что @prepor написал (deref)
там, где можно deref
, и подумал, может не знаю чего. работать будет и так и так, но без лишней пары скобок - чище
ну у меня код-стайл такой. это все одна сущность "вызов функции", почему они должны выглядеть по-разному? без скобок только кейворды пишу в тред-макросах пишу
кароче я напряг булки и убрал http из серверного рендеринга, оно теперь у меня собирает запрос и идёт исполняет ring-app напрямик; надо канеш потестировать, что все работает, но в теории все кул
@asolovyov: BTW, гугель уже исполняет жабоскрипт-код для индексирования.
@dottedmag: ток очень херово и наказывает тебя
Это уже не хипстер-стартапы, это уже старпёр-энтерпрайз. Хипстер-стартапы все на ангуляре 2.
бросил страничку быстренько и чувака уже все показывается. без подгрузок реакта и его инициализации
рендеринг напрямую реакт-компонентов в хтмл без создания реакт-компонентов это очень хорошо )
@asolovyov: А это у тебя на $dailyjob или что-то побочное?
@asolovyov: конкретно эта рендерилка
@dottedmag: я думаю это основная работа у него
есть ring reload, есть component (с его релоадами в шелле и clojure.tools.namespace). в посте стюарта написано что они не работают вместе, потому что разные версии clojure.tools.namespace и т.д.
@dottedmag: dailyjob
@prepor: yes, прям дико прет меня, когда все заработает клево, напишу пост, чтоб все так делали )
вот я реакт 0.15 жду именно потому, что в нем обещают убрать reactid, а его генерация это немного черная магия
я в 95% случаев угадываю, но у меня есть место, которое я не понимаю, как исправить
> ну лично для нас серверсайд рендеринг это скорость рендеринга прежде всего а почему? Гугл индексирует ведь не часто?
Я для Angular на node.js поднимал phantom.js который отдавал статических HTML. На ректе как я понимаю тот же принцип? Определить что пришел гугл и переправить его на статику. Плюс внутри приложения сделать роутер…. Чтобы все данные брать из урла.
@potapenko: Потому что каждая 0.1s рендеринга на клиенте -- это уходящие клиенты.
@prepor: Кстати, для пререндеринга как раз virtual dom не нужен, а нужно компоненты порендерить.
@potapenko: Если серверный рендеринг есть, то страница грузится уже готовая, и клиент не ждёт, пока реакт прососёт первый дом через себя и нарисует.
Статический дом тянуть не дольше -- нынешний интернет достаточно high-latency, но при этом совсем не bandwith-constrained на объёмах, которые нужны для HTML.
@potapenko: 2016 на дворе, оптимизация производительности (~= customer retention) -- это оптимизация latency.
но в любом случае придется опять рендерить на клиенте? и заменить статику на динамику?
Нет. Идея в том, что реакт видит, что уже отрендерено и говорит "ок, всё в порядке, когда будет эвент -- будем перерисовывать".
@fxposter: Да, это пичаль. Про это выше Пиранья и пишет -- у него в 5% ID'ы не совпадают.
Хотя уже не так страшно, чем ждать, пока он пробудится и нарисует чего-то в первый раз.
а можно узнать о чем идет речь в цифрах? Т.е. клиентский рендеринг на реакте занимает первый раз ТАК долго что это заметно?
вижу смысл только для мобилок, где слабый процессор, и действительно хорошо бы его поберечь. Батарейку Особенно если учесть что человек зашел на 2 секунды. . В остальных случаях вряд ли будет выгода. Лучше библиотеки тащить с CDN и все. Куда полезнее будет.
@artemyarulin: Проблема в том, что рендеринг на клиенте начинается после того, как все статические asset'ы подгружены, а рисование HTML-страницы этим не блокируется.
в 5% ID'ы не совпадают.
Библиотеки с CDN (если это HTTP/1.1) тащить нужно обязательно, про это даже никто не говорит.
в ract 0.15 уже не будет никаких id у элеметов, ждём!
ну рендеринг и статичные ассеты не обойти никоим образом в любом случае
ааа, я понял - на сервере же данные еще небось фетчатся сразу, т.е. не надо отдавать HTML и потом запускать еще 10500 ajax запросов, так?
во, понял, тут да - реакт не причем, любой клиентский фреймоврк будет этим страдать
На само деле все тут чистый маркетинг, сделал Angular 2 серверный рендеринг (думали, думала и наконец придумали как реакт уязвить гугловские маркетологи), вот реактеры и стали подтягиваться. А медленная загрузка SPA - это дело опять же прямых рук. Макркетинг.
@artemyarulin: Вот тут хорошо про всякое рассказано: http://chimera.labs.oreilly.com/books/1230000000545
@dottedmag: ага, читал давненько - перечитать надо
@potapenko: А в ангуляре2 сервер рендеринг прям из коробки? А как? тока с нодой небось или фантом и прочее тащить надо?
Там как раз глава 10 про то, как HTML/CSS/JS между собой взаимодействуют и блокируют друг друга.
@artemyarulin: ага, я так понял. они это как однв из главных фич рекламировали сразу.
ну как я понимаю эта проблема встает далеко не сразу - на хелло ворлдах и бложиках разница будет незаметна
я имею ввиду эти оптимизации
простите, не знал что тут чуваки оттуда сидят 😛
оо, чота подумалось что всякие ом-нексты и прочие фреймворки (да даже реактовский редукс) с одним глобальным стейтом - можно же прям на сервере все данные для пользователя вытащить и замержить прям в html
и можно это делать хоть жсон, хоть edn, чо есть на беке вобщем. И не нужен секес с фантомами и фреймворк агностик по идее, ненужны костыли для реакта
ну ага. Просто я не уверен что дорасту до момента когда у меня рендеринг первый прям начнет тормозить, а вот лишний round-trip до сервака избежать прям самое то
ну в этом смысле да, хорошо, чем легче сделать тем меньше нареканий тех же SEO-шников к SPA. Вот только не могу понять почему самому же гуглу не индексировать SPA, поддержать так сказать прогресс...
@artemyarulin: Хороший тост: за то, чтобы дорасти до оптимизиации round-trip'ов :)
я тут читаю понемногу шо вы написали и хочу сказать что скорость рендеринга нереально круче
а знаете скока у меня таких клиентов? кто там ретины себе покупает, посетители дисконта?
есть несколько пустей решить одно и тоже, можно и на клиенте по-оптимизировать, а если страшно сломать и там полный бред - то серверная генерация она хорошая альтернатива, я считаю. Еще за это денег срубить, под модную фишку то.
просто гифка криво склеена , http://ezgif.com/split/148de2fb44.gif
>а с реактом захожу и вижу спиннер может 300, может 500 мс @asolovyov: ну вот, т.е. проблема то не в рендеринге реакта - проблем в том что за данными надо еще раз сходить на сервак. Т.е. можно былоб заэмбедить данные в index.html и добиться того же не трогая реакт вовсе Другое дело что чтоб заэмбедить их не так просто может быть да, может проще и весь реакт прогнать на серваке
@artemyarulin: проблема во всем подряд
прям вот именно рендеринг сам? без HTTP запросов? У тебя большое приложение?
дада, я понимаю что не мгновенно ессно
ага, если не сложно, интересно очень
я просто счас тоже на реакт новый проект пилю - если он действительно тормозит при рендеринге, то надо сразу будет дизайнить приложение чтоб на сервере рендерилось
@asolovyov: ну что там? меряешь?
bhavenger: welcome