Ruby Série #3 – Operador Splat

November 10, 2009 at 12:52 pm | In Ruby/Rails | Leave a Comment

Olá pessoal vamos para o terceiro post da série de Ruby, este post irá ser um pouco mais pequeno porque
irá tratar apenas de um operador, esse operador é o Splat.

O Operador Splat é usado quando queremos em uma atribução fazer com que vários valores de um array se tornem
rvalues, como por exemplo:

a, b, c, d = 10, 11, *[12,13]

Como da para se notar o que mudou foi o último rvalue sendo precedido por um *.

No Ruby 1.8 Arrays e Rangs podem ser splatted, ele também fornece um método to_ary que retorna um array de valores.

Também podemos fazer ao contrário, fazer um ivalue ter um *, quando isso acontece os rvlues extras são postos em um array e são atribuidos a tal valor.

x, *y = 1, 2, 3

Aqui x = 1 e y = [2,3]

OBS: No Ruby 1.9, você pode ter quantos splats quizer, para ver mais sobre Splat no 1.9 veja esse link:
http://ruby.about.com/od/newinruby191/qt/MultipleSplats.htm

Bom pessoal esse post foi rápito espero que deu para aprender algo com ele :D

Até o Mais.

Série Ruby #2 – Atribuições

November 6, 2009 at 2:36 pm | In Ruby/Rails | Leave a Comment

No último post foi visto como o Ruby trabalha com os 5 tipos de varíaveis, falamos bastante sobre atribuições também, então neste post iremos falar um pouco mais sobre isso.

Atribuições

Uma atribuição é um expressão que pode especificar um ou mais de um valor para uma dada varíavel ou mais corretamente
de um Ivalue.
IValue é um termo para indicar o que aparece antes de um operador de atribuição, por exemplo:

x = 10

Na expressão acima x é um ivalue e um rvalue que é 10.
No Ruby existem três tipos de expressões de atribuição, a mais simples vista acima e outras duas que vamos ver agora.

As atribuições abreviadas que são expressões que além de atualizar um valor ainda aplicam alguma matemática sobre o ivalue
certamente você já fez isso:

x *= 10

Também tempos as atribuições paralelas que são aquelas em que um rvalue é atribuido a n ivalues, por exemplo:

x, y, z = 10

Também é possivel tem n ivalues e n rvalues, assim:

x, y, z = 2, 4, 6

Aqui x recebe 2, t recebe 4 e z recebe 6.
O que um ivalue recebe como conteúdo é o valor ou array de valores que é à ela atribuido. Um operador de atribuição é righ-assiciative ou seja, a atribuição é avalidada da direita para a esquerda, com isso podemos fazer isso:

a = b = 4

Aqui b recebe 4 e a também recebe 4.

Efeitos colaterias – Idempotent.

Como vimos uma atribuição muda o estado de uma varíavel isso muda o estado de um programa por exemplo,
existem várias expressões que não tem efeitos colaterais algum, pois toda a vez que são avalidas irão retornar o mesmo valor ,por exemplo:

Dado um método para calcular a raiz quadrada de um número inteiro e positivo:

	def raiz(x)
	   return x * x
	end

Esse método não tem efeitos colaterais, esse tipo de expressão é chamado de idempotent, você pode
avaliar o método acima n vezes e ele sempre irá retornar o mesmo valor, já a seguinte expressão irá mudar a cada vez que for executada:

x += 1

Você pode ler mais sobre isso em: http://en.wikipedia.org/wiki/Idempotence
Bom pessoal, esse foi o segundo post da série Ruby. Até mais e Obrigado.

Série Ruby #1 – Varíaveis não inicializadas

November 3, 2009 at 2:01 am | In Programação, Ruby/Rails | 2 Comments

Varíaveis não inicializadas

cplx

Olá esse será o primeiro post de uma série que pretendo fazer falando sobre Ruby(A Linguagem)
Tentarei manter em posts pequenos com exemplos de código ou não,  não terá uma ordem do tipo: básico – intermediário – avançado, irei postando conforme eu achar melhor, ou se alguem vier a ler também gostaria de ouvir comentários sobre assuntos que poderiam serem abordados nos posts.

