LINUX.ORG.RU

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

Специализация шаблона с константным значением

Форум — Development

Добрый день всем.

Дано объявление шаблона:

template <typename T, T v>
struct Var
{
    using Type = T;

    static const Type value = v;
};

И есть его частичная специализация:

template <int N>
using Int = Var<int, N>;

Также есть обобшенная метафункция суммирования:

template <typename, typename>
struct Sum
{
    static void apply()
    {
        std::cout << "Common Sum()" << std::endl;
    }
};

Как написать специализацию этой функции именно для Int, если это возможно?

template <>
struct Sum<?, ?>
{
    static void apply()
    {
        std::cout << "Int Sum()" << std::endl;
    }
};

 , , ,

WaterLine
()

do{} while(0) вместо вложенных ифов

Форум — Development

Привет!
Народ, откуда пошла такая конструкция?

do
{
 if ( !cond0 ) break;
 foo();
 if ( !cond1) break;
 bar();
 //...
 if ( !condN) break;
return true;
} while ( 0 )
return false;


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

 ,

xoomer
()

Релиз персонального менеджера для накопления информации MyTetra v.1.43

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

Опубликован новый релиз кроссплатформенного PIM-менеджера MyTetra v.1.43. Это багфикс-релиз, выпущенный спустя два года после основного релиза. Список изменений состоит из 24 пунктов, среди которых не только исправление выявленных при эксплуатации проблем, но и добавление нового функционала.

В данном релизе сделано много мелких правок для встроенного WYSIWYG редактора, улучшено редактирование ссылок и доработано поведение редактора на граничных местах текста - в начале и конце области редакторования. Исправлена работа с различными нестандартными именами прикрепляемых файлов (dot-файлы, файлы без расширений и т.п.), исправлено взаимодействие программы с различными оконными средами (DE) в плане правильного восстановления геометрии окна и назначении кнопок по-умолчанию.

( читать дальше... )

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

 , , ,

Xintrea
()

Продление жизни rvalue

Форум — Development

Привет.

#include <iostream>
using namespace std;
struct S{
  ~S() {cout << "destr\n";}
};
int main(){
  S &&r = (S &&) S{};
  // const S &r = (S &&) S{}; // аналогично
  cout << "-------------\n";
}
Вообще я думал, что жизнь временных объектов продливается лишь единожды - при первой инициализации ссылки им, быстрый взгляд в справочник говорит о том же. А у нас здесь две инициализации ссылки, т.е. объекту стоило бы уничтожиться после двоеточия. Но запустив тест получается, что объект переживает cout, компилятор не ругается (clang, gcc). Вопрос - будет ли жить временный объект до тех пор, пока живёт r, вообще он живёт, но насколько это по правилам?

In general, the lifetime of a temporary cannot be further extended by «passing it on»: a second reference, initialized from the reference to which the temporary was bound, does not affect its lifetime.

 

pavlick
()

shared libraries

Форум — Development

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

anonymous
()

Сохранение/загрузка вещественных чисел в файл

Форум — Development

Допустим, перед нами стоит задача сохранения данных в файл для последующей загрузки. В целях экономии места и повышения производительности файл хочется сделать бинарным (формат хранимых структур очень простой и точно никогда не изменится). При этом, однако, хочется кросс-платформенности (чтобы файл сохранённый, скажем, на x86, нормально прочитался программой, собранной под ARM и т. д.).

С целыми числами всё понятно - используем типы фиксированной разрядности (типа int32_t), также при сохранении переводим к фиксированному порядку байт (либо всегда в little-endian, либо всегда в big-endian) как это делает htonl и аналоги. По идее этого должно быть достаточно.

А что насчёт float/double? Насколько их внутреннее представление может отличаться между платформами, поддерживающими стандарт Си? Как можно максимально эффективно преобразовать их в единую форму для сохранения и обратно? (может быть есть какие-то стандартные функции или хотя бы хорошие библиотеки, либо вовсе достаточно 2-3 строчек без всяких библиотек).

 

KivApple
()

Перенос сервисов на серые IP и доступ к ним.

Форум — Admin

