11 de jun. de 2008

Destaques do dia

Too Loosely Coupled Code

Uma discussão interessante sobre acoplamento/desacoplamento de código, com exemplos. Leia mais.

HTML Viewer Components v.9.45

Este era um pacote comercial que recentemente foi posto em domínio público pelo autor. No pacote tem 3 componente para visualizar documentos HTML escritos totalmente em Delphi. Leia mais (ou pegue o componente no torry.net).

9 de jun. de 2008

Destaques do Dia

Code is not self documenting

Jared Parsons, um membro da equipe de desenvolvimento do VB, comenta porque a recomendação de que "código deve ser auto-documentado" nem sempre pode ser seguida. Leia mais.

MSDN Magazine Junho/2008

A MSDN Magazine de Junho está disponível no site da Microsoft. Destaque para o artigo Tools and Techniques to Identify Concurrency Issues e, na nova coluna Patterns in Practice, uma discussão sobre o The Open Closed Principle.

6 de jun. de 2008

Destaques do Dia

"The Big Brother" Delphi Code Toolkit

Zarko Gajic, mantenedor do site delphi.about.com, escreveu uma série de três artigos abordando como ocultar um programa do Windows, como desabilitar recursos do Windows e como monitorar alterações no Windows (pegadinha: precisa de um componente de terceiros na segunda parte da série). Leia mais.

5 de jun. de 2008

Destaques do Dia

TDD Tips: Test Naming Conventions & Guidelines

Para quem está iniciando em Test Driven Development... conheça a nomenclatura básica do TDD bem como algumas sugestões sobre como implementar seus testes. Leia mais.

Use more than 4GB RAM wih Win32

Lars Dybdahl (mantenedor da versão do GNU Gettext para Delphi) explica como alocar mais de 4GB de memória num aplicativo Win32 (pegadinha: pelo que entendi, precisa estar rodando num Win64). Leia mais.

11 de dez. de 2007

MSDN Magazine Dezembro/2007

A MSDN Magazine de Dezembro já está disponível no site da Microsoft. Destaque para uso do WCF, WPF e LINQ com o Office e, na coluna Cutting Edge, uma visão geral do Microsoft AJAX.

15 de nov. de 2007

Problemas com Indy 10

Atualizei hoje meu artigo Como enviar email usando Indy 10. Indy 10 é uma versão que está em desenvolvimento. Entre o dia que escrevi o artigo e hoje, a implementação dos mecanismos de autenticação do servidor SMTP sofreu algumas alterações que simplemente o código exemplo original deixou de funcionar. Pessoalmente, acho problemático adotar o Indy 10 em código de produção, já que é frequente ocorrer esse tipo de problema. A versão que acompanha tanto o BDS2006 como o BDS2007 tem incontáveis bugs (isso não significa que a versão mais recente não tenha bugs). O recomendável é usar a versão snapshot disponível no site indy.fulgan.com (arquivo Indy10.zip). Para atualizar o Indy, primeiro desinstale o Indy que veio com o Delphi, usando para isso o programa de instalação do Delphi. Para instalar a nova versão, siga as instruções disponíveis na página Indy 10 Installation Instructions do site oficial do Indy.

13 de out. de 2007

MSDN Magazine Novembro/2007

A MSDN Magazine de Novembro já está disponível no site da Microsoft. Destaque para segurança.

Outro destaque é que agora você pode baixar a versão CHM da revista em português.

MSDN Magazine Outubro/2007

A MSDN Magazine de Outubro está disponível no site da Microsoft. Destaque para otimização de código gerenciado em máquinas com vários núcleos.

3 de out. de 2007

Horário de Verão 2007/2008

O Horário Brasileiro de Verão começa à zero hora do dia 14 de outubro, quando os relógios deverão ser adiantados em uma hora, e devem ficar assim, até às 24 horas do dia 16 de fevereiro de 2008, quando os relógios deverão ser atrasados em uma hora.

O horário de verão abrange o Distrito Federal os estados do Rio Grande do Sul, Santa Catarina, Paraná, São Paulo, Rio de Janeiro, Espírito Santo, Minas Gerais, Goiás, Mato Grosso e Mato Grosso do Sul.

Atualizado em 13/10/2007

Para ajustar o horário de verão do Windows, no site da Microsoft tem um aviso informando que os usuários devem solicitar o envio de um hotfix (KB 943000).

Para quem tem pressa, o melhor é dar uma olhada no KB 317211, Como configurar as datas do horário de verão para o Brasil, que explica vários métodos para fazer o ajuste necessário. Note que esse KB refere-se ao horário de verão 2006/2007, portanto as datas que devem ser utilizadas não são as citadas no KB.

15 de ago. de 2007

MSDN Magazine Setembro/2007

