Fork me on GitHub
#clojure-russia
<
2015-12-18
>
ul07:12:23

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

ul07:12:38

например, пишешь ты реагент

ul07:12:14

и хочешь, чтобы компонент обновлялся, когда изменяется значение твоего самописного атома

ul07:12:29

компонент может устанавливать динамическую переменную

ul07:12:58

а атом в дерефе её подхватывать и оповещать потом компонент в случае своего обновления

artemyarulin08:12:00

@ul: О, прикольная идея

artemyarulin08:12:09

надо обдумать

ul08:12:26

только надо помнить о том, что если выполнение кода откладывается (например, возвращается ленивая последовательность), то в момент выполнения биндинг будет не тот, что во время создания

ul08:12:53

т.е. надёжного способа что-то забиндить по лексическому скоупу нет

ul08:12:12

но, в принципе, если помнить про ловушки, то всё норм

ul08:12:20

вон реагент работает и никто не жалуется

artemyarulin08:12:13

Ага, но как понимаю если что-то можно сделать без них - то лучше без

ul08:12:05

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

ul08:12:13

но иногда ведь хочется немножко магии)

ul08:12:45

например, те же реактивные выражения

ul08:12:51

там эта техника в целом к месту

ul08:12:28

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

artemyarulin09:12:16

хм, ок - буду иметь ввиду, спасиб

rm10:12:33

у меня глупый вопрос. В проекте почему-то есть одновременно figwheel-sidecap и weasel. Я сейчас почитал доку и вижу, что есть figwheel-sidecap.repl-options, который дает мне репл (и много всего еще). Вопрос -- нужен ли мне после этого weasel?

rm10:12:29

хм, ну я вижу, что figwheel можно прямо к piggieback прикрутить одной строкой в конфиге

rm10:12:37

пожалуй, weasel не нужен

artemyarulin10:12:43

не нужен

artemyarulin10:12:51

начиная вроде с версии 4

artemyarulin10:12:55

или пятой

rm10:12:57

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

wwall10:12:36

всем привет. не могу сообразить как решить такое - дан вектор [:da :da :net .....] надо получить такое [[:da :da ] [:net ....]] Подскажите как такое решается

larhat10:12:25

> (group-by identity x)
{:da [:da :da], :net [:net]}
> (partition-by identity x)
((:da :da) (:net))

prepor10:12:58

ну тут таки недостаточно данных ) для этого примера это таки

prepor10:12:06

(partition 2  [:da :da :net :net] )
((:da :da) (:net :net))

wwall10:12:36

мой косяк. неверно описал. По другому объясню

larhat10:12:44

@prepor:

> (partition 2 [:net :da :net])
((:net :da))
я наванговал, что нужно сгруппировать по значению

wwall10:12:05

есть последовательность. в начале у нее может быть сволько угодно :da затем последовательность чего угодно из списка (:da :net :neznayu)

wwall10:12:17

нужно разбить последовательность на 2 части

wwall10:12:26

2 - все остальное

wwall10:12:01

чтобы проще писать - на цифрах - [1 1 2 3 4 1 1 2] должно вернуть [[1 1] [2 3 4 1 1 2]]

prepor10:12:09

или split-with

prepor10:12:13

чот такое )

larhat10:12:25

