
Daniel
14.06.2018
17:24:24
А в c++?
в с++ плохо все, вообще-то. экосистему захватили технофилы какие-то, и теперь в ней все похоже на буст. но - да, в с++ можно было бы писать многотредное не сложнее, чем в go писать многорутинное. если бы там вообще было можно писать (на самом деле - проблема, скорее, с чтением)

Pawel
14.06.2018
17:25:27

Daniel
14.06.2018
17:25:32
batching
это аргумент. но скажи - часто ли оно нужно?

Google

Daniel
14.06.2018
17:27:31
и будет очень хорошо
а пока - надо советовать сваггер всем пионерам

Pawel
14.06.2018
17:28:09

Daniel
14.06.2018
17:28:22
пока не дошли руки
но по первому впечатлению - все совсем не так жестко, как хотелось бы

Pawel
14.06.2018
17:31:39
и для фронтенда его проще приспособить чем rest api. Фронтендеры (нормальные) будут счастливы получать graphql через фреймворк Apollo

Danil
14.06.2018
17:37:26
Такой вопрос
xor является арифметической операцией

Александр
14.06.2018
17:41:10
ну это операция
только если в математики это больше функция
так же это логическая операция

Google

Александр
14.06.2018
17:42:33
но никак не арифметическая ?

Danil
14.06.2018
17:42:49
Отлично

Daniel
14.06.2018
17:42:51

Yaroslav
14.06.2018
17:44:43

Danil
14.06.2018
17:45:05
Нет

Yaroslav
14.06.2018
17:46:13
А в чем разница?

Danil
14.06.2018
17:46:59
Арифметическое или логическое действие
Это операция
Ну функцию думаю объяснять не надо

Yaroslav
14.06.2018
17:48:31
И чем тебе сложение не функция?

Danil
14.06.2018
17:48:51

Yaroslav
14.06.2018
17:49:00
Принимает два аргумента, возвращает один

Danil
14.06.2018
17:49:07
Эээ

Yaroslav
14.06.2018
17:49:12
Результат

Danil
14.06.2018
17:49:27
Ладно возьмите интеграл от 0 до 1 операции сложения

Roman
14.06.2018
17:49:34

Yaroslav
14.06.2018
17:49:49
По какому параметру?

Daniel
14.06.2018
17:50:04
по двум, объемный :)

Yaroslav
14.06.2018
17:50:33
С объемными не работал, уж извините

Google

Yaroslav
14.06.2018
17:50:50
И ко мне вполне можно на ты, кстати

Roman
14.06.2018
17:51:11

Danil
14.06.2018
17:51:25
Вы не правильно интерпритируете функцию в математике и в программировании

Roman
14.06.2018
17:53:03

Yaroslav
14.06.2018
17:53:04
Функция в математике есть наиболее абстрактное понятие функции в программировании
Точнее даже наоборот

Daniel
14.06.2018
17:53:37
"точнее наоборот" - это мое любимое...

Roman
14.06.2018
17:53:51

Yaroslav
14.06.2018
17:54:11
Функция в программировании - частный случай применения абстракции, которая зовется функцией в математике

Daniel
14.06.2018
17:54:16

Yaroslav
14.06.2018
17:54:36
То есть любую функцию в программировании можно выразить функцией в математике
Другое дело, чтор это может быть очень сложным процессом

Yaroslav
14.06.2018
17:55:30

Pawel
14.06.2018
17:55:30

xPushkin
14.06.2018
17:55:54

Roman
14.06.2018
17:55:59

Danil
14.06.2018
17:56:32

Daniel
14.06.2018
17:56:43
3-4. решены в сваггере.

Roman
14.06.2018
17:57:55

Roman
14.06.2018
17:57:56
3-4. решены в сваггере.
если хорошо постараться то можно реализовать хороший REST, но вот проблему 1, 2 и 6 это никак не решит, тут REST обречён

Google

Roman
14.06.2018
17:58:09

