Fork me on GitHub
#clojure-russia
<
2017-02-20
>
ilevd05:02:41

А есть какая-нибудь либа типа, (minify-html-js-css (response page)) чтобы страницу ужать?

ilevd05:02:56

А он именно пробелы сократит? Переносы строк?

ilevd05:02:55

А про gzip, да, забыл, надо посмотреть будет ли профит с него)

ilevd05:02:39

gzip включен и так, надо что-нибудь типа такого http://kangax.github.io/html-minifier/

ilevd05:02:07

На 20% сокращает, неплохо

kxepal07:02:36

@troglotit за ядро кложи - спасибо. На счет боевого ML. Боевой ML это не столько код в продакшене, сколько тьма экспериментов, проверок гипотез и всего прочего. И далеко не факт что результат будет успешным и уйдет в продакшн. Зачастую бывает что нет. Только когда уже станет ясно, что эксперемент норм, качество растет, roc auc повысился, тогда уже модель можно вкручивать в прод. А потом продолжать ее дорабатывать. И тут менять язык и реализацию немного неудобно т.к. получается двойная работа которую никто не оплатит. Это когда станет понятно, что с модель уже никак не улучшить, а ее качества достаточно для бизнеса, тогда да, можно переделывать на скалку. А с драйверами к кафкам и онлайн обучением у питона тоже все нормально: пользуемся. На счет деплоя питонячих ноутбуков: можно да, руками переносить, если не лениво. Можно в ноутах писать сразу production ready код и встроенным макросом сохранять его в файл (привет, литературное программирование). Можно даже запускать ноутбуки как микросервисы (: Тут есть варианты.

dottedmag08:02:49

@ilevd Сконвертировать в Hiccup и ужимать Closure Compiler'ом

ilevd08:02:27

@dottedmag Заюзал https://github.com/serg472/htmlcompressor с Closure Compiler-ом, а зачем в hiccup?

ilevd09:02:42

Понял, сейчас Selmer использую.

potapenko10:02:45

@kxepal вот уже машинки готовые раздают на AWS с TensorFlow, питоном, CUDA и Jupyter из коробки…

dottedmag10:02:44

@ilevd Затем, что CC умеет минифицировать джаваскрипт, а минифицировать HTML он не умеет.

kxepal11:02:14

@potapenko круто, но у нас своя инфра для ML (:

dottedmag17:02:11

Господа, а расскажите, кто как готовит CSS и картинки? Closure Compiler - это круто, но только для HTML ведь.

kuzmin_m18:02:52

@dottedmag я предложу, наверное, не очень популярное решение, но тем не менее. ИМХО нужно делать нечто на тех технологиях, которые для этого предназанчены. Писать фронтенд на clojure можно, но бессмыссленно. ClojureScript по определению вторичен и не может успеть за js. Невозможно найти верстальщика, который будет верстать в css data dsl. Под фронтендом я тут подразумеваю верстку и логику отображения. Итого весь фронтенд можно писать на изначальных веб технологиях вроде react, postcss, ES6+ и собирать все это с помощью webpack. Webpack так же умеет встраивать картинки в сss через base64. Webpack выдает один js файл с включенным в него css. Этот файлик удобно подключать в clojurescript проект. На clojurescript пишется сама бизнес логика, использующая фронтенд. Из кложи удобно работать с компонентами реакта через реагент. Если интересно, я могу показать примеры.

fatwebdev18:02:42

@kuzmin_m покажите примеры если не сложно

kuzmin_m18:02:23

https://github.com/darkleaf/quester я еще не закончил фичу, но вот интеграция js сборки в clojure https://github.com/darkleaf/quester/pull/56/files#diff-e9d92ef27ccb32d86196f716e23e8f4eR8

kuzmin_m18:02:26

чтобы не было проблем при optimization level advanced пришлось извернуться https://github.com/darkleaf/quester/pull/56/files#diff-99d49414962939ea6e02660c6fb059adR32

kuzmin_m18:02:33

резолвить через функцию

kuzmin_m18:02:28

тут используется css модули

kuzmin_m18:02:44

это избавляет от глобального пространства имен css

fatwebdev18:02:09

спасибо буду (пытаться) разбираться Оо

kuzmin_m18:02:00

кроме проекта стоит посмотреть пулл-реквест, там значительный рефакторинг

kuzmin_m18:02:07

но еще не доделал(

kuzmin_m18:02:22

@fatwebdev задавайте вопросы или тут или в личку

savelichalex18:02:47

@kuzmin_m я правильно понял что ты предлагаешь компоненты которые используют стили писать в js и потом их дергать из cljs?

kuzmin_m18:02:01

типа того

kuzmin_m18:02:07

есть 2 типа логики

kuzmin_m18:02:13

бизнес и презентационная

kuzmin_m18:02:32

презентационная это слайдер, попапы, галереи

kuzmin_m18:02:44

там может быть даже локальное состояние

kuzmin_m18:02:00

и да, удобно использовать css модули

kuzmin_m18:02:15

и уже эти кирпичики дергать из cljs

kuzmin_m18:02:54

бизнес это роутинг доступ к данным логика, валидация

kuzmin_m18:02:15

это концептуально

kuzmin_m18:02:21

а в реализации есть проблема

kuzmin_m18:02:35

например у вас есть галерея

kuzmin_m18:02:43

и слайды можно редактировать

kuzmin_m18:02:50

получается что-то вроде такого

kuzmin_m18:02:16

этот BusinessItem из clojure

savelichalex18:02:29

мне кажется тут больше проблема что ClosureCompiler не работает как webpack и все

kuzmin_m18:02:00

давай я мысль доформулирую

kuzmin_m18:02:18

так вот, BusinessItem содержит код на кложе, и получается, что PresentGallery знает про кложу а такого быть не должно в этом случае все просто, BusinessItem предается как this.props.children но бывают случаи сложнее и как решение - использование DependencyInjection компоненты получают свои зависимости чреез props в cljs коде есть самописный DI container

kuzmin_m18:02:49

> мне кажется тут больше проблема что ClosureCompiler не работает как webpack и все clojurescript вторична она не может успеть за всем

kuzmin_m18:02:24

да, сделали интеграцию с npm, их в jar пакуют но лучше ли это родного npm?

kuzmin_m18:02:02

имхо фронтенд надо на родных технологих делать

kuzmin_m18:02:20

но логику на cljs

savelichalex18:02:32

так children и есть prop

savelichalex18:02:18

че то я не понимаю, какие то сложности ради того чтобы css-modules юзать

kuzmin_m18:02:03

этот проект учебный есть разные технологии под разные типы проектов

kuzmin_m18:02:19

наверное, бложек или админку можно на css сверстать

kuzmin_m18:02:33

большой портал или приложение уже невозможно

kuzmin_m18:02:40

нужны инструменты

kuzmin_m18:02:49

автопрефиксер, переменные, модули

savelichalex18:02:52

по моему все просто, пиши css в cljs и не парься

kuzmin_m18:02:06

для определенных проектов

savelichalex18:02:13

нафиг нужно такое нагромождать

savelichalex18:02:29

верстальщик так же не будет тебе react компоненты писать

savelichalex18:02:35

проходили, знаем

kuzmin_m18:02:44

есть разные верстальщики

dottedmag18:02:55

которые умеют - дорогие.

kuzmin_m18:02:10

можно самому разбить на комопненты квадратиками показать про модули и дать делать

kuzmin_m18:02:33

причем верстка не зависит от кложи

dottedmag18:02:35

это дорого, опять же.

kuzmin_m18:02:42

разные проекты

kuzmin_m18:02:46

разные подходы

kuzmin_m18:02:13

я просто один из способов показыват

kuzmin_m18:02:34

когда фроннтенд делается на своем стеке и от cljs никак не зависит

kuzmin_m18:02:49

кстати, те же модули можно без webpack делать на выходе будет json с преобразованием классов “class_name”: “SomeHash"

seryh18:02:26

>Писать фронтенд на clojure можно, но бессмыссленно. ClojureScript по определению вторичен и не может успеть за js. ИМХО конечно, но по мне так это JS догонять ClojureScript еще лет 5 нужно.

kuzmin_m18:02:03

тут речь о инфраструктуре

kuzmin_m18:02:07

языки - да

kuzmin_m18:02:23

язык clojurescript лучше языка js

kuzmin_m18:02:38

собственно бизнес логику здорово писать на clojurescript например очень полезно шарить код

larhat19:02:13

@kuzmin_m какая у жс инфраструктура? стдлибы то нету

larhat19:02:26

каждый проект обмазан лолдашами, имутаблами, андерскорами, сотней полифилов и бабелем

kuzmin_m19:02:56

webpack istanbul postcss npm

kuzmin_m19:02:09

куча готовых компонентов для реакта

larhat19:02:45

что мешает компонентами для реакта пользоваться из клжс? (https://github.com/little-arhat/llexus-form например)

larhat19:02:56

npm зачем нужен? https://cljsjs.github.io/

kuzmin_m19:02:11

ты работал с webpack?

larhat20:02:26

зачем мне webpack с cljs?

larhat20:02:35

(и rum, например ;) )

kuzmin_m20:02:59

это стандарт в фронтенд разработке

larhat20:02:40

эта фраза ничего не значит, прости

seryh20:02:24

во фронтенд разработке не могут определится как писать ) ооп или функциональщину, какой стандарт

larhat20:02:21

выбирая cljs ты вроде себя освобождаешь от выборов всех этих?

larhat20:02:45

кроме “мои программисты больше никак не умеют” какие вообще мотивации писать на жс?

kuzmin_m20:02:48

я выше описал подход когда фронтенд делается на изначальных технологиях а логика пишется на cljs причем фронтенд может независимо разрабатываться так же есть разные команды, с разными ресурсами и потребностями кому-то этот подход может показаться интересным кому-то нет я занимаюсь этим проектом около полугода и не могу в 2х словах объяснить все проблемы и решения к которым я пришел

kuzmin_m20:02:35

повторю еще раз фронтендом я тут называю презентационную часть

prepor20:02:48

> автопрефиксер, переменные, модули автопрефиксер пишется в 5 строк и есть в гардене

prepor20:02:53

переменные и модули и так есть

prepor20:02:32

> istanbul каверейдж тулы есть, postcss ненужное говно, npm ничем не лучше мавена

prepor20:02:57

> куча готовых компонентов для реакта и все что с ними можно сделать это выкинуть и забыть

prepor20:02:08

в целом, у меня совершенно противоположное мнение, это у жс инфраструктура уже сейчас на столько отстала от клжс, что и не догонит никогда, смысла писать на жс, а не на клжс вообще не вижу никакого (кроме отдельных узких случаев), особенно сложные UI-программы

kuzmin_m20:02:38

@prepor а есть какие-то опенсорс примеры?

kuzmin_m20:02:52

нет, пример проекта

prepor20:02:00

из всего вышеперечисленного только webpack имеет какую то ценность, но при этом оно такое большое и такое говно и так активно переписывается boot-сообществом, что скоро тоже не будет актуально

prepor20:02:15

ну кто там опенсорсил свое

prepor20:02:24

ci-сервис

kuzmin_m20:02:49

можно ссылку?

prepor20:02:45

это если говорить о больших опенсорс аппах

kuzmin_m20:02:39

они bower используют и less а не garden

prepor20:02:21

ну я не по этому принципу выбирал пример )

kuzmin_m20:02:49

может еще какие-то примеры есть? мне интерено посмотреть на чужой опыт

larhat20:02:23

я не думаю, что проектов много на клжс, на жс проекты тоже вроде не каждый выкладывает вроде?

dottedmag20:02:18

LightTable ещё на cljs их проектов.

dottedmag20:02:29

Этим открытые проекты на cljs вроде как и заканчиваются 😃

dottedmag20:02:37

Кстати, чем плохи готовые React-компоненты? Можно их взять и использовать.

dottedmag20:02:42

@prepor А какие отдельные узкие случаи, кстати? Я так прикидывал, что даже скрипты для эмбеддинга на веб-страницы, где размер важен, вполне себе компилятором ужимаются до приличного вида.

prepor20:02:05

120кб для хелло ворлда все же не для всех "приличный вид", так вроде было когда я мерял

dottedmag20:02:32

Да ну, у меня до 2 кб ужималось. Как-то раз в cljs регрессия была, что hello world тащил за собой кучу кода.

prepor20:02:26

какие 2 кб

dottedmag20:02:52

Такие. Небольшая шапка и тело, укомпилированное до console.log("Hello World").

prepor20:02:55

вот тут даже пишут

prepor20:02:01

> Examine out/main.js, the file size should be around 80K.

dottedmag20:02:19

Странно.

prepor20:02:44

ну покажи как ты (prn "Hello world") компилишь в 2кб

andre20:02:50

подтверждаю 80кб, 2кб точно странно

larhat20:02:00

там же рантайм и стдлиба, и дедкод только от goog closure, не?

dottedmag20:02:12

А, я не prn, а (.log js/console).

dottedmag20:02:44

@larhat рантайм и стдлиба должны CC обрезаться, иначе смысла в нём нет.

prepor20:02:03

в общем в любой маломальски умеющей что-то клжс аппе будет несколько десятков тысяч строк рантайма

prepor20:02:52

+ клжс все же не для перфоманс критикал вещей. некоторые вещи, стоит писать не на нем

dottedmag20:02:13

performance-critical на JS? 🙂

dottedmag20:02:37

Ничего не приходит в голову, кроме как опять же скриптов для client-side analytics.

prepor20:02:54

во-первых, для браузера вариантов все равно нет, во-вторых, мало ЯП таких же шустрых как современный жс

dottedmag21:02:21

Господа, а как бы покрасивее написать

(fn [s] (or (not (contains? s :selection))
  (< (:selection s) (count (:matching s)))))
?

dottedmag21:02:55

Т.е. если :selection в карте, то он должен быть меньше количества item'ов в :matching

Roman Liutikov21:02:12

@prepor Попробовал бы ты рассказать об этом стандартному жс деву. Я могу быть неправ, но мне кажется на жс много гонят от незнания всего, что там происходит. Хотя и со многим я согласен.

mike_ananev21:02:19

@kuzmin_m на cljs примеры проектов? https://precursorapp.com

mike_ananev21:02:05

это для дизайнеров

larhat21:02:31

@dottedmag (defn x [s] (boolean (when-let [sel (:selection s)] (< sel (-> s :matching count))))) ?

larhat21:02:56

(это если прямо true/false нужно)

dottedmag21:02:12

@larhat Вернёт nil, если :selection отсутствует. Не годится.

larhat21:02:26

@dottedmag не, boolean же

larhat21:02:30

(x { :matching [9 2]}) false

dottedmag21:02:50

Ну, значит вернёт false. А если :selection нет, то нужно вернуть true.

larhat21:02:56

а, сорян! %)

larhat21:02:56

ну тогда я б так (defn x [{:keys [selection matching]}] (if selection (< selection (count matching)) true))

larhat21:02:07

тупо и вроде понятно

dottedmag21:02:19

В #clojure подсказали такой же вариант с точностью до whitespace 🙂

larhat21:02:27

с or вот видишь, я наебался когда читал!

larhat21:02:36

а я даже не пьяный %)

dottedmag21:02:37

а, тут if.

larhat21:02:45

пойду гляну что там

dottedmag21:02:52

там просто деструктуринг добавили

larhat21:02:54

а, с or тоже

larhat21:02:32

кмк с if понятнее, но это может быть вкусовщина

dottedmag21:02:52

Жалко, что -> уже заюзано. Не хватает оператора логической импликации.

dottedmag22:02:43

"почти следует" 🙂