André Nobre

ASP.NET MVC, Architecture, Debugging, Commerce Server, WinDBG...
Agile Brazil 2010: Eu fui!

Nos dias 24/06 e 25/06 fui, junto com o Carlos dos Santos, a Porto Alegre participar do Agile Brazil 2010, conferência brasileira de métodos ágeis em desenvolvimento de software.

Direto ao assunto: o evento foi bom. Só não foi muito bom pois vários palestrantes não souberam conduzir da melhor forma a apresentação do seu conteúdo, não sei se por falta de experiência ou nervosismo…

Destaco no evento os keynotes de abertura e fechamento, por Martin Fowler e Klaus Wuestefeld, respectivamente. O mais interessante é que a essência do evento teve como foco saber o porque aplicar algumas metodologias, quando aplicá-las e se aplicá-las realmente terá um ótimo efeito. Isto vem de encontro aos termos da moda e sua aplicação incorreta nos projetos.

De qualquer maneira, deixo aqui meu aviso: não percam o próximo evento Agile Brazil. Definitivamente deve fazer parte do calendário de todos aqueles que estão envolvidos com desenvolvimento de software (e outras coisas também, por que não?).

Abraços a todos.

O movimento NoSQL

É fato que o Banco de Dados relacional é um mundo próprio quando utilizado em aplicações orientadas a objetos. Você já deve ter ficado cansado de fazer o velho mapeamento de um banco de dados de alguma maneira para dentro do sistema. Além disso, com os ambientes incertos de projetos de software, a mudança da estrutura das informações pode ocorrer inúmeras vezes. Se você já teve que mudar uma estrutura de banco de dados em produção sabe que não é tão simples quando alterar o design de seu código.

É extremamente comum encontrarmos necessidades que não se encaixam perfeitamente no conjunto relacional tabela-linhas-colunas. Para estes casos o movimento noSQL cai como uma luva.

NoSQL DEFINITION: Next Generation Databases mostly addressing some of the points: being non-relational, distributed, open-source and horizontal scalable. The original intention has been modern web-scale databases. The movement began early 2009 and is growing rapidly. Often more characteristics apply as: schema-free, easy replication support, simple API, eventually consistent / BASE (not ACID), and more. So the misleading term "nosql" (the community now translates it mostly with "not only sql") should be seen as an alias to something like the definition above

Este movimento tem aumentado muito nos ultimos meses, e grandes soluções já estão surgindo no mercado. A Microsoft vem atendendo esta demanda através do Azure. Alias, a utilização de cloud services neste cenário é muito comum.

Leia alguns artigos e conheça as características deste movimento, assim como os produtos disponíveis. Fique atendo para selecionar a melhor opção para sua aplicação.

http://msdn.microsoft.com/en-us/magazine/ee310029.aspx

http://blog.caelum.com.br/2009/10/30/bancos-de-dados-nao-relacionais-e-o-movimento-nosql/

http://www.itweb.com.br/noticias/index.asp?cod=69390

http://nosql-database.org/

Abraços!

Posted: Jun 23 2010, 06:10 PM by anobre | with 1 comment(s)
Filed under: , ,
Caching no .NET Framework 4.0

Olá pessoal, como estão?
Hoje vou apresentar uma mudança interessante sobre caching, em comparação com versões anteriores.

Introdução

A versão 4.0 da plataforma .NET trouxe uma mudança estrutural esperada para os recursos de Cache. Nas versão 3.5 (até SP1), a plataforma fornecia uma implementação do Cache através do namespace System.Web.Caching. Nas versões anteriores o cache estava disponível no namespace System.Web, o que criada uma dependência com as classes do ASP.NET.

Neste novo framework, o namespace System.Runtime.Caching reúne toda a API necessária para criar todas as tarefas comuns ao ASP.NET Caching de versões anteriores.

System.Runtime.Caching e MemoryCache

Tudo que precisamos para trabalhar com cache, em aplicações Web ou não, está reunido no namespace System.Runtime.Caching. A unidade básica de trabalho é a classe abstrata ObjectCache, que fornece a base para criar implementações customizadas de cache.

E como é de se esperar, a classe MemoryCache é a implementação da classe abstrata ObjectCache para armazenamento das informações em memória.

public class MemoryCache : ObjectCache, 
	IEnumerable, IDisposable

A utilização do cache é muito simples, bem parecida com o modelo anterior:

    ObjectCache cache = MemoryCache.Default;
    string fileContents = cache["filecontents"] as string;

    if (fileContents == null)
    {
        CacheItemPolicy policy = new CacheItemPolicy();
        
        List<string> filePaths = new List<string>();
        filePaths.Add("c:\\cache\\example.txt");

        policy.ChangeMonitors.Add(new 
        HostFileChangeMonitor(filePaths));

        // Fetch the file contents.
        fileContents = 
            File.ReadAllText("c:\\cache\\example.txt");
        
        cache.Set("filecontents", fileContents, policy);
    }

    Label1.Text = fileContents;

