• Как в SCSS проверить "светлость" или "тёмность" цвета?

    @Flying
    В Sass есть модуль для работы с цветом.

    В частности вам, вероятно, будут интересны функции blackness() и lightness(), но при этом важно помнить что blackness() поддерживается только в Dart Sass.
    Ответ написан
    Комментировать
  • Почему на одних сервисах просят сначала email, а потом пароль, а на других сразу оба?

    @Flying
    По-моему всё началось c Google, который действительно применяет разную логику в зависимости от того, какой email введён и поэтому ему важно разделять ввод email и пароля.

    Другие сервисы в основном просто тупо копируют без реальной необходимости, потому что "ну вот Google (или кто-то ещё большой) же так делает, значит так надо". Вплоть до того, что форма по факту одна, просто на JavaScript скрывают поле и показывают после первого submit'а.

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

    Кстати, дополнительно, подобный подход ещё и ломает ввод логина / пароля из менеджеров паролей.
    Ответ написан
    3 комментария
  • Как избежать PHP Notice: Undefined offset?

    @Flying
    Например так:
    if (($var[0] ?? null) !== null) {
      return $var[0];
    }
    Ответ написан
  • Как проверить mx при валидации email через аннотации?

    @Flying
    checkMX был объявлен deprecated в 4.2 и удалён в 5.0.

    Можно сделать свою реализацию, использовав в качестве основы код из 4.2, но при этом нужно будет учесть причины по которым этот код был убран (1, 2)
    Ответ написан
    Комментировать
  • Есть ли конвертер аннотаций в атрибуты?

    @Flying
    Посмотрите на Rector, он специально предназначен для подобных манипуляций. Есть отдельные пакеты с правилами для Symfony и Doctrine, но вероятно придётся дописать какие-то правила. Ну и статья в тему.

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

    Да, и Symfony 5.2 уже вышла из поддержки, нужно целиться в 5.4
    Ответ написан
    Комментировать
  • Как поддерживать сайт без админки?

    @Flying
    В целом это вполне решается установкой nginx перед всем этим хозяйством с тем чтобы там через location роутить запросы к разным частям сайта, которые становятся просто разными upstream'ами для него.

    Для начала всё настраиваете так, чтобы корректно работали ссылки в текущей конфигурации (статика + WordPress для блога). После этого ставите куда-то рядом WordPress (или что вы там решите использовать) и начинаете постепенно переделывать имеющиеся страницы, по ходу дела добавляя новые правила в конфиг nginx'а. Когда работа завершится - можно будет упростить получившийся конфиг и получить рабочее решение.

    Заодно получите возможность, к примеру, оптимизировать отдачу статики чтобы её отдавал сам nginx, не дёргая upstream'ы.
    Ответ написан
    Комментировать
  • Как сделать такую верстку?

    @Flying
    Ответ написан
    Комментировать
  • Один и тот же шрифт смотрится по разному на разных сайтах?

    @Flying
    На одном сайте шрифт грузится с Google Fonts:
    6145de3f57158972120434.png
    а на другом - с Tilda CDN, причём ещё и являясь какой-то модификацией шрифта:
    6145de68bd1c6012910166.png

    Таким образом это просто два разных шрифта несмотря на одно и то же имя. Почему Tilda так делает - сказать не могу, но можно попробовать у них уточнить.
    Ответ написан
    Комментировать
  • Почему в firefox возвращает json вместо страницы?

    @Flying
    Это происходит из-за неправильной организации работы с HTTP.

    Вы запрашиваете данные через XMLHttpRequest методом GET и по тому же url, что и сама страница. В результате получается, что у вас один и тот же HTTP метод и один и тот url отдают два разных ответа в зависимости от... непойми чего (видимо проверяется заголовок X-Requested-With), но это явно не то, что описано в спецификации HTTP.

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

    Убедиться в том, что это так, можно очень просто: достаточно открыть dev.tools и на вкладке Network включить опцию "Disable cache". После этого вы увидите что проблема исчезла.

    Правильным решением будет выделение API для XHR запросов фильтра в отдельный endpoint. Также логичнее будет использовать метод POST, а не GET.

    Если же не хочется переделывать - хотя бы добавьте к XHR запросам ещё один query параметр, например xhr=1 и убедитесь что он никогда не появляется в url страниц. Это сделает ваши url для страниц и XHR запросов разными и уберёт проблему.

    Также имеет смысл пересмотреть объём данных, передаваемых в ответ на каждый запрос, ведь вам нужны только значения, передавать постоянно почти 100кб текста описаний нет особого смысла, они у вас и так уже есть.
    Ответ написан
    4 комментария
  • Почему в Firefox вместо некоторых картинок цветные квадраты?

    @Flying
    Это может происходить, если в настройках включена рандомизация canvas для предотвращения fingerprinting'а.

    Зайдите в about:config и поищите настройку
    privacy.resistFingerprinting.randomDataOnCanvasExtract
    . Если она включена - попробуйте выключить и проверить ушла ли проблема. Если дело в ней - тогда решайте сами что для вас важнее - картинки или противодействие fingerprinting'у, в зависимости от этого выставляйте значение настройки.

    Есть и другие настройки в разделе privacy.resistFingerprinting, которые могут проявляться в виде эффектов, которые выглядят как проблемы браузера. К примеру настройки privacy.resistFingerprinting.reduceTimerPrecision проявляются в виде вот такой проблемы в редакторе WordPress.
    Ответ написан
    3 комментария
  • DEPRECATION WARNING: Using / for division is deprecated and will be removed in Dart Sass 2.0.0.?

    @Flying
    Поскольку вы используете выражение в значении CSS свойства - необходимо добавить интерполяцию значения:
    .example {
      margin: 0 #{math.div(54, $maxWidthContainer  * 100vw)} 0 0;
    }
    Ответ написан
  • Как сделать общий сервис во всех контроллерах?

    @Flying
    Простейший вариант - написать свой compiler pass, в нём выбрать сервисы (через findTaggedServiceIds) по тегу controller.service_arguments и дополнить определение сервисов либо вызовом вашего метода либо добавлением аргумента в конструктор, это можно делать по имени.

    Можно сделать ещё более общее решение: определить интерфейс, например SettingsAwareInterface примерно такого вида:
    namespace App\Contracts;
    
    interface SettingsAwareInterface
    {
        public function getSettings(): Setting;
    
        public function setSettings(Setting $settings): void;
    }

    затем в services.yaml добавить:
    _instanceof:
      App\Contracts\SettingsAwareInterface:
        tags:
          - {name: 'app.settings-aware'}

    и в compiler pass работать с тегом app.settings-aware, это позволит вам передавать данный сервис не только в контроллеры.
    Ответ написан
  • Где находятся .xpi файлы?

    @Flying
    Ответ зависит от того, какие именно XPI имеются в виду
    1. Если речь о расширениях браузера - то в каталоге extensions профиля
    2. Если речь о модулях самого браузера - то в каталогах features самого браузера и профиля
    Ответ написан
    Комментировать
  • Почему мобильный firefox увеличивает шрифт?

    @Flying
    Не знаю где вы там увидели разницу...

    Вот скриншоты из Browserstack, взял первый попавшийся девайс (Samsung Galaxy S21), открыл сайт в Chrome (слева) и Firefox (справа), сделал скриншоты, специально выровнял по вертикали чтобы проще было сравнивать.

    60ef36f8b3125511944492.jpeg

    Самое заметное - фон немного отличается, с чем это связано - не знаю, но шрифты точно одинакового размера.

    Может у вас в Settings -> Accessibility выключен Automatic font size и выставлено значение, отличное от 100% ? Тогда да, размер будет отличаться, но вы ведь сами его выставили в этом случае.
    Ответ написан
  • Как firefox devtools скопировать неактивное правило с коментарием?

    @Flying
    В Firefox для этого есть вкладка Changes где формируется CSS стиль, содержащий все изменения, сделанные через dev.tools. Оттуда можно скопировать хоть индивидуальные изменения, хоть всё сразу.
    Ответ написан
  • Цветные иконки в icomoon.io?

    @Flying
    Всё зависит от того, как именно вы выгружаете иконки из icomoon.

    60c0867f7284f202052220.png

    Как видите - поддерживаются две опции: набор SVG и / или PNG иконок или иконочный шрифт. Очевидно вы выбрали вариант шрифта и в этом случае, естественно, получили одноцветные изображения. Дело в том, что хотя цветные шрифты существуют (сaniuse, пример), но на практике используются крайне редко, icomoon просто не поддерживает такой формат, поскольку выгружает результат в стандартные шрифтовые форматы, а они все бесцветные.

    Кроме того, есть целый ряд аргументов против использования иконочных шрифтов как таковых (раз, два для примера), поскольку по сути это костыль для проблемы, которая уже не актуальна в современном вебе.

    Поэтому вам стоит задуматься о том, чтобы перейти на использование SVG иконок вместо иконочного шрифта. Вы от этого только выиграете.
    Ответ написан
    Комментировать
  • Можно ли как-то теговать сервисы через implements interface?

    @Flying
    Да, можно начиная с версии 3.3, примеры есть в документации. В вашем случае это будет:

    # app/config/services.yml
    services:
        _instanceof:
            MyNamespace\Service\MyInterfaceForTagging:
                tags: ['app.my_tag']


    Также, начиная с версии 5.3, которая выйдет на днях, можно будет использовать для этой же цели атрибуты из PHP8, статья в блоге по этому поводу.
    Ответ написан
    2 комментария
  • Как импортировать большой JSON (18гб) в MySQL?

    @Flying
    Вам не нужно загружать файл в память, для этого существует потоковая обработка:

    <?php
    $fp = fopen('big-file.json', 'r');
    if (!is_resource($fp)) {
        throw new \RuntimeException('Failed to open file for reading');
    }
    while (!feof($fp)) {
        $line = fgets($fp, 32768);  // Укажите лимит на одну запись
        if (empty($line)) {
            // Пропускаем пустые строки
            continue;
        }
        $data = json_decode($line, true, 512, JSON_THROW_ON_ERROR);
        // ... записываем в базу
    }
    fclose($fp);
    Ответ написан
    4 комментария
  • Как исправить отображения шрифтов на сайтах, Firefox?

    @Flying
    Видно, что у вас для латиницы используется какой-то нестандартный шрифт.

    Первое подозрение падает на вмешательство в страницы сайтов каким-то расширением. Для того чтобы проверить это - зайдите в about:profiles и перезапустите браузер без расширений. Если это поможет - ищите расширение, ответственное за это, отключая их по одному в about:addons.

    Если это не поможет - попробуйте там же, в about:profiles создать новый профиль и перезапустить браузер с ним. Если это поможет - в основном профиле идите в about:config и смотрите настройки шрифтов, обращая внимание на нестандартные значения, они выделены bold'ом.

    Если и это не поможет - то, очевидно, что-то не так с конфигурацией шрифтов а вашей операционной системе, но скорее всего какой-то из предыдущих пунктов должен помочь.
    Ответ написан
    Комментировать
  • Стоит ли использовать ACL в Symfony?

    @Flying
    Ответ на ваш вопрос есть в документации к ACL bundle:

    Using ACL's isn't trivial, and for simpler use cases, it may be overkill. If your permission logic could be described by just writing some code (e.g. to check if a Blog is owned by the current User), then consider using Symfony built-in security voters.

    Поэтому если вашему приложению необходима гибкая и настраиваемая извне (к примеру через админку) система разделения прав - то в использовании ACL нет ничего плохого. Просто в большинстве случаев достаточно более простой логики разделения доступа, а это как раз и решается через security voters.

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

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

    Поэтому ответ на вопрос "стоит ли использовать ACL" очевиден: "стоит, если вам в проекте нужен именно ACL".

    На производительности будет сказываться, насколько сильно - опять же зависит от вашего проекта, если там просто CRUD - то возможно влияние будет заметным, но если у вас там не highload - то вероятно это не будет критичным.
    Ответ написан