
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

Ivan
18.03.2018
09:29:35

Тимур
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
Вы тут вообще копейки обсуждаете

Ivan
18.03.2018
09:41:21

Тимур
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 лучше с точки зрения обратной совместимости, чем бинарный формат, например в случае переименований
удаление полей - это как раз довольно простой случай, который легко поддержать

Quantum Harmonizer
18.03.2018
09:48:03

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

Тимур
18.03.2018
09:49:32
Конечно нужно почитать, но пока это выглядит как магия: вот у вас есть 10 полей, мы их проиндексировали 1,2,3... и передаём с номером, далее впихнули ещёодно поле в начало, как их так проиндексировать чтобы ничего не сломалось, при условии что мы ничего не знаем о старой версии
там всем полям назначаются id, причем навсегда
a: 1
b: 2
c: 3
в потоке идет номер поля, потом данные:
1, a, 2, b, 3, c
если удалил b, то придет:
1, a, 3, c
И ничего не сломается, b выставится в default

Ivan
18.03.2018
09:50:00

Quantum Harmonizer
18.03.2018
09:50:39

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

Ivan
18.03.2018
09:51:13
там всем полям назначаются id, причем навсегда
a: 1
b: 2
c: 3
в потоке идет номер поля, потом данные:
1, a, 2, b, 3, c
если удалил b, то придет:
1, a, 3, c
И ничего не сломается, b выставится в default
Ну я и говорю, если это на программиста возложено, то это понятно
Аррр, числа - это жесть, у нас крио и тоже есть пререгистрация, чтобы инты передавать вместо имени класса, так вот это ТАКОЙ ГЕМОРОЙ
ты просто добавил класс и всё, всё ломается, хотя ты его даже не используешь
Ну ок, я верю что в протобафе как-то поумнее сделано

Тимур
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

Quantum Harmonizer
18.03.2018
09:54:47

Google

Ivan
18.03.2018
09:54:56

Тимур
18.03.2018
09:56:53

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

Тимур
18.03.2018
10:00:48

olzhas
18.03.2018
10:22:25

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
Это работает. Спасибо!

Alexey
18.03.2018
10:27:59
Есть простой принцип, вспомните, что вы не гугл

Sergey
18.03.2018
10:29:53
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

Sergey
18.03.2018
10:32:13

Igor
18.03.2018
10:33:02

Sergey
18.03.2018
10:33:18

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
тогда ты на верном пути)

Albert
18.03.2018
10:37:50

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

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

Igor
18.03.2018
10:55:47

Google

Sergey
18.03.2018
10:57:26
ну эт если await не вызвать
поэтому и говорю что async надо юзать только в связке с await

Тимур
18.03.2018
11:20:01

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()}"""
как тут удалить перенос строки?

Vladimir
18.03.2018
11:56:05

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

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" красным