@kotlin_lang

Страница 613 из 982
Alexey
31.03.2018
13:41:04
Микросервисы?
По разному, просто сложная и развесистая инфраструктура

Alexey
31.03.2018
13:50:30
Fs2?
Скалка

Функциональные стримы

Google
Ivan
31.03.2018
13:51:39
ааа, в скале переизобрели rxjava

Alexey
31.03.2018
13:52:07
Ivan
31.03.2018
13:52:35
def converter[F[_]](implicit F: Sync[F]): F[Unit] - епт

Igor
31.03.2018
13:55:14
Ой давайте не свалиться в осуждение скалы, а кому не имется можно пройти в @scala_ru или @pofftop

Igor
31.03.2018
13:57:31
Лол, почти каждый день стоит подобная задача, сходить в 2-3 сервиса параллельно
У меня скоpее вечная агpегация всего на свете, заставляющая меня стpашные Function4, Function5 использовать...

Александр
31.03.2018
14:16:23
Топ, спасибо

@android_ru, @jvmchat, @javastart

Ivan
31.03.2018
15:17:21
Слушайте, а чем разница между ktor и okhttp?

Quantum Harmonizer
31.03.2018
15:18:54
Слушайте, а чем разница между ktor и okhttp?
O_o Первое — асинхронно-корутинная обёртка над веб-серверами, второе — HTTP-клиент.

Ivan
31.03.2018
15:18:55
Я просто читаю интерьвью с Бреславом, он там говорит, мол, круто что делают

Quantum Harmonizer
31.03.2018
15:19:48
Разве в кторе нет клиента?
Не знаю, но изначально это серверная штука, которой на клиенте делать нечего.

Boris
31.03.2018
15:20:10
Окхттп кстати очень просто в корутины оборачивать

Google
Ivan
31.03.2018
15:20:12
Как-это? А асинхронные запросы?

Boris
31.03.2018
15:20:31
Использую его во всех своих проектах

Quantum Harmonizer
31.03.2018
15:20:39
Как-это? А асинхронные запросы?
Но не тащить же всю серверную обвязку, весь ktor-core в клиент.

Ivan
31.03.2018
15:21:33
Корутины для этого и завозили, чтобы принимаешь запрос, делаешь 3 других, компануешь результат, одаёшь на изначальный запрос

Ну Роман именно за это топил

Boris
31.03.2018
15:21:47
Один метод и у тебя уже клиент провайдит саспендабл отправку

Kirill
31.03.2018
15:22:04
Разве в кторе нет клиента?
Есть отдельный http client //cc @LeonidStashevsky

Ivan
31.03.2018
15:25:10
Есть отдельный http client //cc @LeonidStashevsky
Оммм... честно говоря не понял ответа, можно немного подробнее?

Kirill
31.03.2018
15:25:44
Леонид может ответить. Он его делает

Ivan
31.03.2018
15:27:10
Okhttp?

Kirill
31.03.2018
15:27:24
Ivan
31.03.2018
15:27:52
Ktor
Ага, спасибо, не знал про него

Ну в общем, идею я понял, ктор изначально сервер, окхттп изначально клиент. Спасибо

Руслан
31.03.2018
15:40:57
Ktor
Ktor он вполне себе и клиент, это отдельная либа

Есть разные реализации под jvm: apache, jetty, java.net

В пределе будут имплементации для js/native

Окхттп кстати очень просто в корутины оборачивать
Внезапно любой асинхронный API очень просто обернуть в корутины

Leonid
31.03.2018
15:50:00
Оммм... честно говоря не понял ответа, можно немного подробнее?
Привет, про клиент можно почитать тут: https://ktor.io/clients/http-client.html

Quantum Harmonizer
31.03.2018
15:51:31
внезапно любой синхронный клиент + тред пул можно обернуть в корутины :trollface:

Google
Leonid
31.03.2018
15:54:41
внезапно любой синхронный клиент + тред пул можно обернуть в корутины :trollface:
Это правда, но только в этом не очень много смысла. Поток на запрос всё равно блокируется

Quantum Harmonizer
31.03.2018
15:55:44
Ну, появляется возможность использовать такой клиент из корутин. (Что мы и делаем в Android.)

