Inversão de controle com Unity

Sexta-feira, 18 de julho de 2008 por Carlos

No último post iniciamos nossa breve visita ao “Enterprise Library 4.0” com o “Cryptography Application Block”. Neste post vamos analisar o “Unity Application Block” que é uma novidade na versão 4 da biblioteca. O “Unity” é um container de inversão de controle baseado na biblioteca “ObjectBuilder2” do “Entreprise Library” e que foi lançado como uma alternativa às já tradicionais bibliotecas “Spring.NET” (uma versão da famosa biblioteca Spring do mundo Java), “Castle Windsor”, “StructureMap”, “ObjectBuilder” etc.

Quem já utilizava o “Enterprise Library” em alguma de suas versões anteriores deve estar familiarizado com a biblioteca “ObjectBuilder”. Ela atuava no núcleo do “Enterprise Library” cuidando do gerenciamento dos objetos e apesar de não ser um “cidadão de primeira classe” (já que não era promovido como um dos conjuntos de aplicação), podia ser referenciado e utilizado diretamente pelo usuário. Muitos reclamavam de questões relativas ao design e performance da biblioteca e, a partir do feedback dos usuários e observação dos projetos da comunidade, a Microsoft refez o código e lançou o “ObjectBuilder2”. Baseado nele, foi construído o “Unity Application Block” e a novidade é que apesar de fazer parte do “Enterprise Library”, pode ser baixado separadamente através do portal CodePlex.
 
Conforme mencionei, o “Unity” é apenas uma alternativa a outras bibliotecas. Dito isto, podemos esperar muitas funcionalidades parecidas, algumas inéditas e algumas que faltam. A intenção deste post não é fazer uma comparação entre todas as bibliotecas disponíveis, mas visitar algumas das funcionalidades básicas do “Unity” para que seja mais fácil explorar daí pra frente.

Usando o “Unity Application Block”

Após baixar e instalar o pacote do CodePlex, vamos criar um novo ConsoleApplication no Visual Studio 2008 e referenciar as duas bibliotecas principais do “Unity” que já estão registradas no GAC da máquina: Microsoft.Practices.Unity, Microsoft.Practices.Unity.Configuration e Microsoft.Practices.Unity.ObjectBuilder2.

Para iniciarmos com um exemplo, vamos imaginar uma aplicação simples onde queremos criar um log. Podemos ter várias implementações deste “logger”, por exemplo, uma que escreve as mensagens direto no console e outra que escreve em um arquivo texto. Se fizermos com que estes dois “loggers” implementem uma interface comum, ganhamos flexibilidade por podermos especificar através de um arquivo de configuração qual gostaríamos de usar.

Esta seria a interface em questão:

public interface ILogger
{
    void Log(string message);
}

Há apenas um método que recebe a mensagem que gostaríamos de escrever. Para ela, criamos duas implementações:

public class ConsoleLogger : ILogger
{
    public void Log(string message)
    {
        Console.WriteLine(message);
    }
}
public class TextFileLogger : ILogger
{
    public void Log(string message)
    {
        using (StreamWriter streamWriter =
new StreamWriter("log.txt", true))
        {
            streamWriter.WriteLine(message);
        }
    }
}

Se utilizarmos apenas a interface ILogger, já podemos escrever o comportamento da nossa prova de conceito:

ILogger logger;
logger.Log("Aplicação foi iniciada.");
logger.Log("Aplicação foi finalizada.");

Falta apenas inicializar o objeto logger. Para isso, utilizaremos as classes do namespace Microsoft.Practices.Unity, de forma que o método Main fica assim:

static void Main(string[] args)
{
    UnityContainer unityContainer = new UnityContainer();
    unityContainer.RegisterType(typeof (ILogger),
typeof (ConsoleLogger));
    ILogger logger = unityContainer.Resolve<ILogger>();
    logger.Log("A aplicação foi iniciada.");
    Console.ReadLine();
    logger.Log("A aplicação foi finalizada.");
}

Vamos analisar passo-a-passo o que fizemos: em primeiro lugar, inicializamos o objeto unityContainer com o construtor padrão. Depois, configuramos programaticamete o Unity através do método RegisterType. Neste caso, criamos a associação dizendo que a interface ILogger deve ser associada à implementação ConsoleLogger. Ao rodar o programa, podemos ver que as mensagens são impressas na tela. Seriam impressas no arquivo log.txt se a associação da interface ILogger fosse com a implementação TextFileLogger.

A princípio, a menos que a intenção seja aproveitar o controle do ciclo de vida dos objetos que o Unity fornece (para encapsular nossa implemenação em um singleton, ou pedir uma instância por chamada), não há muito sentido em configurá-lo programaticamente. O código equivalente a este, mas com as configurações no App.config seria o seguinte:

