24 de nov. de 2008

Debugando projetos Intraweb, a forma fácil

Geralmente, projetos Intraweb vão ser usados em forma de DLL, e a maioria das pessoas começa seu projeto IW escolhendo ISAPI Extension no Application Wizard do IW. O problema com ISAPI é a dificuldade em debugar tais DLLs. Existem alguns truques que envolvem ISS, COM e outras parafernálias que funcionam, mas existe uma forma bem mais simples.

A "técnica" consiste em termos 2 projetos. O primeiro deles é a própria DLL, que vai ser a aplicação a ser distribuida. O segundo projeto é uma versão Stand Alone Server da DLL. O Stand Alone Server é um executável que já tras seu próprio webserver embutido, facilitado o processo de debug, já que não é necessário configurar nada.


Com os dois projetos, à medida que você cria novas units para a DLL, adicione-as ao projeto de teste (o Stand Alone Server). O contrário também é válido, e é o que eu costumo fazer. Crio as novas units no projeto de teste e vou adicionando ao projeto principal.

Para debugar, basta executar o projeto do Stand Alone Server a partir da IDE do Delphi/CBuilder e colocar seus breakpoints normalmente. O resto da história você já sabe.

Uma coisa importante é configurar os Outputs (Output Directory e Unit Output Directory) do projeto de teste para o mesmo diretório da DLL ISAPI, caso você tenha os 2 projetos em diretórios distintos (como é o meu caso). Dessa forma, alguma unit que você esqueça de adicionar ao projeto sempre será linkada com a última compilação, além de não termos DCUs duplicadas. Outra coisa é que você pode compartilhar arquivos entre os dois projeto (imagens, Templates, etc).

Crie também um Project Group e adicione seus dois projetos. Isso facilita na hora de compilar.

É isso aí, apenas uma pequena dica que pode ser útil pra muite gente.

Bom proveito.

19 de nov. de 2008

Diálogo OK - Cancel no Intraweb

Uma forma muito simples de adicionar uma caixa de diálogo OK - Cancel no Intraweb é usando a propriedade Confirmation do TIWButton.

Se você quer que o usuário confirme a execução de algum processo que vai ser disparado por um botão, basta escrever na propriedade Confirmation o texto que você quer que apareça na caixa de diálogo.

Quando o usuário clicar no botão, uma caixa de diálogo, como a do exemplo acima, é exibida. O evento OnClick do botão só vai ser executado se o usuário clicar no botão OK. O legal é que isso tudo é feito no browser, sem chamadas extras ao servidor.
Importante lembrar que isso só vai funcionar para o evento OnClick. Isso ainda não está implementado para o evento OnAsyncClick. Talvez num futuro release isso esteja disponível também para eventos assíncronos (é aqui aonde o Intraweb usa AJAX).
Bom proveito.

14 de nov. de 2008

Gerando scripts de inserção via SQL

Durante o desenvolvimento de uma aplicação, geralmente me deparo com a situação aonde preciso gerar uma série de inserts a partir de uma tabela ou tabelas do banco de dados.

Isso acontece por exemplo quando tenho que dar um drop numa tabela (por qq motivo) e eu não quero perder os dados que estão lá. Ou então quando tenho vários bancos de dados de testes e quero testar uma massa de dados que está em um banco em outro dos meus bancos de testes.

Eu não uso nenhuma ferramenta mágica para isso exceto o próprio SQL.

Vamos supor que temos uma tabela de nome Clientes com os campos Nome, Endereco, fone_01, fone_02 e fax. Essa tabela tem 500 registros e quero copiá-los para outro banco de dados. Podemos montar o SQL de inserção usando um select simples:

select 'insert into cliente (nome, endereco, fone_01, fone_02, fax) values (''' + nome + ''', ' + endereco + ''', ' + fone_01 + ''', ' + fone_02 + ''', ' + fax + '''); '
from cliente
where 
  fone_01 is not null

A partir daí, basta salvar o resultado (uma série de strings contendo seus inserts) em um arquivo texto e executar o script no outro banco.

Bom proveito

11 de nov. de 2008

Reduzindo o consumo da CPU em processos longos

Hoje me deparei com um problema um tanto comum para a maioria dos desenvolvedores. Uma de minhas aplicações rodando em um servidor de internet estava consumindo 100% da CPU do mesmo, quando em execução. Isso estava prejudicando o acesso das demais aplicações e degradando o sistema.

O objetivo da aplicação é ler uma base de dados em XML e atualizar o banco, portanto, envolve uma série de loops. 

Uma solução super simples resolveu meu problema. Bastou colocar um comando Sleep(10) no fim de cada loop (pode ser no início também) e acabou-se o problema de consumo de processador.

A função Sleep faz com que a thread da aplicação adormeça por 10 milisegundos (no meu caso) e devolve o controle da CPU ao Sistema Operacional, tempo mais que suficiente para que os outros processos sejam executados tranquilamente. 

Com o uso do Sleep, o consumo de CPU caiu de 100% para uma média de 7 a 8%, e em raros momentos chega a 40%.