Fork me on GitHub
#clojure-russia
<
2016-12-20
>
kishanov04:12:48

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

niquola06:12:05

hangout вмещает 10 человек - я кину ссылку в slack

a.espolov07:12:10

Ага можно не спешить

rmuslimov07:12:42

@nicola Мне кажется будет хорошей идеей тебе подглядывать в чат YT-live если там будут появляться вопросы - и озвучивать раз в 10-15 мин

rmuslimov07:12:06

тогда можно и в hangout-е не появляться

niquola07:12:06

Давай ты мне поможешь ;)

niquola07:12:14

Хорошая идея

artemyarulin08:12:02

Запости в канале спеке, но спрошу еще заодно тут. У меня есть

(s/def ::user #{"user1" "user2"})
(s/def ::pwd #{"pwd1" "pwd2"})
(s/def ::acc (s/keys :req [::user ::pwd]))
Хочется генератор который бы возвращал {::user “user1” ::pwd “pwd1”} т.е. валидную пару. Дефолтный генератор вернет просто рандомный юзер и пароль

artemyarulin08:12:14

может есть возможность как из связать?

niquola08:12:07

ты проболвал дефолтный генератор - пришли что он возвращает?

artemyarulin08:12:30

ага, рандом как и должно быть

>(gen/sample (s/gen ::acc) 3)
(#:zerol.model-test{:user "user2", :pwd "pwd2"} 
 #:zerol.model-test{:user "user1", :pwd "pwd1"} 
 #:zerol.model-test{:user "user1", :pwd "pwd2”})

niquola08:12:58

а ты чего хочешь?

artemyarulin08:12:03

первые 2 норм, третий для меня не валиден

niquola08:12:23

ну напиши еще доп схему - чтоб его отсеяло

niquola08:12:11

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

artemyarulin08:12:10

ну можно то можно, но это не так легко сделать - у меня индексов то нету. Т.е. если я сделаю кастомный генератор для ::acc и скажу дай мне юзера то найти соответсвующий пароль я легко не смогу, т.е. маппинга нету

artemyarulin08:12:30

а ок, сам ответил себе - если маппинга нету то ничего не поможет и надо его сделать, ок спасиб 🙂

misha09:12:58

сделай парами, а потом из пар уже юзера/пароли заспекай

artemyarulin09:12:17

ага, так и делаю в итоге

artemyarulin09:12:20

начал спекать свое приложение - крутая штука спека блин. Я и раньше property based testing любил и юзал иногда, но со спекой это просто супер

misha09:12:17

(def credentials {"user1" "pwd1" "user2" "pwd2"})
(s/def ::credentials (-> credentials seq set))
(s/def ::user (-> credentials keys set)})
(s/def ::pwd (-> credentials vals set)})

misha09:12:55

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

savelichalex15:12:15

а кто нибудь emacs на маке юзает? @artemyarulin ? какие биндинги юзаете, мож ergoemacs? не меняли ли C на Cmd?

artemyarulin15:12:10

ага я на маке, да хз - все стандартное, обычный стоковый емакс

savelichalex15:12:46

че даже C-n C-p стандартные?)

artemyarulin15:12:32

ээ, а чо в них плохого?:)

artemyarulin15:12:48

ну и точнее чо есть лучше? ну окромя вим-мода ессно

savelichalex15:12:33

ну и ниче хорошего)) ну я вот думаю ErgoEmacs, но хотел сначала узнать есть ли положительный опыт у кого)

ponimas15:12:06

я юзаю емакс на маке

ponimas15:12:25

биндинги емаксовые юзаю во всех программах

ponimas15:12:53

ctrl висит на tab и enter

ponimas15:12:04

command - meta

savelichalex15:12:20

@ponimas погоди, а RET тогда у тебя на чем? 🙂

ponimas15:12:12

ну и энтер работает как энтер если его без других клавиш нажимать

ponimas15:12:41

а Super у меня и на клавиатуре нету и в хоткеях я такого не помню

ponimas15:12:16

поправка - сtrl на caps конечно же

savelichalex15:12:16

я вот думаю что caps с шифтом наверно не оч

savelichalex15:12:25

или ты шифт вообще не юзаешь?

ponimas15:12:57

я про шифт ничего не писал

ponimas15:12:02

юзаю конечно

ponimas15:12:12

печатать то как то надо

savelichalex15:12:26

а, все, сорян, я че то шифтом херню гоню)

savelichalex15:12:42