static void Main(string[] args)
{
    UnityContainer unityContainer = new UnityContainer();
   
    UnityConfigurationSection unityConfigurationSection =
(UnityConfigurationSection) ConfigurationManager.GetSection(”unity”);
unityConfigurationSection.Containers.Default.Configure(unityContainer);
    ILogger logger = unityContainer.Resolve<ILogger>();
    logger.Log("A aplicação foi iniciada.");
    Console.ReadLine();
    logger.Log("A aplicação foi finalizada.");
}
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <configSections>
    <section name="unity" type=
"Microsoft.Practices.Unity.Configuration.UnityConfigurationSection,
Microsoft.Practices.Unity.Configuration" />
  </configSections>
  <unity>
    <typeAliases>
      <typeAlias alias="ILogger"
type="ConsoleApplication1.ILogger, ConsoleApplication1" />
      <typeAlias alias="ConsoleLogger"
type="ConsoleApplication1.ConsoleLogger, ConsoleApplication1" />
      <typeAlias alias="TextFileLogger"
type="ConsoleApplication1.TextFileLogger, ConsoleApplication1" />
    </typeAliases>
    <containers>
      <container>
        <types>
          <type type="ILogger" mapTo="ConsoleLogger" />
        </types>
      </container>
    </containers>
  </unity>
</configuration>

Com este exemplo iniciamos a utilização do Unity, mas ainda há muitos recursos a explorar. Na seção de links, ao final do post, há uma lista de blogs que possuem exemplos de aplicação que estendem o que já fizemos. Uma modificação imediata que poderíamos fazer seria especificar o nome do arquivo log.txt através do próprio arquivo App.config, bastando apenas passá-lo através de um construtor da classe ConsoleLogger.

Inversão de Controle

Quinta-feira, 10 de julho de 2008 por Erich Machado

Inversão de controle (Inversion of Control, ou IoC) é uma técnica muito utilizada atualmente e com a qual desenvolvedores freqüentemente têm que lidar, por isso é importante compreender como ela funciona.

A inversão de controle consiste na mudança do fluxo de controle de um programa, onde ao invés do programador determinar quando um procedimento será executado ele apenas determina qual procedimento deve ser executado para um determinado evento.

Motivações

As principais motivações são: o reaproveitamento do código que contém o fluxo de controle, reaproveitamento do design e reaproveitamento do comportamento da aplicação. Isso está alinhado às boas práticas de programação orientada a objetos, pois assim é possível atingir um baixo acoplamento na arquitetura e um alto nível de testabilidade.

Exemplo

Aqui temos o código de um pequeno questionário em Ruby (adaptado do artigo de Martin Fowler):

#ruby

puts 'Qual é o seu nome?'
nome = gets
process_nome(nome)

puts 'Qual o seu pedido?'
pedido = gets
process_pedido(pedido)

No fragmento de código acima o fluxo de controle é determinado pelo próprio programa. Ele decide quando deve realizar as perguntas, ler as respostas e processar os resultados. Se estivéssemos usando um sistema de janelas teríamos então que configurar a janela a ser utilizada da seguinte maneira:

require 'tk'
root = TkRoot.new()

nome_label = TkLabel.new() {text "Qual é o seu nome?"}
nome_label.pack
nome = TkEntry.new(root).pack
nome.bind("FocusOut") {process_nome(nome)}

pedido_label = TkLabel.new() {text "Qual o seu pedido?"}
pedido_label.pack
pedido = TkEntry.new(root).pack
pedido.bind("FocusOut") {process_pedido(pedido)}

Tk.mainloop()

Nesse caso, o fluxo de controle foi entregue ao sistema de janelas (através do comando Tk.mainloop). É o sistema de janelas agora quem decide quando vai realizar as perguntas, com base nas configurações feitas durante a criação do formulário. Em relação ao primeiro exemplo o fluxo de controle está invertido, pois é o framework que usa o código que fizemos ao invés do código que fizemos usar o framework.

Frameworks

O uso de IoC normalmente está associado a aspectos arquiteturais do sistema pois, como pudemos observar no exemplo, ele determina o fluxo do código. Uma arquitetura que mantém o fluxo de controle generalizado (através de abstrações, como o uso de interfaces, por exemplo), dá origem ao que chamamos de frameworks. Eles funcionam como estruturas pré-fabricadas, prontas para receber uma implementação específica para um determinado comportamento.

Frameworks populares hoje em dia, como o Rails, surgiram dessa forma. Ao identificar o potencial de uso de sua arquitetura para as mais variadas aplicações, criou-se uma abstração em torno da mesma que permitisse com que a sua funcionalidade primária fosse extendida. Inversão de controle é uma característica comum aos frameworks, sendo na verdade freqüentemente aceita como uma das características que os definem.

Nas palavras de Ralph Johnson e Brian Foote: “O framework geralmente assume o papel do programa principal de coordenar e seqüenciar a atividade da aplicação. Essa inversão de controle dá aos frameworks o poder de servir como se fossem esqueletos de aplicação extensíveis.”

