• Как реализовать корзину на LARAVEL?

    @MadridianFox
    Web-программист, многостаночник
    Корзину надо хранить в БД, привязывать к пользователю или к идетификатор сессии пользователя, если он не авторизован.
    В момент авторизации прописываем id пользователя в корзину текущей сессии.

    Обязательно предусмотреть крон-команду, котрая будет удалять слишком старые корзины не привязанные к пользователям.

    Часто корзина это не только набор товаров, но и какие-то более общие параметры, например промокод, поэтому лучше корзину делать из нескольких таблиц, например baskets и basket_items
    Ответ написан
    2 комментария
  • Nginx в режиме обратного прокси нужно сайта сдвинуть в?

    @MadridianFox
    Web-программист, многостаночник
    Как уже написали в комментарии - то где искать стили решает приложение и по хорошему надо в каждом бэке сделать пути для подгрузки статики настраиваемыми.

    Однако, если все бэки находятся на одной машине, можно подставить костыль.
    Вы можете создать особый location, даже несколько, которые будут искать запрошенный файл сначала в одной папке, потом в другой, потом в третьей.
    location ~* \.(css|js)$ {
        root /path/to/back1;
        try_files $uri @back2;
    }
    
    location @back2 {
       root /path/to/back2;
       try_files $uri @back3;
    }
    
    location @back3 {
       root /path/to/back3;
       try_files $uri =404;
    }


    Если один из бэков находится не на этой же машине, то можно его поставить в конец и делать на него проксирование:
    location @back3 {
       proxy_pass http://external-service.com;
    }


    Ещё, можно рассмотреть вариант с условиями, которые смотрят на загловки запроса, ну там referer какой-нибудь или origin, и в зависимости от этого проксируют на тот или иной бэк.
    Ответ написан
  • Почему не работает grep?

    @MadridianFox
    Web-программист, многостаночник
    Потому что паттерн надо в кавычки брать. А ещё в греп надо явно указывать что паттерн это регулярка опцией -E
    Сделайте
    grep - E 'ваш паттерн'
    Ответ написан
    Комментировать
  • Где брать картинки по типу 1000x1000 для верстки?

    @MadridianFox
    Web-программист, многостаночник
    Ответ написан
    Комментировать
  • Зачем использовать Gulp, если можно обойтись плагинами?

    @MadridianFox
    Web-программист, многостаночник
    Серьёзная разработка подразумевает автоматизацию сборки/развёртывания вашего приложения с использованием какой-нибудь ci/cd системы. Это делает неоходимым использование консольных систем сборки, которые в отличие от плагина к редактору:
    1) можно использовать в скриптах
    2) банально меньше весят

    Ну и кроме того, вы используете VSCode, в котором есть этот плагин и он как-то настроен, а ваш коллега может использовать другой редактор, в котором либо нет такого плагина, либо настройки у него другие. А ведь настройки сборки по хорошему должны без проблем передаваться от разработчика к разработчику.
    Ответ написан
    Комментировать
  • Как сделать редирект на вывод из echo?

    @MadridianFox
    Web-программист, многостаночник
    Используйте заголовок редиректа
    header("Location: $link");
    Ответ написан
  • В чем разница kubectl run и kubectl create deployment?

    @MadridianFox
    Web-программист, многостаночник
    команда run запускает один под
    а create deployment создаёт деплоймент, который в свою очередь создаёт под
    Ответ написан
  • Как удалить pull request на удаленном репозитории?

    @MadridianFox
    Web-программист, многостаночник
    Если активность в репозиторий высокая, то, вероятно, уже никак.
    А если никто не успел сделать коммит после вас в главную ветку, то вы можете сделать git reset на коммит до мержа и потом git push --force. Конечно, если вы имеете на это право)
    Ответ написан
  • Редирект с nginx + upstream. Как?

    @MadridianFox
    Web-программист, многостаночник
    У вас основная секция server слушает 443, а новые правила редиректов вы вставили в server, который слушает 80 и предназначен для редиректов http -> https
    Кроме того, в www редиректе вы не меняете хост, т.е. даже если он отработает, то он вызовет бесконечный редирект.
    Ответ написан
    Комментировать
  • Нужен совет: корректна ли связка Nginx - Docker - Nginx (proxy)?

    @MadridianFox
    Web-программист, многостаночник
    В этом нет ничего криминального. Если вам надо именно так - делайте. Если видите способ упростить систему - упрощайте.
    Главное не забыть прокинуть реальный ip и схему в заголовке.

    Кстати, k8s например примерно так и работает. Там 80,443 порт слушает т.н. ингрес - обычно тот же nginx, конфиг которого задаётся через yml файл. И вот он принимает все запросы и в зависимости от настроек проксирует их на бэкэнды, в том числе и на внутренние nginx'ы.
    Ответ написан
    Комментировать
  • Как с помощью ps найти основной дочерний процесс?

    @MadridianFox
    Web-программист, многостаночник
    Обычно, проверка на то что программа уже запущена, делается через создание т.н. lock файла.
    Вам нужно в начале работы скрипта проверить - создан ли файл.. ну например /var/www/site/manage.lock
    если да, то завершить программу т.к. уже работает другой процесс,
    если нет - создать такой файл, продолжить выполнение программы, а перед завершением удалить файл.

    Если говорить об определении дочерних процессов, то у ps богатые возможности по фильтрации и форматированию вывода. Получить PID дочерних процессов зная PID родительского можно вот так:
    ps --ppid=1234 -o pid
    Ответ написан
  • Насколько защищена представленная конструкция php?

    @MadridianFox
    Web-программист, многостаночник
    Уязвимость - это когда злоумышленник использует такие варианты параметров, обработку которых разработчик не предусмотрел.
    Варианты обработки параметров - это не только когда мы явно сравниваем переменную с чем-то. Например печально известная функция printf() в языке Си принимает шаблон и значения, которые в него надо ставить, если шаблон может ввести пользователь, то он может подобрать такой шаблон, который выдаст больше чем планировал разработчик.
    printf - потенциально уязвимая функция.
    К потенциально уязвимым функциям можно отнести интерпретирующие функции. Например запрос к БД. Например через одну лишь функцию mysql_query() можно в теории сделать с БД что угодно.
    Это "что угодно" ограничивается тем какой запрос передаётся в функцию. Однако если запрос хоть как-то зависит от того что ввёл пользователь, то разработчику надо предусмотреть любые варианты ввода пользователя так, чтобы запрос продолжал делать то что нужно разработчику, а не пользователю.
    Но не только лишь божественные интерпретирующие функции кроют в себе опасность. Например сохранение некоторой строки в БД и последующий вывод этой строки на страницу тоже может быть опасным, хотя при записи в БД эта строка безопасна. Я говорю о подстановке js кода в страницу, которая будет показана другому человеку.
    Т.е. варианты использования введёного пользователем параметра не ограничиваются той функцией которая непосредственно обрабатывает введённый параметр, но и накапливаются дальше за всё время использования данных, которые когда-то ввёл пользователь.

    К чему я это всё?
    К тому, что для того чтобысказать уязвим ли этот код, нужно оценить как на него повлияют разные варианты введённого логина и пароля или других параметров, которые возможно есть в этом скрипте.
    Я не вижу в этом коде божественных функций, не вижу никакого другого использования введённых параметров кроме их сравнения с литералом. На основании этого могу сказать, что код вполне надёжен.
    Конечно, всегда есть опасность того, что, допустим по историческим причинам оператор === для строк имеет особое поведение, когда в строке есть символ 0xFFAA.
    Ответ написан
    2 комментария
  • Какой дистрибутив Linux выбрать для начинающих?

    @MadridianFox
    Web-программист, многостаночник
    Зависит от того чего вы хотите добиться.
    Говорят, что лучше учиться водить на машине с механической коробкой передач, а не с автоматической. Потому что в обратном случае, с механикой у вас будут проблемы.

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

    Тут на самом деле возможны две точки зрения:
    1) надо ставить любой линукс, и пытаться дить с ним. Решая постоянно возникаюзие проблемы вы научитесь... делать ваши повседневные задачи в линуксе, ну и приобретёте понимание некоторых линуксовых вещей.
    2) надо ставить линукс в виртуальной машине. Это позволит вам проводить более радикальные эксперименты, не боясь угробить сам компьютер. Тут можно уже и не ОС для домохозяек ставить.

    Исходя из этого я бы посоветовал вам arch linux. У этого дистирибутива лучшая вики из всех что я видел. Но домохозяйка его уже не установит. Тут надо самостоятельно размечать диск, настраивать монтирование, настраивать сеть и т.д. Благо в вики всё это по шагам расписано.
    Сначала попробуйте его в виртуальной машине. Несколько раз настройте по разному - с разными графическими окрежениями, с разными сетевыми менеджерами и т.д.
    Сохраняйте получившиеся конфиги. Научитесь их переносить.
    Когда почуствуете что уверенно можете воспроизвести полученный результат на новой виртуалке и когда поймёте что вы в состоянии открыть ютубчик, тогда можно помолиться и ставить уже на реальный компьютер.

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

    @MadridianFox
    Web-программист, многостаночник
    Можно использовать регулярное выражение

    let allCaps = !/[a-zа-я]/.test(myString);
    Ответ написан
    1 комментарий
  • Как получить уникальные записи из БД?

    @MadridianFox
    Web-программист, многостаночник
    Чтобы sql запрос выдал вам только уникальные строки необходимо в секцию select добавить слово distinct.
    Вот так:
    select distinct id, name, date...
    Примерно то же самое можно сделать и через eloquent builder
    Model::query()->distinct()...

    Однако это работает именно со строками ответа.
    Если же у вас строки ответа разные, но дата повторяется, то там нужно более сложное решение.
    Ответ написан
    2 комментария
  • Что не так с моим SSH?

    @MadridianFox
    Web-программист, многостаночник
    На моей памяти Windows Terminal никогда с tmux нормально не работал. И ConEmu тоже.
    Адекватно себя ведут только терминалы из cygwin и mingw. Чтобы получить такой терминал достаточно установить git и открыть git bash.
    Ответ написан
  • Как десериализовать SOAP?

    @MadridianFox
    Web-программист, многостаночник
    Не изобретайте велосипед и найдите библиотеку для работы с soap. Протоколы для того и придумываются, чтобы стандартизировать какие-то вещи и потом использовать библиотеки.
    Ответ написан
    Комментировать
  • Как средствами php запустить выполнение linux-команды в фоновом режиме?

    @MadridianFox
    Web-программист, многостаночник
    nohup - это команда bash, которая просто указывает самому bash'у что фоновому процессу не надо отправлять сигнал HUP при завершении работы.
    & это тоже фишка bash, позволяющая перевести процесс в фон

    Проблема в том что php это вам не bash и он наверное сам отслеживает состояние запущенного им процесса.

    Попробуйте использовать setsid.
    В отличие от nohup это полноценная программа, которая запускает указанную в качестве аргумента программу в отдельной сессии. Как только целевая программа запущена setsid завершает работу. Это должно "отпустить" php почти моментально.
    Ответ написан
  • Как запустить скрипт python в фоне как демон?

    @MadridianFox
    Web-программист, многостаночник
    Чтобы программа работала "в фоне", она должна либо сама позаботиться о том чтобы не блокировать консоль и не умирать при закрытии баша, либо доверить это специальной программе.

    Как уйти в фон самостоятельно:
    Процессы (работающие программы) имеют идентификаторы и знают кто их запустил, посредством хранения id родительского процесса. Т.о. у нас есть дерево процессов. Родительский процесс может управлять дочерними, и он должен при своём завершении завершать и свои дочерние процессы. Если он этого не сделает, то дочерний процесс сменит родителя на процесс с id = 1, т.е. на init процесс. Поэтому чтобы уйти в фон, ваша программа должна всего лишь остановить её родительский процесс.
    Проблема в том, что родительский процесс для программы, которую вы запускаете в консоли - это сама консоль и нам не надо чтобы она закрылась.
    Поэтому уходящие в фон программы перед остановкой родителя увеличивают уровень вложенности - т.е. запускают свою копию, и эта копия, будучи дочерней для первого процесса программы, убивает уже не баш, а вспомогательный родительский процесс.
    Другой момент - это отвязаться от консоли. Тут всё просто - надо перенаправить stdin, stderr и stdout в файлы.
    Ну и наконец надо позаботиться об управлении демоном, ведь пока что нам не остаётся ничего другого, кроме как посылать ему сигналы командой kill. Чтобы реализовать более понятные команды, надо сделать две вещи:
    1) во время ухода в фон сохранить в файл pid результирующего процесса
    2) написать немного кода в самой программе или во вспомогательном скрипте, который, при вызове его в консоли, будет читать pid из файла и манипулировать процессом.

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

    Другой вариант - использовать вспомогательные программы.
    С одной стороны у нас есть возможности самого баша - jobs т.е. фоновые процессы, которые однако умирают при закрытии консоли. Чтобы это обойти есть команда disown и программы nohup и setsid.
    Они позволяют так или иначе получить процесс отвязанный от баша. Однако управлять процессом можно будет только сигналами.
    С другой стороны есть менеджеры процессов. Например supervisord или pm2. Это такие программы, которые умеют уходить в фон и умеют, уже будучи демоном, запускать другие программы и управлять ими.

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

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

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

    @MadridianFox
    Web-программист, многостаночник
    А как вы измеряли скорость ответа?
    Если вы не написали бенчмарк, который на сотне тысяч итераций доказывает что один метод быстрее другого, то разница во времени ответа может быть случайностью.
    Важен ещё способ получения времени ответа, ведь можно измерять как время обработки запроса сервером, так и полное время отправки и получения ответа.

    Вообще чисто теоретически разница в скорости может происходить из того факта, что методом POST данные отправляются в другом виде, соответственно может быть затрачено разное время на формирование запроса, на отправку большего объёма данных и на чтение данных на сервере.
    Ну например, данные закодированные в multipart/form-data однозначно по размеру больше чем в query string.

    Но даже если допустить, что POST реально медленнее, то это не повод отказываться от него в пользу GET.
    Это какая-то преждевременная оптимизация получается. Какая там разница? 10 миллисекунд какие-нибудь? Для вас это настолько критично? Никто и не заметит. Вот когда упрётесь в скорость ответа, и когда эта небольшая разница будет решающей, тогда можно будет задуматься.

    Про важные данные - опасность есть ровно одна - те данные, которые указаны в query string вашего запроса, они попадут в историю браузера, в логи разных серверов, которые передают данные.
    Например вы отправляете форму входа методом GET.
    Ну и что что у пользователя в адресной строке мелькнёт его пароль - он же сам его и ввёл. А вот на сервере в логах apache или nginx появится строчка типа /login?user=vasya&pass=12345
    Само по себе это не очень страшно - ну логи, чё мне с них, у меня вся БД с пользователями под рукой.
    Но если кто-то найдёт уязвимость на вашем сайте и как-то прочитает логи, то будет плохо.
    Ответ написан
    1 комментарий