All streams
Search
Write a publication
Pull to refresh
16
0
Александр Медведев @Tyiler

дровосек

Send message

Срезал, скажите еще. Язык у вас отстрый, это не отнять, людям это нравится. Но суть-то не в остроте обычно ведь.

Не уйметесь вы никак, да. Ладно, время лечит.

Лично я в подобных "остротах" зачастую агрессии не вижу

Вы не видите, ну ок

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

Эксперт, пусть так, но правила приличий никто из-за этого не отменял.

 только руки отмываю

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

Ладно, давайте на этом закончим. Всем не угодишь, кто-то плюсы ставит статьям этим, я тоже ставил. Автору успокоиться желаю наконец, и перестать гнаться за признанием, а статьи пусть пишет, да.

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

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

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

Бан у вас недавно был, надо бы повторить похоже вот за такие переходы на личности, например:

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

Вы, наверняка, слывёте среди коллег и друзей весьма остроумным человеком, да?

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

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

Я думаю, таких комментов с пассивной агрессией неск десятков наберется со всех ваших выпендрежных статей.

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

Что если скажу, что ваш код - дерьмо, и вы - сраный-старый мудак на вонючем велосипеде.
Давайте-ка ответьте мне тут как надо, а я позабочусь о вашем еще одном бане, думаю, многие будут не против.
ЗЫ: поддержите плюсом, кто за бан этого выпендрежника, наберется неск десятков - будет что админам ресурса передать.

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

  1. Фрагментация и несовместимость компонентов:

сименс + скады с ним совместимые (все совместимы) - где там какая фрагментация?

2. Высокая стоимость владения: проприетарные решения требуют

да, чудес не бывает и не будет. Открытые системы тоже надо будет кому-то поддерживать, вы готовы положиться на опенсорс, который будет писать для вас "бесплатно" школьник или студент? То-то же.

3. Недостаточная гибкость: 

вопрос "где" гибкость недостаточная? Если про производство говорим - стройте еще линии, меняйте тех процесс, повышайте культуру на производстве. Причем здесь АСУТП ?
Если про уровень управления предприятием говорим, то сейчас нет никакой проблемы вытащить данные с низкого уровня и представить их как угодно - трендами, графиками и тп
Хочется чтобы ЛЛМ вытаскивала по голосу, пож-та, тоже можно прикрутить.

Какой гибкости не достаточно - не понятно. Недостаточно квалификации (не на уровне АСУТП) на уровне управления предприятием - вот это понятно как раз.

4.Цифровая трансформация: Индустрия 4.0 и Интернет вещей (IIoT) требуют интеграции АСУТП с облачными платформами

это вообще хрень, даже комментить не хочу. Кто у "Северстали" требует?

Недостатки:

  1. Ограниченная гибкость. IEC 61131 ориентирован на централизованные системы, где вся логика выполняется на одном ПЛК. Взаимодействие между несколькими ПЛК требует дополнительной разработки и зачастую реализуется через внешние протоколы.

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

  3. Низкий уровень абстракции. Программирование напрямую связано с физическими регистрами ПЛК.

  4. Проблемы с интеграцией. Стандарт не учитывает современные API и облачные технологии, что усложняет взаимодействие с внешними системами.

Вот это не недостатки, а достоинства.

Представьте, что у вас ПК будет управлять станом, и программа будет на питоне, например, которую пишет смузи-программер (и опустим пока, что за 300к/нсек). Понимаете, что надежности не будет совсем, что производство встанет просто?

Ждите, когда вернется сименс и не дергайтесь.
ЗИП, я думаю, еще долго не кончится, оборудование сименс очень надежное, еще на 10ки лет хватит.

я же не о том совсем. Зачем об этих мелочах писать вообще, понятно же что на плюсах пишем, понятно что есть unique_ptr, string_view и тд.

В общем, не понял я, в чем польза статьи. Для SFML мало разве примеров в сети. Тогда надо было вначале написать для кого это все и зачем.

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

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

Приветствую.

Напишу грубо немного, но "надо, Федя, надо(с)".

Замах на рубль называется. Много пафоса и лишних слов ("std::unique_ptr вместо сырых указателей — в 2025...", "std::string_view экономит копирования строк" и тд).

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

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

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

Приветствую.

Делал похожее, только с параметром "..." (template parameter pack). Получилось коротко довольно, но правда не заморачивался с байтовой обрезкой в завис от значения, как у вас.

Такой принцип:

  • в начале пишем общую длину

  • затем для скаляров (int, double..) сразу пишем значения

  • для массива пишем сначала размер, потом значения

  • для строк тоже сначала размер, потом значение

Напишу прямо тут немного кода:

