@kotlin_lang

Страница 610 из 982
Nick Senchurin
29.03.2018
11:38:06
кто-нибуьд юзал эту либу? https://github.com/JetBrains/Exposed/wiki

что вообще посоветуете для скулайта и котлина?

Vladislav
29.03.2018
11:42:19
Функция defaultValue может выполниться более одного раза? Это указано в документации же.
Но все-таки ConcurrentHashMap и первой строчкой - is safe for concurrent maps, все-таки API подразумевает безопасность при работе с таким видом коллекций. Ну а так, да в документации написано, да и если в код посмотреть тоже. Но концептуально мне кажется, это странным

Google
Ivan
29.03.2018
11:48:20
А в чем проблема, что defaultValue вызывается более одного раза? На данные в мапе не влияет же.

DY
29.03.2018
11:49:07
кто-нибуьд юзал эту либу? https://github.com/JetBrains/Exposed/wiki
юзаю для чат-ботов, норм либа для пет-проджекта, приятный dsl, вроде пишешь почти что тот же sql, но все типизировано и проверяется, насколько это возможно, в компайл-тайме. но для чего-то серьезного её затаскивать бы не советовал, по-моему они там планировали api менять и глобально переписывать её, но надо проверить, не уверен, не слежу за развитием.

Nick Senchurin
29.03.2018
11:51:27
а про глобальное переписывание, это где-то родмапы есть?

DY
29.03.2018
11:52:55
ишью вроде на гитхабе видел месяца два назад где об этом речь шла, но память может меня обманывать)

Vladislav
29.03.2018
12:01:28
А в чем проблема, что defaultValue вызывается более одного раза? На данные в мапе не влияет же.
так там же значение вычисляется, если значение будет вычисляться по какой-либо сложной логике то может быть гонка. Я получил ошибку когда создавал мапу в которой хранил метрики для мониторинга, ключ там - имя класса + имя метода, а значение метрика из либы io.prometheus, так вот имя метрики должно быть уникально, иначе кидается исключение. Опять же, повторюсь, гарантия атомарности и блокировки потока, есть в методах оригинальной мапы

Ivan
29.03.2018
12:03:48
Мне в этом случае концептуально не нравится наличие сайд-эффектов/io в функции, вычисляющей значение. Я бы это изолировал где-нибудь, а передавал уже чистую функцию. Но, конечно, если была бы гарантия, что defaultValue вызывается не более одного раза, в этом случае и с мутабельным стейтом прокатило бы.

Александр
29.03.2018
13:19:24
Автогенерируемое? Можете пояснить

В плане web не подскажу, а мобилки тестить довольно удобно, можно предоставить набор готовых page object'ов + dsl чтобы qa могли сами писать тесты

Mi
29.03.2018
13:32:46
Приветствую, вопрос по Mockito: можно ли замокать метод, который принимает лямбду так, чтобы он просто выполял предоставленную лямбду? (Сама лямбда на этапе сетапа теста не может быть предефайнена)

Mi
29.03.2018
13:34:19
ну саму лямбду я не могу достать, которая будет выполняться

Google
Mi
29.03.2018
13:44:16
Alexander
29.03.2018
13:53:39
Andre
29.03.2018
14:09:48
что еще есть в error? в дебаге смотрел?

Alexander
29.03.2018
14:23:38
Спасибо!)

Like
29.03.2018
15:12:49
есть либа для DI с ошибками во время компиляции, а не рантайм?

Дмитрий
29.03.2018
15:13:58
https://github.com/google/dagger ?

Like
29.03.2018
15:14:43
https://github.com/google/dagger ?
хочу модную для котлина

Koin
о, благодарю на их readme не нашёл ничего об этом

Mikhail
29.03.2018
15:15:45
>

Это значит написать unit-test (или интегрейшен, если хочешь без моков), который вызовет dryRun() и проверит форсированно весь граф

Alex
29.03.2018
15:50:05
хочу модную для котлина
https://github.com/SalomonBrys/Kodein

Like
29.03.2018
15:52:20
не, пишут, что рантаймы ошибки онли

Тимур
29.03.2018
16:07:25
dagger 2 через complie time работает правда он java, но в котлине тоже можно использовать без проблем

других compile time не нашел, если кто-то подскажет еще какие-то, тоже интересно

Igor
29.03.2018
16:12:46
dagger 2 через complie time работает правда он java, но в котлине тоже можно использовать без проблем
(пока kapt не отвалится при очередном обновление kotlin, dagger или android plugin)

Like
29.03.2018
16:13:48
koin тоже не компайл внезапно, ну лан

Victor
29.03.2018
17:31:17
?лин

