Vikhrmodels/habr_qa_sbs huggingface dataset:
Вопрос: Как исправить «subquery returns more than 1 row» в «after update» триггере?

Лучший ответ:
А что вы пытаетесь тут сделать? Вот конкретно этот подзапрос (SELECT id FROM test1) он для чего? Вы выбираете все записи из таблицы test1, что, как бы, очень подозрительно. А если там будет миллион записей?

У вас в триггере есть переменные NEW и OLD, указывающие на обновленную запись в таблице test1 - вот и используйте их, чтобы определить какие записи в таблице test2 вам нужно обновить.

Худший ответ:
у вас в UPDATE входит два подзапроса. какой-то из них возвращает больше одной строки, что не применимо в данной ситуации.

например, вот этот блок (SELECT value1 FROM test1) - 
в случае, если ваша таблица test1 содержит больше одной строки, этот запрос вернет их все.
если вам нужно получить новое значение столбца обновляемой таблицы, вы можете, как заметил комментатор выше, использовать NEW или OLD:
UPDATE `database`.`test2` SET `value1` = NEW.value1 * 2...

аналогично предыдущему, 
WHERE (`id` = (SELECT id FROM test1));
вернет столько строк с одним столбцом id, сколько существует в таблице test1, что не допустимо для оператора равенства.
если вам нужно обновить строку в таблице test2, id которой такой же, как и id у обновляемой записи в test1, то следует использовать NEW.id и ваш запрос приобретет следующий вид:

CREATE DEFINER=`root`@`localhost` TRIGGER `afupd_yzv2` AFTER UPDATE ON `test1` FOR EACH ROW BEGIN 
    UPDATE `database`.`test2` SET `value1` = NEW.value1 * 2 WHERE `id` = NEW.id
END
Вопрос: Облачная СУБД для чайника?

Лучший ответ:
Если сумеешь внятно и с разумными доводами ответить - зачем тебе именно облачное решение, как бы ты это не понимал, то тогда пользуйся, иначе лучше:
* арендуй vps-ку с ценами от 3.5$ в год (лучше что то от 3$ в месяц, памяти будет по больше)
* установи туда любую открытую/бесплатную базу данных mysql/postgres/...
* установи локально открытый/бесплатный GUI для баз данных, например devart dba studio express (по уму тебе хватит любой GUI с поддержкой построителя запросов)
* установи локально условно бесплатный ms visual studio community (лучше не последнюю версию) и создавай приложения на win forms для своей базы данных на столько просто, что мне кажется для мелких проектов не превзойденно.
Благодаря майкрософтовской экосистеме работа с ее продуктами будет почти бесшовна (тут тебе и эксель, и доступ к старой ms access, и огромное комунити).
При должном старании кстати .net приложения будут кроссплатформенными, кросс-языковыми (вон даже на python.net можно писать) и достаточно шутрыми (экосистема уровня java, может даже круче).
p.s. веб бакэнд на visual studio писать грустно, точнее результат будет требовать windows server, это обходится но уже не просто а значит при выборе на чем писать здесь и сейчас быстро просто не подходит.

Худший ответ:
AWS RDS - это те-же самые Oracle/Postgres/MySQL только запускаемые в хостингах Amazon.

Поэтому твой вопрос слегка скомкан. Что на самом деле тебе надо? SQL DBMS которая работает в облаке? Потому что  изучать это ты можешь установив локально бесплатные версии Oracle Express и других соотвественно.

Ты работаешь с документами в Google Sheets. Каких возможностей тебе не хватает? 

Обычно (99%) когда говорят об облачных БД имеют в виду NOSQL:
- Amazon DynamoDb
- Microsoft CosmosDb
- (у гугла тоже своё решение есть но я не вкурсе какое)

У них есть сильное конкурентное преимущество в виде дешевизны хостинга, бесконечного
размера и гарантированой пропускной способности. Тоесть оплаченной тобой пропускной 
способности.

Но платишь за это ослабнной консистентностью. Впрочем для большинства современных
юзкейсов этого хватает.
Вопрос: Как очистить очередь id в базе данных?

