LINUX.ORG.RU

Сообщения victor79

 

Наследование классов с параметрами себеподобного типа в методах.

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

Как лучше это решается, можно ли без переписывания и переобъявления методов? Может с учетом новых с++2z?

===
UPD: Не, не работает. Например:

struct A {
   int a = 0;
   A() {}
   A(int _a) : a(_a) {}
   bool operator<(const A& other) const { return a < other.a; }
   A operator+(const A& other) const { return A(a + other.a); }
};

namespace std {
template <> struct hash<A> {
   std::size_t operator()(const A& o) const { return hash<int>()(o.a); }
}; }

struct B: public A {
   void methodOfB() const {}
};

B b1(1);
B b2(2);
(b1 + b2).methodOfB(); // <== ERROR

std::unordered_map<A,int> mapA; // normal
std::unordered_map<B,int> mapB; // <== ERROR

 ,

victor79
()

У хрома непонятный запрос авторизации при входе, что это такое?

У меня хром-браузер некоторое время назад начал спрашивать такой запрос авторизации при входе:

https://drive.google.com/file/d/1PJ0v8p2tXlvoAeHXMwKLzyoyUS-uRoz3/view?usp=sh...

Кто-нибудь знает что это такое?

Происходит не каждый раз, как-то периодами.

У меня так же совсем недавно поломали аккаунт на авито, может ли это быть связано?

 

victor79
()

Регулярные выражения, конструкция между повторениями, есть такое?

Если я делаю сложное выражение, а потом хочу его множественное повторение с промежуточным символом. Но после последнего элемента, промежуточный символ не нужен.

Как написать такое выражение, что бы то сложное выражение не писать дважды?

Например:

^(?:(?:[2-9][1-4]|1[0-4][1-4])[-+ ])+$
Здесь это последовательность цифр вводимых на правой клавиатуре, и между цифрами может быть как пробел, так и плюс или минус.

Т.е. здесь [-+ ] - это символ между конструкциями. Как сделать, что бы при последнем повторении он не проверялся.
Только между конструкциями (?:[2-9][1-4]|1[0-4][1-4])

 

victor79
()

Английские название полей, как правильно, «createDateTime» or «createdDateTime»?

Вот в таблице нужно создать колонку с датой создания записи. Как будет правильно, «createDateTime» or «createdDateTime».

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

 

victor79
()

Практические советы по улучшению UI моей демо-проги?

Сделал я тут простенькую программку на Qt/C++ по учету своего времени, типа тайм-трекер. Функционал пока еще в процессе, но суть не про это.

Думаю запихнуть ее как демку в портфолио, и вопрос, как лучше делать UI, что в нем можно или нужно поменять, и т.д.

https://drive.google.com/file/d/1O3MHCYu8SteUq-tcG_mZLZoiRb3dNJNh/view?usp=sh...

https://drive.google.com/file/d/12ktpEeRGEu43fp5YzOybAig5zMGPOaVP/view?usp=sh...

Как-то деревянно оно смотрится, а что и как поменять не понятно.

В общем любые практические советы по вопросу UI, желательно подкрепленные указанием как это сделать на Qt/C++.

(если кому интересно, позже исходники будут опен-соурс).

UPD:Текущий подправленный вариант UI:
https://drive.google.com/file/d/10Y76vEGZ0qKd8xotISaWAe1u3P6aTr46/view?usp=sh...
(зеленные строки демонстрируют режим трекинга по одновременно двум проектам)

 , , ,

victor79
()

Как селектом получить дату-время в локальном представлении?

Есть таблица на SQLite, в ней хочу сохранять дату-время в UTC, но при выполнении select хочу видеть это время в локальном формате. Как это сделать? И какой формат колонки должен быть при create table?

select выводит напрямую в таблицу на форме, все это используется через Qt/C++ кроссплатформено.

 

victor79
()

Как добавить патч в гит в отдельную ветку как коммит, не затрагивая файлы?

Сильно не пинайте...

Есть гит репозиторий и исходники на удаленном компе. Я их копирую себе на диск.

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

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

Как это лучше сделать?