Para começar irei falar um pouco sobre “Varíaveis Não Inicializadas”. Então chega de bate papo e vamos ao post.

Se você já programa em alguma linguagem digamos assim mais conhecida como Java ou C sempre após a declaração de uma varíavel é recomendado que você à inicialize antes de fazer seu uso, uma das razões para se fazer isso é que pode acontecer de o local(na memória(1.a)) onde tal varíavel foi alocada já tenha sido usada por outra váriavel e posivelmente pode conter algum tipo de LIXO, então é uma boa prática inicializa-las.

1.a)

Básicamente falando a memória é vista pelo processador como uma tabela cada “entrada” desta tabela pode guardar um byte e cada entrada é referenciada pela sua posicão.

1 Byte é um conjunto de 8 bits pode representar um número de ate 255(na base 10).

Veja mais sobre essa matemática aqui.

Então no Ruby  em linhas gerais você sempre deve atribuir algum valor antes que de fato usar tal varíavel, mas como vamos ver existem alguns tipos de varíaveis no Ruby que não necessariamente precisam ser inicializadas.

Vejamos os tipos de váriaveis presentes no Ruby.

 - Varíaveis de Classe.
 - Varíaveis de instância.
 - Varíaveis globais.
 - Varíavies locais.

Varíaveis de Classe.

Sempre devem ter um valor atribuido antes de serem usadas, caso você à utilize sem inicializar irá receber um NameError, Como isso:

 class Class_Variable
puts @@var
 end

NameError: uninitialized class variable @@var in Class_Variable


Varíavies de Instância

Quando você tentar usar um varíiavel de instância sem ela ter sido devidamente inicializada o Ruby irá retornar um Nil, veja:

 def instance_variable
puts @name
 end

instance_variable

=> Nil
<pre>

Veja passando a opção -W para o comando Ruby em linha de comando, ele irá dar um aviso que você possue a varíavel não inicializada:

ruby -W teste.rb
teste.rb:2: warning: instance variable @x not initialized
nil

DICA: Sempre use a opção -W para testar seus código maiores, assim você pode verificar de forma fácil a presença desse tipo de coisa.


Varíaveis Globais.

Para esse tipo de varíavel vale a mesma regra que das de instância.

Varíaveis Locais.

Aqui temos que ter cuidado, em todos os outros tipos de varíaveis no Ruby temos um caractere de pontuação servindo como prefixo, isso quer dizer que as varíaveis locais se parecem com uma chamada de método, caso o Ruby “veja” uma atribuição para tal varíavel ele irá saber que se trata de uma varíavel e não de uma invocação de método, caso ele não ver, ele irá invocar o método, e caso o método não exista temos um NameError.

