terça-feira, 26 de fevereiro de 2013

Vaga para programador Delphi 2007, ASP.NET/C#

Quality Digital

Dados da vaga:
Vaga para programador Delphi 2007, ASP.NET/C#; Conhecimento em banco de dados SQL Server 2008 R2; HTML, CSS3, JavaScript

É um diferencial se o candidato possuir conhecimentos com (WebForms, WebService, JSON) e E-Commerce com integração com gateway de pagamento

Programação voltada para sistemas web e desktop.

Requisitos:
  • Delphi 2007;
  • ASP.NET/C#;
  • SQL Server 2008;
  • HTML e CSS3;
  • JavaScript;
40 horas semanais

Demais detalhes, envie email para Taína Medeiros com o CV atualizado e pode mandar a url da vaga aqui do blog para ela se localizar.

quarta-feira, 13 de fevereiro de 2013

C# - LINQ First(), FirstOrDefault(), Single(), Last(), LastOrDefault()

Bom, a pedido do Cristiano Carvalho, neste post e nos próximos estarei comentando sobre os métodos LINQ que considero mais importante.

Se tiverem alguma sugestão ou pedido de outros métodos, por favor.


LINQ First(), FirstOrDefault(), Single(), Last(), LastOrDefault()


Neste post falarei sobre os métodos First, FirstOrDefault, Single, Last e LastOrDefault do LINQ, que são muito simples, mas exigem cuidado.
Todos são métodos de busca com uma sobrecarga que permite que seja atribuído um predicado à busca, ou seja, podemos fazer uma busca em uma lista de números inteiros, onde o predicado é: "que seja maior do que 10", por exemplo.
int primeiroNumeroMaiorQueDez = listaDeNumerosInteiros.First(numero => numero > 10);

Apesar dos métodos First e FirstOrDefault fazerem praticamente a mesma coisa, eles tem algumas diferenças, que serão discutidas adiante:

Fizemos um teste, buscando em uma lista de números inteiros, o primeiro elemento com o valor 100, através do método FIRST, sendo que na lista existia tal número.

Teste FIRST em uma lista com o elemento procurado

Em seguida fizemos o mesmo teste, em uma lista que não contém o número 100, o que nos levaria a uma dúvida: "O que o método irá nos retornar então?". A resposta é: "Uma exception".

Teste FIRST em uma lista sem o elemento procurado

Porém, em alguns momentos, gostaríamos de recuperar o elemento procurado apenas se ele existir, e se não existir, queremos que um valor default seja retornado, sem gerar exception, que no caso de uma lista de números inteiros é o número 0.
Neste caso, devemos utilizar o método FIRSTORDEFAULT:

Teste FIRSTORDEFAULT em uma lista sem o elemento procurado

Outro método que busca um elemento em uma lista é o Single, com o diferencial de que tal método, está esperando procurar um elemento único em uma lista, portanto o número de ocorrências do número procurado na lista não pode ser diferente de 1:

Teste SINGLE em uma lista sem o elemento procurado

Teste SINGLE em uma lista com apenas uma ocorrência do número procurado

Teste SINGLE em uma lista com mais de uma ocorrência do número procurado

Os métodos Last e LastOrDefault, se assemelham ao Fist e FirstOrDefault respectivamente, sendo que ao invés de buscarem o primeiro elemento, buscam o ultimo.

Não confunda. Com o método FirstOrDefault, o método First e Single parecem ser inúteis, porém cada um deles tem suas utilidades, por exemplo:
Se quisermos procurar em um cadastro, onde o CPF deve ser único, um usuário que tenha o CPF = 118.187.881-00, qual método usaríamos e porque?

A resposta é: "Single", pois se existir mais de um usuário com o CPF procurado, por alguma falha na lógica do sistema, isso pode gerar um problemão.

Suponha que a intenção de buscar o usuário pelo CPF seja de debitar um valor X de sua conta, gostaria que houvesse uma confusão entre 2 usuários, ou preferiria que uma exception fosse gerada para que sua equipe pudesse analisar o problema?