Apesar de ser mais comum nos depararmos com IoC em frameworks, essa técnica também é utilizada em outras situações, como no padrão Template Method, por exemplo.

“Don’t call us, we’ll call you”

Inversão de controle é também conhecida como o “Princípio de Hollywood”, em uma analogia com a forma como são feitos os negócios na terra do cinema. Assim como são os estúdios que chamam o ator para o filme, é o framework que chama a implementação feita pelo desenvolvedor, e não o contrário.

Isso é o que faz um framework essencialmente diferente de uma biblioteca. Uma biblioteca funciona como um conjunto de funções que podem ser usadas. Ao usar uma dessas funções, o controle volta para quem a está usando. Já o framework incorpora um comportamento, extensível através da implementação de suas interfaces, ao criar subclasses ou plugar módulos. Depois é o próprio código do framework que usa essa implementação específica que lhe foi entregue.

Injeção de dependência

Normalmente lembramos de IoC quando estamos usando algum dos conhecidos containers para injeção de dependência (Dependency Injection, ou DI). É importante ressaltar que esses containers nada mais são do que frameworks, onde DI é uma implementação que faz uso de IoC. Em outras palavras, IoC é a estratégia enquanto que DI é a tática usada pelo container.

Uma confusão comum ao tratar desse tema é achar que IoC e DI são sinônimos, enquanto na verdade seria mais correto dizer que o último é uma especialização do primeiro. A especialização está no aspecto do controle que está sendo invertido: DI faz com que o controle de construção dos objetos usados na aplicação passe para o container, de forma que o programador não precise explicitamente instanciá-los.

Nas palavras do próprio Martin Fowler, “dizer que esses containers são especiais porque eles usam inversão de controle é como dizer que meu carro é especial porque ele tem rodas”. Exemplos de containers de DI conhecidos são o Spring, Castle Windsor, PicoContainer, Guice e Unity (a ser discutido em um próximo post nesse blog).

Referências

Assuntos Relacionados

Discussões

Cálculo de datas no Shell

Sexta-feira, 4 de julho de 2008 por Fischer

Aqui vai uma dica interessante que pode ajudar no desenvolvimento de shell scripts administrativos, principalmente aqueles que precisamos fazer para limpar arquivos de logs com timestamps em seus nomes.

O comando date do Linux utiliza funções de data e hora da LIBC que são muito poderosas.

Esta função possibilita uns recursos interessantes como por exemplo:

  • date -d ‘last month’ – Retorna o mesmo dia do mês e hora atual, só que no mês anterior;
  • date -d ‘last month’ +’%Y%m’ - Retorna um “timestamp” do mês passado;
  • date -d ‘yesterday’ - Ontem, no mesmo horário;
  • date -d ‘+1 month’ - Próximo mês;
  • date -d ‘next month’ - Idem anterior

Ela também respeita horários de verão, o que a torna mais interessante do que simplemente fazer contas com datas em formato Unix.

Outros exemplos:

  • date -d ‘+3 days’
  • date -d ‘+4 weeks’
  • date -d ‘+4 weeks -5 days’
  • date -d ‘next hour’
  • date -d ‘last minute’
  • date -d ‘next second’

Mais detalhes sobre as possíveis entradas:
http://www.gnu.org/software/tar/manual/html_node/Date-input-formats.html#SEC114

Um bom exemplo do poder disto é o comando abaixo, utilizado para apagar diretórios de dois mêses para trás:

# Procura...
/usr/bin/find \
# em /var/logs
/var/logs/ \
# diretórios \
-type d \
# que tenham seu nome começando com "200"
-iname '200*' \
# e que seu nome não comece com o timestamp do mês atual (ex: 200807)
! -iname "`date +'%Y%m'`*" \
# e que seu nome não comece com o timestamp do mês anterior (ex.: 200806)
! -iname "`date -d 'last month' +'%Y%m'`*" \
# e remova recursivamente o diretório
-exec rm -rfv {} \;

Em PHP o equivalente é a função strtotime e tem gente que gosta tanto dela que fez até um site em sua homenagem: http://www.strtotime.net/.

Em Perl e Ruby tem alguns módulos que simulam comportamento semelhante.

.NET Enterprise Library - Logging

Sexta-feira, 27 de junho de 2008 por Flavio Mori

Uma boa solução de log para a plataforma .NET é o Logging Application Block, que pertence à Enterprise Library, já citada nesse blog.

Além dessa biblioteca facilitar o uso de log, ela gera saídas que podem ser direcionada para vários destinos. Algumas das possibilidades são:

  • O log de eventos do Windows
  • Uma mensagem de e-mail
  • Um banco de dados
  • Uma fila de mensagem
  • Um arquivo texto
  • Um evento WMI

