LINUX.ORG.RU

Сообщения Chaser_Andrey

 

YaCy спустя 3 года: кто ещё продолжает юзать, кто уже начал? Как впечатления?

Форум — Talks

На хабре появилась заметка про YaCy (p2p-поисковик) http://habrahabr.ru/post/212407/

На ЛОРе что-то давно не было обсуждений, поэтому открываю новый тред по YaCy.

Делитесь историями успеха.

 , ,

Chaser_Andrey
()

Уважаемым чайкам с треда «для обмена ключами, скидками и прочими игровыми радостями»

Форум — Talks

Что-то въелось в голову название «чайки». Кажется, так с легкой руки первый назвал fallout4all регулярно пасущихся там.

Просьба всех согласных и несогласных отписаться, чтобы примерно знать распределение мнений.

Итак, господа. Я подписан на данную тему, и наблюдаю такое явление, как нашествие «чаек», то есть, небольшого количества участников, которые собирают халявные ключи регулярно. Просто хотел бы обратить внимание всех участвующих.

Всё нижесказанное — моё скромное мнение, без попыток оскорбления кого-либо лично.

Всё хорошо, когда это в меру. Бескорыстный обмен — это же прекрасно. Но плохо, когда им злоупотребляют. Именно «чаек» я считаю теми, кто злоупотребляет бескорыстностью других участников.

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

И ситуацию, когда несколько наиболее активных участников пытаются получить халявные ключи, я считаю несправедливой по отношению к другим пользователям ЛОРа, у которых нет возможности 24/7 сидеть на ЛОРе или в RSS, но которые хотели бы иметь возможность получить какую-то игрушку, чтобы провести за ней выходные или свободное время.

Поэтому я призываю «чаек» поумерить свой пыл и аппетиты, дабы не загубить хорошую идею, а раздающим — более случайно выбирать получателя, а не первого отписавшегося, или пересмотреть стратегию раздачи ключей.

Также не считаю оправданием «нет денег, а поиграть хочцца», чтобы регулярно злоупотреблять добротой участников. Блджад, если есть столько времени, чтобы играть кучу игр нон-стоп, то его можно потратить и на фриланс.

P.S. У меня чайки не забрали ни одну из вкусных игр :) Считайте этот тред активной гражданской позицией.

P.P.S. Дабы мне не быть предвзятым, можете здесь оставлять ники чаек для тех, кто хотел бы более честного распределения контента, а не отдавать чайкам.

Chaser_Andrey
()

Чем больше у нас вещей — тем меньше мы тратим времени на любимые дела

Форум — Talks

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

Содержание огромного многоэтажного дома (и поддержание его в исправности и чистоте) куда сложнее, чем поддержание обычной квартиры в хорошем состоянии.

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

Современному человеку удобно быть мобильным, без аристократических замашек и глупой привязанности к барахлу и «ценностям».

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

P.S. Я не рассматриваю случаи, когда непосредственно что-то вроде ремонта автомобилей или садоводство является хобби и приносит удовлетворение.

 ,

Chaser_Andrey
()

Тулза для автоматизации конфигурирования ядра — я всё правильно делаю?

Форум — General

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

Для примера я буду рассматривать архитектуру amd64. Defconfig 86_64_defconfig находится в arch/x86/configs/x86_64_defconfig.

При запуске make menuconfig начальный .config генерируется исходя из значений в x86_64_defconfig. При запуске make defconfig происходит то же самое. Я проверил — сгенерированные конфиги идентичны.

В чём заключается идея.

Допустим, у меня есть шаблон для моего компа http://pastebin.com/MXpAf9qD. Я хочу натравить его на x86_64_defconfig, изменив или добавив необходимые опции. Я написал небольшую тулзу. На данный момент выхлоп примерно такой

