Fork me on GitHub
#clojure-russia
<
2016-04-07
>
oxgrouby05:04:42

Ребят, напомните плиз как называется тот плагинчик для леина, не могу найти: там оно делает прямо в браузере repl, и там можно всякие графики строить

oxgrouby06:04:07

не, другого типа

rmuslimov06:04:54

этот тот который на хакатоне написали

rmuslimov06:04:04

который репл умеет

rmuslimov06:04:24

нет, не помню simple_smile

oxgrouby06:04:02

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

oxgrouby06:04:13

не, тоже не

oxgrouby06:04:21

там прямо вроде как репл позиционируется

oxgrouby06:04:27

просто с расширениями для рисования в браузере

oxgrouby06:04:59

горилла же!

lapooh07:04:01

@abtv: я на работе использую(про ideavim).

abtv07:04:30

@lapooh: а ты настраивал его как-то дополнительно? как выделить целое выражение без visual mode и затем скопировать и вставить?

lapooh07:04:21

ты имееш в виду буфер обмена ос? "+y и "+p

abtv07:04:02

мне нужно 2 вещи: возможность копировать в буфер обмена ос и обратно через y/d/p, а не использовать еще и Ctrl+c/v/x; и второе - это нормально копировать s-выражения

abtv07:04:25

"+y и "+p - это как? последовательно? @lapooh

lapooh07:04:42

да, выделяеш, что хочеш скопировать, и последовательно "+y, после чего(если в vim'e), то "+p

lapooh07:04:01

а как понять "нормально копировать s-выражения" ? Мне вот в ideavim не хватает выделения текста между тегами, у нас конфиг приложения - xml(40k loc)

lapooh07:04:38

Если хочеш работать с буффером ОС через ydp, то просто замапь выше описанное комбо на них 😃

abtv07:04:36

ага, работает, только сразу три клавиши подряд жать много... это vim way такой?

abtv07:04:54

ну ок тогда simple_smile

artemyarulin07:04:30

Никто кста не смотрел на redux из мира JS? Чем больше про него читаю тем больше нравиться, разве что чутка подтюнить

fxposter08:04:27

redux - это клон стейта из elm-а simple_smile

fxposter08:04:45

только без effects и прочего

fxposter08:04:04

хотя судя по их issues они могут в будущем добавить эффекты в редюсеры

artemyarulin08:04:18

хм, спасибо - почитаю всеж про elm тада

artemyarulin08:04:33

а в CLJS ближайший аналог это чо?

artemyarulin08:04:37

если есть

artemyarulin08:04:31

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

fxposter08:04:06

ну om.old и все остальные на него похожи )

fxposter08:04:21

по-своему, конечно )

misha08:04:49

@abtv, vim в идее - нет, дофига конфликтов в конфигах и мышечной памяти. любая гуя не воспринимается как вим совершенно, и рефлексы не подгружаются

misha08:04:21

@artemyarulin: нахрена тебе отот js? бери атом/датаскрипт, бери add-watch, и нахлобучивай что вздумается

artemyarulin08:04:24

@misha: неее, JS мне не нужен:) Думаю просто про state storage/handling для Rum, вот выбираю как именно нахлабучивать simple_smile

misha08:04:50

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

artemyarulin08:04:15

неа, чота я его побаиваюсь

misha08:04:59

я везде, где трогаю js в реакт нейтиве - отгребаю из-за несимметричности clj->js и js->clj и бешусь дико: ключи теряются в значениях, неймспейсы в ключах, лишний код, фу.

misha08:04:12

ну какой у тебя юзкейс?

misha08:04:43

вообще, мне тоже ссыкотно стейт из 3 "переменных" хранить в нем. зато как бд на несколько тысяч перелинкованых сущностей по 3-10 полей в каждой - ваще найс

artemyarulin08:04:44

У меня Mail client по сути. RN приложение + хочу еще веб версию его-же. DS может и подойдет, ну хз - выглядят запросы стремно simple_smile

misha08:04:51

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

artemyarulin08:04:03

ага, я тоже хочу full in и хранить все там

misha08:04:19

по-чесноку, у меня большинство запросов - это pull

misha08:04:46

если мы про стейт страницы:

(def page-pull-pattern [:page/editing? :page/id :page/entity-id])
(let [page-state (d/pull @conn page-pull-pattern [:page/id :email-details])]
  (println (pr-str (page-state))

misha08:04:15

=>>
{:page/editing? true
 :page/id :email-details
 :page/entity-id #uuid "57061e08-85e0-413c-9316-3f72a7edec72"}

artemyarulin08:04:20

ну уговорил - почитаю и подумаю вечерком про DS

artemyarulin08:04:45

пойду спрошу сча про DS performance в #C0E1SN0NM, помню там было у кого-то

misha08:04:25

просто если ты хранишь только это (3 поля) в базе - понту нет совершенно. а если у тебя их десяток, все немного разные и ветвистые, и не только пейдж-стейты – самое то

misha08:04:31

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

misha08:04:27

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

artemyarulin08:04:11

хм, хз - мне кажется надо попробовать на старом андроиде. Там может быть в 10 раз медленнее наверно

misha08:04:39

вот 2 семпла pull'a ветвистой сущности (одной и той же) с парой веток и глубиной 5

2016-04-07 11:52:46.640 [info][tid:com.facebook.React.JavaScript] GETTING
2016-04-07 11:52:46.676 [info][tid:com.facebook.React.JavaScript] "Elapsed time: 35.000000 msecs"
2016-04-07 11:52:46.701 [info][tid:com.facebook.React.JavaScript] GETTING
2016-04-07 11:52:46.724 [info][tid:com.facebook.React.JavaScript] "Elapsed time: 22.000000 msecs"

misha08:04:06

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

misha08:04:17

@asolovyov говорит, там всё очень и очень плохо с js (?)

abtv10:04:23

@misha: по поводу IdeaVim: а если хочется еще и на java писать?. я уже неделю экспериментирую с идеей: включил distraction free mode (нет никаких менюшек и кнопочек, правда включил заголовки табов) и настроил основные операции на хоткеи. У меня на экране только код и закладочки. Если нужен репл, то я через хоткей показываю окошко, таким же образом и скрываю его. Терминал также. Поиск тоже на хоткеях.

misha11:04:33

@abtv: java+vim? you are doing it wrong kappa

misha11:04:19

ко мне не приросло, если тебе ок и всё устраивает – ну круто же

abtv11:04:59

Да я вимом никогда не пользовался для программирования, просто конфиги правил. А тут вот решил попробовать и для разработки, только вот просто вим или спейсмакс было круто для меня, слишком много нового, я хотел не терять скорости разработки на первое время. Ну и да, java у меня есть тоже simple_smile

lapooh12:04:47

@abtv: Не было мысли java код в kotlin перевести?

misha12:04:07

@artemyarulin: слушай, я тут апп без присмотра оставил на 4 часа, так там памяти со 100 до 300мб натекло в эмуляторе. ты подобного не замечал? за RN или нативным кодом вообще

artemyarulin12:04:41

@misha: Симулятор это плохой пример для перформанс тестирования вообще + RN в дебаге + фигвил жрет вроде память в дебаге. Попробуй релиз билд + запусти на девайсе, потом подключи Instruments и я почти уверен что течь не будет

misha12:04:20

ок, но не сегодня, рановато на такое тратить время. спасибо

abtv13:04:34

@lapooh: была, но пока не до этого, может оно и так сгодится, проект довольно простой

artemyarulin13:04:22

народ - а что можно почитать на тему AI? Интересная ж тема - написал один раз, а дальше он сам все за тебя пишет trollface

artemyarulin13:04:39

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

artemyarulin13:04:54

ну и в догонку - никто не видел какие примеры на тему использования AI/rules engine/logic progamming в контексте обычных UI приложений с 2 табами да пятью кнопочками?

misha14:04:29

@artemyarulin: как такое дебажить (удобно)?

2016-04-07 17:04:05.851 [info][tid:com.facebook.React.JavaScript] ==== Shimming jsloader ====
2016-04-07 17:04:05.949 [error][tid:com.facebook.React.JavaScript] Evaluation error in: 
2016-04-07 17:04:05.955 [error][tid:com.facebook.React.JavaScript] { [TypeError: undefined is not an object (evaluating 'wn.ios.core.init')] line: 7, column: 319 }

misha14:04:36

и такое:

$ rlwrap lein figwheel ios
Figwheel: Starting server at 
Figwheel: Watching build - ios
Compiling "target/ios/not-used.js" from ["src" "env/dev"]...
{:tag :cljs/analysis-error}
ANALYSIS ERROR:  on file null, line null, column null

artemyarulin14:04:59

там же можно Chrome debugger подключить

misha14:04:34

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

misha14:04:00

а фигвиловский эррор - хз как дебажить

misha16:04:38

кароче от зажевывающего эксепшены фигвила

Compiling "target/ios/not-used.js" from ["src" "env/dev"]...
{:tag :cljs/analysis-error}
ANALYSIS ERROR:  on file null, line null, column null
спасает $ lein cljsbuild once

potapenko20:04:03

народ, подскажите с core.async как правильнее использовать. использую такой стандартный блок

(defn async-method []
  (let[port (chan)]
    (go
      ;; (<! (do-it))
      (put! port “[anync-complete]")
      )
    port
    )
  )
Чтобы его перехватывать выше в методе, в go
(defn my-method []
  (go
    (println (<! (async-method)))
    (println (<! (async-method)))
    (println (<! (async-method)))
    (println (<! (async-method)))
    (println "finished!")
    )
  )
Может есть путь покрасивше? Может макрос какой уже готовый чтобы не дублировать такую красоту?

rmuslimov20:04:38

там типа 4 метода разных подразумевается?

potapenko20:04:53

ну там база, REST, очередь в общем

rmuslimov20:04:19

а методы между собой не связанные?

rmuslimov20:04:47

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

rmuslimov20:04:53

не параллельно

potapenko20:04:56

был бы JVM сделал через те же future, но это CS

potapenko20:04:26

трэдов нету, но async нужен

potapenko20:04:49

чтобы callback hell не воротить

rmuslimov20:04:00

а что такое CS?

potapenko20:04:08

ClojureScript

rmuslimov20:04:07

мне кажется правильно сложить каналы в лист

rmuslimov20:04:15

и дождаться когда они будут готовы

potapenko20:04:42

а нафига? тут например можно закомить какой шаг

potapenko20:04:50

или по условию

potapenko20:04:15

сам код - очередь, зачем еще данные в виде очереди?

rmuslimov20:04:31

чтобы было быстро, нет?

potapenko20:04:43

быстрее не будет, один хрен

potapenko20:04:46

вопрос в читабельности

rmuslimov20:04:51

ну тогда ок

potapenko20:04:51

в простоте

potapenko20:04:05

я просто думал, что сам паттерн стандартный

rmuslimov20:04:06

все тривиально, вернул канал показал что пришло из канала

rmuslimov20:04:42

возможно, кто то что то еще подскажет

rmuslimov20:04:49

я мало работал с core.async

potapenko20:04:06

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

(let[port (chan)]
  (go
    ;; (<! (do-it))
    (put! port "")
    )
  port
  )

potapenko20:04:00

окей, подождем какого эксперта по core.async

rmuslimov20:04:32

напиши может сразу cljs чат

potapenko22:04:57

@dragoncube: а можно поподробнее? полностью кейс?

rmuslimov22:04:09

по-моему, это совсем не о том

potapenko22:04:38

я вот про тоже

rmuslimov23:04:52

не запускал правда

rmuslimov23:04:15

go сам по себе канал

rmuslimov23:04:35

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

rmuslimov23:04:12

еще в aleph/deferred есть крутые пара функций для подобных задач - d/zip, d/chain

rmuslimov23:04:28

но он не портировал в cljs и вряд ли будет

rmuslimov23:04:53

а так вообще круто получается например (d/chain (apply d/zip (map #(…some i/o here..) (range 100)) fn-read fn-dosomething)

rmuslimov23:04:08

параллельно и последовательно в одной строке

rmuslimov23:04:27

не знаю как в core.async так сделать

potapenko23:04:27

fn как раз callback, что не хочется, не на самом деле все работает прекрасно, можно сделать макрос, который будет выклядеть где-то так

(sync
   (<! (do-it))
  “finished”
)
разворачиваясь в
(let[port (chan)]
  (go
    (<! (do-it))
    (>! port "finished")
    )
  port
  )

rmuslimov23:04:14

благородные сэры выбирают функции вместо макросов

rmuslimov23:04:50

ну т.е., вопрос личный конечно

rmuslimov23:04:04

макросы могут запутать быстро

potapenko23:04:12

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

potapenko23:04:08

в контексте Clojure, где код - это AST, макросы - это чистые AST-шаблоны для создания DSL.

potapenko23:04:53

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

rmuslimov23:04:53

да, не спорю что макросы это хорошо

rmuslimov23:04:57

но сложно

rmuslimov23:04:15

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

potapenko23:04:55

да, бывает, но если разумно - то это благо. причем спасительное.