Microsoft Live Labs: Infinite Canvas

30/04/2009 23:59

De vez em quando gosto de dar uma espiada no Live Labs para ver o que os caras andam aprontando (do Live Labs que saiu, por exemplo, o Photosynth). Hoje vi um projeto interessante chamado Infinite Canvas. É mais ou menos assim, você adiciona diversas referências de imagens e um painel navegável é criado, permitindo uma mistura de funcionalidades de Deep Zoom e slide. Segundo os autores, a idéia é a experiência de uma leitura de revista em quadrinhos na Web.

InfiniteCanvas

Microsoft Live Labs ,



EntLib (parte 4) – Como criptografar valores de configurações

30/04/2009 23:21

Essa é rápida, em dois passos:

  1. No Visual Studio, na janela Solution Explorer clique com o botão direito no arquivo *.config e escolha Edit Enterprise Library Configuration.
  2. No painel que será aberto selecione o bloco desejado e configure na janela Properties a propriedade ProtectionProvider com um dos valores possíveis: RsaProtectedConfigurationProvider ou RsaProtectedConfigurationProvider.

 

O arquivo terá os seus valores criptografados para o bloco escolhido, parecido com o exemplo abaixo:

<configuration>
  <configSections>
    <section name="dataConfiguration" type="Microsoft.Practices.EnterpriseLibrary.Data.Configuration.DatabaseSettings, Microsoft.Practices.EnterpriseLibrary.Data, Version=4.1.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
  </configSections>
  <dataConfiguration configProtectionProvider="DataProtectionConfigurationProvider">
    <EncryptedData>
      <CipherData>
        <CipherValue>AQAAANCMnd8BFdERjHoAwE/Cl+sBAAAAnG4OGsLZME6zifWS77nKbwQAAAACAAAAAAADZgAAqAAAABAAAAAvCXZMbpn4GScVpZdnDewUAAAAAASAAACgAAAAEAAAADusmEwywBaRj/cosxnUjNwwAAAAU0tWH46p699zcc0Em297GCXHmQFeJNDjBW/OYYD8dhL1YQvo3kv2xEqdceYyMaN4FAAAAH8/JIj3NPW0iqGaL3ea8EJ6iTcL</CipherValue>
      </CipherData>
    </EncryptedData>
  </dataConfiguration>
  <connectionStrings configProtectionProvider="DataProtectionConfigurationProvider">
    <EncryptedData>
      <CipherData>
        <CipherValue>AQAAANCMnd8BFdERjHoAwE/Cl+sBAAAAnG4OGsLZME6zifWS77nKbwQAAAACAAAAAAADZgAAqAAAABAAAABYRu+xiL0lzqHttNs404kBAAAAAASAAACgAAAAEAAAAMINKPGoHaeQb9sgHCDgdoMwAAAA54NHzS+SEf/FsxrhhdvEmzkaZquWXEXtkUqvOJJFAKcvetVZ/MrSlHYSwTkeK//IFAAAAMgRi2qGSQYz/thfljTdGEeOBQ6E</CipherValue>
      </CipherData>
    </EncryptedData>
  </connectionStrings>
</configuration>

Enterprise Library



EntLib (parte 3) – Instrumentação de código

29/04/2009 23:22

Dizemos que um código possui instrumentação (ou Instrumentation, do inglês) quando ele é capaz de gerar indicadores para monitorarmos ou medirmos sua performance. Tipicamente, esses indicadores auxiliam na detecção de erros relacionados a performance e podem ser utilizados, por exemplo, para visualização através do aplicativo de monitoramento de performance do Windows (acesse através da opção Run do Windows, digitando perfmon).

Com exceção do Unity, todos os demais blocos da Enterprise Library podem ser instrumentalizados. Por padrão esse recurso vem desativado, sendo necessário utilizar um arquivo bat que aplica as configurações necessárias para ativação. Caso você tenha feito a instalação padrão o arquivo bat poderá ser executado através da opção Run do Windows usando o arquivo abaixo:

C:\Program files\Microsoft Enterprise Library 4.1 - October 2008\InstallServices.bat

Para desinstalar a instrumentação basta digitar o mesmo arquivo com o parâmetro “/u”, conforme abaixo:

C:\Program files\Microsoft Enterprise Library 4.1 - October 2008\InstallServices.bat /u

Outra forma disponível para realizar as operações acima é utilizar os atalhos existentes no menu Start / All programs / Microsoft patterns & practices / Enterprise Library 4.1 - October 2008.

Uma vez instalado devemos adicionar uma referência no projeto para a seguinte biblioteca:

Microsoft.Practices.EnterpriseLibrary.Common.dll

Devemos também adicionar o seguinte namespace na classe que usará a instrumentação:

...
using Microsoft.Practices.EnterpriseLibrary.Common.Instrumentation;
...

Por último será necessário adicionarmos no arquivo de configuração do projeto (tanto faz ser Web.config ou App.config) o bloco de instrumentação, clicando com o botão direito no arquivo e escolhendo a opção Edit Enterprise Library Configuration. Na janela de configuração do Enterprise Library Configuration clique com o botão direito no segundo nó da estrutura e escolha Instrumentation.

Instrumentation

Utilizando a janela Properties do Visual Studio é possível configurar as propriedades do bloco, para o exemplo deste post eu alterei as propriedades PerformanceCountersEnabled, WmiEnable e EventLoggingEnabled para True. Abaixo temos um exemplo de como devemos implementar um listener para monitoramento de chamadas de conexão com o banco de dados.

public class MyListener
{
    public MyListener(string instanceName, bool a, bool b, bool c) { }

