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

    Buchachalo
    @Buchachalo
    Уже все придумали друг!
    Подрубаешь себе OpenAI, в запрос клиента первым словом втыкаешь "смарфон" и вуаля:
    "смартфон А3" (написано на русском)

    "Я могу рассказать о смартфоне Samsung Galaxy A3. Это устройство с диагональю экрана 4,7 дюйма и HD-разрешением 1280x720 пикселей. Внутри установлен процессор Exynos 7578, 2 ГБ ОЗУ и 16 ГБ встроенной памяти, которую можно расширить до 256 ГБ с помощью microSD-карты. Камера основная 13 Мп, фронтальная 5 Мп. Аккумулятор имеет емкость 2300 мАч. Также устройство поддерживает две SIM-карты и работает на операционной системе Android."
    Ответ написан
    Комментировать
  • Как правильно парсить на Golang?

    разрешите за вас погуглить

    https://github.com/gocolly/colly/blob/master/htmle...

    func (h *HTMLElement) ChildTextgo(querySelector string) string


    https://github.com/gocolly/colly/blob/master/htmle...

    func (h *HTMLElement) ChildTexts(goquerySelector string) []string


    https://stackoverflow.com/questions/61498687/how-t...

    result := strings.Join(data, ",")
    fmt.Println(result


    How to build a web scraper with Go and Colly
    https://divrhino.com/articles/build-webscraper-wit...

    Building a web scraper in Go with Colly
    https://blog.logrocket.com/building-web-scraper-go...
    Ответ написан
    Комментировать
  • Как с помощью liquibase мигрировать данные из таблиц в одну новую?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Точно так-же как и в обычном SQL. Создаешь новый changeset. Там создаешь таблицу pets.
    Потом еще 2 ченжсета. Для INSERT AS SELECT dogs, и тоже самое для cats.
    Ответ написан
    Комментировать
  • Как хранить и сравнивать локации?

    @dmshar
    Имея геолокацию найти расстояние между двумя точками - задача элементарная (вспоминаем школьную геометрию). Соответственно найти несколько точек, у который расстояния то-ли минимальное, то-ли не превышает заданную величину (те-же 50 км.) также особого труда не представляет. Хотя что делать, если населенные пункты А и В находятся в 50км, но между ними курсирует скоростной поезд, а пункты А и С - в трех километрах, но через высокогорный перевал или реку - с объездом в 100 км (да, бывает и так) ? В общем, мне кажется поиск по геолокации - не лучший способ решения проблемы.

    А вот искать "по области" (или по населенному пункту) - уже перспективнее. Наиболее просто способ - "в лоб" выяснять у пользователя из какой он области. И тогда проблем нет. Но если исходить из геолокации - то проблема серьезная. Надо где-то искать соответствующую базу (по сути границ областей), потом решать задачу, в какую область угодила точка.... В общем весьма муторно.
    Можно, например, спрашивать город, от которого по имеющейся открытой информации переходить к области. Или по области находить города - в том числе близлежайшие - такая карта расстояний имеется (правда, не заю, в свободном-ли доступе). На худой конец искать API Google-maps и тянуть информацию из него.

    В общем, лучше для пет-проекта пока реализовать более простой подход (с явным указанием локации - населенного пункта), а потом, если сохраниться желание над проектом работать и его развивать - усложнять и вводить поиск уже по геолокации.
    Ответ написан
    3 комментария
  • Как хранить и сравнивать локации?

    vabka
    @vabka
    Токсичный шарпист
    Во многих СУБД есть расширения для работы с пространственными и гео-данными.
    Например в postgres - PostGIS.
    Тебе нужно просто для каждого пользователя определить геолокацию как широту-долготу, а поиск в определённом радиусе уже будет реализован в postgis.

    Это будет сильно быстрее чем "сравнить всех со всеми" благодаря специальным индексам
    Ответ написан
    Комментировать
  • Как реализовать алгоритм экспайринга элементов в базе данных?

    @Akina
    Сетевой и системный админ, SQL-программист.
    По-моему, ты накрутил сверх меры. Всё решается куда проще.

    Структура таблицы, максимально упрощённая:
    CREATE TABLE tasks (
        id PRIMARY KEY,
        definition,
        performer_id REFERENCES performer (id)
        expired_at DATETIME
    );

    Взятие (параметры - id обработчика и id задачи):
    UPDATE tasks
    SET performer_id = @performer_idб
        expired_at  = NOW() + INTERVAL 'performing time'
    WHERE ( expired_at IS NULL or expired_at < NOW() )
      AND ( id = @task_id )

    То есть, задачу можно взять, если её ещё никто не брал, или если время ожидания ответа на задачу истекло. И в качестве бонуса - видно, что либо задачу никто не брал, либо кто-то брал (только последний, если таких было несколько) и прогавал сроки.

    performing time может либо поставляться снаружи как параметр, либо быть свойством задачи (с соотв. полем в структуре таблицы).
    Ответ написан
    8 комментариев
  • Как вернуть записи из каждой группы с минимальной датой создания?

    @galaxy
    возвращать одно рандомное из дублей, но тогда есть вероятность вывода неправильного результата

    а в чем неправильность такого результата?

    В любом случае, группировка и джойн тут избыточны:
    SELECT DISTINCT ON (project_id) *
      FROM tasks
     WHERE tasks.id = ANY (...)
     ORDER BY project_id, created
    Ответ написан
    2 комментария
  • Где лучше генерировать uuid для базы? В коде или в sql запросом?

    @entermix
    В коде, потому что так проще проводить Unit-тестирование или связывать сущности
    Ответ написан
  • Как стать таким крутым как Гилфойл?

    dom1n1k
    @dom1n1k
    Пойти во ВГИК и позднее сняться в отечественном ремейке вышеозначенного сериала.
    Ответ написан
    Комментировать
  • Как я могу настроить суточные лимиты для пользователей телеграм бота?

    zenwalker
    @zenwalker
    0xABADBABE
    Не совсем понятно, зачем вам здесь БД. Реализуйте token bucket в памяти, уничтожайте его раз в сутки. Подход с горутиной сработает.
    Ответ написан
    Комментировать
  • Golang в чём смысл?

    bingo347
    @bingo347
    Crazy on performance...
    Во-первых, любой бенчмарк можно написать так, что визуально будет выглядеть очень похоже, но на деле у одной технологии будут использоваться сильные стороны, а у другой нет (понятно кто выиграет). Притом это можно сделать как специально, дабы превознести одну из технологий, так и ненамеренно, просто потому-что человек писавший бенчмарк очень хорошо знает одну технологию и посредственно другую.
    Например, я вполне умею написать многие вещи на C, C# и Go, но знаю эти языки очень поверхностно, с другой стороны я очень хорошо знаю JS (в том числе достаточно много копался в кишках v8) и Rust, как думаете, кто победит, если я начну писать бенчмарки для сравнения этих 5 языков?

    хотя Golang изначально и задумывался, как яп для хайлоада
    Go изначально задумывался как ЯП, который сможет быстро освоить любой, кто базово знаком с программированием, дабы Google мог нанять тысячу джунов и они быстро прототипировали идеи без заморочек C/C++.

    А еще вся супер-пупер параллельность - на самом деле асинхронщина, работающая на небольшом пуле реальных потоков ОС. Притом без вариантов. Асинхронный рантайм - это тоже не бесплатно. На всяких I/O штуках асинхронщина показывает себя очень хорошо, но на сугубо вычислительных задачах - все ее преимущества становятся минусами. На шарпе есть контроль, где использовать асинхронщину, а где вынести вычисления в настоящий поток. На Go такой возможности нет.

    P.S. а вообще, в реальном мире Вы практически никогда не упретесь в производительность языка, ну разве что будете всюду втыкать самые неоптимальные алгоритмы. На деле бутылочным горлышком окажутся сеть и диски. И даже в сугубо вычислительных штуках Вы скорее упретесь в оперативку и процессорные кэши, а не в ЯП.
    Ответ написан
    2 комментария
  • Где можно узнать максимально подробно про grpc?

    dimonchik2013
    @dimonchik2013
    non progredi est regredi
    https://proglib.io/p/grpc-i-vse-vse-vse-chast-i-vv...

    а изнутри - исходники ))

    особых чудес нет: структура данных преобразуется в строку/набор байтов и пуляется по сети через протокол, у получателя - преобразуется назад

    способы такое сделать различные с их плюсами и минусами
    Ответ написан
    Комментировать
  • Где можно узнать максимально подробно про grpc?

    vabka
    @vabka
    Токсичный шарпист
    Первоисточник: https://grpc.io/
    Ответ написан
    Комментировать
  • В чем сложность поддержки проектов на Go?

    EvgenyMamonov
    @EvgenyMamonov Куратор тега Go
    Senior software developer, system architect
    Более четырёх лет пишу на Go, лично для меня поддерживать проекты на других языках сложнее ))
    До Go много лет писал на Perl/PHP/Python/Java/C/Ruby on rails/JavaScript и "крутил" еще не мало чего.
    Сейчас пишу только на Go и Python.

    Основная сложность в Go - это то, что если вы начинаете писать "криво" - то писать так очень трудно :))
    Подход к реализации в Go достаточно непривычный для тех, кто приходит из скриптовых языков.
    Например запрет циклических импортов - это самое первое, что "взрывает" мозг :)
    Нужно время чтобы адаптироваться после скриптовых языков.

    Про обработку ошибок - это да, это, пожалуй, единственное что мне не нравится в Go.
    Для себя я решил эту проблему за 1-2 часа :) и больше меня это не беспокоит.

    По ООП - в Go оно есть, лично мне оно нравится намного больше, чем ООП в других языках ))
    Всё, что реально нужно - всё есть, но при этом ничего лишнего нет.
    Интерфейсы - просто прекрасны :)) Каналы, горутины - это просто "счастье" :))

    А если объективно - то я бы не стал говорить о сложности поддержки проекта применимо к какому то конкретному языку.

    Как правило сложность поддержки возникает там, где нормальная архитектура не заложена в проект.
    Т.е. проект как могла так и писала куча людей плюс, как обычно, сделать нужно было побыстрее )), от этого никто вообще не думал об архитектуре и получилось то, что получилось :))
    Про покрытие тестами и документацию мы вообще не говорим )))

    А когда в таком проекте нужно что-то доработать или исправить ошибку, то почти всегда очень не просто найти то место, где нужно править, и после правок в одном месте, как правило, что-то ломается в другом :)

    Как минимум, нужно соблюдать принципы SOLID, иначе код получается, мягко говоря, не поддерживаемым.
    Но понимание этих принципов так же приходит с опытом, их нельзя научиться соблюдать просто прочитавши книгу или статью. Нужно сделать несколько проектов используя эти принципы, написать криво, понять как было бы правильно, всё переделать и так несколько раз.
    Тогда, со временем, начнёт получаться понятный и легко поддерживаемый код.

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

    Хочется добавить, что как бы не писали про Go, что он простой и т.д. - он явно сложнее Python/PHP и т.д.
    Это еще один повод сказать, что поддерживать код на Go сложно ))

    Также стоит учитывать, что проекты которые пишут на Go зачастую сложнее, чем проекты для которых выберут скриптовый язык. Go выбирают когда планируются большие нагрузки, параллельная обработка чего-либо и т.д., а это, в свою очередь, дополнительно усложняет проект.
    Ответ написан
    7 комментариев
  • Что выбрать для телеграм бота? Вебхуки или лонгполлинг?

    @Eatric
    Лучше всего вебхуки потому что это гарантирует доставку и меньше необходимо задумываться над способом получения сообщений, они сами приходят на ваш сервер
    Ответ написан
    Комментировать
  • Что выбрать для телеграм бота? Вебхуки или лонгполлинг?

    EvgenyMamonov
    @EvgenyMamonov Куратор тега Go
    Senior software developer, system architect
    "Long polling" периодически опрашивает телеграм сервер, за счёт этого пользователю будет казаться, что бот "торзмозит", т.к. между отправкой сообщения от пользователя и до получения ответа будут паузы.
    По крайней мере у меня было именно так.
    Еще стоит сказать о том, что "Long polling" не подойдёт если говорить о нагрузках.

    После перехода на WebHook'и - сразу заработало всё очень резво.
    Также с использованием WebHook'ов у вас будет возможность горизонтально масштабировать бота в случае роста нагрузок.
    Если бы у меня стояла такая задача - я бы использовал WebHook'и.
    Ответ написан
    3 комментария
  • Как правильно передать множество параметров в функцию в Golang?

    EvgenyMamonov
    @EvgenyMamonov Куратор тега Go
    Senior software developer, system architect
    В таких случаях лучше передавать структуру как параметр.
    Пример
    type User struct {
        Name string
        Email string
        // все нужные поля далее
    }
    
    func CreateUser(r.Context(), user)
    Ответ написан
    Комментировать
  • Как писать нормальный код на Го?

    Ultimate Go by William Kennedy
    Ответ написан
    Комментировать
  • Когда использование Cgo оправданно?

    vabka
    @vabka
    Токсичный шарпист
    В описании же пакета прямо сказано
    Cgo enables the creation of Go packages that call C code.

    Ни слова про производительность.
    Ответ написан
    Комментировать