@kotlin_lang

Страница 591 из 982
Ivan
18.03.2018
09:09:56
Хотя бывает и такое что у этой строки длина была 123, эту длину вы считали на место удалённого инта, а дальше парсинг считал первые 4 байта стоки, а там оказалось число 100, ну и дальше он вполне считает эту строку. И на выходе у вас будет головная боль по определению откуда ж такой монстр приехал

Но это если схема не передаётся вместе с телом, но тогда какая разница между json?

olzhas
18.03.2018
09:14:04
Как подписаться на канал в корутинах?

Судля по доке https://github.com/Kotlin/kotlinx.coroutines/blob/master/reactive/coroutines-guide-reactive.md#subscription-and-cancellation нужно использовать RxJava

Google
olzhas
18.03.2018
09:14:27
Без этого ни как?

Тимур
18.03.2018
09:26:33
С чего бы это? Вот код, который по смещению 42 ожидает инт, вы этот инт удаляете, за ним идёт строка. Получается этот код откусит от строки 4 байта
Почитайте, как протобуф устроен, там есть optional поля. Avro, насколько я слышал, вообще сильно заточен на поддержку обратной совместимости.

Ivan
18.03.2018
09:29:35
Почитайте, как протобуф устроен, там есть optional поля. Avro, насколько я слышал, вообще сильно заточен на поддержку обратной совместимости.
Ну дык, это нужно сразу думать что это поле возможно будет удалено и помечать optional, я рассказывал в целом как ситуация обстоит

Тимур
18.03.2018
09:30:42
в протобуфе лучше придерживаться политики делать все поля optional, так как будущего никто не знает

Ivan
18.03.2018
09:32:51
Ну просто тут же все за перфоманс, вот бенчмарки https://github.com/eishay/jvm-serializers/wiki

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

Тимур
18.03.2018
09:37:57
optional поля дают копеечный overhead фактически там просто id полей, которые можно поместить в один байт, или даже в несколько бит, точно не помню это совершенно несравнимо с json, где все в виде строк например, по трафику выигрыш просто в разы, если не в десятки раз

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

Alexey
18.03.2018
09:40:26
Вы тут вообще копейки обсуждаете

Тимур
18.03.2018
09:42:13
все будет нормально optional поля для того и дизайнились, чтобы их потом можно было выпиливать

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

Google
Ivan
18.03.2018
09:44:50
Конечно нужно почитать, но пока это выглядит как магия: вот у вас есть 10 полей, мы их проиндексировали 1,2,3... и передаём с номером, далее впихнули ещёодно поле в начало, как их так проиндексировать чтобы ничего не сломалось, при условии что мы ничего не знаем о старой версии

Тимур
18.03.2018
09:47:19
ну я просто про то, что не факт, что json лучше с точки зрения обратной совместимости, чем бинарный формат, например в случае переименований удаление полей - это как раз довольно простой случай, который легко поддержать

Ivan
18.03.2018
09:48:17
Удаление и добавление новых - это самый геморой

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

Тимур
18.03.2018
09:49:32
Тимур
18.03.2018
09:51:11
ну фактически тоже мапка, только у полей вместо String идентификаторы - это числа, которые типично влезают в один байт

Ivan
18.03.2018
09:51:13
Аррр, числа - это жесть, у нас крио и тоже есть пререгистрация, чтобы инты передавать вместо имени класса, так вот это ТАКОЙ ГЕМОРОЙ

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

Ну ок, я верю что в протобафе как-то поумнее сделано

Тимур
18.03.2018
09:53:54
ну это не особо парит просто добавляешь в схему поле и пишешь ему номер после последнего на практике это 0.1% процент от геморроя, который связан с поддержкой обратной совместимости

Mikhail
18.03.2018
09:53:58
Я чувствую, что пора добавить сравнение с бинарными сериализатором, какой брать? Протобаф?

Тимур
18.03.2018
09:54:26
зато можно переименовывть поля как тебе душе угодно и ничего не сломается

Ivan
18.03.2018
09:54:26
Но в целом, вариантов не много, либо сам нумеруешь, либо мучаешься

Igor
18.03.2018
09:54:40
Как подписаться на канал в корутинах?
Можно просто в цикле читать через receive() Если канал будет пустым, то корутина просто заснет

Google
Mikhail
18.03.2018
09:57:24
Я думаю парочкой обойтись, место на графике кончается, сильно лениво скрипт трогать, чтобы тип графика поменять

Ну или если кто-нибудь поможет, то все добавим)

Тимур
18.03.2018
10:00:48
ну фактически тоже мапка, только у полей вместо String идентификаторы - это числа, которые типично влезают в один байт
кстати сейчас подумал, что если отсортировать поля по возрастанию id и использовать gamma coding, то для большинства полей id вообще можно одним битом закодировать

Igor
18.03.2018
10:22:50
Почитай, что такое “корутины” и как они работают. Thread не заблокируется, уснет отдельно корутина.

olzhas
18.03.2018
10:23:53
Он заблокируется в цикле

Тимур
18.03.2018
10:24:00
Вы тут вообще копейки обсуждаете
Мир большой. У кого-то копейки, а у кого-то совсем нет. Если бы всегда можно было тупо гонять заархивированные json, то зачем бы тогда гугл и прочие вовсю пилили бинарные сериализаторы. Но раз пилят, значит надо.

olzhas
18.03.2018
10:25:15
fun main(args: Array<String>) = runBlocking<Unit> { val channel = Channel<Int>() launch { for (x in 1..5) { channel.send(x * x) } } println("start") for (i in channel) { println("get $i") } println("end") }

до end Не дойдет.

