- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 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; \
} \
}
Что еще за "+ 18 + 9 + 9"? Зачем? Зачем? То, что "> 80" это понятно что с ограничением говнотерминалов связано
надо понять: влезет ли на эту строку.
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.
Не такое уж и древнее. Но говно, да.
Хотя копирайт там в конкретно том файле
> Copyright (c) 1989-2000 Microsoft Corporation
конечно древний
хм
>Windows Driver Kit
В какой момент кстати DDK переименовали в WDK? когда WDM начал уходить в закат?
так взяли поди из старого кода
код вообще малоприятный
> CHAR _Str[20];
https://github.com/microsoft/Windows-driver-samples/blob/d3ec258921cfcef7b053b5a2c866330d43dd3f03/filesys/fastfat/workque.c#L362
Какое форматирование )))
зачем вообще это вручную срать макросом? Неужели компилятор это не может сам заинлайнить?
У меня один ответ: этот код писался под компилятор 1998-го года выпуска
Вижуал студия из 2000 года? )))
VS 6.0 точно ничо не умела (разве что с помидором)
Вот мы ленивые со своими форматерами стали
Любишь, когда у тебя в одной строчке есть равняеца с пробелами и без
Если покажешь автоформаттер, который не уродует код, а просто фиксит перечисленные в конфиге косяки -- буду благодарна.
А можешь привести пример уродства?
Форматтер их или высрет в столбик или будет пихать до конца строки.
Или пробелы в выражениях.
Или логичный перенос строки в подвыражениях.
З.Ы. Сама идея "разобрать, забыть и перестроить" кажется мне тупиковой.
а есть прагма или коммент "тут не трогать"?
Ну или вот в таком коде визуальную семантику сможет сохранить твой форматтер?
fprintf(mystream, "user=%o", user); ?
«Как ты дочка не ложись, тебя всё-равно выебут»
> можно запутаться когда у тебя 44 параметра
Будто в примере с std::cout << 44 они станут читабельнее.
Можно привести реальный пример 44 параметров? (Предполагаю что это будет cout какого-то htmlя).
Но кмк в этом случае нужен полноценный шублунизатур и/или named string formatting.
Именно поэтому я за «PHP».
Слёзы наворачиваются на глаза когда студент в лабе пишет
Но и с printfом всё равно было бы не очень няшно, по крайней мере потому, что нельзя именовать параметры.
Чуть лучше в старом питоне
.
Но лучше всего строковая интерполиция.
А вот сама идея стрима и возможность перегрузки оператора для конкретного типа это очень хорошо. Особенно хорошо для середины 80х, когда кресты это придумали.
Как я могу отформатировать объект а джве если я не имею доступа к его toString?
А в крестах же я могу вроде отдельно описать оператор, и это годно.
Это как вообще?
В джаве мне придется реализовывать toString в User.
Я не могу реализовать его "снаружи" класса
Какой анскилл )))
Джава решение такое джава
> std::ostream& operator<<(std::ostream& stream, const User& user)
Эта говнина уже может быть где-то перегружена.
По-моему, в достаточно сложном проекте подобные разношёрстные перегрузки внесут ещё больше путаницы.
Или сделать свой класс строки - UserOutputString, LogString и т.п., которые работают как строки, но с обычными строками не взаимодействуют (вроде newtype Pituz = Pituz String в Haskell).
В новом так же можно. А ещё можно просто писать
Я написал, что она еще лучше
Станут. Во-первых тип автодетектится, во-вторых имя рядом со значением.
Принцип локальности, мать её.
Но нет. Это говно.
Не нужно так форматировать 44 параметра. Просто НЕ НУЖНО держать в коде огромный кусок какой-то питушни (html, sql, css), которая разрезана на "45 частей" << вот << "такой" << хуйнёй.
Это хуже чем PHP. выглядит читабельно.
Я не спорю, но оно легче читается и ревьювится чем printf().
Плюс format-string задаёт декларативно алгоритм сериализации.
То есть это данные. Со всеми вытекающими. Их можно передать куда-то аргументом, или принять аргументом.
А >> на плюсах это код. Железно прибитый и неповоротливый.
- хотели написать безопасный printf?
Главное не перепутать порядок
Не поможет... Он строку формата в рантайме из конфига читает...
Я думаю даже произвольный код можно исполнить благодаря некоторым фишкам printf'а.
Впрочем, у скриптовичков с интерполяцией такая же хуйня
Сишкобоги напишут:
И строки вынесут в конфиг.
А крестух и дальше будет кудахтать с кучи своего говна об удобстве cout.
Нахуя логи локализовывать (а это 90% применений этого стрелочного говна)?
А с твоим принтфом потом лохализации в духе "не удалось найти %s" прямо в морду юзеру.
> cout
/thread
Update: ах вы шлюхи крестовые как хитро придумали.
ну какая разница cout или хуяаут? ostream есть ostream.
Слава богу эта абстракция в любом языке работает
Видел русский виндуос сервер? А постгрю на винде или с локалью ru_RU видел?
Почему так вцепились в логи? Я вообще ничего за логи не говорил.
Вот типичные примеры использования cout:
Шаблонизировать через printf тоже очень хуёво.
Представь себе хередок на 2000 строк, в котором в разных местах запрятаны "%s".
Впрочем, через "%s" будет чуть менее пидорски.
https://govnokod.ru/27835#comment744672
Но в изначальном примере был cout с 2-3 параметрами.
И в этом случае printf оптимален. А cout везде выглядит как крестушачье говно, и на 2х параметрах, и на 22х.
cout — императивная парадигма.
*printf — декларативная парадигма.
Так всё равно придётся весь cout код переформатировать (хотя выглядит куда лучше).
В изначальном примере (https://govnokod.ru/27835#comment744102) ведь сраные имперации.
И этот localize, он из коробки? Или очередной крестовелосипед?
В бусте вроде есть что-то готовое в этом духе.
Большинство программистов или не пишет логи вовсе, или пишет туда ненужную хуйню:
Или слишком низкоуровневую (не удается создать описатель 0x12345)
Или слишком высокоуровневую (не удается выполнить требуемую команду)
Поэтому нужен трейсинг. Нужно собирать не текстовый выхлоп всей системы или отдельных её элементов, а вести журнал процесса выполнения конкретной операции, засовывая туда время выполнения самой операции и вложенных дополнительных операций, сообщения, имеющие отношение к этой конкретной операции, данные, метки и прочую штуку, которая позволит работать на уровне одной операции или на уровне сравнения различных операций одного типа.
Файк работает энтерпрайзом, и потому ему нужно трейсить обработку транзакции в разных местах системы.
Но другие программисты пишут, например, ssh-сервера, и им нужно логировать удачные и неудачные входы, невозможность запуска при ошибках в конфиге и невозможность установки соединения при несогласованности шифров и хешей
я не знаю зачем мне логировать плохие входы, если я могу делать спаны с нужной меткой, чтобы потом по ней фильтровать, а не грепать текст и случайно получать лишнее / промахиваться с кейсом
Чтобы ответить на вопрос пользователя "почему я не могу зайти на сервер".
Чтобы забанить мудака который пароль подбирает.
Чем это будет отличаться от логов?
Приведи пример
Ну как тот же nft сейчас показывает пакеты, проходящие через фаервол.
В смысле с меткой трейса?
Зачем он мне в случае auth.log у ssh сервера на роутере?
У меня там три сообщения в столбик.
>более структурированное
Отлично текстовые логи структурированы через колоночки и табики, иначе бы парсеры не работали
>Ну как тот же nft сейчас показывает пакеты, проходящие через фаервол.
В iptables тоже можно маркать пакеты и потом на основе марка что-то мутить. Даже коннекции можно, иначе бы там ECMP не работал и через NAT бы кое-кто не ходил
Ну, как минимум чтобы понять, где начало и конец у каждого "span'а из трёх строчек"... Даже если строчки от разных тредов не перемешаны, часто в логе не очевидно, где же начало операции.
:)
Если у меня несколько сессий, то конечно лучше их трейсить (хотя и тут у меня есть 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
Тогда уж может json и jq?
Разгадка такая: чтобы трейсить в общем случае нужно иметь спец инструменты. Текстовый формат читабельный не сохранить (или пирдолица как с логами CBS)
> раз глазами не предполагается читать.
Поттеринги, оставьте мои прыщи в покое.
Если выбирать между "тупой текстовый лог" и "мощный трейс, не читаемый без спец тулы с языком запросов" то я за лог для простых, отдельностоящих сервисов.
Короче, сказать "логи не нужны, есть трейс" это как сказать "CSV файлы не нужны, ведь есть Oracle" кмк
Но ведь не нужны... Самый отвратительный в плане совместимости формат, наверное.
Вспоминается история с Kerbal Space Program под линукс, когда игруха не стартовала из-за флоата в конфиге и "неправильных" региональных настроек.
C# недалеко ушёл от Delphi.
Но ведь пользователь вводит значения через конфиг и читает логи. Значит они тоже должны быть локализованы!
Совершенно верно.
Именно потому в слаке и любых других современных приложениях всегда или даблэскейп или XSS
Конечно это мессенджер
Он у нас работе используется
Типа netflow сиськиново?
MIB или как там их схемы называются
З.Ы. WBEM, угу.
У MS как всегда 100500 мутных как сперма абривеатур которые хуй знает что я значат.
https://devblogs.microsoft.com/scripting/should-i-use-cim-or-wmi-with-windows-powershell/
> спаны с нужной меткой, чтобы потом по ней фильтровать, а не грепать текст и случайно получать лишнее / промахиваться с кейсом
На практике:
> куча opensource сервисов, подобранных на помойке, каждый логирует в своём формате и над этим стоит sales из splunk inc., поджигающий себе бороду от банкноты
Ну вообще Файк прав в том, что не нужно там руками грепать логи семи сервисов чтобы понять что делал пользователь и как он попал в систему, но это всё относится к комплексным решениям.
Я триггернулся на фразу "логи не нужны".
dmesg нужен всё таки, как и какой-нить лог постфикса на отлдельно стоящем сервере
кто-то еще и не в курсе что такое трейсинг и зачем-то поминает то самое логирование, про которое не идет речь
coutом?
А я люблю обмазываться не свежими логами и дрочить. Каждый день я хожу по коду с std::cout << и пишу через него него все говно которое вижу. На два полных лога целый день уходит. Зато, когда после тяжёлого дня я прихожу домой, иду в файлопомойку, включаю копирование…ммм и сваливаю в нее свое сокровище. И дрочу, представляя, что меня поглотил единый организм логов.
Ты же сам выше пример показал без cout'а...
Ну и да, пока сишник думает над выбором "%d" или "%llu" для логирования координат точки, крестоблядь пишет << coord и течёт.
Т.е. если я умею выводить std::vector_t, и struct point, то я могу вывести std::vector<std::vector<point>> одной стрелочкой.
Что для логов просто охуенно.
Перепиши на printf, лол.
Я должен сделать шоблон для вывода вектора ?
Хуй-ня.
В одном случае мне нужно вывести std::vector_t как json array.
В другом так x=1, y=2, z=3 \n
В третьем так
Как поможет умение выводить std::vector_t? Всё-равно придётся руками всё описать. Кокозябельность только всё запутает.
Хотя json стрелочками высирать -- то ещё извращение. Но в общем-то работать будет.
Главное помнить несложные правила как конкретная реализация будет искаться
Эээ... ну у тебя же стрим кастомный для них. Что там искать?
Строку в них все равно не записать же? Только объекты?
Тогда вероятно и правда не надо
Есть "стрим" в который срешь объект Petuh, а он превращает его в json, и отдает в какой-то ostream
Есть "стрим" в который срешь объект Petuh, а он превращает его в XML, и отдает в какой-то ostream
Создаешь такой стрим, подсовываешь ему cout или ofstream пишешь туда петуха, и течешь.
Верно?
Мне нужно знать, иначе по информатике трайбан в четверти будет
Я хочу может быть
писать и течь
Что за случай такой, когда тебе насрать на тонкости сериализации, но зачем-то хочется и json и xml?
У меня есть три петуха, я хочу их куда-то сохранить (похуй куда)
В общем-то и стрелки сойдут. Но тогда это точно не надо порождать от стрима. И придётся бороться с желанием добавить имена петухов (в стрелке их некуда засунуть, разве что пару городить).
Так а нахуй они тогда нужны, если они и выглядят по-уебански и одни ограничения в использовании.
И что в итоге вышло? Всё что было заявлено — со всем обосрались.
Кукарекали, что-то про сериализацию сложных структур — обосрались и рекомендуют использовать внешний сериализатор.
Кукарекали, про шаблонизацию, а в итоге высрали нелокализуемый императивный копролит.
Какая нахуй сериализация? Какие нахуй шаблонизаторы?
Выборку Пи показал - LOG(PITUX).
А ещё нужна проекция. В лог писать короткое сообщение, а на почту админу - весь стектрейс, или наоборот.
В warn срешь мало, в debug много.
Админ настраивает warn в одно место, debug в другое, и течет
* его, кстати, придумал гомогей Оллман, если это важно
Ну как, по крайней мере в одинаковых кейсах (вектор поинтов в жсон и мапу интов в поинты в жсон), тебе не придется писать 30 раз одно и то же.
В Сишке никаких викторов и мап нету.
Потому не нужно вешать сишные ограничения на printf.
В той же жабе я могу System.out.printf вывести любые сложные мапы. Но опять же, когда я захочу кастомную сериализацию в какой-то формат эта вся концепция развалится.
Да-да, прям как секса в СССР... И выводить их в лог никогда никому не приходится.
> Перепиши на printf, лол.
https://wandbox.org/permlink/S56Ep2Q9zWpeNrnH вот пример переписывания
(какое же ебаное говно эти ваши кресты)
> https://wandbox.org/permlink/S56Ep2Q9zWpeNrnH вот пример переписывания
Не. Это хуйня полная. И блевотная к тому же.
Можно на Сишке с препроцессором наебошить методы print##type ( FILE *stream ) {
Соответственно из кода контейнера препроцессором подставлять нужный тип и выбирать подходящий print.
Ну допустим если написать какую-то ебанину
То будет багор т.к. там высрется
а называть функции подобным образом нельзя. Да и к тому же говнопрепроцессором надо специально где-то набрасывать эту генерацию с типами, чтобы насрать функции в таком-то месте, а шаблонопарашное говно может быть спокойно инстанцировано внутри какой-то там функции, и вот тогда оно нагенерирует функцию с таким-то типом.
Но в целом и то и то - хуйня ебаная. Надо чтоб гомоиконность!
Как-то так надо делать, и следить чтоб в типах не было недопустимой хуйни. Т.е. функция, имя которой содержит какое-нибудь std::vector - это некорректно. А сишным препроцессором перехуячивать строки в компилтайме, заменив "::" на какую-то иную хуйню - нельзя
Питушарский манглинг.
>заменив "::"
Питушарские крестонеймспейсы
Ещё Царь объяснял что питух-вектор пацану как пятое колесо.
Есть рассово верные пацанские массивы. Чего же боле?
Я имел ввиду несколько другой паттерн.
Мы пишем
А женерик реализации в fprintshit_array просто узнаём тип объектов в контейнере и вызываем
Таким образом получаем обобщённую печать массивов точек, массивов массивов точек, итд.
Например для случая "struct point" некорректным символом будет " " т.к. имя функции не должно содержать пробелов
или тип может быть каким-нибудь "char *" и тогда тут кроме " " будет еще "*" некорректным. Или это может быть указатель на массив фиксированного размера, и тогда будут некорректные "[" и "]"
В сишке есть магия реинтерпретации. Крузенштерн - %человек и %пароход.
А в крестах - что-то одно, либо обмазываться кастами.
Помню, не так давно какую-то питушню писал, там не то unsigned char, не то даже uint8_t распечатывался как символ, и приходилось кастить.
Для локализации нужна нормальная библиотека, а не изкоробочное говно.
Локализация это вообще пиздец сложно.
Локализуйте мне строку на русский
Кстати, для (1, 1) мой вариант будет даже лучше английского.
Будет то же, что и на английском, т.к. в творительном падеже нет разницы между 2..4 и 5.. обезьянами. Будут те же 2 варианта и тот же фейл для количества 1.
P.S. А в винительном падеже разница есть, так что деградация :(
Усложним задачу.
Есть команда Monkeys
"Monkeys" win
Completed in 10 sec by Monkeys
Надо было делать пример с существительным/глаголом bear.
Как-то так. Языки с изменяемыми формами слов — ад для локализации
Такие языки называются синтетическими.
Им противопоставляются аналитические языки с артиклями и служебными словами
И этот терм потом форматируется как угодно.
Хочу строковую интерполяцию
думаю, и другие некоторые япы могут
А реальный пример борманда там в комментариях: https://govnokod.ru/27753#comment705269
С автоформатерами конечно можно использовать "авторское форматирование", но нужно тогда постоянно их включать-выключать всякими говнокомментариями-директивами типа "/* clang-format off */" и "/* clang-format on */"
Удивительные свойства психозы.
Вроде написана какая-то синтаксиальная муть с узкоспециальными терминами, но интуитивно всё понятно.
И да, задумь хорошая.
Автоформаттер как бы делает 256 цветов, имена по словарю как бы отключают дизеринг, использование какого-нибудь ко-ко-ко-пилота или другой нейрушни - зожимают 4K до 320*240, авторство стирается.
Какой зашквар )))
читал про https://docs.microsoft.com/en-us/windows-hardware/design/device-experiences/oem-vbs ?
Кстати, это в каком вузе выдают?
Это не сваливший получил диплом питуха, а питух по получении диплома стал свалившим.
У меня софт-склииы не очень, я не умею убеждать тех, кто изначально со мной не согласен
Я могу конечно не ходить, но это будет как-то малость странно чтоли
Это у вас эмоушынал коннекшнс - когда приходит программист и говорит "я вчера программировал", тестировщик - "я вчера тестировал" и алкоголик Георгий - "я Георгий и я алкоголик"?
Тогда надо сказать "какого ляда нам слушать питушню про работу (причём очевидную), которая никак не поможет увеличить профит конторы и не устроит эмоушынал коннекшнс, а наоборот забоурит всех; может лучше изливать соулы и общаться о хобби/погоде/прочей оккейжионал питушне?"
А что, так можно было?!
В период пандемии было гораздо меньше общения, и никаких проблем не было.
Кстати, зачем они впердоливают эмоушынал коннекшнс в программистов-интровертов? У них же доход конторы будет заметно падать, если в период пандемии люди будут писать код с разработанным мозгом вместо довольных сотрудников, которым никто не срёт в мозг?