Roman
14.06.2018
17:58:40
изменился клиент? меняй API... а что если у тебя 2 клиента? а что если 3 как было у Netflix? а что если их вообще может быть X ?
REST из-за tight coupling'а может превратиться в ночной кошмар API разработчика

Daniel
14.06.2018
17:59:43

Roman
14.06.2018
18:00:31
для меня это выглядит так: раньше нам приходилось думать, теперь мы просто пилим


Roman
14.06.2018
18:08:37
для меня это выглядит так: раньше нам приходилось думать, теперь мы просто пилим
3-5% это вы сейчас придумали?
тут вопрос не в трафике а в latency, в колве round-trip'ов. underfetching означает что вам не хватит 1 round-trip'а и придётся бегать на API'шку постоянно туда сюда туда сюда... с GQL у вас обычно 1 round-trip
плюс к этому, модульные большие приложения писать на GQL гораздо легче, ибо представьте, что у вас 20 умных компонентов в приложении и каждый хочет данные, с GQL каждый компонент может запросить малую часть графа, библиотека клиента GQL агрегирует все эти мини-запросы в 1 большой, чем снимет нагрузку на бд, сеть и вообще всё. Сервер вместо 20 малых запросов обработает 1 большой, что, как всем известно, производительнее.
и с чего вы взяли что он замедляет сервер? придумали? Хорошая у вас фантазия))
в REST'е underfetching рано или поздно создаёт серьёзные проблемы производительности и поэтому приходится создавать спец-endpoint'ы для конкретных запросов аля api/users_with_posts а это неизбежно приводит к tight-coupling'у, что приводит в конце к тому, что изменения на клиенте трeбуют изменений в API, а это кошмар если у вас такие изменения происходят часто, и тем более если у вас несколько клиентов, либо вообще открытый API


Subbotin
14.06.2018
18:13:24
открытый апи на gql?

Александр
14.06.2018
18:13:49
кстати вы сказали инфлакс?
кто разрабатывал говнодрайвер к нему

Admin
ERROR: S client not available

Александр
14.06.2018
18:14:00
мне охото человека просто расстрелять
4 вложенных цикла для сбора ROW

Subbotin
14.06.2018
18:15:08
открытый апи на gql?
по ощущениями отдавать наружу gql это почти как отдать клиентам sql (кстати некоторые так и делают, например stackoverflow)

Александр
14.06.2018
18:17:29
res, err := e.Db.Query(influxClient.NewQuery("select * from TABLE", "DBNAME", ""))
if err != nil {
panic(err)
return nil
}
for _, result := range res.Results {
for _, series := range result.Series {
for _, row := range series.Values {
rowMap := make(map[string]string)
for n, value := range row {
for i, colum := range series.Columns {
if i == n {
switch v := value.(type) {
case json.Number:
rowMap[colum] = v.String()
case string:
rowMap[colum] = v
default:
rowMap[colum] = "NULL"
}
break;
}
}
// Собрали rowMap
}
}
}
}
сохраните кто будет работать с инфлаксом ?
драйвер - github.com/influxdata/influxdb/client/v2


Roman
14.06.2018
18:19:03
для меня это выглядит так: раньше нам приходилось думать, теперь мы просто пилим
из опыта цифру назвал. обычно, если ендпоинт(ы) более значимый, в REST отступают от правил и возвращают смешанные данные. никто не запращает, спецификация легко переносит добавление новой сущности. с учетом того, что под высокую нагрузку пишутся микросервисы, а не гигантские монолиты, это еще и скейлится на ура. опять же нужно всегда думать наперед и не создавать месиво. иногда лучше сделать 2 запроса чем один, разница пользователю заметна не будет. в общем, нужно думать и подстраиваться. у всех так или иначе это получается. даже у гигантов
замедляет, потому что появляются доп. звенья в цепи доставки данных. 5 вместо 2-х, например. снижает нагрузку на бд аггрегацией запросов? сомнительная оптимизация. к тому же она напрямую неконтролируется, что потенциально приводит к обратному.
на деле, я не спорю, что штука удобная, особенно хороша в стартапах, где раз-два - и в продакшн. но REST не стоит сравнивать