Pass CONFIG_DEVTMPFS
Pass CONFIG_DEVTMPFS_MOUNT
Add CONFIG_IKCONFIG [m]
Add CONFIG_IKCONFIG_PROC [y]
Pass CONFIG_EXT4_FS
Add CONFIG_FUSE_FS [m]
Add CONFIG_UDF_FS [m]
Add CONFIG_TUN [y]
Add CONFIG_NET_SCH_HTB [m]
Add CONFIG_NET_SCH_INGRESS [m]
Add CONFIG_NETFILTER_XT_MATCH_COMMENT [m]
Add CONFIG_NETFILTER_XT_MATCH_HASHLIMIT [m]
Add CONFIG_PM_RUNTIME [y]
Pass CONFIG_EXT4_FS_SECURITY
Add CONFIG_I2C_PIIX4 [m]
Add CONFIG_I2C_CHARDEV [m]
Add CONFIG_MK8 [y]
Change CONFIG_DRM [y->m]
Add CONFIG_DRM_RADEON [m]
Add CONFIG_DRM_NOUVEAU [m]
Add CONFIG_USB_XHCI_HCD [m]
Add CONFIG_CONFIG_R8169 [m]
Add CONFIG_USB_STORAGE_REALTEK [m]
Add CONFIG_SENSORS_IT87 [m]
Add CONFIG_SENSORS_K10TEMP [m]
Add CONFIG_BONDING [m]
Add CONFIG_TRANSPARENT_HUGEPAGE [y]
Add CONFIG_TRANSPARENT_HUGEPAGE_ALWAYS [y]
Add CONFIG_DM_SNAPSHOT [m]
Add CONFIG_EDAC_DECODE_MCE [y]

После этого идет запуск

make defconfig
Пока что всё вроде работает. Только предварительно надо делать резервную копию x86_64_defconfig.

Примеры синтаксиса в утилиты:

DEFCONF=arch/x86/configs/x86_64_defconfig
cp $DEFCONF $DEFCONF.bac

# обычное использование
kernel-config-patcher -v -o $DEFCONF $DEFCONF.bac -s ~/my.config

#или можно указать несколько пользовательских конфигов
kernel-config-patcher -v -o $DEFCONF $DEFCONF.bac -s ~/base.config -s ~/desktop.config -s ~/router.config

#или можно указывать опции прямо как аргумент (на стадии доработки)
kernel-config-patcher -v -o $DEFCONF $DEFCONF.bac CONFIG_EXT4_FS=n CONFIG_TUN=y

Вопрос: что я мог упустить?

 , ,

Chaser_Andrey
()

Пока гром не грянет — мужик не перекрестится

Форум — Talks

Пока у $username не грохнут его личные данные — он не будет серьёзно относится к паролям и безопасности в интернете.

А ведь Интернет — давно уже не закрытый клуб джентельменов.

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

Да-да, речь идет о драме с удалением данных на сервере.

Почему я создал эту тему? Почему я не отписался там же или в отдельной теме https://www.linux.org.ru/forum/linux-org-ru/10146768?

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

Автомобили, права и правила дорожного движения. Кто готов спорить с тем, что правила дорожного движения не написаны кровью? Как бы Вы себя чувствовали на дороге, когда бы могли водить все и в любом состоянии? Когда не известно, кто за рулем встречной машины — опытный водитель, малолетний стрит-рейсер или нажравшийся алкаш? На самом деле, в реальности действительно нельзя быть ни в чём уверенным, но, благодаря законам, выезжать на дорогу в нетрезвом виде чревато лишением прав и отправкой машины на штрафплощадку, а потому количество неадекватных водил всё же намного меньше, чем было бы в случае отсутствия правил.

Позвольте задать вопрос...Кто виноват в милионных ботнетах? В массовой рассылке спама? В DDoS атаках мощностью в сотни гигабайт? Прочитайте пункты:

  • Вы беспечно относитесь к паролям, на своём компе, на публичных сервисах, на компах предприятия.
  • Вы создаете «одноразовые» учётки где-либо с паролями сродни qwerty или 123456.
  • Вы игнорируете степень защищенности компов ваших знакомых, если они просят вас настроить или же просто дают доступ. Какое вам дело до них?
  • Вы считаете, что персонально Вы или ваш компьютер никому не нужен, и на нём нет важной информации.
  • Вы полезли админить, не ознакомившись с элементарщиной в плане кибербезопасности.

