LINUX.ORG.RU

Избранные сообщения BRE

timertt — библиотека с реализацией таймерных нитей для C++11

Форум — Development

Дабы выбросить из своего проекта ACE Framework пришлось сделать свою реализацию таймеров. Получилась небольшая библиотека, которая не имеет внешних зависимостей и использует только возможности стандартной библиотеки C++11. Проверялась под Windows (MSVC++2013, MinGW-w64 GCC 4.9.1) и Linux (GCC 4.9.1).

Лицензия: 3-х секционная BSD. Т.е. использоваться может без проблем как в открытых, так и в закрытых проектах.

Библиотека поддерживает только таймеры на основе тайм-аутов, т.е. таймеры, которые должны сработать через сколько-то миллисекунд (секунд, минут и т.д.) после момента активации таймера. wallclock-таймеры не поддерживаются.

Таймеры могут быть однократными (срабатывают всего один раз, после чего деактивируются), либо периодическими (повторяются до тех пор, пока не будут явно деактивированы или пока таймерная нить не завершит свою работу).

Библиотека поддерживает три таймерных механизма: timer_wheel, timer_heap и timer_list, у каждого из которых есть свои преимущества и недостатки. Может поддерживаться большое количество таймеров (сотни тысяч, миллионы или даже десятки миллионов) и обеспечивается высокая скорость обработки таймеров (до нескольких миллионов в секунду, но это зависит от времени работы связанных с таймером пользовательских событий).

В коде все это выглядит приблизительно следующим образом:

#include <iostream>
#include <cstdlib>

#include <timertt/all.hpp>

using namespace std;
using namespace std::chrono;
using namespace timertt;

int main()
{
	timer_wheel_thread_t tt;

	// Timer thread must be started before activation of timers.
	tt.start();

	// The simple single-shot timer.
	tt.activate( milliseconds( 20 ),
			[]() { cout << "Simple one-shot" << endl; } );

	// The simple periodic timer.
	// Will work until timer thread finished.
	tt.activate( milliseconds( 20 ), milliseconds( 20 ),
			[]() {
				static int i = 0;
				cout << "Simple periodic (" << i << ")" << endl;
				++i;
			} );

	// Allocation of timer and explicit activation.
	auto id1 = tt.allocate();
	tt.activate( id1, milliseconds( 30 ),
			[]() {
				cout << "Preallocated single-shot timer" << endl;
			} );

	// Periodic timer with timer preallocation, explicit activation
	// and deactivation from the timer action.
	auto id2 = tt.allocate();
	tt.activate( id2, milliseconds( 40 ), milliseconds( 15 ),
			[id2, &tt]() {
				static int i = 0;
				cout << "Preallocated periodic (" << i << ")" << endl;
				++i;
				if( i > 2 )
					tt.deactivate( id2 );
			} );

	// Single-shot timer with explicit activation and deactivation
	// before timer event.
	auto id3 = tt.allocate();
	tt.activate( id3, milliseconds( 50 ),
			[]() {
				cerr << "This timer must not be called!" << endl;
				std::abort();
			} );
	tt.deactivate( id3 );

	// Wait for some time.
	this_thread::sleep_for( milliseconds( 200 ) );

	// Finish the timer thread.
	tt.shutdown_and_join();
}

Скачать можно с SourceForge: только header-only вариант или же полный вариант с тестами/примерами. Документация там же в Wiki (пока на русском языке, потихоньку будет переводиться на английский).

Еще чуть-чуть подробностей по релизу здесь.

Сразу поясню для желающих спрашивать «нафига это нада?» и/или «афтар, а чем это лучше/хуже?». Если вы в своем проекте уже используете какой-то фреймворк/библиотеку, предоставляющий таймеры (например, ACE/Boost/Qt/wxWidgets/libuv/libev/libevent/you-name-it), то, скорее всего, timertt вам не нужен. Если только вы не обнаружите, что ваш инструмент не очень хорошо справляется с миллионом таймеров или же вам надоело натягивать свою прикладную логику на API вашего инструмента (актуально, например, для ACE, где таймерные очереди реализованы здорово, на вот API для них несколько своеобразный и не всегда удобный).

