?

Log in

Предыдущие 10

3 июл, 2011

ArchLinux: phonon, xinelib

Originally published at Блог-склерозник ~ArchimeD~'а. Please leave any comments there.

После очередного обновления чего-то там в арче у меня стал падать Amarok со следующей ошибкой (phonon для воспроизведения использует библиотеку xine)

systemsettings: symbol lookup error: /usr/lib/xine/plugins/1.29/xineplug_inp_dvb.so: undefined symbol: xine_get_homedir

Решается путем убиения черного козла в полнолуние директории ~/.xine

Метки:

26 май, 2011

Дефибрилятор + адреналиновый укол: SysRq

Originally published at Блог-склерозник ~ArchimeD~'а. Please leave any comments there.

Прежде всего, хотел бы всячески расшаркаться в адрес товарища StarCrafted c #j4fun, именно он натолкнул меня на эту полезнейшую фичу.
Теперь сама суть:
На клавиатуре есть клавиша SysRq, она же PrintScreen. В юниксах эта клавиша является волшебной, способной разговаривать с ядром системы, не смотря на смерть, скажем xorg со всеми его халами.
Для меня в последнее время это особенно актуально, так как, похоже, nvidia накосячила с последними дровами, и с вероятностью 70% запущенные VLC или Java обрушивают либо xorg, либо модуль ядра nvidia (это все с включенными графическими свистелками в KDE).
В моем случае помогают следующие комбинации (Ctrl может понадобиться при живых иксах, которые иначе воспримут нажатие как PrintScreen):
(Ctrl +) Alt + SysRq + K – убить все в текущей консоли – прихлопывает xorg
(Ctrl +) Alt + SysRq + R – передать ядру управление устройствами ввода – это когда hal отправился по Стиксу вслед за xorg

Что бы фича была достпна, должна быть установлена соответствующая переменная ядра kernel.sysrq, прописывается она обычно в /etc/sysctl.conf

Полный список команд:
http://ru.wikipedia.org/wiki/SysRq

Процитируюю еще оттуда это:

Более правильно экстренную перезагрузку стоит проводить, зажав клавиши Alt + SysRq и с интервалом в 2-3 секунды нажать последовательно: R E I S U B
unRaw (перехватить управление клавиатурой),
tErminate (послать SIGTERM всем процессам),
kIll (послать SIGKILL всем процессам, которые не смогли завершиться предыдущей командой),
Sync (синхронизировать файловые системы),
Unmount (перемонтировать файловые системы в режим «только чтение»),
reBoot. (и напоследок, совершить перезагрузку)

Метки: ,

8 апр, 2011

Детектив про некромантию и про первую заповедь портного

Originally published at Блог-склерозник ~ArchimeD~'а. Please leave any comments there.

Сегодня случился эпик фейл, за который я долго бил себя ушами по щекам.
Веб-программист подсунул пхп скрипт для запихивания оного в крон на веб-сервере. Веб сервер крутится под FreeBSD 6.3. В какой-то неустановленный момент я, похоже, пытаясь запустить crontab от www юзера, лопухнулся, запустил его от рута, и с чистой совестью добавил на исполнение тот самый скрипт. Последствия были самые фатальные. Дада. Именно те, о которых вы и подумали. Кривой скрипт, неправильно определив текущую директорию, выполнил php-шный аналог rm -rf. В корне. От рута. Правда, в силу особенностей пхп, убив все содержимое в первой подвернувшейся директории /bin, скрипт не смог продолжить банкет ввиду отвутствия /bin/rm.
Ситуация:

  1. Вечер пятницы
  2. Боевой веб сервер, стоящий физически далеко в датацентре, без kvm
  3. Открытую ssh-сессию, от непривелигированного юзера
  4. Любые попытки вроде ls, cp и т.д. – /bin/command not found
  5. Отсутствие рутовых прав
  6. Невозможность ни переконнектиться по ссш, ни выполнить su – /bin/csh not found
  7. Порвавшуюся в итоге вифи-связь и отвалившийся ссш
  8. Чуть не поседевшего админа с круглыми глазами и трясущимися руками (меня т.е.)

Накатив для храбрости сто грамм (корвалола конечно же, а вы что подумали?), приступил к возврату пациента с того света. Прежде всего, остались висеть уже запущеные демоны – ссш и апач. У сервера есть веб-морда webmin, которую отдает живой апач. У вебмина есть файловый менеджер, работающий с рутовыми привелегиями (это мракобесие да, но сегодня это спасло сервер).
Кидаю клич на канале #bsdportal – нужны бинарники от 6.3. Находится добрый человек r1PPer (огромное ему спасибо), который их мне дает. Через webmin заливаю csh в /bin и выставляю разрешение на выполнение. Логинюсь по ssh – бинго, бинарник подхватился, повышаю привелегии до рута. Далее через sysinstall пытаюсь залить базовый набор программ. 6.3 – устаревший релиз, поэтому приходится указывать руками следующий адрес для загрузки:
ftp://ftp-archive.freebsd.org/pub/FreeBSD-Archive/old-releases/i386/6.3-RELEASE/

