Páginas

domingo, janeiro 13, 2013

Pequena dica de JUnit

Muitas vezes precisei recorrer ao manual do JUnit para lembrar algumas coisas se sua sintaxe e funções, então para facilitar fiz um pequeno código comentado que pode ser um guia hiper-rápido, como abaixo:

   /**
    * Este método é invocado antes de cada teste, 
    * a annotation facilita isso
    */
 @Before
 public void setUp() {
  //Tudo aqui será executado antes, servindo por exemplo para inicializar.
  calculator = new Calculator();
 }

O código completo se encontra aqui.

sábado, abril 21, 2012

Desenvolvimento orientado a testes: O inicio


Tranquilo, ágil e preciso, como um ninja

O desenvolvimento orientado por testes (Test-Driven Development) é com certeza um dos novos meios de agilizar o processo de desenvolvimento, não através de aceleração da programação, mas através da criação de testes automatizados antes mesmo da implementação e refatoração do código (Isso mesmo que você leu, antes de programar algo, você "testa" ele), trabalhando em cima da qualidade do código, de forma tranquila e ágil, como um verdadeiro ninja da programação.

Apesar de ser difícil de compreender no início, o desenvolvimento orientado a testes segue uma abordagem simples: código limpo que funciona. Ao iniciar o desenvolvimento de uma nova funcionalidade, você deve saber qual será o resultado em um determinado cenário e implementar algo que comprove que o seu código chegará ao resultado deste cenário. Um exemplo simples seria criar uma função ao receber o valor do raio de um circulo retorne o seu perímetro. 

Obs: Antes de prosseguir, vamos lembrar da fórmula usado para calcular o perímetro de um circulo, que é o seu raio multiplicado por dois multiplicado por PI (2 * raio * PI). Vamos considerar PI = 3,1415.

Então, pensando "ao contrário", criamos o teste para um circulo com raio igual a 5 que deve retornar 31,415:

se calculaPerimetro(5) = 31,415 então
    exiba "O teste passou""
senão
    exiba "O teste não passou"

Com o teste criado, realizamos o teste e percebemos um pequeno problema, a função calculaPerimetro nem existe ainda, então como poderemos testá-la? Calma, é assim mesmo, não podemos testar algo que nem existe ainda, então criamos a implementação mais simples possível da função em questão e fazemos nosso teste:

função calculaPerimetro(numero raio)
    retorna vazio
fim da função

Agora rodamos o nosso teste (de mesa) e ele falha miseravelmente... Choro? Tristeza? Hora de afogar as mágoas em uma garrafa de café? Não, jovem padawan. A falha no teste mostra que realmente o teste funciona, afinal vazio não é igual a 31,4 em nenhum lugar desse universo. Vamos prosseguir em pequenos passos. 
Agora o que devemos fazer é forçar a passagem no teste com a implementação mais simples possível, desta forma, vamos alterar nossa função para retornar o valor esperado:

função calculaPerimetro(numero raio)
    retorna 31,415
fim da função

Que que isso? Trapaça? Sabotagem? Preguiça?
Não amigos, apenas seguimos um dos principais preceitos do desenvolvimento guiado a testes, dar passos pequenos para podermos progredir sem medo. Ao realizarmos o nosso deste ele funciona perfeitamente e agora podemos progredir para a refatoração,e ai entra um dos principais segredos do desenvolvimento orientado a testes.

Como eu já tenho um teste comprovadamente funcional e perfeito, qualquer alteração que eu fizer deve satisfaze-lo, ou seja, o que eu fizer na minha função só estará correto ao passar no teste e por isso nós temos um norte a seguir. Vamos prosseguir:

função calculaPerimetro(numero raio)
    numero PI = 3,1415
    numero dobroDoRaio
    numero perimetro
    
    dobroDoRaio = 2 * raio
    perimetro = dobroDoRaio * PI
    
    retorna perimetro
fim de função

Então vamos lá, mais uma vez rodar o nosso teste de mesa e... Rufem os tambores... Ele passa! Nosso teste continua funcionando e agora com a função implementada, podemos partir para outra fase, a refatoração. Eu sei, eu sei, você deve estar gritando ai dentro, que devemos diminuir esta função e usar menos variáveis, por isso vamos lá, altera-la novamente, cotando essa variável feiosa chamada dobroDoRaio e na sequência vamos testa-la:

função calculaPerimetro(numero raio)
    numero PI = 3,1415
    numero perimetro
    
    perimetro = 2 * raio * PI
    
    retorna perimetro
fim de função

