Tag Archives: .net

TechEd Brasil 2009

TechEd Brasil 2009

Tive a oportunidade de participar do Microsoft TechEd Brasil 2009, que ocorreu em São Paulo durante os dias 25, 26 e 27 de agosto. O que posso falar do evento? De maneira geral, foi excelente, super organizado e com conteúdo de primeira. Como nem tudo são rosas, o Lunch Box me deixou na mão, não havia ficado muito claro, pelo menos para mim, que eram lanches estilo McDonald’s, eu estava esperando um almoço normal em um restaurante normal, da próxima vez vou ler o FAQ antes.

General Session

O evento começou com uma apresentação geral com o histórico da Microsoft até hoje, o auditório da UNIP lotou, e foram necessárias mais quatro outras salas que estavam assistindo por streaming. Após essa volta no tempo, Waldemir Cambucci falou sobre o futuro na visão da Microsoft, resumindo os vários slides, o futuro está no S+S (Software + Serviços). Aqui tem uma enorme explicação sobre o assunto escrito pelo próprio Waldemir.

Nesta sessão houve também a presença do BOPE (Batalhão de Otimização de Plataformas Empresarial). Esse negócio de BOPE já ficou meio manjado, todo mundo faz isso agora, é a nova moda, mas eu confesso que deu para rir bastante.

Vou colocar aqui um resumo das palestras que eu assisti e achei mais interessante.

C# – Dicas, Truques e o futuro da linguagem com a versão 4.0 - Alfred Myers

Alfred começou a palestra mostrando um código curioso, você acha que é possível instanciar uma interface? Pois é, ele provou que é possível, mas é INCORRETO, nunca faça isso. Para os curiosos aqui está o how-to para este hack tosco.

As grandes mudanças serão:

ASP.NET MVC com jQuery: retome o controle da sua aplicação web - Giovanni Bassi

Nem foi tanto sobre ASP.NET MVC e jQuery, o que mais foi comentado foi sobre como montar uma arquitetura seguindo os princípios do SOLID. Ficou bem claro que projetar um software não é simplesmente sair programando, existe uma série de padrões e princípios que vão ajudar a construir um produto de qualidade e que seja durável.

Além do mais, foi dada a ênfase de que o framework MVC da Microsoft não é um substituto do WebForms, ele foi criado para atender aos desenvolvedores que procuravam construir softwares seguindo todos estes padrãos, e o WebForms não é o melhor framework para isso (principalmente quando no quesito testes automatizados). Esse ebook sobre SOLID é bem interessante, tendo exemplos em Ruby e C#.

Desenvolvendo aplicações com as novidades do Windows 7 - Bruno Sonnino

O Windows 7 trouxe algumas novidades para os desenvolvedores Desktop, o principal deles é a taskbar. O foco que a Microsoft deu para essa taskbar é incrível, você faz tudo nela. Segundo o palestrante, a tendência é que a tray (onde fica o relógio, geralmente no canto inferior esquerdo) seja removida do SO. Para desenvolver sobre essa nova plataforma você vai precisar de um API, chamada de Windows API Code Pack For .NET.

Na taskbar é possível criar barras de progresso, jump lists, atalhos, thumbnails e outra coisas mais. O maior problema é que se você tentar rodar isso em Windows XP ou Vista, você terá problemas. A saída é a compilação condicional, o que em minha opinião é bem tosco, vou precisar de unit tests adicionais para cada versão de SO.

Unit Testing – boas práticas e patterns - Cezar Guimarães e Fabio Vazquez

Uma das palestras mais interessantes, eu que já tenho certa prática com Unit Testing consegui aprender muita coisa nova, como por exemplo o FIRST (Fast, Isolated, Repeatable, Self-Validating, Timely), cada letra representa uma característica importante dos testes. No quesito de boas práticas conheci também o AAA, que é uma forma de organizar os testes. Não fazia idéia da importância da nomenclatura dos testes, eu sempre escrevi sem padrão nenhum, vou começar a seguir a recomendação deles (tirada do livro The Art of Unit Testing) onde o método deve ter o padrão:

