1. Си / Говнокод #27835

    0

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    35. 35
    36. 36
    37. 37
    38. 38
    39. 39
    40. 40
    41. 41
    42. 42
    43. 43
    44. 44
    45. 45
    46. 46
    // https://github.com/microsoft/Windows-driver-samples/blob/d3ec258921cfcef7b053b5a2c866330d43dd3f03/filesys/fastfat/dumpsup.c#L35
    
    #define DumpLabel(Label,Width) {                                          \
        size_t i, LastPeriod=0;                                                \
        CHAR _Str[20];                                                        \
        for(i=0;i<2;i++) { _Str[i] = UCHAR_SP;}                               \
        for(i=0;i<strlen(#Label);i++) {if (#Label[i] == '.') LastPeriod = i;} \
        strncpy(&_Str[2],&#Label[LastPeriod],Width);                          \
        for(i=strlen(_Str);i<Width;i++) {_Str[i] = UCHAR_SP;}                 \
        _Str[Width] = '\0';                                                   \
        DbgPrint("%s", _Str);                                                  \
    }
    
    #define DumpField(Field) {                                         \
        if ((FatDumpCurrentColumn + 18 + 9 + 9) > 80) {DumpNewLine();} \
        FatDumpCurrentColumn += 18 + 9 + 9;                            \
        DumpLabel(Field,18);                                           \
        DbgPrint(":%p", Ptr->Field);                                  \
        DbgPrint("         ");                                          \
    }
    
    #define DumpListEntry(Links) {                                     \
        if ((FatDumpCurrentColumn + 18 + 9 + 9) > 80) {DumpNewLine();} \
        FatDumpCurrentColumn += 18 + 9 + 9;                            \
        DumpLabel(Links,18);                                           \
        DbgPrint(":%p", Ptr->Links.Flink);                            \
        DbgPrint(":%p", Ptr->Links.Blink);                            \
    }
    
    #define DumpName(Field,Width) {                                    \
        ULONG i;                                                       \
        CHAR _String[256];                                             \
        if ((FatDumpCurrentColumn + 18 + Width) > 80) {DumpNewLine();} \
        FatDumpCurrentColumn += 18 + Width;                            \
        DumpLabel(Field,18);                                           \
        for(i=0;i<Width;i++) {_String[i] = (CHAR)Ptr->Field[i];}             \
        _String[Width] = '\0';                                         \
        DbgPrint("%s", _String);                                        \
    }
    
    #define TestForNull(Name) {                                 \
        if (Ptr == NULL) {                                      \
            DbgPrint("%s - Cannot dump a NULL pointer\n", Name); \
            return;                                             \
        }                                                       \
    }

    Макроговно от мекомягких для отладки файловой системы FAT

    Запостил: j123123, 22 Ноября 2021

    Комментарии (199) RSS

    • if ((FatDumpCurrentColumn + 18 + 9 + 9) > 80) {DumpNewLine();}

      Что еще за "+ 18 + 9 + 9"? Зачем? Зачем? То, что "> 80" это понятно что с ограничением говнотерминалов связано
      Ответить
      • ну наверное аутпут такой: колонка шириной 18, потом 9 и еще 9, а уже насрано на FatDumpCurrentColumn

        надо понять: влезет ли на эту строку.
        Ответить
    • Как тебя в такое древнее говно занесло?
      Ответить
      • > древнее

        https://github.com/microsoft/Windows-driver-samples/

        > Driver samples for Windows 10

        > These are the official Microsoft Windows Driver Kit (WDK) driver code samples for Windows 10. They provide a foundation for Universal Windows driver support of all hardware form factors, from phones to desktop PCs. Use these samples with Visual Studio 2019 and Windows Driver Kit (WDK) 10.

        Не такое уж и древнее. Но говно, да.

        Хотя копирайт там в конкретно том файле
        https://github.com/microsoft/Windows-driver-samples/blob/d3ec258921cfcef7b053b5a2c866330d43dd3f03/filesys/fastfat/dumpsup.c#L3

        > Copyright (c) 1989-2000 Microsoft Corporation

        конечно древний
        Ответить
        • Прыщебляди соснули!
          Ответить
        • >from phones
          хм

          >Windows Driver Kit
          В какой момент кстати DDK переименовали в WDK? когда WDM начал уходить в закат?
          Ответить
          • >> Copyright (c) 1989-2000 Microsoft Corporation
            так взяли поди из старого кода

            код вообще малоприятный
            > CHAR _Str[20];
            Ответить
            • И почему не отрефакторили? Не стыдно такое говно в качестве примеров в 2021 году выставлять?
              Ответить
              • наверное лениво было, тупо задавали ворнинги о вызове депрейктд апи
                https://github.com/microsoft/Windows-driver-samples/blob/d3ec258921cfcef7b053b5a2c866330d43dd3f03/filesys/fastfat/workque.c#L362
                Ответить
    • // https://github.com/microsoft/Windows-driver-samples/blob/d3ec258921cfcef7b053b5a2c866330d43dd3f03/filesys/fastfat/fat.h#L482
      
      
      #define FatNumberOfClusters(B) (                                         \
                                                                               \
        IsBpbFat32(B) ?                                                        \
                                                                               \
          ((((B)->Sectors ? (B)->Sectors : (B)->LargeSectors)                  \
                                                                               \
              -   ((B)->ReservedSectors +                                      \
                   (B)->Fats * (B)->LargeSectorsPerFat ))                      \
                                                                               \
                                          /                                    \
                                                                               \
                              (B)->SectorsPerCluster)                          \
        :                                                                      \
          ((((B)->Sectors ? (B)->Sectors : (B)->LargeSectors)                  \
                                                                               \
              -   ((B)->ReservedSectors +                                      \
                   (B)->Fats * (B)->SectorsPerFat +                            \
                   (B)->RootEntries * sizeof(DIRENT) / (B)->BytesPerSector ) ) \
                                                                               \
                                          /                                    \
                                                                               \
                              (B)->SectorsPerCluster)                          \
      }

      Какое форматирование )))
      Ответить
      • интересно, они это руками делали, или вижалстудия так умеет?

        зачем вообще это вручную срать макросом? Неужели компилятор это не может сам заинлайнить?

        У меня один ответ: этот код писался под компилятор 1998-го года выпуска
        Ответить
        • > вижалстудия так умеет

          Вижуал студия из 2000 года? )))
          Ответить
          • Ну форматнуть они могли и сейчас.


            VS 6.0 точно ничо не умела (разве что с помидором)
            Ответить
            • Деление в столбик явно ручной работы.
              Ответить
              • какой багор ))

                Вот мы ленивые со своими форматерами стали
                Ответить
                • Ненавижу автоформаттеры, всю душу в коде убивают.
                  Ответить
                  • Ясно

                    Любишь, когда у тебя в одной строчке есть равняеца с пробелами и без
                    for(i=0;i<2;i++) { _Str[i] = UCHAR_SP;}
                    Ответить
                    • Не, всё прозаичнее. Тот же шланг формат ставит перед тобой джва стула -- или так или сяк. Разрешить оба и юзать первый в одном случае, а второй в другом невозможно. Надо выбрать что-то одно на весь проект. Логично, что выглядит это как дерьмо.

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


                        А можешь привести пример уродства?
                        Ответить
                        • Да я уже приводила тут на прошлом срачике... Логически обоснованное разбиение элементов в массиве, к примеру.

                          Форматтер их или высрет в столбик или будет пихать до конца строки.

                          Или пробелы в выражениях.

                          Или логичный перенос строки в подвыражениях.

                          З.Ы. Сама идея "разобрать, забыть и перестроить" кажется мне тупиковой.
                          Ответить
                          • ну обычно они строят свинтаксическое дерево и по нему форматят

                            а есть прагма или коммент "тут не трогать"?
                            Ответить
                            • Есть. Но это ж пиздец, ещё комментов говноформаттеру не хватало...
                              Ответить
                        • Бля, неудобно с мобилы...

                          Ну или вот в таком коде визуальную семантику сможет сохранить твой форматтер?
                          std::cout <<
                              "x = " << x <<
                              "y = " << y <<
                              "z = " << z <<
                              std::end;
                          Ответить
                          • нет конечно
                            Ответить
                            • Ну и няхуй так жить?
                              Ответить
                              • Просто кресты говно.

                                printf("x = %d y=%d z=%d \n", x, y, z);
                                Ответить
                                • малость можно запутаться когда у тебя 44 параметра, да и как в рендомный стрим серануть?

                                  fprintf(mystream, "user=%o", user); ?
                                  Ответить
                                  • Кресты — говно. Их как ни форматируй...
                                    «Как ты дочка не ложись, тебя всё-равно выебут»

                                    > можно запутаться когда у тебя 44 параметра
                                    Будто в примере с std::cout << 44 они станут читабельнее.

                                    Можно привести реальный пример 44 параметров? (Предполагаю что это будет cout какого-то htmlя).

                                    Но кмк в этом случае нужен полноценный шублунизатур и/или named string formatting.

                                    Именно поэтому я за «PHP».
                                    Ответить
                                    • пошел нахуй плюсы тащат
                                      Ответить
                                    • Я согласен, что "<<" не очень читаемый синтаксис.

                                      Слёзы наворачиваются на глаза когда студент в лабе пишет
                                      cout << "Яблок " << yablok << ", а яиц " << yaits << std::endl;

                                      Но и с printfом всё равно было бы не очень няшно, по крайней мере потому, что нельзя именовать параметры.

                                      Чуть лучше в старом питоне
                                      "Яблок {yablok}".format(yablok = 42)
                                      .

                                      Но лучше всего строковая интерполиция.


                                      А вот сама идея стрима и возможность перегрузки оператора для конкретного типа это очень хорошо. Особенно хорошо для середины 80х, когда кресты это придумали.

                                      Как я могу отформатировать объект а джве если я не имею доступа к его toString?

                                      А в крестах же я могу вроде отдельно описать оператор, и это годно.
                                      Ответить
                                      • уже давно есть нормальная либа форматирования под плюсы. fmtlib вроде
                                        Ответить
                                        • хочется видеть это в стандартной либлиотеке.
                                          Ответить
                                          • давно хочется нормальный replace для контейнеров
                                            Ответить
                                      • fmtlib даже именные параметры поддерживает
                                        Ответить
                                      • > Как я могу отформатировать объект а джве если я не имею доступа к его toString?

                                        Это как вообще?
                                        Ответить
                                        • Перепиши на джаву
                                          // Писал НЕ я
                                          struct User
                                          {
                                          	int iq;
                                          };
                                          
                                          
                                          // Писал я
                                          std::ostream& operator<<(std::ostream& stream, const User& user)
                                          {
                                          	stream << user.iq;
                                          	return stream;
                                          }
                                          
                                          int main()
                                          {
                                          	User u{42};
                                          	std::cout << u;
                                          }


                                          В джаве мне придется реализовывать toString в User.
                                          Я не могу реализовать его "снаружи" класса
                                          Ответить
                                          • > Я не могу реализовать его "снаружи" класса
                                            Какой анскилл )))
                                            static String toText(User u){
                                                return ""+user.id;
                                            }
                                            Ответить
                                            • ага, и в каждом месте не забывать его в это говно заворачивать, иначе получишь дефолтный toString, например.

                                              Джава решение такое джава
                                              Ответить
                                              • Я так понимаю задача в каждом месте объект нужно сериализовывать по-разному.

                                                > std::ostream& operator<<(std::ostream& stream, const User& user)
                                                Эта говнина уже может быть где-то перегружена.

                                                По-моему, в достаточно сложном проекте подобные разношёрстные перегрузки внесут ещё больше путаницы.
                                                Ответить
                                              • Тогда надо всё завернуть:
                                                class Serializer:
                                                  template<T> void add(T):
                                                     ... toString ... 
                                                  String str() const;
                                                
                                                class UserOutputBuilder(Serializer):
                                                  void add(User):
                                                    ... доброе имя добрая слава имя имярек в чести {name} заходил {date} имеет {friends.len} друзей ...
                                                
                                                class LogBuilder(Serializer):
                                                  void add(User):
                                                    ... user={name} date={date} hash={hash} ...


                                                Или сделать свой класс строки - UserOutputString, LogString и т.п., которые работают как строки, но с обычными строками не взаимодействуют (вроде newtype Pituz = Pituz String в Haskell).
                                                Ответить
                                      • > Чуть лучше в старом питоне

                                        В новом так же можно. А ещё можно просто писать
                                        f"Яблок: {num_yablok}"
                                        Ответить
                                        • "f" это строковая интерполяция и есть же, не?
                                          Я написал, что она еще лучше
                                          Ответить
                                    • > станут читабельнее

                                      Станут. Во-первых тип автодетектится, во-вторых имя рядом со значением.

                                      Принцип локальности, мать её.
                                      Ответить
                                      • Для тех кого глаза основательно выебаны крестосинтаксисом
                                        std::cout << "хуz = " << pizda << std::dzihurda;
                                        выглядит читабельно.

                                        Но нет. Это говно.

                                        Не нужно так форматировать 44 параметра. Просто НЕ НУЖНО держать в коде огромный кусок какой-то питушни (html, sql, css), которая разрезана на "45 частей" << вот << "такой" << хуйнёй.
                                        Это хуже чем PHP.
                                        Ответить
                                        • > это говно

                                          Я не спорю, но оно легче читается и ревьювится чем printf().
                                          Ответить
                                          • Когда 2-3 параметра printf читабельнее.

                                            Плюс format-string задаёт декларативно алгоритм сериализации.

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

                                            А >> на плюсах это код. Железно прибитый и неповоротливый.
                                            Ответить
                                            • > Плюс format-string объявляет декларативно что хотели сделать.

                                              - хотели написать безопасный printf?
                                              Ответить
                                            • >Когда 2-3 параметра printf читабельнее.


                                              Главное не перепутать порядок
                                              Ответить
                                              • И типы. С порядком то сложно обосраться при 2-3 аргументах.
                                                Ответить
                                                • да, типы, и ты узнаешь об этом только в рантайме в продакшене (впрочем, хороший линтер тебе поможет)
                                                  Ответить
                                                  • > линтер

                                                    Не поможет... Он строку формата в рантайме из конфига читает...
                                                    Ответить
                                                    • то есть если админ поправит конфиг, то программа упадет в кору?
                                                      Ответить
                                                      • > в кору

                                                        Я думаю даже произвольный код можно исполнить благодаря некоторым фишкам printf'а.
                                                        Ответить
                                                        • Заебись у вас безопасная программа

                                                          Впрочем, у скриптовичков с интерполяцией такая же хуйня
                                                          Ответить
                                              • И как вы потом будете свой cout локализовывать?

                                                Сишкобоги напишут:
                                                const char *str = i18n(lang);
                                                
                                                printf(str, x, y, z);

                                                И строки вынесут в конфиг.

                                                А крестух и дальше будет кудахтать с кучи своего говна об удобстве cout.
                                                std::cout <<
                                                    "я = " << x <<
                                                    "руснявая = " << y <<
                                                    "крестоблядь = " << z <<
                                                    std::end;

                                                Ответить
                                                • > локализовывать

                                                  Нахуя логи локализовывать (а это 90% применений этого стрелочного говна)?

                                                  А с твоим принтфом потом лохализации в духе "не удалось найти %s" прямо в морду юзеру.
                                                  Ответить
                                                  • > Логгирование
                                                    > cout

                                                    /thread

                                                    Update: ах вы шлюхи крестовые как хитро придумали.
                                                    LOG(INFO) << "x: " << x;
                                                    Ответить
                                                    • >>/thread

                                                      ну какая разница cout или хуяаут? ostream есть ostream.

                                                      Слава богу эта абстракция в любом языке работает
                                                      Ответить
                                                  • >Нахуя логи локализовывать

                                                    Видел русский виндуос сервер? А постгрю на винде или с локалью ru_RU видел?
                                                    Ответить
                                                    • Лучше бы не видеть... Охуенно читать локализованные логи от какого-нибудь китайца.
                                                      Ответить
                                                      • > Нахуя логи локализовывать (а это 90% применений этого стрелочного говна)?

                                                        Почему так вцепились в логи? Я вообще ничего за логи не говорил.

                                                        Вот типичные примеры использования cout:
                                                        https://govnokod.ru/27057
                                                        https://govnokod.ru/14114
                                                        Ответить
                                                        • Шаблонизировать через "<<" -- хуёво.
                                                          Шаблонизировать через printf тоже очень хуёво.

                                                          Представь себе хередок на 2000 строк, в котором в разных местах запрятаны "%s".


                                                          Впрочем, через "%s" будет чуть менее пидорски.
                                                          Ответить
                                                          • Так я и не спорю что printf хуёвый шаблонизатор.

                                                            https://govnokod.ru/27835#comment744672

                                                            Но в изначальном примере был cout с 2-3 параметрами.

                                                            И в этом случае printf оптимален. А cout везде выглядит как крестушачье говно, и на 2х параметрах, и на 22х.

                                                            cout — императивная парадигма.
                                                            *printf — декларативная парадигма.
                                                            Ответить
                                                            • Хоспаде. Со стрелочками тоже можно сделать "декларативное" localize("foo=$1 bar=$2") << foo << bar.
                                                              Ответить
                                                              • > Со стрелочками тоже можно сделать "декларативное" localize
                                                                Так всё равно придётся весь cout код переформатировать (хотя выглядит куда лучше).

                                                                В изначальном примере (https://govnokod.ru/27835#comment744102) ведь сраные имперации.

                                                                И этот localize, он из коробки? Или очередной крестовелосипед?
                                                                Ответить
                                                                • > велосипед

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

                                                              Большинство программистов или не пишет логи вовсе, или пишет туда ненужную хуйню:

                                                              Или слишком низкоуровневую (не удается создать описатель 0x12345)

                                                              Или слишком высокоуровневую (не удается выполнить требуемую команду)
                                                              Ответить
                                                              • Логи сами по себе действительно не нужны, потому что это просто поток текста, который высрал конкретный участок кода. То есть текст, который ты видишь, привязан к функционалу, но не к данным и не к операциям, котоыре ты запускаешь.

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

                                                                  Файк работает энтерпрайзом, и потому ему нужно трейсить обработку транзакции в разных местах системы.

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

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

                                                                      Чтобы ответить на вопрос пользователя "почему я не могу зайти на сервер".
                                                                      Чтобы забанить мудака который пароль подбирает.
                                                                      Ответить
                                                                      • дак ты вторую часть сообщения-то прочитай, там "если" следом идет
                                                                        Ответить
                                                                        • Какие спаны ты собрался писать и куда, если это ssh сервер на бастионе или на роутере?
                                                                          Ответить
                                                                          • а что мешает писать их файлами локально точно так же, как логи?
                                                                            Ответить
                                                                            • В смысле записать трейс одного сервера в виде записи в текстовый файл?

                                                                              Чем это будет отличаться от логов?
                                                                              Приведи пример
                                                                              Ответить
                                                                              • Да походу то же самое, только с айдишником операции в каждом сообщении и более структурированное, чем произвольный текст.

                                                                                Ну как тот же nft сейчас показывает пакеты, проходящие через фаервол.
                                                                                Ответить
                                                                                • > с меткой операции в каждом сообщении
                                                                                  В смысле с меткой трейса?
                                                                                  Зачем он мне в случае auth.log у ssh сервера на роутере?

                                                                                  У меня там три сообщения в столбик.

                                                                                  >более структурированное
                                                                                  Отлично текстовые логи структурированы через колоночки и табики, иначе бы парсеры не работали

                                                                                  >Ну как тот же nft сейчас показывает пакеты, проходящие через фаервол.


                                                                                  В iptables тоже можно маркать пакеты и потом на основе марка что-то мутить. Даже коннекции можно, иначе бы там ECMP не работал и через NAT бы кое-кто не ходил
                                                                                  Ответить
                                                                                  • > У меня там три сообщения в столбик.

                                                                                    Ну, как минимум чтобы понять, где начало и конец у каждого "span'а из трёх строчек"... Даже если строчки от разных тредов не перемешаны, часто в логе не очевидно, где же начало операции.
                                                                                    Ответить
                                                                                    • Обычно оно начинается с
                                                                                      Accepted publickey for

                                                                                      :)

                                                                                      Если у меня несколько сессий, то конечно лучше их трейсить (хотя и тут у меня есть IP:port удаленной машины!)

                                                                                      К примеру в MTA удобно трейсить проход письма через все 100500 демонов постфикса (это можно делать по message id с какого-то момента)

                                                                                      А как бы ты "трейсил" ошибку в конфигурационном файле?
                                                                                      Ответить
                                                                                      • > ошибку в конфигурационном файле

                                                                                        Ну это была бы операция "перезагрузка конфига", очевидно.
                                                                                        Ответить
                                                                                        • Операция из одного шага?
                                                                                          А если он мониторит конфиги сам?
                                                                                          Это пользователь "robot" операцию начал?
                                                                                          Ответить
                                                                                          • > Операция из одного шага?

                                                                                            Хм, а что в этом плохого? И что за пользователи начавшие операцию вообще? Почему обязательно пользователь?

                                                                                            Я вот смотрю сейчас в auth.log, и там вообще чёрт ногу сломит... Ничерта не понятно что чем иниициировано и нахуя. У части строчек хотя бы pid есть. У остальных вообще не понятно от чего они.

                                                                                            З.Ы. Отличный пример хуёвого лога, к слову.
                                                                                            Ответить
                                                                                            • >И что за пользователи вообще?
                                                                                              Ты же хочешь структурированный лог, значит там должны быть инициаторы?

                                                                                              Или ты хочешь передавать всю инфорацию типа ключ-значение?

                                                                                              >Я вот смотрю сейчас в auth.log, и там вообще чёрт ногу сломит.

                                                                                              Может, у тебя какой-то сложный случай?

                                                                                              У меня твам sshd[pid] делает Accepted public key for from port и пр
                                                                                              Затем pam_unix

                                                                                              что не так?

                                                                                              Хуёвый лог это вот
                                                                                              https://i.postimg.cc/T35PVmvW/image.png
                                                                                              Ответить
                                                                                              • > ключ-значение

                                                                                                Как-то так, наверное. Или тип сообщения и его поля. В разных записях ведь разная инфа.

                                                                                                > инициатор

                                                                                                У файка, как я понимаю, это всё должно быть system-wide или даже enterprise-wide. Т.е. должна легко находиться связь между "админ кликнул в веб-интерфейсе по кнопке релоад ссшд", "ссшд получил сигнал на релоад конфига" и "парсер нашёл такую-то ошибку в конфиге"...

                                                                                                Т.е. айдишка внешнего спана должна быть прям глобальная-глобальная...
                                                                                                Ответить
                                                                                                • >Как-то так, наверное. Или тип сообщения и его поля. В разных записях ведь разная инфа.


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

                                                                                                  >У файка, как я понимаю, это всё должно быть system-wide или даже enterprise-wide.

                                                                                                  Верно. Для энтерпрайз случаев он совершенно прав.

                                                                                                  Я жеж ведь с этого начал: Если речь идет об энтерпрайз системе, состоящией из кучи сервисов, то нужен трейс.

                                                                                                  Если дело у j123 на контролере происходит, то хватит вероятно логов вполне. Причем текстовых, которые легко можно грепнуть и почитать.
                                                                                                  Ответить
                                                                                                  • > А как ты будешь это все в текстовом файле хранить у меня на роутере?

                                                                                                    Ну например так:

                                                                                                    01:38:01 id=100499 type=ssh.config_reload
                                                                                                    01:38:02 id=100500 type=ssh.logon user=root ip=127.0.0.1 port=12345
                                                                                                    01:38:03 id=100501 type=sudo.elevate from=user to=root
                                                                                                    01:38:04 id=100500 type=auth.failure
                                                                                                    01:38:05 id=100501 type=auth.success
                                                                                                    Ответить
                                                                                                    • awkать и cutать не очень-то удобно.

                                                                                                      Тогда уж может json и jq?
                                                                                                      Ответить
                                                                                                      • Блядь, вот ещё только логов в json не хватало... Уж лучше ASN.1, раз глазами не предполагается читать.
                                                                                                        Ответить
                                                                                                        • Ну тогда заранее задай колонки и будут awk и cut работать, но тогда ты не сможешь хранить случайный контекст.

                                                                                                          Разгадка такая: чтобы трейсить в общем случае нужно иметь спец инструменты. Текстовый формат читабельный не сохранить (или пирдолица как с логами CBS)


                                                                                                          > раз глазами не предполагается читать.

                                                                                                          Поттеринги, оставьте мои прыщи в покое.

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


                                                                                                          Короче, сказать "логи не нужны, есть трейс" это как сказать "CSV файлы не нужны, ведь есть Oracle" кмк
                                                                                                          Ответить
                                                                                                          • > CSV файлы не нужны

                                                                                                            Но ведь не нужны... Самый отвратительный в плане совместимости формат, наверное.
                                                                                                            Ответить
                                                                                                            • датасайнтисты в нем хранят говно, ты не поверишь
                                                                                                              Ответить
                                                                                                          • > CSV

                                                                                                            Вспоминается история с Kerbal Space Program под линукс, когда игруха не стартовала из-за флоата в конфиге и "неправильных" региональных настроек.

                                                                                                            C# недалеко ушёл от Delphi.
                                                                                                            Ответить
                                                                                                            • Это потому что питухи не могут усвоить разницу между хранимыми данными и представлением данных пользователю. И что «парсить» с «текущими региональными настройками» нужно только ввод пользователя.
                                                                                                              Ответить
                                                                                                              • > ввод пользователя

                                                                                                                Но ведь пользователь вводит значения через конфиг и читает логи. Значит они тоже должны быть локализованы!
                                                                                                                Ответить
                                                                                                              • >Это потому что питухи не могут усвоить разницу между хранимыми данными и представлением данных

                                                                                                                Совершенно верно.

                                                                                                                Именно потому в слаке и любых других современных приложениях всегда или даблэскейп или XSS
                                                                                                                Ответить
                                                                                                                • "Слака" - это мессенджер "Slack"? Ненавижу его.
                                                                                                                  Ответить
                                                                                                                  • нет, это наш с бормандом любимый дистр прыщей)

                                                                                                                    Конечно это мессенджер
                                                                                                                    Он у нас работе используется
                                                                                                                    Ответить
                                                                                                            • так это проблема ODBC драйвера поди?
                                                                                                              Ответить
                                                                                                        • SNMP traps?
                                                                                                          Ответить
                                                                                                          • SNMP трапы это вроде когда железо шлет на сервер мониторинга какие-то данные без гарантии доставки, которые можно проебать?

                                                                                                            Типа netflow сиськиново?
                                                                                                            Ответить
                                                                                                            • Там есть расширения с гарантией доставки, емнип. Суть в том, что они как раз в ASN.1, специально для борманда.
                                                                                                              Ответить
                                                                                                              • SNMP весь описывается ASN вроде
                                                                                                                MIB или как там их схемы называются
                                                                                                                Ответить
                                                                                                                • Ну да, OID'ы в отрыве от ASN.1 редко кто юзает...
                                                                                                                  Ответить
                                                                                                                  • А база WMI у винды тоже в нем вроде
                                                                                                                    Ответить
                                                                                                                    • WMI -- это же расширение какого-то открытого стандарта вроде?

                                                                                                                      З.Ы. WBEM, угу.
                                                                                                                      Ответить
                                                                                                                      • Да, WBEM вроде. Описывется с CIM.

                                                                                                                        У MS как всегда 100500 мутных как сперма абривеатур которые хуй знает что я значат.

                                                                                                                        https://devblogs.microsoft.com/scripting/should-i-use-cim-or-wmi-with-windows-powershell/
                                                                                                                        Ответить
                                                                                                        • Пишу структурные логи в «JSON», AMA.
                                                                                                          Ответить
                                                                    • В теории:
                                                                      > спаны с нужной меткой, чтобы потом по ней фильтровать, а не грепать текст и случайно получать лишнее / промахиваться с кейсом

                                                                      На практике:
                                                                      > куча opensource сервисов, подобранных на помойке, каждый логирует в своём формате и над этим стоит sales из splunk inc., поджигающий себе бороду от банкноты
                                                                      Ответить
                                                                      • Или просто говно и палочки которые срут все в mysql, откуда программист потом руками чото достает по запросу.

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

                                                                        Я триггернулся на фразу "логи не нужны".
                                                                        dmesg нужен всё таки, как и какой-нить лог постфикса на отлдельно стоящем сервере
                                                                        Ответить
                                                                      • > splunk

                                                                        кто-то еще и не в курсе что такое трейсинг и зачем-то поминает то самое логирование, про которое не идет речь
                                                                        Ответить
                                                                        • Судя по спанам, ты намекаешь на OpenCensus или подобную питушню. Мой пост иронизировал именно над тем, что достаточно одного сервиса, не поддерживающего эту технологию, чтобы иддилия оказалась разрушена.
                                                                          Ответить
                                                                          • Не говоря о том, что на event sourcing рахитектуру и fan-in / fan-out эти спаны ложатся примерно никак.
                                                                            Ответить
                                                          • > вот логи мне надо писать каждый день

                                                            coutом?

                                                            А я люблю обмазываться не свежими логами и дрочить. Каждый день я хожу по коду с std::cout << и пишу через него него все говно которое вижу. На два полных лога целый день уходит. Зато, когда после тяжёлого дня я прихожу домой, иду в файлопомойку, включаю копирование…ммм и сваливаю в нее свое сокровище. И дрочу, представляя, что меня поглотил единый организм логов.
                                                            Ответить
                                                            • > cout'ом

                                                              Ты же сам выше пример показал без cout'а...

                                                              Ну и да, пока сишник думает над выбором "%d" или "%llu" для логирования координат точки, крестоблядь пишет << coord и течёт.
                                                              Ответить
                                                              • 99% использований сдвигов срущих в ostream которые я видел, это был именно уебанский cout перемешанный в фарш с кусками строк и пельменными.
                                                                Ответить
                                                                • Стрелки композябельные, к слову.

                                                                  Т.е. если я умею выводить std::vector_t, и struct point, то я могу вывести std::vector<std::vector<point>> одной стрелочкой.

                                                                  Что для логов просто охуенно.

                                                                  Перепиши на printf, лол.
                                                                  Ответить
                                                                  • Поясни мысль, и как это будет работать?
                                                                    Я должен сделать шоблон для вывода вектора ?
                                                                    Ответить
                                                                  • >если я умею выводить std::vector_t, и struct point
                                                                    Хуй-ня.

                                                                    В одном случае мне нужно вывести std::vector_t как json array.
                                                                    [ 
                                                                       {x:1, y:2, z:3}
                                                                      ,{x:34, y:13, z:0}
                                                                       ...
                                                                    ]


                                                                    В другом так x=1, y=2, z=3 \n

                                                                    В третьем так
                                                                    <array>
                                                                    <point x="3" y="4" z="5"/>
                                                                    <point ... />
                                                                    </array>


                                                                    Как поможет умение выводить std::vector_t? Всё-равно придётся руками всё описать. Кокозябельность только всё запутает.
                                                                    Ответить
                                                                    • Ну напишешь разные реализации стрелочек для этих случаев.

                                                                      Хотя json стрелочками высирать -- то ещё извращение. Но в общем-то работать будет.
                                                                      Ответить
                                                                      • >Ну напишешь разные реализации стрелочек для этих случаев.


                                                                        Главное помнить несложные правила как конкретная реализация будет искаться
                                                                        Ответить
                                                                        • > несложные правила

                                                                          Эээ... ну у тебя же стрим кастомный для них. Что там искать?
                                                                          Ответить
                                                                          • а, типа json_stream наследник ostream и xml_stream носледник ostream?
                                                                            Ответить
                                                                            • Нахуя их наследовать?
                                                                              Ответить
                                                                              • хороший вопрос.

                                                                                Строку в них все равно не записать же? Только объекты?
                                                                                Тогда вероятно и правда не надо
                                                                                Ответить
                                                                              • Короче, как правильно:

                                                                                Есть "стрим" в который срешь объект Petuh, а он превращает его в json, и отдает в какой-то ostream

                                                                                Есть "стрим" в который срешь объект Petuh, а он превращает его в XML, и отдает в какой-то ostream

                                                                                Создаешь такой стрим, подсовываешь ему cout или ofstream пишешь туда петуха, и течешь.

                                                                                Верно?

                                                                                Мне нужно знать, иначе по информатике трайбан в четверти будет
                                                                                Ответить
                                                                                • А может не надо натягивать сову на глобус?
                                                                                  Ответить
                                                                                  • Как тогда правильно решить задачу?
                                                                                    Ответить
                                                                                    • Нашаблонить to_json и to_xml со специальными хелперами? Всё равно ведь там ничего общего, особенно если xml атрибуты начнёшь юзать...
                                                                                      Ответить
                                                                                      • тогда как я нашаблоню кот, который выводит куда-то какие-то объекты чтобы не знать во что именно он их выводит?

                                                                                        Я хочу может быть
                                                                                        kuda_to << petuh1 << petuh2

                                                                                        писать и течь
                                                                                        Ответить
                                                                                        • > чтобы не знать

                                                                                          Что за случай такой, когда тебе насрать на тонкости сериализации, но зачем-то хочется и json и xml?
                                                                                          Ответить
                                                                                          • Чтобы отделить логику от сохранения, например?

                                                                                            У меня есть три петуха, я хочу их куда-то сохранить (похуй куда)
                                                                                            Ответить
                                                                                            • Ну напиши serialize который зовёт serialize для трёх петухов...

                                                                                              В общем-то и стрелки сойдут. Но тогда это точно не надо порождать от стрима. И придётся бороться с желанием добавить имена петухов (в стрелке их некуда засунуть, разве что пару городить).
                                                                                              Ответить
                                                                                            • Отличный случай, поддерживаю.
                                                                                              Ответить
                                                                      • > Хотя json стрелочками высирать -- то ещё извращение.

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

                                                                        И что в итоге вышло? Всё что было заявлено — со всем обосрались.

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

                                                                        Кукарекали, про шаблонизацию, а в итоге высрали нелокализуемый императивный копролит.
                                                                        Ответить
                                                                        • В логи срать.

                                                                          Какая нахуй сериализация? Какие нахуй шаблонизаторы?
                                                                          Ответить
                                                                          • В логи срать тоже хочется по-разному.
                                                                            Выборку Пи показал - LOG(PITUX).
                                                                            А ещё нужна проекция. В лог писать короткое сообщение, а на почту админу - весь стектрейс, или наоборот.
                                                                            Ответить
                                                                            • Тык для этого есть северити и фасилити, которое юниксоиды придумали тридцать пять лет назад *

                                                                              В warn срешь мало, в debug много.

                                                                              Админ настраивает warn в одно место, debug в другое, и течет


                                                                              * его, кстати, придумал гомогей Оллман, если это важно
                                                                              Ответить
                                                                    • > запутает

                                                                      Ну как, по крайней мере в одинаковых кейсах (вектор поинтов в жсон и мапу интов в поинты в жсон), тебе не придется писать 30 раз одно и то же.
                                                                      Ответить
                                                                      • > вектор поинтов в жсон и мапу интов в поинты в жсон

                                                                        В Сишке никаких викторов и мап нету.
                                                                        Потому не нужно вешать сишные ограничения на printf.

                                                                        В той же жабе я могу System.out.printf вывести любые сложные мапы. Но опять же, когда я захочу кастомную сериализацию в какой-то формат эта вся концепция развалится.
                                                                        Ответить
                                                                        • > в сишке никаких векторов и мап нету

                                                                          Да-да, прям как секса в СССР... И выводить их в лог никогда никому не приходится.
                                                                          Ответить
                                                                  • > Т.е. если я умею выводить std::vector_t, и struct point, то я могу вывести std::vector<std::vector<point>> одной стрелочкой.

                                                                    > Перепиши на printf, лол.

                                                                    https://wandbox.org/permlink/S56Ep2Q9zWpeNrnH вот пример переписывания

                                                                    (какое же ебаное говно эти ваши кресты)
                                                                    Ответить
                                                                    • > > Перепиши на printf, лол.

                                                                      > https://wandbox.org/permlink/S56Ep2Q9zWpeNrnH вот пример переписывания

                                                                      Не. Это хуйня полная. И блевотная к тому же.

                                                                      Можно на Сишке с препроцессором наебошить методы print##type ( FILE *stream ) {
                                                                      Соответственно из кода контейнера препроцессором подставлять нужный тип и выбирать подходящий print.
                                                                      Ответить
                                                                      • > Можно на Сишке с препроцессором наебошить методы print##type ( FILE *stream ) {

                                                                        Ну допустим если написать какую-то ебанину

                                                                        #define PRINT_GEN(type, str) \
                                                                        int fprintshit_##type(FILE *stream, type var) \ 
                                                                        { \
                                                                          return fprintf(stream, str, var); \
                                                                        }
                                                                        
                                                                        // и попробовать сделать
                                                                        PRINT_GEN(struct point, "{%f %f}")

                                                                        То будет багор т.к. там высрется
                                                                        int fprintshit_struct point(FILE *stream, struct point var) { return fprintf(stream, "{%f %f}", var); }

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

                                                                        Но в целом и то и то - хуйня ебаная. Надо чтоб гомоиконность!
                                                                        Ответить
                                                                        • #include <stdio.h>
                                                                          #include <stdlib.h>
                                                                          
                                                                          typedef struct
                                                                          {
                                                                            float a;
                                                                            float b;
                                                                          } point;
                                                                          
                                                                          #define PRINT_GEN(type, str, ...) \
                                                                          int fprintshit_##type(FILE *stream, type var) \
                                                                          { \
                                                                            return fprintf(stream, str, __VA_ARGS__); \
                                                                          }
                                                                          
                                                                          PRINT_GEN(point, "{%f, %f}", var.a,  var.b)
                                                                          
                                                                          int main(void)
                                                                          {
                                                                            point a = {1.23f, 4.56f};
                                                                            fprintshit_point(stdout, a);
                                                                            return EXIT_SUCCESS; 
                                                                          }

                                                                          Как-то так надо делать, и следить чтоб в типах не было недопустимой хуйни. Т.е. функция, имя которой содержит какое-нибудь std::vector - это некорректно. А сишным препроцессором перехуячивать строки в компилтайме, заменив "::" на какую-то иную хуйню - нельзя
                                                                          Ответить
                                                                          • > Т.е. функция, имя которой содержит какое-нибудь std::vector

                                                                            Питушарский манглинг.

                                                                            >заменив "::"
                                                                            Питушарские крестонеймспейсы

                                                                            Ещё Царь объяснял что питух-вектор пацану как пятое колесо.

                                                                            Есть рассово верные пацанские массивы. Чего же боле?


                                                                            Я имел ввиду несколько другой паттерн.
                                                                            Мы пишем
                                                                            > int fprintshit_point(FILE *stream, type var) {
                                                                            > int fprintshit_line(FILE *stream, type var) {
                                                                            > int fprintshit_triangle(FILE *stream, type var) {


                                                                            А женерик реализации в fprintshit_array просто узнаём тип объектов в контейнере и вызываем
                                                                            for (int i=0;i<n;++i){
                                                                                fprintshit_##type()
                                                                            }

                                                                            Таким образом получаем обобщённую печать массивов точек, массивов массивов точек, итд.
                                                                            Ответить
                                                                          • Так это ж си... откуда там некорректные символы в типах?
                                                                            Ответить
                                                                            • > Так это ж си... откуда там некорректные символы в типах?

                                                                              Например для случая "struct point" некорректным символом будет " " т.к. имя функции не должно содержать пробелов
                                                                              или тип может быть каким-нибудь "char *" и тогда тут кроме " " будет еще "*" некорректным. Или это может быть указатель на массив фиксированного размера, и тогда будут некорректные "[" и "]"
                                                                              Ответить
                                                              • Да, но нет.

                                                                В сишке есть магия реинтерпретации. Крузенштерн - %человек и %пароход.
                                                                А в крестах - что-то одно, либо обмазываться кастами.

                                                                Помню, не так давно какую-то питушню писал, там не то unsigned char, не то даже uint8_t распечатывался как символ, и приходилось кастить.
                                                                Ответить
                                                • Ага, а потом окажется, что в каком-то языке поменяли %d и %s местами, потому что так по правилам, а в другом нужно ещё менять форму слова в зависимости от рода z.

                                                  Для локализации нужна нормальная библиотека, а не изкоробочное говно.
                                                  Ответить
                                                  • >Для локализации нужна нормальная библиотека, а не изкоробочное говно.

                                                    Локализация это вообще пиздец сложно.

                                                    Локализуйте мне строку на русский

                                                    "Completed in %d seconds by %d monkeys", 8, 42,
                                                    Ответить
                                                    • Вроде можно поднатужиться и даже высрать нечто, где явной несогласованности не будет:
                                                      "Завершено за %d сек. обезьянами в количестве %d"


                                                      Кстати, для (1, 1) мой вариант будет даже лучше английского.
                                                      Ответить
                                                      • Какой канцелярит )))
                                                        Ответить
                                                        • Хотя, можно и без канцелярита.
                                                          "Завершено за %d секунд %d обезьянами"


                                                          Будет то же, что и на английском, т.к. в творительном падеже нет разницы между 2..4 и 5.. обезьянами. Будут те же 2 варианта и тот же фейл для количества 1.

                                                          P.S. А в винительном падеже разница есть, так что деградация :(
                                                          Ответить
                                                      • А потом удивляются, что никто не хочет русской локализации.

                                                        Усложним задачу.
                                                        team = {"monkeys", "lions"}
                                                        winner = teams[n]
                                                        "%s win", winner
                                                        "Completed in %d seconds by %d %s", 8, 42, winner
                                                        Ответить
                                                        • Питушня какая-то. Такую строку я бы и на английском не читал.
                                                          Ответить
                                                          • Что не так?

                                                            Есть команда Monkeys
                                                            "Monkeys" win
                                                            Completed in 10 sec by Monkeys
                                                            Ответить
                                                            • Почему-то прочитал как
                                                              winner = "%s win", winner
                                                              ...by %d %s", 8, 42, winner # ...by 42 monkeys win


                                                              Надо было делать пример с существительным/глаголом bear.
                                                              Ответить
                                                    • "{monkeys} {i18n|обезьяна|count_form|monkeys} {i18n|выполнила|to_plural_cond|monkeys} операцию за {seconds} {i18n|секунда|count_form|seconds}"_i18n_ str

                                                      Как-то так. Языки с изменяемыми формами слов — ад для локализации
                                                      Ответить
                                                      • Говнище, да.

                                                        Такие языки называются синтетическими.
                                                        Им противопоставляются аналитические языки с артиклями и служебными словами
                                                        Ответить
                                                  • Поддерживаю.
                                                    Ответить
                                                • Именно поэтому я за Erlang:
                                                  ?log(debug, #{fiat => shit, bitcoin => good, answer => 42})

                                                  И этот терм потом форматируется как угодно.
                                                  Ответить
                                          • принтф идеален.
                                            Ответить
                              • Перегрузка "<<" так себе удобство.

                                Хочу строковую интерполяцию
                                Ответить
                                • Надо сказать, строковая интерполяция плохо умеет в форматирование данных
                                  Ответить
                                  • пипи может
                                    print(f'хуй {val:.5f}')

                                    думаю, и другие некоторые япы могут
                                    Ответить
                        • У меня реальный пример был в https://govnokod.ru/27753
                          А реальный пример борманда там в комментариях: https://govnokod.ru/27753#comment705269

                          С автоформатерами конечно можно использовать "авторское форматирование", но нужно тогда постоянно их включать-выключать всякими говнокомментариями-директивами типа "/* clang-format off */" и "/* clang-format on */"
                          Ответить
                          • В принципе можно в процессе построения лексического дерева вычислять метрику распидорашенности и если она превышает 60 миллитарасов, то не трогать.
                            Ответить
                            • > вычислять метрику распидорашенности и если она превышает 60 миллитарасов, то не трогать

                              Удивительные свойства психозы.

                              Вроде написана какая-то синтаксиальная муть с узкоспециальными терминами, но интуитивно всё понятно.

                              И да, задумь хорошая.
                              Ответить
                    • Может, он преподаватель она преподавательница, и вся эта питушня зожимает картинку кода.
                      Автоформаттер как бы делает 256 цветов, имена по словарю как бы отключают дизеринг, использование какого-нибудь ко-ко-ко-пилота или другой нейрушни - зожимают 4K до 320*240, авторство стирается.
                      Ответить
                      • Да, код студентов порой проще читать через дизасм... Там имена вменяемее и код логичнее расположен.
                        Ответить
                        • А, видимо, не преподавательница, а научная руководительница, раз речь не о том, кто автор, а о том, как эта сломавшаяся фигня за авторством давно свалившего с дипломом питуха работала.
                          Ответить
                          • > диплом петуха

                            Какой зашквар )))
                            Ответить
                            • оффтоп

                              читал про https://docs.microsoft.com/en-us/windows-hardware/design/device-experiences/oem-vbs ?
                              Ответить
                              • Я за безопасность на уровне отдельного ноута для сомнительных программ.
                                Ответить
                              • Ничего нового. Почитай про Qubes OS
                                Ответить
                            • Не петуха, а питуха.

                              Кстати, это в каком вузе выдают?
                              Ответить
                              • Да и вообще не с дипломом питуха, а питуха с дипломом.

                                Это не сваливший получил диплом питуха, а питух по получении диплома стал свалившим.
                                Ответить
                  • Поэтому я за "Befunge". Там у меня нет никаких автоформаттеров.
                    Ответить
    • Дейли митинг: https://pbs.twimg.com/media/FFCmZn7XoAkm-sH?format=jpg&name=medium
      Ответить
      • Почему ты не можешь сказать "заебали со своими митингами, я ходить на них не буду"?
        Ответить
        • ну я не могу ссориться с коллегами
          Ответить
          • Почему ссориться? Конструктивно критикуй.
            Ответить
            • я накритиковал уже, мне стали какой-то кринж втирать о ценности эмоушынал коннекшнс в период пандемии, и о том, как всем им крайне полезно по два раза на дню слушать что делают остальные тридцать человек

              У меня софт-склииы не очень, я не умею убеждать тех, кто изначально со мной не согласен

              Я могу конечно не ходить, но это будет как-то малость странно чтоли
              Ответить
              • > о ценности эмоушынал коннекшнс
                Это у вас эмоушынал коннекшнс - когда приходит программист и говорит "я вчера программировал", тестировщик - "я вчера тестировал" и алкоголик Георгий - "я Георгий и я алкоголик"?
                Тогда надо сказать "какого ляда нам слушать питушню про работу (причём очевидную), которая никак не поможет увеличить профит конторы и не устроит эмоушынал коннекшнс, а наоборот забоурит всех; может лучше изливать соулы и общаться о хобби/погоде/прочей оккейжионал питушне?"
                Ответить
              • > я могу конечно не ходить

                А что, так можно было?!
                Ответить
              • А шо там по поводу мессенджеров? Вот лично я в 2020-2021 за счёт звонков, писем, баг-трекеров и зумушни гораздо больше общался с людьми, чем в 2019-2020.
                В период пандемии было гораздо меньше общения, и никаких проблем не было.

                Кстати, зачем они впердоливают эмоушынал коннекшнс в программистов-интровертов? У них же доход конторы будет заметно падать, если в период пандемии люди будут писать код с разработанным мозгом вместо довольных сотрудников, которым никто не срёт в мозг?
                Ответить
      • тестируют новые образцы на фабрике имени Крупской?
        Ответить

    Добавить комментарий