Clojurians
#clojure-russia
<
2015-12-22
>

This page is not created by, affiliated with, or supported by Slack Technologies, Inc.

seryh08:12:22

работал кто с tcp через aleph.tcp? какая то нездоровая ошибка возникает при отправке некоторых символов кирилицы через телнет https://gist.github.com/anonymous/52e00d2e9e7e9c183411

turtle08:12:41

А ты телнетом откуда отправляешь?

turtle08:12:05

Просто телнеты они какие-то нездоровые в плане отправления нелатинских символов. Лучше свой клиент tcp написать для тестов.

seryh08:12:14

да, пожалуй проверю tcp клиентом другим

seryh08:12:57

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

prepor10:12:01

@artemyarulin: зачем тебе асинхронный если ты можешь просто блокирующе прочитать из канала?

artemyarulin10:12:14

кложураскрипт

artemyarulin10:12:18

там вроде так низя

prepor10:12:11

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

artemyarulin10:12:43

ага, думал мож можно какую магию придумать

a.espolov10:12:17

это че я зря сейчас пытаюсь в cljs принудительно вернуть результат из go блока?

artemyarulin10:12:04

да неа, почему зря - полезный опыт :simple_smile:

artemyarulin10:12:41

вообще да, блокирующего рида из канала НЕ внутри го блока нету в CLJS

a.espolov10:12:46

я наивно пытался использовать <!!

artemyarulin10:12:38

грусть печаль - ом-некст хелло ворлд вместе с реактом, даже в advanced compilation mode весит 300kb, пожатым гзипом 80кб

a.espolov10:12:50

а так разве не с любым современным подходом будет?

a.espolov10:12:28

вон соседи пишут на 2-ом ангуляре

artemyarulin10:12:29

наверно ага, ванилла жс в этом хорош :simple_smile:

a.espolov10:12:46

с jquery такая же хрень будет)

artemyarulin10:12:49

хм, с другой стороны можно раскидать по модулям или грузить om-next и react с CDN.. наверно

a.espolov10:12:24

так вот у них вес в среднем 1 мб

a.espolov10:12:31

но логика при этом занимает 150кб

a.espolov10:12:41

и приложение не сильно большое

artemyarulin10:12:52

это уже пожатое О_о

artemyarulin10:12:45

аа, там же нету Google Clousure и соответсвенно нету dead code elimination, у нас чутка получше с этим всеж.

artemyarulin10:12:52

но блин 1 метр, ппц

a.espolov10:12:07

второй раз из кэша будет читаться)

seryh10:12:00

а как принято Exception обрабатывать в async go-loop? вот этот код уходит в рекурсию при throw Exception - https://gist.github.com/anonymous/750c341a3c4f808c472d и (recur) в блоке try вызвать нельзя

artemyarulin10:12:22

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

artemyarulin10:12:47

Я видел народ делает иногда возвращает 2 канала со значениями и с ошибками

seryh10:12:03

тож видел, выглядит как костыль жуткий

artemyarulin10:12:20

хотя я лично передаю error объект просто и если надо прокидываю его дальше

artemyarulin10:12:15

return коды наше все да. Надо посмотреть как там чуваки на го эту проблему решают

artemyarulin10:12:42

а тьфу - у них никто throw не делает же, все возвращает [val, err] туплы

artemyarulin10:12:48

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

artemyarulin10:12:52

или я туплю?

seryh10:12:08

как раз канал если закрыть, recur начинает вызыватся всегда

prepor10:12:08

> пожатым гзипом 80кб это ж очень хороший результат

seryh10:12:12

так как нет больше блока

artemyarulin10:12:28

@prepor: Ну счас я подумав что в эти 80 кило входит CLJS + React + OM + Goog.Clousure - может даже и да

prepor10:12:33

seryh: некоторые (мы) оборачиваем го-блоки в непольщие врапперы и возвращаем эксепшен (если он был) в качестве результата выполнения

artemyarulin10:12:46

@seryh: эм, ну а ты чего хотел? Ты может хотел отловить эксепшен, закрыть канал и НЕ пытаться больше go-loop продолжать или чо?

prepor10:12:11

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

larhat10:12:37

^^ враперы от @prepor

artemyarulin10:12:37

а блин, не успел :simple_smile:

prepor10:12:06

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

seryh10:12:14

artemyarulin: да я понимаю причину рекурса, у меня просто этот канал биндится в либу aleph.tcp которая при ошибке закрывает канал, в гисте эмуляция этого поведения

prepor10:12:57

seryh: конкретно в твоем случае: возвращай какое-то значение из блока с try. например ::stop в случае эксепшена. если значение = ::stop то не продолжай рекурсию, если нет — продолжай

prepor10:12:11

(если я правильно понял, что ты хочешь получить)

seryh10:12:04

да я походу пытаюсь прикрутить каналы к либе которая для этого не особо подходит

seryh11:12:04

мм, а как можно проверить закрыт канал или нет?

seryh11:12:34

ничего похожего на (close? chan) в доке нет

seryh11:12:02

а да, (<! chan) nil же вернет

prepor11:12:01

seryh: close? нет бай дизайн

seryh11:12:55

вообщем вот такая модификация решила мою проблему https://gist.github.com/anonymous/e29755d17bafda438300

seryh11:12:18

а тема с передачей ексепшена интересна

prepor11:12:55

