Papel do Arquiteto de Sistemas

9 fev
Pessoal, 

Ultimamente tenho visto e ouvido várias discussões a respeito do papel de um arquiteto de sistemas.
Esse assunto foi discutido inclusive em um podcast muito bacana do grupo .Net Architects.

Eu mesmo já pensei bastante sobre o assunto e discuti bastante isso com alguns colegas… E hoje eu li um artigo bem legal sobre o assunto no InfoQ, e que vai bem de encontro ao que eu penso sobre o assunto… Acho que vale a pena ler: Are You a Software Architect?.

Depois de ler esse artigo, acabei encontrando mais dois artigos bem legais sobre o assunto, recomendo também: I am an Architect e Role of an Agile Architect.

Forte abraço.

 

Versão comercial do Reflector

3 fev
Pessoal, 

A Red Gate está lançando uma versão comercial do nosso bom e utilíssimo Reflector, que foi criado pelo Lutz Roeder e em 2008 foi assumido pela Red Gate Software.

Essa nova versão foi dividida: Temos agora o Reflector 6, que continua gratuito e dá suporte ao .NET 4 e o Reflector Pro, que é a versão paga e vem como um add-in para o Visual Studio que permite a depuração de um assembly descompilado. Isso mesmo, poderemos depurar facilmente o código de assemblies de terceiros, mesmo se você não tiver o seu código fonte, ouse seja, vamos poder percorrer os assemblies e usar todas as técnicas de depuração que usamos em nosso próprio código.

Para quem não conhece (você desenvolve mesmo em .NET?), o Reflector é uma ferramenta essencial, considerada quase sempre entre as “dez mais” das ferramentas para desenvolvimento, permitindo navegação pelas classes de um assembly, análise estática e descompilação.

O Reflector pode ser utilizado para inspecionar, navegar, pesquisar, analisar e pesquisar o conteúdo de um componente .NET e traduz a informação binária em algo “legível” para um ser humano e para compreendermos o funcionamento interno de bibliotecas de código, para mostrar as diferenças entre as duas versões do mesmo assembly, e como as várias partes de um aplicativo .NET interagem uns com os outros.

Há um grande número de add-ins para o Reflector, que são extremamente úteis. Existem add-ins para análise de métricas de código, criação de gráficos de dependência entre assemblies, matriz de dependência, entre vários outros.

Forte abraço.

 

HtmlHelper para converter um Enum em uma SelectList, com texto localizado

26 jan
Pessoal,

Esses dias fiz um Extension Method para converter um Enum em um SelectList, que usamos para preencher um DropDownList através do método Html.DropDownList.

O que esse método faz, na prática, é criar o SelectList com os valores disponíveis no Enum, definindo o DataValueField do DropDownList como sendo o valor numérico do Enum e o DataTextField do DropDownList o valor "textual" do Enum. Ficou assim, baseado na idéia que eu encontrei nessa discussão:

public static SelectList ToSelectList<TEnum>(this HtmlHelper htmlHelper, Enum selectedValue)
{
      var values = from TEnum e in Enum.GetValues(typeof(TEnum)) select new { ID = e, Name = e.ToString() };
      return new SelectList(values, "Id", "Name", selectedValue);
}

Assim, em um Enum como esse:

public enum ReservationStatus
{
      PreReserved = 1,
      Confirmed = 2,
      Cancelled = 3,
      WaitingDeposit = 4
}

Ao fazermos isso:

