quinta-feira, 4 de fevereiro de 2010

Solução simples para problema de exibição do web control asp:menu

Para resolver o problema de exibição do controle asp:menu quando visualizado através do navegador Internet Explorer 8. Existem dois públicos diretamente envolvidos com este problema: os visitantes das páginas que utilizam este browser; e os criadores do site.

A solução para os visitantes do site
Quando estamos visualizando as páginas a única maneira de contornar o problema é clicar no botão Modo de Compatibilidade (localizado ao lado direito da barra de navegação). Ao clicar neste botão a página será recarregada mas desta vez o Internet Explorer 8 está funcionando como se fosse a versão 7.

A solução para os desenvolvedores de web sites
A solução é simples: crie um estilo que atribua o valor 1 a propriedade z-index do web control (asp:menu). Como no exemplo abaixo:

.adjustedZIndex
{
z-index: 1;
}

E em seguida atribuir o nome do estilo (adjustedZIndex) à propriedade CssClass do controle asp:menu. Como no exemplo abaixo:



domingo, 10 de janeiro de 2010

Atribuindo Parametros a um DataSource Programaticamente

Utilizo a rotina abaixo para atribuir parâmetros a um DataSorce (ex: AccessDataSource) programaticamente. Neste exemplo estou passando o texto localizado na célula e.Row.Cells(0).Text do GridView.

Protected Sub GridView2_RowDataBound(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewRowEventArgs) Handles GridView2.RowDataBound
If e.Row.RowType = DataControlRowType.DataRow Then

Dim s As SqlDataSource = CType(e.Row.FindControl("DS_Produtos"), SqlDataSource)
s.SelectParameters(0).DefaultValue = e.Row.Cells(0).Text


End If
End Sub

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.

domingo, 2 de agosto de 2009

DropdownList has a SelectedValue which is invalid because it does not exist in the list of items

O erro abaixo é causado quando a página contém um controle DropdownList preenchido com datasource, e um dos registros na tabela principal não possui registro na tabela relacionada.

DropdownList has a SelectedValue which is invalid because it does not exist in the list of items.

A solução que adotei foi incluir o parametro AppendDataBoundItems="True" para que seja possível adicionar itens novos ao controle DropDownList e uma rotina de tratamento no evento onDataBound do controle (ondatabound="ddlOrigem_DataBound") que executa uma verificação de existência do registro que será atribuído o estado de selecionado. Repare que através do try catch é possível evitar a apresentação de mensagens de erro.

Veja o código da função abaixo:

protected void ddlOrigem_DataBound(object sender, EventArgs e)
{
FormView fv = frmEditar;
DropDownList ddl = (DropDownList)fv.FindControl("ddlOrigem");

ddl = sender as DropDownList;
ddl.SelectedIndex = 0;
try
{
ddl.SelectedValue = ((GetDataItem() as DataRowView).Row["Conteudo_OrigemID"]).ToString();
}
catch { }
}

segunda-feira, 20 de julho de 2009

Instalando o Internet Explorer 8

Para instalar o IE8 primeiramente acesse a página do portal MSN da Microsoft. Em seguida clique no banner disponibilizado logo abaixo do logotipo. A barra contém um botão com os dizeres: Baixe agora. É gratis!

Depois de clicar será exibida a caixa Salvar Como onde você deverá selecionar o local onde o arquivo de instalação ficará armazenado. O arquivo possui pouco mais que 20MB e depois do download estar concluído execute o programa. Clique em avançar até aparecer o botão concluir. Será necessário reiniciar o computador.

Ao abrir o IE8 depois de reiniciar a máquina, será exibida a janela Configurar o Windows Internet Explorer 8 já falando sobre os novos recursos como a recuperação de informações das sugestões de pesquisa enquanto digita e os Aceleradores, que permitem a você visualizar os serviços online apenas apontando o mouse para eles. Existe ainda um link para uma página de explicações dos recursos.


Ao clicar em Avançar o assistente pergunta se você deseja ativar a sugestão de sites relacionados aos sites que você navega.


