Fork me on GitHub
#clojure-russia
<
2015-11-13
>
Dos04:11:10

Здрасьте, у кого есть время привести мой ум в порядок) После просмотра are we there yet?

kharus05:11:26

Тут всегда полно народу.

kharus05:11:40

Спрашивай, может кто и ответит.

Dos05:11:57

как решается проблема мержа?

Dos05:11:20

допустим Identity состоит из множества value я получаю state, и еще кто-то получает state

Dos05:11:29

мы оба изменили(значить ли это создали новые value внутри Identity или где-то в другом месте?)

oxgrouby05:11:53

а что тут Identity?

Dos05:11:16

ну как объект я понимаю

Dos05:11:28

имеет множество состоянии

oxgrouby05:11:41

конкретней -- что за объект?

Dos05:11:48

на конкретный момент времени имеет state

oxgrouby05:11:52

как оно в кложуре выгляит?

Dos05:11:16

я еще в кложуру не вник

kharus05:11:02

Тогда на любом другом языке программирования.

Dos05:11:12

допустим Person

oxgrouby05:11:00

1. в кложуре ты тупо не можешь Persion изменить 2. если тебе нужно его изменить, оборачивай его в atom-agent-etc

Dos05:11:04

( :name "Joe" :surname "something")

oxgrouby05:11:33

они не позволят одновременно что-то делать

Dos05:11:51

значить ли это что я на получение объекта могу без очереди(как просмотр матча)

Dos05:11:16

но на изменение уже надо будет в очередь?

kharus05:11:29

dos, очень коротко. Непонятно, что хочешь сказать.

Dos05:11:31

кажется STM называется

kharus05:11:37

Пиши больше.

malch05:11:49

STM это не совсем то

kharus05:11:50

В STM кто последний - тот и выиграл.

malch05:11:53

Но близко

malch05:11:11

@dos почитай, как atom в clojure работает

Dos05:11:20

все ок

Dos05:11:39

спасибо всем. Я еще скоро вернусь)

kharus05:11:29

А че вернусь, ты давай не уходи simple_smile

Dos05:11:26

всмысле с вопросами) после прочтения atom

razum2um06:11:33

@dos: если я правильно понял первый вопрос, про мерж то так: либо мерж не нужен, потому что структура иммутабельна - кто когда какую получил тот с ней и живет, либо решается подходом compare-and-swap для изменяемого состояния, т.е. мержа как такового тоже нет

Dos06:11:51

@razum2um: как поличить актуальную версию? Заново надо запросить?

razum2um06:11:02

получить где? ты вызываешь функцию и передаешь ей агрумент. либо он иммутабельный, либо его можно deref, т.е. опять же вытащить состояние на текущий момент времени

Dos06:11:09

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

razum2um06:11:15

@dos: важная мелочь - это “вытащенное” состояние в простом случае иммутабельно, т.е. манипулируя им ты никак не можешь изменить исходную “коробку”, только compare-and-swap с твоим новым состоянием (ака функцией для его получения)

malch06:11:45

@dos swap! для атома работает примерно так: ты передаешь функцию, которая применится к “текущему” состоянию. Если в один поток работать, то все ок

malch06:11:06

Если в несколько и сразу несколько swap! идут, то чуть сложнее

malch06:11:29

swap! перед началом применения запомнит значение атома

malch06:11:09

И если кто-то успеет его изменить (другой swap!), то повторит эту функцию

malch06:11:53

получилось объяснить?

Dos06:11:33

а это автоматом делается?

malch06:11:36

ты, как программист, в 95% случаев не думаешь об этом, а просто пишешь pure функцию для обновления состояния

Dos06:11:48

@malch: спасибо(объяснил в личке)

thickprogrammer10:11:27