Если же в вашем проекте никаких тяжеловесных зависимостей нет, а таймеры нужны, то можно и в сторону timertt посмотреть.

Ну а вообще делал для себя, но не вижу причин не выложить в виде OpenSource.

 

eao197
()

Кому-нибудь нужна еще одна либа с реализацией spinlock-ов для C++11?

Форум — Development

У меня внутри одного проекта валяется, по-сути, полностью автономная, header-only библиотека с реализацией single-reader/single-writer и multi-reader/single-writer спинлоков: spinlocks.hpp

Базируется она на информации из документации к стандартной библиотеке C++11, идеях Дмитрия Вьюкова (так же известного как remark, одного из ведущих разработчиков Thread Sanitizer, невероятно крутого гуру в области многопоточности), исходных текстов LLVM и libcds. Собственно, код rw_spinlock, это калька с реализации аналогичного спинлока Димы из LLVM.

Так вот, если у кого-то будет интерес, то можно будет выделить spinlocks.hpp в отдельный подпроект, снабдить его примерами, более развернутой документаций. И публиковать ее релизы и дистрибутивы как релизы самостоятельного проекта. Получится такая легковесная библиотека со spinlock-ами, базирующаяся только на стандартной библиотеке C++11, без дополнительных внешних зависимостей.

Интересно/нужно это кому-то?

Если интересно или нужно, то какое имя будет подходить этой библиотеке? Например, stdcxx_spinlocks/stdcxx_spins/cxx11_spinlocks/cxxspinlocks?

 ,

eao197
()

Gideros заопенсорсили

Форум — Development

http://giderosmobile.com/forum/discussion/5243/gideros-source-released

https://github.com/gideros/gideros

Это такой 2D движок для игр. Для смартфонов, в основном. С++, Lua, редактор на Qt. MIT.

Перемещено Shaman007 из talks

 , ,

aidan
()

как получить статистику по TCP порту?

Форум — General

приветствую!

есть программа сервер, принимающая пользователей по определенному порту.

скажите, каким образом я могу получить такую информацию как: 1)кол-во подключений, 2)прочитано байт, 3)записано байт, 4)скорость чтения, 5)скорость записи?

благодарен.

niXman
()

Syncthing 0.9 — программа для синхронизации и резервного копирования

Новости — Open Source
Группа Open Source

Состоялся очередной выпуск Syncthing — открытой кросслатформенной программы для синхронизации и резервного копирования. По своим возможностям она аналогична BitTorrent Synс: заявлена синхронизация файлов между узлами в P2P-сети без участия сервера. Для этого используется собственный открытый протокол BEP («Block Exchange Protocol»).

Возможности программы:

  • Синхронизация директорий и файлов по дате последнего изменения (пока без поддержки версионности).
  • Поддержка синхронизации на уровне блоков. При малом изменении в большом файле будет синхронизироваться лишь изменившаяся часть.
  • Возможность явно указать, каким узлам будет доступна синхронизируемая директория.
  • Опция «master-slave», благодаря которой другие узлы будут лишь синхронизироваться с данной директорией, но не смогут изменять её содержимое.
  • Управление через отзывчивый веб-интерфейс.
  • Кроссплатформенность. Поддерживаются операционные системы Linux, Mac OS X, Windows, FreeBSD и Solaris. Существует неофициальный клиент для Android.
  • Одинаково хорошая работа в пределах LAN и через Интернет.
  • Безопасность и приватность. Данные хранятся на клиентских машинах, не требуется взаимодействие со сторонним сервером. Поддерживается TLS.
  • Каждый узел в сети идентифицируется по стойкому сертификату.
  • Открытый исходный код приложения и открытый протокол.