Para o código a maneira como a informação será logada fica transparente já que isso é configurado no App.config ou Web.config.

Os principais elementos configurados são: Formatters, que definem o formato do texto a ser logado; Trace Listeners, que definem o destino do log; e Category Sources, que permitem classificar os Trace Listeners em categorias.

Vamos fazer um tutorial para vermos algumas funcionalidades básicas. Queremos logar informações a respeito de erros em processos em dois lugares: um arquivo texto e no log de eventos do Windows. Vamos criar uma categoria para os logs de erro nos processos chamada “Erro”. Essa categoria vai possuir dois Trace Listeners, um para um arquivo de log e outro para o log de eventos do Windows.

  • No Visual Studio, crie um novo projeto do tipo Console Application.
  • No projeto, adicione um novo item do tipo Application Configuration File (cujo nome padrão é App.config).
  • No Solution Explorer clique com o botão direito no App.config e selecione Edit Enterprise Library Configuration.

Edit Enterprise Library Configuration

  • Na tela que abriu, clique com o botão direito no nó correspondente ao App.config e selecione New > Logging Application Block para criar um novo nível na árvore chamado Logging Application Block.

New Logging Application Block

  • Clique com o botão direito em Formatters e escolha New > Text Formatter.
  • Na janela Properties mude o nome para “FormatterTeste” e clique no botão “…” do Template. No Template Editor, mude o texto para “{timestamp} {severity} - Erro no processo {processName}”. Agora temos um Formatter que irá gerar mensagens do tipo “28/6/2008 00:13:21 Error - Erro no processo ProcessoTeste”.
  • Clique com o botão direito em Trace Listeners e vá em New > Flat File Trace Listener. Na janela Properties selecione o Formatter “FormatterTeste”. Delete o conteúdo de Footer e Header, pois não queremos rodapé nem cabeçalho no arquivo de log. Em Filename, defina o local e o nome do arquivo (por exemplo c:\teste.log).
  • Crie um Trace Listener do tipo Formatted EventLog Trace Listener. Na janela Properties mude o seu Formatter para FormatterTeste.
  • Em Category Sources clique com o botão direito e vá em New > Category e renomeie-a para “Erro”.
  • Clique com o botão direito na categoria “Erro” e vá em New > Trace Listener Reference. Altere ReferencedTraceListener para FlatFile TraceListener.
  • Repita o último passo para o Formatted EventLog TraceListener criado por você.
  • Salve o arquivo App.config que você está editando.

No Solution Explorer, adicione uma referência ao componente .NET chamado “Enterprise Library Logging Application Block”.

Edite o código de sua classe, que provavelmente foi criada em Program.cs, para esse:

using System;

using System.Collections.Generic;

using System.Text;

using Microsoft.Practices.EnterpriseLibrary.Logging;

using System.Diagnostics;

 

namespace LogSpike

{

    class Program

    {

        static void Main(string[] args)

        {

            LogEntry logEntry = new LogEntry();

            logEntry.Severity = TraceEventType.Error;

            logEntry.ProcessName = “ProcessoTeste”;

            logEntry.Categories.Add(“Erro”);

 

            Logger.Write(logEntry);

        }

    }

}

Execute a classe e você deverá ver a mensagem esperada no arquivo de log assim como no Event Viewer, dentro de “Application Log”.

Event Viewer

Você pode encontrar mais informações sobre o Logging Application Block aqui.

MVC e Ruby on Rails, uma visão simplificada

Segunda-feira, 23 de junho de 2008 por Joca

Quem me conhece sabe que gosto de simplicidade. Dentre as coisas simples que gosto, tenho especial apreço por explicações simples, pois elas ajudam quem nunca teve contato com um assunto a ter uma primeira idéia e, a partir daí, se aprofundar no tema. Recentemente postei uma explição simples das Metodologias Ágeis de Desenvolvimento. Queria fazer o mesmo para dois termos que têm sido muito falados não só nos blogs da Locaweb, como em vários lugares pela internet.

O primeiro é MVC, que significa Model View Controller. Explicando de forma bem simplista:

- Model: modelo dos dados, normalmente um banco de dados, mas é mais que só interface com BD. O recomendado é que toda regra de negócio fique nele. Por exemplo, numa loja, ao gravar um novo pedido, o modelo faz todo o cálculo de frete, checagem de estoque, processamento de pagamento etc.
- View: como os dados serão vistos e como alguém pode interagir com esses dados, normalmente páginas HTML com forms.
- Controller: é quem interpreta eventos que acontecem na View e manipula os dados que estão no Model, normalmente são ações como listar, procurar, alterar, inserir e deletar dados.

O bacana desse modelo de arquitetura de software é a separação entre essas três camadas distintas da aplicação que permite até que pessoas ou equipes diferentes trabalhem em diferentes camadas, sem impacto no trabalho dos outros.