@razum2um блин, я не такой умный, что бы понять что данном файле написано ) можно попроще объяснить - что происходит при (defn func [x] (+ x 10)) - тут символу func сопоставляется что? ссылка на функцию? (def y func) - тут символу "y" сопоставляется что? ссылка на функцию , ту же что и сопоставлена символу "func" ? (def z #'func) - тут символу "z" сопоставляется что? ссылка на переменную ? какую ?

Kira Sotnikov10:11:26

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

oxgrouby10:11:45

разумеется :-S

Kira Sotnikov10:11:00

глупые вопросы это мой конек

Kira Sotnikov10:11:36

мне нужен туториал clojure for lazy and stupid, вместо for brave and true

oxgrouby10:11:38

причём область видимости ограниченая скобочками в которых она появляется - если речь не идёт о def-like

Kira Sotnikov10:11:38

а я вот могу выдрать (:keyword mymap) а (:keyword1 :keyword2 mymap) без макроса не будет работать?

oxgrouby10:11:06

так уже не катит, да

Kira Sotnikov10:11:37

спасибо

oxgrouby10:11:48

у кого есть опыт -- как проповедовать сотрудникам кложуру?)

Kira Sotnikov10:11:52

а передать в функцию 5-6 аргументов это нормально?

oxgrouby10:11:55

чтобы вызвать желание поизучать

oxgrouby11:11:02

lowl4tency: не уверен

niquola11:11:52

@lowl4tency use hash-map как аргумент

oxgrouby11:11:56

кстати, есть какой-нибудь сервис типа чтобы постить туда куски кода с целью обсуждения "как лучше делать"?

oxgrouby11:11:06

мультиязычный

oxgrouby11:11:13

в контексте яп всмысле )

Kira Sotnikov11:11:19

(defn myfn
  [mymap]
  (do (:a mymap))
)

Kira Sotnikov11:11:23

так норм?

oxgrouby11:11:33

lowl4tency: только не ясно зачем тут do

Kira Sotnikov11:11:45

oxgrouby: это я типа запсевдокодил

Kira Sotnikov11:11:57

(do это dosmsth)

Kira Sotnikov11:11:08

(азбыл что в кложе это оператор)

Kira Sotnikov11:11:33

oxgrouby: на счет ревью кода, тут в слаке есть канал для этого

oxgrouby11:11:35

lowl4tency: судя по прошлым твоим сниппетам можно подумать что ты не в курсе бы можно делать вот так (defn qwe [] (println 1) (println 2))

oxgrouby11:11:49

ну слак это не совсем то - не даш комунить прямую ссылку

Kira Sotnikov11:11:59

oxgrouby: пости на гист )

oxgrouby11:11:04

кстати да

Kira Sotnikov11:11:27

1 и 2 первый и второй аргумент соотвтетсвенно?

oxgrouby11:11:43

да без разницы что это)

razum2um11:11:44

@thickprogrammer: func, y это да, clojure.lang.AFn объект (т.е. реально ф-я), а z - clojure.lang.Var который имплементит IFn (т.е. что-то вызываемое) и в данном случае это что-то внутри - AFn

Kira Sotnikov11:11:54

hash-map передавать как-то симпатичнее

thickprogrammer11:11:30

@razum2um я не совсем понимаю. "func", "y", "z" -это символы, которым сопоставлены ссылки - так ?

razum2um11:11:50

да, так точнее, чем выше

thickprogrammer11:11:20

func [x] (+ x 10)) - тут символу func сопоставляется что? ссылка на функцию? (def y func) - тут символу "y" сопоставляется что? ссылка на функцию , ту же что и сопоставлена символу "func" ? (def z #'func) - тут символу "z" сопоставляется что? ссылка на переменную ? какую ?

razum2um11:11:07

прочитай мой ответ, с func, y это ссылка на объект clojure.lang.AFn, z ссылка на объект clojure.lang.Var, который внутри содержит ссылку на функцию. какую именно? определяется в рантайме посредством deref https://github.com/clojure/clojure/blob/master/src/jvm/clojure/lang/Var.java#L362

razum2um11:11:44

user=> (defn func [x] (+ x 10))
#'user/func
user=> (def z #'func)
#'user/z
user=> (.fn z)
#object[user$func 0x49dd421a "user$func@49dd421a”] 
user=> (= (.fn z) func)
true

thickprogrammer11:11:12

мне написали, что данное утверждение - "после переопределения func , например, (defn func [x] (+ x 15)) y продолжает ссылаться на старую функцию func , а z всегда при вызове будет резолвить текущее значение символа " по смыслу не корректное. я пытаюсь понять в чем некорректность.

razum2um11:11:29

хм, вроде в кавычках все верно. y это постоянная ссылка, а z это Var который резолвится в рантайме. поэтому как раз всякие вебсервера лучше кормить var-ом с т.з. авторелоада

thickprogrammer11:11:29

спасибо, теперь понятно )

kronos_vano11:11:50

Я в цикле делаю http запросы через http-kit. Он возвращает промис, если я не хочу блочить основной цикл, нормально что я его буду "резолвить" (не знаю термина) (go (some-fn (http/get url)))

oxgrouby11:11:56

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

oxgrouby11:11:04

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

thickprogrammer11:11:18

еще вопрос (def atomfn (atom (fn [x] (+ 1 x)))) - записываем в атом функцию (@atomfn 3) - работает (swap! atomfn (fn [x] (+ 2 x))) - ошибка. как переопределить атом?

oxgrouby11:11:11

только функция в атоме это как-то, хм

razum2um11:11:44

третий агрумент swap - ф-я, кот. принимает аргументом состояние (функцию в твоем случае и ты пытаешься Int + Fn)

thickprogrammer11:11:56

reset помог, спасибо

thickprogrammer11:11:12

почему функция в атоме - хм ? )