> (take-while #(= :da %) x)
(:da :da)
> (drop-while #(= :da %) x)
(:net :neznayu)

larhat10:12:28

или так

larhat10:12:42

(где x (def x [:da :da :net :neznayu]))

larhat10:12:12

да, split-with получше будет

larhat10:12:20

> Returns a vector of [(take-while pred coll) (drop-while pred coll)]

prepor10:12:50

именно )

wwall10:12:57

круто! split-with то что надо

wwall10:12:03

мужики - спасибо

rm10:12:56

> #(= :da %) можно так: > #{:da}

wwall10:12:07

а вообще из белгорода есть кто?

artemyarulin10:12:51

прикольно видеть keywords с транслитом simple_smile

wwall10:12:01

да нет там транслита. там :lxmWS - мне проще что-то не относящееся к задаче написать

artemyarulin10:12:09

ааа ок, сорян. /me задумался, умеет ли кложура utf и могу ли я написать (def переменная :мой-ключ)

wwall10:12:45

умеет

wwall10:12:55

так все лиспы работающие с утф умеют

wwall10:12:19

на def еще можно макрос написать

wwall10:12:25

и получаетяс 1С simple_smile

wwall10:12:43

по виду. не по семантике

artemyarulin10:12:19

крутяк, надо будет потролить коллег simple_smile

wwall10:12:02

потролить - это на китайском написать

wwall10:12:23

правда за такое меня оштрафовали однажды

rm11:12:42

а меня за то, что я отлаживал alert-ами, выводил какие-то матюки, а потом не убрал и отправил на прод ^_^

artemyarulin11:12:33

не меня но моего другана сильно выели за то что он по запарке хотел удалить тестового аккаунта на проде и написав DELETE FROM Users осознал что забыл указать WHERE блок trollface

turtle11:12:13

Тут недавно коллега миграции накатил на новый проект, но на старую базу. Дропнулось всё за три года. 😢

turtle11:12:37

Админ из бэкапов восстанавливал, но там какие-то сложности были. То ли база большая-пребольша, то ли ещё что.

turtle11:12:48

Базу mysql - та ещё какашка.

wwall11:12:29

меня вредителем за меньшее называли simple_smile

Kira Sotnikov11:12:00

Когда чуть не забыл where в запросе

andfadeev12:12:47

чет туплю, есть вот такой код

(ns blabla.main
  (:require
    [blabla.some-ns]
    ))
запускаю из emacs cider-jack-in, все ок, делаю cider-refresh и получаю ошибку в одном из тестов, где
(ns blabla.some-test
  (:require
    [blabla.some-ns]
    ))
error compiling some-test, no namespace blabla.some-ns

prepor12:12:50

вангую что ты ошибся с названиями файликов

andfadeev12:12:57

ща еще раз проверю методом орлиного глаза

artemyarulin12:12:34

вангую что проблема с _ <> -

andfadeev12:12:18

не, чтото еще, в именах файлов _ в неймспейсах -

andfadeev12:12:14

выпиливаю в тесте неймспейс этот из require все ок, добавляю фейлится

prepor12:12:39

покажи код!

prepor12:12:49

и дерево файликов

artemyarulin12:12:38

tree command for the rescue!

ponimas13:12:26

@andfadeev у тебя файл с тестом называется так же - blabla.clj

ponimas13:12:46

я неделю назад на эти же грабли наступил

andfadeev13:12:40

файл называется billing_mailer/core_test.clj в нем неймспейс (ns billing-mailer.core-test)

andfadeev13:12:59

блин в cursive все норм, в емаксе не компилится тест

ponimas13:12:04

а в консоли?

ponimas13:12:12

lein whatever

andfadeev13:12:46

в консоли все норм

andfadeev13:12:48

все нашел в чем дело, кто объяснит почему? в тесте было так (:require [blabla.some-ns :refer :all]) и сидер не эвалил этот неймспейс, убрал :refer :all стало все ок

prepor13:12:57

чот ты не договариваешь!

prepor13:12:17

код значит не покажешь?

prepor13:12:17

видишь ли первом твоем "упрощении" не было никаких ":refer :all", а теперь это стало источником проблемы. может ты и еще что-то упростил

prepor13:12:31

так что что б помочь нужно видеть пациента!

konukhov13:12:44

Ребят, у меня вопрос про параллельные вычисления в ФП. Допустим, у меня есть ThreadPool, в котором крутятся воркеры и расфигачивают какой-то массив данных (простой pmap по вектору с урлами, например). + Есть отдельный воркер, который кидает запрос на авторизацию, например. В какой-то момент, когда мы получили 403 в воркере, мне нужно их всех заблокировать, получить новую сессию (общую для всех), передать ее в остановленные воркеры и продолжить работу. Как только опять нужен новый токен, провернуть то же самое. Я сделал так: у меня есть (def session (agent nil)), в котором хранится токен. И есть функция (defn get-session [] (locking lock @session)). В каждом джобе мы делаем get-session, и если дальше получили отказ авторизации, то делаем (send-off session (fn [_] (locking lock (fetch-new-session!)))) и ретраим джоб – он блокируется, пока agent не закончит работу. Как это правильно сделать без mutable конструкций типа agent? И вообще, как такое обычно делается? Без core.async. Мне кажется, @prepor знает точно simple_smile

prepor13:12:43

> Без core.async. и > @prepor знает точно не согласуются

konukhov13:12:48

ха-ха! мне просто кажется, что это классическая задача, и интересно, как в fp такое решается без csp, с простыми тредами или фьючурсами. монаду какую-нибудь сделать или еще что-то.

konukhov13:12:24

с другой стороны, без global стейта не представляю, как всем сказать, что вы мол подождите, пока я вам новую сессию достану.

prepor13:12:57

ну смотри, у тебя должен быть некий "мастер ключей". у него всего из двух методов "дай ключ" (блокирующий) и "мой ключ сломан, наверно стоит обновить".

larhat13:12:25

http://community.haskell.org/%7Esimonmar/papers/haxl-icfp14.pdf и видео соответствующее можно посмотреть ещё %)

prepor13:12:55

вся логика (и стейт) о том что есть ключ, как их обновлять и параллельность этого дело (ее отсутствие точнее) сосредоточено в нем

konukhov13:12:41

о, класс, спасибо за ссылку!

prepor13:12:46

а как ты уже реализуешь этот блокиурющий апи на get-key, кор асинк или мьютексы или еще что — другое дело

prepor13:12:24

никакой прямой связи с фп-методологиями я тут не вижу, просто дизайн интерфейсов компонентов (я не про тот компонент!). в частности как тебе тут haxl поможет я не знаю )

