Postagens

Mostrando postagens de 2011

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

Formatando datas no SQL e no C#

Muitas vezes é necessário exibir datas em um determinado formato no GridView. Muitos programadores convertem a data para o formato desejado já na consulta SQL ou procedure. Isso não está correto por uma série de motivos, entre os quais podemos citar: 1) A responsabilidade de formatar a data deve ser totalmente da view, ou seja, da camada de apresentação. 2) Datas formatadas pelo SQL não são mais datas, são varchars, e não podem ser ordenados como datas. 3) Trazendo sempre a data integral do banco de dados pode-se fazer qualquer operação desejada com ela. Veja o link abaixo para tirar qualquer dúvida que você possa ter a respeito. http://weblogs.sqlteam.com/jeffs/archive/2007/04/13/format-date-sql-server.aspx Dito isso, algumas considerações interessantes: Para formatar strings diretamente em uma GridView adicione a coluna (bound column) e defina um valor para a propriedade DataFormatString: <asp:BoundField DataField="Data" DataFormatString="{0:dd/MM/yyyy

Factory Reset do Samsung Galaxy S

Neste endereço  http://www.clangsm.com.br/vb/android-os/9802-aparelhos-android-hard-reset.html  também há um procedimento para resetar o Galaxy S e apagar tudo, servindo para desbloqueá-lo. Reproduzindo: Para hard reset seu Samsung I9000 Galaxy S: 1. Desligue o aparelho. Se o seu celular Samsung Galaxy S está congelado, retire a bateria e recoloque-a. 2. Segure o botão Diminuir Volume. 3. Pressione e solte o botão Power. 4. Você está agora confrontado com um menu que permite Fastbook, recuperação Clear Storage, e Simlock. 5. Selecione Clear Storage, pressionando o botão Diminuir Volume. 6. Pressione e solte o botão Power. 7. Agora, basta confirmar a sua decisão: Volume para cima para confirmar e Volume para baixo para negar a ação. Se SIM for selecionada, todos os dados, incluindo aplicações de terceiros serão apagados do seu Samsung I9000 Galaxy S. Uma vez que a limpeza for concluída, o telefone irá reiniciar a suas configurações de fábrica. ou -Botão do volume para cima+botão home

Criando um lookup que chame uma de suas forms

Um leitor deu a dica de fazer um lookup que chame uma das forms do projeto. Há várias maneiras de se fazer isso, mas uma que encontrei foi usar formulários registrados com RegisterClass. Depois é só usar FindClass para encontrar o formulário, e FindComponent para encontrar o componente onde reside o valor a ser trazido. Se o componente for um TPersistentField, melhor ainda. Ele pode ser achado, e com um typecast para TField seu valor (o valor encontrado e escolhido no formulario de procura/cadastro padrão) pode ser trazido para o keyvalue. Abaixo um exemplo de como isso pode ser feito. Primeiro o registro do formulario: initialization RegisterClass(TfrmConsulta); Depois a chamada dele. Repare que ele é desconhecido para o formulário principal: não está no uses. procedure TfrmPrincipal.Button1Click(Sender: TObject); var NewFormClass: TFormClass; NewForm: TForm; begin NewFormClass := TFormClass(FindClass( 'TFrmConsulta' )); //detalhe: esse string 'TFrmConsu

Bancos de dados gratuitos parte 2

Imagem
Saiu na Clube Delphi 132 a parte 2 do artigo sobre bancos de dados gratuitos . Espero que todos gostem. Esta edição ainda traz um artigo sobre Nota Fiscal Eletrônica 2.0, muito útil. Não se esqueça que agora os códigos GTIN (códigos de barra a serem preenchidos nos campos cEAN e cEANTrib) agora são obrigatórios. Um artigo que eu lerei com bastante curiosidade é o artigo sobre Morfik, que permite desenvolvimento par Web com Object Pascal, semelhante ao Delphi. Mas com o Morfik você também desenvolve código "client-side". Espero que todos tenham boa leitura!

Artigos sobre bancos de dados gratuitos e lookups

