Fork me on GitHub
#clojure-russia
<
2016-04-05
>
seryh05:04:17

парни, нужен совет. я тут словил утечку tcp подключений с aleph

seryh05:04:31

вот какой ад показывает lsof -> http://take.ms/Qiely

seryh05:04:21

видимо клиент некорректно закрывает tcp соединение и моя функция не может обработать его

seryh05:04:08

сталкивался кто с подобным?

seryh06:04:39

вот эта проверка на чтения с канала не срабатывает

(if-let [ch-data (<! chan)]

rmuslimov06:04:06

не уверен, что я смогу помочь, btw что значит не срабатывает?

seryh06:04:03

насколько помню доку если канал закрыт то ch-data будет null

seryh06:04:21

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

seryh06:04:30

а тут устройство закрывает его не по протоколу

rmuslimov06:04:19

хм, но канал может или закрыт или нет - опций неправильно закрыт нет

rmuslimov06:04:26

может там мусор?

rmuslimov06:04:42

а сидр дебаг?

rmuslimov06:04:52

не пробовал еще?

seryh06:04:18

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

seryh06:04:53

лан пойду курить связку manifold с async в ней проблема где то

seryh06:04:58

в manifold есть функция connect позволяющая забиндить обьект stream на chan. и далее работать уже с каналом

fxposter07:04:36

по-моему @asolovyov и @prepor уже что-то похожее с каналами обсуждали

seryh07:04:45

да тут не с каналами проблема. напрямую опрашиваю все подключения на manifold.stream/closed? и он мне говорит что все открыто

fxposter07:04:19

хм, так может кто-то закрывать должен все же simple_smile

seryh07:04:53

клиент должен инициировать закрытие. но он не закрывает

seryh07:04:20

клиенты плодят подключения не закрывая их

seryh07:04:42

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

seryh07:04:39

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

fxposter07:04:08

это вебсокеты?

fxposter07:04:13

или http?

fxposter07:04:39

что значит “должен закрывать и не закрывает”?

fxposter07:04:55

там же keepalive, после которого оно может закрываться сервером simple_smile

seryh08:04:10

это tcp/ip

fxposter08:04:39

тогда мучайся, что simple_smile или ставь таймауты покороче

fxposter08:04:56

если клиенты действительно сами закрывать не хотят

andre08:04:02

на tdd meetupчик в Москве , который выше @andmed скидывал, кто-нибудь идет?

ssesutchenkov10:04:23

@andre: я планирую

artemyarulin10:04:31

кто-нить Rum уже использует? Как оно ащще?

asolovyov12:04:59

я вовсю

artemyarulin12:04:04

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

asolovyov12:04:14

та чему там быть готовому

asolovyov12:04:17

посмотри на кол-во кода

artemyarulin12:04:23

ага, это и радует

asolovyov12:04:26

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

asolovyov12:04:46

1 штука раздражает - из-за дизайна апи в миксинах не видно аргументов компонента

asolovyov12:04:55

а жаль, потому что миксины с ними были бы проще очень часто )

asolovyov12:04:02

но это одна претензия

artemyarulin12:04:06

а как там c RN поддержкой? В cljsrn канале грили что вроде все пучком и на хелло ворлде работает

asolovyov12:04:07

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

asolovyov12:04:13

ну вот как-то так

asolovyov12:04:27

@misha пытался его заставить работать

asolovyov12:04:29

вроде все получилось

asolovyov12:04:33

с так что с ним поговори simple_smile

asolovyov12:04:39

я с этим не вожусь

artemyarulin12:04:57

а точно, он. @misha Как там? Мож есть где gist чего поменять надо? Хочу поиграться

artemyarulin12:04:30

Про Rum - т.е. апи стабилизировалось, менять по крупному ничо не будете, можно брать?

asolovyov12:04:42

rum давно стабилизировался, угу

asolovyov12:04:49

даже та моя ветка с серверным рендерингом апи не меняет

artemyarulin12:04:18

отлично, поиграюсь

andmed13:04:08

@andre: @ssesutchenkov тоже думаю заглянуть

misha13:04:40

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

;; где-то у тебя уже будет это:
(set! js/window.React (js/require "react-native"))
...
(defn mount [component node]
  (js/React.render component node))

misha13:04:07

в роме там:

(defn mount [component node]
  (js/ReactDOM.render component node))

artemyarulin13:04:48

ааа, точно же - функция же. А пример из ридми будет работать?

(let [component (rum/mount element dom-node)]
  (add-watch state :render
    (fn [_ _ _ _]
      (rum/request-render component))))

artemyarulin13:04:24

как мне перерендерить если стейт поменялся? будет render queue работать?

misha13:04:29

ну и с чем колупаюсь сейчас, так это знать что и когда оборавичивать в js->clj, при работе с нативными (jsx) компонентами, типа фейсбучного Navigator

misha13:04:50

из какого ридми?

