Danila
После компиляции не удаётся запустить бинарник ./http: line 1: syntax error near unexpected token `newline' ./http: line 1: `!<arch>'
Olzhas
Danila
С чем это может быть связано?
Aleksandr
компилишь на хосте или в докере?
Daniel
погодите
Daniel
это ошибка компилятора же
Olzhas
гопаф кривой
человек не смог в установку го
Aleksandr
На хосте
перекомпиль, покажи лог компиляции
Nazar
там есть Parse и формат по которому парсить
ой, чёт не подумал, благодарю
Danila
гопаф кривой
GOPATH="/home/user/go" GOROOT="/usr/local/go"
Olzhas
GOPATH="/home/user/go" GOROOT="/usr/local/go"
а в коде есть строка типа import "./http"?
Danila
Есть import ( "net/http" "github.com/gin-gonic/gin" )
Olzhas
а сам пакет как называется?
Danila
khcp
Daniel
GOPATH="/home/user/go" GOROOT="/usr/local/go"
gopath и goroot не должны в одно место указывать, вообще-то
Olzhas
т.е. код примерно такой package khcp import ( "net/http" "github.com/gin-gonic/gin" ) func main() { //blablabla }?
Olzhas
и собираете командой go build -o http?
Danila
go build -o http http.go
Danila
Вот код: package khcp import ( "net/http" "github.com/gin-gonic/gin" ) func main() { r := gin.New() r.GET("/", func(c *gin.Context) { c.String(http.StatusOK, "Hello World!") }) r.GET("/ping", func(c *gin.Context) { c.String(http.StatusOK, "pong") }) http.Handle("/", r) }
Aleksandr
go build -o http http.go
так ты лог компиляции покажешь?
Olzhas
а не khcp
Olzhas
исправьте и будет вам щастье
Olzhas
вы модуль пытаетесь собрать как исполняемый файл
Olzhas
исправьте и будет вам щастье
если не заработает, я начну работать работу, а не в чатиках сидеть
Danila
исправьте и будет вам щастье
Заработало. Спасибо.
Olzhas
Заработало. Спасибо.
фух, можно лениться дальше
Daniel
таааак
Daniel
я все пропустил
Oleg
давай я повторю
Daniel
Ага
Oleg
Есть REST API, в нем метод для частичного обновления сущности PATCH. Он может быть реализован как: 1) https://tools.ietf.org/html/rfc7386 2) https://tools.ietf.org/html/rfc6902 3) пересылать полностью состояние сущности, при этом запоминать все версии сущностей, вычислять дельту по сравнению с нужной версией 4) пересылать полностью состояние сущности, при этом придумывать блокировки на время редактирования 5) пересылать полностью состояние сущности, при этом слать клиента лесом если он пытается изменить устаревшую версию сущности. Что из этого кто использует, что проще, как реализовывать на golang?
Daniel
я бы, если бы ТЗ позволяло, делал 5
Daniel
тут несколько плюсов:
Daniel
1. не надо реализовывать логику мерджа
Daniel
2. не надо думать о том, кто первый встал и чьи тапки
Daniel
3. на случай конкурентного изменения у нас есть четкий индикатор того, что что-то пошло не так
Daniel
нет, конечно
Daniel
там только sequence надо хранить, и сравнивать с тем, что приехало
arkady
Тогда мб проще на уровне бд атомарно записать?
Daniel
и проверку сиквенса на триггер?
Daniel
можно и так
arkady
Получается одна транзакция
Oleg
еще мнения будут?
Alexander
Есть REST API, в нем метод для частичного обновления сущности PATCH. Он может быть реализован как: 1) https://tools.ietf.org/html/rfc7386 2) https://tools.ietf.org/html/rfc6902 3) пересылать полностью состояние сущности, при этом запоминать все версии сущностей, вычислять дельту по сравнению с нужной версией 4) пересылать полностью состояние сущности, при этом придумывать блокировки на время редактирования 5) пересылать полностью состояние сущности, при этом слать клиента лесом если он пытается изменить устаревшую версию сущности. Что из этого кто использует, что проще, как реализовывать на golang?
я бы сделал так 1) Шлется некий GET запрос, на ендпоинт, которым мы показываем, что хотим отредактировать некую сущность. Сервер делает лок на сущность и в ответ на клиента передается некий токен 2) На клиенте происходит какое-то редактирование сущности и потом вся сущность передается на сервер, вместе с полученным токеном 3) Сервер проверяет что сущность открыта на редактирование клиентом именно с таким токеном и производит обновление сущности 4) Все время, пока кто-то уже открыл сущность на редактирование, все остальные такие запросы отбиваются с ошибкой "юзер такой-то уже редактирует такую сущность". 5) У всех запросов на редактирование есть определенный таймаут, во избежание перманентного лока на редактирование
Alexander
а мы просто завели /lock/unlock/update :)
так у меня примерно такая же схема
Alexander
просто на lock если кто-то уже занял шлется отлуп. и есть автоматический unlock, если что-то пошло не так
Aleksandr
я бы сделал так 1) Шлется некий GET запрос, на ендпоинт, которым мы показываем, что хотим отредактировать некую сущность. Сервер делает лок на сущность и в ответ на клиента передается некий токен 2) На клиенте происходит какое-то редактирование сущности и потом вся сущность передается на сервер, вместе с полученным токеном 3) Сервер проверяет что сущность открыта на редактирование клиентом именно с таким токеном и производит обновление сущности 4) Все время, пока кто-то уже открыл сущность на редактирование, все остальные такие запросы отбиваются с ошибкой "юзер такой-то уже редактирует такую сущность". 5) У всех запросов на редактирование есть определенный таймаут, во избежание перманентного лока на редактирование
это pessimistic lock. Зависит от бизнес задач, но зачастую слишком жирновато эксклюзивно локать. Лучше оптимистик лок
Alexander
это pessimistic lock. Зависит от бизнес задач, но зачастую слишком жирновато эксклюзивно локать. Лучше оптимистик лок
так-то да, я рассматриваю сущности, которые редактируются вручную и редко будет конкуренция
Alexander
условно - бэк-офис в котором работают менеджеры
L
Гайз, не очень понимаю куда вопрос лучше задать, поэтому сюда. Есть задачка. Дано много (миллиарлды) многомерных векторов с одинаковой размерностью. На вход подается новый вектор и нужно найти N ближайших к нему по метрике косиносного расстояния (или евлидова). На чем такое можно построить? Или лучше свой велосипедик писать на гошечке?
Oleg
на мой взгляд надо рассчитывать на три edgecase. 1) Редактирование с контролем номера версии сущности на уровне формы 2) Редактирование на уровне отдельного поля 3) Очень конкурентное редактирование с организацией потока сообщений о каждом элементарном изменении и рассылкой (гуглодоки)
L
ну и да, время на запрос очень ограничено
Daniel
а мы просто завели /lock/unlock/update :)
О, стейтфул протокол поверх стейтлес. Это мы любим...
L
Железом не обделены. Что-то вроде интелов E5-2620 и много памяти
Roman
Железом не обделены. Что-то вроде интелов E5-2620 и много памяти
На arm/mips и прочих странных архитектурах неинтересно запускаться, да?
Vladimir
а это даст какой-то существенный прирост?
скорее существенные проблемы
L
ну по сути, кроме этой задачи такие сервера не будет ничем другим заниматься. трафика достаточно там будет
L
rtree? а дальше spatial базы данных. я бы начал с postgis смотреть
А вот это уже интересно, спасибо за наводку, изучу вопрос
Daniel
но хорошо не будет - там, очевидно, полный перебор
L
но хорошо не будет - там, очевидно, полный перебор
полный перебор для каждого запроса? Боюсь что это не очень оптимально
Daniel
а как вы хотите? индексы хорошо работают на одномерных векторах
Daniel
на многомерных - не очень
Daniel
но у вас-то вообще евклидово расстояние (даже не манхеттен)