Скрытый текст
template<typename... Fields>
class SerialReader{
public: 
    SerialReader(const std::string& m, Fields&... fields):
      in_(m){        
        const int allType = intSz_;
        inSize_ = int(m.size());         
        char* pData = (char*)m.data();
        if (inSize_ < allType || inSize_ != *(int*)(pData)){
            ok_ = false;
            return;
        }
        offs_ = allType;
        (readField(fields), ...);
    } 
    bool ok()const{
        return ok_;
    }
private:
    bool checkFieldSize(int fieldSize){
        if (offs_ + fieldSize > inSize_){
            ok_ = false;
        }
        return ok_;        
    }
    void readField(std::string& s){ 
        if (ok_){
            if (!checkFieldSize(intSz_)) return;
            const char* pData = in_.data();
            int strSz = *((int*)(pData + offs_));  offs_ += intSz_;
            
            if (!checkFieldSize(strSz)) return;
            s = std::string(pData + offs_, strSz);  offs_ += strSz;
        }        
    }
    void readField(int& v){
        if (ok_){
            if (!checkFieldSize(intSz_)) return;
            const char* pData = in_.data();
            v = *((int*)(pData + offs_));  offs_ += intSz_;
        }
    }
    void readField(std::vector<int>& out){
        if (ok_){
            if (!checkFieldSize(intSz_)) return;
            const char* pData = in_.data();
            int vsz = *((int*)(pData + offs_));  offs_ += intSz_;
            if (!checkFieldSize(vsz * intSz_)) return;
            out.reserve(vsz);
            memcpy(out.data(), pData + offs_, vsz * intSz_);
            offs_ += vsz * intSz_;
        }
    }
    const int intSz_ = 4;
    int inSize_{};    
    int offs_ = 0;
    bool ok_ = true;
    const std::string& in_;
};

template<typename... Fields>
class SerialWriter{
public: 
    SerialWriter(const Fields&... fields){
        (fieldSize(fields), ...);

        outSize_ += intSz_;
        out_.resize(outSize_);
        writeField(outSize_);

        (writeField(fields), ...);
    } 
    std::string out(){
        return out_;
    }
private:
    void fieldSize(const std::string& s){
        outSize_ += intSz_ + s.size();
    }
    void fieldSize(int){
        outSize_ += intSz_;
    }
    void fieldSize(const std::vector<int>& v){
        outSize_ += intSz_ + int(v.size()) * intSz_;
    }
    void writeField(const std::string& s){ 
        char* pOut = out_.data();
        const auto ssz = s.size();
        *((int*)(pOut + offs_)) = ssz;        offs_ += intSz_;
        memcpy(pOut + offs_, s.data(), ssz);  offs_ += ssz;
    }
    void writeField(int v){
        char* pOut = out_.data();
        *((int*)(pOut + offs_)) = v; offs_ += intSz_;
    }
     void writeField(const std::vector<int>& arr){
        char* pOut = out_.data();
        const int asz = int(arr.size());
        *((int*)(pOut + offs_)) = asz; offs_ += intSz_;
        memcpy(pOut + offs_, arr.data(), asz * intSz_);
        offs_ += asz * intSz_;
    }
    const int intSz_ = 4;
    int outSize_{};    
    int offs_ = 0;
    std::string out_;        
};

Там только типы int и string, любые другие понятно думаю как добавить.

Теперь как этим пользоваться, пусть есть структура:

struct MyStruct{
  std::string field1;
  int field2{};
  std::string field3;
  std::vector<int> field4;
  
  std::string serialn();
  bool deserialn(const std::string& m);
}

Добавили 2 метода ей: serialn и deserialn.

Вот что внутри пишем:

std::string MyStruct::serialn(){
  const auto out = SerialWriter(field1, 
                                field2,
                                field3,
                                field4).out();
  return out;
}

bool MyStruct::deserialn(const std::string& m){
  const auto ok = SerialReader(m,
                               field1,
                               field2,
                               field3,
                               field4).ok();
  return ok;
}  

Здесь этот код находится, он правда в контексте конкретном, то есть не вынесен в общий.

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

А так да, если не позаботишься сам специально, то потерять данные можно.

а немного ждет (по умолч 1мс

Про это напишу еще.

Здесь упор сделан на bw (пропуск-ю способность), без задержки этой можно обойтись, обнулить при сборке, если нужно в первую очередь быстродействие.

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

В итоге в среднем имеем 10мс общего времени.

10к/10мс отсюда предположим линейно, что будет 1Млн сооб/сек

Ну дык у вас же не млн сообщений в сек. Или я не понял претензии или вопроса.

На бенчмарк я там ссылку дал, все там понятно написано, 50 строчек кода и Makefile тут же рядом.

Возможно у вас сервер мощный с кучей ядер и прочее (если вы считаете, что это очень мало), я тестил на своем рабочем ПК (core 11700).

Ее опциональной сделаю попозже.

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

Скорее всего будет так: если без БД, то и без гарантии.

Tarantul за место редиса имеете ввиду? Ну не знаю, можно, наверно.

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

По первой ссылке сходил. Не дешевое удовольствие.

 участие системного администратора 

Согласен.

настраивать оповещения у меня тоже можно

Telegraf + InfluxDB + Grafana

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

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

Ладно. Кому интересен процесс настройки всего это хозяйства, конечно пусть берут связки всякие (телеграф или забикс, таймлайн бд какая-то и тд), а кому нужно график прямо сейчас глянуть и дальше бежать, возьмут велик типа моего.

Information

Rating
Does not participate
Location
Екатеринбург, Свердловская обл., Россия
Date of birth
Registered
Activity

Specialization

Backend Developer, Fullstack Developer