seryh: продюсер-то при этом ожидает, что ему канал закрыть могут?

prepor11:12:33

ну и m-dec у тебя будет вызываться на nil, что как-не не очень

prepor11:12:06

как-то так бы:

(defn channel-handler [ch]
  (go-loop []
    (when-let [ch-data (<! ch) ]
      (let [res (try
                  (let [msg (m-dec ch-data)]
                    (println "->" msg)
                    (if (= msg "stop")
                      (throw (Exception. "my exception message"))))
                  (catch Exception e (prn "channel exception: " (.getMessage e))
                         (close! ch)
                         (prn "channel shutdown!")
                         ::stop))]
        (when-not (= ::stop res)
          (recur))))))
но это не отменяет вопрос про продюссера )

prepor11:12:34

+ это же "упрощенный" пример? на самом деле ты не используешь эксепшены для ловли "stop"? и этот "stop" это что? часть протокола? ты посылаешь? почему бы не посылать что-то более осмысленное или просто не закрывать канал?

seryh11:12:11

да, это упрощенный пример, не стоит в нем копатся )

seryh11:12:30

просто обкатываю каналы

shinych12:12:29

ищу библиотечку для filesystem watch, на http://www.clojure-toolbox.com/ их восемь штук аж, может кто чего посоветовать?

larhat13:12:50

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

shinych13:12:17

ага, тоже заметил

artemyarulin14:12:36

спросил уже в другом канале но спрошу еще тут - я пишу extern файл для react native и вот думаю как лучше его распространять? Тупо положить в npm например, оттуда сливать и потом при компиляции уже указать :externs [“node-modules/react-native-externs/react.native.externs.js”] или есть может какой пральный каноничный путь? через лейн как-нить?

larhat14:12:13

я использовал cljsjs packages, или как их там, и там есть место для extern

artemyarulin14:12:48

а ничего что у меня только экстерн файл будет?

artemyarulin14:12:56

без самой либы?

larhat14:12:16

так там если посмотришь все "пакеты" так и описаны — екстерн и урл откуда брать

larhat14:12:04

ну и мне cljsjs/packages нравится, что потом удобно использовать: [cljsjs/llexus-form "0.7.1-1"] и всё

artemyarulin14:12:26

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

larhat14:12:42

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

All packages provided by cljsjs provide deps.cljs files that will be automatically picked up by the Clojurescript compiler as of 0.0-2727. Versions of the Jar reflect the version of the packaged JS lib.

artemyarulin14:12:54

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

rm14:12:39

Помогите с reagent-ом, пожалуйста. Вот у меня есть вьюха, которая почему-то не обновляется, когда обновляется соответствующий стейт. Только этот стейт deref-ается не в самой вьюхе, а в функции, которую он вызывает. Как с этим бороться?

rm14:12:06

приходится делать костыль и render-component

artemyarulin15:12:46

ха, Scala.js тоже юзает Google Closure, не знал :simple_smile:

rm15:12:17

o\

WebSocket connection to 'ws://<my_site>/chsk?client-id=2970d62e-559e-49cc-9fc0-fa91a5aac4f4' failed: Error during WebSocket handshake: Unexpected response code: 200
app.js:1257 ERROR [taoensso.sente] - WebSocket error: [object Event](anonymous function) @ app.js:1257
кто-нибудь встречал такую хрень? На локалхосте даже в прод-режиме не воспроизводится, только на сервере

larhat15:12:05

какие различия в окружении? балансер/прокси?

turtle15:12:23

Участвует кто?

rm15:12:10

ответ -- nginx нишмогла в вебсокеты. Теперь шмогла. Извините

a.espolov16:12:18

скомпилированный реактовский проект npm'ом

a.espolov16:12:36

я же должен подключить к в cljs как extern?

shinych16:12:30

@rm "Помогите с reagent-ом, пожалуйста” - а покажи как оно у тебя (gist?)

rm16:12:28

ну и на home/view когда приходят данные, они обновляются, а на videos/index-view -- нет

shinych18:12:53

а что такое state? проверь, что это reagent/atom, а не clojure.core/atom (стандартное попадалово)

shinych18:12:56

и чего ты его параметром не кидаешь? session вот эта реагентная тоже сомнительная штука (но вопрос вкуса, наверное)

rm18:12:32

это reagent/atom

rm18:12:28

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

rm18:12:33

попробую

shinych18:12:59

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

shinych18:12:22

а! вижу

shinych18:12:03

ты videos/index-view как функцию вызываешь (круглые скобки), а надо как реагент-компонент (квадратные)

rm18:12:21

а что не так с session? Что вместо нее, просто атом / ratom?

shinych18:12:26

core.cljs 6-8

rm18:12:31

да, вижу

shinych18:12:18

session - это ж просто хелпер такой для глобального атома. мне как-то не по себе от такого :simple_smile:

shinych18:12:41

и смотри - у тебя и session этот используется, и state и links глобальные

shinych18:12:02

это три разных глобальных атома, грешновато имхо

shinych18:12:23

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

rm18:12:39

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

rm18:12:03

error rendering component

shinych18:12:28

#(videos/index-view %) —> #([videos/index-view %])

rm18:12:29

ладно, ща сначала подебажу, потом расскажу, если не получится

rm18:12:30

спасибо!

rm18:12:31

аа, туда. Блин, точняк

rm18:12:12

или нет