sexta-feira, 13 de fevereiro de 2009
JPAjaxControlToolkit Release 0.5
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
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 “
- 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 “
- 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
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.
sexta-feira, 2 de maio de 2008
HierarchicalGridExtender - Um controle ASP.NET Ajax para adicionar hierarquia aos GridViews

Propriedades do HierarchicalGridExtender:
- TargetControlID: ID do objeto Image que deverá responder ao click do mouse e provocar o Collapse e Expand;
- PanelToCollapse: ID do objeto Painel que comporta o conteúdo a ser escondido e exibido;
- ImageURLCollapsed e ImageURLExpanded: URLs para configurar a imagem em TargetControlID quando o painel estiver escondido e exibido, respectivamente.
Alguns pontos importantes a considerar:
- O HierarchicalGridExtender deve ser colocado em uma coluna do GridView, no caso, uma TemplateField;
- O HierarchicalGridExtender não é um grid para substituir o GridView, ele apenas adiciona um comportamento ao GridView existente na framework. Você não precisa se preocupar em substituir os objetos GridView que já possui em sua aplicação, basta adicioná-lo ao GridView conforme item anterior;
- O HierarchicalGridExtender não é um controle visual. Você pode configurar o seu GridView, Image, Panel e quaisquer outros objetos contidos neste com suas cores, comportamentos e demais recursos existentes, da mesma maneira que faz normalmente;
- O Panel em PanelToCollapse pode conter qualquer conteúdo, inclusive outro GridView, o que permite um design bem interessante como o mostrado na figura abaixo:

- Faço a consulta de todos os dados montando um DataSet e seus relacionamentos;
- Coloco este DataSet em uma variável local da página;
- No GridView externo faço o bind com a tabela pai;
- No evento RowDataBound do GridView externo eu utilizo os métodos disponibilizados pelo próprio DataSet para retornar os “registros filhos”.
Exemplo:
Dim gvConsultasFilhas As GridView = CType(e.Row.FindControl("gvConsultasFilhas"), GridView)
gvConsultasFilhas.DataSource = _dsConsultasPendentes.FLX_Fluxo.Rows.Find(e.Row.DataItem("FLX_Codigo")).GetChildRows("FluxoFluxoFilho")
gvConsultasFilhas.DataBind()
Você também pode querer ocultar a imagem e desabilitar o HierarchicalGridExtender quando não houver registros filhos.
Exemplo:
If gvConsultasFilhas.Rows.Count = 0 Then
CType(e.Row.FindControl("hgeExpandir"), DPRAjaxControlToolkit.DPRAjaxControlToolkit.HierarchicalGridExtender).Enabled = False
CType(e.Row.FindControl("imgIcone"), WebControls.Image).Visible = False
End If
Estas foram apenas algumas dicas de uso do HierarchicalGridExtender porém, como ele foi projetado para dar total flexibilidade no desenvolvimento, você pode usá-lo de variadas maneiras em diferentes problemas.
Melhorias neste controle podem ser sugeridas. Prometo estudar cada uma e verificar sua viabilidade, porém não garanto a implementação das mesmas nem o prazo para tal, logo fiquem a vontade para modificar o componente. Caso também queiram compartilhar uma melhoria feita no controle, podem contatar-me que terei prazer em adicionar e compartilhar tal melhoria.
Até o próximo post.
Download: www.codeplex.com/jpajaxcontroltoolkit
quarta-feira, 23 de abril de 2008
Copiando um diagrama do SQL Server 2005 para outro banco de dados
A muito tempo não atualizo o blog e em conseqüência disso creio que perdi o público que havia conquistado.
Pena... meu público já estava em quase 3 pessoas. :-)
O blog é para mim, além de uma ferramenta de distribuição de conhecimento, uma ferramenta de preservação de conhecimento.
Isto quer dizer que eu o uso como uma biblioteca para referência futura e o post de hoje tem basicamente este último objetivo.
Antes de seguir uma das dicas aqui apresentadas, é importante que a estrutura do banco de dados de destino esteja igual ao banco de origem, pelo menos as tabelas que fazem parte do diagrama que se quer importar.
Segue script que encontrei prontinho em C# articles and tutorials on SharpDeveloper.NET:
use Old_Database
go
--this will copy your database diagrams into a temporary table
select * into dbo.#tempsysdiagrams from sysdiagrams
use New_Database
go
insert into sysdiagrams ([name],principal_id,version,definition)
select [name],principal_id,version,definition from dbo.#tempsysdiagrams where [name] = 'Name_of_your_Diagram'
O script acima usa uma tabela temporária para armazenar o conteúdo da SysDiagrams do banco de origem e, após mudar para o banco de destino, realizar o insert neste.
Em meu caso os bancos estavam em servidores diferentes, logo precisei usar o nosso amigo Integration Services (ferramenta ETL do SQL Server 2005).
O caminho mais curto para realizar esta exportação/importação é clicar com o botão direito do mouse no banco de origem ou destino e selecionar “Tasks” -> “Export Data” ou “Import Data”, conforme o caso.
O importante aqui é lembrar que na tela “Select Source Table and Views” você deve selecionar a tabela “SysDiagrams” e clicar no botão “Edit mappings”. Na tela que se abre, ignore o campo “diagram_id”. O resto vai funcionar perfeitamente.
Abraços e até o próximo post. Daqui a um ano. :-)
Brincadeira.
quarta-feira, 4 de julho de 2007
Entendendo, executando e agendando as atualizações do data warehouse do Team Foundation Server
Depois de quase um mês sem escrever para o blog, venho trazer uma dica muito boa para quem está trabalhando com o Team Foundation Server.
Após instalarmos o TFS e criar nossos primeiros projetos percebemos que os relatórios exibidos nos portais dos projetos estavam desatualizados.
Antes de prosseguirmos com o artigo, dê uma olhada na figura abaixo. Ela representa como estão estruturados os bancos de dados do TFS bem como sua relação com o warehouse de onde os relatórios do Reporting Service acessam os dados.