No próximo passo será solicitado que você escolha se o Internet Explorer 8 utilizará as configurações pré-determinadas sobre a pesquisa de atualizaçõies, filtro de SmartScreen e modo de exibição de compatibilidade, ou determinar as configurações manualmente.


Para ver mais informações nada melhor do que o próprio site do Internet Explorer no url http://www.microsoft.com/portugal/windows/internet-explorer/welcome/tour.html e também http://www.microsoft.com/portugal/windows/internet-explorer/welcome.aspx.


Vou criar mais artigos sobre o IE8 em breve.

sexta-feira, 17 de julho de 2009

Apresentação do mundo ASP.NET ao Desenvolvedor PHP

Tópicos abordados: Comparando as Arquiteturas, Diferenças de Linguagens, Acesso a Dados e Quando Migrar de PHP para ASP.NET

Serão abordados diversos assuntos sobre os tópicos analisados.

  • Comparando as Arquiteturas
    • Desafios: medos do desenvolvedor php com custos, compilação de código, questões sobre multi-plataforma, conexões com bancos de dados e código aberto;
    • O primeiro medo em relação a Microsoft é o custo de utilizar produtos originais licenciados;
    • Também é abordado o tema da compilação através do código gerenciado diferente da antiga compilação Win32;
    • Será mostrado em quais plataformas as aplicações serão executadas;
    • Existe a questão do código aberto;
  • Comparação entre as arquiteturas:
    • O PHP é gerado pelo servidor Apache com mod_php, enquanto o ASP.NET é gerado pela combinação do IIS com o ASP.NET;
    • Existe a opção de rodar ASP.NET sob Apache com a utilização de componente;
    • A camada de negócios do ASP.NET é bem definida e conta com recursos de orientação ao objeto enquanto o PHP normalmente não apresenta camada de negócios bem definida, ficando a maior parte da lógica da negócios dentro da camada de apresentação do site;
    • O ASP.NET possui suporte para providers diversos com recursos especiais para o SQL Server (conexão com qualquer banco de dados que suporte OLEDB ou ODBC) enquanto o PHP utiliza o banco de dados MySQL e outros;
    • A plataforma PHP roda sempre no mod_php dentro do servidor web Apache enquanto no asp.net temos toda a aplicação rodando dentro do servidor IIS, e temos uma separação da interface do código de programação, chamado code-behind, permitindo que seja possível que designers e programadores possam trabalhar paralelamente;
  • Camada de Negócio
    • O PHP embute na própria camada de interface ou em bibliotecas, como funções;
    • O ASP.NET possui camada de negócios isolada utilizando as linguagens C# e VB, e suportando mais de 50 linguagens, incluindo PHP;
  • A compilação do PHP com Zend Opcodes é pouco utilizada enquanto o ASP.NET executa uma compilação durante o primeiro acesso a página utilizando MSIL;
  • O ASP.NET possui ferramentas de debug nativas. O visual web developer é gratuito e possui todos os recursos do visual studio;
  • Quanto a sintaxe o PHP utilizáveis fracamente tipadas enquanto o ASP.NET trabalha com varáveis fortemente tipadas. O PHP suporte apenas a linguagem de programação PHP enquanto o ASP.NET dá suporte a diversas;
  • Quanto ao Gerenciamento de Estado o ASP.NET oferece outras formas de armazenamento de informações de estado além do Session como Application, Cache e ViewState, enquanto o PHP dispõe apenas de Session. O ViewState por exemplo habilita o armazenamento dos valores dos campos e respectiva recuperação automatica após qualquer postback;
  • A validação deve ocorrer tanto no cliente quanto no servidor. A validação no lado do servidor executada pelo PHP é realizada através de códificação no lado do servidor e no lado do cliente também é criada pelo desenvolvedor. No ASP.NET os controles de validação são automáticos. É necessário apenas arrastar o controle e indicar o controle que deverá ser validado tanto no cliente quanto no servidor;
  • O acesso a dados do ASP.NET é realizado com o ADO.NET que é o framework de acesso a dados do framework .net. Possui arquitetura de providers com acesso unificado a diversos sistemas gerenciadores de bancos de dados, trabalha de maneira conectada ou desconectada com a utilização dos DataSets que oferece os recursos para trabalhar localmente e fazer a sincronização com o banco de dados da aplicação. O ASP.NET também é fortemente tipado e assim oferece maior segurança e integridade para aplicação. E ainda o controle Connection Pooling que gerencia as conexões de dados existentes;
  • A biblioteca ASP.NET AJAX disponibiliza o suporte transparente ao AJAX e acesso rico aos controles AJAX através de javascript disponível na biblioteca asp.net ajax;
  • Para utilizar o ASP.NET AJAX basta acessar o endereço http://ajax.asp.net e baixar o ASP.NET 2.0 AJAX Extensions 1.0, fazer o download e instalar. E para utilizar os recursos do ASP.NET AJAX você pode criar um novo web site e selecionar o template ASP.NET AJAX-Enabled Web Site;