Лучший ответ:
Да, это нормальное поведение, но мне хотелось бы, чтобы запись имела id 9.Вам не приходило в голову, что это нормальное поведение не просто так? На моей памяти это уже 5 или 6 раз когда приходится объяснять что "это жжж неспроста...", в 7 раз уже лениво, просто прими как данность что так должно быть.  
Идиотский, но понятный даже чайникам пример - если это список пользователей, и ты удалил №9, а затем добавил нового с этим номером, у предыдущего пользователя могут остаться данные, которые к нему привязаны именно по этому номеру, и они (внезапно!) перепривяжутся к вновь созданному юзеру, что не есть хорошо. Механизм автоинкремента как раз гарантирует  неповторяемость идентификаторов, для вот таких случаев.

Худший ответ:
ALTER TABLE tablename AUTO_INCREMENT = 9

Но надо знать номер последней записи.
Вообще лучше не трогать автоинкременты, а создать отдельный столбец в котором будет по порядку всё нумероваться. И перенумеровываться.
Вопрос: Стоит ли учить нативную андроид разработку или следует перейти на кроссплатформенность?

Лучший ответ:
Точка входа в профессию сейчас достаточно высока, даже с хороших опытом иногда непросто найти работу, не говоря уже о самом начале работы. Так что войти в IT сейчас одинаково сложно с любой технологией. Даже клепание одностраничных лэндингов уже настолько забито, что пробиться начинающему почти невозможно.

И не смотрите на ютуб, там можно найти подтверждение любой точке зрения. Живы и имеют свои ниши и нативная, и кроссплатформенная разработка. Важно также понимать, что бизнесу (а именно он платит деньги) в общем то до лампочки, на чем ему сделали приложение, заказчику нужно просто красивое работающее приложение, которое будет приносить деньги.

p.s. субъективно, кроссплатформа прощает больше ошибок, так как там ниже требования к качеству кода и быстродействию, это из серии лишь бы работало. Если нужно быстродействие и оптимальный расход батареи, то нативная разработка пока еще не сдает позиции.

Худший ответ:
Люди, которые разбираются в мобильной разработке, зарабатывают мобильной разработкой, а не записыванием херни на ютубчиках.
Андроиду уже много лет, и по-прежнему есть нативная разработка под него, и есть кроссплатформенные решения. Потому что и то, и другое - реально нужно, просто в разных нишах. Если тебе надо связываться с фитнес-браслетом - тебе нужно по локоть влезать в систему, и кроссплатформенные решения будут только мешать. А если надо по-быстрому накидать клиентик к своему говносайтику - достаточно монстра на джаваскрипте, который в том числе и под мобилы заработает.
Мобильная разработка - это направление, а не ниша. В ней до хрена всякого разного, и никаких "более правильных ответов" на подобные идиотские вопросы нет и быть не может.

Ну, и искать надо не "где проще" или, тем более, "где перспективней". 
Надо искать, где ты сам сможешь что-то сделать и зацепиться, чтобы "вайтивайти". 
Потому что как бы хорошо ты ни выучил что бы то ни было, Гугль тебе тут же оффер, внезапно, не пришлет.
Вопрос: Как использовать ресурс другого ПК?

Лучший ответ:
Не нужны тебе "мощностя" друга.
Никаких "скоро" не появится.
Для начала изучи джава, потом будешь понимать что такое мощностя, ибо на текущий момент по уровню твоего вопроса, ты не дотягиваешь даже до продвинутого пользователя ПК.

Худший ответ:
Используй удаленный доступ.
Например - 
RDP
VNC
Teamviewer, Anydesk, аналоги

Нужна графика ?? - https://moonlight-stream.org/

Так же можно развернуть у него виртуалку или арендовать виртуалку
Вопрос: Как выяснить конкурентность на рынке мобильных игр?

Лучший ответ:
Глобально вы опоздали на десять лет, конкуренция везде, если вы не придумали что то новое в плане игр
Все делают мобильные игры

Худший ответ:
на этот вопрос нет ответа.  Амонг ас высрелил через несколько лет и то можно сказать случайно. 
А так если в теме нет конкуренции, то там нет и инсталов.  А все что наброло 1М инсталов массово клонируется. 

Крупный издатель за первые 2 недели в свою новую игру нагоняет через внутреннюю рекламу (читай бесплатную) 1М пользователь. А вом это обойдется от 20центов  до нескольких долларов за установку.
Вопрос: Стоит ли пополнять память разделенному диску С за счет диска D?

Лучший ответ:
Стандартная ситуация. Возникает в связи с традицией иметь системный диск и диск с данными. Раньше люди часто ОС переставляли и считалось хорошим тоном данные на втором логическом разделе иметь.

