Задать вопрос
  • Как удалить элемент массива в localstorage, по нажатию на крестик, и перезаписать массив?

    @alexalexes
    Нужно использовать обертку+замыкание для обработчика, удаляющего элемент по клику.
    tasks.push(data); // тут вставили очередной элемент
    let task_index = tasks.length - 1; // узнаем его индекс по длине массива, так как он в текущей ситуации последний
    // несколько строк спустя
    b1.addEventListener("click", 
    (function(inner_task_index) // функция-обертка для изоляции контекста, сюда передается значение task_index, я специально выделил его другим именем inner_task_index, чтобы видеть контекст функции-обертки
      {
    // обертка возвращает функцию-обработчик события  для addEventListener
    return function delFromLocalSt() {
        task.removeChild(li);
            let array = JSON.parse(localStorage.getItem('task'));
            array.splice(inner_task_index, 1); // удаляем элемент по известному индексу используя механизм замыкания, используя контекст функции обертки
        localStorage.setItem('task', JSON.stringify(array));
       }
    })(task_index) // вызываем хитрую обертку, чтобы обеспечить изоляцию переменной от контекста функции createEl
    );
    Ответ написан
    1 комментарий
  • Зачем нужен multitouch на 10 касаний?

    @alexalexes
    Тоже искал на этот вопрос ответ. Из всего вороха статей и видеороликов можно сделать вывод.
    1. Для 99% задач хватит поддержки 2-3 одновременных касаний сенсора.
    2. Сенсор, который поддерживает 2 одновременных касания имеет технические ограничения, не позволяющие определять 2 касания в точках, расположенных на одной оси. В связи с этим нужно использовать сенсор с не менее 5 одновременных касаний. В нем не сэкономили на технологии изготовления, и регистрация 2-3 касаний гарантирована в любых точках.
    3. Теоретически, в сенсор на 10 касаний могли заложить более высокое разрешение в плане детализации точек касания (как бонус не экономии на технологии), что позволило бы точно захватывать более мелкие детали интерфейса. Но этот тезис нужно подтверждать либо техническими характеристиками, либо экспериментально.
    Ответ написан
    Комментировать
  • Как правильно организовать ссылку на значение в связанной таблице?

    @alexalexes
    Нет смысла. Вы не для красоты в таблице Book завели свойство author_id, чтобы связывать по нему строку из таблицы Author, тем самым получать доступ ко всем свойствам по идентификатору author_id.
    PS: А вы уверены что у книжки строго один автор? Или это для вас просто учебный пример?
    Ответ написан
  • Где в Chrome, нужно смотреть JS-события, применённые к элементу во время какого-либо действия с этим элементом?

    @alexalexes
    F12. Раздел "Элементы", выбираете элемент, на котором нужно посмотреть обработчик события. В области интерфейса для просмотра свойств элемента выбираете вкладку "Прослушиватели событий". Выбираете вид события, и выбираете точку входа в JS коде на это событие. Далее, при просмотре кода JS на вкладке "Источники" выбираете, где вам поставить точки останова, чтобы словить остановку выполнения обработки события.
    PS: Такой метод исследования работает только на ванильном или слабо прототипированном коде, написанный без применения библиотек и фреймворков. При использовании библиотек и фреймворков точки привязки событий будут указывать, как правило, на одну единственную функцию в этой библиотеке, отвечающей за высокоуровневый байндинг событий. В этом случае нужно изучать, какие инструменты для отладки есть в самой библиотеке или фреймворке.
    Ответ написан
    Комментировать
  • Как сделать, чтобы неподходящие под условие не забивали лимит?

    @alexalexes
    Вариант А.
    Вы не можете гарантировать, что любой файл изображений, сведения о которых храните в базе, будет доступен физически в любой момент.
    Придется неопределенное число раз постучаться в базу и протестировать каждую запись о файле, существует ли он физически. При тесте формируем список мертвых и живых файлов. После того, как протестировали нужное кол-во живых файлов, можно делать итоговый запрос с оглядкой на список мертвых файлов.
    $need_count = 10;  // сколько требуется файлов для выборки
    $alive_count  = 0;  // сколько живых файлов
    $is_need_repeat = true; // требуется повторить попытку получить живые файлы
    $death_list = []; // сюда накапливаем список id мертвых файлов
    $alive_list = []; // сюда накапливаем список id живых файлов
    while($is_need_repeat) // Если можно делать итерационную попытку и пока не набрали нужное количество живых файлов
    {
    // Этот запрос, чтобы прощупать целостность файлов, достаточно получить только те атрибуты, которые позволяют проверить его путь и запомнить id.
    $database->setQuery("
        SELECT id
        from блаблабла
        WHERE блаблабла 
                   ".(count($depth_list) > 0 ? : ' and id not in ('.join(',',$death_list).') ' : '')." -- отсеиваем мертвые файлы из запроса, они нам не нужны
                   ".(count($alive_list) > 0 ? : ' and id not in ('.join(',',$alive_list).') ' : '')." -- отсеиваем живые файлы из запроса, мы их уже проверяли
        ORDER блаблабла
    limit 0,".($need_count - $alive_count)); // делаем лимит по оптимистичному сценарию, как будто можем получить список файлов, и все они будут живые, но только то кол-во, которое недостает
    while($row = mysql_fetch_assoc($request))
    {
      if(file_exists('/www/ПУТЬ/'.$row['id'].'_100.jpg'))
      {
        $alive_list[] = $row['id']; // файл живой, заносим его id в список
      }
      else
      {
        $death_list[] = $row['id']; // файл мертвый, заносим его id в список
      }
      $curr_alive_count = count($alive_list);
      $is_need_repeat = $curr_alive_count > 0 && $curr_alive_count > $alive_count && $curr_alive_count < $need_count; // необходимо продолжить попытки, если на текущей итерации получили хоть один живой файл, живых файлов на этой итерации оказалось больше, чем на предыдущей, и их кол-во не достаточно до необходимого
      $alive_count = $curr_alive_count; // вписываем кол-во живых файлов на текущей итерации для проверки в будущем цикле (чтобы сравнить результаты двух циклов)
    }
    }
    // теперь можно сделать нормальный запрос, исключив мертвые файлы:
    $database->setQuery("
        SELECT *
        from блаблабла
        WHERE блаблабла 
                   ".(count($depth_list) > 0 ? : ' and id not in ('.join(',',$death_list).') ' : '')." -- отсеиваем мертвые файлы из запроса
        ORDER блаблабла
    limit 0,".$need_count);

    Вариант Б.
    Вы можете гарантировать, что контролируете целостность файлов.
    Тогда в таблице изображений делаете колонку is_del. Когда удаляете файл, вы должны пометить запись о файле в базе как удаленную по этому атрибуту.
    Если вы все таки частично контролируете целостность, то в определенный период времени (например, запускать скрипт по cron раз в час, сутки) вам нужно пройтись по всему списку файлов в базе и проверить целостность каждого файла, и внести актуальную метку is_del.
    Тогда получать живые файлы будет чуть-чуть проще:
    $database->setQuery("
        SELECT *
        from блаблабла
        WHERE блаблабла 
               and is_del is null -- или нулю, в зависимости, что будет по умолчанию
        ORDER блаблабла
    limit 0,".$need_count);
    Ответ написан
    4 комментария
  • Как изменить exe file?

    @alexalexes
    Если приложение не предусматривает использование отдельного конфиг файла с настройками видеорежима, то в общем случае - никак. Подобные характеристики заложены в файлах проекта у разработчиков приложения. Естественно, эти исходные файлы вам никто не предоставит.
    Есть вариант сделать реверс инжиниринг exe файла и попытаться найти нужные байты, отвечающие за видеорежим.
    Но если вы задаете такой вопрос, значит вы не знакомы с реверс инжинирингом. Чтобы им пользоваться, мало простого знакомства с процессом декомпиляции, нужно на этом собаку съесть.
    Ответ написан
    Комментировать
  • Какие проблемы могут возникнуть при работе программы с файлом БД из удаленной папки?

    @alexalexes
    Вариант с стандартным сервером БД, решающий все вопросы выше пока исключен.

    Вы не ищите легких путей. Перестаньте мыслить файлами с общим доступом в качестве хранилища. Эту роль как раз целиком и полностью берет полноценная СУБД в вашем кейсе.
    Ответ написан
    Комментировать
  • Как сделать такую штуку в HTML?

    @alexalexes
    Можно честно спиратить из vk.com плашку "Новые сообщения".
    <h4 class="im-page--history-new-bar _im_unread_bar_row">
    :before
    <span>Новые сообщения</span>
    :after
    </h4>
    Ответ написан
    Комментировать
  • Как извлечь данные записи бд по кнопке?

    @alexalexes
    В href записываете get параметр id строки.
    <a href="?id=1">см. запись</a>
    Если текущий список php используется для вывода всего списка, то скрипт нужно модифицировать так, что принимая параметр id, он начал работать по логике вывода сведений одной строки. Нет параметра - выводим все.
    if(isset($_GET['id']))
    {
      // тут код или вызов функции для работы с одной записью
    }
    else
    {
      // тут код или вызов функции для вывода всего списка
    }

    В ветке кода, где работаем с одной записью, подставляем get параметр в запрос:
    msqli_prepare("текст запроса ... where id = ?"); // ставим в нужное место запроса параметрические метки
    msqli_bind_param("i", $_GET["id"]); // передаем параметр на место меток-вопросов, в каком порядке они идут
    msqi_execute();
    // msqli_fetch функция и форматированный вывод сведений

    PS: msqli_* примерно накидал, смотрите документацию, как их вызывать. Идея и порядок кода примерно такой будет.
    Ответ написан
  • Как сформировать массив, длина которого будет равна количеству элементов, удовлетворяющих условию?

    @alexalexes
    Самое ленивое исправление - заменить n на k в двух местах.
    Console.WriteLine("\nЭлементы нового массива: ");
    for (int i = 0; i < n /* тут заменить на k */; i++)
                {
                    Console.Write(n_numbers[i] + " ");
                }
    
                Console.WriteLine("\nЗначение среднего арифметического нового массива: " + SearchAverage(n_numbers, n /* тут заменить на k */));
    Ответ написан
    6 комментариев
  • Как сверстать блок, чтобы дочерние элементы переносились на новую строку с учетом фиксированной кнопки в углу?

    @alexalexes
    Как упомянуто в соседнем ответе, будет очень костыльно и чисто для спортивного интереса.
    К тому же, есть ограничение на фиксированный размер элемента, которое вам не нужно.
    <style>
        div.container
        {
          display: flex;
          flex-wrap: wrap;
          width: 770px;
          height: 90px;
          background-color: green;
          overflow: hidden;
        }
        div.container > div
        {
          width: 60px;
          height: 25px;
          background-color: #df1245;
          text-align: center;
          margin: 5px;
          padding: 5px 0;
        }
        div.container > div:nth-child(n + 22) /*этим селекторам задаем свойство сортировки элементам, которые идут после кнопки "показать еще" если контейнер будет адаптивным, придется прописывать кучу вариантов nth-child */
        {
          order: 2;
        }
        div.container > label.more
        {
          display: block;
          width: 130px;
          height: 25px;
          margin: 5px;
          padding: 5px 0;
          text-align: center;
          order: 1; /* У кнопки стоит такой индекс сортировки чтобы оказаться между видимыми и невидимыми элементами */
          background-color: #78d412;
        }
        div.container label.more span.less
        {
          display: none;
        }
        #show-more-state
        {
          display: none;
        }
        #show-more-state:checked ~ div.container
        {
          height: auto;
        }
        #show-more-state:checked ~ div.container label.more
        {
          order: 3;
          margin-left: auto;
        }
        #show-more-state:checked ~ div.container label.more span.more
        {
          display: none;
        }
        #show-more-state:checked ~ div.container label.more span.less
        {
          display: initial;
        }
      </style>
      <input id="show-more-state" type="checkbox"/> <!-- Этим чекбоксом запонимаем состояние кнопки, чтобы можно было оттолкнуться стилями от превдокласса :checked -->
      <div class="container">
        <label class="more" for="show-more-state"><span class="more">ПОКАЗАТЬ ЕЩЕ</span><span class="less">СВЕРНУТЬ</span></label>
        <div>ITEM</div>
        <div>ITEM</div>
        <div>ITEM</div>
        <div>ITEM</div>
        <div>ITEM</div>
        <div>ITEM</div>
        <div>ITEM</div>
        <div>ITEM</div>
        <div>ITEM</div>
        <div>ITEM</div>
        <div>ITEM</div>
        <div>ITEM</div>
        <div>ITEM</div>
        <div>ITEM</div>
        <div>ITEM</div>
        <div>ITEM</div>
        <div>ITEM</div>
        <div>ITEM</div>
        <div>ITEM</div>
        <div>ITEM</div>
        <div>ITEM</div>
        <div>ITEM</div>
        <div>ITEM</div>
        <div>ITEM</div>
        <div>ITEM</div>
        <div>ITEM</div>
        <div>ITEM</div>
      </div>
    Ответ написан
  • Как быть с 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
    Второй пароль уязвим, если вы на всех системах, которые администрируете, устанавливаете пароль по похожей маске. Злоумышленнику достаточно узнать, как строится пароль к одной системе, чтобы иметь представление, как подбирать пароль к остальным. Злоумышленник будет использовать ровно ту логику, по которой вам удобнее запоминать пароль.
    Лучше не понижать энтропию ни у какой части пароля, использовать только генераторы случайных символов.
    Ответ написан