Задать вопрос
  • Что такое монадическая обработка ошибок?

    @Vitsliputsli
    Что такое монадическая обработка ошибок? И почему это круто?

    Очевидно использование монад для обработки ошибок. "Монада – это просто моноид в категории эндофункторов. Функтор – это гомоморфизм между категориями. А эндофунктор – это просто функтор, отображающий категорию на саму себя. "
    По-моему уже этого достаточно, чтобы ответить на 2ой вопрос.

    Объясните для человека не знакомого с функциональным программированием, в чем плюс отсутствия try-catch-finally.

    Монада - это попытка обойти ограничения функционального программирования, выполнять последовательные операции, т.е. делать то, что делается при императивном подходе из коробки. Т.е. монада специфична для функционального, а try-catch-finally для императивного, и последний в первый никак не запихнуть, поэтому - монада.
    Нет принципиальной разницы в этих методах обработки ошибок, ошибки идут отдельным потоком, разница лишь когда будет вызван обработчик.
    Насколько я знаю, для монад есть еще один аргумент - это убирание обработки ошибок "под капот", т.е. мы видим решение только тест-кейса основной бизнес-логики, а тест-кейсы ошибок скрыты. Если говорить про ООП, там это не проблема, при подобном структурировании обработчик ошибок будет именно там, где и должен быть, к примеру, если мы говорим о "File not found", то в классе отвечающем за инфраструктуру и в бизнес-логике мы его не увидим. Кроме того, мы можем задать общий обработчик, а не писать всюду try catch. Что касается процедурного подхода, то наверное абсолютно все спрятать не получится, но если мы в 22 году пишем процедурно, у нас приоритет не структуризация, а производительность и здесь уже другие критерии.
    Ответ написан
    8 комментариев
  • Как с помощью функции array_slice удалить значение из массива?

    @Vitsliputsli
    array_slice ничего не удаляет, он дает срез массива, поэтому такая формулировка не очень корректна. Исходя из этого, вы не сможете удалить элементы внутри существующего массива, и единственный вариант - это создание нового массива с выбранными значениям.
    $numbers = [
        '123',
        '124',
        '125',
        '111',
        '222',
        '566',
        '777',
    ];
    
    $cleanNumbers = [];
    foreach ($numbers as $key=>$number) {
        // не нужно делать универсальным поиск нужных значений, т.к. он слишком специфичен, поэтому так:
        if ($number[0]===$number[1] && $number[1]===$number[2]) {
            // здесь проще было бы написать $cleanNumbers[] = $number;
            $cleanNumbers[] = array_slice($numbers, $key, 1); 
            // а если нужно все таки удаление, то достаточно unset($numbers[$i]) с противоположным условием
        }
    }
    var_dump($cleanNumbers);

    В итоге, на кой здесь array_slice - мне совершенно не понятно.
    Ответ написан
  • Как запретить запуск скрипта по крону больше 1 раза?

    @Vitsliputsli
    Используйте mutex. Он либо есть в вашем фремворке, либо сделайте сами. Варианты: файловый - реализуется с помощью flock (это такая команда в php, а не внешняя утилита как в другом ответе), в БД - если файловый делать нельзя, например, при нескольких инстансах приложения.
    Ответ написан
    Комментировать
  • Как закрыть задачу в Jira, не решая её?

    @Vitsliputsli
    Подскажите, как можно закрыть задачу не решая её?

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

    @Vitsliputsli
    Начните с изучения уязвимостей (OWASP и т.п.). Если плохо понимаете технологии, которые используются в этих уязвимостях, то надо будет эти знания углубить. Безусловно нужно знание сетей, но я не согласен с утверждениями про "прекрасный программист, сетевой инженер, админ и психолог в одном лице", просто потому что человеку проблематично все это уместить в себе. К тому же, к примеру, вам не нужно уметь писать правильный красивый код, но нужно знать как его отдельные элементы можно использовать "не по назначению". Для начала изучите протокол http, Postman и прокси для браузера отлавливащего и модернизирующего запросы.
    Мне нравятся курсы от Avatao, там хорошие практические задания. Хвалят книгу "web hacking 101", хотя сам я ее так и не прочел.
    Безусловно английский, информации по теме на русском практически нет.
    И изучите вопрос, где собираетесь работать, я не так много видел компаний, которые заинтересованы в таких специалистах.
    Ответ написан
    1 комментарий
  • Почему сокет клиент зависает при разрыве соединения?

    @Vitsliputsli
    Как отлавливать разрывы сети на стороне клиента в PHP и просто пропускать выполнения функции socket_read?

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

    @Vitsliputsli
    Разумеется такие специалисты есть, не думаю, что сложно будет найти такие предложения. Есть 2 варианта - нанять менеджера (какой-нибудь кризис-менеджер работает около года, выстраивает процессы, затем уходит, т.к. стоимость его очень высока), и есть консультанты с различной стоимостью. 1 вариант лучше, т.к. в отличии от консультанта такой менеджер несет ответственность за то, что делает, т.к. он внутри. Консультант, даже дорогой, может сказать, что команда просто не точно, не полно выполняла его рекомендации (а это всегда можно сказать, к тому же команда может оказаться в ситуации, когда ей придется выбирать между положить силы на сомнительные рекомендации консультанта или выполнить план, при этом за провал плана команда по-прежнему несет ответственность). Я не видел хороших консультантов, даже дорогой консультант может начать все выстраивать по стандартным нормам, которым его обучали, на практике же, как вы правильно указали нужно выявлять слабые места и чинить их, а это сложнее, требует глубокого погружения и потому занимает гораздо больше времени. И, в конце концов, если полное болото, то всегда можно нанять обычного менеджера с опытом выстраивания процессов, но при этом и технический руководитель должен знать и уметь внедрять инновации, без этого в разработке никак.
    Ответ написан
    Комментировать
  • Mysql Хранение в оперативной памяти?

    @Vitsliputsli
    Как настроить базу данных чтобы все данные сначала хранились на Оперативной памяти но при этом сразу записывались на hdd. Естественно если будет перезагрузка все потерятся. И поэтому нужно чтобы на лету записывало на hdd но отдавало при этом с оперативки. Как настроить?

    Зачем? Если вам нужно, чтобы СУБД работала быстро, то для этого их и создают, там и так все есть. Зачем придумывать архитектуру СУБД, если это уже сделано? Тем более, не зная ничего о том, как они работают.
    Не питайте иллюзий, что вы сейчас придумаете лучшую архитектуру, чем та, над которой работают десятилетия профессионалы. К тому же, примерно как вы описали, так и работает MariaDB.
    Не "подкручивайте" настройки, дефолтных настроек вполне достаточно, что-то меняя можно "убить" СУБД. В настройки надо лезть тогда, когда есть конкретная проблема, и понимаешь, не только то, какая настройка может на это повлиять, но и то, какие другие аффекты это вызовет.
    Ответ написан
  • Проектирование БД, какую СУБД выбрать?

    @Vitsliputsli
    Вполне нормальная структура. Нагрузка низкая. СУБД та, которую лучше знаете (это актуально и для высоких нагрузок, тот же MySQL прекрасно себя показывает на высоких нагрузках, если вы его используете как базу данных, и не требуете приготовления кофе). Схемы здесь задействовать ни к чему. ClickHouse - это вообще про другое, забудьте до тех пор, пока не понадобится аналитика по большим объемам данных. Главное, не забудьте построить индексы по тем полям, по которым будете формировать выборки.
    Ответ написан
    Комментировать
  • Список технологий необходимых для backend php developer?

    @Vitsliputsli
    Технологий слишком много, и у разных компаний может быть совсем разный стек. Кто пишет сайты - обязательно фреймворки, а где-то их не будет. Где-то будут требовать знание Vertica или Clickhouse, а много где вообще ни разу не услышите этих слов. Кто-то захочет еще и знание Go, а где-то очень желателен будет React и пофиг что это не backend.
    Но есть и общие моменты, очевидно знание git, PSR, composer, xdebug, для мидла должны быть не "навыки ООП", а отличное знание и понимание (в том числе SOLID, GRASP), оценка сложности алгоритмов, sql с пониманием работы индексов (разумеется нормализация, транзакционность, уровни изолированности, ACID), знание того же самого PHP (начиная с того, где и когда применяем Exception заканчивая SPL, Reflection, даже если никогда к ним не обращались, нужно знать, что они есть, когда возникнет необходимость), способы защиты от уязвимостей, сложности параллелизма (та же самя "гонка"), типы данных и что они из себя представляют (начиная с банального почему деньги не храним в float и т.п.). К примеру, вы можете не использовать ORM, но должны знать какие они бывают и доказать почему собственно вы их не использовали в конкретной задаче. Тоже самое trait, clojure и т.д. И много еще чего. Вплоть до провакационых вопросов "есть ли в php перегрузка?".
    Это часть базисных вещей, на которые накладывается специфика работы со своими технологиями.
    Ответ написан
    Комментировать
  • Uncaught mysqli_sql_exception: Ошибка в запросе мускуля, что делать?

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

    @Vitsliputsli
    Установите режим autocommit, и не парьтесь.
    Когда изучите транзакции, тогда вернётесь к этому вопросу.
    Ответ написан
    Комментировать
  • На собеседовании сказали, что не все функции - замыкания. Так ли это?

    @Vitsliputsli
    Абсолютно понимаю автора, он цитирует определение замыкания, а ему в ответ - определения не нужны, они лишь путают. Он спрашивает, а как тогда? Ему кто про мусорщик, кто про стек, и у него создается ощущение, что сами не могут договориться. Но кроме этого, автор прав, его функция - замыкание.
    Замыкания везде работают одинаково. Если функция содержит ссылки на переменные объявленные вне тела этой функции, и которые не являются ее параметрами - это и есть замыкание. Что значит фраза - все функции в javascript - замыкания? Дело в том, что в других языках область видимости может просто не позволить обращаться к внешним переменным, в таких языках функция не будет замыканием, но может быть возможность превратить функцию в замыкание через специальный синтаксис. В javascript таких манипуляций не нужно, поэтому в нем любая функция - замыкание.
    Т.е. замыкание это возможность в функции создать ссылки на внешние переменные. А здесь уже как следствие, работа мусорщика, если есть рабочая ссылка, то объект не уничтожается, а в приведенных примерах с 2 функциями она рабочая, так как можно получить доступ из корневого объекта, что удовлетворяет требованиям алгоритма mark-and-sweap. Но это следствие, а не принцип работы замыкания.
    Поэтому автор абсолютно прав - его функция это замыкание. Потому что ни в одном определении замыкания нет никаких упоминаний о мусорщике, а значит разницы нет на какие внешние данные ссылаться.
    Другое дело, все хотят видеть не замыкание, а его хитрое использование, а именно сохранение ссылки объявленной в замыкании при уничтожении ссылки во внешней функции. Не надо считать собеседующего бездарем, если бы вы ему объяснили свою точку зрения, он вполне мог бы и согласиться, хотя и не факт, многие собеседования проходят в виде допроса, что говорит о неадекватности или о слабой квалификации собеседующего, в такие конторы не стоит идти.
    Ответ написан
    1 комментарий
  • PostgrSQL - Какой тип данных лучше использовать для статусов, типы объекта и т.д?

    @Vitsliputsli
    В чем разница между этих типов? Какие плюсы и минусы есть?

    По факту у вас enum, и тогда вопрос как его хранить, как enum или как число, будет звучать: где реализовывать enum в коде или в БД. Реализация в коде позволит валидировать этот enum на уровне приложения без дополнительных запросов к БД, в противном случае все это ложится на СУБД. В остальном разницы нет.
    Т.к. БД всегда узкое место, то я бы реализовал это в коде, но есть адепты считающие, что все нужно пихать в БД.
    Ответ написан
    Комментировать
  • Выполнение команды Jenkins от имени пользователя?

    @Vitsliputsli
    Причем здесь Jenkins? Пользователями ОС управляет ОС. Для выполнения команд от имени другого пользователя в GNU Linux можно использовать sudo, либо пользователи должны быть в одной группе и у директории права на запись группой.
    Другое дело, а зачем Jenkins что-то копировать в директории других пользователей? Что за файлы он подкладывает Васе?
    Ответ написан
    Комментировать
  • В чем ошибка применения функции sleep()?

    @Vitsliputsli
    Вы получаете ошибку, потому как nginx не дождался ответа от php, который ожидает ответ от mysql, который лопатит ваш не хилый запрос на получение.
    Разбивайте на части, управляйте этим в коде. Как уже указано, запускайте php не через nginx, а в cli. Записывайте не построчно, а тоже блоками. 150 000 это много, попробуйте блоки по 1000, а может и меньше.
    Откуда взялся sleep? Если это троттлинг, то 30 секунд как то очень много.
    Ответ написан
  • Как ускорить работу Apache + FastCGI?

    @Vitsliputsli
    Я бы на вашем месте посмотрел бы на MySQL, потому как перегружен именно он, отсюда и тормоза.
    Ответ написан
  • Дописать в файл json и прочесть его php?

    @Vitsliputsli
    Результат выводит если запись ф файле одна, если две то выводит null

    Потому что
    {"Дата":"2022-02-02 17:40:12","День":"2022-02-02","Время":"17:40:12"}{"Дата":"2022-02-02 17:40:12","День":"2022-02-02","Время":"17:40:12"}
    это не валидный json. Валидный будет, например, такой:
    [{"Дата":"2022-02-02 17:40:12","День":"2022-02-02","Время":"17:40:12"},{"Дата":"2022-02-02 17:40:12","День":"2022-02-02","Время":"17:40:12"}]
    В любом случае, дозаписывать json неполучится. Либо обрабатывайте его полностью и полностью перезаписывайте файл. Либо храните в файле строками и читайте строками.
    Ответ написан
  • Для каких примерно целей программисту нужен computer science?

    @Vitsliputsli
    Computer science - все таки это наука, т.е. более область академических исследований, а не computer programming. Вики на это намекает так "Computer science is generally considered an area of academic research and distinct from computer programming".
    Дело не в том, что это какое-то знание, которое нужно или не нужно. Это иная сфера работы. Т.е. если ты формируешь и обучаешь модель для бизнеса с помощью CatBoost, ты занимаешься computer programming. А если ты пишешь сам CatBoost или вообще изобретаешь градиентный бустинг, то ты занимаешься computer science.
    Ответ написан
    Комментировать
  • Почему бекенд не пишут на С++?

    @Vitsliputsli
    про PHP молчу, мне все таки больше интересны крупные проекты по типу банковских систем и тд, где PHP разумеется места нет

    PHP очень быстрый язык, используется в совершенно разных областях начиная от управления станками на производстве заканчивая финтехом. Выбор С#, Java, PHP, Python зачастую состоит в "тимлиду больше нравится", так здесь язык не имеет большого значения.
    Почему не C++? Потому что долго и нет особого выигрыша в производительности. Так как отдельные модули требующие высокой скорости пишутся на Go или даже Си. А в остальном, дольше ждать ответы от базы и этих модулей, чем обрабатывать код Java или php.
    Ответ написан