Postagens

Mostrando postagens de 2010

6 maneiras de fazer a mesma coisa, o que é considerado boas práticas?

As vezes tem tantas maneiras diferentes de fazer o mesmo código que nós ficamos na dúvida quanto a qual maneira usar. O que seria considerado "boa prática" pela comunidade e o que sua equipe entenderia melhor. Suponhamos que você esteja trabalhando dentro de um método de um Domain Service chamado UmDomainServiceChique(objetoDoDominio) que será chamado por uma API.Você tem uma regra de negócio chique para ser verificada que por enquanto chamarei de VerificaMinhaRegraChiqueComplexa().Você chama UmDomainServiceChique(objetoDoDominio) e caso VerificaMinhaRegraChiqueComplexa() retorne true você vai querer que UmDomainServiceChique faça o que tem que fazer e a api retornar Ok 200, caso contrário você quer que a API responda um erro qualquer, tipo BadRequest, e retornar uma mensagem dizendo que VerificaMinhaRegraChiqueComplexa deu ruim. Eu vejo 6 maneiras de fazer isso, gostaria de saber a opinião de outrs devs sobre qual seria a maneira menos gambiarrística de fazer:1) se Ver…

Meus vídeos favoritos do youtube até agora

Clube Delphi 124

Imagem
Já está no site da DevMedia a revista Clube Delphi n° 124.

Com um artigo de capa muito interessante e há muito que queríamos ler: controle de versão já integrado no Delphi XE.

Nesta edição você poderá ver também meu artigo sobre compressão de arquivos e a terceira parte do artigo sobre design patterns.

Neste artigo você verá como criar um programa OO multibanco e multicomponente de acesso usando factory method e abstract factoey.

Também é mostrada nessa série de artigos uma maneira mais simples de se criar um singleton do que a que já foi mostrada nesse blog.

Espero que gostem, divirtam-se.

Clube Delphi 123

Imagem
Tanta correria esse mês, com a pós graduação, artigos e projetos que nem deu tempo de postar nada sobre a revista Clube Delphi 123.

A revista está excelente, pra variar, com ótimos artigos.

Começando por um artigo sobre injeção de dependência do Paulo Quicoli, e mais um artigo sobre Lazarus e Free Pascal de Daniel Simões Almeida, esses dois apenas para citar.

Nesta edição há a segunda parte do meu artigo sobre design patterns onde falamos mais um pouco sobre factory methods. Espero que seja útil a todos.

Uma técnica que ficou de fora desse artigo, para elaborar factories é a técnica de registrar classes com registerclass e depois usar o tipo/metaclasse TPersistentClass para obter a classe pelo nome (string) e criá-la.

Esse método você pode conferir no meu último post sobre metaprogramação no delphi e no lazarus.

Espero que seja útil a todos e happy coding ;)

Metaprogramação no lazarus

Imagem
No meu último post eu falei sobre o componente Pascal Script da RemObjects. A melhor notícia é que a versão 3 do componente, com um belo instalador automático e uma série de melhorias, tem uma versão para lázarus muito fácil de se instalar.

Além disso tem uma versão também para o visual studio / .net, então imagina usar metaprogramação "via script" no ambiente .net que já permite metaprogramação. Vai ser show de bola, e um perigo também, se mal usado.

Esse é  o tipo de recurso que quando agente usa fala: "e porque não?".

Bom, pelo menos como aprendizado e prova de conceito darei uma estudada e desenvolverei mais alguns exemplinhos.

Por hora, fiz no lázarus o mesmíssimo exemplo feito em Delphi no último post, espero que gostem. Uma das mudanças foi colocar um SynEdit para digitar o código, em vez de um memo comum.



O Synedit é show!

Faça o download do exemplo aqui:

Have fun ;)

Chamando Formulários com PascalScript + RTTI + Factory Methods

Um desenvolvedor que leu meu artigo sobre metaprogramação no Delphi me perguntou hoje como criar e abrir formulários a partir de scripts com o Pascal Script.
Não há uma maneira muito fácil de se fazer isso, e pode haver outras maneiras de se fazer.

Você não pode simplesmente registrar a form1 simplesmente porque o tipo TForm1 não existe. Ele não é nativo do Delphi, mas foi escrito por você.

O Pascal Script não conhece o tipo TForm1 e não tem como, dentro do script, você criar uma variável desse tipo.

Uma das maneiras seria você registrar a unit1, fazendo com que o pascal script a use, ou declarar a TForm1 todinha dentro do pascal script. Essas duas opções são complicadas, pois um dos meios é passar o fonte .pas junto com a aplicação e deixar  o cliente ver / manipular livremente. E se por acaso a unit1 usa ou depende de outras units você teria um enorme problema em cascata.

Além disso o pascal script é limitado. Ele se limita apenas às operações básicas do pascal.