Realizamos um novo teste, que também passa, ou seja, nossa implementação ainda é válida, mas é claro que nosso código ainda pode melhorar, simplificar mais um pouco:

função calculaPerimetro(numero raio)
    numero perimetro
    
    perimetro = 2 * raio * 3,1415
    
    retorna perimetro
fim de função

Isso ai, eliminamos mais uma variável que eu não considerava útil declarar por usarmos apenas uma vez em nosso código e o teste continua passando. Mas perai, existe uma varável ali que também só é usada uma vez... vamos nos ver agora variável "perimetro":

função calculaPerimetro(numero raio)        
    retorna 2 * raio * 3,1415
fim de função

Vamos testar e... podemos ver que realmente o teste continua funcionando e acredito que não há mais nada que possa ser feito em nossa função para aperfeiçoa-la (mas é claro, caso surja uma idéia, podemos testa-la na prática a qualquer momento, pois já temos o teste pronto). 

Cinco dragõezinhos, um de cada vez, é bem mais fácil.
Apesar de simples (e eu sei que você ficou se coçando para fazer essa implementação ou parecida com ela desde o começo), desta forma nós podemos ver como realmente funciona o desenvolvimento guiado por testes, através de passos pequenos e mudanças aparentemente simples, podemos retrabalhar um código sem ter que enfrentar um dragão de cinco cabeças que assusta até o pior vilão de um chifre só, podendo dividir o problema em partes menores e verificar o resultado das nossas alterações.

Existem diversas formas de criarmos nossos testes unitários, e não é necessário você fazer um programa só para testar. Existem diversos frameworks em praticamente todas as linguagem que facilitam a realização dos testes, além de terem ferramentas que mostram estatísticas úteis para auxiliar no desenvolvimento. 

No próximo post vou mostrar um exemplo prático baseado neste nosso pequeno problema, utilizando o JUnit, que é uma ferramenta para testes de código Java, junto com o Eclipse, então, até lá.

sábado, julho 30, 2011

Iniciando no VIM

Uma dos maiores conflitos entre programadores, capaz de causar o caos entre pessoas que deveriam se considerar irmãos de sofrimento e noites mal dormidas: o editor que será usado!

Clique na imagem, é um pequeno guia ;D

Calma, talvez o parágrafo acima tenha sido um pouco exagerado e exaltado as emoções, porém a decisão de qual editor de código usar tende a ser um pouco complicada para todos os novos usuários (e velhos também). Vantagens e desvantagens são incontáveis, porém cada um sabe a sua necessidade e dribla os defeitos compensando de outras formas, então o programador deve saber escolher muito bem a ferramenta que usa e domina-la de uma forma que possa extrair todas as vantagens possíveis dela. A minha dica (e escolha) atualmente é o VI, melhor dizendo, seu filho VIM.


O VIM, VI Improved, é um editor simples e complicado ao mesmo tempo, simples pela sua interface em modo texto e complicado pelos comandos possíveis. Muitos dos novos programadores acabam temendo todas as teclas que devem digitar para começar a editar um texto, uma reação comum e inevitável para os novatos (todos nós passamos por isso).

Apesar de tudo, o VI segue a filosofia Linux, que, apesar de parecer complexo devido ao grande número de opções que oferece e a necessidade de ter um conhecimento básico para poder se iniciar, também eleva em muito os poderes do usuário sobre o que ele está fazendo.

PRA ONDE EU CORRO?!

O que o usuário deve se adaptar e compreender logo de início é o conceito de modo de edição e modo de inserção de texto. No modo de edição você pode excluir caracteres, fazer cópias, busca, navega pelo texto e outras diversas funções, já no modo de inserção você pode digitar e inserir o texto.

Para finalizar o post de hoje vou deixar algumas dicas, a primeira é esta Apostila de VIM no Google Code que mostra todos os segredos do VIM e auxilia em muito o usuário.

A segunda dica é o Site do Aurélio, que contem diversos materiais sobre o mundo do Linux e Mac, mostrando diversas coisas sobre o VI (além de expressões regulares e 1001 outras coisas). Obs: Os livros dele são ótimos, vale apena comprar.

E a última dica é o Guia de Consulta Rápida de VI (com VIM) da Novatec, que encomendei pela Linux Mall. Simples, prático e leve, podendo ser levado para qualquer lugar.

Apesar de eu falar sobre o VIM neste post, deixo registrado que o programador deve buscar a ferramenta que lhe propicia as melhores condições para trabalhar e assim aumentar a sua efetividade. Mas lembre-se, nunca se acomode em apenas um ferramenta, busque o novo e, quem sabe experimentar o VIM.

