LINUX.ORG.RU

Сообщения LinuxUser

 

Нормальное масштабирование в Xfce и GTK на экране с высоким DPI

Имеется ноутбук с 16 дюймовым экраном 2560x1600 со свежеустановленной стабильной версией Debian 11 Bullseye.

Среда рабочего стола - Xfce.

По умолчанию все элементы графического интерфейса на экране мелкие.

Испробовал разные способы увеличения размера (см. ниже).
Ни один из способов не дал полностью удовлетворительного результата.
Какое масштабирование вы используете в Linux на экранах с большим DPI?
Буду рад любым рекомендациям, в том числе по смене дистрибутива и DE.

Вот какие способы я испробовал:

1) Задать в редакторе настроек «xsettings - Gtk - IconSizes» кастомные размеры иконок gtk-menu=24,24:gtk-button=24,24:panel-applications-menu=32,32:panel-directory-menu=32,32

Увеличить шрифт до 18 или указать размер шрифта 9 и DPI в 2 раза больше реального.

2) Указать размер шрифта 9 и включить в настройках «Внешний вид» масштабирование окон 2x.

3) Задать масштабирование (1.5x, 2x) в «Настройки - Дисплей».

Результаты:

Способ увеличения иконок в 1) как оказалось работал до версии GTK 3.10. Потом разработчики GTK решили, что нужно прекратить брать размеры иконок из «xsettings - Gtk - IconSizes». Теперь, как я понял, их предлагают увеличивать настройкой toolbar image, menu image { -gtk-icon-transform: scale(2.0); } в ~/.config/gtk-3.0/gtk.css. Но от этого иконки увеличиваются с потерей качества (размываются).

Способ 2) также портит иконки в меню xfce, файловом менеджере. А в GIMP масштабирование почему-то не применяется и в нём все мелкое.

Способ 3) вообще не работает, настройка масштабирования даже не сохраняется.

 , ,

LinuxUser
()

Выбор ноутбука: экран матовый 100% sRGB 15"—16", CPU на уровне ≈ i7, 16 ГБ ОЗУ, встроенная GPU, до 100 тыс. руб

Необходим ноутбук с матовым экраном со 100% sRGB цветовым охватом, размером 15—16 дюймов, не совсем ущербным CPU, желательно встроенная графика, хотя бы один USB 3. Бюджет до 100 тыс. руб.

Поиски привели к Lenovo IdeaPad 5 Pro 16ARH7, AMD Ryzen 5 6600HS (3.3 ГГц 6 ядер), RAM 16 ГБ, AMD Radeon, SSD 512 ГБ (82SN0043RK). На официальном сайте пишут, что на нём 100% sRGB и матовый экран.

Будет ли нормально работать Linux со встроенной AMD Radeon Graphics 660M?

Или может кто посоветует что-нибудь другое под указанное ТЗ?

 100 srgb, , ,

LinuxUser
()

Параллельная обработка запросов для одного URL

Всем привет!

Как в Go сделать, чтоб функция заданная в http.HandleFunc на один и тот же паттерн URL работала параллельно, а не последовательно?

Например, если запустить код размещённый ниже и открыть два раза http://127.0.0.1:8080/test, то в первый раз страница загружается через 10 секунд, а во второй раз – через 20 сек., вместо 10, а это означает, что обработка запросов выполняется последовательно. Как сделать чтоб было параллельно?

package main

import (
	"net/http"
	"time"
)

func main() {
	http.HandleFunc("/test", func(w http.ResponseWriter, r *http.Request) {
		time.Sleep(10 * time.Second)
		w.Write([]byte("Hello world!"))
	})

	http.ListenAndServe(":8080", nil)
}

 , ,

LinuxUser
()

Не работает nvidia 340xx из sid в Debian 11 Bullseye

Имеется ноут Thinkpad T410i с видеокартой Nvidia GT218 NVS 3100M.

Т.к. из репозитория Debian 11 убрали 340xx драйвер nvidia, то взял его из sid (по совету ZenitharChampion).
Для этого выкачал все пакеты *nvidia-legacy-340xx* из sid c зависимостями и установил их (полный список ниже).
Драйвер встал без ошибок.