Quantum Harmonizer
29.03.2018
18:22:26
?лин
вик?

Google
Тимур
29.03.2018
18:37:55
Раз уж к ночи был упомянут kapt, может тут таки есть его любители и знают ответ на вопрос, который я тут уже как-то задавал?

Всем привет. Как получить nullablity-информацию для возвращаемых значений suspend функций из annotation процессинга? Разверну немного контекст вопроса: я делаю rpc на базе coroutines и кодогенерации через kapt. Допустим, есть rpc сервис такого вида: @RpcService interface MyRpcService { suspend fun method1(a: Int, b: String): Int suspend fun method2(c: Int, d: String): Int? } Одна из задач при изготовлении rpc - надо сгенерить примерно такой клиентский прокси-класс: class MyRpcServiceProxy { suspend fun method1(a: Int, b: String): Int { кодогенеренный boilerplate, который засовывает в сеть параметры, получает ответ от сервера и возвращает его } suspend fun method2(c: Int, d: String): Int? { ... } } В частности, кодогенератор должен знать, какой тип возвращают методы - Int или Int? Кодогенератор на базе annotation processing имеет доступ к метаинформации о типах через пакет javax.lang.model Возвращаемый тип он видит через Continuation<? super T>, где T - искомый тип. Для обычных параметров nullablity можно узнать через наличие аннотации @Nullable, однако в случае Continuation как извлечь nullablity для T - непонятно. Я излазил весь javax.lang.model, дергал все функции подряд, но нигде такой информации не нашел.
вопрос

guga
29.03.2018
19:45:33
вик?
вик[донут]?

Igor
29.03.2018
20:48:54
koin тоже не компайл внезапно, ну лан
Да и не нужно (тестом покрой), либы с кодгеном для ущербных языков

Руслан
29.03.2018
20:49:39
вопрос
Я понимаю что вопросом на вопрос некрасиво, но для чего тебе эта информация? Ты будешь генерить Continuation в своем rpc?

Тимур
29.03.2018
20:50:21
я буду генерить клиентскую проксю, в которой возвращаемый тип либо T, либо T?

Руслан
29.03.2018
20:51:23
Если не сложно можешь нарисовать словесно/псевдокодом клиент-сервер?

Тимур
29.03.2018
20:54:17
ну там в исходном вопросе был псевдопример прокси Есть rpc интерфейс, мы его дергаем, а реализация на другом сервере @RpcService interface MyRpcService { suspend fun method1(a: Int, b: String): Int suspend fun method2(c: Int, d: String): Int? }

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

в принципе у меня уже все работает, вот только с этим несчастным возвращаемым Int? заковыка есть костыльный workaround, но хочется счастья

Руслан
29.03.2018
21:06:05
А ты не пробовал смотреть на @Metadata аннотацию?

Я не уверен что там вообще есть это инфа, но чисто как идея

Тимур
29.03.2018
21:07:23
не пробовал, посмотрю что это такое

Руслан
29.03.2018
21:07:56
Там протобаф (вроде) в аннотации с метадатой о классе

Вообще кажется что только через такие костыли, или просить JB чтобы добавили для jdk8 аннотацию на параметр

Тимур
29.03.2018
21:13:18
там еще дело в том, что этот kapt на самом деле похоже просто завернутый в бумажку annotation processor из java он предоставляет всю инфу через жавовское api

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

Руслан
29.03.2018
21:14:17
Ну вот это как раз понятно, была бы возможность использовать psi или обещанный common ir думаю проблемы такой не было

Тимур
29.03.2018
21:17:12
но поскольку я уже все выкопал через kapt что мне надо кроме вот этой мелочи, то все переделывать чтобы закопаться с другой стороны, даже если она более правильная, уже как то не хочется

Google
Тимур
29.03.2018
22:17:18
Я понимаю что вопросом на вопрос некрасиво, но для чего тебе эта информация? Ты будешь генерить Continuation в своем rpc?
На всякий случай уточню. Я генерю котлиновские исходники, в которых все описано через suspend методы. Continuation у меня в явном виде нет, то что я нагенерил потом компиляет котлин и оно только там в его недрах появляется, как и для обычного кода.

Руслан
30.03.2018
10:39:28


Sergey
30.03.2018
10:42:14
>У меня есть альтернативная гипотеза, про которую тоже не знаю, насколько она верна: многим людям нужно как-то доказывать себе и окружающим, что они очень умные. Поэтому есть каста людей, которые ни на что не променяют программирование на C++ или Scala во всей полноте этих языков: это такой способ чувствовать себя очень умным. Вот человек справился с очень сложной штукой, и он будет использовать её дальше, чтобы подтверждать свою невероятную компетентность и талантливость, потому что не всякий может освоить систему такой сложности. И даже если для конкретной задачи система прагматически не обязана быть такой сложной, человеку может нравиться это делать, просто потому что «я же умею такую крутейшую вещь, а вы не умеете».

