LINUX.ORG.RU

Сообщения redbaron

 

Какой у Perl аналог питоновского iter(callable, sentinel)?

Неожиданно для себя оказался посреди перловского болота. Взываю к коллективному разуму ибо сам я слаб в гугл-фу.

Есть итератор, который предполагается использовать так:

while (my $item = $iter->()) {...}

Хочется собрать все значения из него в массив и передать его map (ну или напрямую как-нибудь хитро вызвать map чтобы оно само подергало итератор). Сейчас я делаю так:

my @arr
while (my $item = $iter->()) push @arr, $item

map sub {} @arr;

Но может быть можно короче/красивее это записать?

 ,

redbaron
()

как измерить эффект от изменений

Хотел бы проконсультироваться с форумчанами о том, кто как меряет эффект от оптимизаций.

Дано: Логи с указанием времени ответа бэкенда. Произведена некоторая оптимизация от которой это время зависит (в моем случае это была база данных).

Требуется: Каким-то образом подсчитать эффект произведенного изменено. Иными словам и надо отобразить «стало быстрее» в какой-либо осязаемой форме.

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

Но:

1. Такой подход не масштабируется на пару тысяч страниц

2. Не все страницы одинаково часто используются. Иными словами ускорение на 100 мс страницы просматриваемой миллион раз в день это лучше чем ускорение на 10 секунд страницы с 10 посещениями.

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

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

Подскажите или направьте в гугол, наверняка же проблема то уже решенная.

 

redbaron
()

(пере-)синхронизация тредов с повторением порядка

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

Т.е. для каждого треда хочется такого:

while(true) {
   int id = get_seq_id();  # threadsafe, id монотонно возрастают
   compute(); # runs in parallel
   commit(id); # threadsafe, но в порядке возрастания id
   cleanup()
}

Пока в голову пришло только, что можно было в `get_seq_id` возвращать promise и помещать future от него в очередь на другом конце которой сидел бы отдельный поток, который и делал бы commit. Вроде бы должно работать, но надо заморачиваться с возвращением результата коммита обратно в каждый тред, это выглядит переусложненным, да и дергать контексты просто чтобы записать в файл в нужном порядке (commit именно это и делает) не выглядит как нечто хорошее.

В общем, можно ли обойтись без дополнительных тредов и какое слово гуглить для этого?

Предпочтительно Java/Scala, но не так важно, т.к. если найдется решение в других языках, то идля Java/Scala что-то подобное тоже будет.

Спасибо.

 ,

redbaron
()

Значительный CPU idle time при высоком LA

Столкнулся с интересным поведением, имеется сервер на котором крутится множество java процессов, 2 CPU 10 ядер в каждом + HyperThreading итого 40 ядер видно в Linux

Load average 75-100, при этом local io практически отсутствует, и никто не застрял в uninterruptible sleep, при всем при этом довольно значительный idle time в vmstat.

Проверим, что количество runnable потоков примерно соответствует load average:

$ ps  Hh -eo stat,pid,command |egrep '^R' |wc -l
109

В разные моменты выдает разные значения понятное дело, но всегда в интервале 60-120

вывод mpstat -P ALL 1 (поймал момент, когда idle минимальный, обычно 10-13):

