LINUX.ORG.RU

Сообщения baldman88

 

Алгоритм генерации всех возможных комбинаций элементов из заданных наборов

Форум — Development

Есть некоторое количество (не очень много, до 5) строк разной длины (до 15 символов). Нужно сформировать все возможные комбинации букв из этих строк. Например, есть такие строки:

hello
contribution
world
development

То есть нужно получить все комбинации по 4 буквы (по одной из каждой строки). Как-то так:

hcwd
hcwe
hcwv
...
onde
ondn
ondt

Повторения игнорировать не нужно. Итого, для данного примера должно получиться 3300 комбинаций (5 * 12 * 5 * 11). Подскажите, пожалуйста, где посмотреть как такое реализовать?

 

baldman88
()

Многопоточность. Помогите понять что не так.

Форум — Development

Добрый день. Нужно реализовать обработку контейнеров в нескольких потоках. Набросал на коленке простой тестовый пример, но он работает не так, как ожидалось:

#include <cmath>
#include <vector>
#include <thread>
#include <iostream>
#include <functional>


int test(int x)
{
    return x * x;
}


void print(const std::vector<int>& v)
{
    for (const auto i : v)
    {
        std::cout << i << " ";
    }
    std::cout << std::endl;
}


void print(std::vector<int>::iterator begin, std::vector<int>::iterator end)
{
    auto it = begin;
    while (it != end)
    {
        std::cout << *it << " ";
        ++it;
    }
    std::cout << std::endl;
}


std::vector<int>::iterator for_each(std::vector<int>::iterator first, std::vector<int>::iterator last,
                                    std::vector<int>::iterator result, const std::function<int(int)>& mapFunctor)
{
    while (first != last)
    {
        *result = mapFunctor(*first);
        ++result;
        ++first;
    }
    return result;
}


std::vector<int>::iterator mapped(std::vector<int>::iterator first, std::vector<int>::iterator last,
                                  std::vector<int>::iterator result, const std::function<int(int)>& mapFunctor)
{
    auto availableThreads = std::thread::hardware_concurrency();
    if (availableThreads < 2)
    {
        for_each(first, last, result, mapFunctor);
    }
    else
    {
        const auto totalSize = std::distance(first, last);
        const auto blockSize = static_cast<size_t>(std::ceil(1.0 * totalSize / availableThreads));
        std::vector<std::thread> threads;
        std::vector<std::vector<int>> results;
        auto current = first;
        for (unsigned int i = 0; i < (availableThreads - 1); ++i)
        {
            auto blockStart = current;
            auto blockEnd = blockStart;
            std::advance(blockEnd, blockSize);
            current = blockEnd;
            results.emplace_back(std::vector<int>(blockSize));
            threads.emplace_back(
                    std::thread(for_each, std::ref(blockStart),
                                std::ref(blockEnd), results.at(i).begin(), mapFunctor));
        }
        result = for_each(current, last, result, mapFunctor);
        for (unsigned int i = 0; i < threads.size(); ++i)
        {
            if (threads[i].joinable())
            {
                threads[i].join();
            }
            print(results.at(i));
            result = std::copy(results.at(i).begin(), results.at(i).end(), result);
        }
    }
    return result;
}


int main()
{
    std::vector<int> v;
    for (unsigned int i = 1; i < 41; ++i)
    {
        v.emplace_back(i);
    }
    std::vector<int> v2;
    v2.resize(v.size());
    print(v);
    mapped(v.begin(), v.end(), v2.begin(), test);
    print(v2);
    return 0;
}
В итоге я получаю примерно такой вывод:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
121 144 169 196 225
121 144 169 196 225
961 1024 1089 1156 1225
676 729 784 841 900
961 1024 1089 1156 1225
961 1024 1089 1156 1225
961 1024 1089 1156 1225
1296 1369 1444 1521 1600 121 144 169 196 225 121 144 169 196 225 961 1024 1089 1156 1225 676 729 784 841 900 961 1024 1089 1156 1225 961 1024 1089 1156 1225 961 1024 1089 1156 1225
Первая строка — исходный вектор, со второй по восьмую — то, что получается в потоках, в девятой — результирующий вектор. Собирал с gcc и clag. Результат примерно одинаковый. Ради интереса попробовал собрать и запустить в VS, и все отработало как и задумывалось. Что я не учел?

 ,

baldman88
()

Температура процессора и видеокарты

Форум — General

