Строго типизированный лог
А вот интересно, возможна ли такая концепция: писать не текстовый лог, а строго типизированный, чтобы в будущем можно было грузить сохраненные в него объекты и выполнять над ними какие-нибудь запросы?
Сейчас анализ логов сводится к grep, awk и прочей тексто-ориентированной линуксятине. Существует мнение, что это (текстово-ориентированный обмен данными между линуксовыми утилитами через |) хорошо, но у меня это усиленно ассоциируется с электронным прибором, у которого все платы соединены одинаковыми никак не различимыми разъемами, а плата сама решает, "что делать с входным сигналом", т.е. нет никакой защиты от обобщенного индуса-дяди-Васи-телемастера-из-соседнего-гаража.
Плохо то, что большинство интересующих объектов обычно содержат кучу пропертей-ссылок на всякие дебри, которые вне рабочего контекста смысла не имеют, а чтобы их исключить, нужно какой-то флаг на проперть типа атрибута/аннотации "NotLoggable". А это плохо тем, что логгинг не должен требовать лишнего от объектов, с которыми он работает.
Сейчас вывод в лог выглядит следующим образом:
А желательно было бы так:
А DebugAll был бы хитрым метапрограммным макросом, который бы доставал, в зависимости от флагов, имя метода, this, все локальные переменные и параметрами с именами и значениями, сериализовал бы это дело во что-то машинно-читабельное и писал бы в лог.
Сейчас анализ логов сводится к grep, awk и прочей тексто-ориентированной линуксятине. Существует мнение, что это (текстово-ориентированный обмен данными между линуксовыми утилитами через |) хорошо, но у меня это усиленно ассоциируется с электронным прибором, у которого все платы соединены одинаковыми никак не различимыми разъемами, а плата сама решает, "что делать с входным сигналом", т.е. нет никакой защиты от обобщенного индуса-дяди-Васи-телемастера-из-соседнего-гаража.
Плохо то, что большинство интересующих объектов обычно содержат кучу пропертей-ссылок на всякие дебри, которые вне рабочего контекста смысла не имеют, а чтобы их исключить, нужно какой-то флаг на проперть типа атрибута/аннотации "NotLoggable". А это плохо тем, что логгинг не должен требовать лишнего от объектов, с которыми он работает.
Сейчас вывод в лог выглядит следующим образом:
mLog.DebugFormat("OnAuthenticateRequest: {0} {1} {2}", httpApplication.Request.RawUrl, httpApplication.Request.UserAgent, httpApplication.Request.UserHostAddress);
А желательно было бы так:
mLog.Debug("some_user_comment",LogFlags.LocalVars | LogFlags.MethodName | LogFlags.This | LogFlags.Parameters);
А DebugAll был бы хитрым метапрограммным макросом, который бы доставал, в зависимости от флагов, имя метода, this, все локальные переменные и параметрами с именами и значениями, сериализовал бы это дело во что-то машинно-читабельное и писал бы в лог.
no subject
Да. Вы стали расуждать категориями "более|менее читаем".
> Согласен. Многовато скобочного шума. А, скажем, if func x then 0 else getLastResult - уже сильно лучше.
Два return-а забыли ;) Я к чему это говорил - в языках есть конструкции слабо воспринимаемые зрительно. Если еще все это разбавить частым использованием "x = (заодно еще чего-нибуль посчитаем), (куда-нибудь присвоим), (а вот только тут значение для x)", то и язык C++ придется признать нечитаемым. В этом свете мне непонятны претензии к XML.
> Угу, только это на порядок более громоздкая и неудобная штука, чем банальный регэксп.
Что делать, газовая плита - более громозкая и неудобная штука, чем банальная зажигалка...
no subject
В какой момент я сказал, что читаемость XML выше нуля?
Кстати, говорю. Немножко выше. Примерно как у бинарного кода.
> Два return-а забыли ;)
Нет, не забыл. Это именно то, что я и говорю: синтаксический мусор.
> Если еще все это разбавить частым использованием "x = (заодно еще чего-нибуль посчитаем), (куда-нибудь присвоим), (а вот только тут значение для x)"
Да, мутабельность переменных - это полный ужас, согласен. При чём тут это, правда...
> то и язык C++ придется признать нечитаемым
А это почти так и есть.
> Что делать, газовая плита - более громозкая и неудобная штука, чем банальная зажигалка...
Поэтому от плиты прикуривают лишь в исключительных ситуациях.
no subject
>А это почти так и есть.
А может, вы не умеете его готовить?
no subject
no subject
no subject
Плюс, конечно, проблемы императивных языков - бесконечные неконтролируемые сайд-эффекты.
Плюс проблемы низкоуровневых языков - арифметика указателей (когда она нафиг не нужна) и пр.
Плюс проблемы ссылок - когда функция изменяет свой параметр, а в синтаксисе вызова это не отражается (вообще звиздец).
no subject
no subject
2) Для того, чтобы предъявить аналог, я должен вообще хоть немного работать в данной области.
3) Может быть, вы мне покажете аналог, скажем, STM на C++?
no subject
3)Ну, fmap, например, пишется. Монады, пожалуй, тоже. STM... Пожалуй, я знаю как его написать, но сам заниматься не буду.
no subject
C++, к сожалению, слишком низкоуровневый.
> STM... Пожалуй, я знаю как его написать, но сам заниматься не буду.
Ну-ну. Только попрошу учесть, что для реализации STM необходимо гарантировать, что между операциями чтения/записи в одной транзакции не должно быть никаких сайд-эффектов вообще. Иначе это не STM, а помойка. А такие гарантии в плюсах, увы, невозможны.
no subject
То-то дептайпы в хаскеле только делают... Вот когда доделают, тогда можно будет так говорить. А пока - у кого-то слишком кривые руки.
>>А такие гарантии в плюсах, увы, невозможны.
unsafePerformIO
no subject
А в C++ они, типа, уже есть? Ну-ну.
> unsafePerformIO
За импорт System.IO.Unsafe бьют по рукам. Вы можете предъявить столь же простой критерий необходимости бить по рукам в плюсах?
no subject
>А в C++ они, типа, уже есть? Ну-ну.
в плюсах есть кривое, но всё же стандартизованное метапрограммирование на шаблонах. В ФП его аналогом будут дептайпы.
>> unsafePerformIO
>За импорт System.IO.Unsafe бьют по рукам.
Гм. Речь шла о гарантиях.
no subject
В ФП есть кривоватое, но, всё же, более прямое метапрограммирование. Дептайпы - несколько из другой оперы.
> Гм. Речь шла о гарантиях.
Именно. ЕДИНСТВЕННОЕ, что нужно сделать для получения ГАРАНТИЙ - запретить импорт System.IO.Unsafe. В плюсах получить гарантии невозможно вообще.
no subject
TH? Удачи...
>>ЕДИНСТВЕННОЕ, что нужно сделать для получения ГАРАНТИЙ - запретить импорт System.IO.Unsafe....
И половины хакаджа. Удачи...
no subject
Пользовал. Кривовато, да. Примерно как плюсовые темплейты.
> И половины хакаджа. Удачи...
Брехня. Нормальные модули если и импортируют Unsafe, то не переэкспортируют его.
no subject
Они могут пользовать его внутри себя. Удачи.
no subject
...для реализации чисто функционального интерфейса. В противном случае мы имеем баг в библиотеке, и от неё действительно нужно отказаться.
no subject
http://en.wikipedia.org/wiki/Human-readable
Что касается избыточности и "мусора", то, следуя Вашей логике, консоль следует признать более выразительной чем GUI. Может и так, но она от этого не становиться более human-friendly.
no subject
А экзешник может понять любой человек, которому понадобилось его прочитать.
Только времени у него это займёт немеряно.
> следуя Вашей логике, консоль следует признать более выразительной чем GUI.
Вывод не понял. Консоль часто более выразительна, но далеко не всегда.
> она от этого не становиться более human-friendly.
А это вообще омерзительное понятие. Компьютерная программа - мой раб. Я не хочу, чтобы раб был ко мне дружелюбен.
no subject
Именно поэтому сравнение совершенно неуместно.
> Вывод не понял. Консоль часто более выразительна, но далеко не всегда.
Я тоже ваших выводов не понимаю. Вы всегда крайне категоричны в оценках и делите все на массу остоя и "моя-прелесть".
> Компьютерная программа - мой раб. Я не хочу, чтобы раб был ко мне дружелюбен.
Ваше право. Только к общедисциплинным вопросам это отношения не имеет.
no subject
Именно поэтому оно в яблочко.
> Я тоже ваших выводов не понимаю.
Задавайте вопросы. И желательно сразу.
> Вы всегда крайне категоричны в оценках
Разумеется. Вы ждали толерантности и политкорректности?
> делите все на массу остоя и "моя-прелесть".
Отнюдь. Просто пока ваши варианты проходят по разряду "отстой".