Bom, espero ter ajudado.

Abaixo disponibilizarei as classes utilizadas. O código-fonte pode ser obtido através do link(source) ou no git:
https://github.com/fsaalmeidinha/LinqFirst_Single_Last.git

TestLinqMethods.cs

Program.cs

quinta-feira, 7 de fevereiro de 2013

C# - LINQ Select

Bom, a pedido do Cristiano Carvalho, neste post e nos próximos estarei comentando sobre os métodos LINQ que considero mais importante.

Se tiverem alguma sugestão ou pedido de outros métodos, por favor.


LINQ Select()


Neste post falarei sobre o método Select do LINQ.
Como o próprio nome já diz, a função do método select é selecionar algo
Por exemplo:
Temos uma lista de usuários e queremos selecionar apenas os Ids desses usuários para trabalhar com uma estrutura mais simples e leve

Selecionar os ids dos usuários


Podemos também selecionar objetos anônimos
Por exemplo:
Temos de listar os usuários, mas aos invés de retornar os campos do objeto Usuario, queremos retornar outros campos. O detalhe é que o retorno desse select deve ser armazenado em uma variável do tipo object ou VAR (variáveis não tipadas):
Queremos retornar um novo objeto com:
Id: Igual ao do usuário
Descricao: NomeUsuario(EmailUsuario) - 'Ex: Felipe Almeida(felipe.silvalmeida@gmail.com)'

Select anônimo


Outra curiosidade que poucos conhecem, é a possibilidade de incluir o índice do objeto na lista, no método select, ou seja, agora temos algo do tipo:

usuarios.Select((usuario,indice) => new { IndiceNaLista = indice, NomeUsuario = usuario.Nome });

Select com índice



Abaixo disponibilizarei as classes utilizadas. O código-fonte pode ser obtido através do link(source) ou no git:
http://github.com/fsaalmeidinha/linq_select.git

LinqSelect.cs

Usuario.cs

Program.cs

quarta-feira, 6 de fevereiro de 2013

C# - Criando métodos de extensão

Neste post, acredito que vou ajudar muitas pessoas que trabalham com enumeradores em seus códigos. Vou falar sobre Extension Methods.
Para quem já utilizou os métodos que o System.Linq disponibiliza, de uma forma ou de outra já utilizou métodos de extensão.
Como assim?

Já repararam que quando incluimos o pacote System.Linq em nosso código, as nossas listas passam a ter novos métodos como 'First', 'FirstOrDefault', 'Select', entre outros?

Ótimo, esses são métodos de extensão da interface IEnumerable, ou seja, todas as formas de listagem a partir de agora possuem tais métodos.

Para quem já conhecia o System.Linq, nunca se perguntou como esses métodos apareceram nos nossos objetos IEnumerable? Eu me perguntava há um tempo atrás, antes de conhecer os métodos de extensão, mas pensava que não seria possível criar os meus próprios métodos de extensão, e ai que me enganei.

Há alguns meses, por acaso acabei descobrindo como esses métodos aparecem em nossos objetos, e acredite, é de uma forma muito simples.

Por exemplo, quero criar um método de extensão para os objetos do tipo String, para verificar o tamanho de uma string(assim como o método Length faz), mas com um diferencial de quando a string for nula, quero que seja retornado length = 0 ao invés de obter uma NULL POINTER EXCEPTION.
Simplesmente criaremos uma classe estática com o nome StringExtensions:

StringExtensions.cs

Agora basta incluir o namespace em que o StringExtensions.cs foi criado na classe em que queremos tal funcionalidade:
using ExtensionsMethods.Extensions;

A partir de então, todos os objetos do tipo string terão o método LengthOrDefault.