Изменения в версии 0.9

  • Утеряна совместимость с предыдущими версиями (0.8.x). Необходимо обновить все ноды до актуальной версии. Обновить придётся весь кластер, поскольку syncthing 0.9 не может обмениваться данными с более старыми версиями. Рекомендуется проводить обновление, когда все ноды синхронизированы. Потребуется полное перестроение индексов для всех файлов. Старые индексы и файлы конфигурации будут сохранены в отдельном каталоге «backup-of-v0.8».
  • Графический интерфейс переведён на различные языки: русский, английский, немецкий, испанский, французский, итальянский, португальский, греческий и шведский.
  • Заметно уменьшено потребление памяти в больших кластерах за счёт несколько возросшей нагрузки на процессор и незначительного снижения производительности.
  • Графический интерфейс стал событийно-ориентированным. Устранена проблема, из-за которой графический интерфейс иногда вызывал чрезмерно высокую нагрузку на процессор.
  • Алгоритм сжатия пересылаемых данных изменён с deflate на LZ4, что заметно разгружает центральный процессор. Сжатие можно отключить через графический интерфейс управления узлом для каждого узла в отдельности.
  • Обновление можно производить прямо из графического интерфейса (эта функция пока не поддерживается в версии для Windows).
  • Обновлен формат идентификаторов нод, для проверки добавлены контрольные суммы.
  • Больше не синхронизируется время изменения каталогов (однако, не исключено, что это будет когда-нибудь включено вновь).
  • Если включено версионирование файлов, каталог .stversions не будет расползаться по всем узлам, а храниться только в корне репозитория. При обновлениях придется чистить содержимое этого каталога вручную.
  • Устранена порция мелких ошибок и недоработок. Разумеется, добавлены новые.

Доступны готовые сборки под все основные десктопные платформы, скриншоты, руководство по быстрому запуску и прочая документация.

>>> Подробности

 , ,

anonymous
()

Где проще создавать контент для игры: в 2d или 3d?

Форум — Development

Стоит ли уходить в 2d или в 3d проще создавать? Пример где 3d уделывает 2d. Художнику больше бы понадобилось усилий чтобы нарисовать такое, а вы как думаете?

 , , ,

elf80lvl
()

qt4-qt5 веб-интерфейс

Форум — Development

Всех приветствую. Возник срочный вопрос принципиального характера. Есть некая гуи-прога написанная на qt4 (ну или 5). Есть там некоторый интерфейс на базе стандартных виджетов. Есть ли какая-то возможность ко всему это прикрутить веб-морду с минимальными усилиями? Веб-морда должна просто копировать интерфейс и все.

Есть конечно вариант пробросить интерфейс через ssh -XC, но это будет запасной вариант.

 ,

yax123
()

Дырявые сайты, идёт рассылка спама

Форум — Admin

Postfix+Dovecot

В очереди по 30к писем стоят, постоянно заносят в блеклисты. Отправка писем идёт с адресов:

random_name@domain.com
Можно ли как-то сделать в postfix так, чтобы отправлять письма можно было только с уже имеющихся почтовых акков, а рандомногенерируемые запретить?

Вот эта строчка вроде как не позволяет не авторизованным пользователям отправлять почту, но вроде она не работает (или я её неправильно понял?)

smtpd_sasl_security_options = noanonymous

Конфиг:

# cat /etc/postfix/main.cf
smtpd_banner = $myhostname ESMTP $mail_name (Debian/GNU)
biff = no

# appending .domain is the MUA's job.
append_dot_mydomain = no

# Uncomment the next line to generate "delayed mail" warnings
#delay_warning_time = 4h

readme_directory = no

# TLS parameters
smtpd_tls_cert_file = /etc/postfix/sslsmtpd.crt
smtpd_tls_key_file = /etc/postfix/sslsmtpd.key
smtpd_use_tls = yes
smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache
smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache

myhostname = domain.com
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases
myorigin = $myhostname
mydestination = $myhostname, localhost.$mydomain, localhost
bounce_queue_lifetime = 0
relayhost = 
mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128
mailbox_size_limit = 0
recipient_delimiter = +
inet_interfaces = all
command_directory = /usr/sbin
daemon_directory = /usr/lib/postfix
mydomain = localdomain
mailbox_command = /usr/bin/maildrop
local_recipient_maps = unix:passwd.byname $alias_maps
virtual_alias_domains = /etc/mail/local-host-names
virtual_alias_maps = hash:/etc/mail/virtusertable
smtp_generic_maps = hash:/etc/mail/generic
sender_dependent_default_transport_maps = regexp:/etc/mail/domainips
default_transport = smtp:
smtpd_sasl_auth_enable = yes
broken_sasl_auth_clients = yes
#####
smtpd_sasl_security_options = noanonymous
#####
smtpd_tls_auth_only = no