Extendendo o Cache

É possível customizar todo mecanismo de cache através de várias abordagens. ScottGu escreveu sobre isto, que você pode acessar através deste link.

Conclusão

Algo muito esperado em versões anteriores, finalmente o cache está disponível sem criar relacionamento com assemblies exclusivamente Web. Perfeito para quem desenvolve outros tipos de aplicação, usufruindo deste recurso sem carregar código desnecessário.

Abraços!

Posted: Apr 14 2010, 03:01 PM by anobre | with 2 comment(s)
Filed under: ,
Evento: Lançamento do Visual Studio 2010 e .NET 4

Olá pessoal!

Ontem fizemos mais um evento, desta vez de lançamento do Visual Studio 2010 e .NET 4, com palestras de Entity Framework e Silverlight também.

As fotos estão aqui.

Abraços a todos.

Maringá Techday

Olá pessoal!

Neste último sábado realizamos um evento em Maringá, chamado Maringá TechDay, com palestras sobre .NET 4, Siverlight e Entity Framework.

O Carlos dos Santos (um dos palestrantes) acabou de publicar um post completo sobre o evento, com fotos e tudo mais.

Acesse este link para ver o resultado.

Abraços!

Programação paralela no .NET Framework 4 – Parte II

Olá pessoal, tudo bem?

Este post é uma continuação da série iniciada neste outro post, sobre programação paralela.
Meu objetivo hoje é apresentar o PLINQ, algo que poderá ser utilizado imediatamente nos projetos de vocês.

Parallel LINQ (PLINQ)

PLINQ nada mais é que uma implementação de programação paralela ao nosso famoso LINQ, através de métodos de extensão.

O LINQ foi lançado com a versão 3.0 na plataforma .NET, apresentando uma maneira muito mais fácil e segura de manipular coleções IEnumerable ou IEnumerable<T>. O que veremos hoje é a “alteração” do LINQ to Objects, que é direcionado a coleções de objetos em memória.

A principal diferença entre o LINQ to Objects “normal” e o paralelo é que na segunda opção o processamento é realizado tentando utilizar todos os recursos disponíveis para tal, obtendo uma melhora significante de performance.

CUIDADO: Nem todas as operações ficam mais rápidas utilizando recursos de paralelismo. Não deixe de ler a seção “Performance” abaixo.

ParallelEnumerable

Tudo que a gente precisa para este post está organizado na classe ParallelEnumerable. Esta classe contém os métodos que iremos utilizar neste post, e muito mais:

  • AsParallel
  • AsSequential
  • AsOrdered
  • AsUnordered
  • WithCancellation
  • WithDegreeOfParallelism
  • WithMergeOptions
  • WithExecutionMode
  • ForAll

O exemplo mais básico de como executar um código PLINQ é utilizando o métodos AsParallel, como o exemplo:

var source = Enumerable.Range(1, 10000);

var evenNums = from num in source.AsParallel()
               where Compute(num) > 0
               select num;

Algo tão interessante quanto esta facilidade é que o PLINQ não executa sempre de forma paralela. Dependendo da situação e da análise de alguns itens no cenário de execução, talvez seja mais adequado executar o código de forma sequencial – e nativamente o próprio PLINQ faz esta escolha.  É possível forçar a execução para sempre utilizar o paralelismo, caso seja necessário. Utilize o método WithExecutionMode no seu código PLINQ.

Um teste muito simples onde podemos visualizar a diferença é demonstrado abaixo:

static void Main(string[] args)
        {
            IEnumerable<int> numbers = Enumerable.Range(1, 1000);

            IEnumerable<int> results = from n in numbers.AsParallel()
                                       where IsDivisibleByFive(n)
                                       select n;

            Stopwatch sw = Stopwatch.StartNew();
            IList<int> resultsList = results.ToList();
            Console.WriteLine("{0} itens", resultsList.Count());
            sw.Stop();

            Console.WriteLine("Tempo de execução: {0} ms", sw.ElapsedMilliseconds);

            Console.WriteLine("Fim...");
            Console.ReadKey(true);
        }

        static bool IsDivisibleByFive(int i)
        {
            Thread.SpinWait(2000000);

            return i % 5 == 0;
        }

 

Basta remover o AsParallel da instrução LINQ que você terá uma noção prática da diferença de performance.

image

1. Instrução utilizando AsParallel