<%= Html.DropDownList("Situacao", Html.ToSelectList<ReservationStatus>(ReservationStatus.Confirmed)  %>

Nós teríamos um DropDownList com os valores 1, 2, 3 e 4 com os respectivos textos: "PreReserved", "Confirmed", "Cancelled" e "WaitingDeposit" com o item referente a "Confirmed" selecionado.

Porém, os valores "textuais" do Enum, como sabemos, não podem conter textos acentuados nem espaços. Como estamos no Brasil, seria interessante se o DropDownList contivesse os textos em português.

Algumas pessoas lançam mão de usar o atributo "Description" nos valores do Enum, e obtém os textos desses atributos para exibição. Veja nesse post.

Porém eu precisei (e quis!) ir um pouco além. Tenho vários sistemas "multi-idiomas" e sempre procuro definir os textos, mensagens, enfim, qualquer informação que possa ser "globalizada" em resources. Na verdade, mesmo em aplicações em somente um idioma eu costumo colocar essas informações em resources, ao invés de hard-coded no código.

Assim, optei por criar um outro Extension Method que recebe o tipo do meu arquivo de resource, e ao montar a SelectList o método "busca" o texto desse resource via reflection. Assim:

public static SelectList ToSelectList<TEnum, TResource>(this HtmlHelper htmlHelper, Enum selectedValue)
{
   Type resourceType = typeof(TResource);
   var values = from TEnum e in Enum.GetValues(typeof(TEnum))
                                select new { ID = e, Name = resourceType.GetProperty(e.ToString(), BindingFlags.Public | BindingFlags.Static)
                                .GetGetMethod().Invoke(null, null) };

   return new SelectList(values, "Id", "Name", selectedValue);
}

No Enum citado acima, eu teria que definir itens no resource tendo como chaves os textos do Enum ("PreReserved", "Confirmed", "Cancelled" e "WaitingDeposit"). Por exemplo, se fizermos o seguinte no nosso arquivo de resource chamado "Default.resx":

PreReserved = Pré Reserva
Confirmed = Confirmado
Cancelled = Cancelado
WaitingDeposit = Aguardando Depósito

E fizermos o seguinte:

<%= Html.DropDownList("Situacao", Html.ToSelectList<ReservationStatus, Default>(ReservationStatus.Confirmed)  %>

Nós teríamos um DropDownList com
os valores 1, 2, 3 e 4 com os respectivos textos: "Pré Reserva",
"Confirmado", "Cancelado" e "Aguardando Depósito" com o item referente a
"Confirmed" selecionado.

Forte abraço.

Lançamento do Visual Studio 2010

18 jan
Pessoal,

A nova data de lançamento do Visual Studio 2010 e do .NET Framework 4.0 foi anunciada.
Anteriormente o Visual Studio 2010 e o .NET Framework 4.0 seriam lançados em 22/03/2010, mas agora o lançamento será em 12/04/2010.

No entanto, nada foi dito sobre a Public Release Candidate, que de acordo com o Scott Guthrie será disponibilizada em fevereiro.

Forte abraço.

Ensinando pessoas a pesquisar no Google ;-)

13 jan
Pessoal,

Estava hoje em um fórum de discussões e um camarada postou uma coisa bem legal… Não tinha ouvido falar ainda…
Um colega fez uma pergunta, mas aparentemente ele não fez o básico: Pesquisar no Google antes de perguntar no fórum!

Então o cara respondeu a pergunta com um link para uma página que "ensina" a pesquisar no Google… Você passar por querystring o termo a ser pesquisado e a página exibe uma animação que simula uma pesquisa no Google com este termo e depois te redireciona para a página do Google real passando o termo de pesquisa…

E no final ainda faz uma gracinha: Antes de redirecionar para o google faz a pergunta "Was that so hard?" ("Foi tão difícil assim?").

Por exemplo: http://lmgtfy.com/?q=ASP.NET+MVC+Castle+ActiveRecord vai mostra a animação "digitando" o texto "ASP.NET MVC Castle ActiveRecord" na caixa de texto de pesquisa do Google…

Bom para dizer: "Antes de perguntar, você pesquisou?" com alguma elegância.

Forte abraço.

Rework: O novo livro do pessoal da 37signals

7 jan
Pessoal,

Fiquei sabendo somente hoje que o novo livro do pessoal da 37signals sairá provavelmente no dia 9 de março. O Rework. O anúncio da capa do livro foi feito recentemente.

Para quem não conhece, a 37signals é a empresa criadora do Ruby on Rails e de uma série de pequenas aplicações web-based de grande sucesso, como o Basecamp e o Backpack, além do blog Signal vs. Noise.

Li a algum tempo o livro anterior deles, o Getting Real, que é um fenômeno de popularidade. Nem vou escrever sobre ele, já existem dezenas de posts em blogs falando a respeito.

Enquanto o Getting Real fala principalmente sobre estratégias de desenvolvimento, projeto e design das aplicações que eles desenvolveram, esse novo livro fala sobre negócios. Assuntos como concorrência, divulgação, relacionamento, que também são tratados no Getting Real, aparentemente serão abordados com maior profundidade no Rework.

Gostei muitíssimo do Getting Real, e acho que vai valer a pena ler esse também, que já está em pré-venda na Amazon.

Forte abraço.

Voltando das festas de final de ano

5 jan
Pessoal,

Fiquei meio ausente no mês de dezembro, estava meio enrolado com alguns projetos, monografia do MBA, além, obviamente, das festas de final de ano…

Estou trabalhando em dois projetos com ASP.NET MVC + Castle ActiveRecord. Sim, temporariamente resolvi abrir mão da S#arp Architecture, que andei falando por aqui. Depois vou fazer um post tentando justificar essa mudança de planos.

Criei um Project Template para o VS 2008 bem legal, que cria um projeto ASP.NET MVC com uma arquitetura nem bacaninha e com todas as referências e configurações para o Castle ActiveRecord (que é construído "em cima" do NHibernate), Castle Windsor, xVal + Castle Validators, MVC Contrib, entre outras coisas… Ficou bem simples de usar e bastante prático… Ainda estou fazendo alguns pequenos ajustes, assim que estiver divulgo para apreciação, provavelmente no CodePlex…

Bem, por hoje é isso… Ainda estou voltado aos poucos…
Pretendo nas próximas semanas retomar o ritmo aqui no blog, falando principalmente sobre o Castle ActiveRecord no Model do ASP.NET MVC.

Forte abraço.

Ambiente de Desenvolvimento Virtual com o VirtualBox

28 nov
Pessoal,

Desde o ínicio desse ano, mudei meu ambiente de desenvolvimento para ser virtual.

Estou usando, com muita satisfação, o VirtualBox, da Sun (!), rodando o Windows 7, e toda a minha plataforma de desenvolvimento está instalada nessa máquina virtual. Na minha máquina "real", somente browsers (IE, Firefox e Chrome), Office, o próprio VirtualBox e outras coisas. Nada de Visual Studio, SQL Server, IIS, entre outros serviços que costumam nos "roubar" preciosos recursos de máquina.

Vocês devem estar se perguntando o porque do VirtualBox, certo? Por que não o Virtual PC (da própria Microsoft) ou VMware?

Bem, na verdade eu usava o Virtual PC, mas quando criei uma máquina virtual com o Windows 7 Ultimate RC, rodando em um notebook com 3.2 Gb, a máquina virtual ficou incrivelmente lenta! A ponto de ficar absolutamente impossível de usar. Inicialmente pensei que poderia ser "culpa" do Windows 7, mas todas as informações que eu tinha na época afirmavam que um dos grandes trunfos do Windows 7 era exatamente sua leveza, contrastando com o Vista.

Pesquisei bastante, encontrei algumas referências dizendo que poderia ser o fato de estar rodando em um Notebook (algo a respeito do processador ser projetado para economia de energia, etc, etc).

Até que achei um fórum onde alguém postou uma mensagem dizendo: "Use o VirtualBox"

Fui pesquisar, pois nunca tinha nem ouvido falar. Vi que era da Sun, e baixei para testar, não custava nada.
Converti a minha máquina virtual para o formato do VirtualBox (vdi), e qual não foi minha surpresa quando o Windows 7 "explodiu" na minha tela, rápido como uma flecha. Quase não acreditei! E ainda por cima com suporte a USB, CD-ROM, etc, sem esforço nenhum… Tem uma ferramentas para clonar, alterar, comprimir HD’s virtuais…

Para mim, simplesmente perfeito, virei fã e não largo mais. Ponto final.

Passei a criar máquinas virtuais para diversas atividades. Tenho uma para desenvolvimento, como disse acima, mas tenho uma contendo somente aplicativos para edição/conversão de vídeo, uma contendo materiais/softwares das minhas atividades como professor universitário, outra para minhas atividades do MBA, etc…

Estou gostando bastante, pois não tenho problemas de performance (depois que passei a usar o VirtualBox). Não tenho "receio" de instalar versões de bibliotecas e softwares na máquina virtual, graças ao conceito de snapshot, que permite criar um "instantâneo" da máquina virtual antes de uma determinada instalação, de modo que posso desfazer a instalação muito facilmente, sem correr o risco de "efeitos colaterais" em decorrência de uma desinstalação mal feita.

Sem mais, vamos às imagens:

Essa é a "cara" do VirtualBox, à esquerda a lista de máquinas virtuais (No caso, só tem uma "Win7") e à direita as configurações da Máquina virtual selecionada:

Inicializando a máquina virtual. Note que o sistema operacional host, é o Windows XP, da minha máquina real:



O Windows 7 iniciando:



Tela de Logon do Windows 7:

A máquina virtual em modo Full Screen:

Menu Iniciar > All Programs. Note que não tem quase nada instalado. Somente as ferramentas básicas para desenvolvimento:

Visual Studio 2008 no Windows 7:

Windows Explorer com drive de "rede". Esse drive "Z" é, na verdade, um mapeamento para o drive "D" da minha máquina "real". Assim, posso mover arquivos entre as duas máquinas livremente:

Bem, por enquanto é isso. Pretendo fazer outros posts no futuro falando mais de outras características do VirtualBox, como criar máquinas virtuais, etc…

Forte abraço.

Internet Explorer 8 “Not Responding” ao debugar javascript no Windows 7 Ultimate RC

19 nov
Olá Pessoal,
 
Tive um probleminha ao debugar javascript usando o Visual Studio 2008 no Windows 7 Ultimate RC.
Sempre que colocava um breakpoint em alguma linha de um arquivo .js, quando o debugger parava nessa linha, após alguns segundos o Internet Explorer 8 parava de responder. Veja:

Tela com o breakpoint:

 
Ao acessar a página, 3 ou 4 segundos após o breakpoint ser "atingido":

Trata-se de um bug do IE 8 no Windows 7 RC. Desconheço se na versão final do Windows 7 eles corrigiram isso. Achei a solução para o problema em um post no blog oficial do Internet Explorer.

Basta alterar o registro do Windows adicionando a seguinte chave (ou alterando, caso ela já exista. No meu caso, ela não existia):

HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\Main!HangResistance, DWORD, 0

Forte abraço.

Comparação de String “Case Sensitive” no Linq To Entities

19 nov
Olá Pessoal,
 
Um pequeno Post sobre Linq To Entities:

Estava tendo um problema em uma consulta no Linq, bem simples de resolver, onde essa consulta faz um filtro por um campo do tipo String, assim:

public Provider GetProvider(string providerAlias)
{
    return (from p in this.context.Provider where p.Alias == providerAlias select p).FirstOrDefault();
}

O que ocorre é que essa consulta estava case sensitive, ou seja, uma chamada a GetProvider("Standard") tinha um retorno diferente de GetProvider("standard"), pelo fato de na primeira chamada o "S" de "Standard" estar maiúsculo, mesmo estando o SQL Server configurado para que as comparações textuais sejam case insensitive. A minha primeira reação foi pensar em fazer isso:

public Provider GetProvider(string providerAlias)
{
    return (from p in this.context.Provider where p.Alias.ToLower() == providerAlias.ToLower() select p).FirstOrDefault();
}

Funciona, mas fiquei incomodado, primeiro porque achei meio "forçado", e segundo fiquei desconfiado de como o Linq iria gerar a query no banco de dados.
Pra tirar a dúvida, implementei dessa forma e fui ver no SQL Profiler. Veja:

WHERE (LOWER([Extent1].[Alias])) = (LOWER(@p__linq__1))

Para quem não sabe, não devemos aplicar funções a campos que estejam na cláusula WHERE das nossas queries, como a função LOWER sendo aplicada ao campo Alias, nesse exemplo. Isso porque dessa forma o Query Optimizer não consegue utilizar os índices que por ventura existam nesse campo.

Parti então em busca de uma forma "melhorada" de fazer essa consulta. Encontrei essa construção, utilizando Equals:

public Provider GetProvider(string providerAlias)
{
    return (from p in this.context.Provider where p.Alias.Equals(providerAlias, StringComparison.CurrentCultureIgnoreCase) select p).FirstOrDefault();
}

 
Olhando novamente no SQL Profiler, veja:

WHERE [Extent1].[Alias] = @p__linq__29

Pronto. A consulta agora é case insensitive e a query não aplica nenhuma função ao campo Alias.

Forte abraço.