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

    @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 комментарий
  • Отправка почты с формы?

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

    Если необходимо разбить это на несколько страниц, или необходимо сделать на сервере не в одном обработчике, то запоминайте в сессию сначала данные одной формы, потом данные другой формы
    ну и когда соберётся полный набор данных отправляйте письмо.
    Ответ написан
    Комментировать
  • Как писать Толковый ООП код в JS?

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

    Я разделяю ООП на аутентичное и классическое. Аутентичное, это ООП как его представлял автор - объекты обмениваются сообщениями.
    Классическое - это то как оно реализовано в Java.
    И там и там есть инкапсуляция и полиморфизм. Наследование это приятная фишка классического ООП. Так же как и все пляски с типами. Вообще строгая типизация не является частью ООП. По крайней мере не является частью аутентичного ООП.

    Поэтому переход на typescript позволит только более точно воспроизводить классическое ООП. Ну и проверку типов добавит. Это само по себе полезно, но для ООП никакого значения не имеет.

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

    Заметьте, про js я почти ничего не сказал. Потому что дело не в нём. Дело только в понимании ООП. У языков программирования, конечно, есть различные возможности и ограничения что которые позволяют использовать ту или иную парадигму. Но ООП на js можно было делать и до es6, просто потому что в js можно инкапсулировать код в объект.

    И ещё, когда мы начинаем делить код на объекты, необходим механизм разделения кода на файлы и собирания его обратно. Т.е. нужна модульность. Лучше всего, конечно, использовать webpack, но вроде как в js есть и другие системы. Не сборки, а именно подключения модулей.
    Ответ написан
    1 комментарий
  • Как контролировать работу скриптов-воркеров? Что лучше Crontab?

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

    Т.е. ваши сервисы не должны запускаться по крону, а должны постоянно работать.
    Ответ написан
    Комментировать
  • Как убрать из js файла, всё не нужное?

    @MadridianFox
    Web-программист, многостаночник
    Вообще некоторые сборщики js кода, такие как webpack и rollup умеют делать tree shaking, т.е. по цепочке импортов и вызовов понимают какой код используется, а какой можно в итоговый бандл не собирать.

    Вот вам в эту сторону копать надо.
    Ответ написан
    Комментировать
  • Прога мониторинга ресурсов linux из windows типа Диспетчера задач?

    @MadridianFox
    Web-программист, многостаночник
    ssh + htop
    а вообще мониторинг серверов это очень обширная тема
    Ответ написан
    Комментировать
  • Является ли данный код защищенным от SQL инъекций?

    @MadridianFox
    Web-программист, многостаночник
    От инъекции как таковой код защищён. По крайней мере в лоб передать кусок запроса уже не получится.
    Однако надо проверять что пользователь передаёт название существующего поля, чтобы код не падал.
    А ещё надо следить чтобы сервер автоматически не превращал параметры запроса в переменные, чтобы пользователь, случайно или умышленно, не затёр вам $fields собственным массивом.
    Хотя мне кажется это первое чему учат, когда говорят про безопасность в PHP)
    Ответ написан
    3 комментария
  • Возможно ли в PhpStorm открыть файл по ftp без синхронизации?

    @MadridianFox
    Web-программист, многостаночник
    Без создания проекта нельзя.
    Но создав проект, можно настроить deployment, не важно чего в куда, главное что в окошке просмотра remote host вы сможете видеть файлы на сервере.
    Двойной клик по файлу откроет его для редактирования.
    Это будет неудобно т.к. файл на сервер будет отправляться не по Ctrl+S а по нажатию отдельной кнопки.

    Ну и вы теряете все функции IDE - никакого индексирования и умных подсказок. С таким же успехом можно (и даже может быть удобнее) пользоваться WinSCP.
    Ответ написан
    Комментировать
  • Можно ли учиться программированию по небольшим проектам людей(боты,чаты)?

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

    @MadridianFox
    Web-программист, многостаночник
    У вас запросы неправильные.
    Должно быть
    UPDATE golosa SET var1 = '$row[1]' where id = 1

    А вообще лучше изменить логику работы всего скрипта.
    Вы можете в форме знfчением радиокнопок делать не название картинки, а их id.
    Тогда можно будет выполнить запрос вида:
    UPDATE golosa SET var1 = var1 + 1 where id = ?
    и с помощью prepared statements подставить id картинки в запрос.
    Ответ написан
  • Как обратиться к this конструктора?

    @MadridianFox
    Web-программист, многостаночник
    function Constr() {
        let self= this; // <<<<<<<<<<<<
        this.onStart = function () {
            console.log('start');
        };
        this.func = function () {
            navigator.getUserMedia({audio: true}, function (stream) {
                self.onStart()  // <<<<<<<<<<<
                },
                function (error) {
    
                });
        }
    }
    Ответ написан
    2 комментария
  • Как работает интеллектуальное автодополнение кода?

    @MadridianFox
    Web-программист, многостаночник
    В автодополнении есть две крайности.
    Вариант один - просто разбиваем текст на слова, добавляем в список ключевые слова текущего языка и как-нибудь подсказываем то что начал набирать программист.
    Вариант два - выполняем честный анализ кода, прям как это делает компилятор/интерпретатор, и в зависимости от контекста в котором набирается слово подсказываем только возможные варинты. Ну например, если мы набираем определение класса, то после названия может быть либо extends либо implements. Если набрали extends то дальше однозначно будет название класса, причём не финального.

    Каждый редактор кода использует свой подход, причём совсем не обязательно что точно один из двух, может быть смесь в любых пропорциях.
    Ответ написан
    1 комментарий
  • Как подружить Windows 10 + Docker + PhpStorm + Xdebug?

    @MadridianFox
    Web-программист, многостаночник
    Я для себя определил универсальный подход для отладки в любом сетевом окружении.
    В простейшем случае, когда разработчик один, а сервер за NAT, надо на сервер прокинуть порт через ssh.
    ssh user@host -R 9000 localhost:9000
    При этом в php.ini xdebug надо настроить чтобы он коннектился на localhost:9000.

    Когда разработчиков много, я использую модифицированный dbgp прокси.
    https://github.com/MadridianFox/php-xdebug-proxy
    Если он стоит на том же сервере что и php, настройки xdebug те же. Прокси слушает 9000 порт. Каждый разработчик выбирает себе уникальный порт и прокидывает его по ssh на сервер. Так же надо обратно прокинуть 9001 порт чтобы зарегистрировать свой idekey в прокси.
    ssh user@host -R 9002 localhost:9002 -L 9001 localhost:9001

    И самое главное - при регистрации своего idekey через шторм в поле idekey надо написать myidekey:9002
    В этом же окне порт прокси - 9001, хост прокси - localhost.

    В настройках шторма указываем что для отладки надо слушать 9002 порт.

    В браузере, не важно, используете вы расширение или прописываете XDEBUG_SESSION_START, надо указать myidekey без порта!

    В случае с докером вы можете либо добавить ssh сервер в контейнер с самим php, либо поднять дополнительный ssh контейнер. При единоличной разработке этого достаточно. Просто в зависимости от размещения ssh прописываете разные хосты в xdebug. Прокидывает туда порт.

    Если разработчиков больше одного - выделяете контейнер с ssh + dbgp прокси и каждый разработчик прокидывает туда свой порт.
    Ответ написан
    Комментировать
  • Как избежать удаления добавленных с помощью jQuery классов при ajax обновлении?

    @MadridianFox
    Web-программист, многостаночник
    Запоминайте какие классы куда добавили и при обновлении расставляйте их заново.
    Ответ написан
  • Почему функция возвращает данные последней итерации?

    @MadridianFox
    Web-программист, многостаночник
    Вы создаёте замыкание, которое ссылается на переменную i. Ключевое слово "ссылается", т.е. функция обработчик не запоминает значение i на момент своего создания, а просто "знает", что где-то есть i. В момент выполнения любого обработчика i равно последнему индексу.
    Ответ написан
    Комментировать