sexta-feira, 8 de janeiro de 2010

Usando IDictionary Para Listar Itens

Esta é uma das possíveis maneiras de criar uma lista de itens não repetidos de uma classe.


// Abaixo é definida a propriedade que "seta" os valores para o controle
// na interface
public IDictionary ListaDocumentos
{
set
{
this.dlDocumentos.DataSource = value;
this.dlDocumentos.DataBind();
}
}


// Aqui é criada a propriedade listaDocumento do tipo Dictionary
// contendo chave (long) e o respectivo conteúdo (Documento)
private Dictionary listaDocumento = new Dictionary();

public Dictionary ListaDocumento
{
get { return listaDocumento; }
}


// Abaixo está a rotina para atribuir os valores ao dicionário de
// Documentos
// Lista Documentos
foreach (Servico itemServico in req.ListaServico)
{
foreach (Documento itemDocumento in itemServico.ListaDocumento)
{
if (!this.ListaDocumento.ContainsKey(itemDocumento.Id))
{

this.ListaDocumento.Add(itemDocumento.Id, itemDocumento);

}
}
}

// E para atribuir a lista de documentos
UcImprimirRequerimentoProfissional.ListaDocumentos = this.ListaDocumento;

Exemplo de Uso do Comando switch no C#

No exemplo abaixo é realizado um teste se DadosCadastrais é Masculino ou Feminino para em seguida atribuir o respectivo texto em letras maiúsculas.

string sexo = string.Empty;

switch (req.DadosCadastrais.Sexo)
{
case DadosCadastrais.Masculino: sexo = "MASCULINO" ; break;
case DadosCadastrais.Feminino : sexo = "FEMININO" ; break;
}

Configurando uma propriedade como nullable

Segue abaixo um exemplo de como determinar uma propriedade como nullable.

public DateTime? DataExp
{
set {
if (value.HasValue)
lblDataExp.Text = value.Value.ToString("ddMMyyyy");
}
}

DotNetNuke – Skin Package (Pacote de Skin)

Um pacote DNN Skin é um arquivo zipado contend uma coleção de arquivos HTML,CSS, Imagens e arquivos XML que podem ser instalados em um web site Dotnetnuke e fornece os elementos de design, e opções de layout para o conteúdo do website. Qualquer design de site que pode ser criado com HTML & CSS pode também ser convertido para um DNN Skin, transformado o site de estático em um gerenciável, escalável e dinâmico.



Um pacote skin básico precisa conter:

1. SkinName.html – Um arquivo HTML contendo os elementos de layout e o posicionamento dos sking tokens para o skin Dotnetnuke.

2. Skin.CSS – Um arquivo CSS global que é aplicado no skin do portal e admin do pacote. Skins CSS específicos podem ser incluídos em arquivos separados SkinName.CSS.

3. Skin.XML – Um arquivo XML global com as configurações para o DNN skin tokens. Configurações específicas podem ser especificadas em arquivos separados, como SkinName.xml, para configurações individuais.

4. SkinName.doctype.xml – Um arquivo XML contendo o doctype para o skin. (Caso não seja incluído será utilizado o doctype default).

Singleton Pattern (Padrão Singleton)

Na engenharia de software, o padrão singleton é um padrão de design (design pattern) que é usado para restringir a instancia de uma classe para um objeto. Isto é útil quando apenas um objeto é necessário para coordenar ações pelo sistema. O conceito é algumas vezes generalizado para sistemas que operam de maneira mais eficiente quando apenas um objeto existe, ou aqueles que restringem as instancias a um certo número. Alguns consideram ele um anti-pattern, julgando que ele é super-utilizado (overused), e introduz limitação desnecessária em situações onde uma instância única de uma classe não é realmente necessária, e introduz global state dentro da aplicação.

// Exemplo Singleton C#

using System;
using System.Collections.Generic;
using System.Text;
using DAO;
using BEL;
using Utilitarios;
namespace BLL
{
public class InscricaoBLL
{
private static InscricaoBLL instancia = null;
private InscricaoBLL() { }
public static InscricaoBLL getInstance()
{
if (instancia == null) instancia = new InscricaoBLL();
return instancia;
}
public void inserirInscricao(Inscricao inscricao)
{
InscricaoDAO.getInstance().InserirInscricao(inscricao);
}

// Continua o código ...

}
}

