суббота, 22 февраля 2014 г.

Log parser - инструмент для анализа логов

 Все прекрасно знают, для чего нужно писать логи. Я выделяю следующие причины:
  • для сбора отладочной информации, которая поможет увидеть/понять причины возникшей ошибки/сбоя работы в системе;
  • для мониторинга состояния системы, например, для фиксации этапов выполнения фоновых задач;
  • для сбора статистической информации о работе системы, например, запись факта вызовов методов сервиса со сбором дополнительной информации, такой как время выполнения запроса, код ошибки, идентификатор клиента и т.д.
Если с чтением/анализом первых двух типов логов в большинстве случаев еще можно справиться обычным текстовым редактором, без дополнительных инструментов, то с 3 типом логов не все так просто. Тут необходима группировка данных, интерактивная фильтрация, построение графиков и диаграмм для лучшего восприятия информации. Из-за этой сложности некоторые не пишут такой вид логов, некоторые пишут, но никогда ими не пользуются, некоторые начинают изобретать утилиты-велосипеды по анализу логов (и в некоторых случаях это очень оправдано), а некоторые используют уже готовые инструменты, как я узнал совсем недавно.

воскресенье, 2 февраля 2014 г.

Массовое добавление ссылки на проект в Visual Studio (часть 2, T4)

В любых проектах по мере увеличения объема кодовой базы растет энтропия, которую приходится уменьшать при помощи различных рефакторингов, в числе которых есть разделение сборки на части, т.е. создание нового проекта и перемещение в него типов, отвечающих за решение определенного круга задач. В большом решении (solution) с сотнями проектов такой рефакторинг над общей сборкой может оказаться очень непростой и трудозатратной задачей, если, конечно, ее не автоматизировать.

воскресенье, 19 января 2014 г.

Runtime t4 генерация

Совершенно случайно обнаружил для себя замечательную вещь: оказывается можно настроить генерацию t4 не только в design time, но и в runtime! Это открывает широкие возможности генерации от всевозможных отчетов до C# кода, подгружаемого во время выполнения программы с помощью CSharpCodeProvider (если честно пока не могу придумать адекватного сценария, где такая runtime кодогенерация может понадобиться. Если есть идеи - прошу в комменты :) )
Как это использовать? Описано тут, но если кратко и на русском, то:

суббота, 11 января 2014 г.

Методы расширения для конвертации строк в простые типы с помощью t4 кодогенерации (C#)

В жизни каждого .NET программиста рано или поздно наступает момент, когда ему приходится парсить строку в int, или DateTime, или какой-нибудь decimal. Ничего сложного, скажете вы, int.Parse(source) - и дело в шляпе. А если в source пусто, или вообще не число лежит, то как в результате получить null (конечно тогда ожидаемым типом будет int? )?
Опять пустяки, скажете вы! Только надо заключить логику конвертирования в метод расширения:

Code:
public static int? TryConvertToInt(this string source)
{
     int result;
     if(int.TryParse(source, out result))
          return result;
     return null;
}
На стороне клиента вызов метода конвертации будет смотреться очень логично и прозрачно:
int a = "12345".TryConvertToInt();
Теперь было бы полезно иметь метод, выкидывающий свой эксепшен при неудаче конвертации, а так же метод, проверяющий возможность конвертации:
public static class ConverterExtensions
{
 public static bool TryConvertToInt(
 this string input,
 out int value)
 {
  return int.TryParse(input, NumberStyles.Number, CultureInfo.InvariantCulture, out value);
 }
 public static int ConvertToIntOrThrow(this string input, string)
 {
  int value;
  if (TryConvertToInt(input, out value))
   return value;
  throw new ContractViolationException("Value '{0}' can not be converted to int.", input);
 }
 public static bool IsInt(this string input)
 {
  int value;
  return TryConvertToInt(input, out value);
 }
 public static bool IsNotInt(this string input)
 {
  return !IsInt(input);
 }
}
Обобщенный метод конвертации
Прикинув сколько подобного кода придется писать для конвертации всех простых типов, любой адекватный программист поматерится про себя и будет думать, как бы все это обобщить.