sexta-feira, 25 de setembro de 2009

CustomValidator e PageMethods

Olá,

Hoje precisei utilizar uma rotina antiga criada por mim (ainda da época do ATLAS) para usar CustomValidator com PageMethods.

Acontece que, ao testar mais profundamente a página, encontrei alguns bugs oriundos do fato das chamadas serem assíncronas.
Não que minha rotina antiga não previsse isso, mas fazia um workarround (para não dizer gato) que falhava em algumas situações específicas.

Bom, após alguma pesquisa encontrei um artigo no CodeProject (http://www.codeproject.com/KB/ajax/SynchronousAJAX.aspx) que solucionava isto fazendo uma chamada síncrona ao servidor.
O código está abaixo e minha customização foi mínima, apenas para facilitar a utilização final:

// Chama um webmethod.
function GetWebValidationMethod(metodo, argumentos) {
var pagina = '<%=Page.Request.Url.AbsolutePath%>';
metodo = pagina + '\\' + metodo;
var result = GetSynchronousJSONResponse(metodo, argumentos);
result = eval('(' + result + ')');
return result.d;
}

// Realiza chamadas síncronas.
function GetSynchronousJSONResponse(url, postData) {
var xmlhttp = null;
if (window.XMLHttpRequest)
xmlhttp = new XMLHttpRequest();
else if (window.ActiveXObject) {
if (new ActiveXObject("Microsoft.XMLHTTP"))
xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
else
xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
}
// to be ensure non-cached version of response
url = url + "?rnd=" + Math.random();
xmlhttp.open("POST", url, false); //false means synchronous
xmlhttp.setRequestHeader("Content-Type", "application/json; charset=utf-8");
xmlhttp.send(postData);
var responseText = xmlhttp.responseText;
return responseText;
}

Para usar as rotinas, bastar seguir o exemplo abaixo para o script executado pelo CustomValidator:

function OnValidarFormatoCNPJCPF(source, args) {
var argumentos = '{"CNPJ":"' + args.Value + '"}';
args.IsValid = GetWebValidationMethod('ValidarCNPJ', argumentos);
}

Neste caso, os argumentos devem ser construídos como um objeto JSON e, ao chamar o método, passa-se o nome do webmethod e os argumentos.

Até a próxima, JP.

quinta-feira, 25 de junho de 2009

Windows 7 VHD Boot

Fala-se muito sobre a recurso de boot a partir de um VHD (disco virtual do Virtual PC e do Hyper-V) no Windows 7.
A maioria dos passos não é tão simples para usuários não familiarizados uma vez que usa as ferramentas diskpart, imagex e bcdedit que não possuem interface gráfica, exigindo, assim, o uso do prompt de comando.

Encontrei no site da Microsoft uma demonstração passo-a-passo, em um vídeo de pouco mais de 20 minutos, que vale muito a pena assistir.

http://www.microsoft.com/downloads/details.aspx?FamilyID=80EDE31D-3509-407B-A896-0BEEA8705589&displaylang=en

terça-feira, 12 de maio de 2009

Split e join de strings em T-SQL

Olá,

Um das maiores necessidades dos desenvolvedores que trabalham com T-SQL é o de passar uma string com separadores como parâmetro em uma stored procedure, por exemplo, e usá-la como argumento em uma cláusula where como um conjunto, utilizando a palavra reservada IN.

A necessidade inversa também é importante, ou seja, concatenar o resultado de um campo de uma select em uma string separada por um determinado delimitador.

Estas tarefas, tão comuns em qualquer linguagem de programação, são também conhecidas como split e join.

Para executá-las em T-SQL, existem várias maneiras e muitos já postaram milhares de modos, no entanto, segue minha contribuição que creio ser uma das mais simples e eficientes pois usa dos recursos de XML do T-SQL para seu fim.

Para fazer o split:

DELCARE @string VARCHAR(200)
SET @string = '124, 456, 789, 121212, 3256 '
DECLARE @xmlAuxiliar XML
SET @xmlAuxiliar = '' + REPLACE(@string, ',', '') + ''
SELECT x.i.value('.', 'INT') FROM @xmlAuxiliar.nodes('//i') x(i)

Observação: pode-se substituir o INT da última instrução por outro tipo, como VARCHAR. Neste caso a lista seria algo como 'João, Pedro, Marcos, Lucas'

Para fazer o join:

SELECT NomeDoCampo + ', '
FROM NomeDaTabela
FOR XML PATH('')

Observação: seu separador pode ser outro que não ', '. Caso o retorno do campo não seja um tipo caractere, é necessário converter.

Abraços e até a próxima.

sexta-feira, 13 de fevereiro de 2009

JPAjaxControlToolkit Release 0.5

Bom, tomei coragem.

Finalmente abri meu Visual Studio, realizei um build completo e mandei a DLL para o CodePlex.
Demorou e neste longo tempo quem queria algum dos componentes tinha de baixar o código e compilar por conta própria.
Isto não é nada que se espere de um componente que você quer baixar e sair usando, até porque a necessidade à qual ele vai ser útil muitas vezes é "para ontem".

Agora deixe-me justificar: não queria colocar uma DLL incompleta, pois queria pelo menos que os três componentes prometidos estivessem nela.
Também não queria um código instável, mesmo sabendo que poderia liberar uma versão alfa, beta, etc.

De toda forma é isso que quero com este post: anunciar a liberação de um release para o JPAjaxControlToolkit e agradecer às 427 pessoas que se interessaram pelo projeto, àquelas que baixaram seu código e, principalmente, àquelas que deram algum feedback.

http://www.codeplex.com/jpajaxcontroltoolkit

Abraços, JP.

segunda-feira, 2 de fevereiro de 2009

Alterando a URL padrão da tela de login do Team System Web Access

Olá pessoal,

Venho hoje expor um pequeno problema (e solução, claro!) que surgiu quando estava montando um ambiente completo para o Team Foundation Server (TFS), incluindo o TFS, um TFS proxy, um TFS Build e instalação do TFS Web Access.

Como instalei o TFS Web Access em um servidor diferente do servidor do Team Foundation, ao entrar no Web Access era apresentada a tela de login com o campo “Team Foundation URL” preenchida, por padrão, com o nome do servidor diferente do servidor do Team Foundation.

Após pesquisas rápidas, vejam o que encontrei:

1 – Para mudar o nome padrão do servidor do TFS na tela do login do Web Access:

- Edite o arquivo “web.config” que está no caminho “\Microsoft Visual Studio [2005 ou 2008] Team System Web Access\Web”.
- Em “tfServers” edite o nome do servidor e a porta.
- Caso queira, acicione outras tags “add” para outros servidores. Ao colocar mais de um endereço o login do Web Access vai exibir uma dropdown ao invés de um textbox. A ordem que eles aparecerão no dropdown é a mesma ordem que estão no arquivo de configuração.

2 – Para obrigar o usuário a usar sempre o mesmo servidor:

- Na pasta “\Microsoft Visual Studio [2005 ou 2008] Team System Web Access” entre em "Web\UI\Controls".
- Edite o arquivo “Login.ascx”.
- No elemento “tswa:EditableDropDown” altere sua propriedade “EditMode” para false.

Abraços e até o próximo post.

segunda-feira, 5 de janeiro de 2009

Um guia para qualidade em aplicações WPF

Olá a todos,

Quem quer ter o mínimo de sobrevivência (nem estou falando em sucesso) em nossa área não pode deixar de atualizar-se. Nosso caso especial é que estas atualizações não são periódicas, são constantes e, a todo instante, os mais “antenados” são bombardeados por informações de todos os lados.
E não adianta pensar: “Já que uso a plataforma Microsoft, vou esperar as novidades virem da Microsoft”. Isto é um grande engano. Primeiro porque as novidades na plataforma não são exclusivas da Microsoft e, em segundo lugar, só o conhecimento gerado diretamente pela empresa já deixa qualquer biblioteca tradicional comendo poeira.
O grande problema é que a velocidade e a quantidade de novas informações e tecnologias são grandes de tal forma que nos vemos estudando continuamente, preocupando-nos em saber “de tudo um pouco” e, volta e meia, esquecemo-nos de realizar um estudo mais profundo de algumas tecnologias que vêem (ainda no português do ano passado) para ficar.
Periodicamente devemos reservar um espaço para refletirmos sobre tudo o que temos aprendido e verificar se existe alguma coisa que negligenciamos nesta caminhada e que valha a pena um aprofundamento. É ai que mora a qualidade, pois não basta aprender a fazer. Tem-se que aprender a fazer bem feito.
Nesta esteira venho apresentar um excelente guia de qualidade para aplicações WPF. Tal guia foi escrito pelo próprio time de desenvolvimento do WPF.
Além de indicar boas práticas no desenvolvimento destas aplicações, o guia traça um roteiro completo de como realizar testes nestas aplicações, principalmente no que se refere aos testes automatizados, o que de certa forma sempre foi uma carência para desenvolvedores “não-ASP.Net”. O guia aborda os vários aspectos dos testes, dentre outros: de interface com o usuário, de desempenho, de segurança, de globalização e localização, de acessibilidade e de stress.

WPF Application Quality Guide
http://windowsclient.net/wpf/white-papers/wpf-app-quality-guide.aspx

Fecho este post informando que terminei meus últimos testes com o RSAEncryptExtender e, no máximo até amanhã a noite, disponibilizarei no CodePlex pelo link http://www.codeplex.com/jpajaxcontroltoolkit.

Abraços, JP.

sexta-feira, 25 de julho de 2008

JPAjaxControlToolkit no CodePlex

Olá a todos,

Dando continuidade à evolução da biblioteca de controles AJAX que estou desenvolvendo, publiquei-a no CodePlex a fim de melhorar a distribuição, versionamento e colaboração entre os interessados.

O projeto foi publicado com o nome JPAjaxControlToolkit sob a licença BSD.
Escolhi a “New BSD License” pois não tenho qualquer pretensão de restringir o acesso e distribuição de seu código fonte, bem como sua utilização em projetos comerciais (este último, restrito pela licença GPL).

O endereço do projeto é http://www.codeplex.com/jpajaxcontroltoolkit e, além do download de releases, terei um canal de comunicação com os usuários para discussões, aviso sobre bugs e solicitação de funcionalidades. O projeto também pode ser acessado via Visual Studio por meio do Team Foundation Server Explorer pelos colaboradores.

Inicialmente a biblioteca terá três componentes: HierarchicalGridExtender, WizardSideBarExtender e RSAEncryptExtender.

  • O HierarchicalGridExtender já foi explicado em um post do dia 2 de maio (http://jpdotnet.blogspot.com/2008/05/hierarchicalgridextender-um-controle.html).
  • O WizardSideBarExtender está disponível no projeto do CodePlex mas vou escrever sobre ele aqui no blog no próximo post. Seu objetivo é bem simples: proporcionar ao usuário do controle Wizard do ASP.Net a possibilidade de posicionar sua sidebar no topo, no rodapé, a direita ou a esquerda do Wizard, sendo esta última opção a única possível originalmente no controle da framework.
  • Já o RSAEncryptExtender é um controle que estende uma TextBox a fim de criptografar seu conteúdo antes de enviar para o servidor HTTP. A criptografia é feita em JavaScript e a decriptografia é feita no lado do servidor usando as classes de segurança da framework. Esta solução é extremamente útil quando utilizamos, por exemplo, autenticação Forms sem SSL. Neste caso pode-se criptografar o campo senha que o usuário digitou no browser antes de enviá-la ao servidor.

Creio que o RSAEncryptExtender seja meu controle mais complexo até agora e, por isso mesmo, preciso terminar alguns testes antes de publicar uma versão minimamente estável. Estou testando em um de nossos sistemas e em breve disponibilizarei seu código e um post explicando sua utilização.

Bom, por enquanto é isso ai.

Aguardem o próximo post com exemplo de uso do WizardSideBarExtender.

Abraços, JP.