    [InstrumentationConsumer("DbConnect")]
    public void ConnectObserved(object sender, EventArgs e)
    {
        System.Console.WriteLine("I saw a Database Connect.");
    }
}

[InstrumentationListener(typeof(MyListener))]
public class MyApplication
{
    [InstrumentationProvider("DbConnect")]
    public event EventHandler<EventArgs> OnDbConnect;
}

Fonte: http://msdn.microsoft.com/en-us/library/cc511922.aspx

Enterprise Library



EntLib (parte 2) – Melhore a performance de suas consultas

26/04/2009 03:09

Todo mundo sabe que na maioria das vezes o maior custo para recuperarmos informações numa aplicação está na consulta ao banco de dados. Entenda por “custo” a demanda de infra necessária para obter ou até mesmo persistir dados no contexto da aplicação bem como o tempo de resposta para executar tais operações, o que impacta diretamente na performance geral da aplicação. Uma das técnicas utilizadas para evitarmos consultas desnecessárias ao servidor de banco de dados é o armazenamento temporário em cache, onde os dados são disponibilizados em uma área da memória do servidor de aplicação.

A Enterprise Library oferece uma biblioteca para utilização de mecanismos de cache de maneira simples chamada Caching Application Block. Para usarmos o bloco numa aplicação basta adicionarmos uma referência no projeto da seguinte DLL:

Microsoft.Practices.EnterpriseLibrary.Caching.dll

A partir daí adicionamos o namespace indicado abaixo na classe que utilizará o Caching:

...
using Microsoft.Practices.EnterpriseLibrary.Caching;
... 

Se quiséssemos, por exemplo, recuperar imagens de produtos gravadas no banco de dados, utilizaríamos o seguinte código:

...

byte[] fotoProduto = null;
ICacheManager cache = CacheFactory.GetCacheManager();
fotoProduto = (byte[])cache[id.ToString()];

if (fotoProduto == null)
{
    ServicoProduto servico = new ServicoProduto();
    fotoProduto = servico.ObterFotoProduto(id);

    cache.Add(id.ToString(), fotoProduto);
}

...

 

Repare que nas linhas 4 e 5 o cache é criado e a variável fotoProduto recebe o valor armazenado no gerenciador de cache do Caching Application Block. Nas linhas 7 a 13 a consulta ao banco é realizada caso o cache ainda não tenha sido preenchido ou o seu tempo de vida tenha expirado. Nas solicitações seguintes a consulta ao banco será descartada, já que o cache já terá recebido a carga da imagem. Para garantirmos a unicidade das imagens fornecemos junto a chave do produto através do valor contido na variável id.

O arquivo de configuração da aplicação deve ser alterado adicionando-se as tags a seguir:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <configSections>

...

    <section name="cachingConfiguration" type="Microsoft.Practices.EnterpriseLibrary.Caching.Configuration.CacheManagerSettings, Microsoft.Practices.EnterpriseLibrary.Caching, Version=4.1.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
  </configSections>

...

  <cachingConfiguration defaultCacheManager="Cache Manager">
    <cacheManagers>
      <add expirationPollFrequencyInSeconds="60" maximumElementsInCacheBeforeScavenging="1000"
        numberToRemoveWhenScavenging="10" backingStoreName="Null Storage"
        type="Microsoft.Practices.EnterpriseLibrary.Caching.CacheManager, Microsoft.Practices.EnterpriseLibrary.Caching, Version=4.1.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"
        name="Cache Manager" />
    </cacheManagers>
    <backingStores>
      <add encryptionProviderName="" type="Microsoft.Practices.EnterpriseLibrary.Caching.BackingStoreImplementations.NullBackingStore, Microsoft.Practices.EnterpriseLibrary.Caching, Version=4.1.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"
        name="Null Storage" />
    </backingStores>
  </cachingConfiguration>

...

</configuration>

 

O tempo de duração do cache está definido na linha 14, através da propriedade expirationPollFrequencyInSeconds.

Obviamente devemos planejar o uso deste mecanismo, entendendo onde teremos um real ganho de performance ao aplicarmos essa técnica, caso contrário estaremos só adicionando mais código na aplicação.

A título de informação, a Microsoft tem um projeto com o codinome Velocity que oferecerá uma plataforma de cache distribuído para aplicações armazenando qualquer tipo de dado com alta-performance. Atualmente o projeto está com a versão CTP 3 disponível para download, caso você tenha alguma experiência com o Velocity e deseje compartilhar comentando aqui, fique a vontade. Até o próximo post da série.

Enterprise Library



Oitavo encontro do grupo .Net Architects

25/04/2009 15:04

Hoje pela manhã participei de mais um encontro do grupo de estudos de arquitetura .Net Architects, onde tivemos como tema ASP.Net MVC x WebForms. O formato da reunião foi um pouco diferente das anteriores, pois o debate ocorreu junto com a “defesa” de cada tecnologia pelo Giovanni Bassi e o André Dias, respectivamente.

Houve até um desafio, onde os dois construíram a mesma aplicação, cada um com sua tecnologia, em 30 minutos. Foi possível comparar na prática as vantagens e as desvantagens de cada uma. Achei fantástico esse formato de reunião, além de muito divertido.

Outra novidade foi a transmissão do encontro em tempo real, com a participação de mais de 20 membros, enviando dúvidas e comentários para os presentes. No final discutimos sobre o primeiro evento do grupo, o .NET Architects Day 2009.

Como de costume, a reunião foi gravada e tão logo seja possível estará disponível no site do grupo.

.Net Architects ,