sábado, 28 de abril de 2012

Delphi Meeting 2012

Tenho certeza que você já esta por dentro, mas de qualquer forma, segue:

Link para a inscrição: http://www.edobrasil.net/delphimeeting/


Até lá!

sexta-feira, 16 de março de 2012

Instalação de um Servidor SVN

Olá!

Eu uso o SVN a vários anos mas nunca configurei um servidor.
Mas sempre há a primeira vez e compartilho aqui, com você, a minha experiência.

Meu ponto de partida obviamente foi o Google e fiquei um pouco surpreso em perceber que o SVN tomou vários caminhos, forks e etc.
Não sei se estou falando alguma besteira mas é de fato um pouco confuso.

Tive que escolher um ponto inicial e o escolhido foi: http://subversion.apache.org/
Até onde entedi aqui é o lugar certo para iniciar.

Para o efetivo download cheguei neste link: http://subversion.apache.org/packages.html#windows

Dai veio o dilema. Qual escolher? Optei pelo projeto Win32SVN (Subversion for Windows).
O download desta distribuição pode ser feito em: http://alagazam.net/ onde optei pelo instalador MSI, disponível na seguinte URL:

http://sourceforge.net/projects/win32svn/files/1.7.2/Setup-Subversion-1.7.2.msi/download

Após a instalação temos que, manualmente, instalar o SVN como serviço do Windows. O comando para isto é:

sc create svn binpath= "\"c:\program files (x86)\Subversion\bin\svnserve.exe\" --service -r c:\Repositorio" displayname= "Servidor Subversion" depend= Tcpip start= auto

Importante: Execute o prompt de comando como Administrador e coloque um espaço entre o sinal de igual e o valor.

Vamos ao client. O Delphi XE2 dá suporte à interação direta com o SVN. Mas vou continuar usando o Tortoise por enquanto.
O download pode ser feito em: http://tortoisesvn.net/downloads.html

Um post que achei bem completo está em: http://moisesfontana.blogspot.com/2007/09/instalar-e-configurar-um-servidor.html

É isto,

terça-feira, 21 de fevereiro de 2012

Trabalhando com Atributos (Custom Attributes)

Hoje gostaria de falar sobre Atributos, mais especificamente Custom Attributes e compartilhar uma experiência recente onde esta facilidade foi crucial.

Antes de mais nada quero esclarecer que não estou me referindo aos atributos de uma classe e sim de um conceito novo (Delphi 2010) mas já existente em outras plataformas de desenvolvimento.

Do que NÃO estamos falando:


TPessoa = class
private
  FNome: string; 
  FIdade: Integer; {<== Isto é um atributo de uma classe e NÃO é disto que estamos falando}
public
  property Nome: string read FNome write FNome;
  property Idade: Integer read FIdade write FIdade;
end;

Do que estamos falando:

TPessoa = class
private
  FNome: string; 
public
  property Nome: string read FNome write FNome;

  [TIdadeMinima(21)]   {<== É disto que estamos falando!}
  property Idade: Byte read FIdade write FIdade;
end;

Mas o que significa atributo?


No dicionário:

S. m. 1. Aquilo que é próprio de um ser. 2. Emblema distintivo; símbolo. 3. Característica, qualitativa ou quantitativa, que identifica um membro de um conjunto observado. ...

Ou seja, atributo é, basicamente, uma qualidade atribuída a um elemento.

Usando no Delphi

O uso mais recorrente é em frameworks ORM. Mas as possibilidades são muitos mais amplas que isso. Poderíamos utilizar esta facilidade para atender regras de formatação de um documento eletrônico, como por exemplo o EFD Pis/Cofins ou um protocolo de comunicação com algum equipamento.

Então, indo ao ponto, os atributos são classes descendentes de TCustomAttribute. O TCustomAttribute por sua vez não implementa nada de especial.

Seguindo o nosso exemplo inicial, o atributo TIdadeMinima seria declarado da seguinte maneira:

  TIdadeMinima= class(TCustomAttribute)
  private
    FIdadeMinima: Byte;
  public
    constructor Create(AIdadeMinima: Byte); 
    function IsIdadeMaior(AIdade: Byte): Boolean;
    property IdadeMinima: Byte read FIdadeMinima;
  end;

//Implementação//

{ TIdadeMinima }