smtp_use_tls = yes
smtp_tls_note_starttls_offer = yes
smtpd_tls_received_header = yes
smtpd_tls_loglevel = 1

# Запретить исходящую почту с наших доменов, но с несуществующих у нас адресов???
smtpd_reject_unlisted_sender = yes

smtpd_sender_restrictions = permit_sasl_authenticated, check_sender_access hash:/etc/mail/access
smtpd_client_restrictions = permit_sasl_authenticated, check_client_access hash:/etc/mail/access
smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, check_sender_access hash:/etc/mail/access, check_client_access hash:/etc/mail/access, check_recipient_access hash:/etc/mail/access, reject_unauth_destination, reject_unlisted_recipient, reject_unverified_recipient, check_policy_service inet:127.0.0.1:10023
milter_default_action = accept
milter_protocol = 6
smtpd_milters = unix:/var/run/clamav/clamav-milter.ctl, inet:localhost:12345
non_smtpd_milters = inet:localhost:12345

 , ,

Amet13
()

анонс: SObjectizer 5.3.0

Форум — Development

SObjectizer — это реализация модели акторов для C++, позволяющая программировать на C++ с использованием работающих на разных нитях агентов, общающихся между собой посредством сообщений. SObjectizer существенно упрощает разработку событийно-ориентированных приложений, для параллельной и независимой обработки событий в которых требуется многопоточность и/или распределенность. SObjectizer использовался для создания как для мелких утилит, так и серьезных распределенных приложений, работающих под большой нагрузкой в режиме 24x7.

Последние несколько лет SObjectizer развивается на SourceForge как OpenSource проект под BSD-лицензией. Версия 5.3.0 является очередным существенным шагом по наращиванию возможностей SObjectizer при одновременном упрощении его использования.

В версии 5.3.0 произведены значительные улучшения:

  • добавлена возможность организации синхронного взаимодействия агентов: инициатор запроса может синхронно ожидать результата на объекте std::future, в то время как обработчик запроса работает обычным образом на своей рабочей нити;
  • более активно используются лямбда-функции, введенные в C++11. Например, теперь обработчики событий могут быть заданы посредством лямбда-функций, что позволяет уменьшить объем кода агентов;
  • добавлена возможность создавать ad-hoc агентов, формируя агента из лямбда-функций, а не описывая отдельный, унаследованный от so_5::rt::agent_t, класс;
  • доработана модель реагирования на выпущенные из обработчиков событий исключения.

Эта версия так же содержит несколько более мелких исправлений, улучшений, доработок и примеров.

Традиционный пример “Hello, World” теперь может быть записан вот так:

so_5::api::run_so_environment(
  []( so_5::rt::so_environment_t & env ) {
    auto coop = env.create_coop( "hello" );
    coop->define_agent().on_start( [&env]() {
      std::cout << "Hello, World" << std::endl;
      env.stop();
    } );
    env.register_coop( std::move( coop ) );
  } );
А более интересный пример ping_pong, где каждый агент работает на контексте своей собственной нити, вот так:
int pings_left = 10000;
so_5::api::run_so_environment(
  [&pings_left]( so_5::rt::so_environment_t & env )
  {
    struct msg_ping : public so_5::rt::signal_t {};
    struct msg_pong : public so_5::rt::signal_t {};

    auto mbox = env.create_local_mbox();
    auto coop = env.create_coop( "ping_pong",
       so_5::disp::active_obj::create_disp_binder( "active_obj" ) );
    coop->define_agent()
      .on_start( [mbox]() { mbox->deliver_signal< msg_ping >(); } )
      .on_event( mbox, so_5::signal< msg_pong >,
        [&pings_left, &env, mbox]() {
          if( --pings_left > 0 )
            mbox->deliver_signal< msg_ping >();
          else
            env.stop();
        } );
    coop->define_agent()
      .on_event( mbox, so_5::signal< msg_ping >,
        [mbox]() { mbox->deliver_signal< msg_pong >(); } );
    env.register_coop( std::move( coop ) );
  },
  []( so_5::rt::so_environment_params_t & params )
  {
    params.add_named_dispatcher( "active_obj", so_5::disp::active_obj::create_disp() );
  } );