quinta-feira, 16 de julho de 2009

Off-Topic - Vídeo meu dropando com skate longboard

Sei que é um tópico fora do contexto mas afinal o blog é também é pessoal. Então para quem quiser me ver dropando umas ladeiras aqui perto de casa com um skate long seguem os links:


Novidades no Microsoft Word 2007

Tenho a intenção de criar artigos sobre tecnologias de diversas áreas e para diversos níveis de conhecimento em informática e tecnologias da informação. Em outras publicações abordei temas voltados para o desenvolvedor web, indiquei endereços de páginas, dicas sobre o windows, outlook, e dando continuidade, pretendo abordar nesta postagem, algumas informações sobre o programa editor de textos Microsoft Word 2007.


Não posso deixar de começar falando sobre a nova faixa de opções que traz uma nova abordagem de interface, tendo como característica a disponibilidade de dos botões de comando mais usados em cada grupo de comandos. A faixa é subdivida em guias cada uma enfatizando uma área principal de atividade, e em cada guia há grupos, exemplo Área de Transferência. Em cada comando também existem mais opções de formatação. Para exibir as caixas de diálogo é necessário apenas clicar no pequeno seletor localizado na barra de título de cada caixa de opções.


A mini barra de ferramentas é outro recurso que facilita a utilização de recursos do software. Ao selecionar objetos ou trechos de texto, a barra será exibida com transparência mas as opções serão destacadas assim que o mouse estiver sobre a mini barra.


Outra novidade importante é a barra de ferramentas de acesso rápido, que permite a inclusão de botões para que você tenha seus recursos mais usados sempre visíveis na tela. Para adicionar um botão na mini barra de ferramentas, clique com o botão direito sobre a barra e escolha a opção Personalizar a Barra de Ferramentas de Acesso Rápido.


Ao acessar o Word 2007 vemos em destaque o botão iniciar do Office localizado no canto superior esquerdo da janela. Este botão oferece os recursos iniciais para criar um novo documento, abrir documentos, acessar os últimos arquivos trabalhados, imprimir o documento, salvar cópia, preparar características de uso do documento, enviar o documento por email, publicar o documento em algum servidor, fechar o documento e ainda o acesso as opções de personalizar o Word.


Outra facilidade que ajuda muito na formatação de documentos é a caixa de estilos, que contém as formatações para aplicar a textos e títulos, agora também oferece o conjunto de estilos de formatação para documento a apenas um clique e esta facilidade de aplicação ajuda na hora de decidir qual a melhor opção.


Neste pequeno artigo falei sobre as novidades do editor de textos mais utilizado no mundo, o Microsoft Word na versão 2007.


terça-feira, 5 de maio de 2009

Erro de conflito da tag ScriptManager: System.Web.Configuration.ScriptingScriptResourceHandlerSection

Erro de conflito da tag ScriptManager, causado ao fazer a atualização do framework da aplicação de 2.0 para 3.5:

Unable to cast object of type 'System.Web.Configuration.ScriptingScriptResourceHandlerSection' to type 'System.Web.Configuration.ScriptingScriptResourceHandlerSection'.


Para solucionar insira as tags abaixo dentro da tag ... do arquivo web.config.