Добрый день. На работе conky показывает температуру процессора (${acpitemp}) в пределах 10-20°C. Понятно, что нагло врет. Захотелось посмотреть что покажет lm-senseors. Он показывает 50-60°C. Решил и дома посмотреть. сonky показывает 70-100°C (пора бы уже почистить систему охлаждения ноутбука), а вот lm-sensors 60-80°C. Но параллельно заметил, что и показания nvidia-smi (равно как и nvidia-settings) отличаются от показаний lm-sensors. nvidia-smi показывает 60-80°C, а lm-sensors 70-100°C.
Кому верить?

 , ,

baldman88
()

Разработчики gtk3 — будьте прокляты!

Форум — Talks

Я очень люблю gtk2 (фреймворк, конечно, так себе, зато look-and-feel — божественен). Но gtk3 ... Нахрена они через каждый минорный релиз ломаю совместимость? В частности: темы оформления. Пишу из вырвиглазного Firefox. Давно не обновлялся, а тут на тебе: не было печали — апдейтов накачали ... Кто вообще придумал перевести Firefox на это убожество.
Доколе?

Перемещено JB из desktop

 

baldman88
()

Шаблонная функция. Хочется странного. Что выбрать?

Форум — Development

Допустим есть функция (что-то вроде std::transform), которая принимает на входе контейнер (либо vector, либо list, либо deque) содержащий элементы типа Х и функцию, которая, в свою очередь, принимает тип Х и возвращает тип Y. На выходе получаем контейнер содержащий элементы типа Y. Вопрос заключает в том, как это лучше реализовать (в плане удобства пользования)?
1. Не важно какой контейнер на входе — всегда возвращать определенный контейнер (например vector):

template<template<class...> class input_sequence, class T, class functor>
std::vector<typename std::result_of<functor(T)>::type> foo(const input_sequence<T>& sequence, functor func)
{
    std::vector<typename std::result_of<functor(T)>::type> result;
    ...
    return result;
}

double bar(int x)
{
    return sqrt(x);
}

std::vector<int> in{1, 2, 3, 4, 5};
auto out = foo(in, bar);
2. Возвращать контейнер того же типа, что и контейнер на входе:
template<template<class...> class input_sequence, class T, class functor>
input_sequence<typename std::result_of<functor(T)>::type> foo(const input_sequence<T>& sequence, functor func)
{
    input_sequence<typename std::result_of<functor(T)>::type> result;
    ...
    return result;
}

double bar(int x)
{
    return sqrt(x);
}

std::vector<int> in{1, 2, 3, 4, 5};
auto out = foo(in, bar);
3. Явно инстанцировать шаблон:
template<class output_sequence, class input_sequence, class functor>
output_sequence foo(const input_sequence& sequence, functor func)
{
    output_sequence result;
    ...
    return result;
}

double bar(int x)
{
    return sqrt(x);
}

std::vector<int> in{1, 2, 3, 4, 5};
auto out = foo<std::vector<double>>(in, bar);
За изобретение костылей прошу сильно не пинать!

 ,

baldman88
()

Подключить две IP камеры.

Форум — Development

Всем доброго времени суток.
Есть проект, в котором используется IP камера. Все было хорошо до того момента, как понадобилось подключить две таких камеры. Создаю два сокета, оба подключаются, но данные приходят только с одного — с того, который быстрее подключится. Подскажите, пожалуйста, куда копать?
Пы.Сы. Камеры имеют разные IP и MAC адреса, но работают на одном порту.

 ,

baldman88
()

Я познаю мир. Многопоточность.

Форум — Development

Доброго всем времени суток. Сразу извиняюсь за сумбурную постановку вопроса. Помогите, пожалуйста, советом. Есть код, который работает с изображениями (пытаюсь разобраться с трекингом объектов на видео). В методе одного из классов изображение разбивается на области и передается методу другого класса для анализа на соответствие по некоторым параметрам. Точнее будет сказать: передается изображение целиком по ссылке (в интегральном виде) и вторым параметром идут координаты интересующей нас прямоугольной области. Сейчас это все работает, но очень медленно, так как каждая область обрабатывается последовательно. Вот и возникло желание это все распараллелить. Но тут возник вопрос: как избавиться от гонки состояний из-за того, что второй класс, который анализирует нужную область, в ходе анализа меняет свое состояние (в нем есть массивы, элементы которых меняют значение в зависимости от результата анализа конкретной области, причем индекс изменяемого элемента в массиве может совпадать для разных областей изображения, которые, в свою очередь, могут одновременно анализироваться в разных потоках). С многопоточностью в таком виде раньше дел не имел вообще. На подсознании понимаю, что где-то, что-то нужно блокировать но не до конца. Может есть хорошие статьи по этому поводу, чтобы не городить ненужные велосипеды, а то кругом одно и тоже пишут, но совсем не то, что меня интересует (может неправильно формулирюу вопрос?).

 , ,