наверно так же и сделаю, спасиб)

ponimas15:12:52

карабинером воспользуйся, если не обновился

savelichalex15:12:59

что за карабинер?

ponimas15:12:23

херовина для ребиндинга клавиш

ponimas15:12:08

на сьере не работает

savelichalex15:12:09

загуглил, вроде пишут уже работает)

ponimas16:12:14

не похоже на то

ponimas16:12:58

status - open

ponimas16:12:56

ну и на https://pqrs.org/osx/karabiner/ большое красное поле по центру

dottedmag16:12:47

@savelichalex Я менял на маке Caps Lock -> Control, больше ничего для мака не менял, только выключил несколько биндингов Cmd+<буква>.

dottedmag16:12:45

Ещё менял для Dvorak, но это уже другое дело.

dottedmag16:12:00

Когда я пользовался линуксом, то у меня было чёткое разделение: Super для оконного менеджера, Ctrl/Alt - для приложений, а теперь всё как-то слилось. Cmd для всего.

dottedmag16:12:24

#editors-rus не прижился

ponimas16:12:42

блин, только дошло, что Super - это win клавиша

ponimas16:12:15

здесь у меня за неё option

dottedmag16:12:30

А Alt на что вешать?

dottedmag16:12:48

А Cmd на что?

ponimas16:12:59

а зачем он вообще?

ponimas16:12:04

в помойку

dottedmag16:12:08

Если уметь мозг переключать между контекстами "в емаксе" и "вне емакса", то да. Но у меня мозг слишком тупой для этого.

dottedmag16:12:06

Cmd-T отлично пойдёт на "создай мне новый буфер без имени"

ponimas16:12:24

я тоже тупой, поэтому у меня всё как в емаксе

dottedmag16:12:21

А как сделать хром как в емаксе? Ctrl-{bpnf} он понимает, но C-x C-f уже как-то нет.

ponimas16:12:38

а я не юзаю хром

ponimas16:12:45

как раз по этой причине

ponimas16:12:14

fox + keysnail

ponimas16:12:49

единственное место, где я испытываю проблемы - сраные приложения на электроне (

ponimas16:12:27

причём не работают хоткеи переназначеные макосью

andmed16:12:14

У меня capslock меняет раскладку клавиатуры.)

dottedmag16:12:17

Господа, а вот как бы сделать идиоматично следующую штуку: есть у меня поток событий двух видов: {заголовок_уровень: N} и "контент". Это такое распластанное представление дерева (разобранный markdown). Хочется из него собрать обратно дерево. Дубовое решение - держать стек заголовков, и контент с того момента, когда пришёл последний и когда приходит новый - дампать новый узел с контентом и чистить стэк. Но это как-то императивненько.

dottedmag16:12:51

Мм, первым делом надо прилепить контент к предыдущему заголовку. Значит задача упрощается до потока событий вида {заголовок_уровень: N}.

misha17:12:06

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

dottedmag17:12:37

@misha Почему? Можно считать, что не стрим, а коллекция. Т.е. никто с другой стороны не сидит и не пишет markdown быстрее, чем я его процессю :) Это конечный документ.

misha17:12:00

тогда да

dottedmag17:12:16

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

dottedmag19:12:50

test.check рулит. Сделал для прилепления контента к заголовку трансдюсер с состоянием, написал пропертю, запустил тест.чек, нашёл, где налажал. Если бы не написал пропертю - никогда бы не нашёл.

artemyarulin20:12:25

@dottedmag через схему или просто либу заюзал?

dottedmag20:12:21

@artemyarulin В этот раз просто либу. Я же сделал просто трансдюсер, какой к нему спек?

artemyarulin20:12:59

хм, давно не трогал трансдюсеры. Там разве какие есть проблемы покрыть спекой?

artemyarulin20:12:33

это функция да, все равно ж есть логика, какие данные могет, какие нет, 3 разных arity

dottedmag20:12:54

Как покрыть спекой такой инвариант? "На выходе будут элементы в том же порядке, что и на входе, но при этом разбитые на подпоследовательности во всех точках, где данная функция выдаёт на элементе истинное значение"

dottedmag20:12:32

т.е. 1 0 0 1 1 0 1 0 1 1 0 -> (1 0 0) (1) (1 0) (1 0) (1) (1 0)

artemyarulin20:12:16

(s/def ::x any?) troll

malch20:12:34

две вещи проверить

dottedmag20:12:36