Igor
18.03.2018
10:26:14
async { for (i in channel) println("get $i") }

olzhas
18.03.2018
10:27:54
Это работает. Спасибо!

Sergey
18.03.2018
10:29:53
до end Не дойдет.
так ты закрой канал

launch { for (x in 1..5) { channel.send(x * x) } channel.close() }

Тимур
18.03.2018
10:30:56
Есть простой принцип, вспомните, что вы не гугл
я знаю что я не гугл, и что из этого следует? протобуф используют очень много где за пределами гугла

Sergey
18.03.2018
10:30:58
olzhas
18.03.2018
10:31:23
так ты закрой канал
Подразумевается что он у меня будет бесконечный. я хочу реализовать паттерн Observer.

Google
Sergey
18.03.2018
10:31:33
и вообще нужен join в его примере тогда, а то он дойдет до end и выйдет

Igor
18.03.2018
10:31:42
лучше launch)
Тем что исключение не пропадет или еще есть что-то?

Sergey
18.03.2018
10:32:13
Тем что исключение не пропадет или еще есть что-то?
семантически лучше, async то deferred возвращает и его нужно дождаться потом

Igor
18.03.2018
10:33:02
семантически лучше, async то deferred возвращает и его нужно дождаться потом
А launch Job (иа defered на следуется от job) и его тоже надо дожидаться

Sergey
18.03.2018
10:33:18
А launch Job (иа defered на следуется от job) и его тоже надо дожидаться
fire and forget же, а дожидаться нужно только чтобы не завершилась программа

Igor
18.03.2018
10:34:21
Ну да, это только если семантическая разница, так то они фактически почти одно и тоже

olzhas
18.03.2018
10:35:23
а можно конкретнее что требуется?
Что то типа екселя. Есть ячейки с параметрами. При из изменении должны меняться данные в других ячейках

Admin
ERROR: S client not available

olzhas
18.03.2018
10:37:22
нужны отслеживаемые переменные. Вот при помощи каналов хочу их огранизовать.

Sergey
18.03.2018
10:37:29
тогда ты на верном пути)

Sergey
18.03.2018
10:37:57
olzhas
18.03.2018
10:39:14
Я начал на Rx делать, а потом про корутины подсказали, что есть каналы. Вот пытаюсь на корутинах сделать. А то rx со всем его зоопарком оператором тяжело дается.

Sergey
18.03.2018
10:40:18
там где меняешь что-то - бросаешь в канал, в другой корутине подписываешь на канал и реагируешь

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

Тимур
18.03.2018
10:40:45
Ну да, это только если семантическая разница, так то они фактически почти одно и тоже
Кстати, тоже интересен вопрос, в чем разница помимо семантики, и что будет плохого, если использовать async в качестве fire and forget

Sergey
18.03.2018
10:41:50
где async тебе вернет еще результат (как let), а с launch видно что не нужно ждать результата

Igor
18.03.2018
10:55:47
Кстати, тоже интересен вопрос, в чем разница помимо семантики, и что будет плохого, если использовать async в качестве fire and forget
launch еще по умолчанию выведет в консоль stacktrace необработанного-исключения, а async нет (и ты не узнаешь о ошибках, если сам не будешь их логировать)

Google
Sergey
18.03.2018
10:57:26
ну эт если await не вызвать

поэтому и говорю что async надо юзать только в связке с await

Igor
18.03.2018
11:50:01
Делаю “свой логер” на inline функции и вопрос про lineNumber для inline-лябды inline fun info(msg: () -> String) { if (!BuildConfig.DEBUG) return val element = Exception().stackTrace[1] println("LOGX :: ${element.fileName}:${element.lineNumber} :: ${msg()}") } В Kotlin все так же нельзя получить ее оригинальное значение? (сейчас оно указывает за груницу файла)

Kylych
18.03.2018
11:54:53
return """${it.firstName} .${it.lastName.first().toUpperCase()} .${it.secondName.first().toUpperCase()}""" как тут удалить перенос строки?

Kylych
18.03.2018
11:56:32
nea

Vitalii
18.03.2018
11:57:07
регекспом?

Kylych
18.03.2018
11:57:44
а нету тут поддержки от котлина в 3 ковычках ?

Sergey
18.03.2018
12:01:32
return """${it.firstName} .${it.lastName.first().toUpperCase()} .${it.secondName.first().toUpperCase()}""" как тут удалить перенос строки?
"""123 |1231 |testes """.trimMargin() только важно | ставить вначале, чтобы оно до этого символа вырезало

Kylych
18.03.2018
12:04:11
ты запускал?

у меня не работает

Sergey
18.03.2018
12:05:50
Kylych
18.03.2018
12:07:51


Sergey
18.03.2018
12:08:48
.replace("\n", "") нужен что-ли?

Kylych
18.03.2018
12:10:11
это то ладно, а в ковычках ни как разрулить?

Andrew
18.03.2018
12:24:41
val n = "123" + "1231" + "testes" Тройные кавычки -- мультилайн строка, логично, что она сохраняет переносы.

И да, в идее, если ты в обычном строковом литерале жмёшь Enter, вот это вот " +\n" среда поставит сама.

Igor
18.03.2018
12:28:38
А можно как-то подписать именно на событие “закрытие канала” у Channel<T> Те при закрытие надо сразу закрыть и сторонний “ресурс”, а не ждать очередной попытки записать.

Like
18.03.2018
15:55:25
проходил кто Kotlin Koans? Не могу понять, что в этом коде не так: https://pastebin.com/gN2JESb3 при попытке проверить решение выкидывает просто "compilation failed" IDE почему-то подсвечивает мне "in" красным



Страница 591 из 982