constructor TIdadeMinima.Create(AIdadeMinima: Byte);
begin
  Self.FIdadeMinima := AIdadeMinima;
end;

function TIdadeMinima.IsIdadeMaior(AIdade: Byte): Boolean;
begin
  Result := AIdade >= Self.FIdadeMinima;
end;

No que devemos focar?

O construtor da classe deve solicitar os parâmetros que fazem parte do escopo do atributo. No exemplo, o atributo está especificando uma idade mínima para a instância de TPessoa. Portanto o constructor do atributo pede justamente a idade mínima.

Para efetivamente tiramos proveito do atributo temos que recorrer à RTTI, pois só com ela temos acesso a um atributo. No exemplo abaixo, temos o código completo de um programa console, que pede o nome e a idade do usuário e valida a idade.

program UsandoAtributos;

{$APPTYPE CONSOLE}

{$R *.res}

uses
  System.SysUtils, Rtti;

type

  TIdadeMinima= class(TCustomAttribute)
  private
    FIdadeMinima: Byte;
  public
    constructor Create(AIdadeMinima: Byte);
    function IsIdadeMaior(AIdade: Byte): Boolean;
    property IdadeMinima: Byte read FIdadeMinima;
  end;

  TPessoa = class
  private
    FNome: string;
    FIdade: Byte;
  public
    property Nome: string read FNome write FNome;
    [TIdadeMinima(21)]
    property Idade: Byte read FIdade write FIdade;
  end;

{ TIdadeMinima }

constructor TIdadeMinima.Create(AIdadeMinima: Byte);
begin
  Self.FIdadeMinima := AIdadeMinima;
end;

function TIdadeMinima.IsIdadeMaior(AIdade: Byte): Boolean;
begin
  Result := AIdade >= Self.FIdadeMinima;
end;

var
oPessoa : TPessoa;
sNome   : string;
bIdade  : Byte;

_ctx    : TRttiContext;
_typ    : TRttiType;
_pro    : TRttiProperty;
oAtt    : TCustomAttribute;
begin
  Writeln('****************************');
  Writeln('*** Bem vindo ao sistema ***');
  Writeln('****************************');
  Writeln(EmptyStr);
  oPessoa := nil;
  try
    oPessoa := TPessoa.Create;
    Write('Digite o seu nome: ');
    Readln(sNome);
    oPessoa.Nome := sNome;

    Write('Digite a sua idade: ');
    Readln(bIdade);
    oPessoa.Idade := bIdade;

    Writeln(EmptyStr);
    Writeln('Dados');
    Writeln(oPessoa.Nome,' - ',oPessoa.Idade);

    _ctx := TRttiContext.Create;
    _typ := _ctx.GetType(oPessoa.ClassType);
    for _pro in _typ.GetProperties do
    begin
      for oAtt in _pro.GetAttributes do
      begin
        if oAtt is TIdadeMinima then
        begin
          Writeln('A idade mínima é de: ',TIdadeMinima(oAtt).IdadeMinima);
          if (TIdadeMinima(oAtt).IsIdadeMaior(oPessoa.Idade)) then
          begin
            Writeln('A idade de ',oPessoa.Nome,' passou!');
          end else
          begin
            Writeln('A idade de ',oPessoa.Nome,' nao passou!');
          end;
        end;
      end;
    end;
  finally
    if (Assigned(oPessoa)) then
    begin
      oPessoa.Free;
    end;
    _ctx.Free;
  end;
  Writeln(EmptyStr);
  Writeln('Tecle [ENTER] para encerrar');
  Readln;
end.

Vale ressaltar que os atributos podem ser atribuídos a qualquer elemento da sua classe. É o seu código RTTI que terá que ser moldado para tirar proveito delas. Outro ponto importante é que um elemento pode ter vários atributos.

Uso prático

Como mencionei no decorrer, muitos exemplos sobre este tema esta ligado diretamente com a ORM, onde um atributo para a classe indica uma tabela enquanto que alguns atributos para as propriedades seriam os campos e as constraints.

Mas no meu caso, onde precisei gerar um documento eletrônico (EFD Pis/Cofins) baseado em regras, eu criei uma classe base e para cada tipo de registro criei uma classe descendente com os campos e, principalmente, seus atributos: tamanho, tamanho exato, se somente números etc e etc. Por fim, na tal classe base, foi disponibilizado um método chamado GetLine que tanto valida as informações da classe quanto gera a linha correspondente. Esta solução foi ótima pois o código ficou mais limpo e tenho certeza que mudanças ou implementações futuras será muito tranquilas.