Imagem
Saiu na revista Clube Delphi 131 dois artigos meus: um sobre bancos de dados gratuitos e outro sobre a criação de um componente lookup genérico . Lokups são campos utilizados para fazer a ligação entre duas entidades, duas tabelas. Em uma tabela de venda, por exemplo, há informações sobre o código do cliente para quem a venda está sendo feita, o código da forma de pagamento, e assim por diante. Um formulário não deve ter campos para se digitar os códigos diretamente, e sim campos lookup, que possam ser usados para procurar a forma de pagamento, o cliente e as outras informações em questão pelo nome e não pelo código. Neste artigo fizemos um lookup, usando um ButtonedEdit e um formulário com grid,  que pode funcionar em múltiplos bancos de dados e que traz os registros filtrando-os, usando para isso uma instrução SQL montada sob demanda. Isso ajuda a diminuir o tempo de abertura dos formulários e o tempo de carregamento dos lookups, bem como a quantidade de registros trazida nesse

erro "ora-12154: tns: não foi possível resolver o identificador de conexão especificado"

Para se conectar uma aplicação Delphi no Oracle é necessário editar o arquivo tsnames.ora, geralmente na pasta  C:\oraclexe\app\oracle\product\10.2.0\server\NETWORK\ADMIN caso seu oracle seja o XE. Esse erro pode acontecer tanto em runtime como em design-time, com qualquer tipo de componente: DBX, ADO e assim por diante. É mais comum que aconteça em tempo de design em um windows de 64 bit.  Em alguns casos onde essa mensagem de erro aparece é porque o arquivo não existe ou está em uma pasta que o Delphi ou o seu aplicativo não tem permissão de acesso.  Na grande maioria dos casos o erro ocorre apenas em design-time e nunca em runtime. Se esse é o seu caso   então provavelmente a culpa é do windows de 64 bit, mais especificamente o fato de o Delphi estar instalado na pasta "Arquivos de Programas (x86)". Explicando, o driver de conexão ao oracle não suporta caminhos contendo parênteses "()", esses que tem no "(x86)". Ele não consegue encontrar nem o drive

Key Violation em nested datasets

Resolva de uma vez por todas o problema de "key violation" em datasets "detail" ligados a datasetfileds através de providers. Cenário: você tem duas tabelas num relacionamento 1:n tipo mestre-detalhe no seu banco de dados, por exemplo Pedidos e ItensDoPedido. A chave primária de ambas as tabelas é auto-numerada, por exemplo com ajuda de um generator do firebird. A Tabela itens tem uma chave estrangeira PedCodigo, que é o código do pedido, mas para controle interno também tem uma chave primária CodItem, autonumerada. Você colocou no formulário dois SQLDatasets, um fazendo o select em Pedidos e outro fazendo o select em ItensDoPedido, com um "where CodPedido = :CodPedido" para fazer a "ligação". Você ligou o SQLDataset detalhe (ItensDoPedido) a um datasource ligado ao SQLDataset mestre. Você ligou também um DatasetProvider ao SQLDataset de Pedidos e ligou um ClientDataset cdsPedidos a esse provider, criando um dataset field (campo do tipo datas

O que você melhoraria no Delphi? - parte 2

Na parte 1 desse post , há muito tempo, fiz uma pequena descrição do que eu acho que poderia ser melhorado no Delphi. Resumindo: 1) Alguns componentes e bibliotecas mais comuns "nativos" em vez de "incorporados". 2) Literatura orientada mais a POO e a boas práticas da Engenharia de Software do que a RAD. A literatura disponível nos helps, exemplos, snippets e consequentemente nos blogs e fóruns é toda voltada a RAD, arrastar e  soltar componentes. E como todos sabemos RAD é bom para protótipos e projetos pequenos, ou com requisitos fixos, com baixa frequencia de manutenção. 3) O aspecto que eu acho mais importante é (a falta de) um framework de persistência nativo da Embarcadero, para se fazer o mapeamento objeto relacional de maneira padronizada e ao mesmo tempo rápida. Continuando, uma coisa que eu acho muito importante são as ações de marketing. No Brasil parece que o Delphi está queimado justamente com quem mais deveria acreditar nele: os professores. D