Кстати, кто-нибудь использовал nio в Android? Какие-никакие каналы и байт-буферы там есть.

Igor
31.03.2018
15:56:26
Внезапно любой асинхронный API очень просто обернуть в корутины
> асинхронный Но как уже заметили, окнттр таки синхронный

Boris
31.03.2018
15:56:55
Quantum Harmonizer
31.03.2018
15:56:58
> асинхронный Но как уже заметили, окнттр таки синхронный
okio вроде и nio поддерживает. Вдруг okhttp этим пользуется там, где возможно?

Руслан
31.03.2018
15:57:30
Асинхронный апи у него тоже есть
Api, но внутри там просто тредпул и блокирующие запросы

Boris
31.03.2018
15:58:10
Api, но внутри там просто тредпул и блокирующие запросы
Да, но в корутины зато обернуть просто ?

Quantum Harmonizer
31.03.2018
15:58:33
А вдруг нет ? (надо сорцы смотреть)
Несмотря на божественный API, исходники читаются довольно тяжело.

Igor
31.03.2018
16:07:34
Несмотря на божественный API, исходники читаются довольно тяжело.
Кстати, он же поддерживает http/2 и если все запросы к одному хосту, то по идее они могут идти паралельно

Alexey
31.03.2018
16:10:10
А поверх нетти есть чо с вменяемым апи?

Alexey
31.03.2018
16:17:18
ktor?
Ага, а ещё есть?

Quantum Harmonizer
31.03.2018
16:19:29
Не подскажу.

Кто что делает, если нужно, чтобы модуль библиотеки использовал приватные (internal) API ядра библиотеки? Package-private нет, да и split package нельзя. @PublishedApi не особо поможет. Или я что-то делаю в корне не так?

Brian
31.03.2018
16:21:35
Из хттп клиентов очень удобный khttp

Quantum Harmonizer
31.03.2018
16:23:30
В Guice по этому поводу как я понял мультибиндинги втащили в core
Не совсем понимаю, что это значит. (я о том, что есть internal-классы, которые мне нужно видеть из другого модяля библиотеки, но нельзя показывать клиентам.)

Google
Quantum Harmonizer
31.03.2018
16:24:20
И вообще, хочется публичным классом экстендить internal-класс :)

Руслан
31.03.2018
16:24:54
Это значит что кажется так не делают

Quantum Harmonizer
31.03.2018
16:37:46
Модули из Jigsaw тут не помогут?
Помогут, но только в девятке. А библиотека ещё и под ведро.

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

Vladimir
31.03.2018
16:40:11
Если какая-нибудь библиотека будет использовать мой приватный API, а у клиента будет новая версия, полёт конечностей по хипу неизбежен...
Мне на ум приходит делать "классы, которые нельзя использовать напрямую" доступными только в runtime. Например через конфигурацию impelementation в Gradle. Но тогда они должны быть в отдельном jar.

Vladimir
31.03.2018
16:42:28
Хмм, завести другой артифакт, с другой политикой обратной совместимости?
Ну это будет просто нечто, что библиотека и модули будут тянуть как runtime-зависимость.

Руслан
31.03.2018
16:42:40
Quantum Harmonizer
31.03.2018
16:43:04
как они тебе тут помогут?
можно же вроде открыть какие-то классы для определённого модуля?

Руслан
31.03.2018
16:43:34
Нет, ты просто декларируешь api, все другие модули его могут использовать.

Vladimir
31.03.2018
16:45:34
Нет, ты просто декларируешь api, все другие модули его могут использовать.
Из того, что я понял в описании opens to, там много чего можно сделать https://www.oracle.com/corporate/features/understanding-java-9-modules.html

Руслан
31.03.2018
16:46:53
Действительно, я упустил

Quantum Harmonizer
31.03.2018
16:48:13
сложна) я вот только что искал, и подумал, что таки нельзя.

Vladimir
31.03.2018
16:51:16
@LeonidStashevsky Позвольте такой вопрос: я правильно понял, что в ktor будет своя реализация TLS "с нуля"?

