LINUX.ORG.RU

Сообщения LinuxUser

 

Динамический goto

На ассемблере «динамический goto» реализовать можно так:

.data
	msg: .string "Hello world!"
 
.bss
	.lcomm p, 4

.text
.globl _start
_start:
	mov $L2, %eax
	mov %eax, p
	jmp *p
L1:
	push $0
	call exit
L2:
	push $msg
	call puts
	add $4, %esp
	jmp L1
Можно ли в C сделать что-нибудь аналогичное?

Пробовал ассемблерными вставками организовать - не получается.
C-шные метки ассемблер не признаёт.
Пробовал вместо них использовать asm volatile («L2:») - не работает.

Есть идеи?

LinuxUser
()

Как минтировать iso образы под обычным пользователем?

Можно ли что-нибуть в /etc/fstab прописать (или где-нибуть ещё), как для cdrom например:
/dev/scd0 /media/cdrom0 udf,iso9660 user,noauto 0 0
что mount не ругался «only root can do that»?

LinuxUser
()

Как сохранить соотношение сторон в полноэкранном режиме (добавив чёрные полоски)

Если из сабжа не понятно, то вот пример.

Дисплей у ноута имеет разрешение 1366x768, игра имеет разрешение в полноэкранном режиме 640x480. Таким образом она будет заметно растянута по ширине. Есть ли способ сделать так, чтобы растяжение было не по всей ширине, а пропорционально разрешению игры, а остальное пространство было бы чёрным?

Видеокарта Intel X3100+. Если кто знает способ для других видеокарт - тоже пишите.

Пробовал гуглить, но ответа не нашёл. Возможно не сумел внятно сформулировать запрос.

LinuxUser
()

[SQL] Как сделать автоматическое удаление записей на которые нет ссылок?

Есть две таблицы one и two. В первой есть внешний ключ two_id. Во второй соответственно первичный ключ id. Связь один ко многим - одно поле второй таблицы может соответствовать многим полям первой. Кроме этого, полю второй таблицы обязательно должно соответствовать хотя бы одно поле первой.

Есть ли стандартные способы такое организовать?

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

 Table one:    Table two:
 +--------+    +------+-------------+
 | two_id |    | id   | ref_counter |
 +--------+    +------+-------------+
 |      1 |    |    1 |           3 |
 |      1 |    |    2 |           1 |
 |      1 |    +------+-------------+
 |      2 |
 +--------+
И самому его изменить/проверять и удалять строку когда ref_counter станет равным нулю. Но это выглядит не Ъ. Что делать?

 

LinuxUser
()

[pipe] ftp не хочет общатся через два пайпа

Через два не хочет, а через один - хочет. В общем вот:

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