Kirill
30.03.2018
10:42:57
Он это часто повторяет.

Mikhail
30.03.2018
10:44:14
Это вообще девиз Котлина

Руслан
30.03.2018
10:44:38
>У меня есть альтернативная гипотеза, про которую тоже не знаю, насколько она верна: многим людям нужно как-то доказывать себе и окружающим, что они очень умные. Поэтому есть каста людей, которые ни на что не променяют программирование на C++ или Scala во всей полноте этих языков: это такой способ чувствовать себя очень умным. Вот человек справился с очень сложной штукой, и он будет использовать её дальше, чтобы подтверждать свою невероятную компетентность и талантливость, потому что не всякий может освоить систему такой сложности. И даже если для конкретной задачи система прагматически не обязана быть такой сложной, человеку может нравиться это делать, просто потому что «я же умею такую крутейшую вещь, а вы не умеете».
А мне кажется что не человек чувствует что он умный, а ему нравится делать настолько сложные, но при этом красивые системы. Хотя можно было на коленке хуяк-хуяк ?

Quantum Harmonizer
30.03.2018
10:44:49
> Если в 2016-м «неандроидных» пользователей у нас было заметно больше «андроидных» Откуда такая статистика, не могу понять. Бэкэнды консервативные же, а вот андроиде всё плохо и нужно хоть что-нибудь приятное.

И в #server в Slack, кажется, <1000 пользователей.

Sergey
30.03.2018
10:46:53
А мне кажется что не человек чувствует что он умный, а ему нравится делать настолько сложные, но при этом красивые системы. Хотя можно было на коленке хуяк-хуяк ?
это как с монадами, вот есть же нуллабл типы и корутины, но люди все равно будут орать что Optional и Future лучше "патамуша математика"

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

Mikhail
30.03.2018
10:48:25
ну мне Future + Optional больше нравятся как раз потому что они проще, чем nullable и корутины

Mikhail
30.03.2018
10:49:35
ну да, nullable и корутины - спец кейсы, Optional и Future имею общую композабельную структуру

ты как будто бы из кирпичиков лего строишь код

Sergey
30.03.2018
10:50:26
а потом весь код из map/flatMap состоит

Mikhail
30.03.2018
10:50:26
а nullable и корутины - это хорошо заточенные под конкретную задачу вещи

Ivan
30.03.2018
10:51:10
Mikhail
30.03.2018
10:51:16
а потом весь код из map/flatMap состоит
да, и это проще, чем иметь в одном месте ?. в другом async а в третьем делать свой велосипед

вон, люди решают задачу Result раз в неделю в этом чатике

Google
Sergey
30.03.2018
10:52:10


Ivan
30.03.2018
10:52:21
Вопрос, как можно покрасивее оформить код следующего вида: getSomeValue<String>?.let { val firstValue = it getSomeValue<BigDecimal>?.let { val secondValue = it getSomeValue<Integer>?.let { val thirdValue = it Triple(firstValue, secondValue, thirdValue) } } } Т.е. есть 3 значения, которые нужно получить в определенном порядке. При отсутствии предыдущего значения получение следующего значения не имеет смысла, и результат всей цепочки вызовов будет null. Хотелось бы из уродливой лесенки callback'ов сделать что-то более похожее на цепочку вызовов, но не приходит в голову, как это сделать более-менее универсально (разве что сделать что-то вроде билдера с контекстом, примерно как это выглядит в корутинах, но на костыльном приводе).

Mikhail
30.03.2018
10:52:40
в функциональных языках придумали do-нотацию

если тебя только коллбеки беспокоят

Sergey
30.03.2018
10:53:11
в функциональных языках придумали do-нотацию
зачем что-то еще придумывать если можно писать нормальный код без плясок?)

Ivan
30.03.2018
10:53:13
Что-то гавнокод, научитесь стримы комбайнить

Mikhail
30.03.2018
10:53:14
я говорю, что проще, когда у всего один интерфейс и одни законы и все одинаково

когда метод может делать какие-нибудь обобщенные вещи и над Result и над Option и над Future любым другим

Берял
30.03.2018
10:54:13
зачем что-то еще придумывать если можно писать нормальный код без плясок?)
а корутины у тебя с рождения есть, или их кто-то придумал?

Берял
30.03.2018
10:54:43
и имлементация их все-таки посложнее будет чем у do нотации или for-comprehension

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