image 

2. Instrução sem utilizar paralelismo

Performance

Apesar de todos os benefícios, não podemos utilizar PLINQ sem conhecer todos os seus detalhes. Lembre-se de fazer as perguntas básicas:

  1. Eu tenho trabalho suficiente que justifique utilizar paralelismo?
  2. Mesmo com o overhead do PLINQ, vamos ter algum benefício?

Por este motivo, visite este link e conheça todos os aspectos, antes de utilizar os recursos disponíveis.

Conclusão

Utilizar recursos de paralelismo é ótimo, aumenta a performance, utiliza o investimento realizado em hardware – tudo isso sem custo de produtividade. Porém, não podemos usufruir de qualquer tipo de tecnologia sem conhece-la a fundo antes. Portanto, faça bom uso, mas não esqueça de manter o conhecimento a frente da empolgação.

Abraços.

Posted: Apr 04 2010, 04:22 PM by anobre | with 2 comment(s)
Filed under: ,
Programação paralela no .NET Framework 4 – Parte I

Introdução

O avanço de tecnologia nos últimos anos forneceu, a baixo custo, acesso  a workstations com inúmeros CPUs. Facilmente encontramos hoje máquinas clientes com 2, 4 e até 8 núcleos, sem considerar os “super-servidores” com até 36 processadores :)

Da wikipedia:

A Unidade central de processamento (CPU, de acordo com as iniciais em inglês) ou o processador é a parte de um sistema de computador que executa as instruções de um programa de computador, e é o elemento primordial na execução das funções de um computador. Este termo tem sido usado na indústria de computadores pelo menos desde o início dos anos 1960[1]. A forma, desenho e implementação de CPUs têm mudado dramaticamente desde os primeiros exemplos, mas o seu funcionamento fundamental permanece o mesmo.

Fazendo uma analogia, seria muito interessante delegarmos tarefas no mundo real que podem ser executadas independentemente a pessoas diferentes, atingindo desta forma uma  maior performance / produtividade na sua execução.

A computação paralela se baseia na idéia que um problema maior pode ser dividido em problemas menores, sendo resolvidos de forma paralela. Este pensamento é utilizado há algum tempo por HPC (High-performance computing), e através das facilidades dos últimos anos, assim como a preocupação com consumo de energia, tornaram esta idéia mais atrativa e de fácil acesso a qualquer ambiente.

No .NET Framework

A plataforma .NET apresenta um runtime, bibliotecas e ferramentas para fornecer uma base de acesso fácil e rápido à programação paralela, sem trabalhar diretamente com threads e thread pool.

Esta série de posts irá apresentar todos os recursos disponíveis, iniciando os estudos pela TPL, ou Task Parallel Library.

Task Parallel Library

A TPL é um conjunto de tipos localizados no namespace System.Threading e System.Threading.Tasks, a partir da versão 4 do framework.

A partir da versão 4 do framework, o TPL é a maneira recomendada para escrever código paralelo e multithreaded.

http://msdn.microsoft.com/en-us/library/dd460717(v=VS.100).aspx

Task Parallelism

O termo “task parallelism”, ou em uma tradução live paralelismo de tarefas, se refere a uma ou mais tarefas sendo executadas de forma simultanea.

Considere uma tarefa como um método. A maneira mais fácil de executar tarefas de forma paralela é o código abaixo:

Parallel.Invoke(() => TrabalhoInicial(), () => TrabalhoSeguinte());
O que acontece de verdade?

Por trás nos panos, esta instrução instancia de forma implícita objetos do tipo Task, responsável por representar uma operação assíncrona, não exatamente paralela:

public class Task : IAsyncResult, IDisposable

É possível instanciar Tasks de forma explícita, sendo uma alternativa mais complexa ao Parallel.Invoke.

var task = new Task(() => TrabalhoInicial());
task.Start();

Outra opção de instanciar uma Task e já executar sua tarefa é:

var t = Task<int>.Factory.StartNew(() => TrabalhoInicialComValor());
var t2 = Task<int>.Factory.StartNew(() => TrabalhoSeguinteComValor());

A diferença básica entre as duas abordagens é que a primeira tem início conhecido, mais utilizado quando não queremos que a instanciação e o agendamento da execução ocorra em uma só operação, como na segunda abordagem.

Data Parallelism

Ainda parte da TPL, o Data Parallelism se refere a cenários onde a mesma operação deva ser executada paralelamente em elementos de uma coleção ou array, através de instruções paralelas For e ForEach. A idéia básica é pegar cada elemento da coleção (ou array) e trabalhar com diversas threads concomitantemente.

A classe-chave para este cenário é a System.Threading.Tasks.Parallel