Grande verdade sobre developers

Imagem
Além de encarar qualquer problema de frente, assumimos a responsabilidade pelos bugs, sejam eles nossos, de "estimação", ou não.

Que saudade das férias

Imagem
Estava limpando a bagunça do meu PC e encontrei uma foto que me deu saudade das férias. Tudo ok com vocês peixinhos? Oh wait, isso não foi um gesto obsceno, aaaaargh.

Easter Egg de Fringe no site da Bardahl

Imagem
Entre no site da Bardahl , clique em história da Bardahl ==> Museu Bardahl 3d em flash, quando carregar um "mural" com vários anos clique em próximo para ver o próximo "mural/parede" e clique em 1962. Veja quem está observando ...

Biblioteca MadCollection

Imagem
Saiu na edição 129 da Revista Clube Delphi meu artigo sobre a madCollection. Francamente não sei como não é distribuída juntamente com o Delphi, ou com qualquer outra linguagem / IDE, uma biblioteca tão útil. Explico: ela te permite fazer o que as vezes nem a API do windows permite. Neste artigo dei algumas pinceladas, mas a biblioteca é muito maior do que eu demonstrei. Mencionando os artigos que estou lendo AGORA: o artigo dbExpress 4 do Fabrício Kawata e o Padrões Criacionais do Rafael Stavarengo chamaram muito minha atenção. Boa leitura.

Para descontrair hoje

Imagem
Uma boa tarde a todos!

Sobre livros

Imagem
Eu gosto de ler. Não sou um rato de biblioteca, não tenho leitura dinâmica e não leio tão rápido ou com tanta frequência (sem trema desta vez), mas gosto de ler. Gosto de comparar uma boa leitura com uma boa refeição. Já percebeu que às vezes um prato simples, em um restaurante pequeno de um bairro não muito movimentado pode te surpreender? Pode ser exatamente igual ao que sua mãe fazia, por exemplo. O mesmo acontece com livros. Às vezes não damos muita atenção para um livro, e ele nos surpreende. Não apenas pela história envolvente, mas pelas "notas". Sim, notas. Para quem degusta vinhos, café ou perfumes está acostumado a ouvir essa palavra, "notas", fora de um contexto musical. Nos vinhos, pratos e perfumes notas são características, que não são plenamente fixas ou mensuráveis, mas são nebulosas. Não têm extremos, mas têm infinitas gradações. Quantas gradações de sabor podem existir entre o amargo do café e o doce do chocolate? Entre um perfume e outro? Essas

Uma grande verdade sobre tecnologia

Imagem
Vai dizer que não é verdade.

Clube Delphi 128

Imagem
Saiu a Clube Delphi 128, e dessa vez o meu artigo é capa! Agradeço ao Guinther Pauli , editor da revista, pela paciência que tem com meus atrasos :p Meu artigo sobre interoperabilidade  explica como integrar sistemas Delphi Win32, .Net e talvez outros através de DLLs, COM, WebServices e troca de mensagens pela API do windows. Mostro nesse artigo como consumir uma DLL feita em Delphi através do .Net, como consumir pelo Delphi uma DLL .Net através da integração COM, como consumir pelo Delphi um webservice feito em .Net e como fazer as aplicações se comunicarem via API do windows. Lógico, sobre interoperabilidade fiquei devendo, por questões de tempo e espaço, algumas coisinhas que pretendo mencionar em artigos futuros, na revista e/ou neste blog: .Net consumindo webservice em Delphi  Introdução do Lazarus na brincadeira  Integração por sockets  Integração por xml, json e txt Por enquanto não vejo a hora de ler os artigos sobre programação Android com freepascal e o artigo

Verdades sobre programação

