Задать вопрос
  • Как увеличить производительность проекта на python?

    все упирается в бд, на ум сразу пришло вынести эту часть в микросервис
    Какой ещё микросервис? Микросервис, который делает что?

    В-нулевых, нужно конкретизировать что значит "упирается в БД". Тормозят какие-то конкретные запросы? СУБД не хватает ресурсов? Слишком медленный диск? Или, может, под "упирается в БД" вы понимаете всю бизнес-логику приложения, которую вы называете "берет из бд нужные данные" (и тогда становится понятно про микросервис)?
    Во-первых, нужно вынести СУБД на отдельную машину, желательно на голое железо (если речь про реальный хайлоад, а не про кривой код и конфиги).
    В-третьих, под это железо нужно СУБД корректно сконфигурировать.
    В-четвёртых, нужно добавить кэширование.
    В-пятых, нужно проверить алгоритмы и пофиксить узкие места (на последнем месте, потому что это самое трудоёмкое).

    Я понимаю, что python и django не самые быстрые инструменты (мягко скажем)
    Я вас уверяю, что проблема в вашей компетенции (мягко скажем), а не в инструментах. Есть достаточно проектов, написанных на Джанго, которые вывозят большие нагрузки.
    Вы, в принципе, правильно сделали, что попытались поначалу закидать проблему железом - оно обычно дешевле, чем время разработчиков. Но параллельно надо и оптимизацией заниматься, и это требует системности, которой в вопросе не очень-то видно. Ну и компетенций разных - если тормозят алгоритмы - это одно, если конкретные SQL-запросы - это другое, если СУБД задыхается в принципе - это третье.
    Ответ написан
    5 комментариев
  • Почему возникает Ошибка синтаксического анализа XML в браузере firefox?

    sfi0zy
    @sfi0zy
    Creative frontend developer
    Между фактами
    Как видно, на первой позиции в первой строке находится {

    и
    Ошибка синтаксического анализа XML

    есть противоречие. То ли речь идет про XML, то ли про JSON. Надо определиться. Вполне вероятно, что у вас сервер левые заголовки отдает и браузер думает, что там XML, а на самом деле там JSON. Отсюда и ошибка.
    Ответ написан
    Комментировать
  • Стоит ли хранить изображения base64 в БД?

    Sanasol
    @Sanasol
    нельзя просто так взять и загуглить ошибку
    Стоит ли хранить изображения base64 в БД?

    нет

    composer require symfony/dom-crawler

    use Symfony\Component\DomCrawler\Crawler;
    use Illuminate\Support\Facades\Storage;
    use Illuminate\Http\File;
    
    $desc = $request->input('some_html'); // POST with html
    $dom_desc = new Crawler($desc);
    $images = $dom_desc->filterXPath('//img')->extract(array('src')); // extract images
     
    foreach ($images as $key => $value) {
        if (strpos($value, 'base64') !== false) { // leave alone not base64 images
            $data = explode(',', $value); // split image mime and body
            $tmp_file = tempnam('/tmp', 'items'); // create tmp file path
            file_put_contents($tmp_file, base64_decode($data[1])); // fill temp file with image
            $path = Storage::putFile('public/items', new File($tmp_file)); // put file to final destination
            $desc = str_replace($value, $path, $desc); // replace src of converted file to fs path
            unlink($tmp_file); // delete temp file
        }
    }
    Ответ написан
    1 комментарий
  • Почему связи в таблице работают неправильно?

    NikFaraday
    @NikFaraday
    Student full-stack Developer
    Господи, изучите сначала теорию о работе с базами данных, перед тем как задавать такие вопросы, потому что это просто смешно уже...

    Во первых, если вам нужно установить связь между этим
    public List<CodeSnippet> LikedCodeSnippets { get; set; } = new List<CodeSnippet>();


    И этим
    public List<User> UsersWhoLiked { get; set; } = new List<User>();


    Вам нужна дополнительная таблица. Почему? Потому что тут связь много-ко-многим. Вот она:
    public sealed class UserCodes
    {
        public int UserId { get; set; }
        public User User { get; set; }
    
        public int CodeId { get; set; }
        public CodeSnippet Code { get; set; }
    }


    Через эту таблицу далее конфигурируете связь много-ко-многим

    Что значит эта запись?
    public User User { get; set; } = null!;

    В чём смысл говорить, что она null и ставить ! как обозначение того, что она not null?
    Ответ написан
    2 комментария
  • Как работает аутентификация Laravel Sanctum и что лучше JWT или Sanctum?

    delphinpro
    @delphinpro Куратор тега PHP
    frontend developer
    Санктум - это готовый пакет аутентификации на основе тех же токенов.
    Ответ написан
    Комментировать
  • Как отправить данные в формате multipart/form-data через curl?

    SilenceOfWinter
    @SilenceOfWinter Куратор тега PHP
    та еще зажигалка...
    curl сам добавить заголовок
    Передача массива в параметр CURLOPT_POSTFIELDS закодирует данные с типом multipart/form-data, тогда как передача URL-кодированной строки закодирует данные с типом application/x-www-form-urlencoded.
    Ответ написан
    Комментировать
  • Какие азы нужно знать перед тем как начать изучать программирование?

    saboteur_kiev
    @saboteur_kiev Куратор тега IT-образование
    software engineer
    Азы такие.

    1. Уметь читать, желательно еще и писать. А еще если в идеале набирать на клавиатуре не одним пальцем.

    2. Уметь читать и понимать написанное. Как этому научиться - не очень ясно, это в глубинах психологии и воспитания.

    3. Круто знать английский на "техническом уровне", то есть самый простой уровень английского, школьный подойдет. Потому что очень много документации на английском, которая и читается легче и понятнее, и найти проще.

    4. Много практики. Видяшки и чтение дают теорию, которая мгновенно забывается, если нет практики. Лучше на практике делать как-нибудь, чтобы работало, потом читать книжки и понимать где ты делал не так, но ты уже будешь понимать почему, так как была практика. Это самый важный пункт из всех. Без практики - ничего не получится. Пишешь любые программы, которые приходят в голову. Вывести текст на экран, сделать крестики нолики, усложнить, делать именно маленькие программки для себя. САМЫЙ ВАЖНЫЙ ПУНКТ.

    5. Быть любопытным. Периодически интересоваться как это работает под капотом хотя бы поверхностно, интересоваться терминологией и вкратце историей появления термина. Развивает интуицию и базу.
    Ответ написан
    2 комментария
  • Как автоматически подставлять значение в value?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Начинающие очень часто делают глупости. И записывать в базе данных количество строк в ней - одна из них.
    Точно так же, как вы сейчас получаете количество через SELECT COUNT(*), это можно будет сделать в любой момент времени потом. И ничего никуда подставлять не надо.

    Плюс $table_name выглядит еще одной глупостью. Имя таблицы не должно быть динамическим.
    Ответ написан
    9 комментариев
  • Какую бд лучше выбрать?

    sergey-gornostaev
    @sergey-gornostaev Куратор тега SQL
    Седой и строгий
    Mongo почти никогда не проще использовать. Для её выбора должны быть очень веские основания.
    Ответ написан
    Комментировать
  • Переход с MD5 на SHA256 что нужно сделать чтобы работало)?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Проблема решается постепенным переводом пользователей на новое хранение пароля по мере их входа в систему.
    В момент аутентификации пользователя нам известен его пароль, поэтому если новый хэш для пользователя не определён, то аутентифицируем его по старому методу, генерируем и сохраняем новый хэш, удаляем старый хэш.
    И, конечно же, надо забыть о самодельных системах хэширования и использовать стандартные password_hash и password_verify.
    Ответ написан
    24 комментария
  • Почему картинка вставленная через picture растягивается на неопределенную ширину в firefox?

    Ankhena
    @Ankhena Куратор тега CSS
    Нежно люблю верстку
    Это увлекательная история.
    Вот представьте себя на месте браузера.
    Что видите в коде:
    Картинка должна занять 100% высоты и width auto.
    Как будете рисовать высоту, если у родителя картинки высота тоже 100%, у его родителя тоже нет и т.д. до самого верха. От чего считать проценты? Вроде есть какой-то намек из top 0 и bottom 0. Не прямой, конечно, но хоть что-то.
    Теперь про ширину: написано нарисуй авто. Размер в атрибуте не задан, но можно посмотреть, что там у файла. И хотелось бы сохранить пропорции.
    Следующий этап размышлений о том, что делать с picture. Вроде надо растянуть по содержимому, но у него auto, которым и так сложно решить что делать.

    Как рисовать будете? Как догадаетесь что хотел сказать верстальщик, если у браузера нет возможности заглянуть ни к вам в голову ни в макет?

    Ну вот FF берет в качестве ширины для picture исходную ширину картинки.

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

    Как исправить:
    Вариант 1 (похуже)
    Тег picture тег с особенностями и ещё и часто не известно, будет ли он вообще в разметке или клиенты его потеряют.
    Поэтому самое умное, что можно ему задать это display: contents;, чтобы не мешался.
    И дальше работать с оберткой. Тут вариантов много. Например, задать пропорции, а картинке object-fit. Правда у FF есть проблемы с aspect-ratio от высоты.

    Вариант 2 (получше)
    Картинка, по крайней мере в примере, вообще не контентная и её можно убрать в стили (псевдоэлемент и его фон)
    Ответ написан
  • Почему запрос возвращает пустоту?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Если запрос выполняется без ошибок но не возвращает ни одной строки, это значит что в БД отсутствуют данные, подходящие под указанные в запросе условия.
    Ответ написан
    Комментировать
  • Как можно решить проблему с доступам к методам PHP классов унаследованным от одного класса?

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

    <?php
    
    class Node
    {
        protected function func1() {
            print "NODE PARENT; ";
        }
    }
    class NodeA extends Node
    {
        public function FUNC2() {
            print "NODE A; ";
        }
    
        // Используем метод родителя внутри этого класса
        public function func1Overrided() {
            print "From parent: " . parent::func1();
        }
    
        // Переопределяем метод так, чтобы его нельзя было использовать
        protected function func1() {
            throw new \Exception("Нельзя вызывать этот метод из NodeB");
        }
    }
    
    class NodeB extends Node
    {
        // Функция инициализации
        public function onInit(NodeA $a): void
        {
            // Сделал так, чтобы не мокать api )
            (function (?NodeA $a) {
                $a->FUNC2(); // Метод успешно вызывется так как он public
                $a->func1();  // Метод теперь кидает исключение, использовать не получится
            })($a);
        }
    }
    
    $nodeA = new NodeA;
    $nodeA->func1Overrided(); // Работает вызов метода funс1 из родителя
    
    $nodeB = new NodeB;
    $nodeB->onInit($nodeA); // Выдаёт ошибку, нельзя использовать метод func1 из класса NodeB


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

    Вот минимально-инвазивное решение, которое позволит и наследование сохранить (если оно прям ну вот сильно надо), и решить проблему при помощи композиции, основанной на трейте.

    <?php
    // Делаем общий трейт для всех классов
    trait Func1 {
        private function func1() {
            print "FUNC1; ";
        }
    }
    
    class Node
    {
        // Включаем трейт
        use Func1;
    }
    
    class NodeA extends Node
    {
        // Включаем трейт
        use Func1;
    
        public function FUNC2() {
            print "FUNC 2 NODEA; ";
        }
    }
    
    class NodeB extends Node
    {
        // Включаем трейт
        use Func1;
    
        // Функция инициализации
        public function onInit(NodeA $a): void
        {
            // Добавить зависимость
            (function (?NodeA $a) {
                $a->FUNC2(); // Метод успешно вызывется так как он public
                $a->func1();  // Метод использовать не получится, т.к. он private
            })($a);
        }
    }
    
    $nodeA = new NodeA;
    
    $nodeB = new NodeB;
    $nodeB->onInit($nodeA); // Выдаёт ошибку, нельзя использовать метод func1 из класса NodeB
    Ответ написан
  • Как работать с блоками HTML?

    delphinpro
    @delphinpro Куратор тега CSS
    frontend developer
    В данном случае – изучить документацию Bootstrap
    Если что-то непонятно будет, то тогда и задавать конкретные вопросы
    Ответ написан
    1 комментарий
  • Какую библиотеку для PHP 8 можно использовать для редактирования метадаты в PDF файлах?

    Adamos
    @Adamos
    Ghostscript через командную строку. Он все равно должен быть установлен, чтобы работать с PDF.
    Ответ написан
    9 комментариев
  • Как исправить Fatal error: Uncaught PDOException: SQLSTATE[HY093]: Invalid parameter number: :max?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    1. В PostrgeSQL используется синтаксис
    [ LIMIT { number | ALL } ] [ OFFSET number ]
    2. Нельзя передавать в запрос параметры, для которых в запросе нет плейсхолдеров.
    Ответ написан
    1 комментарий
  • Какие особенности разработки сайтов под тор/даркнет?

    vabka
    @vabka Куратор тега Веб-разработка
    Никаких особенностей нет - это точно такие же сайты.
    Мб максимум - стоит попытаться реализовать их без js, тк в том же Тор браузере изначально стоит расширение, которое отключает js
    Ответ написан
    1 комментарий
  • Google Consent Mode v2 / режим согласия Google v2 как установить?

    @lotse8
    Ставить нужно обязательно. У Google есть список доверенных платформ, с которыми он работает.
    Вот бесплатный вариант до 5000 просмотров в месяц, дальше 12 евро/мес. - цены ниже на странице, написано все на русском, можно язык переключить
    https://www.consentmanager.ru/%d0%b8%d0%b7%d0%b4%d...
    Поставьте срочно этот, а потом, если желание будет разбираться и свой писать, то разбирайтесь. Удачи.
    Ответ написан
    Комментировать
  • Работа с api/hash или как правильно защитить http/fetch запросы на сайте?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Лучший (и единственный) вариант - работать через свой бэкенд и нигде никогда не светить ключи от посторонних API. На своём бэке вы можете вводить любые ограничения на частоту и количество запросов к чужому API.
    Всё, что попадает к клиенту, или приходит от клиента - небезопасно по умолчанию.
    А Restrict to domain вам не поможет, в браузере можно написать JS-код, который будет работать с вашим ID прямо на вашей же странице и массово генерировать запросы.
    Ответ написан
    8 комментариев