• Ноутбуки с нормальными (не мобильными процессорами) существуют? Где купить в России? Как называются?

    @Flying
    Ноутбуки-то есть, просто цена у них может быть весьма негуманной...

    Например ThinkPad P15, в максимальной комплектации там Xeon W-10885M или i9-10980HK со 128Gb, и до 4Tb диска, но ценник у такой комплектации будет в районе 500к и везти его нужно будет из штатов т.е. ещё платить за растаможку.

    Но есть и более скромные варианты, особенно если брать вариант с максимальным процом, но минимальной памятью (она расширяется) и диском (тоже меняется + ставится второй) и без 4K экрана.

    Также можно смотреть на менее навороченную серию T, где тоже вполне есть и топовые i7 и Xeon и до 128Gb в некоторых моделях (или до 48Gb в младших).

    Тогда в целом можно и в 100-150к влезть, а потом досыпать памяти / дисков по вкусу.
    Ответ написан
  • Извлечь имя из текста на php возможно?

    @Flying
    Сильно зависит от реальной задачи, которая в вопросе не указана.

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

    Если же речь идёт о произвольном тексте - то здесь всё сильно интереснее. Ведь имён очень много, они могут иметь разные формы (полное / краткое имя), падежи (Саша, Саше, Сашу, Сашей и т.п.), могут быть написаны с ошибками, опечатками, неоднозначностями написания (Артем / Артём), транслитом и т.п.

    Здесь я бы рекомендовал в первую очередь обращаться к специализированным сервисам. Если речь идёт о русском языке - в голову первым делом приходит, конечно же, dadata.ru и их API по стандартизации имён. Да, это стоит каких-то денег, но работает очень хорошо, могу сказать по своему опыту.
    Ответ написан
  • Как устранить некорректное отображение шрифта в Firefox?

    @Flying
    Приведённая вами ссылка показывает причину проблемы и направление для её исправления.

    Дело в том, что Rubik является variable шрифтом.

    Подключение шрифта у вас выглядит вот так:
    https://fonts.googleapis.com/css2?family=Rubik&display=swap

    а в стилях используется font-weight: 600. Если вы посмотрите внутрь CSS, загружаемой для подключения шрифта, вы (естественно) увидите там подгрузку шрифта для font-weight: 400, ведь именно это значение соответствует Regular и используется по-умолчанию.

    Таким образом вы ненамеренно создаёте ситуацию, когда вы используете начертание шрифта, которого нет. Очевидно где-то в Firefox (явно в списке зависимостей этого issue) есть проблема рендера variable fonts, причём специфичная для Windows т.к. я проверил (через BrowserStack) на MacOS и там всё нормально.

    Исправление тоже очевидно - вам необходимо корректно подключать шрифты, указывая списки нужных вам начертаний. Для вашего примера это будет:
    https://fonts.googleapis.com/css2?family=Rubik:wght@600&display=swap

    результат сразу становится корректным:

    60644c49505c3379108506.png
    Ответ написан
  • Авторизация разными ключами?

    @Flying
    Security firewalls имеют возможность указания паттерна запроса для своего применения.

    Таким образом вам достаточно определить множество firewall'ов для разных url pattern'ов и для каждого из них настроить разные условия авторизации пользователя.

    Подробности есть в документации.
    Ответ написан
  • Трюк с тернарным оператором PHP?

    @Flying
    В целом то, что вам нужно скорее ближе к новой функциональности в PHP 8: throw expression. В этом случае ваш код мог бы выглядеть, к примеру, вот так:
    Auth::check() ?? throw new AuthenticationRequiredException("Вам необходимо сначала авторизоваться");

    Однако, если вы реально хотите именно такой конструкции как ваша - то здесь, конечно, тоже есть варианты, ведь начиная с PHP 7 нам доступен uniform function call syntax и, следовательно, возможны конструкции вида:
    Auth::check() ?? (function(){echo "Вам необходимо сначала авторизоваться";})();

    Конечно, я ни в коем случае не призываю делать именно так, это плохое решение, но технически возможное.

    Существенно лучшим вариантом в этом случае на самом деле будет просто создание отдельной функции, которая будет брать на себя реакцию на такие ситуации:
    function failure(string $error): void 
    {
      // Просто для того чтобы быть ближе к вашему примеру, 
      // в реальности здесь должна быть нормальная логика обработки, 
      // к примеру тот же throw new RuntimeExcepton($error);
      echo $error;  
    }

    в этом случае ваш пример сводится к:
    Auth::check() ?? failure("Вам необходимо сначала авторизоваться");

    Помимо этого обратите внимание на то, что использование null coalescing operator ?? подразумевает, что тип возвращаемого значения функции Auth::check() - это mixed|null что выглядит странно, поскольку от результата проверки ожидается тип boolean.

    В реальности здесь лучше подходит сокращённая версия тернарного оператора, т.н. elvis operator. В этом случае ваш код может выглядеть вот так:
    class Auth {
        public static function check(): bool 
        {
            return false;
        }
    }
    
    function failure(string $error): void 
    {
        // В реальности, как указано выше, лучше использовать 
        // throw new RuntimeException($error);   
        // echo используется для примера
        echo $error;
    }
    
    Auth::check() ?: failure('Вам необходимо сначала авторизоваться');

    Проверить можно здесь.
    Ответ написан
  • Почему развалился сайт после обновления хрома до 89 версии?

    @Flying
    В общем, поигравшись немного с предоставленным кодом, стало понятно следующее:

    Это явно проблема браузера, так что имеет смысл сообщить о ней разработчикам, написав bug report в их трекер.

    При этом проблема несколько не в том месте где ожидалось: элементы страницы позиционируются правильно, а вот отрисовываются некорректно:

    60521d719ba8e466217077.png

    Здесь видно, что картинка с точки зрения браузера находится в одном месте, а по факту нарисована в другом.

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

    Я подготовил пример, демонстрирующий вариант решения. По сути он сводится к добавлению стиля, который производит визуально почти незаметное изменение стилей, которое, однако, заставляет браузер перерисовать всю область:
    .chat-item__content.force-repaint .content-chat-content__message {
        opacity: 0.99;
    }

    Остаётся только "дёрнуть" CSS класс force-repaint на элементе контейнера - и всё сразу встаёт на место, поскольку осуществляется перерисовка. Например вот так:

    function forceRepaintToFixChrome89Issue() {
        if (!navigator.appVersion.match(/\sChrome\/(89|9\d)\./)) {
            // Apply only for Chrome 89 and 90+
            return;
        }
        window.requestAnimationFrame(function () {
            const e = document.querySelector('.chat-item__content');
            if (!e) {
                return;
            }
            const fr = 'force-repaint';
            e.classList.add(fr);
            window.requestAnimationFrame(function () {
                e.classList.remove(fr);
            });
        });
    }


    В примере я добавил для этого кнопку, но в реальном приложении логично делать это, например, при изменении содержимого контейнера.
    Ответ написан
  • Есть ли у Postman адекватные альтернативы написанные НЕ на electron?

    @Flying
    Не полноценно, конечно, но в какой-то степени в качестве замены можно рассматривать HTTP Client в IDE от JetBrains, к примеру в PHPStorm.
    Ответ написан
  • Почему на сайте английский буквы и цифры толще чем русские?

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

    Таким образом вам необходимо проверить какие символы вы грузите в шрифте. Обычно это следствие необдуманного subsetting'а.
    Ответ написан
  • Какую библиотеку или методику лучше использовать для работы с ценами в интернет-магазине?

    @Flying
    Для работы с денежными значениями есть минимум две библиотеки:
    1. moneyphp/money
    2. brick/money

    Первая более популярная, её используют многие библиотеки. Но в последние полгода разработка встала, так что в своём проекте я решил использовать вторую из них, работает хорошо.

    Если смотреть на зависимые от них пакеты - можно найти ещё много всего интересного по этой теме.
    Ответ написан
  • Комбинированные oneToMany связи User->RelationCollection[ApiTokenCollection, ResetPassCollection]?

    @Flying
    Если я правильно понимаю ваш вопрос, то вы можете сделать AbstractToken базовой entity для inheritance mapping, а остальные виды токенов наследовать от него, попутно определяя их в @DiscriminatorMap.

    Тогда, если вам где-то будет необходимо получать список только определённого вида токенов - достаточно будет в опредении, к примеру, @OneToMany, указать в targetEntity нужный вам класс entity, а если нужны будут все токены - то можно будет указывать AbstractToken
    Ответ написан
  • Как в Doctrine из Entity получить все записи?

    @Flying
    У вас некорректные mapping'и.

    У меня не очень хорошо получилось понять что вы хотели изобразить здесь... Из ваших классов следует, что интервью может быть многих типов одновременно, а не наоборот?

    Но, вне зависимости от того как это должно быть - у вас по факту всё равно должна быть связь 1:N, а не 1:1, именно здесь основная ошибка.

    Смените тип ассоциации, тогда со стороны OneToMany у вас будет коллекция entities, откуда вы их сможете получить.

    Aside note: почитайте на досуге PSR-1, PSR-2, PSR-12
    Ответ написан
  • Не удается обновить плагин в composer.json?

    @Flying
    Там ведь прямо написано: у вас установлен Composer 2, а в composer.lock находится symfony/flex версии 1.4.6, работающий только с Composer 1.x.

    Либо откатывайте Composer на 1.x (чего лучше не делать без веских причин) либо обновляйте symfony/flex на совместимую версию, 1.8 или выше.

    Судя по всему этот процесс у вас идёт где-то в CI pipeline или чём-то похожем. Поэтому локальная уствновка пакета не поможет, важно чтобы нужная версия была в composer.lock.
    Ответ написан
  • Как не повторять один и тот же код в Symfony?

    @Flying
    Вынесите весь нужный код в отдельный класс и подключайте его в качестве зависимости либо к самим контроллерам в конструкторе либо прямо к нужным методам.
    Ответ написан
  • Как ограничить очередь на выполнение только 200 задач в час?

    @Flying
    В целом Максим дело говорит, но ситуации бывают разными, поэтому есть вероятность что вам действительно нужно уметь влезать в эти лимиты.

    На самом деле, поскольку вы используете Messenger - то вы уже весьма близки к цели, поскольку Messenger перезапускает обработку сообщения в случае неполной обработки. Просто настройте retry_strategy под свои нужды и оно будет работать. Надо только мониторить failed messages.

    Также, если вы можете позволить себе использовать Symfony 5.2 - то в этой версии появился отдельный компонент RateLimiter, который специально предназначен для решения именно таких задач. Сделайте Messenger middleware для того чтобы помечать сообщения на отправку только если это разрешает RateLimiter, а для остальных бросайте RecoverableMessageHandlingException чтобы отменить обработку. Но, опять же, не забудьте про настройки retry strategy чтобы это не приводило к потерянным сообщениям.
    Ответ написан
  • Валидация ValueObject поля?

    @Flying
    Если, судя по тегам, речь идёт от Symfony - то зачем вам вообще базовый абстрактный класс для ValueObject, которые по-идее должны представлять значения, а не логику их валидации. Для валидации в Symfony, как вы наверняка знаете, есть соответствующий компонент, поэтому вам достаточно просто описать правила валидации через соответствующие аннотации.

    Для первой валидации стоит использовать LessThan с датой. Для второй придётся писать свой валидатор, но там нет ничего сложного.

    Если данные приходят в запросе - то можно воспользоваться подходом, который предложил BoShurik в своём ответе на похожий вопрос (смотрите комментарии, там больше информации и примеры), в этом случае до контроллера у вас гарантированно будет долетать только заполненный и валидный объект.
    Ответ написан
  • Файловая структура БЭМ замедляет css?

    @Flying
    Никто не использует исходную структуру файлов напрямую.

    Посмотрите на любые сборщики frontend assets, в первую очередь на webpack. Их задача - взять все исходные файлы и сформировать asset bundles, оптимальные для загрузки на реальный сайт.

    Т.е. другими словами - у вас в исходниках может быть любая структура, которая позволяет вам писать поддерживаемый код, а дальше в действие должны вступать механизмы, которые из неё готовят реально используемые данные.
    Ответ написан
  • Можно ли и нужно ли и нужно ли выносить Symfony форму в сервис или её лучше оставить в контреллере?

    @Flying
    1. В Symfony best practicies рекомендуют, да
    2. Собственно см.п.1. В частности это улучшает поддерживаемость кода, особенно в случае более-менее сложных форм или форм, требующих дополнительной логики инициализации / конфигурирования. Собственно ваш код как раз и использует форму как сервис, попробуйте скопировать содержимое класса CandidateType сюда и сравнить полученный код.
    3. Код обработки формы скорее всего выносить в сервис не стоит т.к. он прямо завязан на преобразование Request => Response, а для этого контроллеры и существуют.
    Ответ написан
  • График работы персонала, как записывать в базу (mysql)? какую структуру создать?

    @Flying
    Ответ kisaa в первом приближении даёт общую картину того как может выглядеть структура базы данных.

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

    Также, если всё это будет ещё и учитываться при расчёте заработной платы - нужно учесть ещё целый ряд параметров:
    1. Реально отработанное время, если оно влияет на расчёт зарплаты
    2. Переработки, возможно с указанием оплачиваемая / нет и мультипликатора
    3. Уважительная / неуважительная причина (вычитается из зарплаты или нет)

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

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