# lsmod | grep nvidia
nvidia              10600448  1
drm                   626688  3 nvidia
Но иксы не запускаются (процесс Xorg зависает намертво), а при загрузке в лог ядра пишется:
[    6.793532] BUG: kernel NULL pointer dereference, address: 0000000000000038
[    6.793637] #PF: supervisor read access in kernel mode
[    6.793727] #PF: error_code(0x0000) - not-present page
и так далее (если нужно размещу полный лог).

Помогите советом, как исправить проблему?

Ядро: 5.10.0-18-amd64
Полный список установленных из sid пакетов:

libc6_2.35-3_amd64.deb
libc6-dev_2.35-3_amd64.deb
libc-bin_2.35-3_amd64.deb
libc-dev-bin_2.35-3_amd64.deb
libc-l10n_2.35-3_all.deb
libegl1-nvidia-legacy-340xx_340.108-16_amd64.deb
libgl1-nvidia-legacy-340xx-glx_340.108-16_amd64.deb
libgles1-nvidia-legacy-340xx_340.108-16_amd64.deb
libgles2-nvidia-legacy-340xx_340.108-16_amd64.deb
libnvidia-legacy-340xx-cfg1_340.108-16_amd64.deb
libnvidia-legacy-340xx-compiler_340.108-16_amd64.deb
libnvidia-legacy-340xx-cuda1_340.108-16_amd64.deb
libnvidia-legacy-340xx-eglcore_340.108-16_amd64.deb
libnvidia-legacy-340xx-encode1_340.108-16_amd64.deb
libnvidia-legacy-340xx-fbc1_340.108-16_amd64.deb
libnvidia-legacy-340xx-glcore_340.108-16_amd64.deb
libnvidia-legacy-340xx-ifr1_340.108-16_amd64.deb
libnvidia-legacy-340xx-ml1_340.108-16_amd64.deb
libnvidia-legacy-340xx-nvcuvid1_340.108-16_amd64.deb
locales_2.35-3_all.deb
locales_2.35-3_all.deb.1
nvidia-legacy-340xx-alternative_340.108-16_amd64.deb
nvidia-legacy-340xx-driver_340.108-16_amd64.deb
nvidia-legacy-340xx-driver-bin_340.108-16_amd64.deb
nvidia-legacy-340xx-driver-libs_340.108-16_amd64.deb
nvidia-legacy-340xx-kernel-dkms_340.108-16_amd64.deb
nvidia-legacy-340xx-kernel-source_340.108-16_amd64.deb
nvidia-legacy-340xx-kernel-support_340.108-16_amd64.deb
nvidia-legacy-340xx-opencl-icd_340.108-16_amd64.deb
nvidia-legacy-340xx-smi_340.108-16_amd64.deb
nvidia-legacy-340xx-vdpau-driver_340.108-16_amd64.deb

 ,

LinuxUser
()

Wine dxvk чёрный экран при запуске игр с DirectX 11

Всем привет!

При запуске через wine игр, которые требуют DirectX 11, отображается чёрный экран. Пробовал Carto и Tohu.

Буду благодарен за любые идеи куда копать, чтобы победить эту проблему.

Дистрибутив: Debian 10.8 (buster)
Видеокарта: GeForce GTX 950 (проприетарный драйвер 460.39 из репозитория)
Wine: wine-6.3 (Staging)
DXVK: 1.8.1

Если запускать с DXVK_HUD=1 – в левом верхнем углу чёрного экрана отображается информация о видеокарте, версии Vulkan и FPS.

В nvidia-settings отключал Allow Flipping, как советовали вот тут, но эффекта это не возымело.

 ,

LinuxUser
()

Сообщение «Maybe the USB cable is bad» в dmesg

После подключения USB-хаба встроенного в монитор в dmesg (а также в открытых консолях, которые на Ctrl+Alt+F*) примерно каждые 5-10 секунд появляется сообщение:

usb usb3-port4: Cannot enable. Maybe the USB cable is bad?

Но при этом клавиатура, мышь и веб-камера воткнутые в этот порт работают без каких-либо проблем.

Результаты гугления:

  • если USB-устройство глючит, то заменить кабель;
  • если всё работает предлагают игнорить это сообщение.

УМВР, но игнорить его не хочу.