int main(int argc, char *const argv[])
{
	int in[2], out[2], len;
	char buf[80];

	if (pipe(in) != 0 || pipe(out) != 0 )
	{
		perror("pipe");
		return EXIT_FAILURE;
	}

	if (fork() == 0)
	{
		close(0);//
		close(1);

		dup(in[0]);//
		dup(out[1]);

		close(in[1]);
		close(out[0]);

		execlp("ftp", "ftp", "-n", "ftp.mozilla.org", (char *)NULL);
		//execlp("pwd", (char *)NULL);
		perror("execlp");
		return EXIT_FAILURE;
	}

	close(in[0]);
	close(out[1]);

	setvbuf(stdout, NULL, _IONBF, 0);
	while (len = read(out[0], (void *)buf, sizeof(buf)-1), len > 0)
	{
		buf[len] = 0;
		printf("%s", buf);
	}

	close(in[0]);
	close(out[1]);
	return EXIT_SUCCESS;
}
Компилю, пускаю:
gcc main.c && ./a.exe
Но ничего не выводится! Если закомментировать 18 и 21 строчки (в конце них стоит //), вывод от ftp выводится. Если вместо ftp пускать pwd, то вывод есть, даже с двумя пайпами. Думал что это потому что pwd stdin не использует, но от cat вывод тоже выводится, если ему данных послать вот так: write(in[1], «test\n», 5);.

Люди добрые, подскажите, почему так? Как исправить?

 

LinuxUser
()

[bash] Можно ли получить доступ к stdin и stdout процесса форкнутого амперсандом?

Например, нужно чтоб скрипт общался с ftp сервером учитывая ответы.

После запуска `ftp -n example.com &' pid потомка (процесса ftp) хранится в $!. Можно ли как-то зная pid писать в stdin и читать из stdout средствами bash?

Очень желательно обойтись без именованных пайпов.

 

LinuxUser
()

[hamachi] Куда запрятали Linux и Mac версии?

Раньше качал отсюда http://hamachi.cc/download/list.php, но теперь отуда перенаправляет сюда https://secure.logmein.com/products/hamachi2/, а там по ссылке Downloads выдаёт hamachi.msi не взирая на операционную систему.

Кто-нибуть в курсе куда они спрятали Linux и Mac версии?

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

 

LinuxUser
()

[X Window]Как узнать размер окна с границами?

Размер окну можно задать через XCreateWindow и XSetWMSizeHints.
Затем, оконный менеджер приделывает к окну границу (border/decoration).

Как после этого узнать окончательный размер окна, учитывая границы?

В спеке http://standards.freedesktop.org/wm-spec/wm-spec-latest.html про это не нашёл.

LinuxUser
()

[C][OpenGL]Программа тормозит при закрытом stderr

Написал программу на C с использованием OpenGL под X Window.
Программа рисует вращающийся треугольник.

Если запускать её из консоли - работает замечательно.
Если - из файлового менеджера (PCManFM, Konqueror) - подтормаживает.
Если запустить из консоли с перенаправлением stderr в /dev/null (2>/dev/null) или в самой программе закрыть stderr (fclose(stderr)) - эффект тот же.
Тормоза выглядят так - падает FPS и скорость реакции на нажатия клавиш на клавиатура/закрытия окна.

Воспроизводится на 32-х битном Debian Lenny под VirualBox и 64-х битном openSUSE 11.0 c ATI X800 видеокартой с последними драйверами.
На openSUSE 11.1 с nVidia 6600 - не воспроизводится (возможно это связано с тем, что процессор на этом компе более быстрый).

Есть идеи почему так происходить и как это исправить?

 ,

LinuxUser
()

Тут вот говорят, что монолитное ядро никуда не годится. Это правда?

Наткнулся на статью 28 причин почему Linux не имеет будущего. В каждом пункте автор делает резкие выпады и даже откровенно врёт. Но не знаю как оценивать то что написано в пункте 16 про монолитное ядро, потому что с темой не знаком. Вот цитата:

Поддержка монолитного ядра КРАЙНЕ сложна. Я считаю что любое внедрение Linux в масштабах страны будет серьезным ударом по всем организациям использующим эту систему, как только речь коснется дальнейшей поддержки и развития Linux. Поэтому все призывы опенсорщиков в которых взывается к возможности легкой модификации Linux под себя являются чистым воды саботажем.

А как насчет того, чтобы найти ошибку в монолитном ядре? По этому поводу приведу одну интересную цитату: «Второй человек в Linux, Andrew Morton, горько сетует по поводу состояния разработки -mm ветки ядра (напомню, что именно в нее сначала добавляются экспериментальные патчи, а только потом, после тестирования, они имеют шанс попасть в основное ядро): «У меня ушло двое полных суток на то, чтобы все это скомпилировать и загрузить на нескольких моих компьютерах. Чтобы добиться положительного результата в этом процессе, я написал около девяноста исправляющих патчей и патчей по отбрасыванию ненужного. Уже сейчас я наблюдаю несколько известных мне багов, но полагаю, на самом деле их гораздо больше. Я должен сказать, что [такая модель разработки] больше не работает»[12]. Последний патч для ядра 2.6.23-rc6 весит почти 30 мегабайт. По-русски говоря, это около тридцати тысяч страниц исходников (если оптимистично считать по тысяче символов на страницу)»

Насколько автор прав?

LinuxUser
()

glXGetFBConfigs(): утечка памяти не смотря на XFree()

Код:

     1  #include <stdlib.h>
     2  #include <X11/Xlib.h>
     3  #include <GL/glx.h>

     4  int main()
     5  {
     6    Display *display;
     7    int screen_number;
     8    GLXFBConfig *glxfb_configs;
     9    int configs_number;

    10    display = XOpenDisplay(NULL);
    11    if (display == NULL) return EXIT_FAILURE;

    12    screen_number = DefaultScreen(display);

    13    glxfb_configs = glXGetFBConfigs(display, screen_number, &configs_number);
    14    XFree(glxfb_configs);

    15    XCloseDisplay(display);

    16    return EXIT_SUCCESS;
    17  }
Компилирую: gcc main.c -Wall -lX11 -lGL -o main. Запускаю: valgrind ./main. Результат:
==32255== LEAK SUMMARY:
==32255==    definitely lost: 386 bytes in 10 blocks.
==32255==      possibly lost: 0 bytes in 0 blocks.
==32255==    still reachable: 4,710 bytes in 6 blocks.
==32255==         suppressed: 0 bytes in 0 blocks.
Если закоментировать 13 и 14 строчки, то результат таков:
==32312== LEAK SUMMARY:
==32312==    definitely lost: 0 bytes in 0 blocks.
==32312==      possibly lost: 0 bytes in 0 blocks.
==32312==    still reachable: 22 bytes in 1 blocks.
==32312==         suppressed: 0 bytes in 0 blocks.

Вопросы: откуда утечки? что я делаю не так?

LinuxUser
()

[X Window] Как задать для окна цветную иконку с alpha прозрачность?

Есть функция XSetWMHints(). В неё передаётся структура XWMHints в которой есть поля:
Pixmap icon_pixmap;
Pixmap icon_mask;
Window icon_window;
Насколько я понял из man XWMHints - icon_pixmap должна быть bitmap'ом. А bitmap может быть только чёрно-белым. В том же мануале написано, что icon_mask'ом можно задать какие пиксели из icon_pixmap нужно использовать. Получается обычная не alpha прозрачность.
Поле icon_window позволяет задать окно которое будет использоватся как иконка. Не совсем понятно как это должно работать. Пробовал присваивать icon_window окно - иконкой стала стандартная иконка для X Window программ, а не то что нарисовано в окне.

Вопрос - как задать alpha-прозрачную цветную иконку для окна X Window программы?

Гуглить пробовал - ничего по теме не нашёл. Поидее иконку рисует менеджер окон. Может быть не все менеджеры могут работать с прозрачными иконками? Такое впечатление что программы на Qt и GTK используют какие-то секретные функции или способы KDE и GNOME для задания иконок окнам.

LinuxUser
()

LAN через Bluetooth: соединение есть, пинга нет

Хочу соединить компьютер и ноутбук в LAN сеть по Bluetooth. Выполняю:

на ноутбуке:   pand -s -r GN
на компьютере: pand -c <MAC ноутбука> -r PANU
на ноутбуке:   ifconfig bnep0 10.0.0.1
на компьютере: ifconfig bnep0 10.0.0.2

Связь установилась, об том говорит `pand -l' и KBluetooth, а ifconfig сообщает что интерфейсы подняты и ip у них такой который заказывали. Но ping ни в ту ни в другую сторону не идёт и на samb-у которая на ноуте компьютер зайти не может.

На компьютере openSUSE 10.3, на ноутбуке Debian Lenny. Содержимое hcid.conf на обоих такое (за исключением name):

options {
	autoinit yes;
	security auto;
	pairing multi;
	passkey "9670";
}
device {
	name "Home";
	class 0x20100;
	discovto 0;
	iscan enable;
	pscan enable;
	lm accept, master;
	lp rswitch,hold,sniff,park;
}
Параметр class пробовал ставить 0x100 и 0x10c - результат не изменился. Фаерволы отключены.

Кто-нибуть сталкивался с подобным? В чём может быть причина проблемы?

LinuxUser
()

[Debian Lenny][Видеокарта Intel 965GM] FPS в glxgears в два раза меньше чем должен быть

В интернетах пишут что на этой видеокарте FPS в glxgears около 1500. У меня он в районе 700.

$ lspci | grep Graphic
00:02.0 VGA compatible controller: Intel Corporation Mobile GM965/GL960 Integrated Graphics Controller (rev 0c)
00:02.1 Display controller: Intel Corporation Mobile GM965/GL960 Integrated Graphics Controller (rev 0c)

$ glxinfo | grep render
direct rendering: Yes
OpenGL renderer string: Mesa DRI Intel(R) 965GM 4.1.3002

$ uname -r
2.6.26-1-amd64

$ dpkg -l | grep xserver-xorg-video
ii  xserver-xorg-video-intel  2:2.3.2-2+lenny6  X.Org X server -- Intel i8xx, i9xx display driver

Подскажите, в чём может быть причина проблемы?

LinuxUser
()

[Java ME][JWT][ktoolbar] Можно ли изменить workdir?

Когда запускаешь ktoolbar, то он создаёт так называемую workdir директорию ~/j2mewtk/2.5.2/. Мне это очень не нравится, ибо считаю что он должен жить в ~/root/projects/, а никак не в домашней директории. В связи с этим вопрос - знает ли кто-нибуть как поменять местоположение workdir?

В документации сказано, что workdir «typically» располагается в ~/j2mewtk/2.5.2/. Из этого вроде как вытекает, что может ещё быть «untypically», но про то как этого добиться - не сказано.

В гугле искал. Единственное что нашёл по теме - тут задавался тот же вопрос, но проблема так и не решилась.

 

LinuxUser
()

[Makefile] Почему make делает то что уже сделано?

Вот Makefile:

all: build/program1 build/program2

build/program1: build
	touch $@

build/program2:
	touch $@

build:
	mkdir $@

Запускаем:

$ make
mkdir build
touch build/program1
touch build/program2
$ make
touch build/program1
$ make
make: Nothing to be done for `all'.

Спрашивается, почему при втором запуске он делает то, что уже было сделано?

P.S. Если перенести зависимость build в all, то всё работает правильно. Это выглядит карсивее и правильнее. Но теоретически, приведённое содержимое Makefile'а тоже должно работать.

 

LinuxUser
()

XMPP (Jabber) Как точно определить адрес сервера?

Поидее имя домена берётся из JID. Но обнаружил, что это не всегда верно. Так, например, если в Psi задать JID с доменом ya.ru (например user@ya.ru), то он соединяется не с ya.ru:5222, а с xmpp.yandex.ru:5222 (IP у них, если что, тоже разные). То же самое с аккаунтами на gmail.com, соединение идёт с talk.google.com. В спецификации по XMPP (rfc3920), по этому вопросу ничего найти не смог.

Кто-нибуть в курсе - есть ли этому научное объяснение или это произвол владельцев Яндекса и Google?

LinuxUser
()

QT Creator требует libgobject-2.0. Где брать?

Скачал с оф. сайта qt-sdk-linux-x86_64-opensource-2009.01.bin. Поставил. Создал простой проект. Попробовал скомпилить. Он начал ругатся ld: cannot find -lgobject-2.0. Стал искать rpm-ку, нашёл libgobject-2_0-0, а соотв. devel пакета нету. Кто-нить с подобной проблемой сталкивался? Что делать?

Дистр openSUSE 11.1.

LinuxUser
()

[Qt][QListWidget] Закрыть Persistent Editor по Enter. Снять выделение со всех item'ов.

На Qt начал писать не так давно, поэтому собственно и спрашиваю. На сигнал void itemDoubleClicked(QListWidgetItem *item) повесил слот который вызывает void openPersistentEditor(QListWidgetItem * item). Это работает нормально. Хочется чтобы по нажатию на Enter вызывался void closePersistentEditor(QListWidgetItem * item). Как это сделать?

И ещё такой вопрос. В QListWidget всегда выделен один из элементов. Можно ли сделать так, чтобы по клику мышки на пустом пространсве выделение снималось вообще? Если можно, то как?

 

LinuxUser
()

Psi не хочет отправлять сообщения на Ctrl+Enter

Сообщения почему-то отправляются на Enter (Return), хотя в General -> Options -> Shortcuts -> Shortcuts in the message dialog -> Send the message по-умолчанию стоит Ctrl+Return, Ctrl+Enter, Alt+Return, Alt+Enter. Пробовал менять по-разному, даже ~/.psi/profiles/default/options.xml изменял ручками. Всё равно шлёт только на Enter (Return).

OC: openSUSE 11.1 32-х битный. Версия Psi 0.12 (psi-0.12-28.12 если быть точным - брал из стандартного репозитория openSUSE).

Были у кого-нибуть подобные проблемы? Есть ли какие-нибуть предположения в чём причина вышеописанного?

LinuxUser
()

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