thickprogrammer11:11:26

это не хуже чем в var по смыслу

oxgrouby11:11:05

не ясна задумка - зачем это нужно?

oxgrouby11:11:13

чтобы в рантайме подменять кот?

razum2um11:11:18

ну может и ок, просто это обычно контейнер для данных, а не для кода

thickprogrammer11:11:13

ну да - в рантайме код менять. почему атом - это обычно контейнер для данных? чем плохо его использовать для функций?

oxgrouby11:11:44

плохо в первую очередь то, что вызывает "wtf?!" у читающего кот

razum2um11:11:37

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

razum2um11:11:49

в общем data > code (имхо, но кажется поддерживаемое)

thickprogrammer11:11:27

так code as data же - не ?

oxgrouby11:11:53

это про другое

oxgrouby11:11:01

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

razum2um11:11:01

ну вот я к тому и подводил, что code is data по факту только внутри макроса (ну и ессно в стадии парсинга, в reader)

oxgrouby11:11:35

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

razum2um11:11:33

юзай компоненты, определяй как у тебя все-все start/stop и пиши чистые функции с четко локализованным стейтом simple_smile

oxgrouby11:11:41

я кстати только вчера открыл для себя grench

oxgrouby11:11:43

классная штука

oxgrouby11:11:12

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

oxgrouby11:11:38

lovesan: когда уже допишешь новую std для cl?

rm12:11:09

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

Kira Sotnikov12:11:23

на скале же есть

rm12:11:27

серьезно?

rm12:11:45

они минут 40 работают, наверное

Kira Sotnikov12:11:46

ну как минимум есть способ как их писать

oxgrouby12:11:13

rm [3:48 PM] серьезно? а почему бы и нет собсна?

rm12:11:45

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

oxgrouby12:11:02

я перед этим про grench писал

oxgrouby12:11:13

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

rm12:11:54

типа, где-то торчит сервер, а ты туда коннектишься и код пуляешь?

rm12:11:05

хитрая жопа.png

oxgrouby12:11:14

пора домой

Kira Sotnikov12:11:15

ну вообще сейчас golang вытесняет все сильнее руби перл

Kira Sotnikov13:11:52

господа, ваши предположения, я на лямбде дергаю апи, локально у меня все работает, а в амазоне не работает

Kira Sotnikov13:11:09

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

Kira Sotnikov13:11:32

https://github.com/owainlewis/twilio апи дергаю через это

Kira Sotnikov13:11:37

там внутри http-kit

Kira Sotnikov13:11:43

post запрос

Kira Sotnikov13:11:59

ваши версии?)

malch13:11:53

Копать нужно 😊

Kira Sotnikov13:11:10

ты хотя бы подскажи какую лопату взять

Kira Sotnikov13:11:06

запускаю на ноуте в репле функцию, получаю смс, запускаю в лямбде пишет что смс отправлена, но ничего не получаю, в логах твилио даже упоминания нет

Kira Sotnikov13:11:25

саппорт говорит, что у них все ок, и даже дали node.js код

malch13:11:47

Они запрос видят?

malch13:11:13

