Задать вопрос
  • Как корректно написать функцию getBlobReader?

    EvgenyMamonov
    @EvgenyMamonov Куратор тега Go
    Senior software developer, system architect
    Вам нужно реализовать свой io.Reader, и в Read уже вычитывать данные по очереди из частей файла.
    Вот работающий пример реализации
    package main
    
    import (
        "io"
        "log"
        "os"
        "path/filepath"
    )
    
    type BlobReader struct {
        keys       []string
        currentKey uint64
        reader     io.ReadCloser
    }
    
    func NewBlobReader(keys []string) *BlobReader {
        return &BlobReader{
            keys: keys,
        }
    }
    
    // Read реализация интерфейса io.Reader, чтобы можно было ваш reader использовать в io.Copy
    func (br *BlobReader) Read(p []byte) (int, error) {
        var err error
    
        // открываем каждый файл по очереди
        if br.reader == nil {
            filePath := filepath.Join(".", "blobs", br.keys[br.currentKey])
            br.reader, err = os.Open(filePath)
            if err != nil {
                return 0, err
            }
        }
    
        // читаем данные из текущего открытого файла, пока данные не закончатся
        n, err := br.reader.Read(p)
    
        // если данные в файле закончились, закрываем его
        if err == io.EOF {
            br.currentKey++
            br.reader.Close()
            br.reader = nil
    
            // io.EOF в err должно вернуть только у последнего файла, чтобы io.Copy считал все файлы и не завис на последнем.
            if br.currentKey < uint64(len(br.keys)) {
                err = nil
            }
        }
    
        return n, err
    }
    
    func main() {
        blobReader := NewBlobReader([]string{
            "2050-part1",
            "2050-part2",
            "2050-part3",
        })
    
        _, err := io.Copy(os.Stdout, blobReader)
        if err != nil {
            log.Fatalln(err)
        }
    
        log.Println("Done")
    }

    Еще нужно будет реализовать метод Close у вашего Reader'a чтобы небыло утечек файловых дескрипторов
    Ответ написан
    4 комментария
  • Как вести себя в ситуации, когда клиент хочет написать заявление в полицию?

    @Stalinko Куратор тега Фриланс
    PHP'шник и фрилансер до мозга костей
    Собственно, а на что он собрался жаловаться в полицию? Единственное, что он может приплести, это "незаконное обогащение". Но раз ты работу сделал, то у тебя есть все доказательства того, что деньги получены за дело.
    Второе, что он может попытаться приплести, это незаконная предпринимательская деятельность и уход от налогов. Ему от этого никакой выгоды, разве, что тебе нервы потрепать. Но т.к. ты самозанятый, то это всё вопросы решаемые.

    В общем не парься. Он просто пугает. Ничего серьезного он не может сделать. Обычный борзый клиент. А тебе урок на будущее: работать лучше по договору с тз, желательно с предоплатой, ну а если начинаются перебои с оплатой, то работа должна быть немедленно прекращена до полной оплаты.
    Ответ написан
    2 комментария
  • Telegram bot с Tesseract на борту не хочет работать, пожалуйста просмотрите мой код?

    @o5a
    Логично, что такие ошибки, если не придерживаться одного цикла. Этот фрагмент
    ...
            for plate in plates:
                x, y, w, h = plate
            centreX = int((x + (x + w)) / 2)
    ...

    Если предполагалось обрабатывать все найденные знаки, то и все последующие расчеты должны быть внутри цикла, а не вне его.
    А если предполагалось обрабатывать только единственный/последний из найденных знаков, то тоже получится ошибка в случае отсутствия определенных знаков на фото.
    Ответ написан
    Комментировать
  • Где хранить большой массив объектов в реакт приложении?

    Zraza
    @Zraza
    Помог ответ? Отметь решением!
    Мой взгляд, на истину не претендую:

    Я сторонник того, что на клиенте вообще не стоит хранить большие объемы данных. Т.е. запрашивает только те, которые нам нужны для работы/отображения в конкретный момент. Все фильтры/сортировка/пагинация на стороне сервера. Понятно, что это не всегда возможно, поэтому идем дальше...

    В хранении большого объема данных в редаксе не вижу ничего плохого, если они редко меняются. Если часто - неприятно, нужно поддерживать иммутабельность, затраты на garbage collector.
    Плюсы - быстрый доступ до данных, т.к. хранятся они в памяти.
    Минусы - поддержка иммутабельности и затраты на память.

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

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

    Ну и, конечно, вопрос в объеме данных. Просто 2к объектов - не то, чтобы сильно много. Вопрос, насколько тяжелых объектов.
    Ответ написан
    2 комментария
  • Как сформировать SQL (для MySQL) запрос по нахождению наиболее похожего профиля с множеством полей-флагов?

    @ComodoHacker
    Велосипед, конечно же, уже придуман, и называется расстояние Хэмминга. Только ваши флаги нужно представить в виде битовой строки.

    https://stackoverflow.com/questions/4777070/hammin...
    Ответ написан
    6 комментариев
  • Какой способ подсчёта суммы в БД лучше и перспективнее для большого объёма?

    inoise
    @inoise Куратор тега PHP
    Solution Architect, AWS Certified, Serverless
    Перестать заниматься фигней и начать хранить агрегаты в базе
    Ответ написан
    2 комментария
  • Почему программа выдаёт неверное, но близкое значение?

    wataru
    @wataru Куратор тега Алгоритмы
    Разработчик на С++, экс-олимпиадник.
    Потому что вычисления происходят не точно из-за ограниченности встроенных типов данных с плавающей запятой. Полученные ошибки округления накапливаются и вы получаете что-то очень близкое к аналитическому ответу, но не его.

    Можно в тестах требовать совпадение с некоторой абсолютной или относительной погрешностью.

    Если нужна максимальная точность, то нужно использовать длинную арифметику или с плавающей или фиксированной точкой. Или считать в рациональных числах (тоже придется самим писать тип или использовать библиотеку).

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

    sarapinit
    @sarapinit
    Точу водой камень
    Нужно хранить изображения в виде файлов на файловой системе, а в базе данных хранить метаданные.
    Если у вас какие-то специфичные требования к хранению файлов, то вам нужно добавить их вопрос. Пока выглядит так что вы перемудрили.
    Ответ написан
    Комментировать
  • Какой протокол стоит использовать для передачи данных между "микросервисами"?

    vabka
    @vabka Куратор тега Веб-разработка
    Подойдет ли для этого обычный HTTP или даже он является излишним?

    > Один из простейших протоколов, который прекрасно реализован в большинстве языков.
    > излишний
    Окей.

    Вот несколько вариантов:
    HTTP+json
    HTTP+msgpack
    gRPC

    Там где написано HTTP может быть использована любая версия, но я советую использовать максимально возможную, какую позволяют используемые технологии (например HTTP/3 aka QUIC)
    Ответ написан
    Комментировать
  • SQS очередь и необязательные параметры?

    @unseriously
    MessageGroupId
    This parameter applies only to FIFO (first-in-first-out) queues
    Type: String
    Required: No

    MessageDeduplicationId
    This parameter applies only to FIFO (first-in-first-out) queues
    Type: String
    Required: No

    https://docs.aws.amazon.com/AWSSimpleQueueService/...
    Ответ написан
    Комментировать
  • Как реализовать бинарный поиск в базе Django?

    @deliro
    1. Очень сомневаюсь.
    2. Запрос Names.objects.get(name=name).count прекрасно использует индекс, если ты его, конечно, создал. 14 миллионов строк для индекса, тем более, уникального — очень мало. А если не создал, то это фулскан и очень долго
    Ответ написан
    4 комментария
  • Ошибка: package ....... is not in GOROOT. Как решить?

    EvgenyMamonov
    @EvgenyMamonov Куратор тега Go
    Senior software developer, system architect
    Лучше установить пакет так, как написано в его инструкции.
    Выполните в командной строке
    go get github.com/adshao/go-binance/v2

    Ну и импорт потом вот так
    import (
        "github.com/adshao/go-binance/v2"
    )
    Ответ написан
    2 комментария
  • Лучшие практики при использовании файлов для загрузки и хранения данных программы?

    1. Не советую такой формат использовать, для интерфейса возьмите более гибкий формат типа toml, yaml, или XML
    2. Для данных используйте json или csv. Готовые решения уже есть
    3. Если нужно хранить данные, которые пользователь вводит через интерфейс, то используйте какую-нибудь БД.
    4. Если это десктопное прилодение, то вполне можно использовать встраиваемую БД, типа sqlite
    Ответ написан
    2 комментария
  • Почему ruby не знает русского и украинского языка?

    1. Убедитесь, что у вас в файле используется UTF-8
    2. Убедитесь, что консоль (или что у вас тут) умеет в UTF-8
    3. Убедитесь, что в шрифте есть эти символы.
    Ruby нормально умеет в кириллицу.
    Ответ написан
    Комментировать
  • Как преобразовать в XML-файл большой объект?

    tumbler
    @tumbler Куратор тега Django
    бекенд-разработчик на python
    1. Использовать queryset.iterator() чтобы избавиться от хранения всего списка объектов
    2. Использовать StreamingHTTPResponse чтобы не буферизировать весь выхлоп
    3. Формировать XML не целиком с помощью цикла в шаблоне, а по одному элементу (плюс хедер/футер XML)
    Ответ написан
    1 комментарий
  • Как скачать все фото по ссылкам с csv?

    ProgrammerForever
    @ProgrammerForever Куратор тега Excel
    Учитель, автоэлектрик, программист, музыкант
    Можно так, например. Для небольших объёмов - самое то. Список файлов в list.txt
    Код сохранить как bat или cmd
    mkdir downloads
    wget -x -i list.txt --secure-protocol=auto -nc -c -P downloads>log.txt
    Ответ написан
    3 комментария
  • Что может а что не может содержать миграция?

    zoonman
    @zoonman
    ⋆⋆⋆⋆⋆
    Нормальная миграция подразумевает следующие характеристики:
    • идемпотентность - будучи запущена, серия миграций приводит к одинаковому результату
    • обратимость - любой шаг миграции можно откатить с откатом версии приложения
    • целостность - миграция переводит приложение из рабочего состояния в рабочее (баги не в счет)

    Естественное применение миграций - это CI/CD. Т.е. в большинстве случаев ожидается минимальный простой приложения во время деплоя, именно поэтому миграции в большинстве своем изменяют структуры данных.
    Но это совсем не означает того, что данные не могут быть изменены. Часто так бывает, что некоторые системные справочники требуют обновления или же данные пользователей требуют изменений. Например - для имени и фамилии использовалось одно поле, а теперь оно делится на два, как положено. Миграция данных в данном случае естественный и необходимый процесс, который может занять значительное время. Поэтому используется запланированный процесс выкатки приложения с его аннонсированием для пользователей. Запланированный даунтайм стандартная практика больших и сложных приложений, которые могут это себе позволить.
    Если ваше приложение не может себе позволить остановку обслуживания пользователей, то для таких случаев пишется вспомогательный код, который делает обработку случаев немигрированных данных и вообще всевозможные костыли, лишь бы оно работало (основной источник гемора).

    Является ли ресайз картинок частью миграции? И да и нет. Это зависит от ряда факторов - сломается ли приложение, если не будет картинки или будет старая картинка, это критичная функция или нет. Пример критичной функции - инстаграм.
    Если дизайн приложения сделан правильно и функция второстепенная, то миграция происходит лишь на уровне БД, а сам ресайз на уровне приложения (скрипта во время выкатки). Пример - новый размер юзерпика, никто не умрет, если он будет больше или меньше, может выглядеть не очень какое-то время, но в конце концов он станет нормальным. Если для нового размера добавляется новый столбец, то в него во время миграции копируются данные из другого столбца, чтобы не рушить функционал.

    Итак, мои ответы по вашим вопросам (как бы делал я):
    1. Добавил бы миграции с внесением/удалением 2 новых столбцов. Первый для email, второй email_verified. После развертывания запустил бы скрипт верификации почты (ох нескорый и ненадежный этот процесс). По-хорошему, по первому логину просил бы проверить и верифицировать email путем отправки кода на него. Думаю, вы уже поняли, что мы попадаем в серую область того, что машинная проверка здесь неуместна. Но допустим, мы использовали машинную верификацию, все проверили, все нужно сделали. В следующей версии мы удаляем столбец email_verified.
    2. Как правило, такие вещи данные в БД не изменяют, а значит нет необходимости в миграциях, достаточно скрипта. Но, если вы ок с простоем приложения, то можно вполне внести данный скрипт в миграцию, а также не забыть об откате этой миграции (удалять новые размеры, к примеру).

    Как мы все видим, миграцию можно рассматривать, как в контексте СУБД, так и в контексте приложения в целом.
    Общепринятая практика - рассматривать миграцию в контексте баз данных. Все остальное - скрипты и костыли в самом приложении.

    Универсального рецепта нет. Все завязано на бизнес-логику и реализацию кода приложения. Если нельзя отделить сложную обработку данных от процесса деплоя, то эту логику следует встраивать в код миграций. Пример такой обработки - получение какого-нибудь системного идентификатора, который используется при работе приложения, например ротация API ключей при смене системы аутентификации.
    Ответ написан
    2 комментария
  • Хайп вокруг ЯП Rust и C?

    bingo347
    @bingo347
    Crazy on performance...
    Насколько критичной проблемой для программиста является ручное управление памятью, которое называют недостатком языка Си?
    Неосвобожденная память (утечка памяти) - это самое безобидное, что может произойти.
    - Сделать free дважды - это UB
    - Забыли проверить результат malloc/calloc/realloc на не NULL, разыменовали - UB
    - Почитали память, в которую ни разу не писали - UB
    - Разыменовали указатель после free - UB
    - Гонка данных - UB
    - ...и еще дофига всего, от чего в лучшем случае программа просто будет работать неправильно, например спалит Ваш пароль, или переведет Ваши деньги на другой счет 10 раз.

    Новый язык программирования Раст, как заявляют, лишен этого недостатка

    Система типов Rust гарантирует лишь одно - в safe коде не будет UB. Утечка памяти, кстати, не является UB, поэтому память вполне себе можно утечь в safe коде, помимо циклических счетчиков ссылок std дает немало возможностей сделать это напрямую:
    https://doc.rust-lang.org/beta/std/mem/fn.forget.html
    https://doc.rust-lang.org/beta/std/mem/struct.Manu...
    https://doc.rust-lang.org/beta/std/boxed/struct.Bo...
    https://doc.rust-lang.org/beta/std/vec/struct.Vec....

    но разве число ошибок в программе зависит именно от наличия или отсутствия ручного управления памятью
    В Rust ручное управление памятью, как и в C и в C++, просто есть культура, что если некая структура аллоцировала память, то она ее освободит. Всякие Vec, Box и т.д. делают это в Drop. В C++ многие повседневные типы так же освобождают в деструкторе память, которую они выделили. Однако в Rust есть разделение на safe и unsafe код и для прикладного программирования safe возможностей более чем достаточно. В C++ же весь код unsafe.

    разве общее число ошибок не перераспределяется на другие недостатки программы
    Нет, не перераспределяется. Хорошая система типов действительно может избавить от многих ошибок, что в целом сделает ПО более надежным. Но надо понимать, что от всех ошибок не избавит ни что. Банальная дискоммуникация с заказчиком порождает огромное число багов.
    Но в Rust очень быстро привыкаешь к такому замечательному подходу в разработке, как Type Driven Development, который позволяет предупредить многие ошибки еще до написания кода. После Rust я стал применять этот подход и в других ЯП, и он работает очень хорошо, даже там, где типизация не такая строгая.

    являются ли ошибки с памятью ошибками программиста, а не компилятора и языка программирования
    Безусловно это ошибки программиста. Программисты, как правило, - это люди, а людям свойственно ошибаться. И хорошо, когда есть средства статического анализа, которые помогают предотвращать ошибки до выхода ПО в продакшн.

    P.S. Вот интересная статья про Rust к прочтению: https://steveklabnik.com/writing/a-sad-day-for-rust
    И к чему она привела: https://github.com/fafhrd91/actix-web-postmortem
    Ответ написан
    4 комментария