Archive for June, 2009

TDD + Ruby: Número de Fibonacci

Posted in Ruby/Rails on June 15th, 2009 by Edipo Luis Fderle – 2 Comments

Warning: Missing argument 1 for GeSHi::GeSHi(), called in /home/storage/f/73/ab/bitside1/public_html/edipo_blog/blog/wp-content/plugins/codecolorer/codecolorer-core.php on line 137 and defined in /home/storage/f/73/ab/bitside1/public_html/edipo_blog/blog/wp-content/plugins/deans_code_highlighter/geshi.php on line 432

Warning: Missing argument 2 for GeSHi::GeSHi(), called in /home/storage/f/73/ab/bitside1/public_html/edipo_blog/blog/wp-content/plugins/codecolorer/codecolorer-core.php on line 137 and defined in /home/storage/f/73/ab/bitside1/public_html/edipo_blog/blog/wp-content/plugins/deans_code_highlighter/geshi.php on line 432

Estou necessitado de escrever posts melhores, eu sei, mas enquanto isso, tava brincando aqui com TDD + Ruby, então resolvi fazer um código para gerar a sequencia de Fibonacci fazendo o uso de TDD.

Para quem ainda não sabe, o numero de fibonacci e uma sequencia de numero, que é gerada começando com 1 e em seguida somando os dois anteriores para se conhecer o próximo, na prática:

Começamos com 1, então o proximo numero será : 0 + 1 = 1, o seguinte será 1 + 1 = 2 … 2 +1 = 3 … e assim vai… essa sequencia é defenida como sendo recursiva, a formula é:

0d5cce25d67941bb4661afd52609d93c

Bom, o problema ta entendido(eu acho) rs.

Como vamos fazer o uso de TDD, vamos começar escrevendo nossos testes

Precisamos ter um método chamdo por exemplo fibo, esse método deve receber como argumento um inteiro, inicialmente se passarmos 0(zero) devemos ter como retorno 0(zero), entõa vamos criar o esqueleto do teste:

1
2
3
4
5
6
7
require "test/unit"
require "fibonacci.rb"

class Test < Test::Unit::TestCase
   def test_case_name
   end
end

Acima está o esquelete de um teste básico, na primeira linha fizemos a inclusão do framework de teste, no segundo require chamamos a nossa classe fibonacci(que ainda nao existe), e logo em seguida temos o primeiro método para teste, vamos mudar o nome dele e acresentar o comportamento que nossa classe fibonacci deve ter quando receber zero.

1
2
3
4
5
6
7
8
require "test/unit"
require "fibonacci.rb"

class TestFibonacci > Test::Unit::TestCase
   def test_fiboZero
      assert_equal(0, Fibonacci.seqfibo(0))
   end
end

Todo teste deve iniciar com o palavra test, logo em seguida vem nosso teste propriamente dito, é justamente o que falamos acima, se receber Zero, retorne Zero, vamos rodar nosso teste para ver o que acontece:

LoadError: no such file to load  fibonacci.rb

Ops, certamente teriamos um erro ai mesmo, pois ainda nao criamos nossa classe fibonacci, vamos cria-la,(sem nehum codigo ainda) e rodar novamente:

Ops, denov, so temos um arquivo e mais nada então recebemos o seguinte:


Started
E
Finished in 0.002 seconds.