quarta-feira, setembro 29, 2010

Iniciando em C++

Esse semestre iniciamos com Programação Orientada a Objetos na faculdade, eu já sabia algum ou outro conceito básico do tema, porém agora preciso me aprofundar, afinal além de ser uma disciplina de alto nível de concentração, é necessário também costume para poder conseguir abstrair corretamente todos os conceitos.

Para os estudos da faculdade estamos estudando C++, o que eu considero perfeito, apesar de não ser a maior "onda" do mercado (como Java), é uma linguagem muito sólida e e interessante, onde podemos trabalhar em qualquer plataforma e com alto desempenho. 

Iniciei minhas pesquisas e aos poucos estou estudando cada vez mais sobre a linguagem, orientação a objetos e também modelagem de dados.

Para iniciar os estudos eu indico (apesar de algumas ressalvas) os artigos da Wikipedia, mesmo com a fama de não serem muito consistentes eles podem proporcionar pelo menos uma breve definição sobre cada conceito.


Também aconselho muita leitura sobre o tema, uma apostila interessante que estou lendo é essa aqui do Professor André Duarte Bueno, onde é abordado desde os conceitos de orientação a objetos, passando por UML e chegando a C++.


Outro material que vai me dar muito apoio aos meus estudos é o Guia de Consulta Rápida de C++ do  Professor Joel Saade, muito completo, abordando todos os conceitos da linguagem e com muitos, mas muitos mesmo, exemplos. O que facilita os estudos. Eu comprei ele aqui no site da Linux Mall, onde tem vários outros livros.

Conforme o decorrer deste semestre vou seguir postando diversos posts sobre Programação Orientada a Objetos, modelagem de dados e principalmente linguagem C++. Estes posts vão servir para ajudar a fixar meus conhecimentos e também auxiliar quem também busca referências e conteúdo para estudo.

quinta-feira, agosto 19, 2010

Compilando programas em Linguagem C e C++ no Linux

Muitas vezes quando migramos para o Linux uma das principais dificuldades dos desenvolvedores novatos é o fato de não ter a mão IDE's simples como o DEV-C++ para compilar seus arquivo. Logo surge uma onde de dúvidas e retorno a plataforma Windows, de uma maneira simples vou mostrar aqui como utilizar os compiladores nativos (e muito bons) do Linux.

Para compilar programas em Linguagem C basta entrar no terminal (linha de comando) e digitar:

gcc -o nome_executavel nome_do_fonte.c

De uma maneira simples e rápida ele gerará o executável com o nome passado como parâmetro ou mostrará os eventuais erros.

Para compilar em C++ basta trocar o gcc por g++, ficando:

g++ -o nome_executavel nome_do_fonte.cpp

Da mesma forma que em C puro, usando o g++ ele gerará o executável ou mostrará os erros. Logo após disso você pode executar o programa digitando no mesmo terminal:

./nome_executavel

Com isso o programa será executado normalmente caso não tenha sido encontrado nenhum erro na etapa anterior. 
Em alguns casos é necessário forçar o compilador a incluir as bibliotecas no momento da compilação, como ocorre com a math.h que possui funções matemáticas, para isso basta incluir o parâmetro -lm no fim do comando, desta forma:

gcc -o nome_executavel nome_do_fonte.c -lm

Com isso tudo funcionará perfeitamente (se não tiver erros no programa).

sábado, julho 31, 2010

Pesquisa sequencial e binária - Linguagem C

No final do semestre na faculdade fiz um pequeno documento para ajudar nos estudos sobre pesquisa. Ele fala sobre pesquisa sequencial e pesquisa binária. Nele é possível encontrar uma breve explicação sobre cada uma e um exemplo simples.

O link para visualizar e baixar é este aqui: http://bit.ly/aG0zN2

quinta-feira, julho 29, 2010

Lendo string com espaços na função scanf() - Linguagem C

A função scanf serve para ler a entrada padrão (teclado), podendo ler inteiros, floats, caracteres e strings. Para ler uma string usa-se a seguinte sintaxe:

scanf("%s", variavel);

O problema é que ao ler uma string com mais de uma palavra (com espaços) ela para de ler armazenando apenas a primeira palavra. Um exemplo seria a string "Minha casa", caso usemos a sintaxe acima ele apenas armazenará a palavra "Minha", parando ao encontrar o espaço.
O que podemos fazer para corrigir este erro é forçar o scanf ler a string até encontrar o [enter], para isto devemos inserir o seguinte código:

scanf("%[^\n]s", variavel);