Uma maneira elegante…

Faça backup do seu blog

Imagem
Se você tem um blog no blogspot você pode fazer backup de seus posts através de XML, para poder armazenar o conteúdo e até portar para outras plataformas.

Backup é a única medida de segurança barata/viável em um monte de situações, e no caso do blogger é a medida mais segura que você pode tomar.

Uma das ferramentas que pode te ajudar com isso é o blogger backup utility que você pode baixar no codeplex.

Ele é open-source, então você pode baixar sem medo, e alterar a seu gosto.


Na caixa de seleção logo acima escolha "add/edit / remove blogs" para adicionar seu blog na lista. (você pode ter múltiplos).
Depois de colocar seu login e senha simplesmente diga se você quer fazer backup de tudo ou apenas a partir de uma data, e se quer tudo em um arquivo ou um arquivo por post. Simples assim.

Have fun ;)

Existem 1001 maneiras de preparar SINGLETON, invente uma!

Imagem
Falando-se de POO e Padrões de projeto, não podemos deixar de falar em Singleton. Singleton é um tipo de classe que só pode ser instanciada uma e apenas uma vez. Esse tipo de classe é ideal para objetos que carregam configurações do sistema, objetos que manipulam o horario do sistema, objetos que usamo recursos compartilhados, e por isso necessitam ser serializados ou sincronizados pelas threads, por não poderem executar ao mesmo tempo.
Concrete Factories e Builders também são ótimos exemplos de padrões de projeto que podem ser criados a partir de um singleton. Afinal, se você precisa de um objeto que crie, ou que crie e configure outros objetos para você, seria ideal que todos os objetos criados e montados fossem fabricados do mesmo jeito. Logo, você não deveria ter duas instancias diferentes de um mesmo factory ou de um mesmo buider.
A maneira mais simples de se criar um singleton no Delphi é comona listagem abaixo. unit uSingleton; interface uses DateUtils, SysUtils, Windows, di…

Como hoje estou de bom humor ... campanha!

Imagem
A mensagem está dada.

De pensar que um jogo pra crianças incentivava essas coisas ...

Vida de Programador ... Estranho

Imagem
Cara, hoje eu sou programador, mas já trabalhei 2 anos com suporte e daí eu tirei as histórias mais hilárias da minha carreira. (e perdi 70% dos meus cabelos também).

Mas você pensa que o único problema do pessoal do suporte são os usuários? Nada, os programadores são boa parte do problema. No blog Vida de Suporte me identifiquei muito com o personagem Mauro que fala .... estranho. Eu falo igualzinho quando dá algum problema.

A explicação é simples: se o programador desenvolve sem uma metodologia fixa (vamos desconsiderar aqui as pressões por preço e prazo) ele testa a aplicação num universo ou contexto familiar a ele.

Quando ocorre algum problema ou é descoberto um bug, ou a maneira de reproduzir o bug é desconhecida do universo de testes do programador ou ele até já esqueceu que funcionalidade é esta que ele construiu, o que ela fazia, para que servia e como usá-la.

Ele só sabe que não era para dar erro. Se der é no mínimo ..... estranho. Agora vai saber (ou imaginar) por que ocorre…

Obtendo e formatando datas no .Net com C# e Iron Python

Formatos para obter a data: 1.  Use dd para obter simplesmente o dia 2. Use ddd para obter um nome curto para o dia  3. Use dddd para obter  o nome completo do dia 4. Use MM em maiúsculo para obter o mês 5. Use yyyy para obter o ano com 4 dígitos 6. Use hh para obter as horas 7. Use mm em minúsculo para obter os minutos 8. Use ss para obter os segundos