Imagem
Esse blog , do @luisdalmolin, contém um excelente texto sobre verdades não tão conhecidas sobre programação. Não tão conhecidas talvez pelos nossos chefes / stakeholders, mas muito bem conhecidas por nós. O post foi traduzido desse aqui   em inglês. Basicamente, o texto fala sobre o que já sabemos: 1) Dez programadores não farão o programa em um décimo do tempo assim como nove mulheres não fazem um bebê em um mês. (apenas uma grande suruba lésbica). 2) Bons programadores passam muito mais tempo lendo, estudando, pensando, refatorando do que escrevendo, codificando e debugando. É fato! Scrum e XP pregam isso. O resto é XGH (eXtreme Go Horse). 3) Programadores (e hoje analistas de sistemas também) são tratados como peões, na rabeira do organograma da empresa, muitas vezes mesmo se destacando em sua área, possuindo graduação, pós graduação e certificações, o que significa que um programador é tratado como um operário mesmo tendo estudado tanto quanto (em alguns casos muito mais) um m

Enquanto isso, em algum lugar da internet

Imagem
Para descontrair... E para quem trabalha com suporte: IPS VIZINHOS QA: Oi, usuário tá conectando com o IP 189.21.22.23 e não tá funcionando DBA: Mas o IP aqui no banco de dados é o 189.22.23.25... Tem algo errado aí QA: Ah, não são iguais, mas são bem próximos né? fonte:  http://fuckyeahdementia.com/  e  http://fuckyeahitbullshit.tumblr.com/

A API GetuserNameEx

