Няшная / Говнокод #27835 Ссылка на оригинал

0

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  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 j123123, (Updated )

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

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

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

      надо понять: влезет ли на эту строку.
      Ответить
  • Как тебя в такое древнее говно занесло?
    Ответить
  • // 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;
                        Ответить
                              • малость можно запутаться когда у тебя 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 трапы это вроде когда железо шлет на сервер мониторинга какие-то данные без гарантии доставки, которые можно проебать?

                                                                                                          Типа netflow сиськиново?
                                                                                                          Ответить
                                                                                                          • Там есть расширения с гарантией доставки, емнип. Суть в том, что они как раз в ASN.1, специально для борманда.
                                                                                                            Ответить
                                                                  • В теории:
                                                                    > спаны с нужной меткой, чтобы потом по ней фильтровать, а не грепать текст и случайно получать лишнее / промахиваться с кейсом

                                                                    На практике:
                                                                    > куча 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.
                                                            Ответить
                                                            • g: Buffalo buffalo Buffalo buffalo buffalo buffalo Buffalo buffalo
                                                              Ответить
                                                  • "{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, авторство стирается.
                    Ответить
                    • Да, код студентов порой проще читать через дизасм... Там имена вменяемее и код логичнее расположен.
                      Ответить
                      • А, видимо, не преподавательница, а научная руководительница, раз речь не о том, кто автор, а о том, как эта сломавшаяся фигня за авторством давно свалившего с дипломом питуха работала.
                        Ответить
    • Почему ты не можешь сказать "заебали со своими митингами, я ходить на них не буду"?
      Ответить
      • ну я не могу ссориться с коллегами
        Ответить
          • я накритиковал уже, мне стали какой-то кринж втирать о ценности эмоушынал коннекшнс в период пандемии, и о том, как всем им крайне полезно по два раза на дню слушать что делают остальные тридцать человек

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

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

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

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

Из-за тебя ушел bormand, guest!

    А не использовать ли нам bbcode?


    8