Это нужно делать патч и копировать туда его и добавлять как коммит, или есть какая-то команда, которая может сразу коммит перенести?

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

 

victor79
()

Как лучше решить вопрос с плохим заказом на Upwork?

Взял я заказ на Upwork.

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

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

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

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

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

Что будет меньше влиять на негативную статистику и на дальнейшие возможные тамошние заказы? Это мой первый заказ на апворке.

Перемещено leave из job

 

victor79
()

Подскажите кратко по GPT-3, как она кушает текст?

Вот смотрю статью: https://habr.com/ru/company/skillfactory/blog/562928/

Там на картинке показывается, что Input Embedding and Position Encoding получает подготовленный текст разделенный на слова (третья картинка).

Вопрос, это так, или же в сеть как-то все же подается текст без какой-либо предварительной обработки?

 

victor79
()

Хочу разместить код на github с лицензией «только для ознакомления», подскажите какая из стандартных лицензий это д.б.?

Хочу разместить код на github с лицензией «только для ознакомления», подскажите какая из стандартных англоязычных лицензий это д.б.?

 

victor79
()

Есть ли в C++ аналог yield итератора?

В некоторых языках наблюдаю такой тип выборки последовательностей (код условный):

fun getSequence(params): Sequence {
    while (true) {
        value = toDoSomething(params);
        yield value;
    }
}
...
for (auto value: getSequence(something)) {
    ...
}
Т.е. yield возвращает очередное значение последовательности и прерывает выполнение до запроса следующего значения. При запросе следующего значения возобновляет выполнение с прерванной позиции.

Для С++ похожая схема реализуется с передачей лямбды в параметр, выглядит так:

void getSequence(auto params, const auto &task) {
    while (true) {
        auto value = toDoSomething(params);
        task(value);
    }
}
...
getSequence(something, [&](const auto &value) {
   ...
});
Можно ли сделать такой итератор с учетом может каких-либо последний фич от с++2z?

 

victor79
()

Как гарантировать move операцию без copy операций (is_true_move_constructible)?

Столкнулся недавно с ситуацией, что класс делал копирование вместо перемещения, т.к. одним из полей класса было не перемещаемое поле, что-то вроде такого:

UPD: пример рабочий, оставлено для истории. Демонстрируется в обсуждениях.


struct __attribute__((packed, aligned(1))) Token {
   char abc = 0;
};

struct Data {
   char *allocatedData = nullptr;

   Data(Data &&o) : allocatedData(std::exchange(o.allocatedData, nullptr) {}
   Data &operator=(Data &&o) { swap(allocatedData, o.allocatedData); }
   // плюс еще конструкторы/деструкторы и присвоение
   //  которые реально выделяют память
};
...

// в таком pair этот Data перестает быть перемещаемым, только копируемым.
// и в результате при вставках в список для каждого сдвигаемого
// элемента происходит копирование, а не перемещение.
MyList<pair<Token,Data>> listSortedByToken;

При дальнейшем расследовании оказалось, что std::is_move_constructible && std::is_move_assignable сообщают true на такой pair, т.к. оно по прежнему содержит конструктор копирования. Да и на сам Token так же сообщают true.

Вопрос, можно ли как-либо идентифицировать, что что объект будет перемещаться, а не копироваться при использовании move/swap? Что бы можно было поставить на это static_assert.

UPD:

В общем, данный пример оказался нормально рабочим, а у меня раннее не работало из-за запутанности объявлений с =default && =delete у присвоений и конструкторов.

Но вопрос остается, можно ли как гарантировать, что объект будет перемещаться, а не копироваться? При том, что у объекта должны быть и конструкторы копирования. Что бы выполнение std::move строго вызывало конструкцию Data(Data&&), независимо от того, что move применен не к самому Data, а скажем к классу который инкапсулирует Data где-нибудь. Т.е. теперь это вопрос к классу Data, что бы он мог инкапсулироваться только в те классы, которые позволят ему быть перемещаемым.

=============================

UPD: В общем нашелся такой вот метод:


template <typename T, bool P>
struct is_movecopy_helper;

template <typename T>
struct is_movecopy_helper<T, false> {
    typedef T type;
};

template <typename T>
struct is_movecopy_helper<T, true> {
    template <typename U>
    struct Dummy : public U {
        Dummy(const Dummy&) = delete;
        Dummy(Dummy&&) = default;
    };
    typedef Dummy<T> type;
};

template <class T>
struct has_move_constructor
: std::integral_constant<bool,
    std::is_move_constructible<
       typename is_movecopy_helper<T, std::is_class<T>::value>::type
    >::value> { };
   static_assert(has_move_constructor<T>::value);

Вроде работате, взят отсюда и немного подкорректирован: https://stackoverflow.com/questions/7054952/type-trait-for-moveable-types