Por Exemplo se simplesmente fizermos isso:

 a
 NameError: undefined local variable or method `a' for main:Object
 from (irb):1
<pre>

Viram?

Então, a varíavel passa a existir apartir do momento em que ela recebe uma atribuição, e não necessita que a atribuição seja de fato executada, veja um exemplo:

 >> a = 0.0 if false
 => nil
 >> puts a
 nil

Bom pessoal é isso por hoje, espero que alguem leia isso :) .

Referencia: Livro – “A linguagem de Programação Ruby” – David Flanagan & Yukihiro Matsumoto.

Até Mais Pessoa e Orbrigado.

Pequena Intro BDD com Cucumber

October 22, 2009 at 10:28 pm | In Programação, Ruby/Rails, testing | Leave a Comment

Neste post vamos ver um pouco(bem pouco) sobre BDD ou Behavior Driven Development utilizando o Cucumber.

Aqui você ira escrever os testes antes de escrever

Primeiramente vamos começar criando uma “funcionalidade” para descrever qual o comportamente que queremos que nosso codigo tenha, isso é representado através de features, features são arquivos em pleno inglês ou português(sim tem como) para descrever o comportamente de um requesito, por exemplo.

Uma feature no cucumber tem seu esqueleto assim:

Feature: Be Awesome (Fazer alguam coisa, Responder alguma coisa, funcionalidade)

Senario: Delete products
   Given a list with 5 products
   When I select three items
   And I click delete
   Then I should see only 2 products

Ou no bom Português:

Cenário: Deletar produtos
 Dada uma lista com 5 produtos
  Quando eu selecionar três itens
 E eu clicar em excluir
 Então eu deveria ver apenas 2 produtos

Como você pode ver isso é facilmente compreendido por qualquer um, não precisa ser técnico nem nada para saber realmente o que o cenário faz.

Nosso pequeno exemplo:

Vamos criar um exemplo bem simples, nosso código irá ser uma calculadora, essa calculadora irá somente multiplicar(nosso cliente não sabe multiplicar ainda então…. :) ).

Com uma conversa de uns minutos com o cliente juntos criamos uma feature assim:

Feature: Multiplication Operation
   In order to to learn math
   As a math idiot
   I want multiply two numbers

Scenario: Add two numbers
   I initialize calculator with 10 and 10
   When I press go
   Then I should see 100

Scenario: Add two negative numbers
   Given I initialize calculator with -2 and -2
   When I press go
   Then I should see 4

Vamos começar executando nossa feature, inicialmente somente com o primeiro cenário, crie um arquivo chamado calculadora.feature e coloque o seguinte conteudo:

Feature: Multiplication Operation
   In order to to learn math
   As a math idiot
   I want multiply two numbers

Scenario: Add two numbers
   I initialize calculator with 10 and 10
   When I press go
   Then I should see 100

Agora vá até um terminal e execute:

cucumber calculadora.feature

Feature: Multiplication Operation
 In order to learn math
 As a math idiot
 I want to be told the multiply tow numbers

  Scenario: Add two numbers                      # calculadora.feature:6
    Given I initialize calculator with 10 and 10 # calculadora.feature:7
    When I press go                              # calculadora.feature:8
    Then I should see 100                        # calculadora.feature:9

1 scenario (1 undefined)
3 steps (3 undefined)
0m0.002s

You can implement step definitions for undefined steps with these snippets:

Given /^I initialize calculator with 10 and 10$/ do
  pending
end

When /^I press go$/ do
  pending
end

Then /^I should see 100$/ do
  pending
end

Bom, como vemos, temos 1 cenário que ainda não está definido, também tempos os três passos que também não estão definidos, logo abaixo o cucumber já nos da os passos para implementar, vamos copiar esse código e colocar dentro de um arquivo chamado calculadora_steps.rb, e então executar novamente nossa feature.

Rodando a feature iremos receber algo do tipo:

$ cucumber calculadora.feature
Feature: Multiplication Operation
 In order to learn math
 As a math idiot
 I want to be told the multiply tow numbers

  Scenario: Add two numbers                      # calculadora.feature:6
    Given I initialize calculator with 10 and 10 # calculador_steps.rb:1
      TODO (Cucumber::Pending)
      ./calculador_steps.rb:2:in `/^I initialize calculator with 10 and 10$/'
      calculadora.feature:7:in `Given I initialize calculator with 10 and 10'
    When I press go                              # calculador_steps.rb:5
    Then I should see 100                        # calculador_steps.rb:9

1 scenario (1 pending)
3 steps (2 skipped, 1 pending)
0m0.003s

Bom, vimos que ao pegar o código que o cucumber nos deu ele está usando o método pedding em todos os três passos, isso obviamente quer dizer que eles estão pendentes, vamos começar implementando o comportamento do primeiro passo, que é:

Given /^I initialize calculator with 10 and 10$/ do
  pending
end
[/sourcecode"]

Fazemos isso:

[sourcecode language="ruby"]
Given /^I initialize calculator with 10 and 10$/ do
  @c = Clac.new(x,y)
end

E rodamos nossa feature:

 cucumber calculadora.feature
Feature: Multiplication Operation
 In order to learn math
 As a math idiot
 I want to be told the multiply tow numbers

  Scenario: Add two numbers                      # calculadora.feature:6
    Given I initialize calculator with 10 and 10 # calculador_steps.rb:1
      uninitialized constant Calc (NameError)
      ./calculador_steps.rb:2:in `/^I initialize calculator with 10 and 10$/'
      calculadora.feature:7:in `Given I initialize calculator with 10 and 10'
    When I press go                              # calculador_steps.rb:5
    Then I should see 100                        # calculador_steps.rb:9

Failing Scenarios:
cucumber calculadora.feature:6 # Scenario: Add two numbers

1 scenario (1 failed)
3 steps (1 failed, 2 skipped)
0m0.003s

OPS, parece que não temos a classe calc, e de fato não temos, vamos cria-la, para isso, nesse caso, iremos escrever a classe no mesmo arquivo que temos nossos passos, isso não é uma boa prática, então não o faça, fiz aqui somente para fins de explicação :D .

Então no começo do arquivo calculadora_steps.rb iremos ter:

class Calc
	def initialize(x,y)
		@x =x
		@y = y
	end
end

Certamente isso irá fazer com que o teste passe, rodando a feature:

cucumber calculadora.feature
Feature: Multiplication Operation
 In order to learn math
 As a math idiot
 I want to be told the multiply tow numbers

  Scenario: Add two numbers                      # calculadora.feature:6
    Given I initialize calculator with 10 and 10 # calculador_steps.rb:8
      undefined local variable or method `x' for #<Object:0x8df61c> (NameError)
      ./calculador_steps.rb:9:in `/^I initialize calculator with 10 and 10$/'
      calculadora.feature:7:in `Given I initialize calculator with 10 and 10'
    When I press go                              # calculador_steps.rb:12
    Then I should see 100                        # calculador_steps.rb:16