Mensagens de Erro do ASP no IIS 7.5 do Windows 7

Esta postagem é para quem já teve problemas em exibir as mensagens de erro geradas pelo IIS 7.5 no Windows 7, ao desenvolver Web Sites na plataforma ASP.

Em primeiro lugar a localização do IIS no Windows 7 é a pasta Ferramentas Administrativa, em Todos os Programas; Selecione Gerenciador do Serviços de Informações da Internet (IIS) e repare na seção IIS, o ícone de acesos as configurações ASP. Ao abrir este item de configuração, serão exibidas três seções de configuração para aplicações ASP: Compilação, Comportamento e Serviços. Na página de configurações ASP, podemos definir as seguintes opções de configuração:


Elementos da Página do Recurso

Nome do elemento Descrição
Página Código [codePage]
Especifica a página de código padrão de um aplicativo ASP.

Habilitar Armazenamento em Buffer [bufferingOn]
Especifica se a saída de um aplicativo ASP deve ou não ser armazenada em buffer. O padrão é True.

Habilitar Codificação em Partes [enableChunkedEncoding]
Especifica se a codificação de transferência em partes HTTP 1.1 está ou não habilitada para o serviço de publicação na World Wide Web (serviço WWW). O padrão é True.

Habilitar Fallback HTML [enableAspHtmlFallback]
Controla o comportamento do ASP quando a fila de solicitações está cheia. Quando definido para True, o ASP pesquisará um arquivo HTML que tenha _asp adicionado ao nome do arquivo e retornará o arquivo, se ele for encontrado. Por exemplo, se o nome do arquivo .asp solicitado for Hello.asp, o nome do arquivo .htm retornado será Hello_asp.htm. Se o arquivo não for encontrado, um erro 500.13 (Servidor muito ocupado) HTTP será retornado ao cliente. O erro também será retornado se o valor for definido para False. O valor padrão do atributo é True.