Решение очень простое. 
1. Переносите все данные с диска D на любой носитель (соседний комп, внешний диск).
2. В оснастке "управление дисками" выбираете диск D и удаляете его. Правой кнопкой мышки, удалить том. Должно образоваться "не занятое место" с черным окрасом.
3. Там же, на диске C, жмякаете правой кнопкой - расширить диск и указываете на сколько его нужно расширить. Рекомендую на все имеющееся пространство, и обходиться без диска D в дальнейшем.
4. Возвращаете ваши данные с внешнего носителя на диск C в какую-нить папку.

Это работает если вы не ставили на диск D всяких программ через установку удаление, процесс не требует особых навыков и сторонних утилит. Если такой способ не подходит, то есть всякие загрузочные диски со всякими утилитами для переразбивки дисков.

Худший ответ:
100Гб под современную Windows - катастрофически мало. Диск 500Гб можно и совсем не делить. Но, если уж очень хочется иметь два раздела, поделите хотя бы пополам.
Вопрос: Уроки по JavaScript?

Лучший ответ:
Давайте соберём ссылку на этот сайт по частям, я начинаю, а вы продолжаете в комментариях под этим ответом (например: я пишу https://qna, следующий комментатор пишет .habr, следующий .com)

https://learn

Худший ответ:
Под андроид приложение для подготовки к собеседованию.
JavaScript собеседник - android приложение, которое поможет тебе подготовиться к собеседованию по JavaScript, фреймворкам и библиотекам на основе языке JavaScript.

Открыть в Google Play: https://play.google.com/store/apps/details?id=ru.p...
Вопрос: Может ли телеграм бот читать exel файл который я ему отправил?

Лучший ответ:
Да, может. Это возможно. Изучай библиотеки работы с exel файлами и с телеграмм ботами.

Худший ответ:
Да, можно, если речь идет о Excel (а не exel).
Зависит от формата файла. Новый .xlsx читается довольно легко,  есть библиотеки для этого,но можно и средствами стандартной библиотеки Python - это просто zip-архив с пачкой xml-файлов внутри. Выковырять данные будет не очень трудно.

А вот старый .xls - это бинарный, плохо документированный формат. С ним будут проблемы.
Вопрос: Как описывать поле position в файле templateDetails.xml?

Лучший ответ:
Александр, ответ правильны, но вы человека Евгений невероятно запутываете дальше в комментариях)
Вот для примера https://master3.alekvolsk.info/ шаблон-болванка, там можно посмотреть и отследить как устроен шаблон joomla. Или если у вас joomla 3 смотрите стандарный шаблон protostar, если joomla 4 то cassiopeia.
Если вам надо меню как примитив(набор html) без редактирования в админке, можно просто в index.php шаблона добавить этот код в нужном месте. 
Если вы хотите чтобы меню можно было редактировать через админку в пунктах меню. То нужно использовать тип модуля для меню (Панель меню --> Расширения --> Модули) у него выбрать position, этот position через код в index.php в нужно месте конструкцией:
<?php if ($this->countModules('my-menu')) { ?>
            <jdoc:include type="modules" name="my-menu"/>
<?php } ?>
сам код, как именно будет формироваться меню можно посмотреть в папке modules/mod_menu/tmpl/ но лучше использовать стандартные переопределения в папке вашего шаблона templates/my_templates/html/mod_menu/
для примера переопределений: https://github.com/master3-blank-template/Master3/...
Думаю исчерпывающе ответил на ваш вопрос как это всё устроено, если что-то нужно уточнить, спрашивайте!)
Приходите в чате в телеге по https://t.me/joomlaru там вам оперативно помогут разобраться.

Худший ответ:
Тэг positions нужен для перечисления позиций для модулей, используемых в шаблоне.
Функция этого тэга только одна - в панели управления сайтом, когда выбираете позицию куда устанавливать модуль, джумла предлагает вам уже готовый список позиций. В противном случае приходилось бы прописывать название позиции вручную.

Пример:

Если у вас в файле index.php установлено несколько позиций, например:
<jdoc:include type="modules" name="social-share" />
<jdoc:include type="modules" name="contacts" />
<jdoc:include type="modules" name="main-menu" />

