Pex for fun

21/07/2010 11:45

Sempre achei a ideia do Pex fantástica. Ele se propõe a criar testes unitários automatizados a partir da análise do comportamento do código, combinando analises dinâmicas e estáticas. Como resultado ele cria um set de testes com alta cobertura de código (code coverage).

Hoje vi uma dica do @mauricionaniche no Twitter para uma demo do Pex (clique na imagem abaixo). É muito divertido além de ser uma forma criativa de explicar como o Pex funciona. Dá pra ficar horas brincando lá.

pexforfun

Dicas



Serviço WCF não roda no IIS 7

19/07/2010 10:43

Essa é uma dica simples pra quem está iniciando no desenvolvimento com WCF. Caso apareça uma mensagem indicando que não é possível processar arquivos com a extensão “*.svc” vá na opção de Recursos do Windows (Painel de Controle \ Todos os Itens do Painel de Controle \ Programas e Recursos \ Ativar ou desativar recursos do Windows) e marque as opções destacadas abaixo.

IIS7 e WCF

Se isso não funcionar, peça ajuda a esse moço aqui.

Dicas



Controles úteis pra quem desenvolve websites

13/06/2010 23:24

Segue uma seleção de links contendo diversos controles e bibliotecas úteis para utilização em seu desenvolvimento web.

ASP.NET, Dicas , , , ,



Artigos de Parallel Programing no .NET Framework 4.0 para download

12/05/2010 10:58

Pesquisando alguns assuntos relacionados, acabei topando com esse link para download de artigos sobre parallel programming, são eles:

  • Optimizing Using Concurrency Visualizer
  • Parallel Programs in .NET 4.o - Coding Guidelines
  • Parent Child TPL Tasks Relationship
  • Performance Characteristics of Sync Primitives
  • Performance Characteristics of Thread Safe Collection
  • PLINQ Ordering Model
  • TPL Options Tour
  • Using .NET 4.0 to achieve data parallelism
  • Using Cancellation in .NET 4.o
  • Using PLINQ in Office Addins
  • When to Use ParallelForEach or PLINQ
  • Workflow and Parallel Extensions in .NET 4.0


Se você leu os artigos, divida suas impressões postando um comentário aqui.

Dicas , ,



Dica de framework de IA e Computer Vision

23/04/2010 21:58

Comentei outro dia no Twitter que estava “brincando” com um framework de captura de movimentos para vídeo e algumas pessoas sugeriram que eu postasse algo a respeito. Dentre os que estudei, encontrei um bastante simples de utilizar chamado AForge.NET. Mais do que um framework para trabalharmos com captura de movimentos o AForge.NET traz inúmeras bibliotecas que auxiliam no desenvolvimento de aplicações que utilizam Artificial Intelligence e Computer Vision (a tradução livre seria Visão por Computador), sendo:

  • AForge.Imaging - library with image processing routines and filters;
  • AForge.Vision - computer vision library;
  • AForge.Neuro - neural networks computation library;
  • AForge.Genetic - evolution programming library;
  • AForge.Fuzzy - fuzzy computations library;
  • AForge.MachineLearning - machine learning library;
  • AForge.Robotics - library providing support of some robotics kits;
  • AForge.Video - set of libraries for video processing

 

A seguir demonstro um exemplo de utilização da biblioteca AForge.Vision. Utilizei um projeto WinForms do Visual Studio 2010, com os controles demonstrados na figura abaixo (clique na imagem para ampliar).

detectorMovimento

 

O painel cinza é um controle do tipo VideoSourcePlayer, disponível com a instalação do AForge.NET. Para carregar os dispositivos de vídeo presentes na máquina (webcams) basta utilizar o código a seguir:

private void CarregarDispositivos()
{
    dispositivos = new FilterInfoCollection(FilterCategory.VideoInputDevice);

    if (dispositivos.Count > 0)
    {
        foreach (FilterInfo dispositivo in dispositivos)
        {
            cbxDispositivos.Items.Add(dispositivo.Name);
        }
    }
}


Usei a classe FilterInfoCollection que é inicializada com a enumeração FilterCategory.VideoInputDevice que retorna uma collection de dispositivos de vídeo encontrados na máquina.

Para ligar a webcam utilizei o seguinte código:

private void AbrirDispositivoVideo(IVideoSource source)
{
    this.Cursor = Cursors.WaitCursor;            
    FecharDispositivosVideo();
videoSourcePlayer.VideoSource = source; videoSourcePlayer.Start(); videoSource = source; this.Cursor = Cursors.Default; }

 