Есть у кого идеи что можно сделать в такой ситуации? Хотелось бы как минимум замьютить это сообщение.

 ,

LinuxUser
()

Измерение входящего трафика в компьютер без внешнего IP

Есть два компьютера.
Один с внешним IP в сети интернет, второй – без.

Правильно ли я понимаю, что iperf сможет измерить только скорость исходящего трафика со стороны второго (без внешнего IP) в сторону первого (с внешним IP) и скорость входящего в первый из второго?

Если не правильно, то подскажите, пожалуйста, как измерить скорость входящего трафика в компьютер без внешнего IP?

 ,

LinuxUser
()

Drag and drop в DeaDBeeF не работает

Поставил новый Debian 9. В качестве DE — Xfce.
Из официального debian-multimedia репозитория установил DeaDBeeF.
Попытался привычным движением мыши закинуть в него файлов из PCManFM — не работает! И из Thunar тоже!

Почему такое может быть?

Между PCManFM и Thunar файлы драгэнддропятся нормально.
В Debian 8 я юзал FVWM — там с Drag and drop-ом в DeaDBeeF всё впорядке было.

 , ,

LinuxUser
()

Посоветуйте видеорегистратор для видеонаблюдения

Хочу сделать систему видеонаблюдения в деревне.
«ТЗ»:

  • Камеры:
    • видео от 1280x720, от 20 кадров/с;
    • автоматическая ИК-подсветка ночью;
    • раб. температура от -30..+50°C, IP66—IP67;
    • расстояние до регистратора от 10 до 40м.
  • Регистратор должен уметь:
    • поддерживать запись с 8-ми камер;
    • записывать видео по движению на внутренний жёсткий диск;
    • подключаться к моей OpenVPN сети;
    • записывать видео в низком качестве на удаленный (мой) сервер по протоколу SFTP.
    • отдавать записанные видео по FTP или SFTP;
    • показывать видео с камер через веб-интерфейс.

На данный момент вижу два варианта:
1. IP-камеры, свитч с PoE и x86_64 компьютер. На компьютере – GNU/Linux, motion, OpenVPN, ssh-сервер.
2. Аналоговые AHD/MHD камеры, видеорегистратор с неогороженным Linux (с возможностью настроить на нём запись с помощью motion, поставить OpenVPN и ssh-сервер).

По первому варианту цены за камеру начинаются от 4000р., за свитч – от 5000р., комп с 1ТБ диском – примерно от 15000р. Итого, если 6 камер и UTP-кабеля на 2000р., то 46000р.

По второму варианту цена за камеру от 1250р.. Видеорегистратор - от 3500р. + 4000р. за 1 ТБ диск. Итого, если 6 камер и 5000р. на кабели и блоки питания для камер, то 20000р.

Получается второй вариант более чем в два раза дешевле. Только в Linux там, скорее всего, хрен залезешь.

Вопросы:
1. Посоветуйте видеорегистратор с неогороженным Linux.
2. Посоветуйте плату видеозахвата для компа с 4/8 портами с поддержкой AHD/MHD и Linux.
3. Ну и вообще любые конструктивные соображения приветствуются.

 

LinuxUser
()

Инициализация переменной размером бинарника

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

Я сделал это так:
1. Собираю временный бинарник с переменной exe_size=1.
2. Его размер записываю в exe_size.
3. Собираю искомый бинарник с новым значением exe_size.

Выглядит это так:
main.c

#include <stdlib.h>
#include <stdio.h>

extern size_t exe_size;

int main(int argc, char *argv[argc+1]) {
	printf("this file size is %zu\n", exe_size);
	return EXIT_SUCCESS;
}
Makefile
default: tmp main

tmp:
	@mkdir tmp

main: tmp/main.o tmp/exe_size_fill_.o
	gcc $^ -o $@
	@if [ `stat -c %s $@` -ne `stat -c %s tmp/main` ]; then\
		echo 'error: wrong exe_size'; rm $@; exit 1; fi

tmp/main.o: main.c
	gcc $< -c -o $@

tmp/exe_size_fill_.o: tmp/exe_size_fill_.c
	gcc $< -c -o $@