A MSDN Magazine de Setembro  já está disponível no site da Microsoft. Destaque para sockets no framework 3.5 (incluindo P2P) e testes unitários.

12 de ago. de 2007

MSDN Magazine Agosto/2007

A MSDN Magazine de Agosto  já está disponível no site da Microsoft. Destaque para o novo padrão de empacotamento de dados OPC (Open Packaging Conventions) e um comparativo entre VSTO e VBA na automação do Office.

2 de jul. de 2007

MSDN Magazine Julho/2007

A MSDN Magazine de Julho  já está disponível no site da Microsoft. Destaque para compartilhamento de código entre aplicativos desktop e móveis e suporte ao reconhecimento de fala do Windows Vista.

10 de mai. de 2007

MSDN Magazine Junho/2007

A MSDN Magazine de Junho  já está disponível no site da Microsoft. Destaque para as novidades nas ferramentas C#, VB e C++ e o novo SilverLight, uma ferramenta para desenvolvimento web/multiplataforma.

13 de abr. de 2007

MSDN Magazine Maio/2007

A MSDN Magazine de Maio  já está disponível no site da Microsoft. Destaque para JavaScript e o novo XNA Game Studio Express, a ferramenta de desenvolvimento gratuita para o XBox.

6 de abr. de 2007

Como enviar email usando Indy 10?

Este exemplo mostra como enviar emails usando Indy10.

 1 var
 2   Email: TIdMessage;
 3 begin
 4   // SMTP é um TIdSMTP
 5   // POP3 é um TIdPOP3
 6   // UserPassProvider é um TIdUserPassProvider
 7 
 8   Email := TIdMessage.Create(nil);
 9   try
10 
11     // ...ajusta remetente, destinatário, etc da mensagem...
12     Email.Subject := '...assunto...';
13     Email.From.Address := 'remetente@mailinator.com';
14     Email.Recipients.EMailAddresses := 'destinatario@mailinator.com';
15     Email.Body.Text := '...texto da mensagem...';
16 
17     // conecta com o servidor POP3
18     // alguns provedores exigem isso
19     POP3.Host := 'seu-servidor-pop3';
20     POP3.Username := 'seu-username';
21     POP3.Password := 'sua-senha-secreta';
22     POP3.Connect;
23 
24     try
25       SMTP.Host := 'seu-servidor-smtp';
26 
27       // alguns servidores SMTP exigem login
28       SMTP.AuthType := satSASL;
29       UserPassProvider.Username := 'seu-username';
30       UserPassProvider.Password := 'sua-senha-secreta';
31 
32       SMTP.Connect;
33       try
34         SMTP.Send(Email);
35       except
36         on E: Exception do begin
37           // o envio falhou, trata o erro
38         end;
39       end;
40       SMTP.Disconnect;
41     finally
42       POP3.Disconnect;
43     end;
44   finally
45     Email.Free;
46   end;
47 end;
Pontos importantes: 
  • Nem todo servidor SMTP exige que se conecte antes ao servidor POP3: nesse caso, tudo que é relacionado com o servidor POP3 pode ser omitido (linhas 19 a 22 e linha 42). Note que quando isso é necessário, deve-se permanecer conectado ao servidor POP3 enquanto estiver usando o servidor SMTP.
  • Nem todo servidor SMTP requer autenticação: nesse caso, use SMTP.AuthType = atNone (linha 28) e não tem necessidade de username/senha (linhas 29 e 30).
  • Para fazer autenticação no servidor SMTP, vá na aba Indy SASL e coloque no form um componente TIdUserPassProvider e pelo menos um dos componentes de mecanismo de autenticação (os componentes com nome iniciado com TIdSASL); geralmente o componente TIdSASLLogin é suficiente.
  • Atribua o componente TIdUserPassProvider à propriedade UserPassProvider de cada componente de mecanismo de autenticação que você pos no form.
  • Selecione o componente TIdSMTP que está no form e, no Object Inspector, ative o editor da propriedade SASLMechanisms e inclua na lista direita do editor os mecanismos listados na lista esquerda; os mecanismos mostrados correspondem aos componentes TIdSASL que você pôs no form.
  • Procure permanecer conectado nos servidores POP3 e SMTP o mínimo de tempo possível. A maioria desses servidores irá desconectar você por inatividade ou por tempo.
  • Este exemplo não funciona com o GMail e outros servidores que usam SSL.

Atualizado em 15/11/2007 Indy 10 é uma versão que está em desenvolvimento. Este código funciona usando a versão snapshot (Indy10.zip disponível no site indy.fulgan.com) de 15/11/2007; a versão snapshot é atualizada todos os dias, de modo que não posso garantir que vá funcionar sempre. De qualquer forma, o exemplo foi atualizado e está funcionando novamente.

