LINUX.ORG.RU

Сообщения 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 ()

Есть ли душ в капсульном отеле?

В телевизоре говорят что Сноуден уже 19 дней живёт в капульном отеле аэропорта Шереметьево. Кто-нибудь знает, а там есть где душ принять? А то ж через 19 дней без душа от человека будет сильно вонять.

Судя по фотографиям в самой капсуле помыться нельзя. Может там есть платные душевые кабинки? Кто вкурсе?

Линукс тут при том что Сноуден вроде как хакер и наверняка шарит в ГНУ/Линуксе.

Кстати сейчас Сноуден встречается с правозащитниками. Даже фотка есть.

 ,

LinuxUser ()

Как отличить аппаратный рейд от «фейк-рейда»?

http://www.altlinux.org/FAQ/RAID
A3: не путайте аппаратный RAID с дешёвыми набортными контроллерами (особенно IDE/SATA), обычно скромно называемыми HostRAID: это фактически сумма недостатков software и hardware RAID, поскольку on-disk format вендорский, а ресурсы занимает ваши.

Как узнать какой у меня рейд?

Материнская плата вот эта http://www.supermicro.com/products/motherboard/Xeon/C216/X9SAE-V.cfm
В мануале к ней написано

SATA Connections
SATA 3.0 (6Gb/s) | Two (2) SATA 0~1
                 | RAID 0, 1
SATA 2.0 (3Gb/s) | Four (4) I-SATA 2~5
                 | RAID 0, 1, 5, 10 (MS Windows®)
                 | RAID 0, 1, 10 (Linux)
В BIOS можно выбрать «SATA Mode Selection» между «IDE Mode», «AHCI Mode» и «RAID Mode».
Утилита настройки RAID выглядит так http://i.imgur.com/3lTNiXR.jpg

 

LinuxUser ()

Командование notification-daemon`ом через dbus-send

Делаю по спецификации: http://www.galago-project.org/specs/notification/0.9/x408.html#command-notify
Если слать

dbus-send --print-reply --type=method_call --dest=org.freedesktop.Notifications /org/freedesktop/Notifications org.freedesktop.Notifications.Notify string: uint32:0 string: string:summary string:body array:string: dict:string:byte:urgency,1 int32:1000
Выдаёт
Error org.freedesktop.DBus.Error.InvalidArgs: Type of message, `(susssasa{sy}i)', does not match expected type `(susssasa{sv}i)'
Если слать
dbus-send --print-reply --type=method_call --dest=org.freedesktop.Notifications /org/freedesktop/Notifications org.freedesktop.Notifications.Notify string: uint32:0 string: string:summary string:body array:string: dict:string:variant:urgency,byte:1 int32:1000
Выдаёт
dbus-send: Unknown type «variant»

Баг в dbus-send?

 ,

LinuxUser ()

XF86Display срабатывает с задержкой

Ноут Lenovo ThinkPad T510i.
Дистрибутив Debian Wheezy.
Оконный менеджер Fvwm.

Запускаю xev. Нажимаю Fn+F7.
Секунды через 3–4 xev сообщает что была нажата XF86Display.
И всё это время изображение на экране не обновляется.

Кроме этого все эти 3–4 секунды процесс kworker загружает процессор на 100%.

Такое впечатление что кто-то пытается XF86Display обработать, хотя я не просил.

В Debian Lenny и Squeeze такого не было.

Что делать?

 

LinuxUser ()

В Debian 7.0 забыли mtpfs?

neo@nvh:~$ aptitude search mtpfs
neo@nvh:~$ apt-file search mtpfs
halevt: /usr/share/doc/halevt/examples/mtpfs.xml

Как теперь андроидодевайсы монтировать? Ждать пока вернут? Ставить gvfs?

 ,

LinuxUser ()

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