То в файле templatesDetail.xml нужно заполнить тэг positions следующим образом:
<positions>
        <position>social-share</position>
        <position>contacts</position>
        <position>main-menu</position>
    </positions>
Вопрос: Есть ли какие-то хорошие уроки по Symfony?

Лучший ответ:
Во первых книга по симфони есть в сети в свободном доступе.
Во вторых есть курс от Елесеева по симфони.  Достаточно глубоко раскрывает предметную область.  правда длится 50 часов наверное - не меньше.  Не у каждого хватит воли пройти этот курс. но оно того стоит.

Ну и есть сайт на котором выкладывают курсы и там если оплатить  месячный и ли годовой доступ то можно выкачивать любые курсы.  Но назвать этот сайт я вам не могу потому что меня могут забанить за это. Если надо пишите в личку.

Ну еще и Симфоникасты гдето лежат в сети. Да и на ютубе есть материал. 

Вот группа в телеграм посвященная Симфони расстроила. В силу последних военных операций в ней стало невозможно находиться если ты с РФ.

Худший ответ:
Создание API на Symfony 5
Вопрос: Какую программу выбрать для построение графиков сети предприятие?

Лучший ответ:
Графиков чего? :) Зависимости количества пакетов, идущих на порносайты от времени года? :D

Худший ответ:
Посмотрел что такое ciscopacket tracer. Это рисовалка диаграмм наподобие Microsoft Visio.
Вопрос: Можете посоветовать курсы/школу по html верстке?

Лучший ответ:
Нет таких.

Худший ответ:
Таких курсов ты не найдешь. Самое простое, сверстать что-то серьезнне одностраничника, добавить анимашки, подучить js (пригодится по-любому), и писать всем компаниям на стажировку (либо на полставки, либо же на бесплатной основе впервое время).
Вопрос: Как лучше реализовать транзакцию?

Лучший ответ:
В целом всё выглядит не плохо, но будет лучше, если контекст будем принимать на вход. Так же было не плохо отменять транзакцию в случае ошибки, ну и закрывать prepare тоже не помешает. На каждую итерацию цикла вовсе не обязательно содавать свой собственный prepare, достаточно одного

func (db *Requests) StorePhotos(ctx context.Context, photos []Photo) error {
	ctx, cancel := context.WithTimeout(ctx, time.Minute*2)
	defer cancel()

	tx, err := db.BeginTx(ctx, nil)
	if err != nil {
		return err
	}
	defer tx.Rollback()

	stmnt, err := tx.PrepareContext(ctx, "INSERT INTO photos (id, owner_id, req_id, url) VALUES ($1, $2, $3, $4)")
	if err != nil {
		return err
	}
	defer stmnt.Close()

	for _, photo := range photos {
		if _, err = stmnt.ExecContext(ctx, photo.ID, photo.OwnerID, photo.ReqID, photo.URL); err != nil {
			return err
		}
	}

	return tx.Commit()
}

Худший ответ:
insert into table (x,y,z) values (?,?,?), (?,?,?), (?,?,?), ...

а значения передавай как обычно сразу все, массивом, в правильном порядке
Вопрос: Как работать с библиотеками в Python?

Лучший ответ:
Я начинаю работать над новым проэктом.
Сначала выучи питон. Вопрос уровня кодера с 2мя неделями опыта программирования. И лучше проверяй вопрос на орфографию.

Худший ответ:
Немного дополню ответ Mark Chigrin:
В питоне есть модуль с переменной, в которой содержаться пути для поиска модуля:
import sys # сам модуль
sys.path.append(full_path) # добавление директории в список, по которому интерпретатор ищет модули
За счёт этого можно изменять проведение поиска модулей.
Вопрос: Теоретически будет ли работать данный комплект оборудования?

Лучший ответ:
Ну так они к одному свитчу подключены. Почему нет то...
Да, будет работать, судя по схеме оно в одной локалке

Худший ответ:
1. 90м могут быть проблемы.
2. коммутаторы желательно управляемые. 
Камеры они иногда виснут, их у вас много, на управляемом коммутаторе вы отключили порт, включили обратно, камера ребутнулась, а на каждом порту вы написали комментарий к какой камере он идет. 
На не управляемом коммутаторе вы взяли схему коммутации, нашли камеру, полезли в шкаф к коммутаторам, нашли соответующий коммутатор, выткнули из него порт,  после этого увидели, что погасла другая камера, коммутатор вы перепутали, нашли нужный коммутатор, выдернули порт и опять погасла другая камера, потому как ошибка в схеме коммутации, и вы в итоге с лестницей полезли к камере, потому как проще к ней слазить, чем разгребать ошибки схемы коммутации.
Вопрос: Запуск бота невозможен?