// Sequential version            
foreach (var item in sourceCollection)
{
    Process(item);
}

// Parallel equivalent
Parallel.ForEach(sourceCollection, item => Process(item));

Complicado né? :)

Demonstração

Acesse aqui um vídeo com exemplos (screencast).

Cuidado!

Apesar da imensa vontade de sair codificando, tome cuidado com alguns problemas básicos de paralelismo. Neste link é possível conhecer algumas situações.

Abraços.

Posted: Apr 03 2010, 06:29 PM by anobre | with 3 comment(s)
Filed under: ,
Roadshow Microsoft – Primeira Parada: Londrina, PR

Hoje (23/03) tivemos aqui em Londrina a primeira parada do Roadshow Microsoft, com apresentação de diversos produtos com aplicação em cenários técnicos.

Como já é de costume, o evento reuniu alguns dos melhores profissionais de DEV e INFRA, com informações extremamente úteis sobre .NET Framework 4, Entity Framework, Exchange, Sharepoint, entre outras tecnologias e produtos.

Na minha visão, o evento conseguiu atender a expectativa dos participantes, através dos cenários técnicos criados para a ficticia Adventure Works (acho que eu conheço esta empresa… :). Através da participação ativa de todos, as tracks de DEV e INFRA tiveram o sucesso aparente no comentário do pessoal nos intervalos e almoço.

Depois das palestras, lá por 19h, tivemos um jantar com o pessoal da Microsoft e influenciadores da região, onde, até as 21h, discutimos muita coisa (até Commerce Server!). Esta aproximação com o time de comunidades da Microsoft, além de alguns “penetras” como o próprio Alex disse, é extremamente importante e útil, visto que passamos conhecemos a fundo as intenções e futuras ações da Microsoft visando as comunidades locais.

Para concluir, algo que sempre digo: participe de alguma comunidade técnica da sua região. Entre em contato com influenciadores, conheça os grupos de usuários perto de você e não perca tempo. Ter o conhecimento perto de você, contribuir e crescer profissionalmente não tem preço.

Obrigado novamente a todo time, em especial a Fabio Hara, Rodrigo Dias, Alex Schulz, Alvaro Rezende, Murilo e Renato Haddad.

DSC00515 DSC00520 DSC00528 DSC00531 DSC00541

Abraços.

OBS.: Lembre-se: em Londrina e região, procure o Sharpcode! :)
OBS. 2: Se você é de Londrina e não participou, não perca mais oportunidades. Alias, se o seu chefe não deixa você ir, se você tem que participar de sorteio para ter uma chance de ir, ou se a sua empresa nem fica sabendo de eventos como este, acho que tá na hora de você pensar em outros opções né? :)

Community Launch: Londrina

Hoje (20/03/2010) fizemos o evento Community Launch em Londrina.
O dia começou às 09:00h com abertura online realizada pela Microsoft (Rodrigo Dias, Fabio Hara e Rogério Cordeiro), apresentando a Copa Microsoft de Talentos, informações sobre o Road Show <LINK> e produtos Microsoft que estarão no foco deste ano.

Após a abertura, alguns influenciadores Microsoft da região apresentaram algumas palestras técnicas, mais voltadas a DEV, sobre os assuntos:

  • As Novidades da Plataforma .NET (André Nobre) - Download
  • Entity Framework 4 (Carlos dos Santos)
  • Silverlight 4 (Marcio Althmann)

A minha apresentação foi focada em 3 novidades que podem ser aplicadas no dia-a-dia dos participantes, algo bem pontual, envolvendo web forms, paralelismo e Dynamic Language Runtime.

O destaque (IMHO) fica para o paralelismo, algo totalmente aplicável nas aplicações, que nos dá um resultado incrível. Apesar de já existir anteriormente, o fato de estar embutido na  plataforma incentiva a rápida adoção da tecnologia.

DSC00487DSC00504
DSC00509 DSC00510

Apenas para formalizar, nos próximos dias vamos lançar localmente as reuniões presenciais para discussões técnicas do grupo Sharpcode. Se você tem interesse, e está na região de Londrina, participe!

Abraços!

Marília TechDay 2010

Pessoal,

segue a dica de um evento com conteúdo excelente!
No dia 10 de abril acontecerá, em Marília, o Marília TechDay, um evento organizado pela comunidade local sobre tecnologias Microsoft.

banner

Diversos palestrantes apresentarão informações sobre a nova plataforma .NET, Sharepoint, SQL Server, Azure, etc.

Se você tiver a oportunidade não perca! Acesse o site e veja mais informações: http://www.mariliatechday.com.br/

Abraços!

More Posts « Previous page - Next page »