Добрый день. Имеется комп, на нем работает сервис, который слушает порт, позволяет к нему подключаться и обмениваться данными. Сейчас этот комп в NAT и к нему проброшен порт с внешнего статического IP. Хочется утащить этот комп куда-нибудь в гараж, чтобы дома не шумел. Но по-прежнему получать доступ к тому самому порту. В гараже инет к компу можно получить только с мобильной сети (GSM-модем, либо роутер с тем-же GSM-модемом). Дома остается еще небольшой сервер (HP Microserver, малошумный, в гараж не просится). На сервере стоит CentOS 7. Вот как получить доступ к серому IP/порту на комп в гараже? Из теории получилось только такую схему придумать:

  • На сервере запускаю некую redirect-программу, которая слушает два порта. На один порт (PORT_0) я могу подключаться клиентской частью сервиса, на второй порт (PORT_1) подключается удаленный модуль, размещенный на компе в гараже. При подключении клиентом, redirect-программа соединяет обмен IN/OUT по портам PORT_0 и PORT_1 между собой, т.е. клиент начинает общаться с удаленным компом в гараже.
  • На компе в гараже запускаю тоже redirect-программу, которая раз в минуту переконнекчивается к порту PORT_1 (на случай, если требуется переустановить коннект до PORT_1), а также имеет постоянное локальное соединение с портом сервиса и обеспечивает обмен IN/OUT между сервисом и клиентом.

Бывает что-то попроще?

 , ,

lanmaster2
()

Instruction reordering

Форум — Development
void some_internal_function()
{
  std::unique_lock<std::mutex> l(mutex);
  if (task_status == deferred)
  {
    task_status=in_progress;
    l.unlock();
    execute_task();
    l.lock();
    task_status=ready;
    l.unlock();
    cv.notify_all();
  }
}

void execute_task()
{
  //perform blocking I/O or other user-provided task
}

Гарантируется ли вызов execute_task() _не_ под блокировкой? Ведь ничто не мешает компилятору перенести этот вызов на строку выше или ниже. Реальный компилятор врядли так сделает, а вот стандарт такие преобразования не запрещает(???)

 , ,

Deleted
()

Оптимизатор НАКАЗАЛ разработчика Clang за UB в коде

Форум — Talks

Изложение https://qinsb.blogspot.ru/2018/03/ub-will-delete-your-null-checks.html

Однажды один человек закоммитил один коммит в clang и компилятор перестал проходить один из тестов. После тщательного анализа выяснилось, что в коде была возможна ситуация UB, но оптимизатор её проигнорировал и соптимизировал код так, как будто эта ситуация невозможна.

Вот код, который моделирует поведение кода из коммита (Код покоцан движком блога, вырезаны аргументы шаблонов. Я не буду пытаться их восстановить, т.к. аргумент-тип у llvm::SmallVector может быть понят из контекста, где надо, а аргумент-число — не особо важен):

struct Foo {
  llvm::SmallVector Vals;
};
struct Bar {
  Foo *getLastFoo() { return Foos.empty() ? nullptr : Foos.back(); }
  llvm::SmallVector Foos;
  void *Pad;
  void doUB();
};
void __attribute__((noinline)) Bar::doUB() {
  if (getLastFoo()->Vals.empty())
    puts("Vals empty");
  else
    puts("Vals non-empty");
}
int main() {
  Bar b;
  b.doUB();
}

В SmallVector::back стоит assert на не-пустоту вектора (!empty()). Т.к. код этих методов инлайнится (в getLastFoo) и компилятор видит, что проверка на пустоту в assert-е находится в false-ветке тернарного оператора, в условии которого та же самая проверка уже сделана, то в assert подставляется константа true и, в общем, можно считать, что assert выкинут.

Далее. Компилятор видит, что результат вызова getLastFoo в Bar::doUB() всегда разыменовывается, поэтому он не может быть нулевым указателем. Следовательно, условие тернарного оператора в getLastFoo не может быть истинным и при инлайнинге оператор безусловно заменяется на свою false-ветку (Foos.back() (в котором уже нет проверки на empty, т.к. assert был выкинут ранее)).

SmallVector устроен так, что в пустом векторе back() указывает внутрь самого SmallVector, и, короче говоря, код интерпретирует кусок памяти объекта Bar b как объект типа struct Foo и выполняет проверку Vals.empty() с непредсказуемым результатом.

Автор заканчивает тем, что радуется новому юз-кейсу для опции -fno-delete-null-checks, но по-прежнему не считает, что эту опцию стоит использовать для решения проблем ядра linux.

(видимо, имеется в виду типичный говнокод ядра

struct foo* p = bar->p;

if (!bar) {
...
}
который ядрописатели не считают багом, а винят в своих кривых руках компиляторы)

Перемещено tailgunner из development

 ,

utf8nowhere
()

clock() в Linux.

Форум — Development

Собираю проект в линуксе, который разрабатывал в виндоусе. И там всё было хорошо с функцией clock().

А в линуксе наблюдаются странности с функцией clock() уже не в первый раз такое наблюдаю.

Это относится к участку кода типа

unsigned start = clock();
//...
unsigned clk = clock() - start;

Результат получается многократно больше чем нужно. Кому-нибудь знакома такая проблема?

 

user08
()

