Задать вопрос
  • Как быть с 4 уровневой вложенностью кавычек в HTML?

    @alexalexes
    На более вложенном уровне экранирования нужно два символа экранирования \
    Первый символ экранирует символ экранирования для следующего уровня.
    Второй символ экранирует кавычку, чтобы не включало закрытие кавычки на уровне PHP.
    $value = '<form method="post">
    <button type="submit" onclick="return confirm(\'Вы уверены, что хотите сменить статус на \\\'Доставлен\\\' ?\')">Доставить</button>
    </form>';

    Вариант 2. Чтобы забыть об экранировании на уровне PHP, можно воспользоваться синтаксисом heredoc, который позволит вставлять любое константное содержимое без явного экранирования.
    $value = <<<ANY_RANDOM_SYMBOLS_FOR_BORDER
    <form method="post">
    <button type="submit" onclick="return confirm('Вы уверены, что хотите сменить статус на \'Доставлен\' ?')">Доставить</button>
    </form>
    ANY_RANDOM_SYMBOLS_FOR_BORDER;
    Ответ написан
    1 комментарий
  • Как исправить ошибку закрытия таба при попытки ввода информации в input?

    @alexalexes
    На элемент inputa type="number" повесить обработчик события клика с вызовом остановки всплытия события.
    PS: Ссылка для получения полного понимания механизма всплытия/погружения событий.
    Ответ написан
    Комментировать
  • Как изменить высоту срабатывания скрипта?

    @alexalexes
    Прибавьте или убавьте к одному из этих операндов.
    pageYOffset < document.documentElement.clientHeight
    Ответ написан
    Комментировать
  • Какой монитор выбрать для программирования 2021-2022?

    @alexalexes
    А причем здесь программирование?
    Вы рассматриваете мониторы, чтобы вам было комфортно играть.
    На любом игровом мониторе можно заниматься программированием в качестве побочной деятельности (как и любым занятием, связанным с вычитыванием и исправлением текста).
    Для комфортной работы с текстом важна достаточная плотность пикселей на экране. Для 24 дюймов FullHD приемлемо, но уже маловато, лучше смотреть от 2K разрешение, для 27 дюймов уже точно нужно 2K и выше.
    Частота кадров тут не важна, хоть 50 Гц, хоть 75, или 144 - для работы с текстом все равно.
    Технологии Low Blue Light, Flicker-Free будут полезны, так как придется пялиться по 8-10 часов в день в экран.
    Из технологий матриц - лишь бы только не классический TN, если будет IPS или VIA - уже супер.
    Всё, больше требований для текста нет. Возможно, подобрать шрифты в редакторе кода, да понять нужно ли включать сглаживание шрифтов.
    Ответ написан
    Комментировать
  • Как понять хорош ли код?

    @alexalexes
    Для анализа производительности необходимо в вашем скрипте поставить контрольные точки, в которых будут логироваться текущее действие. Так можно понять, на что обратить внимание.
    Например, можно составить такой лог:
    0 мс: начало скрипта
    12 мс: начало чтения файла
    24 мс: конец чтения файла
    30 мс: запрос единицы товара
    34 мс: обновление цены единицы товара
    35 мс: запрос единицы товара
    36 мс: обновление цены единицы товара
     ....
    12345 мс: конец скрипта.

    PS: Логировать можно не только время, но и используемую память, и другие интересуемые параметры в момент фиксации точки.
    Ответ написан
    3 комментария
  • Как правильно называется переходник для слотов памяти?

    @alexalexes
    Все, что можно реально сделать с dimm разъемом, если позволяет фантазия:
    1) Добавить PCIe разъем или парочку SATA для SSD или других накопителей.
    2) Поставить ноутбучную память на настольную материнку.
    Добавить еще одну линию для новой планки ОЗУ - собственно, материнская плата является тем самым переходником между ОЗУ и процессором, в прямом смысле этого слова. Она тупо пробрасывает проводники от контактов процессора до контактов планок ОЗУ. Хотите больше слотов памяти - поставьте другой переходник - материнскую плату, если, конечно, характеристики процессора позволяют (его контроллер памяти).
    Ответ написан
    Комментировать
  • Как убрать одну из прокруток?

    @alexalexes
    CSS свойство элемента overflow дробится на overflow-x и overflow-y.
    Подрегулируйте свойство overflow-x или overflow-y у контейнера .table__wrap

    Чтобы оставить возможность прокручивать контейнер, но не отображать сами полосы.
    Есть определенные CSS-хаки, но они специфичны для каждого браузера: https://qna.habr.com/q/18012
    Ответ написан
  • Как обратиться к id элемента в коллекции?

    @alexalexes
    У вас уже есть коллекция элементов. Зачем вам еще работать с id, если вы их не знаете?
    Просто пробегаетесь по коллекции и что-то там делаете с содержимым каждого элемента, это сразу отразится на DOM (если, конечно, при получении коллекции вы не клонировали элементы).
    let elem_count = elems.length;
    for(let i = 0; i < elem_count; i++)
    {
      let elem = elems[i];
      // что-то сделать с elem
    }
    Ответ написан
  • Насколько сложный пароль стоит иметь от БД?

    @alexalexes
    Второй пароль уязвим, если вы на всех системах, которые администрируете, устанавливаете пароль по похожей маске. Злоумышленнику достаточно узнать, как строится пароль к одной системе, чтобы иметь представление, как подбирать пароль к остальным. Злоумышленник будет использовать ровно ту логику, по которой вам удобнее запоминать пароль.
    Лучше не понижать энтропию ни у какой части пароля, использовать только генераторы случайных символов.
    Ответ написан
  • Какую ОЗУ и какой максимум можно добавить в ноутбук?

    @alexalexes
    У серии ноутов NP300, обычно, потолок 8x2 Гбайт ОЗУ (макс. планки PC3-12800, DDR3 без L).
    Можно комбинировать планки разной емкости, но желательно, чтобы хотя бы одной скорости они были, тогда есть шанс запуститься в полном составе.
    Ответ написан
    Комментировать
  • Как вызывать событие при клике на дочерний элемент?

    @alexalexes
    Если стоит цель обработать клик на конкретном элементе или на его контейнере, то повешайте обработчик на один из этих элементов, а не на весь документ, иначе замучаетесь идентифицировать target.
    let elem = document.querySelector('.elem'); // Берем нужный контейнер
        elem.addEventListener('click' , function(e) // вешаем обработчик только на elem, за счет всплытия события, обработчик будет срабатывать на всех дочерних элементах
        {
          alert('k');
        });

    Если уж хотите оставить обработчик на документе, то идентифицируйте target.
    document.addEventListener('click' , function(e)
        {
          let elem = document.querySelector('.elem');
          if(   e.target == elem // кликнули на сам контейнер elem
             || e.target.tagName == 'SPAN' && e.target.parentNode == elem // или кликнули на какой-то элемент span, непосредственный родитель которого есть наш контейнер elem
            )
          {
            alert('k');
          }
        })
    Ответ написан
  • Как хранить закупочную цену в интернет-магазине?

    @alexalexes
    Элементарно. Если какой-то атрибут может менять значение со временем, то он обретает вид табличных данных.
    Таблица "Цена":
    id_cost - идентификатор цены;
    id_cost_next - следующая цена;
    id_good - идентификатор товара (внешний ключ таблицы "Товары");
    id_delivery - идентификатор поставки (внешний ключ таблицы "Поставки");
    id_type - тип цены: розничная/закупочная (внешний ключ таблицы "Типы цен");
    date_set - дата/время установки цены;
    id_currency - идентификатор валюты: р. руб/евро/доллар (внешний ключ таблицы "Валюта").
    value - значение цены.

    При добавлении нового значения цены необходимо предыдущей записи цены по текущему товару устанавливать id_cost_next равный текущему значению id_cost.
    Текущая цена на товар будет определяться id_cost_next is null, ретроспективные - id_cost_next is not null.
    Самая ранняя установленная цена по товару будет определяться по min(id_cost) в пределах текущего товара.
    Ответ написан
    2 комментария
  • Что значит и как работает аргумент e в данном коде?

    @alexalexes
    У второго параметра replace, когда он используется в качестве функции есть в документации раздел по этому поводу.
    В параметр e передается результат работы регулярки.
    То же самое, что дает метод match применительно к строке.
    Ответ написан
    1 комментарий
  • Как перебирать массивы, которые находятся внутри других массивов?

    @alexalexes
    Итераторов for/foreach в JS вагон и маленькая тележка. Выбирайте, что по душе.
    Самое простое, что можно применить:
    for( let post of _data)
    {
      let body = post.body;
      // что-то сделать с body
      for(let block of body.blocks)
      {
        // что-то сделать с block
        for(let curr_data of block.data)
        {
         // что-то сделать с data в block
        }
        // что-то сделать с block
      }
      // что-то сделать с body
    }
    Ответ написан
    3 комментария
  • Нужно ли проверять длину значений, приходящих от пользователя?

    @alexalexes
    Всегда полезно проверять мин. макс. параметры всех значений и кидать исключение в случае чего.
    А вообще, есть кейсы, где лучше поругаться на слишком большую длину сообщения.
    Например, когда будете сохранять это сообщение в СУБД MySQL в поле типа данных varchar(10000) с превышением длины, то СУБД в случае превышения длины строки по тихому сохранит первые 10000 символов, а переполненную часть - нет. Так что лучше проверить длину сообщения, и если она не соответствует регламентированной, то не давать зеленый свет для обработки.
    Ответ написан
    Комментировать
  • Как в javascript classe запустить метод в другом методе?

    @alexalexes
    Проблема классическая в отношениях разработчика и JS - смена контекста объекта класса от места вызова.
    Чтобы заставить JS использовать только контекст объекта, нужно использовать стрелочный синтаксис для методов:
    class DeviceController {
      getItems = async (query)  => {
            let { brandId, typeId, limit, page, } = req.query
            page = page || 1
            limit = limit || 9
            let offset = page * limit - limit
            let devices;
            if (!brandId && !typeId) {
                devices = await Product.findAndCountAll({ limit, offset })
            }
            return devices
        };
        
       getAllForClient = async (req,res) => {
            let newList=[]
            let devices=await this.getItems(req.query)
            for (let index = 0; index < devices.length; index++) {
              let newItem={
                  name:devices[index].name,
                  price:devices[index].price,
                  videoUrl:devices[idnex].videourl            
              }
              newList.push(newItem)        
            }
            return res.json(newList)
        }
    }

    PS: В дострелочные времена нужно было убедиться, что this это тот самый this в конструкторе класса и передавать в другую переменную класса, например в that, чтобы потом использовать во всех методах.
    Ответ написан
    Комментировать
  • Как сделать поиск в двух таблицах?

    @alexalexes
    т.е. если в таблице wp_reviews запись с company_id=2001 не существует, то для таблицы wp_posts для строки с ID=2001 обновляем post_status на 'draft'

    Как бы, у вас уже на 80% запрос сформирован на естественном языке пригодный для прямого транслирования в SQL. Как-то стыдно не записать его прямым текстом:
    update wp_posts p
    set p.post_status = 'draft'
    where not exists (select 1 from wp_reviews r where r.связующий_ключ = p.связующий_ключ)

    Осталось определиться, как называются ключи в той и другой таблице, связывающие данные этих таблиц.
    PS: вероятно это: r.company_id = p.id.
    Ответ написан
  • Как серверу запросить android?

    @alexalexes
    Работник пункта выдачи сканирует контейнер с товаром, привезенный курьером из центрального склада. Софт пункта выдачи посылает сведения, что такой-то контейнер принят на таком-то пункте выдачи для такого-то пользователя в информационную систему магазина/торговой сети/маркетплейса. Приложение в телефоне пользователя или его серверная часть запрашивает по профилю пользователя у информационной системы магазина/торговой сети/маркетплейса - какие события произошли за текущую сессию авторизации/или другой интервал времени/либо обработчик сработал по триггеру события и генерирует необходимое сообщение для Push Notification.
    Ответ написан
    Комментировать
  • Как создать ссылку в базе данных?

    @alexalexes
    Общий ответ с точки зрения любой СУБД по отношению к любому способу вывода (выкатить что-то на веб-страницу) - никак. База данных ничего не знает, что такое ссылка в веб-документе. Она оперирует такими понятиями, которые позволяет хранить данные, как таблица, столбец, строка, значение атрибута. Из таблиц и связующих атрибутов таблиц - внешних и внутренних ключей строится структура данных для вашей предметной области.
    С другой стороны, у вас имеется ссылка в веб документе, которая имеет некоторые атрибуты, пригодные для хранения в базе данных: href - адрес ссылки, title - подсказка на ссылки, и возможно, какой-то текст, который обрамляет эта ссылка.
    Попробуйте значения этих атрибутов поместить в таблицу базы данных links, со столбцами:
    link_id, -- идентификатор записи в таблице ссылок
    link_href, -- ссылка
    link_title, --подсказка ссылки
    link_text -- текст ссылки
    И с помощью запроса к СУБД, а также с помощью PHP сделайте форматированный построчный вывод данных:
    // тут опущены действия связанные с формированием запроса,
    // на этом этапе вы каким-то способом получили выборку данных из таблицы links
    foreach($rows as $row)
    {
      echo '<a href="'.$row['link_href'].'" title="'.$row['link_title'].'">'.$row['link_text'].'</a><br/>';
    }

    Это и будет самый примитивный пример, как хранить сведения о ссылки и как их выводить.
    В реальном проекте будет несколько сложнее выглядеть таблица, где хранятся подобные сведения.
    Ответ написан
    Комментировать
  • Почему 144 гц мониторы продают в тридорога?

    @alexalexes
    Современный ЖК монитор - это не только матрица, а еще и микроконтроллер, который декодит сигнал HDMI в сигналы для каждого компонента пикселя матрицы.
    Чтобы реализовать ваше хочу, нужно чтобы сошлись некоторые звезды.
    1. Вы владеете базовыми знаниями ремонтника. То есть, умеете работать с паяльной станцией, разбираетесь в процессе прошивки различных видов микросхем. У вас имеется целый зоопарк различных программаторов и софта к ним. Ориентируетесь в даташитах к микросхемам.
    2. Производитель благодушно выложил в открытый доступ даташиты к микросхемам и необходимые прошивки. Причем, последние даже в некомпилированном виде, где можно исправить заветный конфиг 60 на 120 или даже на 144 Гц.
    3. Производитель поставил в монитор микроконтроллер "на вырост". Обвязка его позволяет выдержать более высокие частоты шины, есть запасы для буфера памяти и т.д.
    4. Если что-то не тянет более производительный конфиг, то производитель заботливо оставил ключевые компоненты схемы не замурованные внутри матрицы, или не залиты пластиком намертво, нету препятствий для демонтажа и замены.
    5. Любые отдельные детали схемы монитора легко ищутся на ebay или taobao, есть даже более производительные аналоги.
    В общем, чтобы можно было менять свойства монитора, нужно чтобы выполнялись пункты 1-5. Но вы же понимаете, что это практически сказка.
    Ответ написан
    1 комментарий