Roman
14.06.2018
18:21:45
открытый апи на gql?
есть много способов обезопасить себя от malicious requests если вы об этом.
самый радикальный и простой способ это завести whitelist запросов. Вы скажете "так чем это тогда лучше REST?!", отвечаю: разница в том, что в любой момент можно просто обновить whitelist, просто добавить туда новый шаблон query за 5 секунд не переписывая ни строчки API, в то время, как в REST придётся писать новый endpint.
второй, более элегантный, но сложный способ это complexity budget. Каждому клиенту даётся бюджет на определённое время, например 5 секунд, Resolver'ы полей минусуют бюджет в зависимости от сложности Resolver'а, если бюджета на выполнение запроса не хватает - возвращаем access denied

Google

Денис
14.06.2018
18:26:38
Всем привет. А помогите по рефлексии:
func myFunc(arr interface{}) {
varr := reflect.ValueOf(arr)
varr.SetLen(varr.Len() - 1)
}
Паникует с using unaddressable value. Возможно ли мне как-то сделать interface{}, который под капотом - слайс - addressable и изменить его длину?

Dmitri
14.06.2018
18:31:40
слайс - штука ОООЧЕНЬ специфичная


Roman
14.06.2018
18:32:15
из опыта цифру назвал. обычно, если ендпоинт(ы) более значимый, в REST отступают от правил и возвращают смешанные данные. никто не запращает, спецификация легко переносит добавление новой сущности. с учетом того, что под высокую нагрузку пишутся микросервисы, а не гигантские монолиты, это еще и скейлится на ура. опять же нужно всегда думать наперед и не создавать месиво. иногда лучше сделать 2 запроса чем один, разница пользователю заметна не будет. в общем, нужно думать и подстраиваться. у всех так или иначе это получается. даже у гигантов
замедляет, потому что появляются доп. звенья в цепи доставки данных. 5 вместо 2-х, например. снижает нагрузку на бд аггрегацией запросов? сомнительная оптимизация. к тому же она напрямую неконтролируется, что потенциально приводит к обратному.
на деле, я не спорю, что штука удобная, особенно хороша в стартапах, где раз-два - и в продакшн. но REST не стоит сравнивать
на микросервисы в основном ходят через gateway
из опыта цифру назвал. обычно, если ендпоинт(ы) более значимый, в REST отступают от правил и возвращают смешанные данные. никто не запращает, спецификация легко переносит добавление новой сущности. с учетом того, что под высокую нагрузку пишутся микросервисы, а не гигантские монолиты, это еще и скейлится на ура. опять же нужно всегда думать наперед и не создавать месиво. иногда лучше сделать 2 запроса чем один, разница пользователю заметна не будет. в общем, нужно думать и подстраиваться. у всех так или иначе это получается. даже у гигантов
замедляет, потому что появляются доп. звенья в цепи доставки данных. 5 вместо 2-х, например. снижает нагрузку на бд аггрегацией запросов? сомнительная оптимизация. к тому же она напрямую неконтролируется, что потенциально приводит к обратному.
на деле, я не спорю, что штука удобная, особенно хороша в стартапах, где раз-два - и в продакшн. но REST не стоит сравнивать
если для вас "агрегация запросов" это "сомнительная оптимизация" то я лучше с вами спорить не буду)) от греха подальше
"напрямую не контролируется" это вы сейчас о чём? что где кем контролируется и зачем?


Roman
14.06.2018
18:36:10

Roman
14.06.2018
18:36:52

Dmitri
14.06.2018
18:38:14

Anton
14.06.2018
18:38:15
GQL - отличная штука, избавляет от кучи проблем реста, если у вас не ресурсный crud, то советую GQL