Habilitar Caminhos Pai [enableParentPaths]
Especifica se uma página ASP permite ou não caminhos relativos ao diretório atual (usando a notação "...\") ou acima do diretório atual. O padrão é False.

Intervalo de Teste da Conexão Cliente [queueConnectionTestTime]
Especifica o período de tempo em que uma solicitação deve ser enfileirada. Caso a solicitação seja enfileirada além do tempo especificado, o ASP determina se o cliente ainda está conectado antes da execução da solicitação. Se o cliente não estiver mais conectado, a solicitação não será processada e será excluída da fila. O padrão é 00:00:03 segundos.

Limite Máximo do Corpo de Solicitação [maxRequestEntityAllowed]
Especifica o número máximo de bytes permitidos no corpo da entidade de uma solicitação ASP. O padrão é 200000 bytes.

Comprimento da Fila [requestQueueMax]
Especifica o número máximo de solicitações ASP simultâneas permitidas na fila. O padrão é 3000.

Tempo Limite da Fila de Solicitações [queueTimeout]
Especifica o período de tempo durante o qual um uma solicitação de script ASP tem permissão para aguardar na fila. O padrão é 00:00:00 (infinito).

Limite de Armazenamento em Buffer da Resposta [bufferingLimit]
Define o tamanho máximo do buffer ASP. Se o buffer de resposta estiver ativado, essa propriedade controlará o número máximo de bytes que uma página ASP poderá gravar no buffer de resposta antes que ocorra uma liberação. O padrão é 4194304 bytes.

Tempo Limite do Script [scriptTimeout]
Especifica o tempo padrão durante o qual as páginas ASP têm permissão para serem executadas antes da tentativa de parada do script e de gravação de um evento no log de eventos do Windows. O padrão é 00:01:30 minutos.

Limite de Threads por Processador [processorThreadMax]
Especifica o número máximo de threads de trabalho por processador que o IIS pode criar para executar solicitações ASP. O padrão é 25.

ID da Localidade [lcid]
Define o identificador da localidade padrão (LCID) de um aplicativo. Os LCIDs definem quais serão os formatos de data, hora e moeda. O padrão é 1033, que representa inglês dos EUA (en-us).

Reiniciar ao Alterar a Configuração [enableApplicationRestart]
Determina se um aplicativo ASP pode ou não ser reiniciado automaticamente quando é feita uma alteração nas propriedades de configuração críticas do aplicativo. O padrão é True.

Calcular Números da Linha [calcLineNumber]
Especifica se o ASP deve ou não calcular e armazenar o número de cada linha de código executado para que o número possa ser fornecido em um relatório de erro. O padrão é True.

Capturar Exceções do Componente COM [exceptionCatchEnable]
Especifica se as páginas ASP interceptam exceções acionadas por componentes. Caso definida para False, a página ASP não captura exceções acionadas pelo componente. Isso pode ocasionar a manipulação da exceção por outra camada do processo, como VB Script ou o processo de trabalho do IIS (que normalmente encerra o processo de trabalho). O padrão é True.

Habilitar Depuração no Lado do Cliente [appAllowClientDebug]
Especifica se a depuração no lado do cliente ASP está habilitada. O padrão é False.

Habilitar Solicitações de Erro em Log [logErrorRequests]
Controla se o servidor Web grava erros ASP na seção do aplicativo do log de eventos do Windows. Por padrão, os erros ASP são gravados no navegador cliente e nos arquivos de log do IIS. O padrão é True.

Habilitar Depuração no Lado do Servidor [appAllowDebugging]
Especifica se a depuração ASP está habilitada no servidor. O padrão é False.

Registrar Erros no Log do NT [errorsToNTLog]
Especifica se os erros ASP são gravados no log de eventos do Windows. Por padrão, os erros ASP são gravados no navegador cliente e nos arquivos de log do IIS. O padrão é False.

Executar ao Encerrar Funções Anonimamente [runOnEndAnonymously]
Especifica se as funções SessionOnEnd e ApplicationOnEnd ASP globais devem ser executadas como usuário anônimo. Caso definidas para False, as funções não são executadas. O padrão é True.

Criar Script para Mensagem de Erro [scriptErrorMessage]
Especifica a mensagem de erro a ser enviada para o navegador caso nenhum erro de depuração específico seja enviado ao cliente. A mensagem padrão enviada é "Erro no servidor ao processar a URL. Contate o administrador do sistema."

Enviar Erros para Navegador [scriptErrorSentToBrowser]
Especifica se o servidor Web grava as especificações de depuração (nome do arquivo, erro, número da linha, descrição) no navegador do cliente, além de registrá-las no log de solicitações do IIS. O padrão é True.

Linguagem do Script [scriptLanguage]
Especifica a linguagem do script padrão para todos os aplicativos ASP executados no servidor Web. O padrão é VBScript.

Caminho de Diretório do Cache [diskTemplateCacheDirectory]
Contém o nome do diretório usado pelo ASP para armazenar modelos ASP compilados no disco depois do estouro do cache da memória. O padrão é raiz_do_sistema\inetpub\temp\Modelos ASP Consolidados.

Habilitar Armazenamento em Cache da Biblioteca de Tipos [enableTypelibCache]
Especifica se as bibliotecas de tipos são armazenadas no servidor. O padrão é True.

Máximo de Arquivos Armazenados em Cache no Disco [maxDiskTemplateCacheFiles]
Especifica o número máximo de modelos ASP compilados que podem ser armazenados. O padrão é 2000.

Máximo de Arquivos Armazenados em Cache na Memória [scriptFileCacheSize]
Especifica o número dos arquivos de script previamente compilados em cache. Se for definido como 0, nenhum arquivo de script será armazenado em cache. Se estiver definido para 4291967295, todos os arquivos de script solicitados serão armazenados em cache. A propriedade é usada para ajustar o desempenho, dependendo da quantidade de memória disponível e do volume de tráfego dos arquivos de script. O padrão é 500.

Máximo de Mecanismos de Script Armazenados em Cache [scriptEngineCacheMax]
Especifica o número máximo de mecanismos de script que as páginas ASP manterão em cache na memória. O padrão é 250.

Habilitar Componente Lado a Lado [appServiceFlags]
Habilita assemblies COM+ lado a lado, que permitem que aplicativos ASP especifiquem a versão de um componente DLL ou COM do sistema a ser usado. O padrão é False.

Habilitar Controlador [appServiceFlags]
Habilita o controlador COM+, que permite aos administradores ou desenvolvedores depurarem aplicativos ASP. O padrão é False.

Executar em MTA [executeInMta]
Especifica se o ASP pode ou não executar scripts em um compartimento com vários threads. O padrão é False.

Respeitar Modelo de Threading do Componente [trackThreadingModel]
Especifica se o IIS examina o modelo de threading de todos os componentes criados pelo aplicativo. O padrão é False.

ID da Participação [partitionID]
Defina a propriedade para GUID da partição COM+. Quando a propriedade estiver definida, defina o elemento Usar Partição para True.

Componente Lado a Lado [sxsName]
Defina a propriedade para o nome do aplicativo COM+. Quando a propriedade estiver definida, defina o elemento Habilitar Componente Lado a Lado para True.

Usar Partição [appServiceFlags]
Isola aplicativos em partições COM+ próprias. Quando a propriedade estiver definida para True, você deve definir um valor para o elemento Identificação da Partição. O padrão é False.

Habilitar Estado da Sessão [allowSessionState]
Habilita a persistência de estado da sessão para o aplicativo. O padrão é True.

Máx. de Sessões [max]
Especifica o número máximo de sessões simultâneas a serem permitidas pelo IIS. O padrão é 2147483647.

Nova ID em Conexão Segura [keepSessionIdSecure]
Gera um novo cookie quando é feita uma transição de uma conexão não segura para uma segura. O padrão é True.

Tempo Limite [timeout]
Especifica o tempo durante o qual o objeto de uma sessão é mantido após a última solicitação associada ao objeto. O padrão é 00:20:00.


A tabela acima foi copiada do Help da janela de configurações ASP do IIS 7.5.

Recuperar Valor em Célula do GridView no RowUpdating

O exemplo descrito aqui apresenta uma página que contém um GridView contendo sete colunas. Na coluna cinco é apresentado o nome de um arquivo cadastrado e armazenado em uma pasta no diretório raiz da aplicação. No EditItemTemplate da referida coluna eu tenho os controles Label, que apresenta o nome do arquivo atualmente cadastrado, e FileUpload para permitir enviar outro arquivo que substituirá o arquivo atual. Ao substituir o arquivo atual no banco também será necessário apagar o arquivo antigo do disco. O código abaixo demonstra o uso do evento RowUpdating para executar todas as operações necessárias.


// Gravar o arquivo do modo de editar
protected void GridView2_RowUpdating(object sender, GridViewUpdateEventArgs e)
{
// Definir caminho do arquivo
string fileName = "";
string savePath = Server.MapPath("~/uploads/");
// Pegar nome do arquivo antigo
string antigoDocumento = ((Label)((GridView)sender).Rows[e.RowIndex].Cells[5].Controls[1]).Text;
antigoDocumento = string.Concat(savePath, antigoDocumento);
try
{
// Excluir arquivo antigo
if (File.Exists(antigoDocumento))
{
File.Delete(antigoDocumento);
}
// Verificar se existe arquivo no controle FileUpload e gravar em disco
if (((FileUpload)((GridView)sender).Rows[e.RowIndex].Cells[colunaArquivo].FindControl("FileUpload2")).HasFile)
{
fileName = ((FileUpload)((GridView)sender).Rows[e.RowIndex].Cells[colunaArquivo].FindControl("FileUpload2")).FileName;
savePath += fileName;
((FileUpload)((GridView)sender).Rows[e.RowIndex].Cells[colunaArquivo].FindControl("FileUpload2")).SaveAs(savePath);
//FileUpload1.SaveAs(savePath);
}
// Atribuir o nome do arquivo a coleção e.NewValues para a atualização do registro no DataTable
e.NewValues["DOCTO"] = ((FileUpload)((GridView)sender).Rows[e.RowIndex].Cells[colunaArquivo].FindControl("FileUpload2")).FileName;
}
catch (Exception ex)
{
lblErro3.Text = "Ocorreu um erro: " + ex.ToString();
}

}

Uso do Translate do Oracle

Recebi uma solicitação de um cliente da empresa manifestando problemas com o recurso de recuperar senha do site. Quando os usuários entravam com as informações pessoais para cadastrar uma nova senha, todos os nomes que apresentavam acentuação apresentavam problemas. A solução foi fazer uma função que acertava as informações alterando os caracteres com acentos para que ficassem sem acentos. Mas ainda foi preciso usar a função Translate do Oracle (banco de dados usado na aplicação em questão) para evitar problemas caso alguma informação estivesse com acentuação no banco de dados. Desta forma a validação acontecerá nos dois lados, na entrada de dados do usuário no formulário e no banco de dados.
A função para a validação no formulário de entrada de dados do cliente foi a seguinte:

function LimparString(txt)

Dim xc, xs, saida, posicao, caract, X
xc = "àáâãäèéêëìíîïòóôõöùúûüÀÁÂÃÄÈÉÊËÌÍÎÒÓÔÕÖÙÚÛÜçÇñÑ'"
xs = "aaaaaeeeeiiiiooooouuuuAAAAAEEEEIIIOOOOOUUUUcCnN"
saida = ""
If txt <> "" then
For X = 1 To Len(txt)
caract = Mid(txt,X,1)
posicao = InStr(xc,caract)
If posicao > 0 Then
caract = mid(xs,posicao,1)
end if
saida = saida & caract
Next
LimparString = saida
End If
end function

...

E a string sql com o Translate ficou assim:

strSQL = "select CodProfissional from prof where NumCartao = '"&numeroCartao&"' and translate(NomeCliente,'ãáéêíóõúçÃÁÉÍÓÕÚÇãáéêíóõúçÃÁÉÍÓÕÚÇ','aaeeiooucAAEIOOUC') = '"&nomeCompleto&"' and Cpf = "&cpf&" and DataNascimento = to_date('"&sortDate(dataNascimento)&"') and translate(NomeMae,'ãáéêíóõúçÃÁÉÍÓÕÚÇãáéêíóõúçÃÁÉÍÓÕÚÇ','aaeeiooucAAEIOOUC') = '"&nomeMae&"'"

O funcionamento do Translate substitui cada caracter do segundo parametro, pelos respectivos caracteres do terceiro parametro, na string do campo do primeiro parametro.

Visão geral do Log4net

Ferramenta para gerar log em aplicações .net Log4net

Uma aplicação de tamanho médio pode gerar milhares de linhas de request para logs e com isto muito esforço também é feito para medir o impacto e custo de fazer o log. Log4net pretende ser rápido e flexível.
O usuário precisa estar ciente das seguintes questões de performance:
1. A performance de loggin quando ele é desativado. Quando o loggin é desativado por inteiro ou apenas para um conjunto de níveis, o custo de requisição de log consiste de uma invocação de método mais uma comparação de inteiros.
Entretanto, a invocação do método envolve um custo escondido da construção do parametro.
Por exemplo, para alguns logs, escrevendo,
log.Debug("Número: " + i + " é " + entry[i].tostring();
incorre no custo de construir a mensagem parametro, convertendo ambo, inteiro i e entry[i] para strings, e concatenando strings intermediários, independente se a mensagem será feito log ou não. Este custo de construção de parametro pode ser forte e depende do número e tipo de parametros envolvidos.
Para enviar o custo de construção de parametros escreva:
if(log.IsDebugEnabled)
{
log.Debug("Entry number: " + i + " is " + entry[i].ToString());
}

FileAppender e RollingFileAppender
Estes appenders escrevem mensagens de logs em arquivos. Uma configuração típica para um FileAppender pode parecer com a seguinte:






Segue abaixo um resumo das configurações de atributos mais comuns para FileAppender:
- file: o caminho completo ou relativo para o arquivo de log;
- appendToFile: um campo booleano que indica se o arquivo de log será incrementado (true) ou sobrescrito (false). Se falso, o arquivo será sobrescrito na inicialização do log4net. Caso não seja especificado, o log será incrementado.
- immediateFlush: valor booleano indicando se é para o arquivo de log TextWriter depois de cada mensagem de log ser escrita. O padrão é true (enviar cada mensagem depois de ser gerada);
- lockingModel: permite a você controlar se o arquivo de log estará travado durante a execução da aplicação.
É indicado não usar o FileAppender e sim o RollingFileAppender. O arquivo de log gerenciado por FileAppender permite o crescimento do arquivo sem limites. O RollingFileAppender permite um gerenciamento básico do arquivo, configurando size- ou date-boxing do arquivo de log.









Existem diversas configurações para o RollingFileAppender:
> rollingStyle: controla como os arquivos de log são elaborados, e pode ser um dos seguintes valores:
- Once: o arquivo de log é recriado todas as vezes que o log4net é inicializado (tipicamente quando a aplicação é iniciada);
- Size: o arquivo de log é recriado quando atinge um tamanho determinado;
- Date: o arquivo de log é recriado com base na data atual;
- composite: o arquivo de log é recriado com base nos limites de tamanho e na data atual;
> maximumFileSize: a capacidade do arquivo de log. É uma expressão de tamanho no formato "#(KB|MB|GB)". Por exemplo "100KB" ou "10MB";
> maxSizeRollBackups: o número máximo de backups de arquivos de log. Indica o número máximo quando o rollingStyle é SIZE; quando o rollingStyle é COMPOSITE, isto indica o máximo número de roll-offs mantidos por dia; Esta propriedade não tem efeito quando rollingStyle é ONCE ou DATE;
> datePattern: é usado para recriar arquivos com base em datas. o valor deste parametro precisa aderir ao formato usado pela classe SimpleDateFormat;
> staticLogFileName: se true esta opção indica que o arquivo de log receberá todos os registros de maneira incremental sendo o backups através de cópias. E se false indica que o log4net irá gravar no último arquivo de log (ex: log-file1.txt, log-file2.txt..);
> countDirection: indica como a numeração de roll-off dos arquivos é gerenciada. Quando o parametro for >=, haverá uma numeração incremental no nome do arquivo, ex: log-file.txt.1, log-file.txt.2, etc..
Lembre que quando usar o file appender, o usuário executando o processo de logging precisa de premissões de escrita e/ou modificação para arquivos de log. Além disso, o arquivo de log será criado caso não exista mas não será criado o diretório informado caso não exista. E caso o file appender não seja criado a aplicação funcionará sem problemas.
Utilizando Múltiplos Appenders
usar múltiplos appenders é uma tarefa simples de especificar cada appender no root logger, como no exemplo abaixo:





Você pode utilizar quantos appenders quiser, sabendo que cada appender irá usar mais processamento.

------------------
Exemplos de Log4net criados durante teste:






Visão geral sobre o Windows 7

Instalei o Windows 7 Professional em português há alguns dias e estou muito satisfeito com a nova interface, desempenho e novos recursos. Entre as principais diferenças estão os botões da barra de tarefas, que agora adotam um novo paradigma - os botões dos aplicativos podem ser fixados e desafixados da barra de tarefas. O novo conceito dos botões também apresenta as seguintes características: os botões ficam do mesmo tamanho e quando o aplicativo está aberto podemos visualizar uma transparência destacando o botão na barra de tarefas. Quando existirem várias janelas abertas de um mesmo aplicativo serão observados no botão, alguns contornos adicionais dando a idéia de abas. E ao passar o mouse sobre os botões temos uma visualização da miniatura da janela do aplicativo, ou aplicativos, caso existam várias jánelas do programa abertas. A visualização ocupa uma faixa na parte inferior da tela, logo acima da barra de tarefas e ao passar o mouse sobre as janelas elas serão pré-visualizadas na área de trabalho também, podendo ainda clicar no botão fechar das miniaturas na mesma faixa de visualização. Outra característica interessante ainda é ter diversas opções do aplicativo disponíveis com o clique do botão direito sobre os respectivos botões, por exemplo, ao clicar com o botão direito do mouse sobre o ícone do MSN Messenger ativo na barra de tarefas, podemos trocar nosso status e acessar outros recursos.