19 de mar. de 2007

Como fazer um broadcast via UDP usando Indy 9?

UDP é um protocolo de transporte de dados que se caracteriza por não garantir a entrega dos dados, o que permite entregar rapidamente os dados. Um uso frequente para UDP é transmissão de áudio ou vídeo, que é um caso onde a perda de um pacote de dados não compromete o resultado final.

Uma outra característica do protocolo UDP é a possibilidade de transmitir um mesmo pacote de dados para todas as máquina da rede em uma única operação, o que é conhecido como broadcast. Nesse caso, os dados são enviados por UDP para um endereço especial da rede que replicará o mesmo pacote de dados para todos os endereços da mesma subrede.

Um uso possível seria localizar numa rede local todas as máquinas que estão executando seu programa. Para isso, uma cópia do programa poderia iniciar um broadcast na rede pedindo que todas as outras cópias (em uso) do programa se identifiquem, por exemplo, informando o nome da máquina e o IP.

Usando os componentes TIdUDPClient e TIdUDPServer, o código seria algo assim:

1 type 2 TSeuForm = class(...) 3 // coloque um TIdUDPClient e TIdUDPServer no form 4 // por exemplo... 5 UDPClient: TIdUDPClient; 6 UDPServer: TIdUDPServer; 7 ... 8 procedure FormCreate(Sender: TObject); 9 procedure FormDestroy(Sender: TObject); 10 procedure UDPServerUDPRead(Sender: TObject; AData: TStream; 11 ABinding: TIdSocketHandle); 12 ... 13 private 14 procedure Ping; 15 ... 16 17 const 18 NOSSA_PORTA = 49152; // pode ser qualquer valor entre 49152 e 65535 19 20 // rotina de PING 21 // em algum lugar do programa isso é executado 22 procedure TSeuForm.Ping; 23 var 24 S: string; 25 IP: string; 26 X: Integer; 27 begin 28 // não queremos responder nosso próprio comando 29 UDPServer.Active := False; 30 31 // timeout da resposta, em milissegundos 32 UDPClient.ReceiveTimeout := 5000; 33 34 // manda o comando para todas as máquinas da rede 35 UDPClient.Broadcast('PING', NOSSA_PORTA); 36 37 // espera pela resposta 38 while True do begin 39 40 S := UDPClient.ReceiveString(IP, X); 41 if S = '' then begin 42 // ocorreu timeout 43 Break; 44 end; 45 // faz alguma coisa com os dados... 46 // - S tem o nome da máquina que respondeu 47 // - IP tem o IP da máquina que respondeu 48 end; 49 50 UDPServer.Active := True; 51 end; 52 53 // evento OnUDPRead do UDPServer 54 procedure TSeuForm.UDPServerUDPRead(Sender: TObject; AData: TStream; 55 ABinding: TIdSocketHandle); 56 var 57 Server: TIdUDPServer; 58 S: String; 59 begin 60 Server := Sender as TIdUDPServer; 61 62 // recupera o que recebeu 63 SetLength(S, AData.Size); 64 AData.Read(S[1], AData.Size); 65 66 // é o nosso comando de PING? 67 if S = 'PING' then begin 68 69 // envia a resposta 70 S := Server.LocalName; 71 ABinding.SendTo(ABinding.PeerIP, ABinding.PeerPort, S[1], Length(S)); 72 end; 73 end; 74 75 // evento OnCreate do form 76 procedure TSeuForm.FormCreate(Sender: TObject); 77 begin 78 UDPServer.DefaultPort := NOSSA_PORTA; 79 UDPServer.Active := True; 80 ... 81 end; 82 83 // evento OnDestroy do form 84 procedure TSeuForm.FormDestroy(Sender: TObject); 85 begin 86 UDPServer.Active := False; 87 ... 88 end;

Para evitar conflitos com outros programas e serviços do Windows, procure escolher uma porta (linha 18) entre 49152 e 65535. Independente da porta escolhida, lembre-se que essa porta precisa estar liberada para UDP no seu firewall.

O valor de timeout usado na rotina de ping (linha 32) precisa ser ajustado de acordo com o tamanho da rede. Um valor muito pequeno pode fazer com que a rotina de ping desista antes que todas as máquinas respondam e um valor muito alto pode congelar momentaneamente o programa. Não tem outra forma de aguardar pela resposta das máquinas já que, a princípio, a rotina não sabe quantas máquinas vão responder.

Broadcast deve ser usado com moderação. O broadcast utiliza um endereço especial da rede para transmitir os dados que faz com que o mesmo pacote de dados seja enviado a todos os endereços possíveis da rede. Como isso consome recursos da rede, não é boa idéia utilizar isso sem que seja absolutamente necessário. É tentador colocar a rotina de ping num timer que executa a cada segundo, mas o administrador da sua rede não vai ficar muito feliz com essa idéia.