Если хотя бы один пункт про Вас — то в вышеперечисленных бедах виноваты конкретно Вы.

Почему же все ринулись защищать пострадавшего? Почему защищающие не удосужились в первую очередь отчитать наивного админа локалхоста за вопиюще глупый поступок?

В моих глазах пострадавший — это ребенок, который взял машину и выехал на ней на автобан без навыков вождения. Мало того, что он предсказуемо пострадал, он ещё и поставил под угрозу других участников движения.

На его комп могли установить троян, прокси, vpn, заюзать локальный сплойт, использовать для рассылки спама, или оставить бэкдор. И это могло задеть каждого из нас, как участников глобальной сети.

Поэтому я всё же за:

  • Введение каких-то экзаменов на знание элементарных правил работы Интернета. Тем, кто ратует за статус компа как обычного бытового устройства, я хочу напомнить, что любое сложное бытовое устройство снабжается инструкциями по пользованию, и там есть раздел «Запрещается», который тоже пишется кровью.
  • Применение санкций со стороны провайдера при обнаружении легкополучаемого административного доступа к устройству или сервису (в ряде случаев даже прав пользователя хватает на запуск зловредов). Пусть санкции будут хотя бы в виде блокировки порта, пока беспечный юзер не пофиксит проблему. Потому что дыра на компе юзера чревата (помимо вышеперечисленного) ещё и баном целой подсети провайдера или занесенем в блэк/спам-листы.
  • Прекращения соболезнованию дятлу, не поставившему пароль. Сегодня он положился на авось, и выставил на всеобщее обозрение свой сервер с личными данными. Кто знает, если бы ему не грохнули данные сегодня, то завтра потенциально он мог бы открыть всем личные архивы семейного досуга, профиль браузера, логины/пароли к платежным сервисам. А послезавтра он в компании на авось оставит открытый доступ к серваку с бухгалтерией (не, ну а чо случится за пару часов или дней?).

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

vinnni наказал глупость. Жестко, бескомпромиссно и публично. Я не хочу сказать, что я оправдываю или поощряю поступок vinnni. Я хочу сказать, что безалаберное и беспечное отношение vampir1510 — это бомба замедленного действия. Которая сегодня взорвалась, громко и с пердежем, облив случайно оказавшихся рядом жиром и говном.

/me выдохнул

 , ,

Chaser_Andrey
()

После блокировки https://fonts.googleapis.com сайт стал намного быстрее грузиться

Форум — Linux-org-ru

После блокировки https://fonts.googleapis.com сайт стал намного быстрее грузиться, особенно заметно при использовании Tor или плохих каналов связи.

Ну а если начинаются проблемы с доступом до сервисов гугла — то вообще трындец, пол-интернета тупит из-за инжектов разного рода хлама с гуглосервисов.

Собственно, вопрос — а что, разместить шрифты у себя не вариант? И так уж они необходимы, что не обойтись штатным набором?

Chaser_Andrey
()

Генерация классов на основе декларативного описания

Форум — Development

Я хочу реализовать генерацию over9000 классов/структур на основе их декларативного описания. Пример описания (формат произвольный):

Action1
    int ac1member1
    string ac1member2
    int ac1member3

Action2
    int ac2member1
    int ac2member2

Action3
   string ac3member1
   string ac3member3

