Задать вопрос
  • При парсинге сайта - требуется загрузить 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;
    })
    Ответ написан
    Комментировать
  • Почему метод не работает?

    alexey-m-ukolov
    @alexey-m-ukolov Куратор тега JavaScript
    Во втором случае функцию в data вы не вызываете:
    data().init
    Ответ написан
    2 комментария
  • Почему не сбрасываются выбранные параметры умного фильтра?

    @koder_1
    Битрикс программист
    У компонента catalog.smart.filter (Умный фильтр) есть параметр SAVE_IN_SESSION (Сохранять установки фильтра в сессии пользователя), выставьте его в N
    Ответ написан
    1 комментарий
  • Алгоритмы и структуры данных. Сложность алгоритмов?

    wataru
    @wataru Куратор тега Алгоритмы
    Разработчик на С++, экс-олимпиадник.
    Потому что это 2 разных графика, 2 разных примера. Могли бы на втором обозвать вместо f и g f` и g`. Но авторам, наверно, было лень.
    Ответ написан
    1 комментарий
  • Алгоритмы и структуры данных?

    AshBlade
    @AshBlade
    Просто хочу быть счастливым
    "... поскольку Тета обозначения более сильные чем О обозначения..."
    Ответ кроется тут. Тета - более ограниченное множество, чем О, т.к. есть ограничение снизу:
    - Тета = g1(n) <= f(n) <= g2(n)
    - О = 0 <= f(n) <= g2(n)

    Можешь заметить вот этот промежуток [0; g1(n)]. Это и есть разница между тета и О.
    Таким образом, Тета меньше чем О, поэтому не может быть надмножеством. Ну а так как верхняя граница одинакова, то можно сказать, что О = Тета + [0; g1(n)]
    Ответ написан
    1 комментарий
  • Почему в таблице mysql, которую я получаю с помощью select-запроса с join, содержатся дубликаты?

    IvanU7n
    @IvanU7n
    nothing interesting here
    JOIN так и должен работать, а нужно использовать EXISTS, что-то вроде
    SELECT servers.serverInviteID, servers.serverDescription
    FROM servers
    WHERE EXISTS (
      SELECT * FROM tags
      WHERE tags.serverInviteID = servers.serverInviteID
      AND tags.tag IN ('onetwothe', 'oo')
    )
    Ответ написан
    1 комментарий
  • Большое кол-во записей в секунду в MySQL. Как читать последний порядковый номер столбца и добавлять к нему +1 при записи?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Обычно при стриминге информации разделяют 2 процесса. Первое - это регистрация
    событий с устройств.
    Это обычно запись в Message Hub, Kafka, RabbitMQ, Apache Pulsar e.t.c.
    прочие брокеры или системы которые работают с очередью. Тут - главная задача просто успеть
    регистрировать событие. С этим системы очередей справляются отлично.

    При регистрации событий никакого синхронизма между устройствами нет и в принципе
    не может быть. По законам физики и по часовому времени и по прочим сложным процессам
    которые идут в мире. Мы не можем вообще гарантировать точного совпадения часов на всех
    устройствах поэтому фактор времени мы пропустим. К свойствам дублирования и грязи в атрибутах
    на этом уровне можно относиться очень толерантно и не требовать никакой сложной логики фильтрации.
    Если допустим 99.9% событий зашло ровными - оно и ладненько. Дальше почистим.

    Дальше идет - процессинг. Вот здесь уже может вступать в игру MySQL сервер с его логикой
    транзакций. Счетчиков. Уникальностей. Сурогатных или натуральных ключей. Партишенинга
    и прочего. Здесь у вас уже может возникнуть лимит на скорость генерации (inserts) но он будет
    мягкий потому что очередь уже смягчает удар.

    Если у тебя приложение - тайм-критичное и клиент хочет видеть КАЖДОЕ событие как счетчик
    в браузере то здесь тебе скорее всего надо отказаться от MySQL и попробовать что-то другое.
    Что - я не знаю. Надо исследовать глубже use-case. Обычно разработка таких систем - это
    компромисс между одним и другим. Идеала тут не будет.
    Ответ написан
    4 комментария
  • Как изменить цвет ссылок?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Браузер показывает, что свойство не применяется из-за того, что оно перекрыто более специфичным селектором.
    66b73732c1951391303109.png
    Ответ написан
    1 комментарий
  • Как в арч решить проблему с wifi?

    serii81
    @serii81 Автор вопроса
    Я люблю phр...
    Нашел решение.
    Мой косяк, я установил arch через скрипт archinstall, и видимо linux-headers не установились.
    sudo pacman -S linux-headers
    sudo pacman -S broadcom-wl

    Рестарт системы
    Потом чере networkmanager подключился
    nmcli device wifi list
    nmcli device wifi connect SSID password PASSWORD
    Ответ написан
    Комментировать
  • Как красиво использовать динамически подгружаемый API?

    Aetae
    @Aetae Куратор тега JavaScript
    Тлен
    Вот те простой хэлпер для ленивой загрузки одной функции:
    function lazyAsync(lib) {
      let promise;
      return async function (...args) {
        promise ??= lib();
    
        return (await promise).call(this, ...args);
      };
    }
    
    const doSomething = lazyAsync(async () => {
      // тут загружаем
      const doSomething = await loadLib('doSomething');
    
      // тут что-то делаем с загруженным
    
      // тут возвращаем конечную функцию
      return data => {
        // тут делаем с аргументами
        return doSomething.process(imgData);
      };
    });
    
    // если сразу загружается нужная функция - можно не усложнять
    const doSomething = lazyAsync(loadDoSomethingProcess);
    
    await doSomething(1);
    await doSomething(2);
    await doSomething(3);
    Ответ написан
    Комментировать