12:20:23     CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest   %idle
12:20:24     all   89.38    0.00    2.12    0.00    0.95    0.00    0.00    0.00    7.55
12:20:24       0   78.79    0.00    4.04    0.00   10.10    0.00    0.00    0.00    7.07
12:20:24       1   98.99    0.00    0.00    0.00    0.00    0.00    0.00    0.00    1.01
12:20:24       2   88.12    0.00    1.98    0.00    0.99    0.00    0.00    0.00    8.91
12:20:24       3   94.00    0.00    2.00    0.00    0.00    0.00    0.00    0.00    4.00
12:20:24       4   89.90    0.00    1.01    0.00    0.00    0.00    0.00    0.00    9.09
12:20:24       5   91.09    0.00    3.96    0.00    0.99    0.00    0.00    0.00    3.96
12:20:24       6   99.01    0.00    0.99    0.00    0.00    0.00    0.00    0.00    0.00
12:20:24       7   97.03    0.00    0.99    0.00    0.00    0.00    0.00    0.00    1.98
12:20:24       8   98.02    0.00    0.99    0.00    0.99    0.00    0.00    0.00    0.00
12:20:24       9   97.03    0.00    0.99    0.00    0.00    0.00    0.00    0.00    1.98
12:20:24      10   90.00    0.00    1.00    0.00    0.00    0.00    0.00    0.00    9.00
12:20:24      11   94.00    0.00    3.00    0.00    0.00    0.00    0.00    0.00    3.00
12:20:24      12   86.00    0.00    2.00    0.00    0.00    0.00    0.00    0.00   12.00
12:20:24      13   97.00    0.00    1.00    0.00    0.00    0.00    0.00    0.00    2.00
12:20:24      14  100.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00
12:20:24      15   95.96    0.00    1.01    0.00    0.00    0.00    0.00    0.00    3.03
12:20:24      16   98.00    0.00    2.00    0.00    0.00    0.00    0.00    0.00    0.00
12:20:24      17   91.92    0.00    5.05    0.00    0.00    0.00    0.00    0.00    3.03
12:20:24      18   94.00    0.00    1.00    0.00    0.00    0.00    0.00    0.00    5.00
12:20:24      19   97.00    0.00    2.00    0.00    0.00    0.00    0.00    0.00    1.00
12:20:24      20   83.00    0.00    3.00    0.00   10.00    0.00    0.00    0.00    4.00
12:20:24      21   82.83    0.00    4.04    0.00    7.07    0.00    0.00    0.00    6.06
12:20:24      22   98.99    0.00    0.00    0.00    0.00    0.00    0.00    0.00    1.01
12:20:24      23   88.00    0.00    2.00    0.00    9.00    0.00    0.00    0.00    1.00
12:20:24      24   94.00    0.00    4.00    0.00    0.00    0.00    0.00    0.00    2.00
12:20:24      25   77.23    0.00    2.97    0.00    0.00    0.00    0.00    0.00   19.80
12:20:24      26   77.23    0.00    3.96    0.00    0.00    0.00    0.00    0.00   18.81
12:20:24      27   63.00    0.00    1.00    0.00    0.00    0.00    0.00    0.00   36.00
12:20:24      28   91.92    0.00    1.01    0.00    0.00    0.00    0.00    0.00    7.07
12:20:24      29   83.00    0.00    2.00    0.00    0.00    0.00    0.00    0.00   15.00
12:20:24      30   84.85    0.00    1.01    0.00    0.00    0.00    0.00    0.00   14.14
12:20:24      31   95.00    0.00    3.00    0.00    0.00    0.00    0.00    0.00    2.00
12:20:24      32   88.00    0.00    3.00    0.00    0.00    0.00    0.00    0.00    9.00
12:20:24      33   97.98    0.00    2.02    0.00    0.00    0.00    0.00    0.00    0.00
12:20:24      34   76.00    0.00    2.00    0.00    0.00    0.00    0.00    0.00   22.00
12:20:24      35   83.17    0.00    2.97    0.00    0.00    0.00    0.00    0.00   13.86
12:20:24      36   73.00    0.00    3.00    0.00    1.00    0.00    0.00    0.00   23.00
12:20:24      37   86.00    0.00    5.00    0.00    0.00    0.00    0.00    0.00    9.00
12:20:24      38   83.00    0.00    1.00    0.00    0.00    0.00    0.00    0.00   16.00
12:20:24      39   92.00    0.00    4.00    0.00    0.00    0.00    0.00    0.00    4.0

что это может быть? грешу на scheduler, но непонятно как его крутить, чтобы он успевал занимать CPU под задачи. Не очень приято терять 10% CPU на задаче, которая как раз очень жадная до этого CPU.

 , ,

redbaron
()

shell по-новому - Xiki

Ребята из Xiki собирают деньги на кикстартере, я закинул, может кто-то еще присоедениться.

Xiki это переосмысление, каким мог бы быть шелл. Написано на ненужном Руби, что печалит, но задумка здравая.

3 минутное промо видео: https://www.youtube.com/watch?v=bUR_eUVcABg#t=57

redbaron
()

Форматируем код своим любимым стилем в 80 колонок