1) Error:
test_fiboZero(TestFibonacci):
NameError: uninitialized constant TestFibonacci::Fibonacci
C:\Documents and Settings\casa\Desktop\Nova pasta\fibonacciTest:5:in `test_fiboZero’

1 tests, 0 assertions, 0 failures, 1 errors

Vamos criar essa classe, acresente o seguinte em fibonacci.rb:

1
2
3
4
5
class Fibonacci
   def self.seqfibo(num)
      return 0 if num == 0
    end
end

Bom, isso provavelmente irá fazer nosso teste passar, rodando recebemos o seguinte:

Started
.
Finished in 0.002 seconds.

1 tests, 1 assertions, 0 failures, 0 errors

Legal, tudo passou, nosso primeiro caso esta feito, agora, podemos pensar em outro comportamento para nossa classe. . . .bom testamos com zero agora vamos tentar passar um(1) para o método e ver o que acontece, incluindo mais método para teste (poderia ser feito no mesmo método, mas vou separar aqui), nosso código de teste agora fica assim:

1
2
3
4
5
6
7
8
9
10
11
require "test/unit"
require "fibonacci.rb"

class TestFibonacci < Test::Unit::TestCase
   def test_fiboZero
      assert_equal(0, Fibonacci.seqfibo(0))
   end
   def test_fiboUm
      assert_equal(1, Fibonacci.seqfibo(1))
   end
end

a lógica dos teste aqui, nao mudou nada, vamos rodar para ver:

Started
F.
Finished in 0.033 seconds.

1) Failure:
test_fiboUm(TestFibonacci) [C:\Documents and Settings\casa\Desktop\Nova pasta\fibonacciTest:8]:
<1> expected but was
<nil>.

2 tests, 2 assertions, 1 failures, 0 errors

Bom, vimos ali que o teste esperava 1 mas retornou nil, vamos implementar essa lógica na nossa classe, agora temos isso:

1
2
3
4
5
6
class Fibonacci
   def self.seqfibo(num)
     return 0 if num == 0
     return 1 if num == 1
   end
end

Exatamente igua ao anterior, agora não seria nada bom ficar acresentando todos essas asserts ai para testar cada um dos numero que esperamos obter,  para isso em nosso teste vamos criar um array de arrays contendo vários cassos de testes algo do tipo:

testes = [[0,0][1,1][2,1] . . .]

e logo interar por esse array passando esses valores para nosso teste, logo iremos ter um unico método, nossa classe teste fica +  – assim agora:

1
2
3
4
5
6
7
8
9
10
11
require "test/unit"
require "fibonacci.rb"

class TestFibonacci &lt; Test::Unit::TestCase
   def test_fiboZero
      teste = [[0,0],[1,1],[2,2],[4,5],[3,2]]
      teste.each do |t|
        assert_equal(t[1], Fibonacci.seqfibo(t[0]))
     end
  end
end

Bom, creie um array de array com alguns cassos, agora so falta implementar na classe fibonacci um funcao recursiva para fazer o calculo, então agora tempo:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
class Fibonacci
   def self.seqfibo(num)
      return num unless num &gt; 2
       seqfibo(num-1) + seqfibo(num-2)
   end

#um metodo pra executar

   def execute
      for i in 1..10
         puts seqfibo(i)
      end
   end
end

Agora rodamos o código de teste e recebemos:


Started
.
Finished in 0.002 seconds.

1 tests, 5 assertions, 0 failures, 0 errors

Bom, aqui acabamos nossa implementação, obviamente da para melhorar e fazer muitos outros teste, e melhorar o teste, e tudo mais, se alguem achar erros, ou quizer falar algo, porfavor deixe um comentário.

[Dica Rápida] Problema ao rodar Ruby no E-TextEditor

Posted in Ruby/Rails on June 11th, 2009 by Edipo Luis Fderle – 4 Comments

Se você é um usuário Windows e usa o E-textEditor e estiver tentando usar o comando ctrl+r para rodar seus codigos e está recebendo a seguinte mensagem:

ruby: no such file to load — ubygems (LoadError)
faça o seguinte para concertar esse problema:

1 – Baixe a ultima versao do RubyGems do site

2 – Descompacte-o dentro da sua pasta de usuario do Cygwin, no meu caso em:  C:\cygwin\home\edipo

3 – Abra o terminal do Cygwin e execute os seguintes comando:

$  unset RUBYOPT
$ ruby setup.rb

Pronto isso deve resolver.

O Twitter esta fazendo você postar menos?

Posted in Opinião on June 8th, 2009 by Edipo Luis Fderle – Be the first to comment

Ouvi essa pergunta não sei em que lugar esses dias, e fiquei pensando sobre isso alguns minutos (sim minutos isso não merece mais do quem alguns poucos minutos J), e cheguei à conclusão que em alguns casos sim, ele faz com que você não crie um post, eu apenas digite umas palavras e poste um link, na “caixinha” de 140 caracteres.

Eu uso o twitter a menos de três meses, minha escolha de criar um não foi a pela quais infelizmente grandes partes das pessoas fazem que é: Ter o Maximo de seguidores possíveis criei o meu com o intuito de poder compartilhar de forma rápida e fácil algumas coisas que são de meu interesse e que interessam as pessoas que me seguem, claro às vezes posto qualquer merda do tipo “Ai que frio que ta aqui”, mas isso acontece com todo mundo, antes de eu ter um twitter eu já via muitas pessoas usando e falando bem,   mas nunca tive o interesse de criar uma conta, até que um dia criei, e fiquei impressionado com o quão ele é bom quando usado da maneira correta,  apesar do twiiter “fazer” a pergunta “O que você esta fazendo”  ele não é sobre isso,  a partir do momento em que você começa a usar o twitter de forma correta ele é fantástico.

Antes de mais nada, twitter não é microblogging, sim é Wikipédia diz isso, mas não acredite nela nesse assunto ela fala merda.  Bom, Blog e Twitter são coisas diferentes logo não podemos substituir um pelo outro, o que na verdade acontece é que as vezes, por exemplo, você ta lendo algum livro legal, ou ta estudando   alguma coisa X e pensa “Ops, isso é legal merece um post” ai você para e diz – Ah vou logo colocar um link sobre o assunto no twitter e escrever “Olhem que legal isso”, certo, isso funciona é bom sim, mas não é um coisa que se pode equiqualar com um post com algunas paginas no seu blog,  nesse exemplo isolado você esta somente passando a informação que você acabou de ler ou coisa do tipo para frente, no caso no blog é diferente, você está ali no seu espaço escrevendo a sua opinião sobre dado assunto colocando seus exemplo e tudo mais.

Isso é realmente incrível, porque eu vou fazer um post para escrever algo =< que 140 caracteres, não é dignos de um post, o que se deve fazer é realmente separar as coisas, quando você sabe que um dado assunto não irá lhe render um post decente, simplesmente não o faça, claro, isso também não quer dizer que você deve twittar qualquer merda que esteja lendo ou algo assim.

Basicamente eu penso assim, você pode transmitir o que quer com até 140 caracteres? Se sim use o twitter senão, use o seu blog, e logo depois use o twitter para transmitir o link para o post J, acredito que é assim que deve ser vista as coisas quando se trata disso, é e tenho dito Ops, será que eu poderia ter dito isso em 140 caracteres?

Coisas que possam lhe interessar:

http://www.twitter.com/

http://www.twitterbrasil.org/

http://www.twitterportugal.com/