<nome_do_método_a_ser_testado>_<o_que_você_vai_fazer>_<qual_o_resultado>
Play_WhenIClickPlayButton_ASoundShouldBePlayed
Stop_WhenIClickStopButtonWhileIsPlaying_SoundShouldStopPlaying

Testes de Software com Visual Studio Team System 2010 - Brian Keller

Outro palestrante que veio da Corporação, desta vez falando do VSTS2010. Basicamente o que foi dito é que o foco atualmente está sendo em automatizar os testes de API ou então de caixa branca. Os testes manuais também possuem importância, mas até então não havia foco do VSTS2010 nestes testes. Usando o novo Test Lab, os encarregados por executar os testes terão uma ferramente para fazer anotações, automatizar os testes manuais quando possível e outras coisas mais. O interessante é que pode ser rodado dentro de uma máquina virtual, então não teremos mais a famosa desculpa “Na minha máquina funciona”, o tester pode tirar um snapshot e enviar o time de desenvolvimento.

Conclusão

Fantástico, será que em 2010 tem outro?

Dica #3: Olá SGMLReader; Adeus Regex;

Eu tenho uma lista das próximas dicas que pretendo escrever sobre, essa não estava prevista, mais depois de um certo esforço para fazer isso funcionar, resolvi registrar.

Durante meu aprendizado de python conheci a htmllib, é uma biblioteca para fazer parse de documentos HTML. Antigamente eu usava regex para fazer buscas em documentos HTML, sim regex! Acredito que pior do que regex é usar o IndexOf da classe string. O problema é que regex é algo bem complicado, precisava ter um guia rápido aberto, além do mais os patterns tendem a ficar cada vez maior e mais difícil de entender. Como diria o Ramon Durães, não tem que ser difícil. De fato, não tem, a htmllib resolveu o problema, consegui de forma simples procurar tags e seus atributos usando essa super biblioteca.

De volta ao C#, me deparei com exatamente o mesmo problema. Mas dessa vez fui atrás de algo parecido e achei o SGMLReader. Pelo que andei lendo o propósito dele é converter documentos HTML em XHTML, de qualquer forma consegui novamente resolver o problema. Essa biblioteca gera uma documento XML formatado de forma perfeita, facilitando o uso do XPATH. Apenas um detalhe, ela é mais lenta que a htmlib do python, mas é bem mais flexível, você tem acesso ao XmlDocument contendo todo o código da página.

Vou deixar aqui um exemplo funcional usando essa biblioteca para resgatar todos os títulos dos posts do meu blog.

Clique aqui para fazer o download de 'SGMLReader' (92.96 kB)

Exemplo da saída do programa acima.

SGMLReader

Convite para grupo de discussão sobre arquitetura .net

Há um ano atrás a minha maior fonte para tirar dúvidas sobre arquitetura era o fórum de Arquitetura do GUJ. Apesar de ser em Java você consegue aproveitar 99% das discussões abertas, esse assunto é do tipo que você aprende uma vez e usa em qualquer lugar. Domain Model, IoC, DI, TDD, Design Patterns em geral é algo que pode ser feito qualquer linguagem, sendo ela dinâmica ou estática (não posso falar de funcional pois não sei :)). Inclusive dentro meus livros de arquitetura, a maioria deles é em Java, o Clean Code (fantástico, merece um review mais tarde) e o Code Complete (na fila…).

Para a felicidade de mais de 400 pessoas (número atual de participantes), ano passado foi criado uma lista de discussão de arquitetura focado em .Net, a idéia veio de um dos MVPs da Microsoft, o Giovanni Bassi. Aqui está a lista e aqui está o site.

