sleep() в C


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

Возможно, Вы думаете, что можно положиться на то, что sleep() возвращает время, которое ему нужно "доспать" и просто итерировать цикл, до тех пор, пока возвращаемое значение не будет равно 0. Давайте обратимся к документации библиотеки libc.
Читать дальше

pthread_cancel() и C++


С приходом в нашу жизнь реализации Linux тредов NPTL, стало доступно досрочное завершение тредов. Представьте себе ситуацию, когда у Вас есть треды с блокирующими системными вызовами или просто треды, использующие sleep() (что ещё хуже) и Вам вдруг понадобилось их завершить. В случае, если Вы программируете на С, скорей всего проблем не будет. Грабли начинают когда Вы решаете сделать тоже самое в C++.

Конечно, с ходу можно посоветывать переписать код и использовать неблокирующие системные вызовы в бесконечном цикле, с условием итерирования. А sleep() заменить на nanosleep() с обработкой EINTR. Но всегда есть абстрактная ситуация в вакууме, когда есть рабочий код и Вам придётся разбираться почему он падает после Ваших изменений.

Кроме того, принудительное завершение треда, может избавить Вас от необходимости контроля начавшейся итерации цикла, или даже, в теории отменить уже запущенный системный вызов, который использует переход в режим ядра (kernel mode).
Читать дальше

Обработка клика по объекту формы в Qt


В Qt есть очень универсальный способ, позволяющий обработать клик практически на любом элементе формы, у которого даже нет сигнала clicked().
Если вы имеете дело с производным от класса QWidget достаточно реализовать приватную, виртуальную функцию
Читать дальше

bash->установка бита владельца директории из списка


Недавно пришлось решать немного странную задачку на BASH. Был список в текстовом формате:
группа=путь

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

Bash: Скрипт для бекапирования хостинга (apache mysql)


У меня это работает так. Каждое N-количество времени запускает скрипт, который архивирует tar`ом содержимое htdocs из /var/www, делает sql дампы, раскладывает это по соответствующим директориям, потом раскладывает это всё по директориям с датой.
Кому лень это писать самому - забирайте.
Читать дальше

PHP->HTML: проверить атрибуты HTML тегов (априори, парсинг HTML)


В данный момент я работаю над проектом, в котором любой пользователь извне может принять участие. В таких условиях приходиться внимательно следить за вводом HTML кода, поэтому я потратил достаточно много времени на написание функционала, отвечающего за фильтрацию пользовательского ввода.
Читать дальше

PHP->Webasyst: программирование под популярный движок виртуального магазина


Webasyst - движок, использующий Smarty в качестве шаблонизатора. Cвои функции всё равно можно писать, через интерфейс плагинов Smarty. Плюсы этого способа - простота освоения и лёгкая инсталляция. Минусы - из таких плагинов не работают множество полезных и удобных функций движка, которые при написании плагина сэкономили бы вам кучу времени, а так же, не оправданно сложная развёртка сложных структур.
В этом мануале, я так же рассмотрю интерфейс самого движка, в котором работают все функции, используются классы и объекты, а установка сложнее.
Читать дальше

PHP: Построение древовидных данных в PHP


Недавно, возникла потребность сделать древовидный, порядковый список категорий, в одном из проектов.
2 главных условия, которые соблюдал:
1) в html должны наглядно показываться родительские элементы и их "дети";
2) для всей операции 1 SQL запрос.
Читать дальше

Парсинг Magnet ссылок


Недавно обкатал новую интересную функцию на DC портале. Для неё использовал в классе парсера функцию PHP «preg_replace_callback«. Суть функции заключается в том что она берёт параметром функцию обратного вызова ко всем найденным выражениям и найденное заменяет тем что функция вернула.



Внутри функции заключил 2 функции: первая, format_size, формирует размер, кстати вот она:


Читать дальше