misha13:04:04

пример какой именно? у тебя в компонентах будут не [:div ...], а (touchable-highlight ...)

misha13:04:28

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

artemyarulin13:04:35

как ты ререндеришь когда стейт поменялся? вызываешь еще раз mount?

misha13:04:56

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

misha13:04:12

а. нет. там же как в RN:

misha13:04:16

(rum/defc nav []
  (navigator
    {:initialRoute   (routes/home-page 0)
     :renderScene    dispatcher
     :configureScene animator}))

(defn mount [component node]
  (js/React.render component node))

(def root (nav))

(defn init []
  (mount root 1)
  (.registerComponent app-registry "rumapp" (fn [] root)))

misha13:04:13

т.е. тебе маунтить нужно только 1 раз при запуске приложения

misha13:04:05

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

artemyarulin13:04:27

а т.е. у тебя нет глобал стейта как в оме, понял ага

misha13:04:17

либо делаешь атом, маунтишь глупую вьюху, которая rum/reactive на этот атом, а внутри по клику меняешь атом, и вьюха сама ререндерится, потому что там типа watcher на атом реагирует

misha13:04:32

нууу. есть. я ща "переношу" датаскриптовую базу

artemyarulin13:04:40

а ну вот - я спрашивал про это, работает - круто simple_smile

artemyarulin13:04:15

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

misha13:04:09

а вот с этими танцами с app-registry я не разбирался особо, пока что у меня 50/50 карго-культ/копипаст дривен девелопмент

misha13:04:20

посмотрю

misha13:04:01

ну на лаптопе он достаточно шустрый. по крайней мере восстанавливать дохера данных из локалстораджа

artemyarulin13:04:29

app-registry я знаю, разбирался когда свой враппре писал для RN https://github.com/artemyarulin/ktoa/blob/master/src/ktoa/core.cljs#L32-L43

misha13:04:31

хотя надо сначала определить, что такое медленный )

artemyarulin13:04:06

ну я за что купил - за то продал) Ты спроси на #C0E1SN0NM

misha13:04:39

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

misha13:04:52

может где-то кешировать чо получится. на вебе я вычитывал 1 раз "всё" дерево данных в рутовой вью, и спускал как аргументы чувакам ниже. а по ивентам - писал в ДС, получалость ваще ок, особенно, если в дебаунс обернуть. подозреваю, что если в каждую вью передавать айди сущности, и каждая на рендер будет в ДС ломиться за данными по этой айди - могут ласты склеиваться начать, да

artemyarulin13:04:41

не планируешь какой пример в опен сорс выпустить про rum + RN + DS?

artemyarulin13:04:50

я бы посмотрел

misha13:04:37

рано сильно

misha13:04:43

я б и сам посмотрел бы )

misha13:04:49

ты покрути ром немного сначала. хитрости в связке rum/DS нет вообще

misha13:04:32

это в ом DS хз как вкручивать, и там расцвели туториалы. а тут всё просто. сложно react-native->cljs

a.espolov14:04:47

что такое DS?

abtv16:04:23

@artemyarulin: а ты на обычный Om, он же Om.old смотрел? Тоже сложный?

asolovyov16:04:50

@abtv: ну он вообще неинтересный, много текста, а толку не больше, чем со всего остального

lapooh16:04:02

Добрый вечер! Ктонить пробовал(или имеет понимание как) маппить om.next на REST?

abtv16:04:21

хм, у меня он тяжело идет, да, но я это пока списываю на неумение готовить. те же запросы + если с датомиком то будет круто, без реста и т.п. @asolovyov

abtv16:04:49

у тебя то же самое в Rum+ DS?

abtv16:04:59

только без датомика

abtv16:04:38

Я вижу плюс в том, что он должен меньше данных гонять и в том, что в компоненте можно декларативно объявить все данные, которые ему нужны. Или я вообще не туда? simple_smile

abtv16:04:36

@lapooh: а зачем это нужно? он же не предназначен для этого. или это на первое время?

lapooh17:04:49

Ну во первых хотелось попробовать натянуть om на уже имеющийся api. А во вторых не вижу больших преимуществ от предложенного omом варианта общения с сервером(на серве тажа каша из end-points, только rest для меня понятней).

abtv17:04:30

имхо, они так датомик продвигают, с ним это имеет больше смысла

rmuslimov17:04:50

@lapooh: а что привлекает в om.next кроме предложенного механизма взаимодействия с сервером? мне казалось это основная его фича, нет?

lapooh17:04:19

Один атом, декларативное описание данных для каждого компонента на основе запросов, нормализация стейта и даже механизм синхронизации(хотя пока не понятно как его кастомизировать)

rmuslimov17:04:16

кроме последнего это есть везде кажется

rmuslimov17:04:29

а последнее ты меняешь на рест, если я правильно понял

abtv17:04:03

а где есть нормализация кроме датаскрипта? @rmuslimov