Legal, agora que já aprendemos como criar um método de extensão, irei mostrar como isso pode nos ajudar trabalhando com enumeradores. Digamos que temos um cadastro de usuário em um sistema e um dos campos que devem ser preenchidos é o tipo de pessoa('Pessoa Física' ou 'Pessoa Jurídica').

Como sabemos, um enumerador não tem descrição, mas ao mesmo tempo, não gostaríamos que na nossa tela, as opções apresentadas fossem 'PessoaFisica', 'PessoaJuridica', ignorando acentuação e o espaço entre as palavras, então como faríamos para vincular uma descrição aos enumeradores? Melhor ainda, não seria perfeito se pudéssemos obter a descrição de um enumerador como uma propriedade do próprio enumerador? (ex: ETipoPessoa.Fisica.Descricao)

Faremos isso, mas ao invés de uma propriedade, iremos criar um método de extensão que recupera a descrição do enumerador através de um atributo do mesmo.

ETipoPessoa.cs

EnumExtensions.cs

Como disse, basta incluir o namespace ExtensionMethods.Extensions na classe onde desejamos obter a descrição do enumerador e..


Executando o código obtivemos o seguinte resultado:

Muito bom, agora conseguimos obter a descrição de um enumerador de forma fácil.
Basta utilizar a criatividade para criar métodos de extensão que nos ajude no nosso dia a dia.

O código fonte pode ser encontrado no link(source) ou através do git em:
https://github.com/fsaalmeidinha/extensionmethods.git

Qualquer dúvida ou crítica, podem comentar no post ou entrar em contato por email ou skype(informados à direita).

terça-feira, 5 de fevereiro de 2013

C# - Yield Return

Yield return é um comando que pouca gente conhece e menos ainda o utiliza, porém em alguns casos, nos ajuda e muito.
Yield return utiliza lazy-load, ou seja, carregar aos poucos.
A sintaxe do yield é muito simples:
RecuperarSerieFibonacci
Neste exemplo, temos um método que retorna a série de fibonacci (1,1,2,3,5,8...). Se prestarmos atenção no código, podemos perceber que ele não tem uma condição de parada, o que nos levaria a pensar que a execução do mesmo nunca sairia do loop, porém ai que entra o "carregar aos poucos".
Quando chamamos o método RecuperarSerieFibonacci, o valor da série só será carregado quando pedirmos, por exemplo: RecuperarSerieFibonacci().Take(10).ToList() iria processar os 10 primeiros números da série de fibonacci.
Bom, mas poderiamos fazer o mesmo sem utilizar a série de fibonacci, certo? Então qual a vantagem?
Criei um outro exemplo onde precisamos descobrir o índice de uma palavra dentro de um arquivo de texto, então, para simular o problema, criei um arquivo com cerca de 30 mil linhas e coloquei 3 palavras que deveriam ser encontradas:
1. inconstitucionalissimamente (no inicío do arquivo, proximo da linha de número 10)
2. paralelepipedo (na metade do arquivo, proximo da linha de número 15 mil)
3. pneumonia (no final do arquivo, proximo da linha de número 30 mil)
Criei também 2 métodos para retornar cada uma das palavras de cada linha do arquivo, um utilizando yield return e o outro não.
Por fim, chamei os métodos procurando cada uma das palavras, obtendo o seguinte resultado:
Resultado Analisador
Como pudemos observar, em todos os casos, obtivemos um melhor resultado quando utilizamos o yield return, isso ocorreu pelos seguintes motivos:
1. Quando procuramos as palavras que estavam no inicio ou no meio do arquivo, quando não utilizamos o yield return, todo o arquivo era lido e separado por palavras para depois a palavra ser procurada, já quando utilizamos o yield return, o arquivo era lido a cada linha, fazendo com que o arquivo não precisasse ser lido por completo, economizando tempo de leitura.
2. No caso da terceira palavra, como a mesma estava no final do arquivo, então porque ainda assim a performance foi melhor? Isso ocorre pois utilizando o yield return, os valores retornados pela função não foram armazenados em memória da forma como construímos a busca.