Imagem
Primeiro de tudo, a função GetUserNameEx se encontra na dll Secur32.dll e, como outras funções da API do windows, possui duas versões, uma ANSI (GetUserNameExA) e uma WIDE (GetUserNameExW). Abaixo segue o cabeçalho para importação dessas duas funções. function GetUserNameExA(NameFormat: TEXTENDED_NAME_FORMAT; lpBuffer: PAnsiChar; var nSize: DWORD): BOOL; stdcall external 'Secur32.dll' name 'GetUserNameExA'; function GetUserNameExW(NameFormat: TEXTENDED_NAME_FORMAT; lpBuffer: PWideChar; var nSize: DWORD): BOOL; stdcall external 'Secur32.dll' name 'GetUserNameExW'; Atenção especial para o parâmetro NameFormat do tipo TEXTENDED_NAME_FORMAT . Ele é na verdade um Enum com alguns valores fixos. (no C também é um enum, e usa-se um ponteiro para ele) TEXTENDED_NAME_FORMAT = ( NameUnknown = 0, NameFullyQualifiedDN = 1, NameSamCompatible = 2, NameDisplay = 3, NameUniqueId = 6, NameCanonic

Api hooking para mudar o usuário logado

Já está nas bancas a revista Clube Delphi 127 com meu primeiro artigo sobre a madShi Collection. Neste artigo eu explico o básico sobre API Hooking. Neste post falarei sobre um exemplo que não se encontra no artigo, que é o hooking da API GetUserName. Os motivos que levam a hookar essa API podem ser variados, e todos eles nada éticos a meu ver. Você pode desde tentar enganar um produto registrado para um usuário acessando-o como outro usuário ou simplesmente para tapear um usuário administrador, que quando olhar quem está logado verá um nome diferente (supondo que isso funcione, não testei). A idéia é que dá para mudar a resposta que outros programas recebem quando perguntam quem é o usuário logado. Para isso é necessário conhecer quais são as api's que fazem isso e como interceptá-las. O código dessa postagem mostra como usar a madCodeHook para interceptar a api GetUserName da api do windows. Primeiro de tudo criei um programa que mostra o nome do usuário corrente: fu

Primeiro de Abril dos programadores

Quem é do ramo de TI sabe o que são as normas RFC . São conjuntos de convenções onde são estabelecidos padrões para que computadores possam se comunicar e trocar dados entre si, e para que esses dados sejam reconhecidos por todos. Se não fossem essas normas o mundo da TI seria um caos (e já não é). É insteressante o fato de que a norma RFC 2550 foi criada em 1° de abril de 1999, e tratava do bug y2k, o bug do milênio. Desde que a convenção de dadas expressa em 2 dígitos para o ano foi criada sabia-se que em 2000 isso ia dar merda parar de funcionar, mas mesmo assim a solução foi deixada para 1999, a véspera. Lendo a norma, é possível encontrar o seguinte texto, bem - humorado apesar da seriedade e sobriedade das normas RFC: " Nearly everyone now regrets the short-sightedness of the programmers of yore who wrote programs designed to fail in the year 2000. Unfortunately, the current fixes for Y2K lead inevitably to a crisis in the year 10,000 when the programs

O analista de sistemas

Um homem anda por uma estrada próxima a uma cidade, quando percebe, a pouca distância, um balão voando baixo. O balonista lhe acena desesperadamente, consegue fazer o balão baixar o máximo possível e lhe grita: - Ei você, poderia ajudar-me? Prometi a um amigo que me encontraria com ele às duas da tarde, porém já são duas e meia e nem sei onde estou. Poderia me dizer onde me encontro? O outro homem, com muita cortesia, respondeu: - Mas claro que posso ajudá-lo! Você se encontra em um balão de ar quente, flutuando a uns vinte metros acima da estrada. Está a quarenta graus de latitude norte e a cinqüenta e oito graus de longitude oeste. O balonista escuta com atenção e depois pergunta-lhe com um sorriso: - Amigo, você trabalha como analista de sistemas? - Sim, senhor, ao seu dispor! Como conseguiu adivinhar? - Porque tudo o que você me disse está perfeito e tecnicamente correto, porém esta informação me é Totalmente inútil, pois continuo perdido. Será que você não tem uma

Laço for in no lazarus

Já faz um tempinho que saiu esse feature, mas eu nem fazia idéia. Talvez mais pessoas não saibam. Agora já é possível usar o laço for... in no free pascal. Outras alterações previstas para a versão 2.5.x e muito bem vindas é a adição de generics e a nova sintaxe para classes, permitindo class vars e class properties. Segue abaixo um exemplo do operador for...in usando TStringList e Arrays Dinâmicos. procedure TForm1.Button1Click(Sender: TObject); var lista: TStringList; vetor: array of string; s: string; begin lista := TStringList.Create; lista.Add('Delphi'); lista.Add('Lazarus'); lista.Add('C#'); lista.Add('Java'); lista.Add('PHP'); for s in lista do Memo1.Lines.Add(s); //ou showmessage(s) SetLength(vetor, 5); vetor[0] := 'Laranja'; vetor[1] := 'Maçã'; vetor[2] := 'Pera'; vetor[3] := 'Uva'; vetor[4] := 'Cajá';

Leitura obrigatória sobre strings

A maior facilidade das strings do Delphi em relação ao C e C++ é que elas não são baseadas em operações de "baixo nível" com ponteiros. Elas são facilmente quebradas, concatenadas ou copiadas. No caso das cópias, elas podem ser copiadas com performance pois mantém um contador de referências. Em comparação com as linguagens interpretadas, gerenciadas e com "coletores de lixo" as strings nessas linguagens não são tão performáticas. Cópias de strings não são cópias de referências, mas da string completa mesmo, sem reference counting. Tratando - se de concatenação de strings então, o .Net Framework, até a versão 2.0, que eu saiba, encorajava o uso de StringBuilder em vez de strings dentro de um loop para montar um relatório ou tabela na web, por exemplo. Isso porque ao se concatenar duas strings o .Net Framework cria uma nova string com o conteúdo das duas, destruindo as outras duas, gerando um overhead. Imagine quantas operações dentro de um loop não acontecem quan

A linguagem de programação do futuro

         O empenho em analisar a execução dos pontos do programa desafia a capacidade de equalização das condições inegavelmente apropriadas. Podemos já vislumbrar o modo pelo qual a constante divulgação das informações oferece uma interessante oportunidade para verificação das formas de ação. Assim mesmo, o acompanhamento das preferências de consumo cumpre um papel essencial na formulação do fluxo de informações. O que temos que ter sempre em mente é que o comprometimento entre as equipes promove a alavancagem das diversas correntes de pensamento. Pensando mais a longo prazo, a determinação clara de objetivos faz parte de um processo de gerenciamento das novas proposições.             Por conseguinte, a expansão dos mercados mundiais obstaculiza a apreciação da importância das condições financeiras e administrativas exigidas. Nunca é demais lembrar o peso e o significado destes problemas, uma vez que a crescente influência da mídia maximiza as possibilidades por conta dos conhecimen

Nunca confie no TIOBE

Em vários posts meus eu mencionei o índice TIOBE para relacionar a popularidade das linguagens. Mas eu não sabia como o índice TIOBE funcionava, achei que ele era sério, baseado em projetos, mas ele é mais furado que o IBOPE, muito mais. O TIOBE classifica popularidade como número de resultados nos buscadores. Ele parte de vários pressupostos errados. 1) Assume que popularidade é o número de resultados de buscas de uma linguagem em um mecanismo de busca. 2) Assume que todos os buscadores tem o mesmo peso, embora os resultados sejam muito diferentes e o algoritmo também. 3) Não elimina ruidos. Se você pesquisar por java programming encontrará resultados relacionados com uma programação qualquer na ilha de Java, por exemplo. Além do ruido ser problema, a pesquisa é sempre feita com os termos <linguagem> programming, mas termos diferentes relacionados a uma mesma linguagem podem trazer resultados várias ordens de grandeza maiores ou menores do que <linguagem> programm