Apesar do foco em .Net, temos a participação do Rafael Rosa da comunidade Ruby on Rails, o Phillip Calçado aparece de vez em quando nas threads mais quentes, e já houve a presença do Fábio Akita falando de Ruby on Rails (Vídeo).

Aproveitando o assunto, vou deixar mais alguns blogs que eu recomendo.

  1. O do Scott Hanselman, segundo esta lista com o top 200, este é o melhor blog sobre desenvolvimento desoftware;
  2. O CodeBetter, que é uma compilação de assuntos variados escritos por várias pessoas;
  3. O Bliki do Martin Fowler, preciso dizer algo? next!;
  4. Fábio Akita sobre Ruby on Rails e
  5. Phillip Calçado sobre Softwares e Batatas
http://www.hanselman.com/blog/

Dica #2: Formatando datas em formato e língua específica

Neste post do C# Brasil você consegue ver alguns dos formatos de datas possível da classe DateTime. Muitas vezes você precisa de um formato mais específico, como por exemplo, ‘Agosto, 2009′ ou ‘sábado, 29 de janeiro de 2009′.

Na lista abaixo você confere os possíveis valores de se obter usando o método ToString da classe DateTime.

Código Resultado Exemplo
HH Hora (de 0 até 23)
hh Hora (de 0 até 12)
mm Minutos
MM Mês 08, 02, 12
MMM Mês jun, ago, jan, dez
MMMM Mês agosto, setembro, outubro
dd Dia 21,10,20
ddd Dia da semana sáb, seg, ter
dddd Dia da semana sábado, segunda, terça
yy Ano 09,08,89,90
yyyy Ano 2009,2008,1989,2010

Veja alguns exemplos de como usar, e também qual o resultado.

DateTime.Now.ToString("dddd, dd 'de' MMMM 'de' yyyy"); // sábado, 22 de agostro de 2009
DateTime.Now.ToString("MMMM, yyyy"); // agostro, 2009
DateTime.Now.ToString("'dia' dd 'de' MMMM 'de' yyyy"); // dia 22 de agostro de 2009
DateTime.Now.ToString("HH:mm 'do dia' dd"); // 18:17 do dia 22
DateTime.Now.ToString("hh:mm 'do dia' dd"); // 06:17 do dia 22

Eu particularmente gosto de usar esses formatos ao invés de apenas uma letra como foi mostrado no C# Brasil, fica mais explícito e outra pessoa vai conseguir ler com mais clareza.

Por default o resultado sairá na língua atual do sistema operacional que está executando o programa, se você quer executar em uma língua específica, você pode fazer assim:

Thread.CurrentThread.CurrentCulture = new CultureInfo("nl-NL");
Console.WriteLine(DateTime.Now.ToString("dddd, MMMM")); //zaterdag, augustus

Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US");
Console.WriteLine(DateTime.Now.ToString("dddd, dd 'de' MMMM 'de' yyyy")); //Saturday, August

Thread.CurrentThread.CurrentCulture = new CultureInfo("pt-BR");
Console.WriteLine(DateTime.Now.ToString("dddd, dd 'de' MMMM 'de' yyyy")); //sábado, agosto

Esqueci de algo?

NHibernate, por onde começar?

NHibernateA primeira vez que parei para estudar o NHibernate tive sérios problemas, decidi começar meus estudos lendo a documentação. O problema é que o projeto é desenvolvido por pessoas comuns que usam seu tempo livre para evoluir o produto, acaba que a documentação não segue o mesmo rítmo do projeto e a atualização acaba sendo deixada para outra hora. Por outro lado, existe muitos artigos e assunto sobre Hibernate (em Java), na qual pode ser aproveitado, pois seu núcleo foi apenas traduzido para .Net, o geitão de fazer as coisas é o mesmo.

Um site que eu recomendo muito para quem quer estudar o NH é o Summer of NHibernate, são 14 screenscasts sobre o assunto. É em inglês, o que pode desanimar muita gente, mas o inglês é bastante técnico, é muito mais fácil do que acompanhar um filme todo em inglês.

