Задать вопрос
  • Можно ли использовать Bootstrap, JQuery и другие сторонние библиотеки в серьезном проекте?

    gbg
    @gbg
    Любые ответы на любые вопросы
    В идеале, заказчика не должно интересовать, что там под капотом - вы прописываете все требования в контракте на юридическом языке, так что если кто-то что-то перестанет поддерживать - это будут проблемы студии, а не ваши.

    А чтобы студия не сменила юрлицо и не пропала, выбирайте надежного партнера.

    Вы понимаете, что на разработку аналогов этих библиотек может уйти 80% ваших денег? (да, на собственно сам сайт пойдет 20%)
    Ответ написан
    Комментировать
  • Реализация неприрывной доставки приложений?

    @unseriously
    Можно с помощью GitHub actions - мануалов полно
    Можно с помощью Jenkins, тут уже надо будет этот самый Jenkins где-то развернуть и настроить
    Можно с помощью GitLab, его можно установить где-то у себя, а можно воспользоваться облачной версией
    Ответ написан
    Комментировать
  • Реализация неприрывной доставки приложений?

    @q2digger
    никого не трогаю, починяю примус
    GitLab, GitHub + Actions
    Ответ написан
    Комментировать
  • Как сделать фильтрацию по клику на Vue?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Вы неправильно используете метод filter.
    Во-первых, его каллбэк должен возвращать не значение элемента массива, а логическое значение, указывающее, включать элемент в результат или нет.
    В-вторых filter не меняет исходный массив, а возвращает новый.
    this.items = this.items.filter(el => el < 10);
    Ответ написан
    Комментировать
  • Как сделать докер для тестирования кода на питоне с определенными библиотеками?

    @q2digger
    никого не трогаю, починяю примус
    я думаю, с такими вводными надо идти на фрилансер
    Ответ написан
    3 комментария
  • Почему кнопка вкл/выкл на корпусе срабатывает один раз?

    hint000
    @hint000
    у админа три руки
    Следственный эксперимент номер 1.
    нажал на кнопку – комп выключился, нажал на кнопку - он не включается
    В этом месте отсоединяем 24pin-коннектор от материнской платы (не выключая БП), для уверенности ждём полминуты, втыкаем коннектор на плату, пробуем запустить кнопкой.

    Следственный эксперимент номер 2.
    нажал на кнопку – комп выключился, нажал на кнопку - он не включается
    В этом месте отсоединяем 24pin-коннектор от материнской платы (не выключая БП), мультиметром в режиме до 20V смотрим напряжение между чёрным и пурпурным (фиолетовым) проводами на 24pin-коннекторе. Должно быть примероно 5V. Далее пробуем запустить БП народным методом скрепки (замыкаем зелёный и черный провода разогнутой скрепкой или любой пролочкой).
    Если БП не запустился скрепкой или нет дежурных 5V на пурпурном проводе - дело ясное, БП на помойку (или в ремонт умельцу с паяльником).
    Если запустился, то подозрения с БП ещё не снимаются, но главным подозреваемым становится материнка.
    Ответ написан
    3 комментария
  • Почему такая разница между Nginx и Apache в метрике "Content Download"?

    @rPman
    Скорее всего все зависит от того как приложения отдают http заголовки.

    Когда работает через apache, TTFB ждет долго потому что пока приложение не отработает до конца, даже заголовки не будут отправлены, т.е. время, которое занимает работа приложения это TTFB+content download

    Когда же работает через php fpm, за заголовки отправляются тут же, nginx не ждет когда закончится работа приложения для этого, а значит TTFB маленький (кстати 122мс это ДОЛГО что там происходит?) а уже генерация контента происходит пока идет content download
    Ответ написан
    3 комментария
  • SQL инъекция в UPDATE возможна ли?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Инъекция может быть через любой запрос.
    И защищать тоже надо любые запросы.
    Никогда не надо торговаться, "а можно я не буду защищать именно этот запрос? Ну мааааам!"
    Надо просто всегда следовать простым правилам - любая переменная попадает в запрос только через плейсхолдер

    Важно понимать, что в рассуждениях про инъекции люди постоянно путают два понятия - самой уязвимости, и конкретных способов ей воспользоваться.

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

    То есть сама уязвимость никак не зависит ни от каких второстепенных факторов - типа запроса, передаваемых данных, способов их валидации, твоих знаний SQL. Это сам факт. Можно подставить свой код в запрос? Значит он уязвим. А как конкретно можно нагадить - это отдельная тема.

    Кроме того, любая уязвимость - это всегда ошибки. Если в $id будет пусто, то запрос вызовет ошибку. Если в $id будет слово select то запрос вызовет ошибку. Если будет слово "привет", то запрос вызовет ошибку. Оно тебе надо?

    При этом разных вариантов возможных ошибок и способов воспользоваться уязвимостью - тысячи, им посвящены целые учебники и статьи. Но для того чтобы защищаться, не надо знать ни одного. Потому что защищаться надо не от отдельных способов эксплуатации, а закрывать саму уязвимость. И сделать это очень просто:
    1. Любые данные должны добавляться в запрос только через плейсхолдеры
    2. Любые другие элементы запроса должны выбираться из белого списка - заранее прописанных в нашем коде значений.


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

    Если каждый раз писать по три строчки долго
    $sql = "INSERT INTO users SET email = ?, password = ?"; // заменяем на знаки вопроса
    $stmt = $db->prepare($sql); // подготавливаем запрос, получаем stmt
    $stmt->bind_param("ss", $email, $hash); // два знака вопроса - две переменных - две буквы s
    $stmt->execute(); // выполняем запрос

    То надо воспользоваться такой вещью, как программирование. И написать функцию, которая возьмет на себя всю рутинную работу.
    function prepared_query($mysqli, $sql, $params, $types = "")
    {
        $types = $types ?: str_repeat("s", count($params));
        $stmt = $mysqli->prepare($sql);
        $stmt->bind_param($types, ...$params);
        $stmt->execute();
        return $stmt;
    }

    и в итоге предыдущие 4 строчки превратятся в одну:
    prepared_query($db, "INSERT INTO users SET email = ?, password = ?", [$email, $hash]);

    или твой запрос:
    prepared_query($db, "UPDATE table SET test WHERE id = ?", [$id]);

    - просто, быстро, удобно и безопасно
    Ответ написан
    26 комментариев
  • Как это понять?

    theobroma
    @theobroma
    javascript developer (ReactJS)
    1)let arr = str.split(' ');
    Возьмет строку, в данном случае 'aa bb cc aa bb aa', разобьет на части используя пробел как разделитель. В результате получим:
    let arr = ['aa', 'bb', 'cc', ' aa', 'bb', 'aa']
    2) Следующий кусок кода просто произведет подсчет одинаковых частей.
    return arr.reduce((acc, rec, index) => {
        return (typeof acc[rec] !== 'undefined')
          ? { ...acc, [rec]: acc[rec] + 1 }
          : { ...acc, [rec]: 1 }
      }, {});
    Рассмотрим его подробнее. Начнем с аргументов:
    acc – последний результат вызова функции, он же «промежуточный результат».
    rec – текущий элемент массива, элементы перебираются по очереди слева-направо.
    index – номер текущего элемента.

    Что собственно происходит:
    -typeof acc[rec] !== 'undefined' проверит есть ли в объекте 'acc' ключ 'rec'.
    - и если мы уже встречали такой( например когда "aa", но уже во второй раз ), тогда изменить значение этого ключа прибавив 1.{ ...acc, [rec]: acc[rec] + 1 }
    - если же такого ключа еще не было, то создадим его со значением 1, ибо он в первый раз попался{ ...acc, [rec]: 1 }
    Ответ написан
    6 комментариев
  • Как тестировать оптимизацию frontend?

    bingo347
    @bingo347
    Crazy on performance...
    796stwepspdbny_xqrwrrtvoor4.png
    Ответ написан
    Комментировать
  • Правильный подход к разработке на Bitrix?

    udjin123
    @udjin123
    PHP, Golang, React
    Vscode лучше заменить на PhpStorm.
    На локалке все прекрасно разворачивается, в том числе на openserver, только вот окружение надо создавать максимально близкое к боевому. По этому имхо под виндой лучший вариант docker в wsl2. Для докера готовое решение смотрите bitrixdoc.
    Ответ написан
    Комментировать
  • В чём преимущества и недостатки установок через apt и snap?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Нужно понимать принципиальную разницу подхода:

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

    snap - установка большого приложения со всеми зависимостями, которые никак не использует остальной софт на этом же компьютере. Отсюда тратится лишнее место на диске и в оперативной памяти. Зато никаких проблем с зависимостями, плюс snap работает в любых системах и не завязан на конкретный менеджер пакетов и собственно пакетный формат.

    snap по большому счёту часто используют для установки тяжёлых приложений, которые может бысть сложно опакетить, особенно учитывая разнообразие присутствующих в мире дистрибутивов (debian/ubuntu и их клоны) разных версий. В то время как большинство штатного общеиспользуемого софта чаще распространяют в виде пакетов, идущих в составе дистрибутива или отдельно (в том числе в виде разных собранных под разные варианты систем пакетов).
    Ответ написан
    7 комментариев
  • Есть ли у Postman адекватные альтернативы написанные НЕ на electron?

    @Flying
    Не полноценно, конечно, но в какой-то степени в качестве замены можно рассматривать HTTP Client в IDE от JetBrains, к примеру в PHPStorm.
    Ответ написан
    3 комментария
  • AWS: Как посчитать?

    Sanasol
    @Sanasol
    нельзя просто так взять и загуглить ошибку
    Это стоит 20-30$ в год, но никак не 100.

    https://poiskvps.ru/index.php?search_hdd_min=15&se...

    Тут например есть около 2$ в месяц https://firstvds.ru/

    Да даже DigitalOcean дешевле выйдет за 5$(6$ с НДС) - И на DO есть и аппы, и просто сервера. Остальное для тех кто с консолью умеет обращаться.

    s3 website

    это вообще про статичные сайты

    Нет смысла влезать в амазон, в любом случае это в разы дороже чем обычная впска где угодно, плюс если с ногами заходить в AWS s3/cloudfront/rds то выйдет еще в несколько раз дороже.
    Ответ написан
    Комментировать
  • Что будет если в лок сети окажутся два пк с разными ip, разными mac адресами, но с одинаковыми именами?

    CityCat4
    @CityCat4
    Дома с переломом ноги
    Именами чего, простите?
    С какими осями, простите?

    Есть сто тыщ разных областей, где используется "имя". В DNS - имя. В "сети Windows" - имя...
    Ответ написан
    Комментировать
  • Как отключить сетевую карту в линукс и вообще нужна ли она?

    CityCat4
    @CityCat4
    Дома с переломом ноги
    Ну... теоретически можно пересобрать ядро, исключив из него дрова на карту и запретив подгрузку дров модулем. НО зачем?
    Ответ написан
    Комментировать
  • Как добавить кнопку скачать у тега video html5?

    anatoly_kulikov
    @anatoly_kulikov
    Помог ответ? Отметь решением!
    Таки вы не поверите - в одном контейнере обычную гиперссылку с атрибутом download и спозиционировать в пространстве вплоть до получения удовольствия.
    Ответ написан
    Комментировать
  • Как организовать масштабирование/отказоустойчивость интернет-магазина?

    trapwalker
    @trapwalker
    Программист, энтузиаст
    smilingcheater всё правильно написал. Дабвлю лишь, что нужно анализировать бутылочные горлышки и исправлять узкие места в первую очередь.
    Разбирайтесь с проблемами детально. Что значит "nginx твалится"? Годами работает и ничего с ним не происходит. Выясняйте что произошло, если такое поторяется, то нужно разбираться, а не надеяться, что кто-то даст универасльный простой, но концептуальный совет, который победит все возможные проблемы наперед.
    Правила тут простые: находим узкое место и расширяем его пока общая производительность в часы пик не будет удовлетворительной.
    Надальте сохранение логов, протоколируйте нагрузки, помониторьте базу. Если проблема извне, то попробуйте подобрать хостинг понадёжнее, сменить OVZ на KVM, разнести БД и бэк на разные инстансы, прикрутите балансировщик,
    Если где-то скорость не принципиальна и можно что-то отложить, добавляйте очередь.
    Ответ написан
    3 комментария
  • Почему Prettier при автосохранении ставит точку с запятой, когда автодобавление semi выключено?

    WblCHA
    @WblCHA
    Потому что ненадо использовать питон стайл в жсе.)

    А если по делу, то темплейт стринг (``) используются не только в виде строк, но и как аргументы функции. Иными словами из-за такое действие преттиера предотвращает вот эту ситуацию:
    console.log()
    `${123}dsa`
    // =
    console.log()`${123}dsa`

    То есть сначала выполнится функция console.log, которая в свою очередь вернёт андефайнд, а далее андефайнд будет использован как функция, что приведёт к:
    Uncaught TypeError: console.log() is not a function


    Следовательно такая запись:
    console.log()
    ;`${123}dsa`
    будет идентична такой:
    console.log();
    `${123}dsa`;
    и никакой ошибки не будет.
    Ответ написан
    2 комментария
  • Как получить значение по ключу при помощи URLSearchParams?

    0xD34F
    @0xD34F Куратор тега JavaScript
    В переданной строке не только параметры - соответственно, разобрана она была неправильно.

    Используйте URL вместо URLSearchParams:

    const url = new URL('https://qna.habr.com/?test=123&frukt=yabloko');
    console.log(url.searchParams.get('test'));

    Или вырезайте из строки лишнее:

    const str = 'https://qna.habr.com/?test=123&frukt=yabloko';
    const usp = new URLSearchParams(str.replace(/^[^?]*\?/, '')); // или str.split('?').pop()
    console.log(usp.get('test'));
    Ответ написан
    1 комментарий