Eu não entendo muito de redes, mas é bom saber que alguns roteadores podem impedir o broadcast.

Links relacionados

16 de mar. de 2007

MSDN Magazine Abril/2007

A MSDN Magazine de Abril  já está disponível no site da Microsoft. Destaque para efeitos especiais com o novo gerenciador de janelas Aero Glass do Windows Vista e um pequeno analisador/parser XML em C++.

28 de fev. de 2007

Como enviar email em C# usando o GMail?

Complementando meu post anterior sobre como enviar email usando C#, eis um exemplo interessante que encontrei uns tempos atrás (adaptado para facilitar o entendimento) mostrando como enviar email pelo GMail...

1 using System; 2 using System.Net; 3 using System.Net.Mail; 4 5 namespace GMailSample { 6 7 class SimpleSmtpSend { 8 9 static void Main(string[] args) { 10 11 SmtpClient cliente = new SmtpClient("smtp.gmail.com", 587 /* TLS */); 12 cliente.EnableSsl = true; 13 14 MailAddress remetente = new MailAddress( 15 "sua.conta@gmail.com", "Seu Nome"); 16 MailAddress destinatario = new MailAddress( 17 "fulano@mailinator.com", "Fulano"); 18 19 MailMessage mensagem = new MailMessage(remetente, destinatario); 20 21 mensagem.Body = "Exemplo de mensagem via GMail"; 22 mensagem.Subject = "Teste do Gmail com SSL e Credenciais"; 23 24 NetworkCredential credenciais = new NetworkCredential( 25 "sua.conta@gmail.com", /* login */ 26 "sua.senha.secreta", /* senha */ 27 ""); 28 29 cliente.Credentials = credenciais; 30 31 Console.WriteLine("Enviando..."); 32 33 try { 34 cliente.Send(mensagem); 35 Console.WriteLine("OK"); 36 } 37 catch (Exception e) { 38 Console.WriteLine("Exceção:" + e.ToString()); 39 } 40 } 41 } 42 }
Toda a comunicação com os servidores do GMail (tanto SMTP como POP3) é tunelada através de uma conexão criptografada.
Esse exemplo usa a porta 587 do GMail. Quem usa o Outlook Express para acessar o GMail pode verificar que o OE usa a porta 465 enquanto quem tem o Thunderbird usa a porta 587 (como o exemplo).
No caso do GMail, a porta 465 é usada para comunicação via SSL enquanto a porta 587 é via TLS. TLS é uma versão mais moderna do SSL; uma explicação mais detalhada sobre SSL/TLS você encontra na Wikipedia (em inglês) ou no Google.
FONTE: Mariya Atanasova's Blog



21 de fev. de 2007

Como enviar email?

O exemplo seguinte usa .NET 2.0 e pode ser usado em projetos WinForms ou ASP.NET. Ele mostra o envio de email usando um cliente SMTP.

1 using System;
2 using System.Net;
3 using System.Net.Mail;
4 
5 ...
6 // monta a mensagem
7 MailAddress to = new MailAddress("email-do-destinatario");
8 MailAddress from = new MailAddress("email-do-remetente");
9 MailMessage mensagem = new MailMessage(from, to);
10 mensagem.Subject = "Teste";
11 mensagem.Body = "Mensagem de teste";
12 
13 SmtpClient cliente = new SmtpClient("seu-servidor-SMTP");
14 
15 // dados para autenticação
16 cliente.Credentials =
17 new NetworkCredential("seu-username", "sua-senha-secreta");
18 
19 // envia a mensagem
20 try {
21 cliente.Send(mensagem);
22 }
23 catch (Exception ex) {
24 // trata a exceção
25 }
26 ...

Sobre o código:

  • As linhas 7 a 11 montam a mensagem.
  • A linha 13 cria o cliente SMTP
  • A linha 16 define as credenciais (nome de usuário e senha) para a autenticação no servidor SMTP
  • A linha 21 faz o envio da mensagem
  • Na linha 24 deve ir o código para tratamento de eventuais erros no envio.

Pontos importantes:

  • Nem todo servidor SMTP requer autenticação: nesse caso, as linhas 16 e 17 devem ser omitidas.
  • Alguns servidores SMTP exigem que se conecte antes ao servidor POP3. Nesse caso, é preciso usar um cliente POP3, o que, infelizmente, o framework não disponibiliza; será preciso usar uma biblioteca de terceiros (assunto para um futuro tópico).
  • Este exemplo não funciona com o GMail e outros servidores que usam SSL.

Tópico atualizado em 09/05/2007: pequena correção na criação da mensagem.