Leonid
31.03.2018
16:52:36
@LeonidStashevsky Позвольте такой вопрос: я правильно понял, что в ktor будет своя реализация TLS "с нуля"?
Смотря что вы подразумеваете под фразой "с нуля". Имеется в виду клиент или сервер?

Boris
31.03.2018
17:01:33
Ок
проверил кейз с наследованием от тайпалиаса и всё оказывается уже работает, так что похоже кроме более размытого типа никаких проблем сейчас с использованием тайпалиаса не вижу. Возможно кейз был более сложный, но я сейчас уже найти его не могу

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

хотя возможно в этом нет ничего страшного

Google
Quantum Harmonizer
31.03.2018
17:05:21
всё равно не совсем понятно, почему нужно использовать безымянные типы, если я хочу иметь именованный тип -- да, я делаю тапйалиас, но передать в него можно любую функцию подходящую под сигнатуру
Тут есть интересный упоротый пример с SAM-интерфейсами. Я тогда возрадовался, что в котлине есть нормальный функциональный тип. https://www.youtube.com/watch?v=lonT4bKkjeU

Leonid
31.03.2018
17:07:17
Я про ktor-network-tls
А ну так это просто реализация tls протокола поверх cio-сокетов :)

Boris
31.03.2018
17:09:40
Тут есть интересный упоротый пример с SAM-интерфейсами. Я тогда возрадовался, что в котлине есть нормальный функциональный тип. https://www.youtube.com/watch?v=lonT4bKkjeU
есть разница в необходимости использовать сам вместо функционального типа и упрощенным созданием экземпляра интерфеса с одним методом

Vladimir
31.03.2018
17:10:37
А ну так это просто реализация tls протокола поверх cio-сокетов :)
Реализация TLS звучит как rocket science) Вы это прям будете поддерживать основательно? А SSLEngine чем не подошёл, если не секрет? Или это для кроссплатформенности?

Boris
31.03.2018
17:12:09
т.е. вполне естественно объявить интерфейс Interceptor, с другой стороны так же естественно инстанцировать его упрощенным способом. Особенно это актуально если этот код будет из джавы использован, там ведь тайпалиасы никакие не видны и интерцептор это будет просто Function1

Leonid
31.03.2018
17:13:03
Реализация TLS звучит как rocket science) Вы это прям будете поддерживать основательно? А SSLEngine чем не подошёл, если не секрет? Или это для кроссплатформенности?
SSLEngine мог бы подойти, но у него не самый удобный API(некоторые детали реализации выносятся в интерфейс). Реализация на корутинах получается понятней :)

Boris
31.03.2018
17:13:19
но так же я согласен, что ради небольшого количества кейзов может и не стоило вводить отедльный кейворд, тем более, что с наследованием от тайпалиасов вроде разобрались

Leonid
31.03.2018
17:15:27
@frostbit Насколько решение получилось кросплатформеным - спорно. Я тестировал реализацию в клиенте на android(api >= 26, jdk8) работает. Но увы но сейчас нужна jdk8

Руслан
31.03.2018
17:42:19
https://www.youtube.com/watch?v=ocS-UVZG5iE

Ivan
31.03.2018
17:43:04
Как в котлине обойтись без скалячьих for-comprehension? Например, для кода типа: getOne()?.let { one -> getTwo()?.let { two -> getThree()?.let { three -> DataContainer(one, two, three) } } }

Есть распространенное красивое решение?

Mikhail
31.03.2018
17:43:55
fun <P1, P2, R> let2(p1: P1?, p2: P2?, block: (Pair<P1, P2>) -> R): R? { return p1?.let { v1 -> p2?.let { v2 -> block(v1 to v2) } } }

Ivan
31.03.2018
17:44:27
Ну т.е. вынести ту же самую колбасу в библиотечную функцию

Mikhail
31.03.2018
17:44:34
Ага

Ivan
31.03.2018
17:44:44
И при добавлении еще одного параметра нагородить еще одну колбасу?

Я видел такое в библиотеке komprehensions

Mikhail
31.03.2018
17:45:00
Или тебе надо поставить Arrow и пользоваться Option.map

Семен
31.03.2018
17:45:09
можно разрешить DataContainer принимать nullable классы)

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