Ну и вот. Проперти - для поведения, спеки - для форматов данных.

malch20:12:43

тот же порядок - flatten

malch20:12:06

а каждую подпоследовательность - на первом месте 1, остальные 0

malch20:12:10

в чем проблема?

dottedmag20:12:31

@malch Ну вот @artemyarulin пытается это на спек натянуть.

malch20:12:39

спеки не только для формата данных

malch20:12:45

отлично натягивается

dottedmag20:12:54

Попробуй?

malch20:12:32

тебе нужно :fn

dottedmag20:12:49

А, в :fn запихнуть.

malch20:12:02

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

dottedmag20:12:59

Я не хочу проверять свойство на одном вызове функции, это глупо. Я хочу прогнать весь массив через (transduce) и проверять результаты.

dottedmag20:12:22

А писать спеку на левую функцию, которая вызовет transduce на моём sut/split-by бессмысленно.

dottedmag20:12:55

Можно сделать arity sut/split-by, которая будет принимать коллекцию (как map может вернуть трансдюсер, а может и ножичком по горлу и применить коллекцию к функции) и её потестить.

dottedmag20:12:24

Но всё равно 1-arity будет неотспекана.

malch20:12:39

тут я соглашусь в принципе

malch20:12:57

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

dottedmag20:12:22

Не то, чтобы сложно - наоборот, проще, потому что инварианты проще. Но эти инварианты ничего толком не говорят о том, что функция делает.

dottedmag20:12:59

А ещё там внутри состояние, так что один вызовом не обойтись.

malch20:12:23

Кстати, ты не проверяешь, что “все кроме первого в подпоследовательности = 0"

malch20:12:41

сорри, вижу уже

dottedmag20:12:42

Проверяю. Это split-by-splits-at-every-truth

artemyarulin20:12:55

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

(let [[k v] (first {:a :b})]
  [k v])

artemyarulin20:12:14

короче ничо нету?

malch20:12:35

(let [{:keys [x]} m]
  x)

malch20:12:39

не то?

artemyarulin20:12:00

неа, я название ключа не знаю

artemyarulin20:12:09

*значение

malch20:12:01

тогда проще ничего не вижу сходу

malch20:12:22

а почему ты ключ не знаешь?

artemyarulin20:12:31

ну вот выбрал так в моем дслчике что у меня вектор и внутри кейворды означают одно, а если мапа из одного ключа это другое типа (model ::user ::pwd ::email {:req ::req})

malch20:12:32

ну мучайся тогда simple_smile

artemyarulin20:12:05

нужно просто 2 сущности разных, кейворды и символы обычно берут (как в оме например), но меня бесит все эти ‘ (sym), поэтому героически буду решать проблемы которые себе сделал 🙂

artemyarulin20:12:10

а по спеке еще

(s/def :io.http/method #{"GET" "POST" "HEAD" "OPTIONS"})
(s/def :io.http/headers map?)
(s/def :io.http/url string?)
а как мне указать валиданые хеадеры для :io.http/headers? Их может 20 штук разных какое мое приложение посылает. Делать 20 s/def это перебор, можно как-нить попроще?

dottedmag20:12:18

А у меня библиотека, которая возвращает эвенты именно в виде мапы с одним ключом, хаха.

artemyarulin20:12:40

отвечаю сам себе (s/def :io.http.headers (s/map-of #{:k1 :k2 :k3} string?)

dottedmag20:12:44

Кстати, про состояние тулзов в Clojure.

dottedmag20:12:11

M-x el-get-install cider, M-x cider-jack-in. Всё вроде бы работает, но REPL не появляется.

dottedmag20:12:27

Лезу в *Messages* - херня какая-то. Читаю код - вчера закоммитили баг.

dottedmag20:12:03

В Wiki CIDER написано Never-the-less, installing from MELPA is the recommended way of obtaining CIDER, as the master branch is normally quite stable and "stable" (tagged) builds are released somewhat infrequently.

misha21:12:05

@artemyarulin тебе k, v или оба из {k v}?

misha21:12:35

(let [[[k v]] (seq {:a 1 :b 2})]
  [k v])
хотя - те же яйца

misha21:12:39

может [k v] удобнее, чем {k v}?

artemyarulin23:12:07

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

artemyarulin23:12:19

случайно кста нашел ifn?, мож кто тоже не знал

>(fn? +)
true
> (fn? {})
false
> (ifn? +)
true
> (ifn? {})
true