tmp/exe_size_fill_.c: tmp/main
	echo '#include <stdlib.h>' > $@
	echo "size_t exe_size = `stat -c %s $<`;" >> $@

tmp/main: tmp/main.o tmp/exe_size_blank.o
	gcc $^ -o $@

tmp/exe_size_blank.o: tmp/exe_size_blank.c
	gcc $< -c -o $@

tmp/exe_size_blank.c:
	echo '#include <stdlib.h>' > $@
	echo 'size_t exe_size = 1;' >> $@

clean:
	rm -rf main tmp

Запускаем make, затем ./main.
Программа выдаёт что-то типа: this file size is 7399.

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

 ,

LinuxUser
()

Отображение картинки с прозрачностью как OSD

Ищу программу для отображения картинки на экране по типу OSD, с поддержкой прозрачности через композитный менеджер.
Требуется чтобы картинку можно было отображать в реальном её размере с указанием места на экране, а не в виде маленькой иконки как это делают всякие notification-daemon-ы.

Нашёл заброшенный проект ghosd, который похоже делает то, что мне нужно (см. последний скриншот), но ссылка на исходники там уже не работает.

В идеале хотелось бы чтоб программа была в репозитории Debian-а.
Ну а в крайнем случае, сойдёт и библиотека к которой можно бы обратиться из C, C++ или Python.

 

LinuxUser
()

Не стартует lirc как сервис (Debian 8 Jessie)

Использую устройство Asus Digital Home. Скопировал его конфиг:

# cp /usr/share/lirc/remotes/asus/lircd.conf.asusdh /etc/lirc/lircd.conf
Сконфигурировал /etc/lirc/hardware.conf:
$ grep '^[^#]' /etc/lirc/hardware.conf
LIRCD_ARGS=""
DRIVER="asusdh"
DEVICE="/dev/usb/hiddev0"
MODULES=""
LIRCD_CONF="/etc/lirc/lircd.conf"
LIRCMD_CONF=""
Если запускаю так:
# lircd --nodaemon --driver=asusdh --device=/dev/usb/hiddev0 /etc/lirc/lircd.conf
То всё работает. В другом окне запускаю irw, нажимаю на пульте кнопки и irw их печатает.
Если запускаю как сервис:
# /etc/init.d/lirc start
Пишет: [ ok ] Starting lirc (via systemctl): lirc.service..
При этом lircd в списке процессов не появляется, лог файла /var/log/lircd нет и в /var/log/syslog ничего нового.
Пытался дебажить скрипт запуска сервиса: bash -x /etc/init.d/lirc start.
Обнаружил что всё заканчивается на /bin/systemctl start lirc.service.
При этом # locate lirc.service ничего не находит.

В какой лог файл смотреть чтоб понять почему этот systemctl так в итоге не запускает lircd?
Когда отсутствует lirc.service это нормально? Может дело в этом? Если да, то почему systemctl не руается?

 ,

LinuxUser
()

Как узнать на изменяемую ли память указывает переменная?

Вот такой код

	char *s = "change me :)";
	s[0] = 'k';
вызывает ошибку сегментации.

Внимание, вопрос: что в чёрном ящике
Есть ли способ узнать на какой «тип» памяти указывает переменная?
Ну, то есть, можно ли её менять или нет.

 

LinuxUser
()

Потеря цвета при 1-пиксельных контрастных переходах

В википедии пишут что VP8 (на котором основан WebP), поддерживает только формат 8-bit YUV 4:2:0, из-за чего в пиксельной графике могут быть потери цвета при 1-пиксельных контрастных переходах.

Вопрос знающим - это возможно даже при кодировании без потери качества или это устаревшая информация ещё с того времени когда WebP не умел кодировать без потери?

 

LinuxUser
()

Зачем нужны GTK_DIALOG(obj), GTK_WINDOW(obj) и т.п.?

Требовалось сделать аналог виндовой функции MessageBox исключительно для вывода сообщений об ошибках.
Решил динамически грузить GTK-ашную либу и минимальным количеством её функций выводить требуемое.
Вот что получилось:

#include <stdlib.h>
#include <stdio.h>
#ifdef __unix__
	#include <dlfcn.h>
#endif /* __unix__ */

void error_msg_box(const char *msg);