На основе этого я хочу сгенерировать классы, которые содержат в себе:

  • функции инициализации (или конструкторы)
  • enum с перечнем всех member'ов
  • статический массив строк с названием member'ов
  • геттеры/сеттеры с валидацией (все входящие данные - строки, нужно проверять их корректность, чтобы программа не вывалилась при ошибке преобразования строки в число

Частично мне помогло обмазывание X Macros'ами:


#define MEMBERS \
    X(int, =0, member1) \
    X(int, =0, member2) \
    X(string, , member3)
    
enum
{
    #define X(a, b, c) E_##c,
    MEMBERS
    #undef X
    NUM_MEMBERS
};

static constexpr const char* names[NUM_MEMBERS] =
{
    #define X(a, b, c) #c,
    MEMBERS
    #undef X
};

#define X(a, b) a c b;
MEMBERS
#undef X


//==================
// сгенерирует мне няшное:

enum
{
    E_member1,
    E_member2,
    E_member3,
    NUM_MEMBERS
};

static constexpr const char* names[NUM_MEMBERS] =
{
    "member1",
    "member2",
    "member3",
};

int member1 =0;
int member2 =0;
string member3;


//подобным образом можно генерировать и геттеры/сеттеры
//так же можно и добавить ещё одно необязательное поле для валидатора

Как сгенерировать заготовки классов — тоже ясно.

Но вот как в зависимости от класса генерировать нужные внутренности?

Хотелось бы мультиразмерного X Macros, чтобы был не список, а двухмерная матрица.

P.S. Я понимаю, что было бы очень легко всё это сгенерировать на Perl. Но хотелось бы побольше задействовать нативных средств C/C++.

 , , x macros, ,

Chaser_Andrey
()

QxtWeb и HTTP-сервер в отдельном потоке

Форум — Development

Пытаюсь заставить работать HTTP-сервер из QxtWeb в отдельном потоке — ничего не получается, поток начинает жрать целое ядро, на HTTP-запросы не отвечает.

Когда оно работает в основном потоке — всё отлично работает.

class HTTPServer : public QObject
{
    Q_OBJECT
public:
    HTTPServer(const HTTPServer&) = delete;
    HTTPServer operator=(const HTTPServer&) = delete;
    
    explicit HTTPServer(QObject *parent = 0);
    virtual ~HTTPServer();
    void responseCheckDonglesStatus(int status, const QString &message, int requestID);
private:
    QxtHttpServerConnector *m_Connector         = nullptr;
    QxtHttpSessionManager *m_Server             = nullptr;
    QxtWebServiceDirectory *m_RootService       = nullptr;
    ServiceChecker *m_ServiceChecker            = nullptr;

signals:
    void initError();
    void checkDonglesStatus(int requestID);
    void sigThreadPong();
    
public slots:
    void init();
    void onThreadPing();
private slots:
    void onCheckDonglesStatus(const int requestID);
}

HTTPServer::HTTPServer(QObject *parent) :
    QObject(parent)
{
    m_Connector = new QxtHttpServerConnector(this);
    m_Server = new QxtHttpSessionManager(this);
    m_Server->setConnector(m_Connector);
    m_RootService = new QxtWebServiceDirectory(m_Server, this);
    m_ServiceChecker = new ServiceChecker(m_Server, this);
    m_ServiceSendSms = new ServiceSendSms(m_Server, this);
    m_RootService->addService("check", m_ServiceChecker);
    m_Server->setStaticContentService(m_RootService);

    connect(m_ServiceChecker, SIGNAL(checkDonglesStatus(int)), SLOT(onCheckDonglesStatus(int)));
}

void HTTPServer::init()
{
    //FIXME: Qt5 - change to localhost
    m_Server->setListenInterface(QHostAddress::Any);
    m_Server->setPort(8000);
    if(!m_Server->start()) {
        Utils::logger(LogCritical, "HTTPServer: start failed");
        emit initError();
        return;
    }
    Utils::logger(LogInfo, "HTTPServer: start success");
}

void HTTPServer::onCheckDonglesStatus(const int requestID)
{
    emit checkDonglesStatus(requestID);
}

void HTTPServer::responseCheckDonglesStatus(int status, const QString &message, int requestID)
{
    m_ServiceChecker->responseDonglesStatus(status, message, requestID);
}

void HTTPServer::onThreadPing()
{
    emit sigThreadPong();
}
class ServiceChecker : public QxtWebServiceDirectory
{
    Q_OBJECT
public:
    explicit ServiceChecker(QxtAbstractWebSessionManager *sm, QObject *parent = 0);
    void pageRequestedEvent(QxtWebRequestEvent *event);
    void responseDonglesStatus(int status, const QString &message, int id);
signals:
    void checkDonglesStatus(int requestID);
};

ServiceChecker::ServiceChecker(QxtAbstractWebSessionManager *sm, QObject *parent) :
    QxtWebServiceDirectory(sm, parent)
{
}

void ServiceChecker::pageRequestedEvent(QxtWebRequestEvent *event)
{
    qDebug("ServiceChecker: request %s", qPrintable(event->method));
    if(event->method == "GET") {
        syslog(LOG_DEBUG, "SCGI URL %s", qPrintable(event->url.toString()));
        syslog(LOG_DEBUG, "SCGI ORIGINAL URL %s", qPrintable(event->originalUrl.toString()));
        syslog(LOG_DEBUG, "SCGI URL %s", qPrintable(event->url.path()));
        syslog(LOG_DEBUG, "SCGI ORIGINAL URL %s", qPrintable(event->originalUrl.path()));

        QString object = event->url.queryItemValue("object");
        if(object == "dongles")
            emit checkDonglesStatus(event->requestID);
    }
}


void ServiceChecker::responseDonglesStatus(int status, const QString &message, int id)
{
    QVariantMap m;
    m["status"] = status;
    m["message"] = message;
    QJson::Serializer s;
    QByteArray page = s.serialize(m);
    postEvent(new QxtWebPageEvent(0, id, page));
}

Собсно, запуск такой:

_httpServer = new HTTPServer;
_threadHTTPServer = new QThread(this);
_threadHTTPServer->setObjectName("HTTP Server");
_httpServer->moveToThread(_threadHTTPServer);

connect(this, SIGNAL(sigStartHTTPServer()), _httpServer, SLOT(init()));
connect(_httpServer, SIGNAL(initError()), SLOT(onInitError()));
connect(_httpServer, SIGNAL(checkDonglesStatus(int)), SLOT(onRestfulCheckDonglesStatus(int)));

_threadHTTPServer->start(); 
emit sigStartHTTPServer();

Я проверяю, вроде все объекты нормально создаются в другом потоке, и стартует сервер в другом потоке, но всё равно, просто не отвечает.

 , libqxt,

Chaser_Andrey
()

Тестирование процессора на стабильность

Форум — General

Чем вы порекомендуете тестировать процессор на стабильность работы под постоянной 100% нагрузкой?

cpuburn-1.4a катит? Сколько оптимально времени?

Chaser_Andrey
()

Старейшее казино Лас-Вегаса начало принимать биткоины

Форум — Talks

The D Las Vegas и Golden Gate — старейшее казино Лас-Вегаса — стали первыми в мире казино, принимающими биткоины. Об этом сообщается в совместном пресс-релизе игорных заведений.

Совладелец обоих заведений Дерек Стивенс (Derek Stevens) рассказал, что решение о включении биткоинов в список разрешенной валюты было принято в связи с интересом постоянных клиентов.

http://lenta.ru/news/2014/01/22/casinos/

 ,

Chaser_Andrey
()

Протокол Asterisk Management Interface (AMI) — ASCII или UTF-8?

Форум — Development

Для второй версии AMI (AMIv2), который в Asterisk 12, явно указано, что «AMI is an ASCII protocol».

Стало быть, это значит, что AMI можно и нужно обрабатывать, как ASCII?

Для первой версии AMI (во всяком случае, для AMI 1.1) никаких конкретных указаний, что это именно ASCII, не нашел.

Почему я спрашиваю? Дело в том, что уже больше года мой демон интерпретирует AMI как строки в UTF-8, и пока проблем нет.

Более того, в полных логах AMI было выяснено, что там действительно пересылаются в некоторых полях не-ASCII символы, например

AppData: SMS_MOD=Я пытался(лась) Вам дозвониться

Я не уверен, правильное ли это поведение и использование AMI?

Может, действительно надо воспринимать строки в AMI как ASCII-строки, а уже отдельные поля (в случае необходимости) интерпретировать как UTF-8 строки?

При переходе с UTF-8 на ASCII значительно упадет нагрузка клиента AMI, которому приходится перемалывать много данных.

UPD: речь идет о самописном клиенте AMI на плюсах.

 ,

Chaser_Andrey
()

Юзеры MacOS и их butthurt от Linux на железе Apple

Форум — Talks

В последнее время наблюдаю butthurt у макинтошников, когда они видят, как их горячо любимую MacOS X сносят в пользу Linux на разных там макбуках и маках.

Но почему?

 , , , ,

Chaser_Andrey
()

Настройка аудио 5.1 в Linux

Форум — Multimedia

С помощью speaker-test установил, что сейчас у меня обычное стерео, которое распределяется так:

1. FrontLeft - идет на FrontLeft, Center и RearLeft.

2. FronRight - идет на FrontRigh, LFE и RearRight.

$aplay -L
null
    Discard all samples (playback) or generate zero samples (capture)
default:CARD=SB
    HDA ATI SB, ALC889 Analog
    Default Audio Device
sysdefault:CARD=SB
    HDA ATI SB, ALC889 Analog
    Default Audio Device
front:CARD=SB,DEV=0
    HDA ATI SB, ALC889 Analog
    Front speakers
surround40:CARD=SB,DEV=0
    HDA ATI SB, ALC889 Analog
    4.0 Surround output to Front and Rear speakers
surround41:CARD=SB,DEV=0
    HDA ATI SB, ALC889 Analog
    4.1 Surround output to Front, Rear and Subwoofer speakers
surround50:CARD=SB,DEV=0
    HDA ATI SB, ALC889 Analog
    5.0 Surround output to Front, Center and Rear speakers
surround51:CARD=SB,DEV=0
    HDA ATI SB, ALC889 Analog
    5.1 Surround output to Front, Center, Rear and Subwoofer speakers
surround71:CARD=SB,DEV=0
    HDA ATI SB, ALC889 Analog
    7.1 Surround output to Front, Center, Side, Rear and Woofer speakers
iec958:CARD=SB,DEV=0
    HDA ATI SB, ALC889 Digital
    IEC958 (S/PDIF) Digital Audio Output
$lspci
00:14.2 Audio device: Advanced Micro Devices, Inc. [AMD/ATI] SBx00 Azalia (Intel HDA) (rev 40)
        Subsystem: Gigabyte Technology Co., Ltd Device a002
        Kernel driver in use: snd_hda_intel

Изъезженная тема, много гуглил, но есть ряд вопросов:

1. Как правильно распределять стерео на 5.1? Чтобы и сабвуфер задействовать для обоих каналов, а не только для FrontRight.

2. Как при этом корректно воспроизводить 5.1 (в фильмах, например), чтобы из-за предыдущего пункта в сабвуфер не подмешивались звуки из FR и FL? Т.е., чтобы был полноценный 5.1?

 , , , ,

Chaser_Andrey
()

Статическая инициализация классов в C++

Форум — Development

Передо мной встала задача сделать некие манипуляции с конкретным классом (классами) до создания первого объекта.

Рассмотрим частный случай необходимости статической инициализации классов.

Как известно, в Qt для того, чтобы можно было передавать пользовательские типы между сигнал-слотами при Qt::QueuedConnection, необходимо предварительно зарегистрировать данный тип в мета-объектной системе Qt с помощью qRegisterMetaType<Foo>(«Foo»).

В одном из проектов есть базовый класс BaseEvent и несколько десятков наследуемых (например, EventFoo, EventBar). Мне нужно сделать регистрацию типа до вызова любого из сигналов, которые передают объекты данных классов между потоками.

Почему не регистрировать тип непосредственно перед созданием connect или в конструкторе класса, который создает connect'ы? Потому что типов много, как я написал выше, несколько десятков. Если забыть зарегистрировать тип, то об этом я узнаю только в процессе работы, так как наличие зарегистрированного типа проверяется в runtime.

Найденные решения:

1. Регистрировать в конструкторе [плохо]

class BaseEvent
{
public:
    explicit BaseEvent() { qRegisterMetaType<BaseEvent>("BaseEvent"); }
}


class EventFoo : public BaseEvent
{
public:
    explicit EventFoo() { qRegisterMetaType<EventFoo>("EventFoo"); }
}

class EventBar : public BaseEvent
{
public:
    explicit EventBar() { qRegisterMetaType<EventBar>("EventBar"); }
}

class 
Недостатки очевидны: накладные расходы в runtime.

2. Статический member с конструктором-инициализатором

class BaseEvent
{
public:
    explicit BaseEvent() {}
private:
    class Initializer
    {
    public:
        explicit Initializer() { qRegisterMetaType<BaseEvent>("BaseEvent"); }
    } static const _init;
}
 

class EventFoo : public BaseEvent
{
public:   
    explicit EventFoo() { }

private:
    class Initializer
    {
    public:
        explicit Initializer() { qRegisterMetaType<EventFoo>("EventFoo"); }
    } static const _init;
}
 

class EventBar : public BaseEvent
{
public:
    explicit EventBar() { }

private:
    class Initializer
    {
    public:
        explicit Initializer() { qRegisterMetaType<EventBar>("EventBar"); }
    } static const _init;

}

Преимущества: минимальные накладные расходы по памяти (один int на весь класс), отсутствие накладных расходов при создании объекта

Недостатки: много дублирующего кода, так и хочется как-то заменить на шаблоны и/или макросы.

Что посоветуете?

Меня устраивает второй вариант, но хотелось бы избавится от тонны копипасты. Можно как-то сделать подобное на шаблонах? В идеале хотелось бы видеть что-то такое на шаблонах:

class EventFoo : public BaseEvent
{
public:
    explicit EventFoo() { }

private:
    static const Initializer<EventFoo> _init;
}

Или хотя бы на макросах:

class EventFoo : public BaseEvent
{
public:
    explicit EventFoo() { }
 
private:
    EVENT_INIT(EventFoo)
}

 , ,

Chaser_Andrey
()

Open Source ноутбук Novena почти готов к производству

Форум — Talks

Известный хакер, автор книги “Hacking Xbox” Эндрю Хуанг (Andrew “bunnie” Huang) в июне 2012 года вместе с коллегами начал разработку свободного ноутбука Novena на процессоре Freescale iMX6. Идея в том, чтобы у сообщества была открытая платформа, с открытой документацией и руководством по программированию, так что каждый может собрать из комплектующих себе ноутбук/маршрутизатор на свой вкус.

В декабре 2012 года автор получил первые образцы материнских плат для тестирования совместимости компонентов и опубликовала дизайн платы. В дальнейшем кропотливая работа по подбору компонентов продолжилась и вот сейчас — в январе 2014 года — проект наконец-то вплотную приблизился к успешному завершению.

В журнале Make: опубликована статья с фотографиями прототипа ноутбука, который уже практически готов к массовому производству.

Все компоненты ноутбука гарантированно освобождены от сложностей NDA и сопровождаются документацией. Найти такие было очень непросто, Freescale оказался единственно подходящим вариантом для SoC. Разработчики не смогли подыскать GPU, соответствующий требованиям open source, поэтому аппаратное видеоускорение на этом ноутбуке осуществляется через бинарный блоб. Программное видеоускорение работает нормально.

Ноутбук предназначен для всяческих модификаций и универсального использования. Он оснащается двумя портами Ethernet (1 Гбит/с и 100 Мбит/с), портом USB OTG и Spartan 6 FPGA. На материнской плате есть 8 разъемов для приема аналоговых данных и 8 цифровых портов ввода-вывода.

По техническим характеристикам ноутбук напоминает планшеты высшего уровня: Freescale iMX6 — это четырехъядерный ARM Cortex-A9 на частоте 1,2 ГГц. Оперативной памяти можно добавить до 4 ГБ, внутренний разъем SATA-II подходит для хорошего SSD-накопителя, LCD-адаптер подключается к 13-дюймовой панели 2560×1700. Система энергопитания должна быть модульной, с использованием комплектов RC Lipo.

Полные спецификации см. в вики.

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

Источник

Немного картинок из оригинальной статьи:

http://makezineblog.files.wordpress.com/2014/01/novena_full-e1389122192543.jpg

http://makezineblog.files.wordpress.com/2014/01/novena_atwork.jpg

http://makezineblog.files.wordpress.com/2014/01/novena_lab.jpg

http://makezineblog.files.wordpress.com/2014/01/novena_edge.jpg

http://makezineblog.files.wordpress.com/2014/01/novena_quarterview.jpg

 

Chaser_Andrey
()

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

Форум — Talks

Ученые из США и Южной Кореи, проведя ряд экспериментов на крысах и мышах среднего возраста, пришли к интересным результатам.

Психологи из Университета Мэриленда обнаружили, что сексуальный опыт стимулирует рост новых нейронов в гиппокампе, ответственном за переход кратковременной памяти в долговременную.

Ряд тестов показал, что после ряда сексуальных актов процесс нейрогенеза у пожилых крыс ускорялся, фактически их мозг становился моложе.

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

Группа исследователей из южно-корейского университета Конкук пришла к выводу, что частый секс успешно противодействует негативному воздействию стресса на мозг.

Именно стресс является главным ингибитором воспроизводства нейронов в мозгу, а половые акты восстанавливают эту функцию,

Вместе с тем, согласно новейшим исследованиям психологов из Университета Дуйсбурга-Эссена в Германии, порнография отрицательно действует на память смотрящих, в особенности ухудшая их способности к мультитаскингу, выполнению нескольких задач одновременно.

Ученые протестировали умственные способности людей до и после показа непристойных картинок и видеофильмов. Большинство из них продемонстрировали ухудшение интеллектуальных показателей после просмотра порнографии.

Источник

P.S. Линукс притом, что секс.

Chaser_Andrey
()

Копипаста авторских новостей

Форум — Linux-org-ru

Дозволено ли здесь автору ПО при анонсе новой версии полностью копировать свою же оригинальную новость (с оформлением в LORCODE, естественно), а не заниматься словоблудием, переписывая новость с нуля?

Chaser_Andrey
()

Тем временем математик из Казахстана заявил, что решил одну из задач тысячелетия

Форум — Talks

Казахстанский ученый Мухтарбай Отелбаев заявил, что решил одну из семи главных математических задач – уравнения Навье-Стокса.

http://naked-science.ru/article/sci/matematik-iz-kazakhstana-zayav

Chaser_Andrey
()

Софт для мониторинга CPU при разгоне (аналог Windows-only CPU-Z)

Форум — Linux-hardware

Чем мониторить текущий вольтаж, частоту CPU, частоту шины и т.д.? Как в известной на платформе Windows утилите CPU-Z (скриншот).

Может, у кого будут советы про особенности разгона и мониторинга железа под Linux?

Планирую после прихода нового кулера разогнать свой Phenom II X4 965 BE (или обменять на 970 у знакомого).

 

Chaser_Andrey
()

Занести в eax единицу, уложившись в 3 байта кода

Форум — Development

Как занести в eax единицу, уложившись в 3 байта кода, на x86_64?

С x86 всё просто:

xor eax,eax
inc eax

эквивалентно в hex

31 C0 40

Но c x86_64 засада. Согласно докам от AMD, однобайтовые INC и DEC были выпилены из 64-битного режима.

mov 1, eax

не подходит, потому что в 32-битном режиме оно уже занимает 5 байт, а в 64-битном ещё больше.

 ,

Chaser_Andrey
()

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