Лучший ответ:
В тексте ошибки написано, что вы пытаетесь использовать интенты, которые не разрешили на странице приложения. Перейдите на https://discord.com/developers/applications/ выберите вашего бота, перейдите во вкладку "Bot", после чего поставьте все галочки в категории "Privileged Gateway Intents" (presence intent, server members intent и message content intent). После этого пробуйте запускать вашего бота с "discord.Intents.all()", скорее всего проблема будет решена.

Худший ответ:
Попробуй просто импорт конфиг и вместе bot.run(TOKEN) -> client.run(config.TOKEN)
Вопрос: Как заранее знать уровень подготовки спрашивающего?

Лучший ответ:
Хорошо составленный вопрос содержит половину ответа :) По самой постановке вопроса, по описанию, по языку, который используется (не языку программирования, а именно языку общения, манерам, стилю, жаргону, фене), по его уместности в данной обстановке (особенно для вопросов типа "как сейчас заработать на фрилансе"), по полноте информации можно судить - стоит отвечать серьезно или же просто потроллить. Или вообще не тратить время :)

Худший ответ:
Перед вопросом дайте чтобы заполнил стандартный формуляр на определение уровня интеллекта, уровня уравновешенности, отсутствия психических заболеваний, а также индивидуальных личностных, религиозных предпочтений, принадлежности к меньшинствам и национальности.
На основании него делайте заключение как отвечать, и стоит ли вообще отвечать.
Вопрос: Какие способы общения есть между серверным и клиентским приложением?

Лучший ответ:
HTTP: REST, SOAP,...
P2P
WebSockets,
...
Обычное сетевое взаимодействие
7 уровней модели OSI тебе знакомы?

Худший ответ:
Общение по сети обычно идет через сокеты по TCP или UDP. Практически все API и протоколы более высокого уровня, используют этот транспорт.
В винде можно использовать DCOM. Он, конечно, то же использует сокеты и TCP/IP, но это скрыто от программиста. Под никсами то же есть похожие механизмы RPC, но они не встроены в ОС.
Вопрос: Как имитировать ЦОД?

Лучший ответ:
добавить задержки и нарушения работы сети netem tc  ??

Худший ответ:
использовать непохожие подсети для каждой и имена машин. Например maschine-1 machine-2 и auto-1 auto-2
и второй ответ
Вопрос: Как изменить тип объекта внутри самого объекта?

Лучший ответ:
Так как вы пытаетесь нельзя.
Создайте класс хранилище, который будет всем желающим отдавать А или Б (в виде класса С). А при необходимости заменять их.

Худший ответ:
Так как вы пытаетесь нельзя.
Создайте класс хранилище, который будет всем желающим отдавать А или Б (в виде класса С). А при необходимости заменять их.
Вопрос: Nginx, странно работает deny all. Что делать?

Лучший ответ:
У обычного префиксного location приоритет ниже, чем у location с регулярным выражением. 

Повысьте приоритет запрещающего правила модификатором ^~:
location ^~ /engine/ {
    deny all;
}

Худший ответ:
Видимо, добавить запрещающую директиву в другой локейшен - который обрабатывает php-файлы.
Вопрос: Как сделать что б while работал пока может?

Лучший ответ:
Выяснить, почему он зацикливается, и исправить.
Обходные варианты существуют, но они привносят куда больше проблем, чем решают.

Худший ответ:
Скинь код, мы не экстрасенсы
Вопрос: Как сверстать адаптивно блоки плиточкой?

Лучший ответ:
С помощью grid css
вот примеры
Можно и на Bootstrap сделать

Худший ответ:
Собственно нашел пример: https://codepen.io/geddski/pen/eKyEOM

Буду на его основе делать.
Вопрос: Как вывести элементы массива, которые начинаются на букву A?

Лучший ответ:
1. RTFM
Метод includes() проверяет, содержит ли строка заданную подстроку, и возвращает, соответственно true или false.
Метод startsWith() помогает определить, начинается ли строка с символов указанных в скобках, возвращая, соответственно, true или false.
2. (letterElement) => letterElement.includes(letterElement)Строка всегда содержит саму себя.

