не работает клавиатура частично в rimworld нативно
не работает клавиатура, только цифры и стрелки, в приоритете сверху английская раскладка, запуск игры с английской раскладкой также не помогает Arch Linux Gnome 48 Wayland
не работает клавиатура, только цифры и стрелки, в приоритете сверху английская раскладка, запуск игры с английской раскладкой также не помогает Arch Linux Gnome 48 Wayland
Данная статья написана с целью концентрации знаний о сжатии данных оперативной памяти.
Я использую gentoo, поэтому имена пакетов будут приводиться в формате этого дистрибутива.
Подразумевается, что читающий имеет желание и возможность (одно из):
( читать дальше... )
Многие слышали о проекте Homebrew. Возможно, кто-то знает, что пакеты из этого репозитория можно установить и на Linux.
Для меня было неожиданностью, что на Linux также можно установить пакеты из дерева pkgsrc (NetBSD).
На поверку оказывается, что пытаться устанавливать бинарные пакеты посредством pkgin смысла нет, т.к. они собраны на RHEL 7.x и зависят от библиотек в /lib64, а не в /lib/x86_64-linux-gnu, как принято на Debian. Тем не менее, многие пакеты можно собрать из исходного кода (хотя многие другие, увы, сломаны — по крайней мере, в смысле сборки на Linux).
В сухом остатке: если Homebrew годится для установки чего-нибудь «хипстерского» и «модного», типа wezterm, btop или atuin, то pkgsrc можно использовать для быстрой установки чего-то, что давно закопали (как, например, GTK+ первой версии, gCvs, xosview или системный монитор в виде не совсем одетой барышни).
Но, используя любую из экосистем, можно установить и вполне современный Clang, и вполне современный CMake.
На снимке:
tabbed surf -e.brew deps --graph --dot %s | dot -Tx11).pkgdepgraph | dot -Tx11).Собственно в чем суть. Есть новые интеловские процессоры начиная с метеорлейка , arrow тоже такой же и видимо все последующие линейки плиточных интелов будут такими же. Там есть SOC-плитка с двумя E-ядрами - они последние в списке. В моем случае 125Н это CPU 16 и 17. Остальные P и E ядра на другой плитке, и суть интеловской идеи при легкой нагрузке и в режиме сна S0iX отключать процессорную плитку полностью, а все легкие ждущие задачи крутить на ядрах SOC плитки. Ее по любому не отключишь - там контроллер памяти, порты , шина и прочая хабовая часть.
Под оффтопом так и работает, а вот онтопик бутится всегда с CPU0. Засунуть команду в ядро ограничить количество CPU на буте можно - но это всегда будет CPU0 а это всегда жручий P-core. И соффланить его потом после загрузки с передачей всех функций на 16 или 17 cpu не выходит. Нагрузку через шедьюлер можно перебросить на E-ядра (с этим отлично справляется intel_lpmd) - но вот разные служебные ядерные процессы продолжают вертеться на CPU0 что не позволяет отключить плитку с ядрами поностью и перейти на SOC. Поэтому вот и ищется странное - как заставить линукс грузиться с определенного ядра.
Gorky 17 — ролевая компьютерная игра, разработанная польской компанией Metropolis Software и выпущенная Monolith Productions для Microsoft Windows в 1999 году. Позже игра была портирована на Linux фирмой Hyperion Entertainment и выпущена Linux Game Publishing в 2006 году.
Здесь мы рассматриваем именно нативную для Linux версию.
Начнем с инсталятора:
ldd gorky18-installer-2009.01.14.bin
linux-gate.so.1 => linux-gate.so.1 (0xf7f59000)
libpthread.so.0 => /lib32/libpthread.so.0 (0xf7f2f000)
libz.so.1 => /lib32/libz.so.1 (0xf7f16000)
libbz2.so.1 => not found
libdl.so.2 => /lib32/libdl.so.2 (0xf7f11000)
libm.so.6 => /lib32/libm.so.6 (0xf7e44000)
libc.so.6 => /lib32/libc.so.6 (0xf7c1d000)
/lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0xf7f5b000)
mkdir lib
cp /lib32/libbz2.* lib
export LD_LIBRARY_PATH="./lib"
cd lib
ls -s libbz2.so libbz2.so.1
./configure --prefix=/usr --libdir=/usr/lib32
make
make DESTDIR=$PKG install
mv $PKG/usr/bin/aoss $PKG/usr/bin/aoss-32
rm -r $PKG/usr/share/man/
rm $PKG/usr/include/oss-redir.h
export CFLAGS="${CFLAGS} -m32"
export CXXFLAGS="${CXXFLAGS} -m32"
export LDFLAGS="${LDFLAGS} -m32"
export PKG_CONFIG_LIBDIR="/usr/lib32/pkgconfig"
aoss-32 ./gorky18
Как-то в один из выходных дней разгребал у себя барахло и наткнулся на китайское чудо света – Prestigio Visconte Quad 3GK (характеристики на фото…).
Сиё чудо досталось мне с предустановленной win10, которая с течением времени (наверно байты на распаянной флешке засохли) перестала запускаться. С удивлением обнаружил, что данная железка оборудована uefi bios и после небольшого гуглинга оказалось, что это чудо способно без проблем загружать и линукс.
Не долго думая, решил готовить загрузочную флешку с Debian, но загрузиться с неё, к сожалению, не получилось. «Не беда», подумал я и подготовил загрузочную флешку с Arch Linux.
Воткнул флешку через OTG, выбрал в меню биоса нужный efi-файл, с которого нужно грузиться и вуаля, установочный образ арча в работе.
Процесс установки ничем не отличается от десктопного варианта, разве что пришлось загрузчик брать systemd-boot.
После некоторого шаманства мне удалось загрузить Арч, дальше дело дошло до настройки пользователей, сети и так далее…
Но зачем планшет, если его нельзя тыкать пальцем? Правильно, поэтому ставлю Gnome3 – наиболее подходящее DE под тыкательные дела. Ставим, запускаем GDM и…обнаруживаем, что не работает тачскрин :( Сначала полез в DMESG, где вываливается ошибка при загрузке firmware, которое отвечает за тачскрин… По итогу, на 4pda нашёлся рабочий firmware, который позволил заработать пальцетыкалке.
Пришло время ковыряний… Как и ожидалось, мне стало грустно – некрожелезо планшета хоть и тянет Арч + Гном3, но комфортно пользоваться этим добром невозможно. Один гигабайт RAM сразу забивается, остальное уходит в SWAP. Микрофризы, периодические зависания не добавляют радости. Видео воспроизводится, даже 1080p, но через пару минут планшет может зависнуть. Камера и блютуз не заработали, яркость экрана не настраивается, в гибернацию железка уходит, но не просыпается. Гироскоп отрабатывает некорректно. В остальном - всё как на десктопе.
Если писать в целом – это работает, но приятного опыта взаимодействия не принесёт. Явно не хватает производительности. Нужен большой напильник и более мощная железка.
Сейчас думаю, что делать с этим барахлом. У меня есть три варианта:
А вы что думаете на этот счёт?
P.S. Остальные дистры можно на этом планшете запустить благодаря замечательному решению в этой git-репе.
LightDiver, вот пример твоего кейса и наглядный пример, что ты не то оптимизируешь, никаких регэкспов не надо, все проходится прямо. Если у тебя исходные условия - не влезаешь в ограниченную память, то это тоже решабельно.
function mylen(s,n)
local count
for i = 1, n do
count = #s
end
return count
end
function u8( s )
local wstring = {}
local char = 0
for i = 1, #s do
local byte = s:byte(i)
if byte < 128 then
char = char + 1
wstring[char] = string.char(byte)
elseif byte >= 194 and byte <= 244 then
char = char + 1
if byte <= 223 then
wstring[char] = string.char(byte)..string.char(s:byte(i+1))
i = i + 1
elseif byte <= 239 then
wstring[char] = string.char(byte)..string.char(s:byte(i+1))..string.char(s:byte(i+2))
i = i + 2
else
wstring[char] = string.char(byte)..string.char(s:byte(i+1))..string.char(s:byte(i+2))..string.char(s:byte(i+3))
i = i + 3
end
end
end
return wstring
end
function benchm(s,n)
local wstring = {}
for i = 1, n do
wstring = u8( s )
end
return wstring
end
local text = "Привет ♥ мир!"
local wstring = u8(text)
local time = os.clock()
print(mylen(wstring, 100000)) --- <-- TABLE a hundred thousand iterations (omg!)
print("Прошло: " .. os.clock()-time) --- <-- as fast as native #s, since it IS native)
time = os.clock()
benchm(text, 100000) --- <-- Instantination consumes time, but once, need optimization
print("Прошло: " .. os.clock()-time)
print(text)
for i = 2, #wstring do --- <--- wow, ORLY? O_o
print( wstring[i] ) --- <--- native unicode bychar
end
./test.lua
13
Прошло: 0.002469
Прошло: 0.41051
Привет ♥ мир!
р
и
в
е
т
♥
м
и
р
!
Есть файл *.xlsx с данными по телефонии от стороннего сервиса. Необходимо произвести расчёт по определенным критериям. Одна из колонок с данными содержит цифровые значения, но перед данными стоит апостроф «’», который никак не убирается, так и остаётся, например, ’1,67.
Гуглил, ничего из найденных мною методов не помогает. В других версиях LO апострофа нет, но так же расчёт не производится как при текстовом виде ячейки. Помогите, пожалуйста, разобраться, в чём проблема и как её решить.
LibreOffice Version: 24.8.4.2 (X86_64)
Решение: Проблема была в разделителе целой и дробной части, поменяли шаблон выгрузки.
Есть вот такой скрипт записи экрана.
sleep 2;
TIME="00:00:58"
ffmpeg \
-f alsa -i default -ac 2 \
-f x11grab -video_size 1080x1920 -framerate 30 -i :0.0+1300,400 -vf format=yuv420p -t ${TIME} /tmp/output.mp4 -y
ffplay /home/sobaka/smooth-completed-notify-starting-alert-274739.mp3
Всё зашибись, но хочу видеть на экране рамочку вокруг записываемого места, чтобы точно видеть во время записи, что попадёт в видос, а что будет за границей. Пасиба.
О Т В Е Т
Вот это надо запихать в ПРАВИЛЬНОЕ место командной строки, где-то после -f x11grab, точно не помню:
-show_region 1
Кто имеет опыт работы с новыми средствами для распознавания речи? Что порекомендуете на десктопную машину без CUDA/OpenCL? Свободное или бесплатное. Английский, русский, французский, украинский, испанский. Скорость распознавания хотя бы 1:1.
P.S. Превращать в текст звуковые файлы.
Ответ: Vosk вполне устраивает.
Привет, ЛОР!
Вышла бета-версия достаточно интересного дистрибутива Chimera Linux. От других дистрибутивов Chimera отличается отсутствием утилит и библиотек GNU и использованием кода из систем BSD. Для сборки используются LLVM и musl с аллокатором mimalloc от Microsoft. В качестве системы инициализации поставляется Dinit. Средой рабочего стола по умолчанию является GNOME. Менеджером пакетов дистрибутива является APK (из Alpine Linux).
Chimera является бинарным дистрибутивом с готовыми сборками под архитектуры x86_64, ARM AArch64, POWER и RISC-V. Для энтузиастов также доступна сборка из исходного кода.
>>> Подробности
Есть два эквивалентных примера:
#include <stdatomic.h>
int main() {
int v[2], * p0 = v, * _Atomic p1 = v;
if (p0 != p1) return 1;
if (++p0 != ++p1) return 2;
if (++p0 != (atomic_fetch_add_explicit(&p1, 1, memory_order_relaxed), p1)) return 3;
}
#include <atomic>
using namespace std;
int main() {
int v[2], * p0 = v; atomic<int*> p1 = v;
if (p0 != p1) return 1;
if (++p0 != ++p1) return 2;
if (++p0 != (p1.fetch_add(1, memory_order_relaxed), p1)) return 3;
}
C-версия делает return 3. Из-за того, что atomic_fetch_add_explicit(&p1, 1, memory_order_relaxed) компилируется в lock addq $0x1,-0x10(%rsp). В C++ lock addq $0x4,-0x10(%rsp) - как и должно быть, учитывает тип. Это баг какой-то или так специально сделано? Зачем?
Хочу утилиту, похожую вот на это, но не привязанную к конкретному редактору. Хочу видеть граф вызова функций для сишного кода, с возможностью отключать неинтересные ноды, указывать интересные, и крутить граф в разные стороны. Очень хочу избежать страдания с graphviz и gtags. Лучше всего, если будет человеческий UI, который можно вертеть мышкой.
Как правильно запускать на основной машине, от основного юзера (с хомяком в котором ~/.ssh/id_rsa.pub например) игры, которые естественно проприетарные и иногда даже неофициальной сборки, где есть риск закладки и зловреда, но запускать их в чистой виртуалке невозможно т.к. значительно падает производительность. Заходить в другой tty, либо заводить другой компьютер для игр, это очевидные варианты, но неудобные и не всегда возможные.
Спасибо за ответы.
Ну в общем сабж, если конкретно то пусть будет версия 3.2 . Из того, что пробовал: скомпилировать из сырцов - ошибка компиляции, пакеты из древних дистров - неудовлетворенные зависимости. Что получилось - сделать новое окружение в анаконде, но там минимальная версия 5.4. Что не пробовал - chroot, docker и ВМ. Все же это излишне кмк.
Пытаюсь написать мини-программу для определенной задачи, но нужно, чтоб программа принимала аргументы из терминала
После компиляции и запуска программы
./programm argument
выдает ошибку This application can not open files.
Сама программа работает, но аргументы не принимает, как фиксить?
#include <gtk/gtk.h>
void
createInterface(GtkApplication *app)
{
GtkWidget *window = gtk_application_window_new(app);
gtk_window_set_title(GTK_WINDOW(window), "Window");
gtk_window_set_default_size(GTK_WINDOW(window), 200, 200);
gtk_window_present(GTK_WINDOW(window));
}
int
main(int argc, char **argv)
{
GtkApplication *app = gtk_application_new("org.gtk.example", G_APPLICATION_DEFAULT_FLAGS);
g_signal_connect(app, "activate", G_CALLBACK(createInterface), NULL);
g_application_run(G_APPLICATION(app), argc, argv);
g_object_unref(app);
return 0;
}
Многие пользователи Linux с большим стажем даже не подозревают о существовании этих замечательных инструментов, которые способны облегчить им жизнь…
( читать дальше... )
Владельцы умельцы, поведайте подробнее о картах от синих, открытые ли драйвера, насколько пригодны для десктопа и как быстро развиваются. Предпочтительно инфа на арч, если сидите на нём.
В последнее время ютуб затеял какую-то реорганизацию и стал убирать из некоторых своих видео формат 22 (720p, единый файл, не dash). Может я наговариваю, конечно, на ютуб, но формат best (720p) всегда был, имхо.
Оказывается есть возможность получать другую таблицу форматов, отличную от дефолтной. У yt-dlp есть параметр --extractor-arg "youtube:player_client=mediaconnect" ([youtube] Format 22 is only sometimes extracted for some videos #10206).
Дефолтная таблица форматов:
$ yt-dlp -F 'https://youtu.be/eUyr9MJnj4w'
Extracting cookies from firefox
Extracted 1328 cookies from firefox
[youtube] Extracting URL: https://youtu.be/eUyr9MJnj4w
[youtube] eUyr9MJnj4w: Downloading webpage
[youtube] eUyr9MJnj4w: Downloading ios player API JSON
[youtube] eUyr9MJnj4w: Downloading player 5b22937f
[youtube] eUyr9MJnj4w: Downloading m3u8 information
[info] Available formats for eUyr9MJnj4w:
ID EXT RESOLUTION FPS CH │ FILESIZE TBR PROTO │ VCODEC VBR ACODEC ABR ASR MORE INFO
────────────────────────────────────────────────────────────────────────────────────────────────────────────────
sb3 mhtml 48x27 0 │ mhtml │ images storyboard
sb2 mhtml 80x45 1 │ mhtml │ images storyboard
sb1 mhtml 160x90 1 │ mhtml │ images storyboard
sb0 mhtml 320x180 1 │ mhtml │ images storyboard
233 mp4 audio only │ m3u8 │ audio only unknown Default
234 mp4 audio only │ m3u8 │ audio only unknown Default
139 m4a audio only 2 │ 1.32MiB 49k https │ audio only mp4a.40.5 49k 22k low, m4a_dash
249 webm audio only 2 │ 1.30MiB 48k https │ audio only opus 48k 48k low, webm_dash
250 webm audio only 2 │ 1.70MiB 63k https │ audio only opus 63k 48k low, webm_dash
140 m4a audio only 2 │ 3.51MiB 129k https │ audio only mp4a.40.2 129k 44k medium, m4a_dash
251 webm audio only 2 │ 3.51MiB 130k https │ audio only opus 130k 48k medium, webm_dash
602 mp4 256x144 15 │ ~ 2.33MiB 86k m3u8 │ vp09.00.10.08 86k video only
394 mp4 256x144 30 │ 1.68MiB 62k https │ av01.0.00M.08 62k video only 144p, mp4_dash
269 mp4 256x144 30 │ ~ 4.16MiB 154k m3u8 │ avc1.4D400C 154k video only
160 mp4 256x144 30 │ 1.55MiB 57k https │ avc1.4D400C 57k video only 144p, mp4_dash
603 mp4 256x144 30 │ ~ 4.18MiB 154k m3u8 │ vp09.00.11.08 154k video only
278 webm 256x144 30 │ 2.35MiB 87k https │ vp9 87k video only 144p, webm_dash
395 mp4 426x240 30 │ 2.70MiB 100k https │ av01.0.00M.08 100k video only 240p, mp4_dash
229 mp4 426x240 30 │ ~ 5.70MiB 211k m3u8 │ avc1.4D4015 211k video only
133 mp4 426x240 30 │ 2.35MiB 87k https │ avc1.4D4015 87k video only 240p, mp4_dash
604 mp4 426x240 30 │ ~ 7.76MiB 287k m3u8 │ vp09.00.20.08 287k video only
242 webm 426x240 30 │ 3.59MiB 133k https │ vp9 133k video only 240p, webm_dash
396 mp4 640x360 30 │ 5.02MiB 186k https │ av01.0.01M.08 186k video only 360p, mp4_dash
230 mp4 640x360 30 │ ~ 11.41MiB 421k m3u8 │ avc1.4D401E 421k video only
134 mp4 640x360 30 │ 4.13MiB 153k https │ avc1.4D401E 153k video only 360p, mp4_dash
18 mp4 640x360 30 2 │ ≈ 7.64MiB 282k https │ avc1.42001E mp4a.40.2 44k 360p
605 mp4 640x360 30 │ ~ 15.03MiB 555k m3u8 │ vp09.00.21.08 555k video only
243 webm 640x360 30 │ 6.06MiB 224k https │ vp9 224k video only 360p, webm_dash
397 mp4 854x480 30 │ 8.40MiB 310k https │ av01.0.04M.08 310k video only 480p, mp4_dash
231 mp4 854x480 30 │ ~ 15.17MiB 561k m3u8 │ avc1.4D401F 561k video only
135 mp4 854x480 30 │ 6.09MiB 225k https │ avc1.4D401F 225k video only 480p, mp4_dash
606 mp4 854x480 30 │ ~ 20.80MiB 769k m3u8 │ vp09.00.30.08 769k video only
244 webm 854x480 30 │ 8.50MiB 314k https │ vp9 314k video only 480p, webm_dash
398 mp4 1280x720 30 │ 14.51MiB 536k https │ av01.0.05M.08 536k video only 720p, mp4_dash
232 mp4 1280x720 30 │ ~ 24.57MiB 908k m3u8 │ avc1.4D401F 908k video only
136 mp4 1280x720 30 │ 11.09MiB 410k https │ avc1.4D401F 410k video only 720p, mp4_dash
609 mp4 1280x720 30 │ ~ 31.59MiB 1167k m3u8 │ vp09.00.31.08 1167k video only
247 webm 1280x720 30 │ 13.61MiB 503k https │ vp9 503k video only 720p, webm_dash
399 mp4 1920x1080 30 │ 24.33MiB 899k https │ av01.0.08M.08 899k video only 1080p, mp4_dash
270 mp4 1920x1080 30 │ ~ 73.64MiB 2721k m3u8 │ avc1.640028 2721k video only
137 mp4 1920x1080 30 │ 39.45MiB 1458k https │ avc1.640028 1458k video only 1080p, mp4_dash
614 mp4 1920x1080 30 │ ~ 53.22MiB 1967k m3u8 │ vp09.00.40.08 1967k video only
248 webm 1920x1080 30 │ 26.78MiB 990k https │ vp9 990k video only 1080p, webm_dash
616 mp4 1920x1080 30 │ ~131.47MiB 4858k m3u8 │ vp09.00.40.08 4858k video only Premium
400 mp4 2048x1152 30 │ 60.94MiB 2252k https │ av01.0.08M.08 2252k video only 1080p, mp4_dash
620 mp4 2048x1152 30 │ ~151.23MiB 5589k m3u8 │ vp09.00.50.08 5589k video only
271 webm 2048x1152 30 │ 82.90MiB 3063k https │ vp9 3063k video only 1080p, webm_dash
Новая таблица форматов с единым файлом/потоком для 720p (и 1080p):
$ yt-dlp -F 'https://youtu.be/eUyr9MJnj4w' --extractor-arg "youtube:player_client=mediaconnect"
Extracting cookies from firefox
Extracted 1329 cookies from firefox
[youtube] Extracting URL: https://youtu.be/eUyr9MJnj4w
[youtube] eUyr9MJnj4w: Downloading webpage
[youtube] eUyr9MJnj4w: Downloading mediaconnect player API JSON
[youtube] eUyr9MJnj4w: Downloading m3u8 information
[info] Available formats for eUyr9MJnj4w:
ID EXT RESOLUTION FPS CH │ FILESIZE TBR PROTO │ VCODEC VBR ACODEC ABR ASR MORE INFO
────────────────────────────────────────────────────────────────────────────────────────────────────────────
sb3 mhtml 48x27 0 │ mhtml │ images storyboard
sb2 mhtml 80x45 1 │ mhtml │ images storyboard
sb1 mhtml 160x90 1 │ mhtml │ images storyboard
sb0 mhtml 320x180 1 │ mhtml │ images storyboard
140 m4a audio only 2 │ 3.51MiB 129k https │ audio only mp4a.40.2 129k 44k medium, m4a_dash
160 mp4 256x144 30 │ 1.55MiB 57k https │ avc1.4d400c 57k video only 144p, mp4_dash
91 mp4 256x144 30 │ ~ 4.16MiB 154k m3u8 │ avc1.4d400c mp4a.40.5
133 mp4 426x240 30 │ 2.35MiB 87k https │ avc1.4d4015 87k video only 240p, mp4_dash
92 mp4 426x240 30 │ ~ 5.70MiB 211k m3u8 │ avc1.4d4015 mp4a.40.5
134 mp4 640x360 30 │ 4.13MiB 153k https │ avc1.4d401e 153k video only 360p, mp4_dash
93 mp4 640x360 30 │ ~11.41MiB 421k m3u8 │ avc1.4d401e mp4a.40.2
18 mp4 640x360 30 2 │ ≈ 7.64MiB 282k https │ avc1.42001E mp4a.40.2 44k 360p
135 mp4 854x480 30 │ 6.09MiB 225k https │ avc1.4d401f 225k video only 480p, mp4_dash
94 mp4 854x480 30 │ ~15.17MiB 561k m3u8 │ avc1.4d401f mp4a.40.2
136 mp4 1280x720 30 │ 11.09MiB 410k https │ avc1.4d401f 410k video only 720p, mp4_dash
95 mp4 1280x720 30 │ ~24.57MiB 908k m3u8 │ avc1.4d401f mp4a.40.2
137 mp4 1920x1080 30 │ 39.45MiB 1458k https │ avc1.640028 1458k video only 1080p, mp4_dash
96 mp4 1920x1080 30 │ ~73.64MiB 2721k m3u8 │ avc1.640028 mp4a.40.2
Как скачивать 720p (формат единым файлом/потоком):
$ yt-dlp -f 95 'https://youtu.be/eUyr9MJnj4w' --extractor-arg "youtube:player_client=mediaconnect"
Как воспроизводить 720p (формат единым файлом/потоком):
$ mpv --ytdl-format=95 'https://youtu.be/eUyr9MJnj4w' --ytdl-raw-options=extractor-arg="youtube:player_client=mediaconnect"
Кроме того:
profile-cond=path:match('youtu%.?be') ~= nil или profile-cond=path:find('youtu%.?be') (1).ytdl-raw-options=extractor-arg="youtube:player_client=mediaconnect" и ytdl-format=95/best.--alias 95f '-f 95 --extractor-arg="youtube:player_client=mediaconnect"'. Теперь, чтобы скачать, пишем yt-dlp --95f 'https://youtu.be/eUyr9MJnj4w'.
Для чего все это надо?
| ← предыдущие | следующие → |