<assemblybinding xmlns="urn:schemas-microsoft-com:asm.v1">

<dependentassembly>

<assemblyidentity publickeytoken="31bf3856ad364e35" name="System.Web.Extensions">

<bindingredirect newversion="3.5.0.0" oldversion="1.0.0.0-1.1.0.0">

</dependentassembly>

<dependentassembly>

<assemblyidentity publickeytoken="31bf3856ad364e35" name="System.Web.Extensions.Design">

<bindingredirect newversion="3.5.0.0" oldversion="1.0.0.0-1.1.0.0">

</dependentassembly>

</assemblybinding>

</runtime>

sábado, 21 de março de 2009

Link correto para download do Internet Explorer 8

Ontem ví o anúncio do lançamento do Internet Explorer 8 e imediatamente fui ao google fazer uma busca digitando "download microsoft internet explorer 8". Encontrei o link http://www.microsoft.com/windows/internet-explorer/thank-you.aspx que em algumas tentativas NÃO funcionou. Procurei novamente e não encontrei nenhum link de download funcionando. Hoje estava vendo meus emails e havia uma mensagem do TechNet Brasil (Microsoft_TechNet@technetbrasil.com.br) contendo link para download funcionando, que segue: http://www.microsoft.com/brasil/windows/internet-explorer/default.aspx.

Descobrindo o serial de um programa instalado no seu computador

Precisei do número serial de um programa que eu tinha instalado em outra máquina, para fazer a reinstalação na máquina que formatei. Primeiramente fiz uma busca no google pesquisando por "como descobrir o número serial de um programa instalado", mas não consegui nada demais, um dos resultados dizia para olhar no menu Ajuda/Sobre o Programa. Mas nenhuma das idéias apresentadas adiantou. Decidi procurar pelo nome do aplicativo no registro do Windows e após diversos cliques para localizar próximo finalmente ví aparecer selecionado na tela a chave RegistrationKey, dentro da pasta SOFTWARE, dentro de HKEY_LOCAL_MACHINE. Fica a dica para quem se interessar.

terça-feira, 17 de março de 2009

Dicas de segurança para o Outlook 2003

Desative a pré-visualização de mensagens através do painel de visualização.

Esta é uma sugestão muito importante porque é relativamente simples criar um email contendo imagens que por serem carregadas da internet também entregam informações sobre sua localização na rede da internet. Existe a possibilidade de pessoas mal intencionadas utilizarem essas informações para fazer tentativas de ataque. É importante ressaltar que o firewall do windows xp protege seu computador de acessos vindos de fontes externas mas ao executar o carregamento da imagem da web você está dando permissão para que o endereço de ip do computador onde a imagem está armazenada para que ele tenha acesso a sua rede porque o firewall liberou o acesso devido a solicitação de exibição da imagem. Esta é uma das principais razões de ser bem difundida a idéia de que é muito mais seguro utilizar a configuração do programa de correio (outlook no caso) para que exiba somente informações de texto.

Para desativar o painel de visualização de emails:

1. Clique no menu Exibir
2. Aponte para Painel de Leitura
3. Clique sobre a opção Desativar

Confirme o endereço real do remente da mensagem.

O remente exibido na coluna De de sua caixa de correio é apenas um nome que pode ser personalizado da forma como o próprio remente quiser. Para enviar um email e aparecer o nome da Rede Globo como remente é necessário apenas configurar a sua conta de email no Outlook para que o campo Email esteja no formato de exemplo a seguir:

NomeQueVocêQuiser<\seuemail@seuprovedor.com.br>\



Para confirmar a identidade do remente:


1. Clique com o botão direito do mouse sobre a mensagem

2. Selecione a opção Opções...

3. Verifique o remente na primeira linha, semelhante ao exemplo a seguir: Return-Path: announce_pag@mailexploder.registro.br. O endereço acima confirma a autenticidade do remente através de sua terminação .registro.br.
Agora veja um exemplo onde a indentidade não confirma e que de fato caracteriza envio de spams e ataques que tem obtido muito sucesso através de estratégias de engenharia social na aplicação de golpes na internet: Received: from nobody by orion.1800dns.com with local (Exim 4.68).