 , , ,

victor79
()

Сортировка матрицы посредством std::sort. Изобретать ли итератор?

Есть матрица в виде массива new T[cCols*cRows] по строчная (строка1, строка2, ...). Как бы ее сортировать посредством std::sort? Есть ли что готовое на эту тему? Или же std::qsort использовать?

======================================================

UPD: В среднем алгоритм получился такой (здесь писалось без проверки, у меня другие классы):

void M::sortByCol(uint iCol) {

    vector<pair<uint,uint>> listIdx;
    // first - откуда взять после сортировки,
    // second - куда поместить (обратный индекс)
    for (uint ii = 0; ii < cRows; ++ii)
        listIdx.push_back({ii,0});

    std::sort(listIdx.begin(), listIdx.end(),
           [&](const auto &p1, const auto &p2) -> bool {
               return getData(iCol, p1.first) < getData(iCol, p2.first); });

    for (uint ii = 0; ii < cRows; ++ii)
        listIdx[listIdx[ii].first].second = ii; // обратный индекс

    for (uint ii = 0; ii < cRows-1; ++ii) {
        auto &p = listIdx[ii];
        uint iSrc = p.first; // откуда берется в тек.строку
        if (iSrc == ii) continue;
        swapRows(ii, iSrc);
        listIdx[p.second].first = iSrc; // а прежние данные после будут
        listIdx[iSrc].second = p.second; //  браться уже отсюда.
    }
}

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

 ,

victor79
()

Будет ли корректно не дестроить объект в случае перемещений в массиве?

Будет ли корректным следующий вариант удаления элемента из массива:

template <class T>
class MyList {
   T *buf = nullptr;
   uint cnt = 0;
   uint capa = 0;

   ...
   
   void delByIndex(uint idx) {
       assert( idx < cnt );
       // вот такой:
       buf[idx].~T();
       for (uint ii = idx+1; ii < cnt; ++ii)
          new(&buf[ii-1]) T(std::move(buf[ii]));
       // *******
       --cnt;
   }
};
Тип параметра шаблона может быть любым.

 ,

victor79
()

Есть ли простой редактор где можно сравнивать два текста без сохранения на диск? Из буфера.

Можно ли в простых редакторах типа gedit или kate сравнить два текста без сохранения на диск? Типа один текст в одной закладке, другой в другой, а в третью diff вывести. В общем, что бы без заморочек).

 ,

victor79
()

Шаблон не хочет автоматически выводить тип, как бы его заставить?

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

template <class T>
void test(const std::function<void(T ii)> &task) {
    task(5);
}

...

    test<int>([&](int ii) { // так компилит
        qDebug() << ii;  });

    test([&](int ii) { // так не компилит
        qDebug() << ii;  });

no matching function for call to ‘test(main()::<lambda(int)>)’