Código no C# para imprimir a data (no console)
using System; using System.Text; namespace TesteDatas { class FormatoData { static void Main(string[] args) { Console.WriteLine("Current Date and Time:"); Console.WriteLine(System.DateTime.Now); Console.WriteLine("Data: {0:dd}", System.DateTime.Now); Console.WriteLine("Dia: {0:ddd}", System.DateTime.Now); Console.WriteLine("Dia Longo: {0:dddd}", System.DateTime.Now); Console.WriteLine("Data Completa: {0:dddd - dd \\de MMMM \\de yyyy - hh:mm:ss}", System.Dat…

Como "matar" um processo no Delphi

Para fechar um programa executável pelo seu nome crie a seguinte função:


function killtask(ExeFileName: string): Integer; const PROCESS_TERMINATE = $0001; var ContinueLoop: BOOL; FSnapshotHandle: THandle; FProcessEntry32: TProcessEntry32; begin Result := 0; FSnapshotHandle := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); FProcessEntry32.dwSize := SizeOf(FProcessEntry32); ContinueLoop := Process32First(FSnapshotHandle, FProcessEntry32); while Integer(ContinueLoop) <> 0 do begin if ((UpperCase(ExtractFileName(FProcessEntry32.szExeFile)) = UpperCase(ExeFileName)) or (UpperCase(FProcessEntry32.szExeFile) = UpperCase(ExeFileName))) then Result := Integer(TerminateProcess( OpenProcess(PROCESS_TERMINATE, BOOL(0), FProcessEntry32.th32ProcessID), 0)); ContinueLoop := Process32Next(FSnapshotHandle, FProcessE…

Migração do Live Spaces para o Wordpress

Imagem
Uma boa notícia (ou não) para quem tem um blog no Live Spaces mas acha uma droga. A Microsoft, em parceria com o Wordpress resolveu migrar os blogs feitos no Live para a plataforma Wordpress.

Eu acho isso uma boa idéia pois assim a microsoft pode focar no que ela tem de melhor e realmente sabe fazer, e deixar a parte que ela não tem muito know how para terceiros.

Pelo calendário da microsoft você tem até 4 de janeiro de 2011 para baixar o conteúdo e migrar, até essa data você ainda pode postar conteúdo. Passando de 4 de janeiro o blog será travado para novas pstagens, permitindo-se apenas consultas e o download do conteúdo. No dia 16 de março de 2011 o live spaces será fechado de vez.

Veja abaixo a mensagem original que enviaram para os usuários:



Dear Windows Live Spaces customer,We are very excited to announce our collaboration with a premier and innovative blogging service, WordPress.com, to offer you an upgraded blogging experience. We'll help you migrate your current Windows…

Olá, mundo!

Welcome to WordPress.com. This is your first post. Edit or delete it and start blogging!

Barrinha Social Wibia

Imagem
Sabe essa barrinha de ferramentas vista no rodapé deste blog? Ela é feita pelo site http://www.wibiya.com/

Entre no site, cadastre-se e aqui você poderá instalá-la. O site publicará um widget no seu blogspot, a única coisa que você precisa fazer agora é coloca o widget em um lugar mais apropriado e talvez remover o título.




Será colocado um script como esse

<script src="http://cdn.wibiya.com/Toolbars/dir_[[dir id]]/Toolbar_[[seu id]]/Loader_[[seu id]].js" type="text/javascript"></script>
No próximo post falaremos da barra do meebo

Até lá ;)

Hook sem usar bibliotecas externas

Hooking, ou API Hooking é quando substituimos a entrada de um método qualquer por um método nosso. Assim todas as chamadas de um determinado método chamarão na verdade o método novo.

Existem outras técnicas e bibliotecas para fazer isso. Para dizer a verdade eu não sou expert nesse assunto. Geralmente as bibliotecas tem uma opção/função de callback onde você armazena uma referência à função original, assim pode chamar a função original dentro da substituta, antes ou depois do seu próprio código, para que ela possa ser mais parecida ou equivalente à original, com pouco esforço da sua parte.

Nesta biblioteca que fizemos aqui nós não temos essa opção. Uma vez substituindo a função original  não teremos mais acesso a ela, só a nova, até o momento do UnHook. Além disso não podemos chamar a função original, apenas a nova. Chamar a original dentro da nova é como a nova chamar ela mesma, e isso resulta em loop recursivo e stack overflow.

Isso significa que você é obrigado a sobrescrever intei…

Tweet Button oficial no blogspot

Há outras formas de colocar o Tweet Button no seu blog. Eu vou abordar  a mais "complicada" ;)

Ao editar o HTML do blogspot você o faz na verdade em XML. É um formato de XML que dirá ao mecanismo do blogger como será seu HTML depois. E esse XML aceita alguns "comandos" como veremos.

O botão Tweet é uma tag de âncora de hiperlink <a> comum que além dos atributos class e href possui esses atributos especiais, tradados pelo script que vem junto:


data-count='vertical'  --> tipo de contador: pode ser vertical, horizontal ou none
data-via='vitorrubio' --> seu nome  no twitter
data-text='titulo do post'  --> título do post :p
data-url='url do post' --> url do post ;)



Dentro de marcadores de tags < > você não pode colocar outros marcadores como estes. E para obter automaticamente o titulo do post e a url devemos usar os já ditos "comandos" do blogspot.

Para obter o títilo do post você deve utilizar data:post.tit…

Clube Delphi número 122

Imagem
Pela primeira vez a Revista Clube Delphi traz em sua capa um artigo sobre Lazarus e Free Pascal. Para quem não conhece o Lazarus trata-se de uma IDE para se trabalhar com Free Pascal e auxiliar o Desenvolvimento RAD ou OO de uma maneira muito semelhante ao Delphi 7.

O Compilador AINDA não tem todos os recursos que o moderno compilador do Delphi XE, como generics por exemplo, mas isso não é um impedimento. Já é possível criar aplicações robustas em Lazarus.

Na capa podemos ver um lindo Guepardo. Para quem não sabe a diferença entre Guepardo e Leopardo veja aqui.

Para quem gosta de POO e Design Patterns foi publicado um artigo meu, a ser dividido em 3 partes, sobre Abstract Factory e Factory Methods. No começo do artigo é explicado como criar classes e formulários de acordo com variáveis externas, sem usar nenhum IF. O que fazemos é delegar a responsabilidade de criar uma instância de um objeto a alguém que realmente saiba como criar e preparar esse objeto. Assim nós podemos isolar a cla…

Obtendo atributos de arquivos com o Lazarus

Como saber se um arquivo é oculto, de sistema, somente leitura e tal? Como saber a data de criação e última alteração de um arquivo?

E para saber se é arquivo, diretório ou unidade?

Criamos essa pequena classe no Lazarus (e por extensão Delphi) onde você passa um arquivo qualquer e ela te identifica quais são os atributos e ainda pode mudar alguns dos atributos em runtime.

A classe ainda não está completa, a idéia é expandi-la, mas ela já é bastante funcional. É muito mais fácil e intuitivo usar uma classe do que a API do Windows.

A classe:
unit uLazFile; {$mode objfpc}{$H+} interface uses Classes, SysUtils, windows; type { TLazFile } TLazFile = class private FFileName: string; function Attributes: word; procedure Verify; //gets function GetFileName: string; function GetAttributeFile: boolean; function GetAttributeHidden: boolean; function GetAttributeSystem: boolean; function GetAttributeReadOnly: boolean; function GetAttributeDire…

Códigos de versões do Delphi e Diretivas de compilação

Sabe aqueles componentes feitos para múltiplas versões do Delphi que tem várias diretivas para saber qual é a versão do Delphi e assim mudar o código em tempo de compilação?

Segue abaixo uma lista das diretivas de compilação/comnplicação :)