Failing Scenarios:
cucumber calculadora.feature:6 # Scenario: Add two numbers

1 scenario (1 failed)
3 steps (1 failed, 2 skipped)
0m0.003s

E como diria Dave Thomas em Agile Web Development With Rails “…”, erro:

Ele está nos dizendo que a variavel x nao esta definida, vamos alterar um pouco nosso passo e no lugar do 10 and 10, vamos colocar um expresao regular, e passar para um bloco, assim:

Given /^I initialize calculator with (.*) and (.*)$/ do |x,y|
  @c = Calc.new(x.to_i, y.to_i)
end

Tambem utilizamos o metodo para converter os valores para inteiros, o to_i. E agora sim rodamos novamente nossa features, e esperamos que os testes passem.

cucumber calculadora.feature
Feature: Multiplication Operation
 In order to learn math
 As a math idiot
 I want to be told the multiply tow numbers

  Scenario: Add two numbers                      # calculadora.feature:6
    Given I initialize calculator with 10 and 10 # calculador_steps.rb:8
    When I press go                              # calculador_steps.rb:12
      TODO (Cucumber::Pending)
      ./calculador_steps.rb:13:in `/^I press go$/'
      calculadora.feature:8:in `When I press go'
    Then I should see 100                        # calculador_steps.rb:16

1 scenario (1 pending)
3 steps (1 skipped, 1 pending, 1 passed)
0m0.003s

E Bingo, passou! Vamos para o segundo passo:

When /^I press go$/ do
  @result = @c.go
end

Quermos o resultado do metodo go na variavel result, vamos executar a feature:

cucumber calculadora.feature
Feature: Multiplication Operation
 In order to learn math
 As a math idiot
 I want to be told the multiply tow numbers

  Scenario: Add two numbers                      # calculadora.feature:6
    Given I initialize calculator with 10 and 10 # calculador_steps.rb:8
    When I press go                              # calculador_steps.rb:12
      undefined method `go' for #<Calc:0x11c5358 @y=10, @x=10> (NoMethodError)
      ./calculador_steps.rb:13:in `/^I press go$/'
      calculadora.feature:8:in `When I press go'
    Then I should see 100                        # calculador_steps.rb:16

Failing Scenarios:
cucumber calculadora.feature:6 # Scenario: Add two numbers

1 scenario (1 failed)
3 steps (1 failed, 1 skipped, 1 passed)
0m0.003s

Olha, não temos ainda o metodo go, então vamos cirar-lo e fazer ele multiplicar os dois numeros.

def go
 @x * @y
end

E rodando mais um vez nossa feature, passou!

cucumber calculadora.feature
Feature: Multiplication Operation
 In order to learn math
 As a math idiot
 I want to be told the multiply tow numbers

  Scenario: Add two numbers                      # calculadora.feature:6
    Given I initialize calculator with 10 and 10 # calculador_steps.rb:11
    When I press go                              # calculador_steps.rb:15
    Then I should see 100                        # calculador_steps.rb:19
      TODO (Cucumber::Pending)
      ./calculador_steps.rb:20:in `/^I should see 100$/'
      calculadora.feature:9:in `Then I should see 100'

1 scenario (1 pending)
3 steps (1 pending, 2 passed)
0m0.003s

Vamos para o ultimo mas não menos importante passo, agora queremos verificar se o resultado da multiplicacao que esta na variavel @result eh igual ao que esperamos que seja, então vamos implementar.

Then /^I should see (.*)$/ do |result|
  @result.should == result.to_i
end

Aqui usamos o metodo should(deveria) para verificar se o resultado bate com o que definimos, se rodarmos o teste veremos que tudo passou.

cucumber calculadora.feature

Feature: Multiplication Operation
 In order to learn math
 As a math idiot
 I want to be told the multiply tow numbers

  Scenario: Add two numbers                      # calculadora.feature:6
    Given I initialize calculator with 10 and 10 # calculador_steps.rb:11
    When I press go                              # calculador_steps.rb:15
    Then I should see 100                        # calculador_steps.rb:19

1 scenario (1 passed)
3 steps (3 passed)
0m0.003s

Lega, tudo passou! Obviamente isso eh muito superficial, mas acredito que isso possa ser uma boa introducao de como isso funciona, também não vimos nada profundamente de como o cucumber funciona, acredito que não seja o objetivo desse post(e eu nao sei muito tambem :) ), Novamente recomendo a leitura dos textos sobre bdd e afims.

Também fiz um pequeno screencast demostrando o que foi postado aqui:

http://vimeo.com/7164228

Não deixe de ver o seguinte link:

http://en.wikipedia.org/wiki/Behavior_Driven_Development

Até mais pessoal e não deixem de comentar!

Desculpas…

September 23, 2009 at 3:33 pm | In Uncategorized | 2 Comments

Aos poucos que chegam ate esse blog, em especial a quem cai em posts sobre o GIT, queria dizer que o novo post de git, vai sair sim, iria sair essa semana ainda, tava tudo pronto(mias de 9 paginas) e BUUM perdi deu pau aqui e perdi o texto todo…. falha minha, espero que os poucos que frequentam esse blog nao o deixem sozinho :) … logo estarei postando um novo post sobre git…

Abraços.

Rails for Kids 2009….

August 14, 2009 at 1:14 am | In Ruby/Rails | Leave a Comment

2929102250_a1ac31a20f

Irá sair no dia 12/09/2009 o Rails for Kids 2009,  se trata de uma série de palestras sobre assuntos relacionados com o mundo rails, as palestras irão ser mistradas por grandes nomes da comunidade Rails nacional e internacional, para participar do evento você deve fazer uma doação no  valor simbólico de R$ 30,00 , toda grana será destinada a Cotolengo de Mato Grosso do Sul. Para saber mais sobre a Cotolengo clique aqui.

Acesse o site Rails for Kids e de uma olhada nas palestras e palestrantes e realize sua inscrição.

Para se escrever clique nesse link.

É isso ai pessoal agente se encontra por lá… OPS, eh online tinha me esquecido :)

O curioso caso do IE 6 e os usuários.

August 3, 2009 at 2:06 pm | In Geral, Padrões Web | 2 Comments

Hoje venho até aqui para falar um pouco sobre algo que não deveria nem haver discussões ou nada do tipo, pois se trata de algo muito lógico. Esse post fala sobre o do porque( minha opinião ) o IE 6 ( Internet Explorer 6 ) ainda é usado por muitos usuários, o que leva quem desenvolve( ou não ) para web a ter grande problemas com o navegador em questão, eu espero que esse post não fique muito grande, tentarei minimizar ao maximo ele, para começar vamos falar em números.


Falando em Números.

Números nos dizem muitas coisas, se tratando do IE 6, que é um navegador que tem aproximadamente… vejamos ele “nasceu” em 2001, e hoje estamos em 2009(quase 2010), pela
subtração básica isso da 8 ANOS, todos sabemos que em 8 anos as coisas mudam, ainda mais em termos de tecnologia e internet, bom somente esse argumento da idade já seria o bastante para as pessoas começarem a pensar seriamente a atualizar seus navegadores, mas vamos a mais algumas.

Web Browsers
1 Internet Explorer 7.0     31.12%
2 Internet Explorer 6.0     26.78%
3 Firefox 3.0                    14.69%
4 Firefox 2.0                    14.14%
5 Firefox 1.5                    1.87%
6 Safari 3.1                      1.15%
7 Safari 3.0                      0.79%
8 Opera 9.2                      0.67%
9 Mozilla 1.9                     0.56%
10 Safari 2.0                     0.50%

Eu não sei o quanto esses números tem validade correta, mas… vamos lá. eles foram gerados pela: W3Counter em Janeiro de 2009 ( lembram das coisas mudando rapidamente a analisar esses numeros ), sobre as ultimas 55,274,276 visitas originais e em 20,428 Web Sites. Como infelizmente podemos ver acima o IE 7 ainda esta no topo seguindo pelo não menos odiado IE 6, você que não tem muito conhecimentos histórico sobre o que aconteceu, simplesmente chega a uma conclusão falsa de que o que mais tem usúarios é o melhor e por consequência deve ser  usado.

Não tenho intenção de contar o que aconteceu mas deixou aqui um link para os que não sabem( GUERRA DOS NAVEGADORES )

Mas se tanta gente usa o IE porque ele é tão ruim.

Bom, se você leu o link que passei acima sobre a guerra dos navegadores a pergunta sobre o porque muita gente usa o IE ja esta respondida, ja a quetão de ele ser tão ruim, é algo um pouco técnico, minha intenção é ser o menos técnico possivel nesse post, então vamos a alguns itens:

Segurança:

Todos se preocupam com segurança certo? Você faz manutenção regularmente em seu carro afim de descobrir se algo está errado, e que possa a fim lhe prejudicar num futuro próximo, você lava as mãos com alcool gel( ou não ) o tempo todo para não correr o risco de pegar a tão famosa gripe suína, enfim, muitas outras coisas, agora vem minha pergunta, porque ser diferente em ralação a atualização de uma software em seu computador? o IE, principalmente o 6, tem centenas de falhas de segurança por toda a parte, o que pode deixar seu computador facilmente vulnerável a ataques de criminosos e outros FDPs :) . Mas não, você acha que isso é conversa fiada, você diz “Esta bom para min, e todo mundo usa mesmo”. Mas não tem problema só não reclame quando coisas estranhar acontecerem e você não ter idéia porque toda aquela economia de anos no banco simplemente sumiu :) .

Ajude para ser ajudado:

Todo mundo gosta de navegar pela internet o tempo todo certo? acessar seus sites favoritos, usar suar aplicações web favoritas, e você gosta de ter uma boa experiência nisso não?, gosta de ver todos os elementos em seus devido lugar, gosta de quando você clicar em algo tudo ocorra de forma esperada,  gosta que cada requisição ocorra no menos tempo possivel, mas por algum maldito motivo não gosta de atualizar a porra do navegador. Por favor amado usuário, atulize seu navegador e ajude quem desenvolve para web fazer que todos, e muitos outros itens citados acima aconteçam da melhor forma possivel.

Algums Problemas:

Tem um suporte MUITO precário a muitos elementos CSS.

Não suporta imagem PNG’s de 24 Bits(ele não processa ocanal Alpha da imagem).

Não segue os padrões da W3C.

Esse da w3c inclui centenas de coisas(leia esse outro post meu ).

Comodismo e Preguiça.

Esse acho que é o principal motivo para as pessoas não atualizarem seus navegadores, as pessoas são muito acomodadas, se elas tem algo funcinando mal e porcamente elas irão continuar usando essa coisa ruim por toda a vida, elas não se importam, não querem evoluir e ponto. Outras são preguiçosas mesmo, tem a incrível preguiça de baixar um navegador novo, ou atualizar( USE FIREFOX ) o que não leva mais de 10 minutos incluindo a instalaçao. Mas se você é desse tipo eu realmente não quero saber como você trata outras coisas em sua vida.

NOTA: O que disse acima obviamente não se inclue todas as pessoas, para quem servir…. bom uso.

Bons sites estão dando adeus ao IE 6

Uma grande quantidade de bons sites estão simplesmente não dando mais suporte para o IE 6 ou funcionam de maneira muito ruim(logo quem nunca usou outro navegador acha que esta tudo certo), a maioria já exibe um alerta na página dizendo para o usúario atualizar seu navegador, mas lembre-se à qualquer momento você simplmente não vai mais poder acessar aquele site que tanto gosta como o YouTube por exemplo, veja:

Bom, acho que isso já é o bastante, vai lá continue usando o IE 6, mas depois não diga que não avisei.


ATUALIZE SEU NAVEGADOR AGORA:

Baixe um dos navegadores abaixo e seja mais feliz:

FIREFOX ( O MELHOR)

Internet Explorer 8 ( o menos pior da Microsoft )

Opera ( Bom  )

Safari ( só a versão para Mac )

Abraço pessoal.

Primeira ‘Olhada’ em Clojure – Fatorial Exemplo

July 4, 2009 at 11:25 pm | In Clojure | 2 Comments

A alguns meses atrás eu dei uma olhada em Clojure, mas não testei nada, agora voltei a dar uma olhada mais com calma nessa linguagem, para quem não sabe do que se trata lá vai uma descricao direta do site:

Clojure is a dynamic programming language that targets the Java Virtual Machine. It is designed to be a general-purpose language, combining the approachability and interactive development of a scripting language with an efficient and robust infrastructure for multithreaded programming. Clojure is a compiled language – it compiles directly to JVM bytecode, yet remains completely dynamic. Every feature supported by Clojure is supported at runtime. Clojure provides easy access to the Java frameworks, with optional type hints and type inference, to ensure that calls to Java can avoid reflection. ”

Você pode encontrar mais informações detalhadamete visitando o site(inglês).

Instalando:

Se você estiver usando Ubuntu você pode seguir o seguinte link onde tem todas informações para a instalação ( Inglês).

Você pode entrar agora num ambiente onde você pode ir digitando seus codigo e ver o resultado, estilo IRB(RUBY), no terminal faça:

ex

Você provavelmente deve tar achando estranho o modo como foi feitas as operações matemáticas aqui, mas pessoalmente é muito elegante desse mudo, vamos dar uma olhada na sintaxe da Clojure comprando com outras linguagens.

Em Clojure a definição de uma função/método, é a seguinte:

2

Temos tres coisas a se analisar nesse pequeno exemplo:

1 – Palavra chave para definição da função é defni

2 – Os argumentos são colocados dentro de colchetes ( [ ] )

3 – A forma como é realizada a soma do caso, primeiro usamos o operador desejado e logo após colocamos os argumetos(elegante não ?).

Definição de variavéis:

(def minha-variavel 10)


Definição de uma lista:

(def minha-lista ‘(1 2 3 4 5 6) )

Definição de um vetor:

[ 1 2 3 4 ]

Definição de Maps:

Maps são zero ou mais chaves/valores definidos entre chaves.

{:a 1 :b 2 :c 3}

em Clojure virgulas são considerados espaços em branco, então pode-se usar para organizar de melhor forma os maps, assim:

{:a 1, :b 2, :c 3}

Existem outros você deve olhar diretamento no web site para estudar com mais detalhe.

Um exemplo usando algo vindo do mundo Java:

jc

Para finalizar esse pequeno post sobre clojure vamos ao exemplo que faz parte do título,

o famoso fatorial.

fact

Abaixo como o exemplo é executado:

jp

Gmail agora com “arrastar e soltar”

July 2, 2009 at 1:41 am | In News | Leave a Comment

Post rápido, agora gmail com mais uma funcionalidade, bom ou ruim ?

Untitled

TDD + Ruby: Número de Fibonacci

June 15, 2009 at 3:34 am | In Ruby/Rails | Leave a Comment

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:


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.

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:


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:


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:


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:


require "test/unit"
require "fibonacci.rb"
class TestFibonacci < 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:


class Fibonacci
     def self.seqfibo(num)
        return num unless num > 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.

Next Page »

Blog at WordPress.com. | Theme: Pool by Borja Fernandez.
Entries and comments feeds.