rmuslimov17:04:24

ок, а что такое нормализация?

abtv17:04:08

не хранить одни и те же данные в нескольких местах

rmuslimov17:04:16

я понимал это как нормализация данных, т.е. минимальное представление

rmuslimov17:04:42

ну вот например аюстракция reagent/reaction

rmuslimov17:04:53

разве не то?

lapooh17:04:37

А можно ссылочку(что-то не гуглится)?

rmuslimov17:04:57

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

abtv17:04:26

@rmuslimov: ага, я тоже не видел это

rmuslimov17:04:43

сейчас попробую найти пример

abtv17:04:59

у тебя граф или дерево? тут вся разница (ну да, там тоже может быть по разному, но в общем) @rmuslimov

abtv17:04:57

если строение стейта не зависит напрямую от интерфейса, то я бы назвал это номализацией

rmuslimov17:04:17

ничего подробного не могу найти https://github.com/Day8/re-frame/wiki/Writing-Subscriptions

rmuslimov17:04:26

там есть упоминание про reaction

rmuslimov17:04:57

виртуальный атом который дергается если fn от state поменялся

lapooh17:04:55

Ну идея понятна, но это всеже ручной привод, в то время как в om.next это обеспечивается из коробки

asolovyov17:04:30

@abtv: я сейчас без DS живу, потому что на андроиде он неюзабельный

asolovyov17:04:23

андроид потому что тормозит

az17:04:04

классный конспект

misha17:04:05

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

misha17:04:35

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

misha17:04:08

но мне бы ооочень не хотелось бы. все эти #js, протоколы и реифаи... фу

artemyarulin18:04:00

@abtv: Оригинальный ом не смотрел. Я ом некст пытался сделать как основной либой для 1 текущего иОС приложения + одного будущего + веб сайтик с целью пошарить как можно больше логики. Казалось бы декларативные запрос у компонентов, но: - Сами авторы говорят: reusable component - pure component. Запросы мимо кассы - Апи у меня рест/soap(sic!) и нативное IO операционной системы - опять мимо Ради одной нормализации - это перебор. Ну и да - толи я может сильно тупой, толи доков не много - но я ом-некст месяца 3 копал и все еще дофега не понимаю

artemyarulin18:04:25

тот же Rum я нашел сегодня и за часик понял что да как

artemyarulin18:04:51

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

misha18:04:44

ну бложек это ты сильно промахнулся kappa

artemyarulin18:04:23

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

misha18:04:58

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

misha18:04:11

вопросов к чему? к ому?

misha18:04:36

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

misha18:04:15

всё равно принятие решения в какой момент синкать данные - ортогонално фреймворку

artemyarulin18:04:49

ну вот про большое приложения я наверно соглашусь, вот про производительность нет - Rum/Reagent/Rum, все они с RN работают 1 в 1, разницы не должно быть

misha18:04:37

ну там же в оме пишешь явно #js {...} много где

misha18:04:00

можно сэкономить на clj->js наверное сколько-нибудь kappa

misha18:04:34

нужно определение "большого" приложения

misha18:04:58

в количестве контролов, вьюх, хз чего там еще

artemyarulin18:04:27

ну вобщем да. Я как “ниосилятор” больше не буду гнать на ом - буду рад если тут чуваки поделятся положительным опытом

misha18:04:09

дада. но что-то огромное количество трафика на ом канале отталкивает

misha18:04:47

было бы прозрачнее - был бы штиль уже давно там

artemyarulin18:04:22

ну для справедливости - оно ж альфа еще, доков/примеров нет/мало

artemyarulin18:04:45

какой там хайп будет когда ом зарелизят, уу simple_smile

misha18:04:12

там доков уже огого, и в альфе он полгода точно уже

asolovyov18:04:01

clj->js норм экономит, кстати

asolovyov18:04:19

https://github.com/r0man/sablono/wiki/Optimization-Tips - вот эту штуку кстати нужно знать однозначно

asolovyov18:04:32

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

misha18:04:25

> You can explicitly set the attributes to {} and avoid the ambiguity of children vs attributes that would need to be resolved during runtime. у меня без пустого {} реакт-нейтив и не компилится kappa

misha18:04:25

cljs.user=> (def u {:db/id 1 :user/name "<noname>", :user/stuff [{:db/id 2}]})
cljs.user=> (-> u clj->js (js->clj :keywordize-keys true))
{:id 1, :name "<noname>", :stuff [{:id 2}]}
harold

misha18:04:56

####ский js

abtv20:04:42

кстати, про js->clj. как с ней сделать из жс объекта мапу с кейвордами в ключах вместо строк? я ей что не передаю - все строки там

abtv20:04:38

вызывал (js->clj js-obj :keywordize-keys true) и (js->clj js-obj {:keywordize-keys true}) - один фиг

abtv22:04:43

да, видел уже, нет простого обходного пути?

abtv22:04:26

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