Postagens

Mostrando postagens de Outubro, 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…

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…

Forward Declarations

Imagine que você está escrevendo uma biblioteca de funções estáticas em um arquivo .pas e precisa declarar o cabeçalho de uma função para que ela possa ser usada abaixo globalmente, mas você não quer colocar o cabeçalho na seção interface para que a função não seja publicada para todas as units, você quer manter ela em "segredo" na seção de implementation.

Você pode dizer: "simples, basta declarar a função inteira acima e pronto." Mas e se essa função precisa usar outra que também será declarada dessa maneira e vice-versa?

A solução é foward declaration. Tudo bem, não se usa muito hoje em dia, ainda mais em POO, mas segue abaixo um exemplo de como você pode declarar uma função adiando a sua real implementação "mais para baixo" mesmo na seção implementation:

unit uSomaForward; interface function SomaPublica(x, y: Integer): Integer; implementation function SomaPrivada(x,y: Integer): Integer; forward; function SomaPublica(x, y: Integer): Integer; begin …

Joque asteroids destruindo elementos de qualquer página web

Nem sei dizer ao certo como encontrei essa página http://erkie.github.com/, talvez em algum tweet perdido de alguém.

Até saiu matéria sobre o assunto no UOL Tecnologia. Trata-se de um script que, incorporado à uma página qualquer ou adicionado na barra de favoritos do seu browser, cria uma pequena nave, estilo asteroids, para destruir os elementos da página. Dá para destruir tudo, até ficar só o body. Só não dá pra destruir imagens em background via CSS.

Se você quiser colocar no seu blog basta colocar um link com esse código no evento onclick:


javascript:var s = document.createElement('script');s.type='text/javascript';document.body.appendChild(s);s.src='http://erkie.github.com/asteroids.min.js';void(0);
Exemplo

O clássico jogo asteroids foi lançado pela ATARI em 1979 nos EUA e em 1981(?) no Brasil. O esquema de inércia parece ter sido inspirado no ainda mais mitológico SpaceWar para PDP-1 criado pelo cientista da computação Steve "Slug" Russell no MI…

Truques usando API do windows

Usando a API do windows podemos executar um programa externo, colocar a janela dele dentro da janela do nosso programa e capturar  texto de uma janela ou widget qualquer desse programa.
Qualquer programa feito e usando a api do windows pode ser usado dessa forma. Nossa cobaia oficial será a calculadora do windows, mas onde você ver calculadora pode ler "qualquer programa nativo win32, como msn, bloco de notas etc".
O exemplo foi feito em lazarus mas funciona perfeitamente em qualquer versão do Delphi. Tenha a unit Windows no seu uses.



procedure TForm1.btCapturarClaculadoraClick(Sender: TObject); var //vamos dar apenas 5 tentativas pois pode ser que a "calculadora" não existe tentativas: integer; HandleCalc, HandleCaixaTexto: HWND; //handles da calculatora TamanhoVisor: integer; TextoVisor: string; begin //executamos a "calculadora" ou qualquer que seja o programa externo ShellExecute(Handle, nil, 'c:\windows\system32\calc.exe&#…

Lentidão ao acessar máquinas da rede windows

Imagem
Se você enfrentar lentidão ao acessar a rede do windows, por exemplo uma demora fora do normal para listar as máquinas da rede, isso pode ser causado por uma tentativa do windows de mostrar as tarefas agendadas em cada máquina.

Como essa função é muito lenta e a maioria das pessoas não usa isso podemos remover isso pelo registro do windows.

Altere o registro por sua conta e risco, pois um passo em falso aqui pode ocasionar em mal funcionamento do sistema.

Vá no Botão Iniciar --> Executar (ou pressione window + r )
Digite: REGEDIT e pressione OK.

No vá abrindo as chaves até encontrar HKEY_LOCAL_MACHINE/Software/Microsoft/Windows/Current Version/Explorer/RemoteComputer/NameSpace
Procure pela chave {D6277990-4C6A-11CF-8D87-00AA0060F5BF} e apague-a.

Apague apenas esta. Pronto, agora você pode visualizar os micros da rede e pastas compartilhadas mais rapidamente.

Gerador / Validador de CPF e CNPJ no lazarus

Diferentemente do RG um CPF (ou CNPJ) é um identificador único. Um CPF identifica uma pessoa única no Brasil. É uma boa prática associar contas de usuário com seu CPF. Seguro para o usuário, pois diminui o risco de alguém se passar por ele, e seguro para quem presta algum serviço, pois pode identificar um usuário infrator.

Lógico que essa não deveria nem de longe ser a única medida de segurança e identificação de um usuário, mas já é um começo.

Quando você coloca o CPF como campo obrigatório em um formulário de cadastro no seu sistema torna-se difícil testar esse formulário porque você precisa validar o CPF para ver se é correto, mas também precisa de CPF's válidos e únicos para usar nos seus testes. O que fazer?

Pensando nisso coloquei esse gerador de CPF e CNPJ que você pode ver na barra lateral do blog, e fiz esse programinha em lazarus para gerar e/ou validar CPF's e CNPJ's. Você pode copiar esse algoritmo para validar documentos nos seus cadastros.

Funcionamento do CPF…

Cannot implicitly convert type 'string' to 'System.Net.Mail.MailAddress'

Se você recebeu a mensagem acima ao compilar uma aplicação C# saiba que a string "nome@dominio.com.br" não é um e-mail válido, ou pelo menos não podemos afirmar que seja. Ela não é do tipo MailAddress.


O tipo MailAddress é um tipo de dado especial para se trabalhar com e-mails que deve ser inicializado por se transformar um string em um e-mail. 


Se você tentou fazer:


MailMessage m = new MailMessage();
m.From = "nome@dominio.com.br";


Faça:


MailMessage m = new MailMessage();
m.From = new System.Net.Mail.MailAddress("nome@dominio.com.br"); //esta é um contrutor de classe que recebe uma string como parâmetro.


Essa dica foi tirada do site http://www.csharptalk.com/nesse post.


Em outra ocasião falaremos mais sobre o tipo MailAddress.


Espero que tenha sido de ajuda ;)