konukhov13:12:43

ага, понятно. ну подход правильный – главное. я почитаю, в общем, спасибо!

prepor13:12:49

haxl inspired кложа либа от нашего соотечественника если что тут https://github.com/kachayev/muse

larhat13:12:07

haxl в презе затрагивает похожие темы — кэш, "схлопывание" реквестов в один и тд. про авторизацию они чот не говорили, да, хотя для них это тоже нужно. https://github.com/facebook/Haxl/blob/master/example/facebook/FB/DataSource.hs здесь протухания ключа, кажется, никак не хэндлят

larhat13:12:31

> как в fp такое решается без csp, с простыми тредами или фьючурсами. в "FP" нету ни csp, ни тредов, ни фьючерсов, непонятно откуда кстати ограничение на коре.асинк — им бы было проще, думаю, с очередью задач, которая отдаёт (key, task) и умеет если чо перезапросить key

konukhov14:12:44

а ограничение на core.async оттуда, что мне интересен скорее подход, чем имплементация, вне рамок модели акторов или csp. буду разбираться с haxl и muse. там в muse есть еще ссылка на подобную либу от твиттера на scala (с finagle, видимо) – stitch – ее тоже надо посмотреть.

ponimas14:12:51

качаев в презе, вроде как, говорил, что stitch не опенсорс

konukhov14:12:03

аа, да, там ссылка-то на видео.

konukhov14:12:32

убийцу storm они тоже не заопенсорсили, гады

niquola14:12:42

Книжицы и статьи - http://steshaw.org/plt/

niquola15:12:57

Помощь группы: я хочу написать компонент где стиль на garden смешан с hiccup - а потом извлечь стиль с иерархией селекторов

(defcomponent [props]
    [:div.class (style {attr: val} [:&:hover ...] ) 
        [:div.child (style ...)]])

-> :style [:div.class {attr: val} [:&:hover ...]
                       [:div.child .....]]
-> :hiccup [:div.class [:div.child ...]]

niquola15:12:47

сделать это в макросе или в функции?

niquola15:12:08

кто-нибудь дерево из дерева извлекал - зиперы?

turtle15:12:33

Не совсем понял что хочется, но зипперы обход дерева делают.

niquola15:12:27

мне нужно из одного дерева два получить

niquola15:12:04

те структура почти сохраняется - а часть нод идет в одно дерево, а другая в другое

turtle15:12:07

Хотя, наверное, волкер лучше.

turtle15:12:14

За один обход?

niquola15:12:25

да пофиг, можно за два

niquola15:12:41

наверно волкером и попробую

turtle15:12:02

Волкером да, попробуй.

turtle15:12:14

Зиппер немного другое.

niquola15:12:18

формально обход может удалять из дерева стили и строить паралельно дерево стилей

turtle15:12:27

Ну просто на выходе новое дерево получишь.

turtle15:12:35

Без стилей.

turtle15:12:58

С параллельным деревом стилей - хз. Может, просто за второй проход отдельной функцией дерево стилей сделать.

niquola15:12:28

сложность с фазой в которой это делать, поскольку если есть [div1 (style1) (for [x xs] [div2 (style 2)])] - надо получить [div1 (style1) [div2 (style 2)]] и [div1 (for [x xs] [div2 ])]

niquola15:12:52

наверно это можно и в макросе забубенить simple_smile

niquola15:12:05

главное чтоб валидные экспрешенны собрались

turtle15:12:31

Ну если делается без макроса, нужно без макроса делать, ИМХО.

turtle15:12:58

Не слышали такое выражение: "Помакросил и бросил"

turtle15:12:43

Но можно квазицитирование и не в макросах же использовать.

niquola15:12:38

иначе если xs - нету - стиль будет не полный, а если есть будут дубликаты

niquola15:12:03

вот я и думаю не слишком ли сложно получается

niquola15:12:53

надоело просто css отдельно писать - не DRY simple_smile

Kira Sotnikov18:12:35

nicola: бери вордпресс, там можно все в одном файле и цсс и пхп и джаваскрипт

niquola18:12:15

это язык программирования такой?