Como sempre, uma imagem vale mais que mil palavras, mesmo as imagens que contém palavras, então:

Sobre o Ruby on Rails, os especialistas aqui na Locaweb são o Akita e o Gilberto, que explicou como criar um ambiente rails no seu PC Windows, além de várias outras pessoas que estão estudando, mas vou dar minha visão simplista:

Ruby é uma linguagem de programação criada no japão em 1994, como já explicou o André aqui (http://tecblog.locaweb.com.br/?p=10). Quem conhece Perl certamente vai gostar de programar em Ruby.

Rails é um framework, ou um ambiente de trabalho, desenvolvido para transformar a programação em Ruby ainda mais simples e divertida. Rails foi criado por David Hansson:

desenvolvedor dinamarquês de uma empresa americana chamada 37signals, para automatizar o trabalho “chato” de desenvolvimento de um novo sistema.

Quando se inicia a programação de um sistema em Rails, o framework já cria o ambiente MVC incluindo as tabelas de banco de dados (Model), o esqueleto dos Viewers e dos Controllers.

Uma das funcionalidades que mais me impressiona no Rails é o Active Record, que mapeia tabelas a classes, linhas de tabelas a objetos e colunas de tabelas aos atributos dos objetos. Essa prática é conhecida como object-relational mapping (ORM), em português mapeamento objeto-relacional, ou seja, mapear objetos à tabelas de bancos de dados relacionais.

ORM não é novidade, mas a implementação feita em Rails, com o ActiveRecord simplificou em muito ORM pois, ao invés de necessitar de um arquivo de configuração para fazer os mapeamentos, ele se baseaia em convenções e em valores default para fazer o mapeamento. Ou seja, é a simplificação do ORM. :)

Aguardem, em breve teremos mais posts sobre Rails e, para quem quiser testar o ambiente Rails que estamos preparando em nossa Hospedagem Linux, basta se inscrever em:

http://blog.locaweb.com.br/archives/263

Protegendo suas informações

Sexta-feira, 13 de junho de 2008 por Luciano

A “Enterprise Library 4.0” é um conjunto de aplicações (application blocks) que foi criada para auxiliar o programador .NET em algumas situações complexas que surgem durante o desenvolvimento de uma aplicação. Cada bloco de aplicação pode ser utilizado individualmente sem a necessidade de se referenciar toda a biblioteca. Juntamente com o aplicativo de instalação é baixado também o código fonte que você pode adequar às suas necessidades.

O “Cryptography Application Block”, é uma mão na roda para quem precisa guardar informações com segurança ou garantir a integridade da informação.

Ele abstrai a implementação de dois tipos comuns de criptografia: symmetric (simétrica) e hash (pode ser traduzido como um resumo embaralhado da informação). A simétrica é utilizada para criptografar o texto de através de uma chave secreta de modo que possa ser recuperado posteriormente com o uso da mesma chave.  O hash é utilizado para garantir, por comparação, que uma informação (seja um texto ou um arquivo) não tenha sido alterada no meio do caminho. Poderia escrever mais aqui sobre criptografia, mas é um assunto extenso. Então, deixemos essa parte para os colaboradores da Wikipedia (links no final do post).

Configurando a aplicação

A maneira mais fácil e rápida de se configurar qualquer bloco na Enterprise Libray é utilizando a ferramenta de configuração que foi instalada junto com o pacote:

Abra o arquivo de configuração de seu projeto. Como exemplo, criamos uma aplicação web, então será o Web.Config.

Adicione uma nova seção de configuração conforme a figura:

Aparecerá:

Estão disponíveis as opções para criptografia simétrica e hash. Em nosso exemplo vamos utilizar a criptografia simétrica onde poderemos criptografar e descriptografar uma informação. Criamos o “Symmetric Algorithm Provider” e escolhemos como algoritmo Rijndael (RijndaelManaged). 

Nesse momento abrirá o “Cryptographic Key Wizard” que o guiará na geração da chave que será utilizada para a criptografia. Com a chave gerada e armazenada em um arquivo, você deve protegê-la.

Selecione o modo de proteção:
- User mode: somente as aplicações rodando com o usuário logado terá acesso à chave para criptografar e descriptografar uma informação.
- Machine mode: qualquer aplicação rodando na máquina (e somente naquela máquina) terá acesso à chave.

Caso o usuário seja deletado acidentalmente ou a máquina vá para o espaço, ou ainda, caso seja necessário rodar a aplicação em outra máquina, é possível exportar a chave, protegendo-a com uma senha e importá-la com a mesma senha em outra máquina ou para outro usuário.

Clique em “Finish”, escolha um nome para o provider criado, salve a configuração e pronto.  Vamos programar. 

Usando o  Cryptography Application Block

No Web.Config  você poderá notar o seguinte trecho. Estão definidos, o algoritmo, o local do arquivo que contém a chave, a proteção e o nome:

