Задать вопрос
  • Как быстро сделать список адресов для скачивания?

    @alexalexes
    Если прямо "на коленке" нужно написать и за 5-20 минут получить список url к определенной странице.
    То открываете консоль браузера F12.
    Открываете вкладку "элементы", чтобы изучать дерево документа.
    Также заходите во вкладку "консоль" и с помощью document.querySelector пытаетесь написать CSS селектор, чтобы дотянуться до нужного img узла изображения. Если вам нужна ссылка на то, что выводится тегом img, то забираете атрибут src. А оригинал изображения может лежать в соседнем атрибуте этого же тега, например, data-src - тогда забираем его.
    Далее, пробуем получить список узлов img по заданному селектору с помощью document.querySelectorAll.
    Если функция подхватывает все узлы, то результат готов. Вам нужно подставить в url-ы домен ресурса или адрес текущей страницы (без части запроса), так как ссылки могут быть относительны.
    Можно накопить результат в виде массива, перевести в JSON и забрать строчку JSON из консоли. Если еще проще, то склеить результат в строку через запятую и тоже забрать из консоли.

    В отдельных случаях одним CSS селектором можно не обойтись, чтобы забрать все ссылки, или img узлы лежат не в постоянной структуре.
    Тогда нужно в несколько этапов получать содержимое.
    Сначала нужно научиться дотягиваться до узла-контейнера списка элементов (элементы - не обязательно интересующие Img узлы, ими могут быть какие-нибудь карточки товаров - тоже контейнеры).
    Потом от контейнера-карточки пытаемся дотянуться до нужного изображения.
    Далее организуем forEach, чтобы перебрать контейнеры-карточки.
    Ответ написан
  • Делаю to do веб-приложение. Как реализовать логику повторения задач?

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

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

    ----------------------------------------
    Схема таблиц учетных данных пользователей

    Пользователь
    #* Код человека
    *Дата регистрации
    * ФИО
    *Адрес электронной почты
    * Хеш пароля

    -----------------------
    Схема таблиц прав доступа пользователей

    Шаблон роли пользователя (модель роли)
    #* Код шаблона
    * Название роли

    Действия прав доступа (справочник)
    1. Код действия
    2. Название действия (просмотр, назначение, отмены, удаления, переноса задачи, редактирования шаблонов задач, редактирования планировщика задач)

    Cвойства шаблона прав доступа
    1. Код свойства прав доступа
    2. Код шаблона роли
    3. Код действия прав доступа
    5. Код типа задач
    4. Дата создания свойства

    Роль пользователя (реализация роли пользователя)
    1. Код прав доступа пользователя
    2. Код шаблона роли
    3. Код пользователя

    ------------------
    Схема таблиц планировщика задач пользователей

    Тип задачи
    1. Код типа задачи
    2. Название типа задачи

    Шаблон задачи (модель задачи)
    1. Код шаблона задачи
    2. Код типа задачи
    3. Код родителя шаблона задачи (на сущность Шаблон задачи)
    4. Наименование задачи
    5. Описание задачи
    6. Дата создания шаблона
    7. Периодичность выполнения
    8. Код пользователя (номинальный куратор)
    9. Код пользователя (номинальный исполнитель)
    10. Дата назначения номинального куратора
    11. Дата назначения номинального исполнителя

    Календарь задач (реализация задач, он же планировщик)
    1. Код элемента
    2. Код шаблона задачи
    3. Дата начала выполнения задачи
    4. Дата окончания выполнения задачи
    5. Код пользователя (фактический куратор)
    6. Код пользователя (фактический исполнитель)
    7. Дата назначения фактического куратора
    8. Дата назначения фактического исполнителя
    ---------------------

    PS: Можете из этого перечня таблиц и их атрибутов нарисовать DFD диаграмму или диаграмму по Ричарду Баркеру. Правда, тут не обозначены явно связи, но можно догадаться по названию внешних ключей, как связаны таблицы.
    Ответ написан
    1 комментарий
  • Какую видеокарту выбрать на древний ПК?

    @alexalexes
    1. Докупить SSD, гигов на 240, не меньше.
    2. Потом купить комплект мамки DDR3/SATA3 + проц. i3 не ниже Ivy bridge поколения (трехтысячные номера моделей процессоров). Eсли в комплект войдет пару гигов озу - поставить на первое время.
    3. Добить емкость озу до 8 или 16 гиг DDR3. Если проц/мать поддерживает частоту 12800, то ориентироваться на такие планки.
    4. видео можно оставить, если что-то подвернется почти бесплатно, что-то до nvidia 560 (новее смысла ставить нет), то можете воткнуть эту затычку, хуже не будет.
    PS: Может выяснится, что у вас блок питания на 400 ватт (а может даже 350), и он не тянет новый комплект железа - купить на 450 ватт. Если он еще окажется с сертификатом 80plus - то супер.
    Ответ написан
    Комментировать
  • Как хранить массив внутри value каждой опции выпадающего списка selectize?

    @alexalexes
    Если переводить массив в JSON то там тоже будут кавычки и это возможно может сломать html.

    Если вы не самописной функцией создаете строку JSON, то в функции-энкодере json_encode уже есть механизмы экранирования, чтобы ваши данные не сбежали за пределы закодированного строкой значения в JSON. (речь идет пока об абстракции JSON, принятые меры экранирования для этого уровня экранирования html не касаются!)

    Каждой опции соответствует свой массив данных, которые я планирую записать в значение value в этой форме html.

    Если вы самописно генерируете html элемент и записываете свойства атрибута элемента, то вы сами должны позаботиться об экранировании на уровне этой абстракции. В php для генерации безопасной строки для подстановки в html существуют функции htmlspecialchars и htmlentities, только настройте их, какие кавычки нужно экранировать.
    Ответ написан
    Комментировать
  • Хочу понимать биты/байты и их друзей. Литература?

    @alexalexes
    Для простого объяснения как работает UTF-8 не нужно знать, какие конкретные размерности символов используются. Можно рассмотреть бытовую аналогию - печать на клавиатуре.
    Какая аналогия печати символов, если мы используем принцип unicode?
    На клавиатуре набираем Alt и код символа с ведущими нулями (пусть их будет всего восемь цифр в номере). Тогда, чтобы напечатать любой символ нам всегда нужно 9 нажатий клавиш.
    Какая аналогия печати символов, если мы используем принцип utf?
    У нас есть переключатель регистра сочетанием клавиш Alt+Shift+номер таблицы символов (пусть будет фиксированный 4 цифры). На первом регистре основные клавиши клавиатуры печатают англ. алфавит, на втором регистре - кириллицу, на третьем - регулярно используемые спец символы, на четвертом - греческий, на пятом - вязь и т.д.
    Чтобы нам начать печатать текст, нужно либо остаться на первом регистре (не использовать комбинацию переключения), либо если идет символ не из текущего регистра, то воспользоваться комбинацией переключения - в этом случае стоимость печати символа выходит 6 символов на переключение и 1 символ на печать. Следующие символы можно печатать в этом же регистре по 1 нажатию.
    Большинство человеческих текстов достаточно однородны, при принципе utf мы будем достаточно редко переключать регистр, на печать каждого символа будет уходить в среднем чуть больше одного нажатия клавиши. Если мы будем печатать тот же однородный текст принципом unicode, то будем каждый раз нажимать 9 клавиш.
    Utf принцип в этом смысле очень экономный выходит.
    По такой же аналогии "уплотняются" данные в реальной кодировке utf-8, utf-16 и т.д.
    Ответ написан
  • Как правильно организовать таблицы?

    @alexalexes
    1. Сделать правильную таблицу Client с полем год.
    2. Создать индекс на поле год.
    3. Сделать импорт из таблиц Client_ГОД в таблицу Client с указанием поля года.
    4. Переписать запросы, чтобы присутствовала таблица Client в контексте нужного года (выборка с параметром год).
    5. Если очень нужно ограничить выборку по нужному году (по соображениям разграничения прав), то для определенных запросов сделать view по нужному году, выдать права на view для определенного пользователя.
    Ответ написан
    Комментировать
  • Как сменить кодировку MySQL?

    @alexalexes
    В документации это есть:
    ALTER DATABASE ... CHARACTER SET ... COLLATE ...
    Версия 5.7
    Версия 8.0
    PS: Есть вариант сменить кодировку в коннекте phpMyAdmin, но как будет работать админка - надо смотреть.
    PPS: Бекапы никто не отменял, делайте данное действие на тестовой базе, либо при наличии копии.
    Ответ написан
    Комментировать
  • Как вывести в одной строке значения по нескольким строкам для одного ID с разными типами?

    @alexalexes
    select C.id_client,
      (select Cv.value from client_value as Cv where Cv.type = 'name' and Cv.id_client = C.id_client) as client_name,
      (select Cv.value from client_value as Cv where Cv.type = 'address' and Cv.id_client = C.id_client) as client_address
    from client as C
    Ответ написан
    Комментировать
  • Можно ли присвоить имя файла функции, которая в нём находится?

    @alexalexes
    Понимаю, хотите изобрести свой composer.
    $func_file_full_path = ''; // полный путь к файлу модуля с функцией
      require_once ($func_file_full_path);
      $func_name = basename($func_file_full_path,  '.php');
    
      $funct_name($func_arg1, $func_arg2....); // если попытаться вызвать переменную как функцию, то интерпретатор PHP попытается обратиться к глобальной функции по имени что содержится в этой переменной в виде строки.
      
      call_user_func($funct_name, $func_arg1, $func_arg2....); // то же самое, но в более классическом виде
    Ответ написан
    3 комментария
  • Возможна ли замена матрицы без замены тачскрина на ноутбуке Lenovo?

    @alexalexes
    Даже если физически возможно отделить матрицу от тачскрина, то ни один мастер не возьмется за эту операцию, так как результат отделения и обратной склейки непредсказуем. Можно разбить тачскрин, либо приклеить с мутными следами. Надежнее и предсказуемо заменить сразу всем модулем.
    Ответ написан
    Комментировать
  • Как в php заполнить автоматически массив данными?

    @alexalexes
    $out_arr = [];
    // Тут нужно указать параметры каждого N - места в шаблоне
    $i_min = 1; $i_max = 9;
    $j_min = 1; $j_max = 9;
    $k_min = 1; $k_max = 9;
    for($i=$i_min; $i <= $i_max; $i++)
    {
      for($j=$j_min; $j <= $j_max; $j++)
      {
        for($k=$k_min; $k <= $k_max; $k++)
        {
           $out_arr[] = "ваш".$i."шаблон".$j."строки".$k;
        }
      }
    }
    var_dump($out_arr);
    Ответ написан
    Комментировать
  • Как получить timestamp,обрезав пустое время?

    @alexalexes
    komino, это проблема разработчика, а не конфига драйвера СУБД, как он будет интерпретировать значение даты в конкретном запросе, если ему не подходит статичный шаблон nls_date_format. Такой шаблон не имеет в себе лексического интерпретатора, способного выполнять условные операторы.
    Решение:
    select
    -- вариант 1
    to_char(sysdate, 'DD.MM.YYYY' || decode(sysdate - trunc(sysdate), 0, '', ' HH24:MI:SS')) as your_format_date_1, 
    -- вариант 2
    case
      when sysdate - trunc(sysdate) > 0
      then to_char(sysdate, 'DD.MM.YYYY HH24:MI:SS')
      else to_char(sysdate, 'DD.MM.YYYY')
    end as your_format_date_2
    from dual;
    Ответ написан
  • Как НЕ фиксировать транзакцию после отработки php скрипта?

    @alexalexes
    $_POST['SQL'];
    Ой, вы доверяете клиенту настолько, что позволяете ему самому формировать текст запроса для бэкенда?
    У такой модели взаимодействия уровень безопасности еще ниже, чем у подготовленных запросов со строковой склейкой параметров.
    Идеология выполнения скриптов в PHP такая, чтобы выполнить все атомарные действия, зафиксировать результат (или откатиться), отдать ответ и умереть.
    Есть какие-то примеры данного "фокуса"?

    Есть. Технология называется web sockets, она представляет другую идеологию - называется длинные запросы. Когда клиент открывает соединение с сервером и ждет от сервера сообщений (или сам их отправляет в соккет), при этом скрипт сервера в бесконечном цикле опрашивает открытый соккет. Не завершая скрипт, на сервере можно либо ожидать появление сообщения в соккете, либо выполнять что-то по транзакции, если имеется принятое сообщение.
    Проблема еще в том, что PHP не сильно приспособлен для этого режима. Вам придется делать бесконечную петлю обработки в скрипте:
    while(true)
    {
      // исполняемый код для всех клиентов соккетов
    }

    И вам нужно самим делать механизм сессий, чтобы отличать одного клиента от другого, поскольку запущенный скрипт будет принимать сообщения от всех клиентов.
    Для этих целей больше годится NodeJS. Там все соккеты разбиты по обработчикам событий, можно выделить контекст одного конкретного клиента.
    Резюмируя, могу сказать.
    а) Вы пишите свой продвинутый редактор запросов (а-ля PHPMyAdmin но с поддержкой транзакций) и у вас неправильно выбран вид сервера для бэкенда (PHP вместо NodeJS). Технические требования для взаимодействия клиента и сервера не имеют подходящей реализации технологии на сервере (web sockets).
    б) Либо у вас приложение не предполагает работы, связанной с редактированием запросов пользователем. Вы просто переносите опыт разработки desktop приложений на веб разработку.
    В этом случае вы не правильно делаете то, что формируете запросы на клиенте. Толстую бизнес-логику, предполагающую взаимодействие с базой данных с фиксацией или не фиксацией транзакции нужно переносить на бэкенд, либо в хранимые процедуры и функции СУБД.
    Ответ написан
    2 комментария
  • Как спасти ноутбук?

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

    @alexalexes
    Функция ViewGifImage не нативная, а скорее всего ее реализация прописана в какой-то подключаемой библиотеке JS.
    Нужно погуглить спецификацию этой библиотеки, и посмотреть в доках, за что отвечает параметры в функции ViewGifImage.
    Если я предположу (я не знаю, что за библиотека и не видел ее документации!), что первый параметр отвечает за указатель на html узел, куда вывалить бинарный ресурс изображения, то нужно как-то обозначить теги, чтобы указатели на эти теги выцепить из DOM через JS. Например, я хочу им задать уникальные идентификаторы:
    <img id="image-1234" src="/какой-то путь/qa_2023-02-01-212831-1.gif">
    <img id="image-5678" src="/какой-то путь/qa_2023-02-01-212831-2.gif">

    Тогда из DOM я буду доставать указатели на эти элементы через функцию getElementById.
    <script type="text/javascript">
    let image_1234 = document.getElementById("image-1234"); // тут получаем ссылку на элемент с id="image-1234"
    // далее, используем ее вместо this
    ViewGifImage(image_1234, 'sitedb/log/QA/General/SfpBCTuningCheck/gfx/qa_2023-02-01-212831-1.gif','sitedb/log/QA/General/SfpBCTuningCheck/gfx/qa_2023-02-01-212831-1.pix','322','242','ReflectionResultPlot','Frequency in MHz','0','Reflection Factor |r|','0','1','xffffff x000000 x000000 xff0000 x0000ff x00df00 xff00ff xff7f00','2','158','1','Reflection 0 Degrees','158','1','Reflection 90 Degrees','','','','','','','','','');
    
    let image_5678 = document.getElementById("image-5678"); // тут получаем ссылку на элемент с id="image-5678"
    // далее, используем ее вместо this
    ViewGifImage(image_5678, 'sitedb/log/QA/General/SfpBCTuningCheck/gfx/qa_2023-02-01-212831-2.gif','sitedb/log/QA/General/SfpBCTuningCheck/gfx/qa_2023-02-01-212831-2.pix','322','242','TransmissionResultPlot','Frequency in MHz','0','Transmission |t| in db','0','1','xffffff x000000 x000000 xff0000 x0000ff x00df00 xff00ff xff7f00','2','158','1','Transmission 0 Degrees','158','1','Transmission 90 Degrees','','','','','','','','','')
    </script>
    Ответ написан
  • Как определить точную модель видеокарты?

    @alexalexes
    Диспетчер устройств -> свойства устройства -> вкладка "Сведения" -> Свойство "ID оборудования".
    Копируем первую строчку вида через Ctrl+C:
    "PCI/VEN_****&DEV_****&SUBSYS_*"
    На сайте https://driver.ru/Search/ выбираем "Поиск по ID" и вставляем ID.
    В результатах поиска будет написано:
    "Это Device ID от <устройство>"
    Если поиск не дал результат, то пытаемся укоротить ID до следующего амперсанта, например:
    "PCI/VEN_****&DEV_****"
    Как правило, VEN и DEV достаточно, чтобы выйти на конкретную модель устройства.

    PS: Для подробного анализа характеристик именно видеокарт есть утилита GPU-Z.
    Ответ написан
    1 комментарий
  • Можно ли подключить старый монитор с VGA к видеокартам с цифровыми разъемами и наоборот?

    @alexalexes
    Но вот беру я в руки видеокарты и там везде DVI-D, а беру переходники на аналог и там DVI-I - VGA. Ну и для кого они, спрашивается?

    Для той эпохи видеокарт (приблизительно до тысячной линейки nvidia), когда существовал переходный период, когда у дешевых ЖК мониторов был VGA. Сейчас даже новому дешевому монику не положено иметь что-то ниже стандарта HDMI.
    В какую сторону работают? Что во что конвертируют?

    Только документация к конвертеру может сказать про порядок откуда и куда и поддерживаемый перечень выходных размеров картинки (или в описании к товару четко должно быть прописано направление "from стандарт_1 to стандарт 2"). В названии конвертера продавец очень легко может перепутать вход и выход.
    Если цифру в аналог без проблем можно переделать, почему все видеокарты с DVI-D?

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

    @alexalexes
    Если появляются двойные срабатывания, я обычно, разбираю эту деталь иголкой прямо на плате, не прибегая к помощи паяльника. Чищу все пятаки якоря зубочисткой или тонкой отверткой, в зависимости от степени окисления этих пятаков, и потом собираю всё обратно. Хватает такого обслуживания на год.
    Ответ написан
    1 комментарий
  • Странное поведение document.write()?

    @alexalexes
    Для записи многострочного текста в качестве параметра или переменной в JS нужно использовать обратные кавычки.
    // Как у вас:
    let a = 'Много
    строчный
    текст';
    // как корректно
    let a = `Много
    строчный
    текст`;
    // как выкрутиться, если у вас не ES6
    var a = "Много\
    строчный\
    текст";
    Ответ написан
  • Существует ли такой разъем xlr?

    @alexalexes
    Вроде существуют:
    https://aliexpress.ru/item/1005004488552588.html
    Ответ написан
    Комментировать