Задать вопрос
  • Как записывать имя пользователя в лог файл на web сервере?

    BasiC2k
    @BasiC2k
    .NET developer (open to job offers)
    В Вашем случае, лучше отправлять пользователям уникальные ссылки, например c зашифрованным id пользователя:
    https://mysite.com/fakepage/?id=sfee98w77ds88
    на сервере соответственно записывать - какие url запрашивались.
    Разумеется, могут быть ситуации, что Иванов переслал Петрову ссылку и Петров по ней перешёл.
    На хостинге поднимаете web-сервер. Как правило, большинство из них пишут в логи - какие url запрашивались.
    Ответ написан
    Комментировать
  • Как незаметно переползти на новый сервер?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Обычно поднимают балансировщик и делают так что сначала все ходят на 1.1.1.1.
    Потом делают перевод новых сессий в новое место в пропорции 20:80.
    И так далее пока все сессии не переползут.
    Ответ написан
    4 комментария
  • Как определить вредоносный код JavaScript?

    @humoured
    Вы всё на свете найдёте в коробке с карандашами
    Как сейчас в 2023 году с помощью javascript работает вредоносный код ?
    Как и в любой другой год, вредоносный код работает как угодно, в зависимости от своей вредоносности. Код на JS может как показать всплывающее окно с непристойностями, так и воспользоваться уязвимостью браузера и установить на компьютер какую-нибудь дрянь.

    Источник: https://socks...
    Пытается загрузить какой-то вирус на компьютер.
    63ab833f32932966141093.png

    Поведенческая аналитика: https://www.virustotal.com/gui/file/f58b523d7aa8ac...

    updated
    Более полный отчёт: https://www.hybrid-analysis.com/sample/f58b523d7aa...

    что это может быть ?
    • Ворует криптокошельки
    • Ворует данные браузера
    • Ворует данные Дискорда и FileZilla
    Ответ написан
    Комментировать
  • Как из вложенных массивов выбрать нужные элементы без рекурсии?

    0xD34F
    @0xD34F Куратор тега JavaScript
    function getLeaves(tree) {
      const result = [];
    
      for (const stack = [...tree]; stack.length;) {
        const n = stack.pop();
        if (Array.isArray(n.children) && n.children.length) {
          stack.push(...n.children);
        } else {
          result.push(n);
        }
      }
    
      return result.reverse();
    }

    или

    function getLeaves(tree) {
      const result = [];
      const stack = [];
    
      for (let arr = tree, i = 0; i < arr.length || stack.length; i++) {
        if (i === arr.length) {
          [ i, arr ] = stack.pop();
        } else if (arr[i].children instanceof Array && arr[i].children.length) {
          stack.push([ i, arr ]);
          [ i, arr ] = [ -1, arr[i].children ];
        } else {
          result.push(arr[i]);
        }
      }
    
      return result;
    }

    или

    function getLeaves([...tree]) {
      for (let i = 0; i < tree.length; i++) {
        const c = tree[i].children;
        if (c?.constructor === Array && c.length) {
          tree.splice(i--, 1, ...c);
        }
      }
    
      return tree;
    }
    Ответ написан
    3 комментария
  • Есть ли подводные камни у разворачивания на хостинге продуктов mySQL Workbench?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Эти ваши "гуру" просто ничего кроме примитивного PHPMyAdmin'а не знают. База ставится на хостинге, MySQL Workbench на рабочем компьютере. Подключение через ssh туннель, это штатная опция Workbench'а.
    spoiler
    63987fe479f70227963640.png
    Ответ написан
    1 комментарий
  • Из двух циклов сделать один?

    sergiks
    @sergiks Куратор тега PHP
    ♬♬
    array_merge() наложит на дефолтные значения то, что передали из формы.

    $args = [
        'name1' => FILTER_SANITIZE_STRING,
        'age1' => FILTER_SANITIZE_NUMBER_INT,
        'weight1' => FILTER_SANITIZE_NUMBER_FLOAT,
    ];
    
    $defaults = [
        "name1" => "по умолчанию",
        "age1" => "по умолчанию",
        "weight1" => "по умолчанию",
    ];
    
    $results = array_merge($defaults, filter_input_array(INPUT_GET, $args));
    
    // вывод
    foreach ($results as $name => $value) {
        printf('<p>%s: %s</p>', $name, $value);
    }
    Ответ написан
  • В чем разница между способами тестирования (в контексте web и php)?

    VoidVolker
    @VoidVolker
    Dark side eye. А у нас печеньки! А у вас?
    Опишу простыми словами для упрощения понимания.

    модульное тестирование

    Тестирование конкретного модуля. Обычно - это самый нижний уровень, отдельные простые классы, т.е. ниже по логике уже будут отдельные функции. Например, в JS есть класс Math - тестирование всех его методов и есть модульный тест. Конечно, границы между логическими уровнями могут быть размыты и в данную категорию вполне можно вписать класс уровнем выше. Так же, модулем может быть и что-то более сложное - опять же, много зависит от масштабов и особенностей архитектуры.

    интеграционное тестирование

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

    функциональное тестирование

    Очевидно, что тестируются конкретные функции, которые есть в техническом задании. Например: когда пользователь нажимает кнопку "купить" в карточке товара - товар добавляется в корзину.
    какими инструментами оно делается?

    Инструментами автоматизации GUI - для сайтов это Selenium и браузеры. Для десктопных/мобильных приложений аналогичные решения.

    приемочное тестирование

    в че отличие от интеграционных.. еще видел фразу что тут и фронт и бек тестируются, но яснее не стало, какими инструментами оно делается?

    "Бизнес" заказал в "Конторе" разработку сайта, выдал ТЗ, контора сделала сайт, бизнес заплатить денег обещал. Как бизнес проверит что контора сделала именно то, что он хотел? Через приемочное тестировние - бизнес получает доступ к сайту и проверяет, что сайт именно такой, какой он заказывал в ТЗ, а не тот, который сделали индусы за доширак. Если в ТЗ указан конкретный список тестов/фич - используется этот список или так, как прописано в ТЗ само тестирование. Само тестирование проводит соответствующий специалист (инженер отдела качества) - тыкает все кнопочки, нажимает менюшечки и говорит начальству "все окей, подписывай и платим им деньги" или "вот тут и тут не окей, не подписывай, денег не давай". Реальный пример: была заказана и собрана станция спутниковой связи, на приемке были представители заказчика и исполнителя, была толстая пачка бумаги на несколько сотен страниц, по которой первые проверяли что все работает именно так, как там написано в течении нескольких недель (плюс-минус), а вторые исправляли косяки показывали что все окей, потом все поставили свои галочки и крестики и разъехались по домам.

    E2E - тут тестируется чрез браузер, с помощью Mocha и тп, те тестируются "требования бизнеса к приложению", тестируются пользовательские сценарии.. а в чем отличие от функциональных тестов тогда?

    Сквозное тестирование. Это полная проверка от начала и до конца. Отличие от функционального в том, что это более комплексный тест. Если функциональное тестирование - это проверка конкретной функции, тот сквозное - работа всего приложения, т.е. более комплексное. Например, E2E тест приложения для загрузки файла на сервер: тест включает в себя запуск приложения, авторизация пользователя, выбор файла, указание мета информации, загрузку файла на сервер, выход из приложения. Вот тут неплохая статья на хабре: https://habr.com/ru/company/otus/blog/681066/

    Совсем запутался, с unit только понятно, а как уложить и разделить остальные?

    60da68c37e576762375008e5_thumb-image.png
    Картинка отсюда: https://www.rainforestqa.com/blog/the-layers-of-te...
    Ответ написан
    Комментировать
  • Как определить позицию строки в бд mysql?

    @alexalexes
    Для извлечения, изменения, удаления конкретной записи таблицы достаточно знать значение первичного ключа. Первичный ключ обладает свойством уникальности значения. Знать позицию записи таблицы, которая записалась физически в базу не имеет смысла. При выборке может быть полезна нумерация строк, но эта нумерация всегда относительна и зависит от сортировки.
    В вашем случае запрос будет выглядеть так.
    SELECT c.id, c.region,
    (select count(*)
       from `class_item` c2
       where c.data <= c2.data-- знак будет влиять на направление нумерации
           ) as row_num
    FROM `class_item` c
    order by с.data desc

    Поле data должно иметь индекс, иначе скорость выборки будет падать с ростом числа строк.
    Ответ написан
    4 комментария
  • Как отнять 2 месяца от текущей даты?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    const dateTwoMonthsBack = new Date();
    dateTwoMonthsBack.setMonth(dateTwoMonthsBack.getMonth() - 2);
    
    const id = 'testId'; // TODO: remove
    
    const params = {
      page_size: 200,
      manager: id,
      last_kpi_graded__lte: dateTwoMonthsBack.toISOString().substring(0, 10),
    };
    
    const url =
      'http://10.1.5.65/api/personal/users/?' +
      Object.entries(params)
        .map(([k, v]) => `${k}=${encodeURIComponent(v)}`)
        .join('&');
    
    console.log(url);
    // http://10.1.5.65/api/personal/users/?page_size=200&manager=testId&last_kpi_graded__lte=2022-09-16
    
    // fetch(url);
    Ответ написан
    Комментировать
  • Как оптимизировать нерекурсивный обход дерева?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    судя по данным, тут не бинарное дерево, и в свойстве v всегда число ("v" for "value"),
    а в свойстве c — опциональный массив дочерних элементов ("c" for "children").

    Проверка if (last && Array.isArray(last.v)) { тут, видимо, лишняя.
    Хотя самый первый раз как раз v это массив.. Так что нужна, если данные именно такие.

    Как и if (last && typeof last.c === 'object') {, за исключением корневого свойства, где это таки объект.

    По мелочи — все 4 проверки одинаково проверяют наличие last

    Оптимизировать что-то — зачем? Тут лишняя операция, если только сортировка результатов, скрывающая порядок обхода.
    Ответ написан
    Комментировать
  • Yii2 как сделать несколько сайтов с одной кодовой базой?

    @rPman
    За то, какой именно код будет запускаться на разных доменах, обычно отвечает веб сервер, смотри настройки в нем. Там на каждый домен своя секция конфига. Работать такие сайты будут совершенно независимо, т.е. база сессий у каждого своя, ну а настройки баз данных сам пропишешь в коде у каждого свой.
    Ответ написан
    2 комментария
  • Использовать ли геттеры в классе где объявлены приватные свойства?

    saboteur_kiev
    @saboteur_kiev
    software engineer
    геттеры и сеттеры именно для этого и нужны - чтобы далеко далеко в будущем, когда будет много других классов, и которым нужны эти данные, и вдруг тип данных нужно будет поменять (например перейти от int32 к int64), то будет достаточно просто поменять тип приватных данных, поправить геттеры, чтобы они конвертили в int32 для старых зависимостей и сделать два новых 64-битных геттера для новых.
    И потом уже все кто лазили за данными, либо будут потихоньку переходить на новые геттеры, либо сидеть на старых, но с ограничением.

    Если у вас 2.5 класса, можете делать как угодно. Смысл геттеров и сеттеров изначально именно в том, чтобы обеспечить совместимость на десятилетия вперед.

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

    Все зависит от приоритетов. Нужна скорость - делаете одно. Нужна совместимость - делаете другое. Нужно и то и то - ищете архитектурный подход, где от геттеров все зависит мало.
    Ответ написан
    1 комментарий
  • Как сверстать таблицу?

    VoidVolker
    @VoidVolker
    Dark side eye. А у нас печеньки! А у вас?
    Ответ написан
    Комментировать
  • В основе flex или inline-block?

    Ankhena
    @Ankhena Куратор тега CSS
    Нежно люблю верстку
    Дело в том, что флекс был не всегда. И раньше элементы в ряд выстраивали инлайн-блоками, ещё раньше флоатами.

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

    В современном мире для построения сеток используют флексы и гриды.
    Ответ написан
    2 комментария
  • Не могли бы подсказать что желательно прочитать?

    zkrvndm
    @zkrvndm
    Архитектор решений
    Читать надо все. Однако без практики и отработки навыков все это бесполезно и не усвоится в принципе. Лучше откройте консоль в браузере и поэкспериментируйте со страницами, это вам даст больше понимания, чем любые книги.
    Ответ написан
    Комментировать
  • Для чего в проектах принудительно используют use?

    ThunderCat
    @ThunderCat Куратор тега PHP
    {PHP, MySql, HTML, JS, CSS} developer
    Минусы как бы очевидны:
    нет, не очевидны, по крайней мере миллионам разрабов

    1 Код становится трудно читаем. По месту использования не всегда понятно что имеется ввиду под Order::load() - \Framework\Sale\Order::load или \Vendor\Project\Sale\Order::load - приходится проматывать к верху файла.
    Вам как разрабу должно быть в принципе фиолетово, какой из пакетов используется, если они соблюдают один интерфейс. Если не соблюдают, при том что называются одинаково, значит все пошло не так задолго до проблем с определением пакета...

    2 Код становиться длиннее - там где было бы просто:
    \Framework\Main\UI\Extension::load([ 'vendor.module.components.cabinet.personal' ]);
    приходится писать:
    use \Framework\Main\UI\Extension;
    Extension::load([ 'vendor.module.components.cabinet.personal' ]);
    Код становится длиннее в проектах где 2 контроллера и в них по 1 экшену. Там где Extension::load будет вызываться больше одного раза, очевидно экономия на эксплуатации клавиатуры заметно увеличивается. А в больших проектах создание объекта может (и будет) повторяться многократно.

    4 Код становиться замусоренным, так как верхушки файлов запросто превращаются во что-то вроде:
    Если не обращать внимание на отсутствие пункта 3, то... нет, не могу не обращать внимание, вот же торопыга....
    Во первых - данная портянка очень аккуратно прячется любой адекватной ИДЕ,
    Во вторых - это правильно и логично, хранить все импорты в одном месте
    В третьих - если ты пишешь неимпортированный класс в коде - ИДЕ обычно предлагает варианты внесения его в блок импорта, и все выглядит аккуратно.

    И хрен его знает используются импортированные классы ниже ещё или уже нет, ведь никто не убирает этот мусор.
    Хрен не знает, а ИДЕ замечательно знает и даже подсвечивает серым цветом неиспользуемые.
    Ответ написан
    4 комментария
  • Как скопировать текст из iframe в переменную js?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    Если в iframe загружена страница с того же origin (протокол + домен + порт) откуда загружена текущая - то Вы имеете полный доступ к его window через свойство contentWindow. Соответственно можете обращаться к его DOM, глобальным переменным, менять их и т.д.

    Если в iframe будет страница с другого origin, то ничего этого нет, с ней можно лишь общаться через postMessage api, но если страница не Ваша, то и скрипт для обработки postMessage + каких-либо еще действий Вы туда не вставите.

    Если сторонний сайт отдает нормальные CORS заголовки при запросе с Вашего сайта (что судя по вопросу не так, но все же), то можно скачать страницу как текст через fetch api и распарсить ее через DOMParser.

    В противном случае остается только делать прослойку у себя на сервере, тут простор фантазии может быть очень широким, от банального reverse proxy прямо в nginx до чего-то более умного на любом серверном ЯП.
    Ответ написан
    Комментировать
  • Как добавить класс active при переходе на другую страницу html?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Дык после перехода на другую страницу это уже совершенно другие элементы и класс, применённый на предыдущей странице, никакого значения не имеет.
    Либо передавайте класс из бэкенда, либо (если он статический) в цикле сравнивайте url страницы (window.location.pathname) с href ссылки и ставьте класс при совпадении.
    Ответ написан
    1 комментарий
  • Как сделать на JS чтобы скрипт срабатывал только на определенной ширине экрана?

    Mike_Ro
    @Mike_Ro Куратор тега JavaScript
    Python, JS, WordPress, SEO, Bots, Adversting
    Есть скрипт слайдера

    Здорово!

    нужно сделать так, чтобы он срабатывал только на определенной ширине

    Определить необходимую ширину в условие > выполнить "срабатывание".

    Window.innerWidth
    Element.clientWidth

    как это сделать на чистом javascript

    В целом, можно и на грязном...
    Ответ написан
    Комментировать