<securityCryptographyConfiguration>
    <symmetricCryptoProviders>
      <add algorithmType=System.Security.Cryptography…
        protectedKeyFilename=C:\Projetos\…
        protectedKeyProtectionScope=LocalMachine
        type=Microsoft.Practices.EnterpriseLibrary.Security…
        name=TesteCriptografiaProvider />
    </symmetricCryptoProviders>
</securityCryptographyConfiguration>

 

Adicione a referência ao projeto. Clique com o botão direito sobre o projeto no “Solution Explorer” do Visual Studio, em seguida em “Add Reference…”, encontre o assembly “Microsoft.Practices.EnterpriseLibrary.Security.Cryptography.dll”, adicione também os assemblies “Microsoft.Practices.EnterpriseLibrary.Common.dll” e “Microsoft.Practices.EnterpriseLibrary.ObjectBuilder2.dll” e clique em OK.

 

Na classe em que for utilizar a criptografia, adicione a instrução “using” (C#): 
using Microsoft.Practices.EnterpriseLibrary.Security.Cryptography;

 

Criptografando:
string msgCriptografada = Cryptographer.EncryptSymmetric(“TesteCriptografiaProvider”, “Mensagem Secreta”);

Descriptografando:
string msgRevelada = Cryptographer.DecryptSymmetric(“TesteCriptografiaProvider”, msgCriptografada);

Isso mesmo… Uma única linha para criptografar e outra para descriptografar.

Versões

Aqui foi utilizada a versão 4.0 da “Enterprise Library” desenvolvida para o Framework 3.5. Estão disponíveis as versões anteriores para o Framework 3.0, 2.0 e 1.1 também no endereço http://msdn.microsoft.com/en-us/library/cc467894.aspx.

Links

Sobre a Enterprise Library 4.0
http://msdn.microsoft.com/en-us/library/cc512464.aspx

Download
http://www.microsoft.com/downloads/details.aspx?FamilyId=90DE37E0-7B42-4044-99BE-F8ECFBBC5B65&displaylang=en

Criptografia
http://pt.wikipedia.org/wiki/Criptografia (português)
http://en.wikipedia.org/wiki/Cryptography (inglês - com mais informações)

Testes com Visual Studio e Selenium?

Sexta-feira, 6 de junho de 2008 por Thiago

O Selenium é uma ferramenta desenvolvida pela OpenQA, que auxilia os testes automáticos em aplicações Web (HTTP), fácil de entender, possui interface gráfica, e pode ser programada em diversas linguagens por desenvolvedores e testadores.

Esta ferramenta pode ser executada sobre os navegadores Internet Explorer, Mozilla, Firefox para Windows, Linux, Macintosh, e no Safari para Mac.

Gravando e executando Testes com o Selenium (IDE)

Para conhecer a interface do Selenium de forma rápida, instale o navegador Firefox e, após o término da instalação, abra o navegador Firefox e clique no link do Selenium IDE, que pode ser encontrado na página de downloads da OpenQA.

A ferramenta instalada pode ser encontrada dentro do Firefox, através do Menu -> Ferramentas -> Selenium IDE.

Este aplicativo permite gravar e executar alguns testes de forma simples e rápida, além de permitir com que os desenvolvedores aprendam com o código-fonte gerado pelo aplicativo, em diversas lingüagens.

A imagem a seguir é uma gravação realizada sobre a página atual do Google:

Programando Testes com o Selenium RC (Remote Control)

No caso de testes de aplicações web mais complexas, eventualmente encontramos a necessidade de realizar consultas a banco de dados, ou a outros sistemas integrados. Nestes casos, talvez seja interessante integrar os testes do Selenium IDE a um ambiente de programação de escolha pessoal.

Neste caso, a instalação e a utilização do Selenium RC pode ser uma boa alternativa, pois ele permite executar o código-fonte do Selenium, dentro do ambiente e linguagem desejada pelo usuário (Java, C#, Perl, PHP, Python, ou Ruby).

Para instalá-lo, como o Selenium RC é um servidor feito em Java (Remote Control Server) que abre, manipula e fecha os navegadores, atuando nas requisições e resultado das páginas, será necessário instalar primeiro o Java Virtual Machine (JVM).

Depois de instalado, é necessário fazer o download do Selenium RC e executar o arquivo denominado selenium-server.jar, através da linha de comando a seguir: java.exe -jar selenium-server.jar.

Depois que o servidor estiver sendo executado, será necessário entrar no ambiente de programação desejado e importar as bibliotecas que estão dentro do pasta do Selenium RC para dentro do ambiente. Após a importação, o código Selenium gerado pelo Selenium IDE poderá ser copiado para o ambiente de programação e executado.

Para auxiliar o entendimento, abaixo segue uma representação arquitetural do Selenium RC:

Outros exemplos de código-fonte e o tutorial completo podem ser encontrados na página da OpenQA.

Abstração do código Selenium nos Testes Criados

A medida em que os testes começam a crescer em tamanho e quantidade, o código-fonte do Selenium começa a tornar-se extenso, podendo complicar o entendimento e a manutenção do mesmo.

Para ajudar nestes casos, o ideal seria abstrair o código Selenium e modularizá-lo em funções ou operações de negócio, para que o código final possa ser lido e compreendido por um usuário da aplicação web em teste, como abaixo:

Teste de Alteração de Dados Cadastrais de um Usuário:

1. EfetuarLoginComUsuario (usuario)
2. AlterarDadosCadastraisPara (novoCadastro)
3. ReceberEmailDoUsuario(usuario)
4. VerificarAlteracaoDosDadosCadastrais(novoCadastro)

Selenium e Visual Studio 2005 - Team Edition for Testers

Caso o usuário opte por utilizar a plataforma de desenvolvimento do Visual Studio com a versão do Team Edition for Testers, a mesma plataforma pode ser utilizada para para escrever, gerenciar e integrar testes unitários e de Selenium, favorecendo o controle de todos eles através desta plataforma.

Para isso, basta criar um projeto de teste no Visual Studio, criar uma Lista de Testes (vsmdi), e controlar os resultados pela tabela de resultados gerada pelo próprio Visual Studio, conforme foto abaixo:

Ao clicar sobre um teste, a janela de resultados aparece para detalhar o status do teste (aprovado, reprovado, em progresso, inconclusivo, etc.), o ponto de execução onde o programa sofreu uma eventual falha e as informações de depuração e saída do programa, conforme foto abaixo:

Selenium Grid Server

Uma das capacidades do Selenium RC é o de distribuir testes utilizando o conceito de “Grid”, permitindo disparar vários navegadores para execução de outras máquinas de testes e realizar tudo de forma mais rápida.

Assim, é possível dentro de um mesmo teste, paralelizar as simulações e receber os resultados em conjunto para a avaliação final.

Maiores informações podem ser encontradas nos links abaixo:

Página do Selenium

Página do Selenium RC

Página MSDN sobre o Team Edition for Testers

Instalando Rails no seu PC (Windows)

Quinta-feira, 29 de maio de 2008 por Gilberto

Algumas pessoas têm relatado dificuldades em configurar o ambiente Rails para desenvolvimento no seu PC em Windows.

Aí vai um passo-a-passo simples para rodar o Rails no Windows com banco de dados MySQL:

RUBY E RAILS

http://rubyinstaller.rubyforge.org
Clicar em “One-click, self-contained Windows installer download”
Baixar o .exe do Final Release
Instalar Ruby, aceitar tudo
Abrir prompt em C:\ruby e digitar:

gem update --system
gem install rails

MYSQL

http://dev.mysql.com
Clicar em “Downloads”
Clicar em “Take me to the community downloads”, depois em “Windows”
Baixar “Windows Essentials (x86)”
Aceitar tudo no instalador
Ao final manter habilitado o checkbox “Configure the MySQL server now”
No Configuration Wizard desabilitar o checkbox “Modify Security Settings” (senha root vazia – OK para ambiente de desenvolvimento), aceitar restante

HEIDISQL (front-end para MySQL)

http://www.heidisql.com – clicar em “Download”
Instalar. Ao final clicar em “New” para configurar nova conexão, dar um nome qualquer e aceitar defaults (localhost)

TESTANDO

No prompt:

net start mysql
rails -d mysql teste
cd teste
rake db:create
ruby script/generate scaffold cliente nome:string endereco:text telefone:string aniversario:date
rake db:migrate
ruby script/server

No browser:

http://localhost:3000/clientes

Obviamente este não é um post que ensina Rails, só como instalar o ambiente!

Para aprender, recomendo:

Ruby:
http://tryruby.hobix.com/
http://aprendaaprogramar.rubyonrails.pro.br/

Rails:
http://developer.apple.com/tools/developonrailsleopard.html (para Mac OS X mas todo o código funciona em qualquer instalação Rails 2)
http://fairleads.blogspot.com/2007/12/rails-20-and-scaffolding-step-by-step.html

Livro em PDF: recomendo fortemente a terceira edição, mesmo “beta”, está atualizada para Rails 2:
http://www.pragprog.com/titles/rails3/agile-web-development-with-rails-third-edition

Do mesmo editor, já num segundo momento, para se aprofundar e aprender melhores práticas, além de dicas valiosas como web services, geotagging etc.:
http://www.pragprog.com/titles/fr_arr/advanced-rails-recipes

Obs.: outros podem sugerir o InstantRails - http://instantrails.rubyforge.org - não testei… vi algumas pessoas se confundirem com ele pois fica tudo “por trás das cortinas”.

Um últmo aviso… Cuidado. Rails vicia :-)

Ruby, o que que é isso?

Quarta-feira, 21 de maio de 2008 por Andre

O framework web conhecido como Ruby on Rails vem crescendo em popularidade cada vez mais e em grande parte isso se deve a linguagem utilizada para a implementação desse framework. O Ruby é uma linguagem de script orientada a objetos criada por Yushiro Matsumoto em 1994 no Japão, que utilizou principalmente características de linguagens como Perl e Python. Por isso programadores que estão familiarizados com essas duas linguagens não terão dificuldades no aprendizado.

Ruby segue o princípio da menor surpresa, o que significa que a linguagem não deve confundir o programador, minimizando o trabalho e fazendo com que o processo de programar seja mais divertido com sua sintaxe simples, em Ruby tudo é um objeto incluindo os tipos primitivos, sendo possível utilizar “(10.78).round ” se quisermos arredondar o valor desse numero para 11 ou então criar blocos de loops simples como em “3.times { puts “Ruby!” }” que irá imprimir 3 linhas contendo a string “Ruby!”.

Com sua flexibilidade é possivel facilmente criar novos métodos para as classes padrão da linguagem:

#!/usr/bin/env ruby
class Numeric
        def vezes(numero)
                self.*(numero)
        end
end
resultado = 10.vezes 20
puts resultado

Com isso imprimindo o valor 200.

Outras características da linguagem a serem citadas são :

  • Facilidade na criação de módulos Ruby em C pela API sendo possível o uso de Ruby como uma linguagem de script incluída dentro de outro software
  • Tratamento de exceções como em Java
  • Alta portabilidade, sendo possível utilizar a linguagem em diversos sistemas como Linux, MacOSX, Windows, DOS, OS/2, etc
  • Garbage Collector automático
  • Closures
  • Continuation, que permite criar blocos de código, executar uma parte dele e continuar a execução de onde parou em outro trecho do programa)

