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