Isto fará o scanf ler até encontrar o enter, ao fazer isto ele jogará o enter para a próxima entrada,  fazendo com que ele pule o próximo scanf. Para isto basta limparmos o buffer logo após a entrada, apagando qualquer "sujeira" deixada pelo teclado:

scanf("%[^\n]s", variavel);
setbuf(stdin, NULL);

Com isto você conseguirá ler normalmente nomes com mais de uma palavra.
Se você tiver mais alguma sugestão de como fazer isto (na linguagem C existem mil formas funcionais de se fazerem as coisas) deixe um comentário explicando.

UPDATE:


Você também pode limitar os caracteres que podem ser lidos, criando assim uma forma também do scanf ler todos os caracteres e o espaço, basta digitar:

scanf("%[a-z A-Z]s");

Desta forma ele também irá ler todas as letras do alfabeto (irá ignorar os números digitados também).

quarta-feira, julho 28, 2010

Problemas ao usar roteador no Linux


Primeiro vou contar uma história muito comum:

"Era uma vez um usuário do Linux em seu Desktop, porém depois de um tempo ele comprou um notebook para ter mais mobilidade, aproveitando comprou também um roteador sem fio para usar o notebook em qualquer lugar da casa. Ao instalar e configurar o roteador o notebook acessou normalmente a internet porém o desktop não consegue acessar, o que ele deve fazer agora?"

Isso acontece muito com novos usuários que usam internet via modem ADSL (Speedy, Velox e etc). O que ocorre é que as configurações PPPoE (que é o tipo de conexão desses provedores de internet) ainda existem no computador e toda vez que você que for iniciado ele tentará acessar desta forma. A melhor forma de fazer com que acesse pela rede do roteador é excluindo estas configurações. 

Para fazer isto basta seguir estes simples passos:

1 - Abra o arquivo de configuração da internet, basta digitar no terminal: sudo gedit /etc/network/interfaces
2 - Comente estas linhas (basta colocar um # na frente de todas as quatro):


auto dsl-provider
iface dsl-provider inet ppp
pre-up /sbin/ifconfig eth0 up
provider dsl-provider

Deixando assim:

#auto dsl-provider
#iface dsl-provider inet ppp
#pre-up /sbin/ifconfig eth0 up
#provider dsl-provider

3 - Reinicie o PC e ele conectará a rede do roteador e pronto.

Obs: Caso queria voltar a usar diretamente o ADSL basta descomentar estas linhas (excluir os #).


Abrindo arquivos Rar no Ubuntu

Quando instalei o Ubuntu tive que voltar todos os meus backup's para ele, segui instalando normalmente, até que de repente tive problemas ao abrir arquivos rar, buscando na internet algo que me auxiliasse descobri como é simples obter suporte a este tipo de descompactação, primeiro vamos instalar o suporte:

sudo apt-get install rar;

Agora você tem que seguir mais 21312 passos até abrir seu arquivo...
Brincadeira, após isto seu computador já vai estar abrindo e compactando normalmente arquivos no formato rar.

terça-feira, julho 27, 2010

Shell Script

Shell Script é uma linguagem de programação utilizada em várias sistemas operacionais, principalmente os UNIX's da vida. Ele é interpretado, ou seja, necessita de um outro programa toda vez que desejar executar o programa. É uma linguagem de simples aprendizado, não servindo apenas para chamar aplicativos já existentes, mas também para criar complexos programas fazendo uso de controles de fluxo e iterações. Segue abaixo um simples exemplo.

Suponhamos que você deseja fazer vários downloads e desligar o PC logo em seguida, um exemplo simples de fazer isso seria criando um arquivo assim:

#!/bin/bash
wget www.site.com/arquivo.exe -c;
wget www.site2.com/arquivo.rar;
halt;

Logo após que digitamos esses comandos em um arquivo podemos salva-lo como script.sh (por convenção sempre colocamos extensão .sh) e damos permissão de execução: 

"chmod +x script.sh"

Após esses procedimentos podemos chamar o script para executar:

./script.sh

A partir daí ele começará a fazer os downloads e quando terminar desligará o PC.
Agora vamos entender linha por linha o que acontece, na primeira linha é indicado o caminho do programa que executará o arquivo (no nosso caso o Bash), nas linhas 2 e 3 é chamado o programa wget que faz o download dos arquivos e por último o comando halt que desliga o PC.

Para compreender mais sobre o Shell Script aconselho a dar uma lida no artigo da Wikipedia e também visitar os links indicados no final do mesmo. 


Frase

“Inovação distingue um líder de um seguidor.”
(Steve Jobs)