Todo relatório do TFS possui em seu cabeçalho a informação “Last Warehouse Update” e percebemos que se iam vários dias sem que o warehouse fosse atualizado.
Após estudar mais a fundo a documentação do TFS descobri que, por padrão, o warehouse deveria ser atualizado automaticamente a cada 3.600 segundos, ou seja, 1 hora.
Para verificar o tempo deste agendamento, consulte a tabela _WarehouseConfig no banco de dados TFSWarehouse em seu servidor SQL Server do Team Foundation Server.
O campo RunIntervalSeconds informa a quantidade de segundos do agendamento.
Exemplo:
select * from _WarehouseConfig
Não aconselho alterar diretamente as tabelas dos bancos de dados do TFS. Caso necessitemos alterar a freqüência de execução da atualização do warehouse podemos fazer isso por meio dos web services expostos pelo TFS.
O web service responsável pelo gerenciamento do warehouse é o
http://localhost:8080/Warehouse/v1.0/warehousecontroller.asmx
e este web service expõe, dentre outros métodos, o método “ChangeSetting”.
Este método possui dois parâmetros: settingID e newValue.
Para alterar o intervalo de atualização do warehouse passe como parâmetros, respectivamente, RunIntervalSeconds e o número de segundos desejado.
Este web service também expõe o método “Run” que pode ser chamado a qualquer momento e não necessita de parâmetros. Ao executar este método as atualizações do warehouse são executadas imediatamente.
Caso você force a as atualizações do warehouse chamando o método “Run”, saiba que não necessariamente você terá seu portal de projetos atualizado imediatamente. Isto ocorre porque, por padrão, os relatórios do TFS no Reporting Service estão configurados para armazenar cache de 30 minutos. Isto quer dizer que, ou você aguarda no máximo mais meia hora para ver os novos dados ou altera as configurações do relatório desejado no Reporting Service.
Porém o problema pode não estar na execução do web method. Você chama o “Run” e tudo é atualizado normalmente só que esta atualização continua não acontecendo no intervalo de segundos configurado.
Este problema pode ser originado por várias razões. Aconselho uma visita a este link:
Troubleshooting the Data Warehouse
Também sugiro uma visita a How to: Use Web Services to Enable and Configure Trace for Team Foundation Server Components que orienta sobre como ativar o trace de um componente do Team Foundation Server.
Porém o nosso problema aqui era outro e não constava dos links que indiquei acima.
Quem realiza a atualização periódica do warehouse é um serviço do TFS chamado TFSServiceScheduler. Este serviço pode ser gerenciado pelo Services na área administrativa do Windows. Seu executável está localizado em <"diretório do TFS">
Dentro desta pasta existe também um arquivo de configuração chamado TFSServerScheduler.exe.config. No nosso caso, neste arquivo, existia uma tag de configuração chamada “BisDomainUrl”. Verificando a documentação percebi que esta tag deveria ser trocada por “TFSNameUrl”.
Apensas alterei esta chave e o agendamento começou a funcionar perfeitamente, de acordo com o tempo determinado pelo RunIntervalSeconds.
Por enquanto é só.
Até o próximo post.