И, вот оно, счастье – в /bin лежит изначальный набор программ. Есть одно но – sysinstall потер конфиги из /etc, поэтому приходится в первую очередь бегом восстанавливать юзеров (вход рутом по ссш по дефолту запрещен, старых юзеров уже нет, ссш висит со старым логином, отваливаешься – обратно уже не подцепиться будет), настраивать /etc/ssh/sshd_config, потом конфиги bind’а и т.д. и т.п.

В общем, сервер я с того света выдернул. А мораль все та же – прежде чем рутом что-то делать на боевом сервере, семь раз отмерь, десять раз протри глаза, проверь свои действия, и затем уже отрежь.

З.Ы. а с веб-программистом я пообщаюсь в понедельник }:->

Метки:

5 апр, 2011

Проверка, является ли число степенью двойки

Originally published at Блог-склерозник ~ArchimeD~'а. Please leave any comments there.

Как-то уже давненько на собеседовании подкинули задачу – написать функцию, проверяющую, является ли число степенью двойки. Циклами задача решается на раз плюнуть, но как следует обмозговать времени не было. Поэтому, задача получилась на «кто знает». Впрочем, секрет мне раскрыли сразу же. Все просто:

bool is_power_of_2 (int arg)
{
     return !(num & (num - 1));
}

Финт основан на том, что у числа, являющемся степенью двойки в двоичном представлении присутствует только одна единица. И, соответственно, при вычитании 1, в единицы обращаются все младшии разряды. Таким образом, при логическом умножении самого числа на число, меньшее на единицу, должнен получиться ноль, при условии, что число – степень двойки.


8 = 00001000
8-1 = 7 = 00000111
7&8 = 00000000

Метки:

25 мар, 2011

FreeBSD: перетаскиваем систему на другой винт

Originally published at Блог-склерозник ~ArchimeD~'а. Please leave any comments there.

ПОнадобилось перетащить фрю на другой винт. Простое клонирование не прокатило бы по причине разных размеров винтов (целью было расширение разделов). Копирование как есть командой cp тоже не катит потому, что не говоря о всяких сокетах и т.д., есть у фрюши такая хитрожопая папочка /rescue, в которой куча файликов по 4.5М каждый, но папка в целом тоже занимает 4.5М. Но, при копировании командой cp, она раздувается до порядка 600 метров.
В просторах интернета было найдено решение. Собственно, сама строчка вполне распространена, но пояснений к ней дается мало. Поэтому, выкладываю что и как:

Для начала, все действия крайне желательно совершать в однопользовательском режиме, в который можно перейти командой

shutdown now

Далее, подключив уже винт делаем:

newfs -U /dev/ad0s1e
mount /dev/ad0s1e /mnt
( dump -0 -f - / ) | ( cd /mnt ; restore -rf - )

Если первые две команды сами по себе просты – создать файловую систему и подмонтировать ее, то третью я разберу.
Прежде всего – команды dump и restore – штатные команды FreeBSD для создания бэкапов и восстановления из них.
Опции dump:

«-0″ – уровень дампа, 0 сответствует полному дампу файловой системы. Все, что выше – создают инкрементальный бэкап.
«-f -» писать дамп в файл, который на самом деле «-» (стандартный поток вывода)

Далее, создаем трубу для потока вывода, перенаправляя его на поток ввода команды restore:

«-r» восстановить файловую систему из бэкапа
«-f -» читать дамп из файла, который на самом деле «-» (стандартный поток ввода)

Метки:

20 мар, 2011

Windows 7: доступ из Linux по SMB

Originally published at Блог-склерозник ~ArchimeD~'а. Please leave any comments there.

С семеркой по SMB протоколу как-то хреново работает не только Linux, но и Windows XP, и прочее и прочее. А все потому, что семерка использует протокол SMB v3. В Vista это был SMB v2.
Если третья версия нам нафиг не уперлась, то, для более быстрой и корректной работы остальных осей с семерочными шарами, ее можно отключить и использовать первую версию.
Делается это добавлением следующих ключей реестра:


[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\LanmanServer\Parameters]
"SMB2"=dword:00000000
"SMB3"=dword:00000000

Метки:

10 фев, 2011

Просмотр прямой трансляции с МКС в linux

Originally published at Блог-склерозник ~ArchimeD~'а. Please leave any comments there.

На сайте NASA есть онлайн телевидение, по которому можно, в том числе, посмотреть и прямую трансляцию с борта Международной Космической Станции. Но, как всегда, создатели подумали не о всех осях, поэтому, лезем в код страницы. А там мы находим ссылочку вот такого вот вида: http://www.nasa.gov/multimedia/isslivestream.asx, и открываем ее плеером vlc.