Доступ запрещен?

Kira Sotnikov13:11:15

кто они?

malch13:11:28

Саппорт 😊

Kira Sotnikov13:11:31

доступ разрешен, я с саппортом и твилио и амазона уже второй день разговариваю

Kira Sotnikov13:11:56

вот дали такой код

Kira Sotnikov13:11:01

типа рабочий

malch13:11:06

Попробуй с амазона в другое место запрос сделать

Kira Sotnikov13:11:37

я хочу выкинуть либу и взять чистый http-kit

Kira Sotnikov13:11:54

и да попробовать другое апи

malch13:11:03

И это тоже стоит проверить

Kira Sotnikov13:11:05

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

Kira Sotnikov13:11:33

все сделал, все написал, протестил, все работает, а смс не приходят )

Kira Sotnikov13:11:51

зато кложу подучил

malch13:11:06

Потом окажется конечно, как это обычно бывает, что скобку где-то не закрыл 😄

malch13:11:13

Образно

Kira Sotnikov13:11:49

пока все по винтику не разберешь )

Kira Sotnikov13:11:16

причем в инторнете много хайпа что у людей и на нодежс не работает

Kira Sotnikov13:11:29

ну не твилио а другие апишечки из лямбды

Kira Sotnikov13:11:50

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

malch13:11:00

А вот это уже настораживает

malch13:11:01

Ну то есть как раз мой совет подходит, чтобы локализовать ошибку

Kira Sotnikov13:11:57

в смысле конечный результат

Kira Sotnikov13:11:07

имеет смысл если он запущен на лямбде

bezrukov13:11:46

А интересно, почему так часто используют http-kit, вместо какой-нибудь обвязки поверх netty (ну там aleph, например)?

artemyarulin13:11:46

присоединяюсь к вопросу - в ближайшее время хочу писать высоко нагруженный сервис и выбор пал на netty (aleph точнее) ибо не блокирующий и должно все скейлится на ура

artemyarulin14:11:24

о спасибо

malch14:11:20

Какое-то там обсуждение было не очень аргументированное 😊

malch14:11:07

Я так и не понял, чем aleph не угодил кому-то

artemyarulin15:11:01

aleph как я понимаю это враппер над netti. А netti сам по себе вроде один из самых быстрых нынче

malch15:11:17

А вот тут парень из Atlassian говорит, что они смотрели разные варианты и остановились на aleph: http://www.youtube.com/watch?v=3QR8meTrh5g

malch15:11:42

@artemyarulin: Да-да, у меня такие же “ощущения"

artemyarulin15:11:01

о, спасибо позырю видео

Kira Sotnikov15:11:21

О да сегодня же пятница 13е

artemyarulin15:11:38

о, хорошо что сегодня не деплоил в прод :))

Kira Sotnikov15:11:42

artemyarulin: а как же континиус деливери?

artemyarulin15:11:02

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

artemyarulin15:11:51

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

artemyarulin15:11:13

вот кста сегодня на хабре в тему про страхи разработчиков: http://habrahabr.ru/company/mailru/blog/270785/

Страх разработчика — рекурсия, которая приводит к self-DDoS. А ещё когда катишь релиз и видишь на графике полку. Откатываешь, а полка осталась. O_o

niquola16:11:21

Начал выковыривать повторяющийся код для работы с pg, надоело копировать из проекта в проект. https://github.com/niquola/clj-pg - кому интересно - присоединяйтесь. @yogthos, @prepor need your review and ideas simple_smile

kronos_vano16:11:36

(propertize :data-base-upse) а зачем это?

kronos_vano16:11:33

а, ну там и отладка осталась

kronos_vano16:11:36

понятно тогда

niquola16:11:35

да вчера бился с hikari - чтоб съел для postgresql stringtype=unspecified simple_smile

robotector18:11:35

ребята, а кто-нибудь пользуется pedestal вместе c component?

dottedmag22:11:11

"Стихи были либо знакомые, либо скверные" (c)

thickprogrammer22:11:39

подскажите, как стопнуть catacumbа ))) запускал так - (ct/run-server my-hello-world-handler)

thickprogrammer23:11:53

вообще под long polling или sse что лучше выбрать ? http-kit вроде не очень тут хвалили