Também poderíamos usar para implementar uma validação em uma tela de entrada, afinal, o TForm é uma classe como qualquer outra. Este seria um ótimo uso.


É isto.

sexta-feira, 23 de dezembro de 2011

Eu tenho um sonho

Olá.

Mais um ano se encerra e mais um ano se inicia.

Não podemos ficar indiferente a isto. Esta época do ano é meramente um marco. São dias como outro qualquer, mas representam o fim de uma época e a esperança que o próximo período será melhor. Natal e Ano Novo. As palavras em si encerram algo bom.

Mas de nada adianta se não houver reflexão.

E eu ando refletindo bastante e convido a você, amigo desconhecido, a fazer o mesmo.

Refletir sobre o que fizemos de bom e de ruim.
Pedir perdão e perdoar. E perdoar a si mesmo, como sabiamente me aconselha minha querida namorada, que mais do que isso, é minha amiga nas horas difíceis. Tamires, obrigado por entrar em minha vida.

Valorizar o tempo com os seus filhos. Missão difícil para pais como eu, que por algum motivo não tem o privilégio de conviver diariamente com eles. Que os vêem em dias marcados. Júlio e Fernanda, meus melhores dias são aqueles em que vocês estão comigo, seja no Parque do Ibirapuera, seja assistindo o mesmo filminho pela enésima vez.

Deus, obrigado por ter me dado dois filhos maravilhosos.

Nossos pais merecem atenção também. Os meus não vivem juntos a muito tempo. Tenho algumas lembranças, umas boas outras ruins.
Tento sempre ficar com as boas. Rezo sempre para que eles se perdoem e vivam plenamente suas vidas. O que eu puder fazer para ajudá-los, farei.
Minha mãe foi uma guerreira e merece toda minha paciência e Deus, mais uma vez, me ajudará.
Valdete e Joselito, que Deus conforte seus corações.

Nossos irmãos não podem ser esquecidos. Tenho um bom irmão. Centrado. Admiro muito ele, espero que ele saiba disto. Manoel, você é o cara. Tenho mais dois irmãos por parte de pai que gostaria de ter tido mais contato. Jenny e Jony.

Há muito mais pessoas. A mensagem que quero passar é esta. Pare e veja o que é e principalmente, quem é importante para você. E deixe isso claro para elas, com palavras e atitudes.

Voltarei a postar no ano de 2012. Nosso Delphi está cheio de novidades e este blog será profissionalizado a fim de podermos crescer juntos.

Quanto ao meu sonho?

Que em 2012 nossos sonhos sejam verdades.

Feliz Natal e Próspero Ano Novo a todos.



terça-feira, 29 de novembro de 2011

Delphi Conference 2011

Olá a todos.

Primeiramente gostaria de me desculpar por tanto tempo sem postagens. Houveram mudanças muito importantes na minha vida profissional e infelizmente isso me impediu de postar com a frequência que eu gostaria.

Este post tem um motivo especial que é o Delphi Conference 2011 que será amanhã, 30.11.2011, em São Paulo.

http://www.delphiconference.com.br/

Gostaria de convidá-lo a assistir a palestra Desmistificando as Expressões Regulares na Sala 1 às 17:30 que terei a honra de ministrar.

É um assunto muito empolgante e a partir de hoje darei destaque ao assunto no meu blog, criando inclusive uma página específica para o tema: http://eugostododelphi.blogspot.com/p/expressao-regular.html

É isto. Nos vemos amanhã.

Forte abraço.

quinta-feira, 15 de setembro de 2011

Calendário de cursos na TDS

Olá. A TDS está divulgando seu calendário de fim de ano.

Para verificar as turmas disponíveis acesse: http://tdstecnologiasp.com.br/calendarios/tdscal-13092011190451.htm

Forte abraço.

quarta-feira, 10 de agosto de 2011

Object Pascal Style Guide

Sempre tenho dúvida se estou escrevendo meus códigos de uma forma correta.

O link abaixo vai me ajudar:

http://edn.embarcadero.com/article/10280

Recebi pelo grupo de discussão do Yahoo!

Minha lista de blogs