
Nick Senchurin
29.03.2018
11:38:06
кто-нибуьд юзал эту либу? https://github.com/JetBrains/Exposed/wiki
что вообще посоветуете для скулайта и котлина?

Ivan
29.03.2018
11:39:11

Vladislav
29.03.2018
11:42:19

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
юзаю для чат-ботов, норм либа для пет-проджекта, приятный dsl, вроде пишешь почти что тот же sql, но все типизировано и проверяется, насколько это возможно, в компайл-тайме. но для чего-то серьезного её затаскивать бы не советовал, по-моему они там планировали api менять и глобально переписывать её, но надо проверить, не уверен, не слежу за развитием.
7 таблиц, 2 из которых с foreign key . Не думаю , что текущий проект сильно серьезен в плане работы с бд... Сохранить пачку из ~10 значений, через некотрое время удалить... в общем обычные круды
а про глобальное переписывание, это где-то родмапы есть?

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: можно ли замокать метод, который принимает лямбду так, чтобы он просто выполял предоставленную лямбду? (Сама лямбда на этапе сетапа теста не может быть предефайнена)

Quantum Harmonizer
29.03.2018
13:33:41

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

Alexey
29.03.2018
13:35:52

Google

Mi
29.03.2018
13:44:16

Alexander
29.03.2018
13:53:39

Andre
29.03.2018
14:09:48
что еще есть в error? в дебаге смотрел?

Ivan
29.03.2018
14:22:21

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 ?

Mikhail
29.03.2018
15:14:12

Like
29.03.2018
15:14:43
Koin
о, благодарю на их readme не нашёл ничего об этом

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

Alex
29.03.2018
15:50:05

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

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

Руслан
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

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

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

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

Sergey
30.03.2018
10:48:41

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
вон, люди решают задачу 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

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

Mikhail
30.03.2018
10:53:14
я говорю, что проще, когда у всего один интерфейс и одни законы и все одинаково
когда метод может делать какие-нибудь обобщенные вещи и над Result и над Option и над Future любым другим

Берял
30.03.2018
10:54:13

Sergey
30.03.2018
10:54:36

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