Postagens

Mostrando postagens de 2014

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…

Fácil e reutilizável galeria de imagens em Jquery

Imagem
Se você é programador vai achar esse código um tanto quanto é trivial, mas se você for designer, como o cara que me pediu isso, talvez isso seja muito útil pra você.

Direto vemos galerias de imagens e hotsites e afins, e hoje é simplesmente ridículo fazer esse tipo de coisa com flash. Flash aos poucos está sendo banido da Internet. 
HTML5 e um pouco de jQuery é o que você precisa para fazer uma galeria de imagens onde seja possível escolher a imagem com thumbnails, avançar, voltar e ter exibição automática em ciclo. 
Aqui eu corrijo um erro muito comum dessas galerias: se uma nova imagem aparece a cada 5 segundos, e o usuário passou 4 segundos na última imagem, não seria correto trocar a imagem novamente no timeout, um segundo depois. Com a interação do usuário o timer deveria ser resetado. 
Crie uma página HTML com o conteúdo abaixo. Você pode trazer o  jquery de um CDN também.

Repare nos comentários do código. Uso atributos do tipo data-* e algumas funções anônimas. Untitled Document


Tudo o que você precisa saber sobre CORS

Primeiro de tudo, a documentação: http://www.w3.org/TR/cors/
Segundo, como configurar no IIS 7: http://i-liger.com/article/cross-domain-http-request
Como configurar cors no IIS 6: http://enable-cors.org/server_iis6.html
É importante salientar que essa configuração também é possível via web.config. Como o web.config é hierárquico, hereditário e combinatório, então você pode colocar um web.config adicional pequenininho com cabeçalhos só para permitir CORS nas páginas de um diretório, em vez da aplicação inteira.
Se a configuração não for para a aplicação inteira nem para uma pasta inteira temos que colcoar cabeçalhos http na página. Os cabeçalhos são:
Access-Control-Allow-Origin -> indica quais domínios podem fazer um request no seu, colocando * permite todos os domínios.Access-Control-Allow-Methods -> indica quais métodos são permitidos o cliente consultar no seu domínio. Não adianta colocar só post ou get, pois o client pode mandar uma requisição head para saber encoding e conte…

Domine a herança de construtores

Em hierarquias longas de objetos é importante saber onde colocar o código dos contructors (construtores) pois eles tem uma ordem lógica para executar e, se for um parameterless constructor (construtor sem parâmetros) então todos os parameterless constructors serão executados desde a raiz object.

Um parameterless constructor sempre executa o parameterless constructor da classe base (pai), mas um construtor com parâmetros você deve especificar:


:this([parametros]) para executar um outro constructor na mesma classe e deixar a hierarquia seguir sucessivamente:base([parametros]) para executar um constructor específico da classe baseNADA para executar o parameterless constructor da base.

O programa abaixo ilustra isso.