Хочется посмотреть, кто как код форматирует. Накидайте пожалуйста следующий код, отформатированный по вашему вкусу:

template<typename Begin, typename End>
struct copy_seq_loop {
    template<class foldF, class resT, class sessT>
    static inline void
    call(resT& res, const sessT& sess) {
	copy_impl<typename Begin::type, foldF>(res, sess, mpl::false_());
	copy_seq_loop<typename mpl::next<Begin>::type, End
		      >::template call<foldF>(res, sess);
    }
};

 , ,

redbaron
()

Как смержить дублирующийся код? (решение: использовать gold)

Заглянул тут в вывод «objdump -C» и немало удивился: оказалось, что для различных параметров шаблона генерируются отдельные копии кода, даже если сам код абсолютно идентичный.

Довольно искусственный пример кода, демонстрирующий проблему:

#include <cstddef>
#include <ctime>

template<int I, class T>
struct V {
	typedef T value_type;
};


template<class T>
struct func {
void __attribute__((noinline))
operator()(typename T::value_type& v) { v+= 1; } 
};


int main() {
	int i = time(NULL);
	func< V<10,int> >()(i);
	func< V<20,int> >()(i);
	return i;
}

Есть ли хитрые флаги для gcc и/или линкера чтобы экземпляры созданные из одного шаблона при возможности не дублировались исполняемом файле?

 ,

redbaron
()

как поднять ограничение на 50 элементов в fusion vector?

Может быть кто-нибудь сталкивался? Скармливаю довольно длинную MPL sequence и хочу получить fusion vector, но вываливается с

fusion/container/vector/convert.hpp:26:13: error: invalid use of incomplete type ‘struct boost::fusion::detail::as_vector<55>’

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

Пробовал и -DFUSION_MAX_VECTOR_SIZE=100 и -DBOOST_FUSION_DONT_USE_PREPROCESSED_FILES в разных комбинациях, все одно.

 boost.fusion,

redbaron
()

Каким образом оно возвращает lvalue?

template<class T>
struct V {
  V() = default;
  V(const T& v): val(v) {};
  T val;
};

struct A {
  V<int> a;
  int b;
};

V<int> wtf(const A& c) {
  return c.a;
}

int return_rvalue(const A& c) {
  return c.b;
}

int main() {
        A c;
        wtf(c) = 0xbabe;  //< Почему не ругается здесь?
        return_rvalue(c) = 0xdead;  //< Здесь ругается, как и положено 
}

Отловил неожиданную для себя проблему в коде, когда функция возвращается значение по значению, но каким-то образом присвоение этому временному объекту отрабатывает без ошибок, даже без варнингов. Как это вообще возможно? Ниже функция return_rvalue не компилируется, как ей и положено,я ожидал схожего поведения от wtf, но оказался неправ и был жестко наказан: присвоенное значение просто съедалось и исчезало в бездне небытия.

Думал, что проблема из-за implicit конструктора принимающего оборачиваемый тип, убрал его, заменил на перегруженный operator=, все осталось по прежнему.

Прошу помощи зала, спасибо.

 , ,

redbaron
()

Что б почитать для начинающего нач. отдела?

Впервые предстоит рулить отделом сисадминов, всвязи с чем ищутся маны и howto :) Что почитать в общем? Сисадминский опыт есть в достаточном количестве, а вот управленческого немного )

redbaron
()

Анализ и сопоставление записей в логах

Добрый день!

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

Задачи что-то вроде «если в логе 1 появилась запись X, в логе 2 появилась Y, а в логе 3 до записи Z1 не появлялас Z2, то делаем вывод что случилось нечто и генерируем событие»

redbaron
()

[СПб][yota] дайте поносИть yota на пару недель

Привет всем! Приехал в Питер на пару недель, снял квартиру, купил USB свисток от МТС и вернулся назад в конец девяностых - нестабильные 5-10 кб/сек , обрывы и прочие радости :)

Комплект yota выглядит как серебряная пуля, только стоит непомерно. Может кто-нибудь даст yota модемчик, а я интернет оплачу на месяц из которых попользуюсь до 22 ноября.

Если вдруг кто заинтересуется напишите на ivanov.maxim@gmail.com =)

 