Reparem que antes de ligar a webcam existe um método chamado FecharDispositivosVideo que finaliza qualquer dispositivo previamente aberto. Esse método é descrito a seguir.

private void FecharDispositivosVideo()
{
    this.Cursor = Cursors.WaitCursor;
    videoSourcePlayer.SignalToStop();

    for (int i = 0; (i < 50) && (videoSourcePlayer.IsRunning); i++)
    {
        Thread.Sleep(100);
    }

    if (videoSourcePlayer.IsRunning)
        videoSourcePlayer.Stop();

    if (detector != null)
        detector.Reset();

    videoSourcePlayer.BorderColor = Color.Black;
    this.Cursor = Cursors.Default;
}

 

Basicamente, o que é necessário fazer é checar se o controle videoSourcePlayer está rodando. Em seguida o controle é parado e o objeto detector (do tipo MotionDetector) é resetado. O objeto detector será responsável por implementar os algoritmos de detecção e processamento da imagem para destaque dos movimentos.

Para o botão “Detectar Movimento” codifiquei o código a seguir:

private void btnDetectarMovimento_Click(object sender, EventArgs e)
{
    IMotionDetector detectionAlgorithm;            
    IMotionProcessing detectionProcessing;

    if (rbtSimples.Checked)
        detectionAlgorithm = new SimpleBackgroundModelingDetector(true, true);
    else
        detectionAlgorithm = new TwoFramesDifferenceDetector();

    if (rbtContorno.Checked)
        detectionProcessing = new MotionBorderHighlighting();
    else                
        detectionProcessing = new MotionAreaHighlighting();
    
    detector.MotionDetectionAlgorthm = detectionAlgorithm;
    detector.MotionProcessingAlgorithm = detectionProcessing;

    // Outros códigos menos relavantes aqui...
}

 

A detecção e o processamento das imagens são realizadas, respectivamente, pelas interfaces IMotionDetector e IMotionProcessing. Passamos qual a implementação que desejamos utilizar e todo o trabalho será realizado pela biblioteca do AForge.NET. Realmente é bastante simples.

O último passo necessário é codificar qual a taxa de diferença entre frames do vídeo iremos utilizar, fazendo através do evento NewFrame do controle videoSourcePlayer o seguinte:

private void videoSourcePlayer_NewFrame(object sender, ref Bitmap image)
{
    lock (this)
    {
        if (detector != null)
        {
            float motionLevel = detector.ProcessFrame(image);

            if (motionLevel > motionAlarmLevel)
                flash = (int)(2 * (1000 / 200));
        }
    }
}

 

Você pode fazer o download do código-fonte completo da solução usando o link abaixo:


Abaixo coloquei um vídeo demonstrando a aplicação em ação. Repare que o algoritmo é capaz de detectar as mais sutis variações de luminosidade no ambiente.

Como vimos o AForge.NET implementa toda a base necessária para utilizarmos a tecnologia de detecção de movimentos de maneira rápida e simplificada.

Várias ideias me ocorrem quando vejo frameworks como esse, pois as possibilidades são muitas. Estou trabalhando em algumas um pouco malucas e experimentais, se sair alguma coisa interessante eu postarei aqui.

:)

Dicas, Vídeos



Teclas de atalho do Visual Studio 2010

17/04/2010 08:38

A Microsoft disponibilizou os downloads de documentos contendo as teclas de atalho do Visual Studio 2010 para as linguagens C#, C++, Visual Basic e F#. É bem útil, confiram:

Visual Studio 2010 Keybinding Cards 

KeysVS2010

Visual Studio, Dicas



Computadores antigos

07/09/2009 23:03

imsai8080 Achei um site interessante sobre computadores antigos, lá você pode ver as especificações de computadores como o MITS Altair 8800 ao lado, com seus incríveis 64KB de RAM e um possante processador Intel 8080A de 2.0 MHZ.

http://oldcomputers.net/


No Brasil temos o site que destaco abaixo sobre a história do computador:

http://www.museudocomputador.com.br


Boa leitura!

Dicas



SharePoint 2010, já?!?

29/07/2009 17:17

sharepoint2010Hum… Acho que apressarei meus estudos de  SharePoint 2007…

SharePoint 2010 tá chegando.

Que coisa…

SharePoint, Dicas