terça-feira, 20 de julho de 2010

Como utilizar uma biblioteca de log a seu favor

Eu costumava desenvolver minha própria biblioteca de logs até um dia conhecer o log4net. Com ela os logs passaram a ser muito mais descritivos e úteis, além de mais leves. Passei a fazer log de tudo. Veja quais features do log4net que mudaram a minha forma de programar:

  • Xml Configuration. Com apenas uma versão do binário eu posso ter diferentes arquivos de configuração com verbosidades, appenders e formatações diferentes para meu arquivo de log.
  • Rolling File Appender. Agora meus arquivos de log têm tamanho limitado, mas sem perder nenhuma informação. Muito útil para ler arquivos de log em editores comuns do Windows, que não funcionam bem com arquivos gigantes.
  • Xml Formatter. Inclui todas as informações úteis (stack trace em uma exception por exemplo), e ainda permite que eu monitore o arquivo de log através de uma ferramenta pronta com interface web.
  • Debug e Info. Não preciso fazer uma versão específica de depuração, a versão única pode ser configurada com uma verbosidade de acordo com a necessidade. Informações que antes não eram logadas agora são, pois eu sei que isso não diminuirá a performance da minha aplicação de produção.
  • Lossy Logging. Posso incluir informações de Debug e Info apenas quando houver um Erro, ele armazena estas informações em um buffer e só gravará no log quando houver um erro.
  • Custom Appenders. Eu posso jogar o log aonde eu quiser, enviar por e-mail, jabber, sms, enviar pro event viewer, etc.

Confiram este excelente tutorial de log4net em 15 partes: 

Como turbinar seu Visual Studio com Power Commands Add-In

Power Commands é um plugin para qualquer versão do Visual Studio. Ele adiciona dois comandos muito úteis ao menu de contexto (aquele menu que aparece quando você clica com o botão direito):
  • Remove and sorting usings for all files in this project. Muito útil para diminuir o tamanho do cabeçalho de cada arquivo, e mantê-los normalizados sem muito esforço. Ajuda também a identificar quais bibliotecas não estão sendo utilizadas.
  • Open Windows Explorer in this folder.  Este é o comando mais útil, permite manipular arquivos e também serve como atalho para usarmos o Tortoise.
E tem também outros comandos úteis. Você pode baixá-lo em:

sábado, 17 de julho de 2010

O que você precisa saber sobre controle de versão distribuído antes de mudar

Você que usa um controle de versão centralizado, exemplos:
  • CVS
  • SVN Subversion
  • VSS Microsoft Visual Source Safe
  • TFS Microsoft Team Foundation Server
nunca usou um DVCS (Distributed Version Control System), exemplos:
  • GIT, desenvolvido por Linus Torvalds e usado pelo time Linux Kernel
  • Mercurial (Hg), para o qual foram desenvolvidas ótimas ferramentas gráficas e é suportado pelo Google Code Project Hosting
  • Bazaar
  • Darcs
 e pretende conhecer essa tecnologia, precisa saber dos seguintes fatos sobre o DVCS:
  • o repositório é descentralizado, mas isso não impede de ter também um repositório central
  • o repositório é descentralizado, e isso significa que você pode ter acesso a versões específicas da máquina de um dos desenvolvedores, que não serão publicadas para os demais
  • o repositório é sempre local, isso significa que atualizações, reversões e comparações serão sensivelmente mais rápidas, pois não se comunicarão com um repositório remoto
  • embora a primeira vez que você clona um repositório pode ser até 50% mais lento, as operações seguintes são mais rápidas
  • é mais complexo, pois a recepção é dividida em duas etapas: a sincronização com um repositório remoto (pull) e a atualização da versão a ser editada (update)
  • é mais complexo, pois a submissão é dividida em duas etapas: a gravação no repositório local (commit), e a sincronização com um repositório remoto (push)
  • essa complexidade pode ser amenizada com configurações que simulem o comportamento dos antigos controles de versão (automatic update e automatic push)
  • os merges são mais seguros e simples
  • forks, branches e outras ramificações são feitas sem medo, devido à simplificação dos merges
  • criar um repositório local exige um simples comando
  • com o DVCS você vai encontrar mais usos para o controle de versão, com ele você pode controlar a versão de binários em produção, e de outros arquivos menos importantes do dia a dia para os quais não vale a pena o esforço de configurar um repositório dos SCM centralizados
  • DVCS é muito útil quando trabalhando sozinho, e muito mais vantajoso quando em grupo

Como criar aplicações de tempo real

No meu projeto final de Engenharia Eletrônica nós fazemos processamento de tempo real de um sinal de áudio. Inicialmente líamos o sinal da porta de entrada em um loop infinito, e isso fez com que o processamento fosse mais lento que o fluxo do sinal. Com o tempo aprendemos que é necessário:

1. Processar blocos enviados por eventos (interrupções)
2. Configurar a prioridade do processo para tempo real

Existem também outros items que podem se provar úteis

3. Armazenar os dados em um buffer.
4. Configurar a afinidade do processo para apenas um core em uma máquina de múltiplos processadores.

As razões para cada um dos items é explicada a seguir:

1. Interrupções: O processamento deve ser feita em uma thread paralela ao recebimento para que o primeiro não interrompa o segundo. O método de melhor perfomance com este fim é o desenvolvimento orientado a eventos.

2. O Windows escalona os processos de acordo com sua prioridade, se nosso processo de tempo real não estiverem configurados com a prioridade máxima haverão outros processos escalonados antes deles e haverão demoras no processamento. Mas atenção, antes de habilitar este modo tenha certeza de que sua aplicação não possui loops infinitos, ou seja, que ela seja orientada a eventos conforme o passo 1, senão ela tomará conta do processador e não liberará pra nenhuma aplicação de prioridade inferior. Em C# é possível mudar a prioridade do processo atual da seguinte forma
var process = Process.GetCurrentProcess();
process.PriorityClass = ProcessPriorityClass.RealTime;
3. O buffer pode ser uma opção viável quando a necessidade de um fluxo contínuo é superior a necessidade de que este fluxo seja processado o mais cedo possível.

4. A afinidade de processador pode trazer um maior controle sobre a ordenação dos pacotes de saída caso haja um jitter no processamento. Em C# isso é feito assim:
var process = Process.GetCurrentProcess();
process.ProcessorAffinity = (IntPtr)1;
Onde 1 é o primeiro core, 2 seria o segundo core, 3 ambos (sem afinidade), num computador de 2 cores.