Os screencasts são escritos em C#, e não há interface, todos os testes são feitos usando testes automatizados, caso você não conheça, vai poder aprender dois assuntos super interessantes de uma vez só.

Antes de fazer este post, estava navegando pelo site dele e encontrei uma nova lista de screencast do mesmo autor, entitulada Autumn of Agile. Parece que ainda não foi concluído, mas pelo assunto, vale a pena ficar antenado no site (e no blog dele!).

Depois de assistir tantos screencasts (tens uns de ruby on rails vem legal aqui http://www.screencaster.com.br/), estou pensando em fazer alguns mostrando a construção de um aplicativo usando alguns frameworks disponíveis, e é claro, o NH vai ser um deles :)

Extension methods

Extension Methods

Os extensions method foram introduzidos ao .Net na versão 3.0 e são amplamente utilizados pelo Linq. Criar um método de extensão lhe traz a vantagem de poder adicionar um comportamento a qualquer tipo de objeto sem precisar alterar a definição, recompilar, criar um proxy ou uma nova classe derivada.

Exemplo de criação de um método:

namespace UsingExtMethods.MinhasClasses
{
    public static class ExtensaoString
    {
        public static int ContarEspacos(this string valor)
        {
            int qtd = 0;
            foreach (char c in valor)
                if (c == ' ')
                    qtd++;
            return qtd;
        }
    }
}

No método acima criamos uma rotinha que conta a quantidade de caracteres que há em uma string. O uso desta funcionalidade fica assim:

using System;
using UsingExtMethods.MinhasClasses;

namespace UsingExtMethods
{
    public class Program
    {
        static void Main(string[] args)
        {
            string nome = string.Empty;
            nome = "Guilherme Oenning da Silva Pereira Neto";
            Console.WriteLine(nome.ContarEspacos());
            nome = "GuilhermeOenningdaSilvaPereiraNeto";
            Console.WriteLine(nome.ContarEspacos());
            Console.ReadLine();
        }
    }
}

A Saída do programa acima será:

5
0

Quando se está desenvolvendo com o Visual Studio, é possível perceber a diferença de um método de extensão para um método normal conforme a imagem:

Extension Methods

Algumas regras quanto ao uso de Extension Methods
A classe que você quer adicionar uma funcionalidade deve ser precedida da palavra reservada this. Ex.:

public static int ContarEspacos(this string value);

Neste caso estamos criando um Método de extensão para a classe string.

O primeiro parâmetro definido não é passado na chamada do método, ele serve apenas para identificar qual a classe que recebera este novo método. Um método com a assinatura:

public static int ContarEspacos(this string value, bool considerarEspacoDuplo);

É invocado assim:

string nome = "Guilherme  Oenning";
int qtd = nome.ContarEspacos(true);

O método e a classe precisam ser obrigatóriamente declarados como static.

Para usar os métodos de extensão você precisa adicionar referência ao namespace onde foi criado a classe de extensão. Note no exemplo acima que tive que usar:

using UsingExtMethods.MinhasClasses;

Tentem remover esta linha e verão que a classe string irá perder o método ContarEspacos;
Faça um teste, crie um novo projeto Console Application. No corpo do metodo Main instancie um objeto do tipo List<string>

List<string> valores = new List<string>();

Se você olhar os métodos da variável valores usando o intellisense do Visual Studio, poderá perceber que diversos deles são métodos de extensção (blocos rosas com setas azuis), se você remover a referência ao System.Linq e novamente olhar os métodos da variável valores, claramente notará que todos eles sumiram.

Extension Methods

Por questões de organização, não misture classes que possuem definição de métodos de extensão com outras classes do sistema. Caso seja possível, prefira adicionar o método na classe. Não há motivo para inserir um método desta maneira em uma classe ao invés de abrir o código-fonte e inserí-lo diretamente na definição.

Segue alguns outros links sobre o assunto:

Sharing Buttons by Linksku