This page is not created by, affiliated with, or supported by Slack Technologies, Inc.
2016-04-13
Channels
- # admin-announcements (2)
- # beginners (27)
- # boot (85)
- # cider (24)
- # cljs-dev (20)
- # cljsrn (16)
- # clojure (73)
- # clojure-brasil (2)
- # clojure-czech (152)
- # clojure-dusseldorf (7)
- # clojure-france (3)
- # clojure-japan (1)
- # clojure-norway (1)
- # clojure-poland (7)
- # clojure-russia (140)
- # clojure-uk (7)
- # clojurescript (66)
- # cursive (20)
- # datomic (8)
- # emacs (7)
- # events (1)
- # hoplon (325)
- # jobs (2)
- # jobs-discuss (69)
- # leiningen (3)
- # off-topic (6)
- # om (48)
- # onyx (82)
- # parinfer (1)
- # planck (10)
- # re-frame (53)
- # reagent (8)
- # ring (103)
- # untangled (13)
- # yada (14)
source-sum
(fn [source]
(let [case (format "case when source='%s' then 1 else 0 end" source)]
[(sql/call :sum (sql/raw case))
(format "source_%s" source)]))
not-sources-sum
(fn [sources]
(let [cond (format "source is null OR (%s)"
(apply str (interpose " AND " (for [s sources]
(format "source<>'%s'" s)))))
case (format "case when %s then 1 else 0 end" cond)]
[(sql/call :sum (sql/raw case))
"source_other"]))
data (-> {:select [:publisher_id
[:%count.* :count]
[:%sum.revenue :revenue]
[:%avg.revenue :mean]
[:%count.%distinct.customer_id :buyers]
[:%sum.rewards :rewards]
(source-sum "twitter") (source-sum "vk") (source-sum "facebook")
(source-sum "odnoklassniki") (source-sum "email")
(not-sources-sum ["twitter" "vk" "facebook"
"odnoklassniki" "email"])]
:from [:publisher_orders]
:where [:and
[:>= :created_at (->sql-time from)]
[:< :created_at (->sql-time to)]
[:= :site_id (:id site)]
[:in :state ["new" "confirmed"]]]
:group-by [:publisher_id]
:order-by [[sort_by direction]]
:limit limit}
(?> campaign_type (sql-h/merge-where [:in :campaign_type campaign_type]))
(jdbc/query (:db graphs)))
насчет style guide который тут пробегал https://github.com/bbatsov/clojure-style-guide почему рекомендуется вместо родных джавовских функций для строк использовать клоджуровские. например, чем
(clojure.string/upper-case "bruce")
лучше (.toUpperCase "bruce")
? массивы тоже Avoid the use of Java arrays, except for interop scenarios and performance-critical code dealing heavily with primitive types
о. кстати, кто скажет, почему нельзя сделать map с .method
это специально чтобы делали clj функции или случайно?
а как core.async физически каналами работает? каждый канал - новый поток. или он использует некий ограниченный пул, с worker threads паттерном?
в cljs: каждый канал - свой поток
@razum2um: можно вот так вызывать - (map (memfn charAt i) ["fred" "ethel" "lucy"] [1 2 3])
@seryh для go-макросов создается фиксированный пул воркер-тредов, для thread-коллов динамически растущий. сам канал это просто структура данных, он никакие потоки не использует
а на практике имеет смысл использовать блоки thread? go блоков вроде вполне хватает для любых задач
нет, не для любых ) если ты собираешься делать долгие блокирующие операции в рамках го-макроса, то, скорее всего, лучше этого не делать
а разница в том, что clojure-fn это по-факту обьект который можно референсить с точки зрения java, а метод - нет.
причины, почему нельзя конвертировать их автоматически в методы, если они используются не первым аргументом функции наверное можно было бы, но решили не делать
> а на практике имеет смысл использовать блоки thread? go блоков вроде вполне хватает для любых задач
правило простое:
- CPU-bound tasks — в go
- IO tasks — в thread
все в го - нынче время асихнронщины, нода, коллбеки, кумунизм!
@fxposter: Да, не макро, а специальная форма. А #()
-- макро чтения, вот и не стыкуется. Такие дела.
> ну на самом деле ты не будешь в обычном go-блоке делать busy read из сокета в канал даже чтение из базы может оказаться busy
смысл в том, что IO операции не паркуются, а прелесть go в парковке без утилизации полноценных тредов
непонятно было, чем busy read из сокета отличается от просто чтения из сокета — в контексте обсуждения core.async
я когда в прошлом разбирался, что такое длительные операции ввода-вывода, у меня тоже было представление, что это как-то связано с длительностью операции
паркуются же только асинхронные операции с каналами, типа >!
, <!
, все остальное будет блокировать тред, не важно CPU или IO
> смысл в том, что IO операции не паркуются асинхронные IO операции прекрасно паркуются
и IO bounded операции как раз, как правило, хорошо делать асинхронными (если речь идет про сеть)
https://www.youtube.com/watch?v=Fh529ExAtjI @asolovyov в прямом эфире про реакт на серверсайд
ребята вопрос: а если я через докер запускаю апп, то какую мне директорию надо подмаунтировать, чтобы он каждый раз мне зависимости не устанавливал при ребилде.
> асинхронные IO операции прекрасно паркуются для вызывающей стороны это уже не IO создание тредов уходит на сторону, обеспечивающую асинхронность каюсь, речь шла именно о блокирующем IO
> и IO bounded операции как раз, как правило, хорошо делать асинхронными (если речь идет про сеть)
поэтому и есть thread
> (но как правило апи все же синхронные в джаве) иногда асинхронность не нужна превращать асинхронный код в синхронный — получается перебор
React Native приходит на венду, ееее
Вобщем RN это новый QT https://ericroz.wordpress.com/2016/04/11/f8-app-on-windows-10-mobile/ ну ништяк ащще, пойду линкедИН обнволю 😄
@sasha: ~/.m2 ну или где у тебя локальная репа мавена, у меня был пример где-то, но я щас не с компа
@asolovyov: да, к сожалению на самых интересных местах вырубало :(так и не понял как же все это работает
у тебя макрос defc когда компилируется в JS, то в конце выдает код с (js/React.createClass (преобразовать миксины, имя, аргументы и бади в объект для реакта))
https://github.com/tonsky/rum/blob/gh-pages/src/rum/core.clj#L39 - смотри, вот -defc
это функция, которая собственно мясо макроса defc
и если мы щас в cljs, то вот этот build-class - https://github.com/tonsky/rum/blob/gh-pages/src/rum/core.cljs#L16
но если мы в clj, то build-class вот - https://github.com/tonsky/rum/blob/gh-pages/src/rum/core.clj#L101
и на сервере это просто функции, которые принимают пару аргументов и возвращают hiccup-о-подобную структуру данных
тебе никто не мешает js не генерировать и не отдавать, конечно, и все рендерить на сервере
потому что смотришь на все эти обертки реакта или виртуального дома - и видишь что они в плане разнесения логики на отдельные, независимые части - на уровне прошлого века
ну разве что с менеджментом хранилища он его сделает не глобальной переменной, конечно
если у тебя есть прям идеи как это сильно полечит какую-то часть жизни, я б рад послушать
не только старт, но и тот факт, что у тебя все находится или в компоненте или инжектится
но меня например сча вообще всякий стартап и прочая херня вокруг него вообще минимально беспокоит; а вот тот факт, что на андроиде у меня аппа тормозит - ото да )
у меня есть мысли, что это может поломать весь подход с глобальным стейтом и так далее
@andfadeev: thanks
с другой стороны - все эти flux-ы, redux-ы и прочие “архитектурные паттерны” заставляют меня плакать немного
https://github.com/krisajenkins/petrol мне вот эта бодяга как-то понравилась
но я честно говоря реально не понимаю, каким образом ты противопоставляешь flux - компоненту
а он тебе навязывает определенный флоу того как все работает, с более-менее жесткими связями между частями
и я даже не противопоставляю, я просто о том, что “flux и его потомки” - это теперь “венец архитектурного строения” и о “decoupled components” думать уже не надо
по крайней мере смотря на фреймворки появляющиеся на фронтенде - выглядит именно так
с другой стороны каких-то конкретных претензий у меня нет. скорее “общее чувство, что комьюнити что-то упускает, о чем дядя Боб уже предупреждал всех не раз"
ну слушай, я вообще строил-строил архитектуру, а теперь у меня все данные получаются одним миксином:
(mixins/query :name-in-state (fn [data args-of-component] (get-in data [:some :path]))
и все. При этом ссылка на атом, в котором данные, забита прямо руками в mixins/query, потому что иначе (binding ...)
не срабатывает, всё приложение ходит и смотрит в оригинальный атом, а мне нужен рабочий binding :-))
ну и реально было бы круто декомпозировать, наверное, если б у меня было применение этой декомпозиции
а у меня его нет, толку мне с декомпозиции? приложение одно, отдельные части его нигде не юзаются (и не могут юзаться)
ну т.е. как-то страдать над архитектурой ради страданий... хз, я в этом место уже месяца 2-3 не заглядывал и вроде никто не напрягся ни разу
А зачем декомпозировать на клиенте? Мы ж всей этой хернёй с архитектурой страдаем только для того, чтобы удерживать сложность кода в разумных пределах (не добавлять к сложности предметной области слишком много сложности реализации). Где там серьёзная сложность на клиенте, требующая компонентизации более, чем "неймспейсы, чтобы на пятки друг другу не наступать и один атом для стейта"?