Иногда, можно увидеть интерьер станции и работающих космонавтов. Текущий на сегодня состав МКС-26: http://ru.wikipedia.org/wiki/МКС-26
За время наблюдения мне удалось увидеть троих – работающего Паоло Несполи, и пролетающих мимо Скотта Келли и Катерину Коулман (на скриншоте).

МКС, летящая Катерина Коулман

1 фев, 2011

Qt 4.7, StretchFactor

Originally published at Блог-склерозник ~ArchimeD~'а. Please leave any comments there.

Долго пытался понять по документации, что же представляет из себя параметр stretch и какие единицы (проценты/пиксели/ежики/etc …) он задает. Все проще. Например, код

splitter.addWidget(&leftPanel);
splitter.addWidget(&rightPanel);
 
splitter.setOrientation(Qt::Horizontal);
 
splitter.setStretchFactor(0,1);
splitter.setStretchFactor(1,5);

Добавляет виджету QSplitter два других виджета, задает их горизонтальное расположение, и, самое главное, задает размеры.
setStretchFactor(0,1) указывает виджету leftPanel занять 1 часть свободного пространства
setStretchFactor(1,5) указывает виджету rightPanel занять 5 частей свободного пространства

В итоге получается, что первый занимет 1/6, второй – 5/6 частей. И, естественно, теряется смысл задавать stretch для одного виджета.

Метки:

26 янв, 2011

Таймаут ожидания данных от клиента

Originally published at Блог-склерозник ~ArchimeD~'а. Please leave any comments there.

В многопоточном сервере каждая нить отвечает за обслуживание клиента – причем в продолжительном периоде, т.е. ведет многократную прием-передачу данных. Функция чтения из сокета recv ожидает данные от клиента. Если клиент не шлет никаких данных – нить тупо висит и ничего не делает, а это не хорошо, и клиента нужно отцепить. Думал, как сделать.
В свойствах сокета можно выставить флаг SO_RCVTIMEO, но вот незадача

SO_RCVTIMEO
Sets the timeout value that specifies the maximum amount of time an input function waits until it completes. It accepts a timeval structure with the number of seconds and microseconds specifying the limit on how long to wait for an input operation to complete. If a receive operation has blocked for this much time without receiving additional data, it shall return with a partial count or errno set to [EAGAIN] or [EWOULDBLOCK] if no data is received. The default for this option is zero, which indicates that a receive operation shall not time out. This option takes a timeval structure. Note that not all implementations allow this option to be set.

последняя фраза все убивает.

Пока ТЕОРЕТИЧЕСКИ надумал два варианта:
1) Сделать сокеты неблокируемыми. Если сразу не получили данные – ловим EWOULDBLOCK и снова опрашиваем сокет. Если по истечению времени, так и не пришли данные, закрываем подлючение.

2) Извращенский. Создать вочдог, в нем регестрировать a) нить б) коллбэк нити в случае зависания. Внутри создать массив с итераторами. В цикле обслуживания клиента нить обнуляет свой элемент массива. Запустить вочдог в отдельном потоке – через определенное время, каждый элемент массива увеличивается на 1. Как только значение достигло 2х – клиент висит, вызываем коллбэк на закрытие подключения.

Данный пост – именно напоминалка самому себе. Второй метод явно не годится для конкретной задачи, но общую идею, чтобы не забыть, записал тут – потом она мне пригодится.

Метки: , ,

21 янв, 2011

Класс-шаблон матрицы, C++

Originally published at Блог-склерозник ~ArchimeD~'а. Please leave any comments there.

Раз уж выложил АВЛ-дерево, выложу и шаблон матрицы. Делалось в качестве лабораторной 4 года назад, вроде работало. За качество/удобочитаемость и т.д. уже не отвечаю. Потому что уже в упор не помню, что и как делал. Просто случайно раскопал в документах. Но feedback по багам и ошибкам приветствуется – поправлю, если что.

Скачать исходник (matrix.h)

В файле объявлены классы:

родительский table – таблица
дочерний matrix – матрица

относительно matrix перегружены следующие операторы:

>> (friend) – ввод матрицы
< < (friend) - вывод матрицы
~ - транспонирование
+ - сложение
- - вычитание
* - умножение
! - обратная матрица (нахождение с помощью алгебраических дополнений)
[] - обращение к объекту, как к двумерному массиву
= - оператор присваивания

дополнительные члены:
det ( void ) - нахождение определителя матрицы
ret_w ( void ) - возвращает кол-во столбцов в матрице
ret_h ( void ) - возвращает кол-во строк в матрице
matrix ( const matrix &obj ) – конструктор копий

Метки:

Предыдущие 10