Muito bom não?

Abaixo estou disponibilizando as classes utilizadas. O arquivo de texto utilizado para a busca só pode ser encontrado através do download do código fonte no link (source) ou fazendo download através do git em:
https://github.com/fsaalmeidinha/yieldreturn.git

FileTexthelper.cs
Analisador.cs

domingo, 3 de fevereiro de 2013

Política de Privacidade

Este site pode utilizar cookies e/ou web beacons quando um usuário tem acesso às páginas. Os cookies que podem ser utilizados associam-se (se for o caso) unicamente com o navegador de um determinado computador. Os cookies que são utilizados neste site podem ser instalados pelo mesmo, os quais são originados dos distintos servidores operados por este, ou a partir dos servidores de terceiros que prestam serviços e instalam cookies e/ou web beacons (por exemplo, os cookies que são empregados para prover serviços de publicidade ou certos conteúdos através dos quais o usuário visualiza a publicidade ou conteúdos em tempo pré-determinados). Usamos empresas de publicidade de terceiros para veicular anúncios durante a sua visita ao nosso website. Essas empresas podem usar informações (que não incluem o seu nome, endereço, endereço de e-mail ou número de telefone) sobre suas visitas a este e a outros websites a fim de exibir anúncios relacionados a produtos e serviços de seu interesse. O Google, como fornecedor de terceiros, utiliza cookies para exibir anúncios neste site. Com o cookie DART, o Google pode exibir anúncios para o usuário com base nas visitas feitas à este ou à outros sites na Internet. O usuário pode desativar o cookie DART visitando a Política de privacidade da rede de conteúdo e dos anúncios do Google. O usuário têm a possibilidade de configurar seu navegador para ser avisado, na tela do computador, sobre a recepção dos cookies e para impedir a sua instalação no disco rígido. As informações pertinentes a esta configuração estão disponíveis em instruções e manuais do próprio navegador.

sábado, 2 de fevereiro de 2013

C# - Utilizando o Try Catch

Esse post eu dedico para aqueles que acham que try catch pode ser utilizado para qualquer fim e a qualquer hora.
Acredito que todos conhecem como devemos utilizar o famoso try catch, então vou dar apenas uma breve explicação.
Existem partes do nosso código que não conseguimos gerenciar, como por exemplo, quando utilizamos dlls externas ou quando consumimos um WebService, nesses casos, internamente, na chamada do método, podem ocorrer erros que não gostaríamos que fossem exibidos ao usuário do nosso sistema, então adicionamos um bloco de tratamento de exceção onde o try engloba o bloco de código não gerenciavel e o catch contém o tratamento da exceção e por  fim podemos adicionar um finally que será executado em caso de exceção ou não.
Exemplo bloco try catch
Ou seja, o bloco try catch só deve ser adicionado quando não conseguimos encontrar uma forma de descobrir se um bloco irá dar erro ou não.

Estou enfatizando o correto uso do try catch, pois muitos programadores(inclusive eu em meus primeiros meses de programação) não sabem o quanto ele não é performático, e optam por utilizar o bloco try catch em momentos em que conseguimos evitar uma exception, por exemplo:

- Temos um cadastro de usuário que deve ser validado antes de ser gravado no banco de dados.
Usuario{Id, Nome,Idade,...}
 Criamos 2 métodos, o primeiro validando se o nome do usuário foi informado e se tem até 100 caracteres utilizando try catch:
Utilizando o try catch
e outro validando da forma correta, verificando antes se o Nome não é nulo, pois isso não nos permitiria ver se o tamanho do nome tem mais de 100 caracteres:
Não utilizando o try catch Simulamos a execução de tais métodos 10 e 1000 vezes, informando um usuário com nome = null para ver quanto tempo demorou cada uma das execuções e obtivemos o seguinte resultado:
Como podemos verificar, utilizando o try catch, o tempo de execução foi muito maior, portanto, quando forem utilizar um bloco try catch, parem e pensem se realmente ele é necessário no código.
Com esse post não estou dizendo que o try catch não deve ser utilizado, apenas quero que pensem quando realmente é necessário utiliza-lo.