int main() {
	error_msg_box("Test ok.");
	return EXIT_SUCCESS;
}

void error_msg_box(const char *msg) {
	if (msg == NULL)
		msg = "Unknown error.";

#ifdef _WIN32
	int __stdcall MessageBoxA
		(void *wnd, const char *text, const char *caption, unsigned int type);
	#define MB_ICONERROR 0x10
	MessageBoxA(NULL, msg, "Error", MB_ICONERROR);
#else

#ifdef __unix__
	void *lib_gtk = dlopen("libgtk-x11-2.0.so", RTLD_LAZY);
	if (lib_gtk == NULL)
		goto fb;

	typedef void (*GTK_INIT)(int *argc, char ***argv);
	typedef void *(*GTK_MESSAGE_DIALOG_NEW)(void *parent, int flags, int type, int buttons, const char *format, ...);
	typedef void (*GTK_WINDOW_SET_TITLE)(void *window, const char *title);
	typedef void (*GTK_WINDOW_SET_POSITION)(void *window, int position);
	typedef void (*GTK_WINDOW_SET_KEEP_ABOVE)(void *window, int setting);
	typedef int (*GTK_DIALOG_RUN)(void *dialog);
	typedef void (*GTK_WIDGET_DESTROY)(void *widget);

	GTK_INIT gtk_init;
	GTK_MESSAGE_DIALOG_NEW gtk_message_dialog_new;
	GTK_WINDOW_SET_TITLE gtk_window_set_title;
	GTK_WINDOW_SET_POSITION gtk_window_set_position;
	GTK_WINDOW_SET_KEEP_ABOVE gtk_window_set_keep_above;
	GTK_DIALOG_RUN gtk_dialog_run;
	GTK_WIDGET_DESTROY gtk_widget_destroy;

	#define GTK_MESSAGE_ERROR 3
	#define GTK_BUTTONS_CLOSE 2
	#define GTK_WIN_POS_CENTER 1

	if (
		!(gtk_init = dlsym(lib_gtk, "gtk_init")) ||
		!(gtk_message_dialog_new = dlsym(lib_gtk, "gtk_message_dialog_new")) ||
		!(gtk_window_set_title = dlsym(lib_gtk, "gtk_window_set_title")) ||
		!(gtk_window_set_position = dlsym(lib_gtk, "gtk_window_set_position")) ||
		!(gtk_window_set_keep_above = dlsym(lib_gtk, "gtk_window_set_keep_above")) ||
		!(gtk_dialog_run = dlsym(lib_gtk, "gtk_dialog_run")) ||
		!(gtk_widget_destroy = dlsym(lib_gtk, "gtk_widget_destroy"))
	)
		goto fb;

	gtk_init(NULL, NULL);
	void *dialog = gtk_message_dialog_new(NULL, 0, GTK_MESSAGE_ERROR, GTK_BUTTONS_CLOSE, "%s", msg);
	gtk_window_set_title(dialog, "Error");
	gtk_window_set_position(dialog, GTK_WIN_POS_CENTER);
	gtk_window_set_keep_above(dialog, 1);
	gtk_dialog_run(dialog);
	gtk_widget_destroy(dialog);

	if (dlclose(lib_gtk))
		fputs("Warning: Failed to close GTK library.\n", stderr);

	return;
#endif /* __unix__ */

fb: fprintf(stderr, "Error: %s\n", msg);

#endif /* _WIN32 */
}
Компилируется так: gcc main.c -ldl -o main
(Под винду так: i686-w64-mingw32-gcc main.c -o main.exe)

Внимание вопрос: зачем в GTK нужны макросы GTK_DIALOG(obj), GTK_WINDOW(obj) и т.п. если всё вроде как работает и без них?

В документации в эти макросы предлагают оборачивать объекты (виджеты) при передаче в функции, например так:

gtk_dialog_run(GTK_DIALOG(dialog));

 ,

LinuxUser
()

Как узнать что сертификат правильно подписан?

Некоторое время назад поднял OpenVPN-сервер по инструкции http://openvpn.net/howto.html
(Используя набор скриптов easy-rsa)
Сгенерировал сертификаты для нескольких клиентов:

. vars
./build-key clientN
Настроил клиентов. Они успешно соединяются и всё у них работает.

