• Как можно отредактировать микроразметку сайта написанного на Bootstrap?

    Mike_Ro
    @Mike_Ro
    Python, JS, WordPress, SEO, Bots, Adversting
    хотел бы узнать в какую сторону смотреть

    С учётом Вашей компетенции в данном вопросе - в сторону фриланса. За условный доширак, школьник разберётся, где находится сайт и как изменить его html.
    Ответ написан
    Комментировать
  • Как должен выглядеть идеальный контроллер?

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

    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 комментариев
  • Как войти в GitHub?

    вот и иллюстрация того, почему второй фактор в виде смс - это очень плохо.
    Используй recovery code, если ты заранее их сохранил.
    Если нет - попробуй самую нижнюю ссылку (которая "Try 2FA account recovery")
    Если и то не поможет - пиши в поддержку.

    Please contact support if you continue to have
    problems.

    Белым по красному же написано
    Ответ написан
    1 комментарий
  • Как сделать Дуал Бут на ноутбук на разные диски?

    @Drno
    Вытаскиваешь 1 диск. ставишь ОС
    Потом вытаскиваешь другйо диск - ставишь ОС

    При старте кнопкой boot menu (которая дл биос) выбираешь с какого диска грузиться...
    Ответ написан
    Комментировать
  • Как отобразить код формата dll в visual studio с китайского на английский?

    VoidVolker
    @VoidVolker
    Dark side eye. А у нас печеньки! А у вас?
    Никак. Да, это все код и отображается он верно, но есть нюанс - это бинарный код, а если еще точнее, то машинный код, а именно - инструкции, которые выполняет процессор. И текстовый редактор, в котором вы открыли DLL не предназначен для отображения бинарных файлов. Текстовые редакторы для текста предназначены. И к китайскому языку он не имеет вообще никакого отношения. Учите матчасть!
    Интересующие вас игровые ресурсы могут быть запакованы кучей самых разных способов. Есть типовые решения, которые применяются часто и, которые, хорошо известны. Есть популярные игровые движки, которые тоже все давно исследованы и изучены где, что и как хранят. И есть все остальные - редкие, никому не нужные движки, самописные движки, переделанные движки, часто даже шифруют и придумывают свои форматы для хранения ресурсов для усложнения задачи обратной разработки, взлома и прочего. Извлечение игровых ресурсов из игры - это процесс обратной разработки. Вот в этом направлении вам и нужно гуглить и учиться, чтобы извлечь нужные вам ресурсы.
    Ответ написан
    Комментировать
  • Почему отображается только один m.2 ssd в райзере?

    15432
    @15432
    Системный программист ^_^
    Нужно в биосе включить режим бифуркации для порта, куда вы его вставили. Сейчас он работает в режиме 1х16, вам нужно включить его в режим 4х4.

    Либо вам нужен райзер другого типа, который исполняет роль PCIe свитча (например, Highpoint SSD6202A), он сам разделяет х16 порт на несколько m.2
    Ответ написан
    Комментировать
  • Хостинг не до конца выполнил услуги, файлы потеряны, кто виноват?

    После мне вовсе заявили, что сервера якобы заканчиваются в 0:00

    Если не во столько, то когда они должны заканчиваться?

    В день окончания аренды, сервера закончились на 4 часа ранее

    А с чего ты взял, что на 4 часа ранее? Может это ты на 4 часа опоздал?
    Какой у тебя часовой пояс и где находится хостер?

    файлы автоматически удалены, вместе с базами данных

    А у хостинга есть обязательство хранить ТВОИ данные после окончания работы, если ты не оплатил?

    Кто виноват в такой ситуации?

    Ну в первую очередь ты, так как не хранил бэкапы. Точно также у хостера могла произойти и авария, из-за которой твои данные бы потерялись.

    Можно ли с такой проблемой идти в суд, если файлы были очень важными?

    Сходи к юристу - пусть он ещё раз очень внимательно договор прочитает, авось ты где-то ошибся или не увидел и на самом деле всё корректно завершилось.
    Если действительно завершилось раньше времени, то тогда можно попробовать написать досудебную претензию
    Ответ написан
    2 комментария
  • Как можно решить проблему с доступам к методам 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
    Ответ написан
  • Какой Ардуино подарить ребенку на 10 лет?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Не забывайте что самое лучшее время которое ребенок может провести - это время с отцом.
    Все эти умные игрушки не имеют никакого значения если вы лично с ним не играете в них.

    Даже бумажный самолетик сделаный с отцом будет ребенку интереснее и ценнее чем Playstation
    и прочее.
    Ответ написан
    2 комментария
  • GDPR сколько хранить персональные данные покупателей?

    Сколько укажешь в своём соглашении на обработку ПД - столько и можно, если это в адекватных рамках.
    Типа если ты пишешь в своём соглашении, что ты будешь хранить персональные данные незарегистрированного клиента ещё 25 лет после выполнения заказа - это очень вероятно посчитают неправомерным.
    Пока клиент к тебе не придёт с желанием их удалить.

    Требования хранить данные не меньше какого-то срока нет.
    Тоесть в принципе, если тебе достаточно для выполнения своей работы продержать данные пару минут - можешь хранить их пару минут.

    Это всётаки не закон яровой)
    Ответ написан
    Комментировать
  • Как организовать поиск в БД с 1000 таблиц?

    sergey-gornostaev
    @sergey-gornostaev
    Седой и строгий
    Даю совет: базу данных, в которой "есть очень много таблиц (>10.000), в каждой от 1 до 50 строк" нужно удалять, а того, кто её проектировал, увольнять с позором.
    Ответ написан
    4 комментария
  • Когда новичку нужно изучать как работает интернет, после изучения базы JS?

    saboteur_kiev
    @saboteur_kiev Куратор тега IT-образование
    software engineer
    Уважаемый пользователь.
    У тебя из 10 вопросов 9 вопросов про то. как стать разработчиком и поменьше учить.
    Прекрати такое поведение.

    Не хочешь учиться - выбери другое направление, кроме ИТ полный мир возможностей.
    Ну или учи свою верстку, работай всю жизнь джуниором, никто тебя за уши в сеньоры не тянет и не заставляет.
    Хочешь - учи, не хочешь - не учи.
    Читай вакансии и требования в вакансиях, зачем тебе советы рандомных людей из интернета, если ты постоянно спрашиваешь почти одно и тоже, хотя тебе уже отвечали.
    Ответ написан
    18 комментариев
  • Подойдёт ли Unreal engine для создания интерактивной презентации?

    Adler_lug
    @Adler_lug
    Микроскопом тоже можно забивать гвозди...
    Ответ написан
    Комментировать
  • Как найти участки кода несовместимые с PHP 8.1 версии?

    pxz
    @pxz
    ✔ Совет: Вам помогли? Отметьте ответы решением.
    Есть специальная тулза для этого — Rector.

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

    https://github.com/rectorphp/rector
    Ответ написан
    3 комментария
  • Как упорядочить id записей в MySQL?

    @Akina
    Сетевой и системный админ, SQL-программист.
    Если речь об автоинкрементном поле-первичном ключе, то забудь про сию хотелку, и чем скорее, тем лучше.

    PRIMARY KEY выполняет в таблице только одну функцию - однозначно идентифицирует запись. В нормальных условиях значение такого поля используется исключительно для связывания данных (установления соответствия), и надобности видеть значение этого поля не существует в принципе.

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

    В общем, надо тебе поле-нумератор? создай для этого дела ещё одно поле, просто числовое, не автоинкремент, и заполняй программно. А ещё лучше - организуй односвязный список, и нумеруй прямо в запросе на получение данных.
    Ответ написан
    Комментировать
  • Как ввести переменную в цикл без предварительного назначения в PHP 8?

    @AUser0
    Чем больше знаю, тем лучше понимаю, как мало знаю.
    Это не глупо, это правильно! Это защищает от некорректного поведения, и даже взлома!

    И за использование неопределённых переменных нужно бить линейкой по рукам, что бы быстрее вырабатывался рефлекс инициализации.
    Ответ написан
    34 комментария
  • Как сделать что бы возвращало все значения RB php?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Надо прочитать в документации, что делает функция getCell, а потом подумать.
    Кроме просмотра обучающих видео на юбтубе, программирование также требует и собственной мыслительной активности программиста.

    Если думать совсем не получается, то надо пройти по ссылке из ответа на свой предыдущий вопрос, и прочитать там.
    Ответ написан
    5 комментариев
  • Почему запрос в Yii выполняется медленнее?

    ThunderCat
    @ThunderCat Куратор тега PHP
    {PHP, MySql, HTML, JS, CSS} developer
    Все дело в волшебных пузырьках в том что пхпмайадмин вас на... обманывает, так как на самом деле в его запросе не показывается "магия", которая в конце добавляет limit 25, о чем говорит надпись "отображение строк 0-24" .

    Ну и в целом, запросы без лимитов и условий практически нигде не используются, по этому странно сравнивать идиотский запрос типа "вытащи мне все что есть в таблице весом в 600 мегабайт" и "покажи первые ндцать записей".
    Ответ написан
    Комментировать
  • Почему в решении этого задания нужно использовать COUNT, а не SUM?

    SagePtr
    @SagePtr
    Еда - это святое
    Потому что нужно подсчитать количество id'шников, а не сумму id'шников, которая вообще не имеет никакого смысла
    Ответ написан
    1 комментарий
  • Как сделать чтобы при неправильном вводе пароля была ошибка?

    ThunderCat
    @ThunderCat Куратор тега PHP
    {PHP, MySql, HTML, JS, CSS} developer
    пишет-Сейчас эта страница не работает,
    смотрим логи, а лучше включаем вывод ошибок. После этого внимательно читаем ошибки и исправляем.

    $password = md5($password."ghjsfkld2345");
    забыть как страшный сон, читаем про password_hash(), делаем как надо.

    $result = $mysql->query("SELECT * FROM `users` WHERE `login` = '$fullname' AND `pass` = '$password'");
    Читаем про подготовленные выражения, автору видео ставим дизлайк и больше всякое г не смотрим.

    setcookie('user', $user['fullname'], time() + 3600 * 24 * 90, "/");
    работать с куками вместо сессии - отдельный вид некомпетентности, точнее - открытое вредительство.

    $mysql->close();
    Абсолютно лишняя строка, драйвер сам закрывает соединение по завершении скрипта, делать это вручную нужно лишь в исключительных случаях, еще один пинок в карму...
    Ответ написан
    7 комментариев