Задать вопрос
  • Как кастомизировать вывод top или подобной утилиты Linux?

    ky0
    @ky0
    Миллиардер, филантроп, патологический лгун
    Берёте список процессов (например, ps auxww), грепаете его и оставляете только нужные вам поля.
    Ответ написан
    5 комментариев
  • Как останавливать зависящие контейнеры от контейнера базы данных, если бд остановится/крашнится?

    chupasaurus
    @chupasaurus
    Сею рефлекторное, злое, временное
    Поле depends_on определяет только последовательность запуска и удаления сервисов, к остановке отношения не имеет.
    Искомое вами поведение задаётся через healthcheck проверки доступности базы в backend и бэкенда во frontend... или простой docker compose -f путь/до/docker-compose.yaml stop, т.е. просто остановить все сервисы.
    Ответ написан
    Комментировать
  • Как использовать переменную в названии свойства объекта?

    alexey-m-ukolov
    @alexey-m-ukolov Куратор тега JavaScript
    projectPath[projectName].url

    Изучите основы языка: https://learn.javascript.ru/object#kvadratnye-skobki
    Ответ написан
    Комментировать
  • Филтрация по свойству выводит не все товары?

    @kiranananda Автор вопроса
    Вообщем битрикс, что могу сказать, потыкал тычки активности и вывелся )
    Ответ написан
    4 комментария
  • Почему не сохраняются изменения при переборе цикла через foreach?

    delphinpro
    @delphinpro Куратор тега PHP
    frontend developer
    function arraySquaring($arr)
    {
    -   foreach ($arr as $value) {
    +   foreach ($arr as &$value) {
            if (is_array($value)) {
                $value = arraySquaring($value);
            } else {
                $value **= 2;
            }
        }
        return $arr;
    }

    или так
    function arraySquaring($arr)
    {
    -   foreach ($arr as $value) {
    +   foreach ($arr as $key => $value) {
            if (is_array($value)) {
    -           $value = arraySquaring($value);
    +           $arr[$key] = arraySquaring($value);
            } else {
    -           $value **= 2;
    +           $arr[$key] **= 2;
            }
        }
        return $arr;
    }


    Еще вариант
    function arraySquaring($arr)
    {
        return array_map(function($item){
            return is_array($item) ? arraySquaring($item) : $item ** 2;
        }, $arr);
    }

    function arraySquaring($arr)
    {
        return array_map(fn($item) => is_array($item) ? arraySquaring($item) : $item ** 2, $arr);
    }
    Ответ написан
    2 комментария
  • Получил список литературы, в каком порядке осваивать?

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

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    const result = data.reduce(
      (acc, cur) => ((acc[cur.country] ??= []).push(cur.city), acc),
      {},
    );
    Ответ написан
    1 комментарий
  • Как написать сообщение коммита согласно спецификации?

    @maksam07
    Если пишешь в консоли, то просто убираешь последнюю кавычку и нажимаешь энтер - будешь писать дальше с новой строки до того, пока не поставишь кавычку снова перед очередным нажатием на энтер
    Ответ написан
    Комментировать
  • Тормоза браузера из-за стилей, решение?

    sfi0zy
    @sfi0zy Куратор тега CSS
    Creative frontend developer
    Для начала для нас важно осознать, что у разных фильтров разная вычислительная сложность. Они не все "плохие". Алгоритмы для brightness, grayscale, hue-rotate и других манипуляций с цветом выполняются за O(1) для каждого пикселя. Т.е. нагрузка на железо растет линейно в зависимости от площади элемента на экране. Это не так страшно. А вот фильтры размытия, blur или drop-shadow, имеют сложность где-то в районе O(R^2). Там есть разные варианты оптимизаций, но в среднем мы говорим именно о квадратичной зависимости от радиуса размытия. И это для каждого пикселя. Именно отсюда мы имеем сильные тормоза при попытке что-то большое размыть на пол экрана. Дохлые видеокарты телефонов и ноутбуков не вывозят. Браузеры не умеют такие вещи переиспользовать, так что это переразмытие происходит снова и снова, и мы имеем что имеем.

    При этом фильтры в CSS, в SVG - это все грубо говоря высокоуровневые обертки над одними и теми же универсальными алгоритмами рендеринга. Мы можем в рамках WebGL написать свои шейдеры, которые будут делать то же самое. Обертки разные, но алгоритмы одинаковые. Поэтому замена одной технологии на другую ничего особо не даст в плане производительности. В вопросах оптимизаций нам нужно не по-тупому менять инструменты-обертки, а смотреть в конечные алгоритмы, которые будут задействованы на странице в реальном времени, и по возможности рассчитывать все заранее и переиспользовать.

    В контексте верстки тут есть полтора варианта, что можно сделать. Можно рассчитывать такие вычислительно-сложные штуки еще при разработке и загружать в страницу сразу в виде картинок или видео. Это не идеальный вариант, пропорции получаются фиксированные, но иногда подходит. Есть вариант рассчитывать такие штуки в фоне на WebGL. Т.е. мы грузим интерфейс, смотрим какого там все размера получается, и один раз в фоновом режиме генерируем картинки нужного размера и потом плавно показываем. Такой вариант частенько встречается в рекламно-конкурсных проектах, когда за прелоадером в начале скрывается в том числе и такая генеративная история. Тут мы получаем гибкость в плане размеров и хорошую производительность сайта в целом, потому что все операции проходят только один раз, а дальше у нас все переиспользуется в виде обычных картинок. Каких-то принципиально других вариантов у нас пока нет. Только дизайн менять.
    Ответ написан
    3 комментария
  • При парсинге сайта - требуется загрузить js, css?

    alexey-m-ukolov
    @alexey-m-ukolov Куратор тега PHP
    Использовать средства парсинга, которые умеют исполнять javascript: headless браузеры, Selenium и т.п.

    Хотя, в данном конкретном случае нужно просто быть внимательнее и отправлять POST-запрос, а не GET.
    Ответ написан
    1 комментарий
  • Почему в Go вакансиях требование знания PHP?

    sergey-gornostaev
    @sergey-gornostaev
    Седой и строгий
    Или это просто такое количество кодовой базы на PHP накопилось, которую все дружно решили переписывать на Go

    Скорее всего.

    если да, то почему именно на Go?

    Если компания решилась вложиться в переписывание продукта на другом языке, то у неё на это точно очень веские причины, вероятнее всего - проблемы производительности. В этом случае Go - очевидный выбор. Python, Ruby и JS не дадут никакого выигрыша относительно PHP. Хоть на языках из мира jvm и .net можно писать высокопроизводительный софт, но они скорее решают проблемы сложности огромных кодовых баз. С++ и Rust очень сложны и для прикладного софта применяются только в крайнем случае. Всякая экзотика, типа Erlang, Elixir и Haskell - это вообще редкий случай в энтерпрайзе. Go же одновременно очень прост и ориентирован на высокую производительности.
    Ответ написан
    7 комментариев
  • Как создать свой sso?

    VoidVolker
    @VoidVolker
    Dark side eye. А у нас печеньки! А у вас?
    Лучше взять что-то готовое, по типу: раз, два. Если хочется реализовывать полностью своё, то вот тут подробная схема работы сервиса авторизации(CAS).
    Ответ написан
    Комментировать
  • Как правильно проверить, есть ли в массиве два одинаковых элемента подряд?

    Wispik
    @Wispik
    надо
    $i < count($arr) - 1
    потому что дальше в сравнении $i+1, отсюда и ошибка была (выход за пределы массива)
    Ответ написан
    Комментировать
  • Как правильно проверить, есть ли в массиве два одинаковых элемента подряд?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    И стоит сделать строгую проверку равенства, иначе возможны всякие приколы
    var_dump(check(['привет', true])); // bool(true)
    var_dump(check([true, 1])); // bool(true)
    var_dump(check([1, 'привет'])); // bool(false)
    Ответ написан
    Комментировать
  • Почему появляется Typed property must not be accessed before initialization?

    nokimaro
    @nokimaro
    Меня невозможно остановить, если я смогу начать.
    Используйте Constructor property promotion чтобы писать меньше букв)
    <?php
    
    class Product
    {
        public function __construct(
            public int $id,
            public ?int $parentId = null
        ) {
        }
    
        public function getParentId(): ?int
        {
            return $this->parentId;
        }
    
    }
    
    $obj = new Product(1);
    if (!empty($obj->getParentId())) {
        echo 'ok';
    }


    Либо уберите типизацию у свойства и при public $parentId; ошибки не будет. Всё как и написано в тексте ошибки, нельзя обратиться к типизированному свойству до его инициализации, а значит нужно либо задать значение по умолчанию при описании свойства, либо через конструктор, либо вызвав setter.

    uninitialized и typed properties
    https://php.watch/versions/7.4/typed-properties#un...
    Ответ написан
    Комментировать
  • Почему появляется Typed property must not be accessed before initialization?

    @Vitsliputsli
    1. Разве по умолчанию свойства не null?
    2. У меня 20-30 свойств. Для каждого что-ли делать так? Код какой-то не логичный и громоздкий.

    1. Нет, в данном случае у свойства нет значения, оно не инициализировано. Какое значение вы хотите получить из свойства, если у свойства нет значения? То, что php в некоторых случаях при отсутствии типов выполняет неявное приведение к null не распространяется на ситуации, когда вы явно указали типы, а значит хотите явного поведения.
    А вот Null - это уже значение, которое используется для передачи отсутствия значения как значение.

    2. Если заботитесь о качестве кода, то да. Все абсолютно логично, php подсказывает вам, что вы вероятно забыли инициализировать переменную, т.е. допустили ошибку, обратившись к переменной раньше, чем положили в нее значение.
    Здесь нет ничего "громоздкого", просто вы явно описываете поведение. Можете этого, конечно, не делать, например не использовать указание типов и расчитывать на то, что php сам что-нибудь подставит - но, очевидно, это ненадежный путь, ведущий к ошибкам.
    В идеале, вы должны задать свойству корректное значение, а затем его использовать. Т.е. использовать 1 единственный тип. Не всегда логика это позволяет и тогда нужно инициализировать переменную значением null.

    Хороший код тот, который очевиден и понятен с первого взгляда, а не в котором мало букв. Указывая типы вы всегда знаете что за тип лежит в конкретной переменной и вам не нужно продумывать обработку других типов. Даже когда вы пишете ?int, значит кроме целого числа там еще и null может быть, и это придется учитывать при всех манипуляцих с этой переменной. И вот это, и будет делать код более сложным. А если вы не сделаете обработку всех доступных типов, тогда поведение кода может стать непредсказуемым.
    Ответ написан
    Комментировать
  • Как заставить работать глобальный обработчик исключений (exception_handling в .settings.php)?

    Ge1i0N
    @Ge1i0N
    Дока
    Не так
    'className' => '\Namespace\GlobalLogHandler',

    А так
    'class_name' => '\Namespace\GlobalLogHandler',
    Ответ написан
    1 комментарий
  • Как найти центральную ячейку таблицы?

    0xD34F
    @0xD34F Куратор тега JavaScript
    Как получить строки таблицы:

    // если гарантируется отсутствие thead и tfoot, или их содержимое также должно учитываться
    const { rows } = table;
    
    // если tbody один
    const [ { rows } ] = table.tBodies;
    
    // если tbody несколько
    const rows = Array.prototype.flatMap.call(table.tBodies, n => [...n.rows]);
    // или
    const rows = [].concat(...Array.from(table.tBodies, n => [...n.children]));
    // или
    const rows = table.querySelectorAll('tbody tr');

    Как получить средний элемент:

    const middle = arr => arr[arr.length >> 1];
    // или
    const middle = arr => arr[Math.floor(arr.length / 2)];
    // или
    const middle = arr => arr[Math.round(~-arr.length / 2)];
    // или
    const middle = arr => arr[(arr.length - arr.length % 2) / 2];

    Всё, можно доставать ячейку:

    const cell = middle(middle(rows).cells);
    // или
    const cell = middle([].reduce.call(rows, (acc, n) => (acc.push(...n.children), acc), []));
    // или, без получения строк
    const cell = middle(table.querySelectorAll('tbody td'));
    Ответ написан
    Комментировать
  • Как объединить разные таблицы с разными столбцами?

    alexey-m-ukolov
    @alexey-m-ukolov Куратор тега MySQL
    Задача, конечно, максимально странная, но решается она так:
    select zagolovok from (
        select 1 as sort, name as zagolovok from sotrudniki
        union
        select 2 as sort, nazvanie as zagolovok from transport
        order by sort, zagolovok
    ) as tmp
    Ответ написан
    1 комментарий
  • Необходимо сделать так, чтобы кликами можно было выбрать несколько продуктов из div и их суммарная стоимость при этом писалась бы в абзац?

    alexey-m-ukolov
    @alexey-m-ukolov Куратор тега JavaScript
    Вы получаете значение span один раз при запуске скрипта и туда попадает первый span первого div.
    Вам же нужно при клике брать span внутри кликнутого элемента:
    div.addEventListener('click', function(e) {
        let span = this.querySelector('span');
    
        set.add(this.textContent); 
        let arr = [...set];
        el1.textContent = arr.join(', ');
        
        sum += +span.textContent;
        console.log(span.textContent);
        el2.textContent = sum;
    })
    Ответ написан
    Комментировать