redbaron
()

[питер][аренда] квартира на 2 недели

Добрый день! Может кто подскажет пути, а может и предложит варианты как снять квартиру в Питере с 6-8 Ноября (дата заезда гибкая) по 22? Жить будем вдвоем с девушкой, решили вот посетить культурную столицу России (и удивиться безкультурию).

Посуточные квартиры стоят заоблачно и скидок давать нехотят :) Хотелось бы уложиться в 15-17 тыс.

Если вдруг мне несказанно повезло и кто-то знает возможные варианты то просьба скинуть на ivanov.maxim@gmail.com контакты.

 

redbaron
()

Embed online store

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

Существуют ли какие-нибудь сторонние сервисы, куда б загрузил свой альбом, встроил виджет в сайт и отстегиваешь небольшую комиссию с продаж?

redbaron
()

[Qt] как пропорционально вписать виджет в другой виджет?

Есть виджет, у него понятное есть родной sizeHint(). Если мы его помещаем в другой виджет (я юзаю VBoxLayout с одним элементом внутри), то есть ли какой нибудь родной способ, что б пропорционально (согласно sizeHint())вписать дите в родителя? Или городить костыли с resizeEvent?

 

redbaron
()

LGA1156 vs AM3 - какой сокет долговечнее?

Задумал брать себе новый комп. По производительности i5-760 получше, при равной цене Phenom X6 ему сливает в игрушках, а компилять что-нибудь массовое мне не так часто надо. Материнки стоит примерно одинакого в районе 130 долларов.

В то же время X4 подешевле, а производительность вроде устраивает.

В итоге выбирать похоже приходится по долговечности: какой дольше проживет? В какой можно будет супер мега проц через годика полтора два?

redbaron
()

Сокеты и FD

Открытие сетевого сокета уменьшает ли остаток свободных FD?

redbaron
()

Честная неподконтрольная электронная система выборов

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

Возможно ли это впринципе? Можно ли придумать такую систему в которой даже взятка мега главному админу следящему за всем и вся ничего не сможет изменить?

redbaron
()

[Qt] Послать искусственный QMouseEvent?

Демо код тут: http://gist.github.com/517445

Пытаюсь отправить событие типа «левые клик» виджету, а он его не принимает =( Настоящей мышкой работает как надо.

Вот код моего виджета, который просто в себе содержит QCalendarWidget и QPushButton.

#include "calendar.h"

Calendar::Calendar(QWidget *parent) :
    QWidget(parent)
{
    qCal = new QCalendarWidget;
    qBtn = new QPushButton(tr("Press me"));

    connect(qBtn, SIGNAL(clicked()), this, SLOT(testCustomClick()));

    QVBoxLayout *layout = new QVBoxLayout;
    layout->addWidget(qCal);
    layout->addWidget(qBtn);

    setLayout(layout);
    qDebug() << "Date:" << QDate::currentDate();
}

Calendar::~Calendar()
{
}

void Calendar::testCustomClick()
{
    QMouseEvent qm2(QEvent::MouseButtonPress, QPoint(qCal->width()/2,qCal->height()/2), Qt::LeftButton , Qt::LeftButton, Qt::NoModifier);
    QApplication::sendEvent(qCal, &qm2);
}


void Calendar::mousePressEvent(QMouseEvent* ev)
{
    qDebug() << "mouse event: " << ev << "x=" << ev->x() <<" y=" << ev->y();
    QWidget::mousePressEvent(ev);
}

При нажатии на кнопку пытаюсь сгенерировать клик в центре виджета-календаря, но вместо того что б выбралась там дата, событие все-равно приходит в мой виджет (срабатывает mousePressEvent, видно по выводу qDebug() ) при этом если настоящей мышкой ткнуть в календарь, то Calender::mousePressEvent не срабатывает, что логично, т.к. событие обрабатывается календарем и наверх не посылается.

Посылаю событие через QApplication::sendEvent прямо на виджет календаря, но no luck =( Может у кого идеи будут?

 

redbaron
()

LOR API

Всем хай! Никто случайно на коленке потихоньку не пилит LOR API? REST подобное было бы идеальным конечно.

redbaron
()

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