Roman
14.06.2018
18:38:17
3-5% это вы сейчас придумали?
тут вопрос не в трафике а в latency, в колве round-trip'ов. underfetching означает что вам не хватит 1 round-trip'а и придётся бегать на API'шку постоянно туда сюда туда сюда... с GQL у вас обычно 1 round-trip
плюс к этому, модульные большие приложения писать на GQL гораздо легче, ибо представьте, что у вас 20 умных компонентов в приложении и каждый хочет данные, с GQL каждый компонент может запросить малую часть графа, библиотека клиента GQL агрегирует все эти мини-запросы в 1 большой, чем снимет нагрузку на бд, сеть и вообще всё. Сервер вместо 20 малых запросов обработает 1 большой, что, как всем известно, производительнее.
и с чего вы взяли что он замедляет сервер? придумали? Хорошая у вас фантазия))
в REST'е underfetching рано или поздно создаёт серьёзные проблемы производительности и поэтому приходится создавать спец-endpoint'ы для конкретных запросов аля api/users_with_posts а это неизбежно приводит к tight-coupling'у, что приводит в конце к тому, что изменения на клиенте трeбуют изменений в API, а это кошмар если у вас такие изменения происходят часто, и тем более если у вас несколько клиентов, либо вообще открытый API
+много. И атомарность в rest забавно делать


Roman
14.06.2018
18:41:01

Dmitri
14.06.2018
18:45:15

Roman
14.06.2018
18:45:53
самое веселое начинается, когда вы уже используете graphql и нужно поменять структуру бд, где то переименовать поля, разнести данные по разным таблицам - и это влечет за собой возврат технического долга, который при написании REST отдается сразу. как известно запутанный клубок распутывать сложнее нежели чем сразу мотать нить на катушку

Dmitri
14.06.2018
18:46:13
Не, я не то, чтобы рест защищал. У меня к нему, по большому счету одна, но уберважная претензия: http verbs
Собственно, огромная часть болячек Реста, можно сказать, побеждена в виде grpc

Roman
14.06.2018
18:48:33

Dmitri
14.06.2018
18:49:26
А вот позиция "статичные запросы говно, да здравствует язык запросов на клиенте" - так себе позиция. GQL порождает примерно столько же проблем, сколько и решает, только в других плоскостях. Чудес, как известно, не бывает...

Kaspar
14.06.2018
18:49:53
Кроме gRPC

Dmitri
14.06.2018
18:50:35


Roman
14.06.2018
18:51:56
мне казалось, что GQL-это именно про язык запросов? Ошибался?
GraphQL это язык, на котором клиент обращается к серверу. Тебе, как разработчику API, нужно написать переводчик GQL в данные, как ты это сделаешь уже другой вопрос.
У нас слоистая архитектура такова:
1. transport (transmit, authenticate) - отвечает за передачу данных и аутентификацию клиента, может быть HTTP(s), может быть WS(S), в нашем случае это https://github.com/qbeon/webwire-go
2. graph (parse, validate, authorize) - отвечает за парсинг, валидацию и авторизацию. Вызывает resolver функций для каждого поля графа. За парсинг у нас отвечает библиотека https://github.com/graph-gophers/graphql-go, а авторизация происходит в самих resolver функциях на основе тех данных, которые нам 1 транспортный уровень передал о клиенте.
3. loaders (batch, cache) - отвечает за batching и caching, грубо говоря на этом слою устраняются лишние engine-call'ы, если какие-то entity уже имеются в кэше или уже запросились другим resolver'ом, то мы его не дублируем
4. engine interface (engine capabilities) - это абстрактный интерфейсный уровень. Каждая реализация движка сервиса должна полностью воплощать этот интерфейс
5. engine (business logic, databases) - отвечает за бизнес логику и работу с бд, обязан полностью воплощать интерфейс. У нас обычно 2 движка: mock & production, mock тупо в памяти, production на основе какой-либо бд