• Как правильно работать с Context?

    Во-первых, лучше контекст все же брать не Background, а из http-запроса. Таким образом вы будете корректно обрабатывать ситуацию, когда соединение с клиентом разорвалось и не надо больше обрабатывать запрос (контекст отменится).
    ctx, cancel := context.WithTimeout(r.Context(), config.Read().HTTP.Timeout.Request*time.Second)


    Во-вторых, контекст обычно не используют для ожидания внутренних горутин, он не для этого предназначен. Для этого используют sync.WaitGroup.
    Поэтому у вас и возникает проблема, ибо событие отмены контекста еще не значит, что дочерние функции мгновенно завершились. Возникает ситуация, когда чтение канала <-ctx.Done() внутри приведенной вами функции происходит раньше, чем такое же чтение канала внутри функции router.middlewareHandler(h). Поэтому нужно ждать не отмены контекста, а завершения работы горутины.

    В-третьих, вам тут вообще не нужна горутина, ибо ожидание ее завершения вы сделали сразу после нее. Вместо этого можно просто написать последовательный код.

    В-четвертых, вы, наверное, хотели написать if ctx.Err() != nil {. Но у вас вместо этого ==, что вообще обесценивает код внутри этого ифа.
    Ответ написан
    Комментировать
  • Как предсказать число из последовательности?

    @dmshar
    А вы уверенны, что там вообще есть какая-то закономерность? Математика - не магия, если закономерности нет - то ничего получить нельзя. Поэтому, начинать надо с того, а откуда взялась ваша последовательность, что она собой представляет - временной ряд или результат работы генератора случайных числе, откуда взялись ограничения на значения, сколько у вас имеется чисел для предсказания и надо-ли предсказывать по всем значениям или достаточно взять только несколько последних и пр. А уж потом думать, можно-ли для данной задачи сделать предсказание и если можно - то какой из методов тут можно попробовать использовать.
    P.S. И расшифруйте, пожалуйста. Что имеется ввиду под " заранее известных чисел"? Какое отношение их известность имеет к сформулированной задаче.
    Ответ написан
    2 комментария
  • Как идеально построено взаимодействие между фронтэнд и бэкэнд разработчиками?

    @kttotto
    пофиг на чем писать
    Не понимаю, зачем для тестирования апи разворачивать фронт. Бэк самостоятельно нормально может проверить работоспособность своего апи. Для этого как минимум есть браузер, как максимум есть postman или swagger и куча их альтернатив. Фронт говорит какие ему данные нужны, бэк говорит как будет называться метод и какие параметры с фронта для этого должны передаваться. А дальше как работает фронт, это проблема фронтедщиков.
    Ответ написан
    Комментировать
  • Как идеально построено взаимодействие между фронтэнд и бэкэнд разработчиками?

    @Vitsliputsli
    Как уже ответили, смотреть в сторону swagger.
    Но даже без него, проблемы странные. На данный момент, все выглядит так, что бек взвалил на себя работу по отладке фронта, т.е. совсем не его работу, и зашивается. А фронт вместо того, чтобы работать, плюет в потолок, спихивая вину на бек, что у того, что-то не работает.
    Чтобы протестировать ему свою работу, он вынужден разворачивать на локальной машине еще фронтэнд и билдить его каждый раз, логиниться и там тестировать как все работает. Частенько он сталкивается с проблемами, что на фронтэнде не все работает без ошибок, а ему приходится думать по вине неправильности работы api это или по другим причинам.

    Абсолютно не нужно, ни разворачивать фронт, ни думать что там не работает во фронте и по какой причине. У бека и фронта есть задача по реализации api в ней описано, как обращаться и что должен возвращать каждый метод. Соответственно, бек проверяет работоспособность api путем отправки запросов (через тот же Postman), и тесты тут будут не лишними. Если ошибка обнаруживается на фронте, то к беку летит баг, куда обращались, что получили в ответ, что ожидали получить.
    Фронтэнд... Если какая ошибка то у него работа останавливается и он пишет просто в трелло "не работает метод такой то..."

    После этого мокирует данный метод и работает дальше.
    Ответ написан
    Комментировать
  • Как получить часть строки через MySQL запрос?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Если порядок всегда один и тот же, то можно через SUBSTRING_INDEX(). Разбить по кавычкам и взять нужные подстроки.
    Начиная с версии 8.0 можно через REGEXP_SUBSTR().
    Но, по хорошему, надо парсить строку до занесения в базу и записывать уже чистые значения.
    Ответ написан
    1 комментарий
  • Как правильно работать с большим количеством данных?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    70 Гб - это вообще не гигантский объём. Люди оперируют террабайтами и даже больше. Главная проблема не в объёме таблицы, а в том, чтобы не читать её целиком (full scan) при выполнении запроса. И вот тут главная фигня: одно только условие like '%слово%' в любом случае требует просмотреть каждую строку, значит, будет full scan. Обычные индексы по этому полю строить бесполезно. Есть всякие полнотекстовые, но в общем случае их тоже надо правильно готовить, чтобы работало приемлемо. Решение может зависеть от задачи. Например, если это ключевые слова в виде текстовой строки с пробелами или иными разделителями, то их можно вынести в отдельную таблицу отдельными строками и проиндексировать там, полнотекстовый поиск тут будет излишним.
    Ответ написан
    1 комментарий
  • Реально ли запустить c# приложение на Ubuntu?

    Если оно написано под .NET Framework и использует Winforms - можно запустить на mono.
    Если оно написано под .NET Framework и оно консольное - можно запустить на mono или мигрировать на .NET Core одной консольной командой.
    Если оно написано под .NET Framework и использует WPF, то можно переписать на Avalonia и запускать под .NET Core.

    Все три способа будут работать только в том случае, если вы жёстко не привязались к технологиям винды.
    Лично я рекомендую перейти на .NET Core и делать кроссплатформенное приложение.

    PS: dotnet try-convert
    Ответ написан
    1 комментарий
  • Почему в tarantool\redis хранимые процедуры если не на SQL, то на Lua?

    sergey-gornostaev
    @sergey-gornostaev
    Седой и строгий
    Потому что интерпретатор Lua очень маленький и нетребовательный к ресурсам, но при этом обладает JIT-компилятором и высокой производительностью, а также встраивается намного проще, чем интерпретатор любого другого языка.
    Ответ написан
    9 комментариев
  • Почему нет функции удалить свой вопрос?

    SagePtr
    @SagePtr
    Еда - это святое
    Потому что люди тратили своё время, отвечали на вопрос, а вы собираетесь его взять и удалить?

    Вопросы-ответы полезны не только сиюминутно, но и на будущее, если у кого-нибудь возникнет похожий вопрос, и он найдёт его вместе с ответами поисковиком.
    Ответ написан
    Комментировать
  • Как ускорить сложный запрос mysql?

    @dimuska139
    Backend developer
    С помощью EXPLAIN проанализируй запрос и попробуй построить индексы
    Ответ написан
    8 комментариев
  • Как передавать аргументы к внешнему файлу в Docker?

    @zohan1993
    devops
    Если определить /usr/local/bin/trid как ENTRYPOINT, то CMD будет предоставлен в качестве параметров для ENTRYPOINT.
    При запуске контейнера можно переопределять CMD, в нашем случае указывать путь к файлу для анализа внутри контейнера.
    Поэтому нужно смонтировать внешнюю папку с файлами в контейнер.

    # Dockerfile
    ---
    FROM alpine:3.7
    ADD ./trid /usr/local/bin
    ENTRYPOINT ["/usr/local/bin/trid"]
    ---
    
    docker build -t trid:v1 .


    # Files for analysis on host system
    /var/lib/docker_data/files/file1.txt
    /var/lib/docker_data/files/file2.txt
    /var/lib/docker_data/files/file3.txt


    # Running container for analysis file1.txt
    docker run --rm -v /var/lib/docker_data/files:/data:ro --name analysis trid:v1 "/data/file1.txt"
    Ответ написан
    Комментировать
  • Какую технологию выбрать для работы с базой данных?

    ky0
    @ky0
    Миллиардер, филантроп, патологический лгун
    Огромные таблицы однотипных и упорядоченных по времени данных - это моветон. Партиционирование таблиц по дням/месяцам и схлопывание старых данных в агрегаты должны помочь - именно так, например, происходит в БД Заббикса.
    Ответ написан
    Комментировать
  • Какую технологию выбрать для работы с базой данных?

    saboteur_kiev
    @saboteur_kiev
    software engineer
    Вряд ли скажут точно.
    Скорость запроса зависит от всего. От размера конкретной таблица, от того какие данные, причем важно и тип и их схожесть, чтобы было проще индексы строить.
    И от скорости ssd
    Но я бы сказал, что 100-300 гб это далеко не бигдата. Это просто большая база, с которой справится и mysql и postgres, тем более что взяв сервер с 128гб оперативки, почти треть можно в памяти кешировать.

    В вашем случае - без перфоманс тестов никто не скажет даже примерный порядок.
    P.S. И да, если ваши данные в основном числа (таймстамп и числовые показатели, то time series data bases могут с этим справиться лучше). С другой стороны они не так популярны и возможно не так развиты.
    Ответ написан
    Комментировать
  • Какую технологию выбрать для работы с базой данных?

    fox_12
    @fox_12
    Расставляю биты, управляю заряженными частицами
    Если у вас большой объем показаний датчиков с временными метками - то стоит присмотреться к специализированным БД
    Ответ написан
    Комментировать
  • Асинхронная работа ZipArchive (::addFromString) теряет файлы, как победить?

    s5656
    @s5656
    Ну давайте обратимся к документации и попробуем понять в какой момент происходят изменения в конечном файле:

    ZipArchive::close — Close opened or created archive and save changes. This method is automatically called at the end of the script.

    То есть либо при вызове ZipArchive::close, либо в конце скрипта (так как автоматически вызывается ZipArchive::close).

    Сам по себе ZipArchive — синхронный.
    Если в одном потоке, то вы создаете и редактируете один архив, через один объект ZipArchive и когда вызываете close — все сохраняется в файл, на диск.
    Если вы работаете в нескольких потоках, то у вас создается несколько ZipArchive, которые друг о друге ничего не знают и когда вы вызываете close — каждый из них пытается сохранить свои изменения и здесь уже кто последний тот и папа сохранил свою версию.

    Нужно либо как-то передавать экземпляр ZipArchive между вашими потоками, либо писать свою (или найти готовую) библиотеку для асинхронной работы с zip архивами.

    Как более простой вариант — делать работу с файлами асинхронно (во временной директории?), а затем их архивировать через тот же zip (консольную утилиту).
    Ответ написан
    2 комментария
  • Нужна программа для сбора и визуализаци статистики. Есть у кого на примете такая?

    @dmshar
    Чем MS Excel не угодил? Простая, дает возможности, которые вы просили, отлично строит картинки и графики. Что значит "удобно" просматривать графики я правда не понял, но мои графики и картинки и рисовались и просматривались всегда отлично. Если скажете что не так - будем думать дальше.
    Ответ написан
    6 комментариев
  • Почему возникает ошибка при deploy heroku?

    zb_venom
    @zb_venom
    Жизнерадостный чебурек
    package.json не содержит данных об express.js
    Примерно так:
    "dependencies": {
        "express": "^4.17.1",
      },
    Ответ написан
    1 комментарий
  • Где можно использовать горутины в Go?

    EvgenyMamonov
    @EvgenyMamonov Куратор тега Go
    Senior software developer, system architect
    Самый простой пример - это HTTP сервер.
    Когда к вам приходит HTTP запрос - создаётся горутина и каждый запрос спокойно обрабатывается, никто никого не ждёт. Т.е. сервер может обрабатывать параллельно несколько запросов как раз за счёт горутин.

    Фактически, почти во всех сетевых сервисах есть смысл использовать горутины для распараллеливания обработки запросов (кроме epoll, kqueue и т.п.)

    Еще хороший пример.
    Вам нужно сделать парсер Авито :)) или индесатор сайтов.
    Т.е. задача сводится к тому, что нужно будет постоянно качать страницы с сайтов.
    Если вы будете качать одну страницу за другой - вы будете очень долго качать.
    А так вы можете сделать пул из нескольких горутин (как минимум по 1 на поток процессора) и получите параллельное скачивание страниц.

    Для ускорения работы вычислений (параллельные вычисления) есть смысл использовать горутины только по 1 на поток процессора). Т.е. в случаях, когда у вас огромный объём данных и нужно максимально ускорить его обработку. Например у вас файл 100Гб, и 8 ядер в процессоре - вы можете разбить файл на 8 частей и параллельно эти части обработать (в самом простом варианте, в реальной жизни нужно будет просто по частям считывать новые данные и скармливать свободной горутине)

    Еще когда нужно сделать чтобы какая нибудь задача выполнялась в "фоне".
    Например периодическая очистка кеша/устаревший записей в базе.

    Реальных примеров намного больше :)
    В целом их есть смысл использовать там, где нужно параллельное выполнение какой либо задачи или разных задач параллельно :)
    Ответ написан
    2 комментария
  • Как работает шифрование и подпись файлов?

    Jump
    @Jump
    Системный администратор со стажем.
    Шифрование это видоизменение информации, таким образом чтобы ее без ключа прочитать невозможно было.
    Никаких сертификатов для этого не требуется.

    Сертификат это криптографический документ удостоверяющий личность или организацию.
    Его используют совместно с шифрованием для того чтобы четко понимать кто что подписал и кому можно доверять.
    Сертификаты может выдавать кто угодно - сгенерировать сертификат может любой школьник за несколько секунд.
    Но главное в сертификате доверие - поэтому сертификат должен быть выдан центром сертификации которому пользователь будет доверять.

    Пользователь добавляет все центры сертификации которым он доверяет в "Доверенные" и сразу появляется доверие ко всем сертификатам выданным этими центрами.

    и в чем в целом разница между подписью и шифрованием файла,
    А в чем разница между жирафом и зеленым?
    Вот в этом же разница и между подписью и шифрованием.
    Ответ написан
    Комментировать