using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace HerancaConstrutor { class ClasseBase { public ClasseBase() { Console.WriteLine("parameterless constructor da…

As vezes eu esqueço por que programo

Imagem
Mas o 9gag me faz o favor de me lembrar.


Duas funções úteis para manipulação de datas

Imagem
De tempos em tempos precisamos fazer aquele processamento que só pode ser feito em dias úteis. Seja a data de pagamento de um boleto, o agendamento de uma entrevista e assim por diante.

O desafio disso está no fato de que temos feriados nacionais com dia fixo, feriados com dia variável porém computável (através de algoritmos) e feriados municipais.

Os municipais não tem outra forma de atender senão consultando uma tabela do banco de dados pelo código do município, mas os feriados nacionais fixos nós podemos dar uma bom começo.

Segue abaixo a função fn_dia_util que retorna 1 se o dia for útil e 0 se for sábado, domingo ou feriado (usando a função weekday para isso) e a função fn_proximo_dia_util, que verifica se o próximo dia é util e se não for vai acrescentando um em loop. Mesmo se o feriado cair numa sexta-feira ela retornará o próximo dia útil.


-- ########################################################################################################################################…

Duas maneiras de se fazer split no Delphi XE2 parecido com a função split do C#

Imagem
Para se fazer uma função split no Delphi basta usar array dinâmico ou list de string.
O exemplo abaixo mostra como.


function split(original: string; separador: string) : TStringArray; var idx: integer; tmp, item: string; resultado: TStringArray; begin idx:=0; SetLength(resultado, idx); tmp := original; while Pos(separador, tmp) > 0 do begin SetLength(resultado, length(resultado)+1); item := Copy(tmp, 1, Pos(separador, tmp)-1); tmp := Copy(tmp, Pos(separador, tmp) + length(separador), length(tmp) + Pos(separador, tmp) - length(separador)); resultado[idx] := item; inc(idx); end; SetLength(resultado, length(resultado)+1); resultado[idx] := tmp; Result := resultado; end; function split2(original: string; separador: string) : TList < string >; var tmp, item: string; begin result := TList< string >.Create; tmp := original; while Pos(separador, tmp) > 0 do begin Result.Add( Copy(tmp, 1, Pos(separador, tmp)-1));…

Reflexão no Javascript

Imagem
Dado um objeto javascript, é possível varrer seus métodos e propriedades e até mesmo serializá-lo.
Para isso devemos fazer uma conversão forçada do objeto para um vetor, e varre-lo. Cada item desse vetor pode ser um método ou uma propriedade.
O que vai dizer se ele é um método ou uma propriedade é que seu tipo, dado pela função typeof():
quando, como string, for igual a "function" significa que ele é um método ou função. caso contrário é uma propriedade.
Código da função de serialização
///Transforma um objeto em string considerandp se é null ou undefined function ObjToString(obj) { if(obj === null) { return "null"; } if(typeof obj === "undefined") { return "undefined"; } return obj.toString(); } ///escreve as propriedades do objeto na página function serialize(obj) { //coleção de métodos var metodos = []; //coleção de propriedades var propriedades = …

Consultando apenas os registros "sujos" em uma tabela com Microsoft SQL Server

Imagem
Lidando com bancos de dados podemos controlar as transações e a maneira como podemos acessar os dados em transações concorrentes.

Os níveis de isolamento de transação e os comandos para tais serão discutidos em um próximo post, porém, resumidamente, temos (Serializável, snapshot, repeatable read, read commited, read uncommited).

Dirty read (read uncommited ou nolock) nos permitem visualizar os dados de uma tabela mesmo sendo sujos (alterados em outras transações). Isso garante, com certo nível de inconsistência se as transações forem desprezadas e o  rollback usado, uma leitura o mais rápido possível dos dados no seu estado atual quase que em tempo real.

No entanto, como separar os dados "sujos" daqueles que já estavam gravados e commitados?
Imagine que você tem um ambiente onde um sistema legado permite que a aplicação seja fechada, após uma exception ou queda de rede, sem dar commit ou rollback nas transações correntes. Você rapidamente ficaria com várias transações em ab…

Como ordenar o conteúdo de um Memo com regras personalizadas

Recentemente um colega delpheiro me perguntou como ordenar um memo não pelo seu conteúdo, mas por alguma regra especial.

No caso dele, ele tinha no memo várias strings separadas por ":" com números do outro lado. Algo assim:

A:3
B:5
C:1

Devendo ficar:

C:1
A:3
B:5

Para isso podemos usar a função CustomSort do memo, passando como argumento uma função. Essa é uma função especial que aceita uma lista como parâmetro, dois índices da lista e retorna um integer. Assim ela pode comparar dois itens da lista e retornar 1 se o primeiro for maior, 0 se os itens forem iguais ou -1 se o segundo for maior.
Essa função é que fará todo o trabalho de comparação, portanto você decide como os itens serão comparados. A função CustomSort saberá que deve chamar a sua função para decidir, na varredura, qual item é maior porque você passará o nome da sua função, como se fosse um delegate ou ponteiro para função, como argumento para  a função customsort.

Os memos podem ser usados como dictionaries, o…

Validação e conversão de datas

Dentre os problemas mais recorrentes em sistemas podemos citar os relacionados à cultura: charset, datas e formatação de números.Datas são especialmente problemáticas porque podem ser ambíguas dependendo da cultura, por exemplo 02/01/1990 pode ser dois de janeiro no Brasil ou primeiro de fevereiro nos EUA.Ainda mais agravante é o fato de nem sempre podermos validar as datas nos imputs, pois as mesmas podem vir de arquivos de integração, outros sistemas, CSV, TXT, Excel ou webservices.Pensando nisso eu fiz uma pequea demonstração do uso dos comandos cast e convert para converter varchar para datas e datas para varchar, e mostrando onde estão os erros mais comuns.

/******************************************************************************************************* ******************************** DEMONSTRAÇÃO DE CONVERSÃO DE DATAS ************************************ ********************************************************************************************************/ --imagine qu…

Criando um identificador único no excel

Imagem
Para criar um identificador único no exel, tanto para identificar uma linha sem repetições como para fazer scripts para exportar os dados do excel para um banco de dados é necessário abrir o editor de código VBA do excel, na aba Developer.
Caso a guia não esteja aparecendo para você clique em file -> options -> customize ribbon e marque a opção developer à direita.
Na aba developer abra o editor do visual basic, crie um novo módulo e adicione o código.
Public Function NewId() As String NewId = Mid$(CreateObject("Scriptlet.TypeLib").Guid, 2, 36) End Function Public Function NewGuid() As String NewGuid = CreateObject("Scriptlet.TypeLib").Guid End Function
A função NewId é igual a newid() do sql server e cria uma Guid sem as chaves no início e fim. A NewGuid está aí só para demonstração e apresenta guids com as chaves.
Ambas usam o objeto COM Scriptlet.TypeLib e chamam o método Guid.
Eu uso isso quando eu tenho que importar dados de um…

Essa é pra quem curte Duna

Imagem
Pra quem conhece, vai entender de primeira.

Na boa, sem fazer spoil, esse livro é um dos melhores que eu já li, tem espaço especial dedicado a ele na minha estante.  Ele simplesmente mistura à ficção científica elementos de religião, filosofia, política e ecologia. Muito avançado para o seu tempo, e praticamente profético se levarmos em conta o caminho que estamos trilhando rumo ao esgotamento da água potável do planeta. 
Leitura recomendada.