Criar regras para excluir automaticamente mensagens de endereços específicos

O Outlook oferece recursos para criaçãod do que ele chama de regras de recebimento de e-mails.

As regras podem ser usadas para dizer ao Outlook para excluir automaticamente uma mensagem recebida de um endereço específico, ou excluir e-mails que contenham um determinado texto no conteúdo, ou ainda para ajudar a separar as mensagens por contas de correio e assim auxiliar na organização das mensagens.

Para criar regras no Outlook:

1. Clique com o botão direito sobre uma mensagem onde você quer aplicar uma regra;
2. Selecione a opação Criar regra...
3. Na caixa de diálogo Criar Regra selecione as opções disponíveis determinando quem vai causar a execução da regra e selecionando a ação a ser executada.

Configurações de segurança oferecedias pelo Outlook

O outlook disponibiliza diversos recursos de segurança que podem ser configurados na guia Segurança da caixa de diálogo Opções, acessada através do menu Ferramentas. As opções são de fácil compreenção mas vale lembrar que é neste local que podemos configurar o novo recurso do Outlook para proteção contra o problema de segurança em relação a imagens da internet que relatei anteriormente.

Usar javascript e asp para atualizar o listbox da janela parent usando window.opener

Usar javascript e asp para atualizar o listbox da janela parent usando window.opener


Vamos criar a seguinte situação para exemplificar a utilização de javascript em uma janela aberta com a utilização do comando javascript window.open, para atualizar valores em um listbox da janela principal.

Crie o arquivo produtos_adicionar.asp e insira um formulário com um campo do tipo listbox que será usado para você selecionar uma categoria a ser atribuída ao produto que está cadastrando.



Atribua o ID idcategoria para o listbox e insira código asp para gerar as opções do listbox relativas aos registros de categorias já existentes em seu banco de dados. O código asp para construir um listbox é muito simples mas vou colocar um exemplo:



Só tenho uma coisa a esclarecer no código acima: Utilizo a função AbreConexao() para criar a connectionstring e abrir o banco de dados.

Na janela que será aberta contendo as categorias será inserido o código para atualizar o listbox da janela parent utilizando window.opener do javascript. Segue abaixo o código:



Insira a chamada da função em uma tag para fechar a janela, por exemplo:

Fechar

Alguns comentários sobre o código:

A primeira coisa a ser feita é instanciar o listbox da janela parent usando:

var lstbox = eval("window.opener.document.forms[0].idcategoria");

Em seguida faça uma chamada a função clearlistbox passando o listbox como parâmetro para limpar as opções existentes antes de preencher o listbox com os valores atualizados.

clearlistbox(lstbox);

Para gerar os itens atualizados dentro da função populateList() foi utilizado um script ASP. O script faz uma consulta a tabela categorias de forma semelhante ao que foi feito na página parent citado anteriormente. Veja o trecho de código abaixo:



O script ASP acima vai gerar o código javascript necessário para criar e atribuir uma option para cada registro da tabela categorias no listbox instanciado pela variável lstbox.

Emitir beep na página com javascript

A tag bgsound é usada para ler um arquivo de áudio quando a página html é carregada. Esta tag possui as propriedades src para informar o local do arquivo de áudio, e loop que especifica o número de repetições. Um exemplo simples é < src= "temp.wav"> que carregará o arquivo de áudio temp.wav no carregamento da página. Outra forma de utilizar o recurso é disparar o som através de eventos em objetos da página, como no exemplo abaixo, onde ao passar o mouse sobre o link Hotspot o evento onmouseover atribui o arquivo beep.wav a tag bgsound.

Hotspot

Erro de acesso a sites existentes

Erro de acesso a sites existentes


