• Архитектура сервиса для сбора и обработки текстовых данных. Нужна здоровая критика. /?

    2ord
    @2ord
    Моя схема:

    Запись данных: Клиенты --> LB --> API --> MQ брокер --> обработчики очереди --> СУБД
    То есть API получает данные от клиента, отправляет MQ брокеру (RabbitMQ/Apache Kafka) и сразу отвечает со статусом 200/202.
    API и обработчики очереди масштабировать по необходимости. Запись в материализованном представлении данных. СУБД с репликацией master-slave.

    Чтение данных: LB --> API --> кэш/СУБД
    Здесь можно взять даже какой-нибудь фреймворк типа RoR/Django.
    Ответ написан
  • Что может а что не может содержать миграция?

    2ord
    @2ord
    Миграции данных в СУБД и масштабирование изображений - это разные задачи. Следовательно, у каждой из них есть своя специфика.

    1. В сценарии миграции на DSL фреймворка обычно описывал добавление колонки, затем
    запрос типа SELECT id, email FROM users LIMIT 100 OFFSET :x. При получении списка компоновка список адресов в HTTP запрос на сторонний сервис и затем обновление колонки (тут есть некоторые особенности).

    2. Это похоже не на переход из одного состояния в другое, а на сценарий подготовки при разворачивании веб-приложения. Мы ведь не пишем миграции для компиляции assets (webpack и пр.), так ведь?
    То есть, в случае с изображениями мы не меняем состояния приложения. Оно каким было, таким и остается после запуска скрипта масштабирования. Один раз развернули приложение, получив нужные размеры изображения и все, этого достаточно. Когда выйдет новая версия, обновление уже не должно касаться повторного запуска скрипта - достаточно выполнить миграцию данных.
    Ответ написан
    1 комментарий
  • На другом пк софт крашится без исключений, как найти причину?

    2ord
    @2ord
    В справке об исключении System.AccessViolationException написано
    An access violation occurs in unmanaged or unsafe code when the code attempts to read or write to memory that has not been allocated, or to which it does not have access. This usually occurs because a pointer has a bad value.
    что может указывать на проблему в обвязке к Tesseract. Скорее всего, она не расчитана на многопоточное использование.
    Я бы добавил логи вокруг вызовов Tesseract и не только там.
    Ответ написан
    Комментировать
  • Команда "rails server" видает ошибку LOAD ERROR. Как исправить?

    2ord
    @2ord
    Что-то не в порядке при запуске фреймворка из-за файлов в проекте.
    Рекомендую создать новый проект.
    Ответ написан
    Комментировать
  • Scopes for belongs_to?

    2ord
    @2ord
    Конструкция
    -> { where active: true }означает, что при ассоциации принадлежности к модели :author будет выполняться замыкание (lambda, или просто анонимный метод), внутри которого фильтруются записи авторов книги, у которых свойство active является true.
    Иными словами: Author.where({ active: true })
    Таким образом, при поиске книги остальную часть, касающуюся ассоциации с книгой, RoR добавит сам, выполня SQL INNER JOIN между двумя таблицами.
    Ответ написан
    Комментировать
  • Где лучше хранить значения для select?

    2ord
    @2ord
    Возможно в PostgreSQL или в виде коллекции в модели а потом подгружать AJAХ запросом ?
    Вместо "или" должно быть "и". Данные хранить в СУБД и подгружать частями по запросу AJAX.
    Можно выполнить это как самостоятельно своими средствами или при помощи готовых компонентов, таких как Select2. Для получения части списка используется компоненты pagination.
    Ответ написан
    Комментировать
  • Как понять в какой момент тормозит БД?

    2ord
    @2ord
    Нужно замерить обращения к БД и сопоставить с операциями. Если использовать APM, то обычно все будет наглядно представлено.
    Везде, где можно, добавить метрики для замера.

    Добавлено
    взял один SQL INSERT и скормил его в SQL чтобы посмотреть за сколько он вставится.

    Он отработал за 23 миллисекунды. Т.е. явно затык не в этом.
    один insert ничего не покажет.
    Надеюсь, вставка идет в виде batch по много строк за 1 запрос?
    Ответ написан
  • Как прикрутить многопоточную обработку без проблем с памятью?

    2ord
    @2ord
    Генерацию самих строк стоит оформить как IEnumerable, а их обработку - при помощи Task.
    Ответ написан
    Комментировать
  • Как улучшить код?

    2ord
    @2ord
    domain_list.select! do |hash|
      v = true
      if date_range_present?
        v &= hash['date'] >= params[:from_date]
        v &= hash['date'] <= params[:to_date]
      end
      if search_query_present?
        v &= hash['domainName'].match(params[:search_query])
      end
      v
    end if date_range_present? || search_query_present?

    Это не самая короткая запись. Оставил для понимания.
    P.S. писал ночью с мобильного телефона, не проверял. Так что на свой страх и риск.
    Ответ написан
  • Как передать даные с ESP32 на удаленный сервер?

    2ord
    @2ord
    Для мониторинга показателей датчиков можно написать простое веб-приложение, запускаемое на устройстве, которое способно выдавать текст с метриками в специальном формате, доступным по пути /metrics через HTTP для периодического опроса сторонним ПО с открытым кодом, Prometheus (методом pull по отношению к устройству). Все гибко настраивается.
    Есть множество библиотек на разных языках, которые помогут построить этот формат. В веб-приложении с такой библиотекой будут доступны функции для работы с показателями. С их помощью в памяти приложения будут выполнены все агрегации показателей и по запросу к /metrics выданы Prometheus. Разумеется, необходимо иметь доступ по HTTP к каждому устройству для получения метрик.
    У Prometheus есть своя СУБД, хранящая данные показателей и эти статистики и графики можно получить при помощи API. В Grafana и прочем ПО можно смотреть графики, строить статистику, настраивать оповещения и пр. Так можно данные получить для вывода и на сайте.
    Ответ написан
    Комментировать
  • Какие конфиги задать Tesseract для распознания текста?

    2ord
    @2ord
    Насчет конфигурации не подскажу, но если разделить область на 2 строки и применить фильтры к нижней из них, то можно легко получить желаемый результат.
    Сначала пороговая обработка, затем инвертировать:
    607ab1095df55703689081.png
    А если нужна только нижняя строка, то даже разделять на области не нужно.

    На веб-ресурсе https://tesseract.projectnaptha.com/ успешно определяется как "5 м."
    Ответ написан
    2 комментария
  • Как отрефакторить many check_box_tag?

    2ord
    @2ord
    Подсказка с циклом:
    (1..3).each{|v| puts "column-#{v.to_s}" }
    Дальше сам.
    Ответ написан
    Комментировать
  • Как впихнуть компилятор в бота телеграм?

    2ord
    @2ord
    Странная задача какая-то.
    1. Компилятор "впихивать" не нужно. Достаточно скомпилировать 1 .exe со всеми 10-ю функциями внутри. Ну или 1 основной .exe, который умеет подгружать необходимый набор функций, каждая из которых скомпилирована в свою .dll
    2. Распространять exe+dll файлы через бот напрямую не нужно. Достаточно закинуть их на хостинг и выдавать ссылку на Zip ботом. Туда можно включить и конфигурационный файл с информацией о включенных функциях.
    Ответ написан
  • Есть ли утилита для просмотра списка файлов в ZIP на S3 бакете?

    2ord
    @2ord
    Есть некая тулзовина, remotezip. Подходит для получения списка и частичного извлечения файлов по HTTP. Насчет утилиты для S3 не знаю, вроде можно доработать, если нужно для приватного доступа к bucket.
    Ответ написан
  • Загрузка больших файлов c#?

    2ord
    @2ord
    Но при доходе до определенного числа скачивания выдает исключение.
    Допустим, закончилось место на диске.
    Попробуйте обвернуть в try-catch, чтобы узнать причину:
    try
    {
        DownloadZIP();
    }
    catch (Exception e)
    {
        Console.WriteLine("{0} Exception caught.", e);
    }
    Ответ написан
    Комментировать
  • Какую технологию выбрать для работы с базой данных?

    2ord
    @2ord
    Попробуйте одну из TSDB, как указал Владимир Куц .

    В частности, хранилище VictoriaMetrics. В качестве языка запросов применяется PromQL.
    Возможность использования в качестве долговременного хранилища данных, подключенного к Prometheus и Grafana.

    Что касается преимуществ по отношению с другими, то сходите по ссылке выше.
    Ответ написан
    Комментировать
  • Можно ли с помощью rabbitMQ можно ли создать очередь в которой для каждого пользователя последовательно будет выполнятся запрос на другой сайт?

    2ord
    @2ord
    Если ответ клиенту на его запрос выдается не сразу, а с задержкой в связи с ограничениями из-за API третьей стороны, то логично ввести систему заявок. При запросе регистрируют заявку клиента, заносят данные в СУБД, кладут в очередь и сразу выдается ответ с номером заявки и ожидаемым временем готовности. Когда обработчик очереди берет задачу с учетом задержки 5 секунд, получает ответ от API и заносит ответ в готовой для последующего чтения форме в СУБД для соответствующего номера заявки. Независимо от обработчика очереди, клиенты обращаются за получением готовых результатов. И если таковые готовы (проверка по колонке в таблице), выдается ответ. Если еще не готов, выдается следующее ожидаемое окно времени. И т.д., до лимита проверок.

    Если же перед ответом дожидаться пока пройдет 5 секунд, то такая система быстро захлебнется при наплыве запросов и будут исчерпаны ресурсы. Поэтому RPC не рассматриваю как подходящий вариант работы.
    Ответ написан
    Комментировать
  • JQuerry стоит ли еще использовать, или однозначно нет?

    2ord
    @2ord
    Попробуйте Vanilla JS как замену jQuery.
    А вообще рано списывать со счетов jQuery, поскольку у компаний есть много legacy кода.
    Ответ написан
    Комментировать
  • Чем мониторить серверы?

    2ord
    @2ord
    Эластик лишь хранит логи и выполняет поиск по ним. А сбором и перенаправлением таковых занимаются другие инструменты. Допустим, Winlogbeat.
    Ответ написан
    1 комментарий
  • Можно ли и как разбить любой файл на код и собрать его снова?

    2ord
    @2ord
    Для получения текстового вывода любого файла можно сконвертировать в Base64 и разбить на куски нужного размера. Затем на получателе склеить и раскодировать из Base64.
    Правда, стоит учесть, что при кодировании последним размер относительно исходного увеличивается на 33%.
    Добавлено
    Есть другие методы кодирования: UUE и не только.
    Ответ написан
    Комментировать