Задать вопрос
  • Какую ОЗУ и какой максимум можно добавить в ноутбук?

    @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 комментарий
  • Как распарсить данные из ответа JSON?

    @alexalexes
    Как-то так:
    var container = document.getElementById('какой-то-id-контейнера-куда-вывести');
    container.innerHTML = "<p style='text-align: center'>User info:</p>\
    <table>\
    <tr><td>Name:</td><td>" + response.name + "</td></tr>\
    <tr><td>Username:</td><td>" + response.username + "</td></tr>\
    <tr><td>Address:</td><td>" + response.address.city + ", " + response.address.street  + "</td></tr>\
    <!-- И дальше в таком же духе -->\
    </table>";
    Ответ написан
    Комментировать
  • Как сделать сортировку?

    @alexalexes
    Добавьте еще два параметра в ту часть запроса, которая отвечает за сортировку.
    order_column - по какой колонке сортировать, order_direct - в каком направлении.
    Пример с limit намекает, как это сделать.
    $limit = 'limit 0, 500';
    $order_column = 'added';
    $order_direct = 'desc';
    if(isset($_GET['order_col']))
    {
      if($_GET['order_col'] == 'updated')
        $order_column = 'updated'; // не вздумайте подставлять из GET название колонки, будет sql-инъекция!
    }
    if(isset($_GET['order_dir']))
    {
      if($_GET['order_dir'] == 'asc')
        $order_direct = 'asc'; // не вздумайте подставлять из GET название клаузы, будет sql-инъекция!  
    }
            if (isset($_GET['ajax2'])) $limit = 'limit '.(int)$_GET['offset'].', 30'; // тут застраховано от инъекции при помощи преобразования в int!
    
            $rows = fs::getObjects($sql, "order by c_object.".$order_column." ".$order_direct." ".$limit);
            $rowsCount = count(fs::getObjects($sql));
    
            if (isset($_GET['ajax2']) && !count($rows))
            {
              header("HTTP/1.0 404 Not Found");
              die;
            }

    ПС: Осталось вам дополнить вопрос, "а где мне найти шаблон формы с фильтром списка, чтобы прописать get-параметры order_col и order_dir".
    Ответ написан
    Комментировать
  • Можно ли сделать этот SVG адаптивным?

    @alexalexes
    Как избавиться от отступов в векторном файле изображения.
    Либо:
    1) Откройте файл svg в векторном редакторе, например, в Inkscape.
    2) Уменьшите область видимости холста до выступающих элементов изображения.
    3) Сохраните изменения и используйте новый вариант svg файла.
    Либо в существующих данных вручную подобрать "коробочку" без отступов. У меня вот такие числа получились.
    <svg ... viewBox="23 160 466 192"
    Тестировал на таком div блоке. Изменял ему width и height, чтобы увидеть границы svg.
    Адаптивность в svg в качестве фона div работает.
    <style>
        div.container
        {
          width: 120px;
          height: 50px;
          background: url(1.svg) no-repeat;
          border: 1px solid black;
        }
      </style>
      <div class="container">
      </div>
    Ответ написан
  • Как добавить/обновить данные в таблице MySQL, если в другой таблице соблюдается определенное условие?

    @alexalexes
    Обновлять строки по условию с подзапросом. Но проблема в том, что в утверждении не говорится, чем связаны table_1 и table_2.
    update  table_1 t1
    set  t1.column_1 = A
    where exists (select 1 from table_2 t2 where t2.какой-то-связный-ключ-с-t1 = t1.какой-то-связный-ключ-с-t2 and t2.column_1 = B)
    Ответ написан
    6 комментариев
  • Виснет страница при проигрывании аудио?

    @alexalexes
    Попробуйте вместо setinterval для отображения текущей позиции использовать подписку на специализированные события элемента audio, например, на timeupdate.
    PS: Ваш плеер на основе тэга audio, надеюсь?
    полоски прогресса и таймера в отдельный поток?

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

    @alexalexes
    Каждый уважающий себя разработчик должен пройти путь создания своего велосипеда - мессенджера.
    От простой почтовой модели данных, где в записи сообщений есть отправитель и получатель, до модели данных, содержащий беседки (они же чаты, они же диалоги - называйте как хотите).
    Но вопрос не в этом. Давайте попробуем что-то сделать с существующей моделью.
    Время сообщения у нас нет - не проблема. Время летит вперед, и id увеличиваются в ту же сторону - по возрастанию. Значит id достаточно, чтобы различать, какое сообщение пришло раньше, а какое позже.
    Отсутствует сущность беседки - тоже не проблема. Будем считать совокупность сообщений, где отправитель, в которых может быть как сам автор, так и собеседник, или получатель также может быть как сам автор, так и собеседник одной беседкой. Такую совокупность сообщений можно выделить условием: (m2.to_id = m.to_id and m2.from_id = m.from_id or m2.to_id = m.from_id and m2.from_id = m.to_id) - что и будет выделять сущность беседки в упрощенном виде. Для выделения всех сообщений, где участвует пользователь from_id будет выражение: :from_id in (m.from_id, m.to_id). Осталось сообразить, как составить подзапрос с count, чтобы выделить самые поздние сообщения.
    Где-то такой запрос получится:
    select * from messages m
     where  :from_id in (m.from_id, m.to_id)
        and (select count(*)
                  from messages m2
                 where  (m2.to_id = m.to_id and m2.from_id = m.from_id
                       or   m2.to_id = m.from_id and m2.from_id = m.to_id) 
                   and m2.id > m.id
    ) < 1
    order by id desc

    Если понадобится выделить сообщения одной беседки, то скорее всего будет такой запрос:
    select * from messages m
     where (m.to_id = :to_id and m.from_id = :from_id
     or        m.to_id = :from_id and m.from_id = :to_id)
    order by id asc
    Ответ написан
    Комментировать
  • Как переделать запрос для получения нужного ответа?

    @alexalexes
    Как-то, так.
    SELECT
    city.id,
    city.name,
    country.name,
    salary,
    country.is_here
    FROM city
    LEFT JOIN country ON city.cid = country.id
    union all
    SELECT
    city.id,
    city.name,
    country.name,
    salary + 2000,
    1
    FROM city
    LEFT JOIN country ON city.cid = country.id
    where (country.id is null or country.is_here = 0)
    Ответ написан
    Комментировать
  • Почему перестал работать file_get_contents?

    @alexalexes
    Попробуйте использовать более гибкие опции stream_context_create, в качестве одного из параметров функции file_get_contents. Попробуйте 'verify_peer' => false.
    $url = 'https://secure.example.com/test/1';
    $contextOptions = array(
        'ssl' => array(
            'verify_peer'   => true,
            'cafile'        => __DIR__ . '/cacert.pem',
            'verify_depth'  => 5,
            'CN_match'      => 'secure.example.com'
        )
    );
    $sslContext = stream_context_create($contextOptions);
    $result = file_get_contents($url, NULL, $sslContext);

    Источник.
    Ответ написан
  • Как получить только первые строки из групп строк отсортированной таблицы?

    @alexalexes

    model_id = '269'
    AND partner_id = '0'
    AND size <= '32'

    Ай-ай-ай. Все Id-шники строками заданы, не тот тип данных выбрали для столбцов.
    Выбрать первые записи от какой-то категории можно c помощью коррелирующего группирующего подзапроса (где count считается).
    SELECT id, size, price, date
      FROM prices p
      WHERE model_id = 269
           AND partner_id = 0
           AND date_time <= '2021-10-19' 
           AND (select count(*)
               from prices p2
              where  -- сюда нужно прописать параметры строк, по которым будет определяться окно счетчика
                         -- то есть, отсчет счетчика будет в пределах одного размера, одной и той же модели, одного и того де партнера.
                          p2.size = p.size
                   and p2.partner_id = p.partner_id
                  and  p2.model_id = p.model_id
                  -- а тут параметр, чем отличается одна строка счетчика от другой
                  and p2.date > p.date 
            ) < 1 -- сколько строк отсечь от категории (n + 1) ?
    order by p.date desc
    Ответ написан