• Почему ruby не знает русского и украинского языка?

    vabka
    @vabka
    Токсичный шарпист
    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 комментария
  • Как удалить определенный тег внутри тега?

    DevMan
    @DevMan
    да перестаньте уже насиловать мозг регулярками там, где они не нужны.
    любой XML (и HTML в частности) давно отлично разбирается и обрабатывается стандартными средствами.
    dom parser и xpath к вашим услугам.
    Ответ написан
    2 комментария
  • Как запустить скрипт python через cron?

    ky0
    @ky0
    Миллиардер, филантроп, патологический лгун
    Путь к бинарнику интерпретатора добавьте.
    Ответ написан
    1 комментарий
  • Как разбить массив на равные части?

    vabka
    @vabka
    Токсичный шарпист
    Ответ легко ищется поисковиком

    a = [0, 1, 2, 3, 4, 5, 6, 7]
    a.each_slice(3) # => #<Enumerator: [0, 1, 2, 3, 4, 5, 6, 7]:each_slice(3)>
    a.each_slice(3).to_a # => [[0, 1, 2], [3, 4, 5], [6, 7]]

    https://rdoc.info/stdlib/core/Enumerable#each_slic...
    Ответ написан
    2 комментария
  • Для каких целей Golang лучше?

    uvelichitel
    @uvelichitel Куратор тега Go
    habrahabr.ru/users/uvelichitel
    Микросервис в двух словах - это самостоятельная сетевая единица со своим потоком исполнения, своим URI и своим маленьким (как правило REST) API для которой поднимать nginx setup избыточно.
    Ответ написан
    5 комментариев
  • Почему некоторые участники могут дать более одного ответа на вопрос?

    pragmatik
    @pragmatik Куратор тега Хабр Q&A
    Это вопрос 2013 года. Тогда вопросы были реализованы в виде публикаций на Хабре, а ответы - в виде комментариев к ним. Количество комментариев к одной публикации не ограничивалось и любой пользователь мог оставить неограниченное количество "ответов". Уже потом все вопросы и ответы перенесли на отдельный движок на отдельном домене, где появились ограничения на число ответов. Но уже имевшиеся на тот момент ответы под ограничение не попали.
    Ответ написан
    Комментировать
  • Какие есть варианты программно создать график в формате png/jpg?

    Moskus
    @Moskus
    Если вы предпочитаете растр, на сервере можно использовать www.gnuplot.info
    Ответ написан
    Комментировать
  • В каком виде лучше пересылать изображения в jpeg формате?

    inoise
    @inoise
    Solution Architect, AWS Certified, Serverless
    Пересылать ссылками, как есть. Любой клиент сможет загрузить изображение и его отрендерить. Фигней страдать не стоит
    Ответ написан
    2 комментария
  • Растет база в ClickHouse, что делать?

    Slach
    @Slach
    скорее всего у вас query_log, metrics_log и т.п. системные таблицы растут
    для них можно здать TTL
    https://clickhouse.tech/docs/en/operations/server-...

    проверить что именно занимает место на диске можно через

    SELECT database, table, formatReadableSize(sum(bytes_on_disk)) FROM system.parts GROUP BY database, table

    и через

    SELECT database, name, engine_full, formatReadableSize(total_bytes) FROM system.tables;
    Ответ написан
    Комментировать
  • Требуется расшифровать набор символов но не знаю каким методом?

    gbg
    @gbg
    Любые ответы на любые вопросы
    Знаки == на конце с большой вероятностью указывают на то, что на финальной стадии это дело пропустили через base64
    Ответ написан
    3 комментария
  • Должны ли разработчики понимать абсолютно весь проект?

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    В достаточно большом проекте - это просто невозможно. Ни один человек в мире не может понимать целиком, например, хром.

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

    Но иметь белые пятна - это нормально, если непонятной частью занимаются другие разработчики, естественно. Свой кусок знать надо целиком.
    Ответ написан
    Комментировать
  • Как правильно работать с 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), и тесты тут будут не лишними. Если ошибка обнаруживается на фронте, то к беку летит баг, куда обращались, что получили в ответ, что ожидали получить.
    Фронтэнд... Если какая ошибка то у него работа останавливается и он пишет просто в трелло "не работает метод такой то..."

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