Концепция передачи параметров в виде строки

Форум — Development

Есть проект (не важно, на каком языке, но пусть будет C++), в котором есть две так скажем мало связанные между собой части (функции/класса). И одна функция (класс) вызывает другую с передачей туда параметров. И сейчас в качестве интерфейса передачи параметров используется обычная строка, т.е. вызывающая функция генерирует строку вида «Имя_параметра1=значение_параметра1\nИмя_параметра2=значение_параметра2...», передаёт её вызываемой, где происходит парсинг параметров.

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

В общем, хочу обсудить: насколько это хорошо/плохо/универсально/неуниверсально? Можно ли так рекомендовать делать, если сам процесс вызова в программе происходит один раз (т.е. парсинг вообще не влияет на скорость выполнения)? Какие другие способы можете предложить (вызов разных функций через один интерфейс)?

Дискасс.

Update:

В качестве примера можно привести программу, обрабатывающую скрипт вида:

Вызвать Функцию1, параметры: п1=з1, п2=з2
Вызвать Функцию2, параметры: п3=з3, п4=з4

Программа, выполняющая данный скрипт, делает это через универсальный вызов

call_function(Функция1, "строка с параметрами")

 , , , ,

Sahas
()

Поиск работы за границей РФ: доступ из вашей страны запрещен и другие важные вещи

Форум — Job

Как вы знаете, в РФ есть довольно странное законодательство на счет персональных данных, в котором зарубежные рекрутеры не хотят разбираться. Со стороны это выглядит так, как будто вы пошли на сайт например Red Hat или IBM, а нажать кнопку «apply» вам не дали, вывесив текст о том, что законодательство вашей cтраны не позволяет обрабатывать персданные за границей.

ВАЖНО: эту заглушку не ставит работодатель, ее ставит рекрутер потому что так ему посоветовал МакКинзи или Прайс, которые так посоветовали потому что увидели некоторый риск для рекрутера. Никаких других прчин для этого нет, если вы зайдете на ту же страницу с IP любой европейской страны или США, то ваше резюме будет принято, рассмотрено, вам будут звонить на ваш российский номер телефона.

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

Прежде чем посылать CV в большую фирму, сходите на Linkedin/Facebook, пройдитесь там по знакомым и укажите их как референсы в резюме. Вы не поверите, сколько пользователей ЛОР, например, в Бренском Red Hat или IBM и с каким удовольствием они оставят о вас отзыв своему HR. Cпойлер: это возможные премии во многих конторах, так что не стесняйтесь спрашивать и просить рекомендации.

UPDATE из 2019. Теперь по крайней мере Red Hat заставляет формально аппаиться через российское представительство посте того, как зааплаился через VPN.

Перемещено Falcon-peregrinus из job

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

 , ,

Shaman007
()

Кто в какие open source игры играет?

Форум — Games

Расскажите пожалуйста во что вы играете и почему?

 ,

Deleted
()

std::optional<T> vs специальные значения.

Форум — Development

Добрый день.

Рассмотрим пример из Boost:

// Here, having received an empty vec and having no size_t to return is not a failure but a normal, albeit irregular, situation.
template <typename T>
optional<size_t> find_smallest_elem(const std::vector<T>& vec);

Теперь посмотрим на std::string:

// Returns: xpos if the function can determine such a value for xpos. Otherwise, returns npos.
size_type find(const basic_string& str, size_type pos = 0) const noexcept;

Внимание, вопросы:

  1. Какой API вам кажется приятнее?
  2. Если да, то чем это лучше подхода std::string::npos?
  3. Если это лучше подхода std::string::npos, то чем думали члены комитета при выпуске C++17, где же этот их самый optional в API того же std::string?

Спасибо.

 

azelipupenko
()

SObjectizer v.5.5.22

Форум — Development

SObjectizer — это относительно небольшой фреймворк для упрощения разработки сложных многопоточных приложений на C++. SObjectizer позволяет разработчику строить свои программы на базе асинхронного обмена сообщениями с использованием таких моделей, как Actor Model, Publish-Subscribe и CSP (в частности, каналов). Это OpenSource проект, распространяется под BSD-3-CLAUSE лицензией.

Мы выпустили очередную версию: SObjectizer-5.5.22.

Самое важное в новой версии — это возможность назначить фильтр для механизма трассировки процесса доставки сообщений (message_delivery_tracing или msg_tracing, если более коротко). Если раньше при включении msg_tracing-а SObjectizer выдавал информацию вообще обо всем, что касается доставки сообщений, что делало использование msg_tracing неудобным в больших приложениях, то теперь посредством msg_tracing-фильтров можно оставить только то, что вам интересно. Например, только информацию о сообщениях определенного типа. Или только информацию, относящуюся к конкретной рабочей нити. И т.д.

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