Abaixo estou disponibilizando as classes utilizadas. O código fonte do projeto pode ser encontrado no link(source) ou através do github em:
https://github.com/fsaalmeidinha/trycatch.git

Usuario.cs

Analisador.cs

Main.cs

sexta-feira, 1 de fevereiro de 2013

C# - O poder do StringBuilder

Olá, neste post, irei comentar um pouco sobre o poder do StringBuilder.
Quantas vezes não nos deparamos com situações no nosso código em que temos que concatenar strings inúmeras vezes?
Ex: Temos que gerar um relatório de quantas vezes cada usuário do sistema acessou o mesmo.
Para exemplificar em quais momentos devemos utilizar o StringBuilder, desenvolvi o seguinte exemplo:

Criamos uma classe de Usuario que tem os seguintes métodos:
-List<Usuario> ListarUsuariosDoSistema(int qtdUsuarios)
simula a listagem dos usuários de um sistema, onde qtdUsuarios seria a quantidade de usuários que o sistema tem.

-string GerarRelatorioAcessoAoSistema_UtilizandoStringBuilder(int qtdUsuarios)
-string GerarRelatorioAcessoAoSistema_SemUtilizarStringBuilder(int qtdUsuarios)
Cria o relatório,
String.Format("Id:{0} - Nome: {1} - Email: {2} - Número de acessos: {3}",                    usuarioSistema.Id, usuarioSistema.Nome, usuarioSistema.Email, usuarioSistema.AcessosAoSistema) , para cada um dos usuários do sistema.

Simulamos então a geração do relatório utilizando o StringBuilder (GerarRelatorioAcessoAoSistema_UtilizandoStringBuilder), passando o número de usuários do sistema = 10.
Fizemos o mesmo sem utilizar o StringBuilder (GerarRelatorioAcessoAoSistema_SemUtilizarStringBuilder)

Observamos então que o segundo método, sem a utilização do StringBuilder, foi 3 vezes mais veloz, demorando 0,00056 segundos, enquanto o outro método demorou 0,0024 segundos.

Porém em muitos cenários, temos um número muito maior de registros, e nesses casos, o StringBuilder é essencial. Simulamos os mesmos exemplos com 1000 usuários e obtivemos os seguintes resultados:
comStringBuilder: 0,0051 segundos
semStringBuilder: 0,0987 segundos
Observamos então que o primeiro método, com a utilização do string builder, foi 15 vezes mais veloz.

Fizemos um terceiro caso, com 10000 mil usuários, obtendo os seguintes resultados:

comStringBuilder: 0,0630 segundos
semStringBuilder: 15,5369 segundos
Observamos então que o primeiro método, com a utilização do StringBuilder, foi 246 vezes mais veloz.


Percebemos que para casos com pouca concatenação, o uso do StringBuilder tem um desempenho pior, porém quanto maior o número de concatenações, o StringBuilder se torna milhares de vezes mais eficiente do que a concatenação de strings, tanto em questão de tempo como em questão de memória. Isso ocorre por que ao concatenar 2 strings, uma nova instancia de string é criada para suportar o novo valor(uma string é um array de char com tamanho fixo, portanto ao mudar o tamanho da string, uma nova instancia de 'array de char' deve ser criada). Já o StringBuilder trabalha de uma forma diferente, fazendo com que não seja necessário criar uma nova instancia de string.

Abaixo, estou disponibilizando as classes utilizadas para os testes acima, o código fonte pode ser baixado através do link(source) ou através do git hub em:
https://github.com/fsaalmeidinha/poderdostringbuilder.git

Comentem se gostaram ou não, dúvidas, como posso melhorar...

Usuario.cs
Analisador.cs