Recebemos uma solicitação de suporte sobre um determinado endereço (URL) que o cliente não estava conseguindo acessar. Ao saber do problema, a primeira coisa que fizemos foi verificar que o site estava funcionando. Em seguida verificamos as configurações do menu Ferramentas do Internet Explorer, limpamos arquivos temporários e então verificamos que o site também não estava respondendo ao comando ping. Ao verificar o erro do ping tivemos certeza de que se tratava de falha na resolução de nomes (DNS). Abrimos o arquivo host que está na pasta windows\system32\drivers\etc e inserimos manualmente o ip e respectivo domínio do site que não estava disponível para o cliente e imediatamente o site funcionou.

Dicas sobre Redes: Computadores ligados em rede mas sem conectividade

Os computadores estavam trocando informações com teste do comando ping (ex: ping 192.168.1.1), mas ao tentar acessar o outro computador através do comando Executar no menu Iniciar era apresentada uma mensagem de erro de acesso. Normalmente verifico nome de computador e de grupo de trabalho ou domínio, seguido de testes de rede com o prompt. Depois de fazer as primeiras verificações e constatar que tudo estava correto abri Conexões de Rede no painel de controle e cliquei com o botão direito e selecionei propriedades. Na caixa de propriedades identifiquei imediatamente que faltava o cliente de redes Microsoft. Depois de instalar o clientes para redes Microsoft tudo funcionou sem problemas.

Erro de aplicativo ASP com banco de dados ACCESS (A operação deve usar uma consulta atualizável)

Erro de aplicativo ASP com banco de dados ACCESS


O erro (Microsoft JET Database Engine erro '80004005' A operação deve usar uma consulta atualizável / Operation must use an updateable query) é frequente nas seguintes situações:



  • Você utilizou a interface de dados do Office FrontPage2003 para criar sua interface de dados na página web;

  • Você configurou ASP.NET como tecnologia usada para conectar ao banco de dados;

  • O banco de dados está em um servidor web Windows 2003 com Internet Information Server (IIS);

  • O banco de dados usado como fonte de dados é ACCESS;


Este problema acontece quando um arquivo de dados do ACCESS é usado como fonte de dados para sua aplicação. Nestes casos será necessário garantir permissão de gravação para o arquivo.


Para aplicar as respectivas permissões faça o seguinte:



  1. Clique com o botão direito sobre o arquivo access (mdb) e escolha Propriedades;

  2. Clique na guia Segurança;

  3. Clique no botão Adicionar;

  4. Entre com o nome da conta: Autenticação NTLM e clique em OK;

  5. Marque o checkbox Gravar da coluna Permitir da caixa de diálogo propriedades de arquivo.mdb e clique em OK;


Pode testar novamente que vai funcionar.


Observação 1: No exemplo acima o ambiente operacional era em português. Para o inglês verifique o nome para a conta Autenticação NTLM no respectivo idioma.


Observação 2: Para acessar a página explicativa no site da Microsoft visite http://support.microsoft.com/kb/830977/en-us.

Função javascript atribuir css para destacar item de menu selecionado

Interagir com CSS usando Javascript dentro de páginas ASPX


A função abaixo é ativada no evento de load da página na tag . A função tem a finalidade de atribuir um estilo que destaca o link do menu que estiver com sua página exibida, exemplo, ao clicar no link Produtos a página produtos.aspx será exibida e seu respectivo menu deverá estar destacado com o uso de um estilo específico. A atribuição de estilos ao menu é realizada através da função javascript a seguir.


function ativarEstiloMenu () {

var ob = document.getElementById("menuprincipal");

var encontrou = false;

for(var CT = 0 ; CT < a =" ob.childNodes[CT].childNodes[0];"> -1) {

a.className = 'home';

encontrou=true;

} else {

a.className = '';

}

}

if (encontrou==false) {

qs=new Array()

variaveis=location.search.replace(/\x3F/,"").replace(/\x2B/g," ").split("&")

if(variaveis!=""){

for(i=0;i nvar=variaveis[i].split("=")

qs[nvar[0]]=unescape(nvar[1])

}

}



function QueryString(variavel){

return qs[variavel]

}

if ((!QueryString("id"))&&(!QueryString("idconteudo"))) {

var a = ob.childNodes[0].childNodes[0];

a.className='home';

} else {

var a = ob.childNodes[0].childNodes[0];

a.className='';

}

}

}