Задать вопрос
  • Как должен выглядеть идеальный контроллер?

    Если хотите идеал, то он должен соответствовать следующим пунктам:

    1. Сериализация/десериализация - это дорогостоящее мероприятие, поэтому оно должно делаться только в двух местах: прямо на входе и прямо на выходе. Вход - это ваш контроллер, Выход - это другой сервис, куда вы передаёте данные, или база данных (тут тоже происходит сериализация, либо явно, либо в ORM). Во всех остальных слоях инфообмен должен совершаться уже при помощи объектов PHP либо нативных типов. Это экономит ресурсы. При передаче между слоями приложения объектов вместо значений либо ассоциативных массивов вы сразу будете видеть очепятки, IDE вам прекрасно поможет при помощи автодополнения, объекты могут иметь какие-то полезные методы.

    2. Очень желательно в каждом из слоёв иметь собственный класс, отвечающий за данные. Например, нам в слой API приходит JSON-чик с новым пользователем.
    - Сериализуем JSON в DTO UserInAPI, сразу валидируем всё то, что мы можем валидировать без слоя бизнес-логики, и либо отдаём клиенту ошибку, либо передаём сам объект UserInAPI в следующий слой: слой бизнес-логики
    - В слое бизнес логики, получаем DTO UserInAPI на входе, преобразуем его в свой бизнес-объект UserInBusiness, валидируем его уже с точки зрения бизнеса, и либо возвращаем ошибку в слой API, либо совершаем над ним действия, и передаём объект класса UserInBusiness в слой работы с базой
    - В слое работы с базой данных получаем на входе объект UserInBusiness, преобразуем его уже в сущность базы данных UserInDB, валидируем всё на предмет корректности данных для базы, и либо возвращаем ошибку в бизнес, либо сохраняем сущность класса UserInDB в базу.

    Зачем такие сложности, вы спросите? А просто обратите внимание на то, что скорость изменения кода в разных слоях разная.
    - API вообще должен меняться раз в сто лет, чтобы не злить клиентов. Поэтому DTO класс UserInAPI будет стабильным и редко будет меняться.
    - Бизнес-логика меняется очень часто. У класса UserInBusiness постоянно будут добавляться поля и методы, тут жизнь будет кипеть.
    - Слой базы данных будет меняться реже, чем слой бизнеса, но чаще, чем слой API, потому что нам нужны будут новые поля в базе, новые таблицы и связанные таблицы.
    - И если мы один тип сущности протащим во все слои, то эта сущность обрастёт таким количеством различной хрени, что нам плохо станет, когда будем на неё смотреть. Либо она обрастёт кучей декораторов в каждом из слоёв. Поэтому лучше всё разделить.

    3. Теперь внимание, казалось бы, что мы слишком сильно связываем наши слои, и нижестоящие слои знают что-то о вышестоящих, а это неправильно. Ведь мы передаём объект UserInAPI в слой бизнеса, т.е. слой бизнеса должен уметь работать с этим объектом. И так же слой базы должен уметь работать с объектом бизнеса UserInBusiness. Как же быть? А очень просто. На входе слоёв использовать интерфейсы. Т.е. в слое бизнеса мы будем принимать не сам класс UserInAPI, а объект, имплементирующий интерфейс UserIncoming, который объявим в бизнес слое, и заставим слой API сделать так, чтобы его класс UserInAPI имплементировал этот интерфейс. Таким образом слой бизнеса ничего не будет знать о слое API, а будет ждать на входе данные по контракту, описанному в интерфейсе. Бизнесу плевать на конкретную реализацию, ему нужны только методы getUsername, getEmail из интерфейса. А какой класс ему их предоставит - пофигу. Таким образом мы практически полностью разделяем слои и в два счёта сможем поменять слой API, где у нас HTTP контроллеры, на слой RabbitMQ, SOAP, Grpc и т.д.
    Ответ написан
    6 комментариев
  • Ошибка при установки Wine в Linux 21.10 Текст Ошибки: E: невозможно исправить ошибки: у вас зафиксированы сломаные пакеты! как это исправить?

    dyuriev
    @dyuriev
    A posteriori
    Если речь идет про Ubuntu 21.10, то у данной ОС конец поддержки середина 2022 года.
    Обновляйтесь для начала.
    Ответ написан
    Комментировать
  • Как устроиться в начинающую компанию?

    Vapaamies
    @Vapaamies
    Психанул и снес свои ответы не отмечающим решения…
    Начинающей компании или стартапу на ранних этапах нужны высококвалифицированные сотрудники широкого профиля с большим опытом. Основатели, как правило, начинают искать их по знакомым, потом по рекомендациям знакомых... Если вы задаете такой вопрос — вы точно не ни основатель, ни высококвалифицированный сотрудник. Забудьте.

    И, да, не нужно путать начинающую компанию и начинающего работника. В начинающей компании — люди с опытом, начинающие работники — в компании с отлаженными процессами.
    Ответ написан
    6 комментариев
  • Почему не верно монтируется каталог ubuntu server?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    А вам точно нужно именно монтирование? Обычно достаточно симлинка
    ln -s /nvi /home/test/nvi
    Ответ написан
    1 комментарий
  • Как сделать в строке замену нескольких конкретных одинаковых символов на один такой?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Это еще ничего, а как вы хотите, чтобы парсилась строка "1111,2222,3333"? Как 11112222.3333? Или 111.22223333? Или что?

    Правильный ответ: если строка не является корректно записанным числом, то надо выдавать ошибку, а не пытаться незаметно для пользователя исправить за него ошибки.

    Например, можно просто читать сразу число. Если вам надо, чтобы число было корректным и при использовании '.' и ',', то можно просто все запятые поменять на точку.
    Ответ написан
    2 комментария
  • Почему в функции MYSQL при присвоении в переменную значения из таблицы не учитывается условие WHERE?

    @Uncleruc1
    Проблема заключается в том, что в вашей функции условие WHERE \orderid` = 871жестко зафиксировано, и оно всегда будет брать строку с этимorderid, игнорируя переданное значение orderid` в параметр функции.

    Чтобы учитывать переданное значение в параметр функции, необходимо использовать сам параметр orderid вместо фиксированного значения. Вот исправленный код функции:
    DROP FUNCTION IF EXISTS YourFunction;
    DELIMITER $$
    CREATE FUNCTION YourFunction (qty INT, orderid INT) RETURNS TEXT
    
    BEGIN
    DECLARE text_t TEXT;
    SELECT `sum` INTO text_t FROM t_order_price_type WHERE `orderid` = orderid LIMIT 1;
    RETURN text_t;
    END$$
    
    DELIMITER ;


    Однако, в данном виде WHERE \orderid` = orderid` не сработает так, как вы ожидаете, потому что MySQL может спутать поле таблицы с параметром функции. Чтобы избежать этой путаницы, лучше использовать псевдонимы или уникальные имена для параметров. Например:
    DROP FUNCTION IF EXISTS YourFunction;
    DELIMITER $$
    CREATE FUNCTION YourFunction (p_qty INT, p_orderid INT) RETURNS TEXT
    
    BEGIN
    DECLARE text_t TEXT;
    SELECT `sum` INTO text_t FROM t_order_price_type WHERE `orderid` = p_orderid LIMIT 1;
    RETURN text_t;
    END$$
    
    DELIMITER ;

    Здесь параметр функции называется p_orderid, что предотвращает конфликт имен между полем таблицы и параметром функции.
    Ответ написан
    2 комментария
  • Как писать запросы к API на стадии разработки, если backend еще нигде не хостится?

    fox_12
    @fox_12
    Расставляю биты, управляю заряженными частицами
    1) Запуск бэкенда локально через Docker для тестирования запросов и интеграции (это нормальная практика?)

    Вполне нормальная практика. А что смущает?
    Ответ написан
    Комментировать
  • Насколько безопасно использовать GoodbyeDPI?

    Думаю, тут лучше всего процитировать автора

    Я бы не стал устанавливать GoodbyeDPI на серьёзную машину, на которой множество конфиденциальных данных, особенно на рабочий компьютер/ноутбук с доступом в корпоративную сеть. Причин несколько:

    Я не профессиональный программист вообще и на C в частности;
    • Код использует UB и математику с указателями, потому что в C иначе не получается — куча пространства для ошибок;
    • Программа не проходила аудита кода даже моими глазами;
    • Драйвер WinDivert не проходил аудита кода и периодически вызывает несовместимости с другими драйверами с BSOD'ами (даже если ошибка не непосредственно в WinDivert).
    • Программа была написана по приколу, чтобы потренироваться в фильтрации пакетов на Windows. Я не пользуюсь Windows чёртову дюжину лет. Иными словами, я очень нерегулярно сам использую GoodbyeDPI.

    Что может произойти?
    • В программе найдут уязвимость, связанную с обработкой данных в пакете, с переполнением буфера, с возможностью эксплуатации на стороне сервера ⇒ вам прогрузят код с привилегиями SYSTEM, украдут все данные и заразят компьютер.
    • В драйвере WinDivert найдут аналогичную уязвимость ⇒ вам прогрузят код с привилегиями ядра, украдут все данные и заразят компьютер потенциально так, что антивирусы не обнаружат заражение.

    Это всё применимо к совершенно любой программе в целом, но к GoodbyeDPI в этом плане стоит относиться особенно настороженно, т.к. и сама программа, и драйвер запущены с максимальными привилегиями, а код и того, и другого написан любителями.
    До сих пор периодически пишут об ошибках запуска на необновленных Windows 7 c MS17-010, на таких системах потенциальные проблемы от GoodbyeDPI вообще не имеют никакого значения — вас куда быстрее проэксплуатируют через другой десяток уязвимостей :D

    ValdikSS
    https://ru.stackoverflow.com/questions/1589764/Без...
    Ответ написан
    3 комментария
  • Try/catch и goto?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Для выхода из вложенных циклов при try/catch в случае исключения произойдёт свертка стека

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

    будет ли тоже самое для goto?

    То же самое будет и для goto.
    Ответ написан
    Комментировать
  • Что выбрать: sqlite или redis?

    Вдруг будет слишком долго?
    Не будет. Забудьте вообще на данном этапе своего обучения про существование такого понятия как "скорость", пока не столкнётесь с тормозами в реальности.
    Хочется redis
    Его сложнее администрировать, чем sqlite. Но если хотите - развлекайтесь.
    Ответ написан
    1 комментарий
  • Могут ли возникнуть проблемы с установкой Убунту?

    dyuriev
    @dyuriev
    A posteriori
    слышал что линукс может не встать на ноут

    ставьте дистриб посвежее. если поставите 20.04/22.04 - то со свежим железом могут быть нюансы, ставьте 24.04

    из-за того что снёс винду слететь гарантия

    не знаю в какой вы стране живете, но в юрисдикции РФ - нет. байки для домохозяек.

    и если установить убунту рядом с виндовс, сильно ли это потеряет в производительности?

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

    yakovlev_13
    @yakovlev_13
    Шаманство, экзорцизм и некромантия.
    Если тыкать куда надо ничего не случится. Тыкать можно любой железкой, не только отвёрткой.

    Но есть вероятность что стул у вас обит синтетикой и вы непоседа. И активно ёрзаете на этом стуле известным местом.
    Так вот есть опасность что вы когда-нибудь разгрузите вагон статики на плату, а там результат непредсказуем.
    В быту кнопка оберегает от подобных случайностей
    Ответ написан
    Комментировать
  • Как подготовить перламутровую этикетку к печати?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    А не лучше ли узнать в конкретной типографии, в которой собираетесь заказывать этикетки?
    Ответ написан
    Комментировать
  • Какие азы нужно знать перед тем как начать изучать программирование?

    Maksim_64
    @Maksim_64
    Data Analyst
    Не нужно ничего, начинай программировать. Проблемы надо решать по мере их поступления, а не придумывать их самому.

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

    @rPman
    расчеты разные с последующей сборкой пояснительной записки проекта
    рассчеты на чем то основываются? данные от куда то подгружаются? итог куда то отправляется?

    Писать десктопное приложение обычно заметно сложнее чем веб, .exe не так легко передать, у его запуска есть условия (например архитектура целевой машины, выбор ОС и ее версия, набор установленных компонент) и очень часто все это ломается об попытку сделать все максимально универсально.

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

    Графические интерфейсы и писать для web проще, исключение - какой-нибудь winforms от msvc и его идеологический последователь wpf, но они имеют смысл если целевой интерфейс - огромное количество сложных форм, и скорость разработки критична, и да есть поддержка веб но только с майкрософтовским сервером.
    Ответ написан
    6 комментариев
  • Каково сайту на VPS с IPv6-only?

    @Drno
    Очень многие на Ваш сайт просто не попадут. как уже указали - потому что поддержка ipv6 пока сильно ограничена.
    Вопрос можно решить через cdn, например cloudflare, которые будет перенаправлять ipv4 на ваш ipv6.
    Ответ написан
    3 комментария
  • Каково сайту на VPS с IPv6-only?

    А вот сам вопрос заинтересовал - что на современных сервере и сайте может сломаться без IPv4?

    У большинства посетителей всё ещё тупо нет ipv6 => они не смогут получить доступ к сайту.
    Например, в моём городе всего у одного провайдера есть ipv6.
    Много инструкций всё ещё на уровне винды рекомендуют выключать ipv6
    Ответ написан
    Комментировать