Еще в 5.5.22 добавлена возможность использовать свободные функции в качестве обработчиков сообщений в функциях для работы с CSP-шными каналами so_5::receive и so_5::select. И изменено поведение agent_t::so_current_state() — теперь если этот метод вызывается внутри on_enter/on_exit обработчиков, то so_current_state() возвращает ссылку на то состояние, обработчик on_enter/on_exit которого сейчас активен.

SObjectizer живет на SourceForge, есть зеркало на github. Соответственно, исходники могут быть загружены с SF.net или с github-а.

Так же мы обновили надстройку над SObjectizer-ом, библиотеку so_5_extra. so_5_extra обновилась до версии 1.1.0. Но нового в нее ничего не добавилось, только произошел переход на Asio-1.12 и SO-5.5.22. Для этого пришлось перелопатить часть библиотеки и выпустить версию 1.1.0 вместо 1.0.5. Кстати говоря, если вы использовали so_5_extra-1.0.4, то для перехода на SO-5.5.22 вам придется перейти и на so_5_extra-1.1.0, т.к. в SO-5.5.22 сломалась совместимость в той части, где идет работа с кастомными mbox-ами.

so_5_extra живет на SourceForge, взять ее можно оттуда же. Правда, распространяется so_5_extra уже под двойной лицензией.

=====

Отдельно хотелось бы отметить вот какой момент. Мы свой список хотелок для SObjectizer-а исчерпали где-то в районе версии 5.5.19 (т.е. чуть меньше года назад). С тех пор в SO-5.5 добавляются только те фичи, которые кому-нибудь понадобились. Либо нам самим, либо кому-то из пользователей.

С релизом версии 5.5.22 на этом стоит заострить особое внимание: в ветку SObjectizer-5.5 новые фичи теперь попадают только если a) они кому-то нужны и b) нас об этом просят.

Т.е. если вы хотите что-то увидеть в SObjectizer, но нам вы об этом не рассказали и мы об этом не узнали, то в ветке 5.5 вы этого точно не увидите.

=====

Было бы здорово услышать мнение тех, кто смотрел в сторону SObjectizer-а, но не выбрал его в качестве инструмента. Что остановило? Что не понравилось? Что вы не увидели в SObjectizer? Или, напротив, что такого страшного увидели?

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

 , , , ,

eao197
()

Чтение stdin

Форум — Development

Проблема следующего характера: программа принимает аргумент длинной более 5000 символов из командной строки, однако при чтении обрезается до 4095 символов.
Пример:

QTextStream qcin(stdin);
QByteArray str;
qcin >> str;
Также пробовал:
str.clear();
str.append(qcin.readLine(10000));

Также пробовал использовать стандартную библиотеку <iostream> и setbuf(). Во всех случаях обрезается до 4095.

 ,

Bers0
()

Ищу эталонную реализацию XML DOM

Форум — Development

Ищу эталонную реализацию XML DOM которая поддерживает все фишки XML, типа DTD, namespaces, xml:space, etc.

Желательно, чтобы в комплекте был широкий набор тестов. Чтобы понять как либа поступает в той или иной ситуации.

Язык роли не играет.

PS: да, именно DOM/дерево, не чисто парсер.

 

RazrFalcon
()

О том, как написать OS

Форум — Development

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

Короче, вот плейлист*: https://www.youtube.com/playlist?list=PLHh55M_Kq4OApWScZyPl5HhgsTJS9MZ6M
GitHub с сорцами: https://github.com/AlgorithMan-de/wyoos

Дерзайте, кому интересно...

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

 , , ,

KennyMinigun
()

Может кто нибудь показать красоту с++?

Форум — Development

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

 ,

u0atgKIRznY5
()

Flare 1.0 — свободная RPG 2D игра в стиле серии Diablo

Новости — Игры
Группа Игры

Через много лет после начала разработки и через 4 года после релиза 0.19 состоялся выпуск стабильной версии свободной (GPLv3 и CC-BY-SA 3.0) RPG 2D игры Flare. Разработчики и поклонники справедливо сравнивают игру с легендарной серией игр Diablo. Игра поддерживает пользовательские моды. Есть поддержка нескольких языков, в том числе русского.

Подготовлены бинарные сборки для Linux и Windows. В планах предложение бинарных сборок для macOS, Android и Web-браузеров.

( Видео, скриншоты )

Для загрузки:
Полные архивы: Sourceforge
Github: https://github.com/clintbellanger/flare-engine

FTP (для Linux, версия 1.02):
Engine (x86_64) + Game
Engine source
Game

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

 , ,

mandala
()