candidate: ‘template<class T> void test(const std::function<void(T)>&)’
    6 | void test(const std::function<void(T ii)> &task) {
      |      ^~~~
template argument deduction/substitution failed:
‘main()::<lambda(int)>’ is not derived from ‘const std::function<void(T)>’

Если весь тип function заменить на auto, то компилит (c++20):

void test(const auto &task) {
    task(5);
}
Но так не хотелось бы, не наглядно. И явно каждый раз прописывать тип шаблон это много избыточности при многоэтажных типах.

Так же при использовании auto не позволяет сделать параметр со значением по умолчанию

void test(const auto& task = nullptr) {
    if (task) // error: could not convert ‘task’ from ‘const main()::<lambda(int)>’ to ‘bool’
        task(5);
}

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

 ,

victor79
()

Я нашел жука!!! gcc: internal compiler error: Segmentation fault

Даже не знаю, есть ли в этом вопрос, скорее констатация факта. Вот такой код пораждает ошибку:

    void tls_useWithWaitKorValue(
            map<auto, map<auto, MyList<auto>>> &mmm,
            const auto &key,
            const auto &spl,
            const auto &val,
            const auto &task) {

        map<auto, MyList<auto>> &mm = mmm[key];
        // auto &mm = mmm[key]; // такая замена компилится нормально

        MyList<auto> &list = mm[spl];
:77:34: internal compiler error: Segmentation fault
   77 |         map<auto, MyList<auto>> &mm = mmm[key];
      |                                  ^~
Please submit a full bug report,
with preprocessed source if appropriate.
See <file:///usr/share/doc/gcc-10/README.Bugs> for instructions.

Для проверки нужно бы обновить, может уже исправили, да только пока не до этого. Моя текущая версия 10.2.0-5ubuntu1~20.04.

 ,

victor79
()

C++: Выделение массива памяти 1Гб в куче или в стеке?

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

Потом они появились, появились 64 битные системы и оперативка гигами, и виртуальные страницы памяти.

Т.е. по сути память сейчас можно выделять в стеке в равной степени как и в куче.

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

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

10Мб..100Мб..1Гб..10Гб?

Операционка не подразумевается какая-то конкретная, все современные десктоповые вроде так умеют.

 

victor79
()

Оптимизация лаконичности вызова сортировки. Как бы так сделать, что бы все было красиво.

У меня в кастомном списке есть такой метод:

template <typename T>
class MyList {
    T *buf = nullptr;
    ...

    void sort(const function<bool(const T& v1, const T& v2)> &compare) {
        if (p_count > 1) std::sort(buf, buf+p_count, compare);
    }
который я могу использовать вот так:
    listData.sort([&](auto &it1, auto &it2) -> bool {
        return tmplLess(
                    it1.field1, it2.field1,
                    it1.field2, it2.field2,
                    it1.field3, it2.field3);
    });
(tmplLess: https://github.com/victorprogrammist/snippets/blob/main/templateCompare.h)

Т.е. все просто, вот только в использовании нужно дублировать поля. Можно попробовать использовать tuple следующим образом:

    template <typename ...Args>
    void sort(const function<std::tuple<Args...>(const T& v)> &fields) {
        sort([&](const T &v1, const T &v2) -> bool {
            return fields(v1) < fields(v2); });
    }

Но тогда уже не задействуются auto при написании использования, и следующий вызов генерит ошибку компиляции:

    listData.sort([&](auto &it) {
        return std::tuple(it.field1, it.field2, it.field3); });

template argument deduction/substitution failed:
note: ‘myFunc::<lambda(auto:45&)>’ is not derived from...

Как бы так сделать, что бы можно было сделать чуть лучше чем есть?

 ,

victor79
()

Веб-разработчик сказал, что прямые запросы SQL не получится приделать к REST API на сайте на webasyst.

Делаю тут обмен 1С с сайтом, сайт на webasyst, доступ через REST API. Я отвечаю за часть на 1С, но суть не в этом. В виду нехватки возможностей у этого апи, мной было предложено расширить немножко этот апи, и по сути сделать возможность отсылать на сайт SQL запросы. На что веб-разработчик ответил что прямые запросы не получится.

Его ответ «Прямые запросы делать не получится, каждое условие надо обрабатывать например использование операторов < > sum(), или join для select запросов. Чем сложнее запросы, тем больше условий необходимо предусматривать.»

И я вот что-то не понимаю. Я то думал, он в десяток строк на php организует перенаправление запроса сразу в MySql. А он же в ответ говорит, что так делать не будет, а будет изобретать SQL, да к тому же обрезанный.

Можете объяснить, зачем такое?

 

victor79
()

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