GEBRASA nunca mais - sobre e-commerce

Trabalho com e-commerce, mas não farei aqui um post sobre desenvolvimento de e-commerce e sim sobre gerência de e-commerce. Qual é a principal preocupação do cliente, e a principal dúvida ao comprar em uma loja "online"? A dúvida é sempre a mesma: "será que a empresa vai entregar?" O pagamento se dá de maneira muito fácil, via cartão de crédito. Mas caso haja algum problema o cliente sabe que o estorno é um inferno. Se o pagamento é intermediado por uma dessas MOIP ou PagSeguro da vida é pior, pois existe mais uma camada intermediária para atravancar o estorno, que pode demorar até 45 dias e fazer com que a empresa simplesmente tome posse de dinheiro seu emprestado, sem juros. Algumas empresas se confundem ou se enganam na hora de entregar um produto, o que é até aceitável, e entregam o produto errado. Depois demoram muito para devolver o dinheiro ou trocar o produto (Submarino, por exemplo). Mas talvez a demora seja causada pela massa: um volume muito grande

madShi collection

Imagem
Saiu na revista Clube Delphi 127  meu artigo sobre a madShi Collection, uma coleção de bibliotecas muito úteis e interessante. Elas vão além do basicão fornecendo aos programadores funcionalidades bastante inusitadas, como api hooking, e funcionalidades que são uma mão na roda na hora de distribuir seu software ou na hora de encontrar bugs persistentes. O madExcept é um gerenciador de exceções que automaticamente gera um log com nome da unit e até a linha do código que disparou o erro. Seu usuário pode simplesmente clicar em um botão para te enviar o relatório de erros. Espero que gostem do artigo. Boa leitura :)

Dicas de Inglês

O inglês é essencial para programadores. Ponto. Não importa o pais em que você esteja, o inglês é o esperanto que deu certo, pelo menos nessa nossa era. O site Tecla Sap tem muitas dicas interessantes para quem já cursa inglês mas quer sanar dúvidas, pegar dicas ou aprimorar seus conhecimentos. Peguei essa dica hoje no site: Palavras com "L" mudo. Acontece também com outras letras, por isso muita atenção à pronúncia. Ensaie a pronúncia em diálogos reais. ALMS /aams/ Esmola BALM /baam/ Bálsamo CALM /kaam/ Calmo COULD /kud/ Passado do verbo auxiliar “CAN” (poder) HALF /héf/ Metade PALM  /paam/ Palma; palmeira;  palm PSALM /saam/ Salmo SALMON /SÉ m@n/ Salmão SHOULD /shud/ Deveria (verbo auxiliar) SOLDER /SÓ d@r/ Solda TALK /tók/ Conversar WALK /wók/ Andar WOULD /wud/ Verbo auxiliar usado no condicional I’ll have the salmon, please. Vou querer o salmão, por favor. Aluminum is also very difficult to solder. (Chicago Tribune) É muito difícil s