Версия распространяется в виде сборки so-201407-00, в которую кроме SObjectzer 5.3.0 входит еще несколько SObjectizer-библиотек, предназначенных для разработки больших, распределенных приложений на основе SObjectizer, а именно:

  • so_log, служащая оберткой над ACE Logging и упрощающая логирование для агентов;
  • so_sysconf, позволяющая собирать большое приложение из маленьких кусочков, оформленных в виде dll/so-библиотек;
  • so_5_transport, оформляющая работу с TCP/IP соединениями в виде транспортных SObjectizer-агентов;
  • mbapi, являющаяся высокоуровневой библиотекой для обмена сообщениями между агентами или между компонентами распределенного приложения.

Релизная сборка может быть загружена с SourceForge в виде архива или же взята из svn-репозитория.

Wiki-раздел SObjectizer-а на SourceForge содержит более подробную информацию как об особенностях версии 5.3.0, так и о самом SObjectizer и его основах.

 

eao197
()

Распознование символов

Форум — Development

Кто в теме, подскажите, какие алгоритмы стоит посмотреть для выделения символа из слова и слова из изображения. С учетом того, что символы могут иметь разную высоту/ширину, быть расположены чуть ниже/выше друг друга, слово может иметь форму дуги.

Если делать через окно поиска, то, правильно ли я понимаю последовательность действий -
1. задать начальную ширину-высоту, пройтись по всему изображению, меняя угол поворота окна и пытаясь распознать хоть что-то с заданной ошибкой.
2. изменить размеры окна и повторить 1.

 

pseudo-cat
()

Кто грузит канал?

Форум — Admin

В iptables поднят nat. Кто то в локалке усилено жрет трафик. Как узнать в удобно читабельном виде с какого ip? netstat как то не очень удобен.

Humaxoid
()

mysql жрёт 400+ мегабайтов, надо уменьшить

Форум — Admin

Разворачиваю сайт на VPS-ке с 512 мегабайтами памяти. mysql сейчас кушает 400+ мегабайтов (free до запуска и free после запуска). База пустая. В конфиге только одну настройку выставил:

innodb_buffer_pool_size=16M

Все настройки тут: http://pastebin.com/eph8R1MA

Как вообще понять, на что память уходит? Нужно снизить потребление хотя бы до 200 мегабайтов сохранив хорошую скорость. Движок будет использоваться InnoDB.

Legioner
()

Как лучше вывести видео на телевизор?

Форум — Multimedia

Здравствуй, лор.

Опишу ситуцию. До текущего момента смотрел фильмы/видео на компьютере, монитор 22 дюйма. Вчера решил, хочу смотреть на большем экране. Сегодня поехал купил такой телевизор:

http://www.dns-shop.ru/catalog/i162826/televizor-led-42-samsung-ue42f5300.html

Файлы я скачиваю на домашний сервер (debian), раньше смотрел через nfs или samba. Вот как мне теперь лучше смотреть эти скачанные файлы на телевизоре? Почитал про dlna, это нормальный способ? Если да, то что лучше ставить? Или может лучше подключить через hdmi и смотреть с компьютера? Или может есть телевизоры которые могут напрямую с nfs/samba работать?

Как пожелание, хотелось бы при просмотре всем этим делом управлять пультом телека.

 , ,

orm-i-auga
()

Запретить sendmail пересылку писем приходящих извне

Форум — Admin

Доброй ночи,

Ребят, подскажите пожалуйста, каким образом можно заставить sendmail обрабатывать только те письма, которые идут с сайтов расположенных на локалхосте. Со вчерашнего дня беда - куча европейцев пишут мне жалобы на то, что им сыпет спам с nginx@мойдомен.ru

Хотелось бы какого-нибудь простого варианта.. можно через iptables если это возможно.

Нашел похожий топик на форуме, но решения предложенные ТСу крайне сложны и совершенно непонятны.

Заранее спасибо.

 , , ,

Abramovich
()