Но, сегодня понадобилось добавить ещё одного клиента.
Добавляю также как и раньше.
Копирую на клиентскую машину – не работает, в лог пишет:

AUTH: Received AUTH_FAILED control message

Сравнил старые clientN.crt с новым, у всех есть одинаковые строчки:

X509v3 Authority Key Identifier: 
    keyid:F7:CF:8D:4F:4C:1D:2F:E3:DF:9F:8E:30:DE:87:77:D0:C4:45:7D:FB
    DirName:/C=RU/ST=MO/L=VNIISSOK/O=Home/CN=myserver/name=My Name/emailAddress=user@example.com
    serial:CB:4C:CC:83:9F:EE:BA:A9

Как узнать на сервере - правильно ли подписаны сертификаты?

 

LinuxUser
()

Как сделать, чтоб попытка exclusive flock не давала делать shared flock

Несколько процессов могут читать из файла одновременно. Достаточно редко происходит запись в файл, при этом другие процессы из него читать не должны (ну и писать тоже).

Пытаюсь организовать блокировку с помощью flock. И вот какая штука получается: когда стоит shared lock, начинаем делать exclusive lock, соответственно происходит ожидание пока shared lock пропадёт. Но засада в том, что в это время другой процесс может сделать свой shared lock, и его тоже придётся ждать.

Как бы сделать так чтоб когда начали делать exclusive lock другие процессы ждали прежде чем получить shared lock?

Вот код для наглядности:

#include <errno.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/file.h>
#include <sys/stat.h>
#include <sys/types.h>

int open_lockme() {
  int fd = open("lockme.tmp", O_CREAT);
  if (fd == -1) {
    perror("failed to open \"lockme.tmp\"");
    exit(EXIT_FAILURE);
  }
  return fd;
}

main() {
  if (fork() == 0) {
    if (fork() == 0) {
      int fd = open_lockme(); puts("(1): trying to set shared lock");
      flock(fd, LOCK_SH);     puts("(1): shared lock set");
      sleep(3);
      close(fd);              puts("(1): fd closed, shared lock removed");
    }
    else {
      int fd = open_lockme();
      sleep(2);           puts("(2): trying to set shared lock");
      flock(fd, LOCK_SH); puts("(2): shared lock set");
      sleep(2);
      close(fd);          puts("(2): fd closed, shared lock removed");
    }
  }
  else {
    int fd = open_lockme();
    sleep(1);           puts("(3): trying to set exclusive lock");
    flock(fd, LOCK_EX); puts("(3): exclusive lock set");
    sleep(2);
    close(fd);          puts("(3): fd closed, exclusive lock removed");
  }
  return EXIT_SUCCESS;
}
Хочется чтоб (2) ждал (3), а не наоборот.

 

LinuxUser
()

Тетрис для двоих игроков

Ищу тетрис для двоих игроков. Примерно как на сайте http://www.tetrisfriends.com.
Так как там флеш, а он, как известно, не нужен, вот скриншот.

Хочется играть вдвоём с помощью джойстиков на одном или двух компьютерах.
Подойдут тетрисы для игровых консолей PlayStation/Sega и т.п. если их можно запустить через эмулятор в GNU/Linux.
На худой конец подойдут также тетрисоподобные игры, но чтоб они были качественные и на двоих игроков.

 ,

LinuxUser
()

find и буквы с диакритическими знаками

Как оказалось при использовании диакритических знаков поиск find-ом не работает:

touch уда́рение
find -iname '*удар*'
Кто какое решение может предложить?

 ,

LinuxUser
()

Сразу два уровня нумерации в списке (1.1, 1.2, 1.3, 2.1, 2.2, …)

Нужно чтоб список нумеровался вот так:

1.1
1.2
1.3
2.1
2.2
2.3
2.4
3.1
и т.д. Если делать просто «Up One Level», то список получается таким:
1.1
1.2
1.3
2
2.1
2.2
2.3
2.4
3
3.1
То есть чтоб список начинался с 1.1, а не с 1, сделать можно, а вот как сделать чтоб было 2.1 без 2 – никак придумать не могу. Помогите, пожалуйста.

 ,

LinuxUser
()

RSS подписка на новые темы