A linguagem também disponibiliza uma ótima ferramenta chamada Interactive Ruby (irb) que permite testar trechos de código diretamente, por exemplo:

$ irb1.8
irb(main):001:0> def primeiraFuncao
irb(main):002:1>     a = "Ola Mundo!"
irb(main):003:1>     puts a
irb(main):004:1> end
=> nil
irb(main):005:0> primeiraFuncao()
Olá Mundo!
=> nil
irb(main):006:0>

Esta foi uma breve introdução sobre a linguagem, mas para aqueles que querem aprender Ruby recomendo o programa Hackety Hack (atualmente com suporte apenas para Windows, versões para MacOSX e Linux estão a caminho!) criado por “why the lucky stiff”, um membro importante da comunidade. Esse programa traz um ótimo conceito que além de aprender a programar em Ruby voce pode utilizar o Hackety Hack para criar mini programas para, por exemplo, ler rss feeds com pouquíssimas linhas de codigo. O website do projeto mostra relatos de crianças que com o Hackety Hack estão aprendendo já a programar em Ruby!

Sobre livros para aprendizado “Ruby: Conhecendo a Linguagem” de Eustáquio Rangel de Oliveira Jr. para os iniciantes , ou “Programming Ruby: The Pragmatic Programmer`s Guide” de Dave Thomas, Chad Fowler e Andy Hunt, mais conhecido como Pickaxe book pelos membros da comunidade que traz tudo sobre a linguagem e um guia de referência sobre os módulos padrão da linguagem na última parte do livro.

Referências:

Ruby Language - http://www.ruby-lang.org/en/
Hackety Hack - http://hacketyhack.net/
Try Ruby! (in your browser) - http://tryruby.hobix.com/
Comunidade Ruby on Rails Brasil - http://www.rubyonbr.org/
IronRuby (Implementacão de Ruby para .NET) - http://www.ironruby.net/
JRuby (Port da linguagem para a plataforma Java) - http://jruby.codehaus.org/

Até a proxima!

Tratamento de errors no T-SQL

Quarta-feira, 21 de maio de 2008 por Ewbank

Nas bases de dados do SQL Server 2000, usávamos a variável @@error para tratamento de erro, mas no SQL Server 2005 podemos usar o bloco Try/Catch (parecido com o Try/Catch/Finally do Java e do C#)

O bom é que, usando o Try/Catch do SQL Server 2005, podemos pegar mais detalhes sobre a “exception” e evitamos colocar um monte de condições no código. Quanto menos “IF’s” no T-SQL, melhor!

Vejam os links abaixo:

Sintaxe:
http://technet.microsoft.com/en-us/library/ms175976.aspx

Usando Try/Catch:
http://technet.microsoft.com/en-us/library/ms179296.aspx

Links interessantes:
http://searchsqlserver.techtarget.com/tip/0,289483,sid87_gci1263638,00.html
http://blog.sqlauthority.com/2007/04/11/sql-server-2005-explanation-of-trycatch-and-error-handling/