São mais ou menos assim:
{$IFDEF VER210}
//algum código aqui compatível com essa versão
{$ELSE}
//outro código genérico
{$ENDIF}

Seguem abaixo os códigos das versões:


VER80 - Delphi 1
VER90 - Delphi 2
VER100 - Delphi 3
VER120 - Delphi 4
VER130 - Delphi 5
VER140 - Delphi 6
VER150 - Delphi 7
VER160 - Delphi 8
VER170 - Delphi 2005
VER180 - Delphi 2006
VER180 - Delphi 2007
VER185 - Delphi 2007
VER200 - Delphi 2009
VER210 - Delphi 2010
VER220 - Delphi XE

É útil para você criar bibliotecas que compilem tanto em Delphi como em Lazarus, pois você pode usar um {$IFDEF FPC}.

Tente rodar o exemplo abaixo nos Delphis 2010, XE e 7.


procedure TForm1.Button1Click(Sender: TObject); begin {$IFDEF VER210} ShowMessage('Delphi 2010'); {$ELSE} {$IFDEF VER220…

12° Congresso de Tecnologia FATEC-SP

Esta semana está rolando o 12° Congresso de Tecnologia FATEC-SP (Av. Tiradentes / Rua três rios, proximo ao metrô tiradentes)

Ontem dei uma passada lá só pra ver o movimento (tá certo, eu tava perdido e sem programação). Legal foi eu encontrar vários colegas da Adv Tecnologia (grande abraço pra todos vocês) que estavam só de passagem também. :)

Hoje vai rolar um evento bastante interessante: palestra sobre XBOX e Kinect pelo MVP Maurício Alegretti e eu assistirei.

Amanhã rola uma palestra interessante também sobre windows phone 7. Infelizmente perderei esta. Quem assistir e quiser me passar o que foi abordado agradeço.

É isso aí, para quem for, nos vemos lá :)


Mais informações em:
http://www.fatecsp.br/
http://www.objectiveclub.com.br/

IIF

Quem já programou em Clipper e Visual Fox Pro deve lembrar da função IIF. Esta função simplesmente aceitava três parâmetros, um booleano, ou condição, e dois valores, caso verdadeiro e caso falso.
Ela era interessante porque substituia (em partes) o operador ternário ?: do C e poderia ser usada em expressões para se somar ou concatenar o valor correto dependendo da condição.
Ela servia para substituir um if ... else e uma variável temporária colocando tudo na mesma linha.

O seu formato era:

iif(condição, valor se verdadeiro, valor se falso): valor;

Ela retornava um valor que seria do mesmo tipo do segundo e terceiro argumento.

É possível criar inúmeras variantes dessa função, tanto no Lazarus como no Delphi. Usando variants poderiamos  criar uma vertente da função que funcionaria para qualquer tipo de dado primitivo.

Mas o Delphi é ainda mais flexível porque hoje temos Generics e o tipo TValue, que são mais flexíveis ainda. Com Generics, Variants e sobrecarga de operadores podemos uti…