baldman88
()

Настройка DD-WRT

Форум — Admin

Доброго всем времени суток. С роутерами и iptables до этого особо не сталкивался. Поэтому буду благодарен любой помощи. Немного предыстории. Есть у нас провайдер, который, согласно тендеру, предоставляет услуги всем общежитиям нашего института. Провайдер жадный (странно, да? =) ). Раньше роутеры работали из коробки — подключил и пользуйся. Но теперь они хотят за пользование роутером немалую доплату (с учетом того, что тарифы у них самые большие в городе). Опытным путем выяснили, что роутеры определяют по полю TTL (роутеры, по идее, режут его на единичку). Залил в роутер DD-WRT, добавил правило для увеличения TTL на единицу. Но не работает. Хотя все пингуется (без увеличения TTL даже не пинговалось ничего). Попробовал traceroute, в выводе одни звезды, даже при подключении напрямую без роутера. Подскажите, пожалуйста, что можно попробовать сделать? И еще нубовопрос. Я же надеюсь, что маскарадинг там по дефолту стоит? Это же все таки роутер, да и пинги идут ... В общем полный ступор.
По идее мне нужно что-то вроде такого:

iptables -A FORWARD -s 192.168.1.1/24 -j ACCEPT
iptables -A FORWARD -d 192.168.1.1/24 -j ACCEPT
iptables -t nat -A POSTROUTING -o `get_wanface` -s 192.168.1.1/24 -j MASQUERADE
iptables -t mangle -I POSTROUTING -o `get_wanface` -j TTL --ttl-inc 1

Или я глубоко ошибаюсь?

 ,

baldman88
()

Таймеры AVR

Форум — Development

Доброго всем времени суток. Понадобилось собрать таймер. Да еще и такой, чтобы микросекунды считал. Собиралось это все на плате с atmega32u4 (клон arduino). Поставил резонатор на 16 МГц. Младший фьюз-бит прошит значением 0xFF. По идее таймер должен работать с частотой 16 Мгц. Таймер работает в режиме СТС с делителем равным единице. По подсчетам получается, что период у таймера 62.5 нс (1 / 16000000). В байте сравнения стоит значение 0x0F (в OCR0A). Прерывание по совпадению разрешено. В прерывании происходит декремент переменной. По идее, он должен срабатывать каждую микросекунду (62.5 * 16 = 1000 нс = 1 мкс). А вот фиг там. Ведет он себя вообще странно. Выставляю, чтобы отсчитал секунду, а он примерно восемь считает. Инициализировал OCR0A значением 0х00 — тоже примерно восемь секунд (измерить вообще нечем). Задал 0хFF — около 16 секунд. Где мой промах и чего я не учел? Питается плата от USB. Заранее спасибо за помощь.

 

baldman88
()

Диалог авторизации

Форум — Development

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

( authdialog.hpp )

( authdialog.cpp )

( authdialog.hpp )

 , ,

baldman88
()

Coursera на постсоветском пространстве

Форум — Talks

Фонд Виктора Пинчука стал глобальным партнером платформ массового онлайн-образования Coursera. В новости, правда, не указан язык, на который будут переводится курсы. Скорее всего украинский. Не рекламы ради, но радует =) Новость стянута отсюда http://korrespondent.net/ukraine/events/1559130-fond-viktora-pinchuka-stal-pa...

 

baldman88
()

Обработка интерферограмм

Форум — Development

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

 

baldman88
()

раскладка клавиатуры в иксах.

Форум — Desktop

можно ли узнать из консоли (получить значение для дальнейшего использования в conky)?

baldman88
()

шрифты в qt

Форум — General

проблема с отображением шрифтов в qt. до этого было подобное(месяца 3 назад, шрифты были ломаные какие то), поставил terminus и стало нормально. но сегодня я с ужасом увидел такую картину http://www.picamatic.com/view/3743510_Снимок. поставил sans, serif -- всёнормально http://www.picamatic.com/view/3743514_Снимок-1. везде стоит терминус, и я к нему уже очень привык. может кто подскажет в чём проблема?

baldman88
()

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