Худший ответ:
Решил данную задачу вот так
const arrayThree = ['Andrew','Dmitriy','Maksim','German','Dasha','Anastasia'];
const letter = 'A';

function functionFiltersItems (elementArray,elementLetter) {
   return elementArray.filter((element) => element.startsWith(elementLetter));
}
console.log(functionFiltersItems(arrayThree,letter));
Вопрос: Можно ли сделать linux «сервер» из старого android смартфона?

Лучший ответ:
У малинки хотя-бы есть разьемы для USB/Ethernet/HDMI. Это полноценный десктоп не хуже тех которые были в 90х. Даже лучше если сравнивать с Радио86 или Спектрум.

А что есть у телефона? Какая интеграция? Да это чертов кирпич в смысле интеграции. Даже ресет нормально нажать нельзя.

Худший ответ:
Смотри в эту сторону.
Ставил себе как-то Ubuntu Touch, так поиграться, ниче так.
Вопрос: Emergency mode после восстановления загрузчика grub, что делать?

Лучший ответ:
Сделайте:
lsblk -l -o PATH,FSTYPE,UUID,TYPE,LABEL
потом:
cat /etc/fstab

Худший ответ:
Проблема была из за того, что пока я восстанавливал загрузчик изменил UUID в файле /etc/fstab
Вопрос: Как сделать readinessProbe по тексту файла?

Лучший ответ:
вам не нужен cat и ненужный pipe - просто
grep -q "app start" /app/log

Но вы уверены, что это нормально - просматриивать целый лог файл каждую итерацию рединесс пробы?
Может быть все-таки лучше в программу добавить дополнительный ендпоинт и проверять ее через http пробу?

Худший ответ:
Как уже написали в соседнем ответе вы можете обойтись одним только grep, однако ваша ошибка в другом.
Во-первых, вы используете возможности shell, там где его нет.  Пайп это специальная команда, которая есть в sh и bash. А хелсчек exec вызывает программы напрямую.
Во-вторых, command это массив аргументов запуска. Каждая опция, каждый аргумент должен быть отдельным элементом массива, а вы просто дописали всё во второй элемент и оно распознаётся как один большой аргумент cat.

Делайте греп и помещайте каждую опцию в отдельный элемент списка.
Вопрос: Как можно заблокировать TOR средствами MikroTik?

Лучший ответ:
РКН уже сделал это за вас, добавив все ноды в чёрный список. Более нетривиальные варианты, слава богу, пока работают и микротиком их не побороть.

Худший ответ:
РКН значит не может заблочить, с их ресурсами, а Вы думаете сможете))

Максимум можете заблокировать список общеизвестных IP тора

Работать он после этого не перестанет, но будет заметно медленее

А зачем вообще ТОР то блокировать?
Вопрос: Как выбрать ОЗУ DDR3 на старый ноутбук?

Лучший ответ:
Согласно https://ark.intel.com/content/www/ru/ru/ark/produc...
Процессор i3-370M поддерживает до 8 гигабайт оперативной памяти
Частоты памяти
DDR3 800/1066
тее 1333 плашки заведутся, а вот 1600 могут и не завестись 
тее лучшим решением будет 2 планки sodimm ddr3 по 4gb с частотой 1333mHz от нормальных брендов, Samsung/Kingston/Hynix

Худший ответ:
У моего Acer Aspire процессор i3-330M. Родная память DDR3-1066. Для апгрейда брал с точно такой же частотой Corsair два модуля по 4G. Больший объём не поддерживается. Брать лучше два одинаковых модуля, чтобы работала двухканальность и были одинаковые timings.
Вопрос: Какие есть беспроводные наушники со сменным аккумулятором для ПК?

Лучший ответ:
Подберите удобные для вас наушники и просто купите их две пары. Пока одна заряжается, во второй работаете.

Худший ответ:
Погуглил за тебя.
Вариантом - миллион
https://shop-azalia.ru/nashniki/besprovodnye-naush...
https://aliexpress.ru/popular/bluetooth-headphones...
https://aliexpress.ru/item/1005004178268033.html?s...
https://3dnews.ru/1053147/polnostyu-besprovodnie-n...
https://aliexpress.ru/popular/%D0%BD%D0%B0%D1%83%D...

И вообще, это повтор
https://qna.habr.com/q/483069