<?xml version="1.0" encoding="UTF-8"?><!-- generator="wordpress.com" -->
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	>

<channel>
	<title>rubyrails &amp;laquo; WordPress.com Tag Feed</title>
	<link>http://en.wordpress.com/tag/rubyrails/</link>
	<description>Feed of posts on WordPress.com tagged "rubyrails"</description>
	<pubDate>Sat, 28 Nov 2009 04:24:27 +0000</pubDate>

	<generator>http://en.wordpress.com/tags/</generator>
	<language>en</language>

<item>
<title><![CDATA[Ruby Série #3 - Operador Splat]]></title>
<link>http://edipolf.wordpress.com/2009/11/10/ruby-serie-3-operador-splat/</link>
<pubDate>Tue, 10 Nov 2009 12:52:33 +0000</pubDate>
<dc:creator>Édipo Luis Féderle</dc:creator>
<guid>http://edipolf.wordpress.com/2009/11/10/ruby-serie-3-operador-splat/</guid>
<description><![CDATA[Olá pessoal vamos para o terceiro post da série de Ruby, este post irá ser um pouco mais pequeno por]]></description>
<content:encoded><![CDATA[<div class='snap_preview'><p>Olá pessoal vamos para o terceiro post da série de Ruby, este post irá ser um pouco mais pequeno porque<br />
irá tratar apenas de um operador, esse operador é o Splat.</p>
<p>O Operador Splat é usado quando queremos em uma atribução fazer com que vários valores de um array se tornem<br />
rvalues, como por exemplo:</p>
<pre class="brush: ruby;">
a, b, c, d = 10, 11, *[12,13]
</pre>
<p>Como da para se notar o que mudou foi o último rvalue sendo precedido por um <strong>*</strong>.</p>
<p>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.</p>
<p>Também podemos fazer ao contrário, fazer um ivalue ter um <strong>*</strong>, quando isso acontece os rvlues extras são postos em um array e são atribuidos a tal valor.</p>
<pre class="brush: ruby;">
x, *y = 1, 2, 3
</pre>
<p>Aqui x = 1 e y = [2,3]</p>
<p>OBS: No Ruby 1.9, você pode ter quantos splats quizer, para ver mais sobre Splat no 1.9 veja esse link:<br />
<a href="http://ruby.about.com/od/newinruby191/qt/MultipleSplats.htm">http://ruby.about.com/od/newinruby191/qt/MultipleSplats.htm </a></p>
<p>Bom pessoal esse post foi rápito espero que deu para aprender algo com ele <img src='http://s.wordpress.com/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </p>
<p>Até o Mais.</p>
</div>]]></content:encoded>
</item>
<item>
<title><![CDATA[Série Ruby #2 - Atribuições]]></title>
<link>http://edipolf.wordpress.com/2009/11/06/serie-ruby-2-atribuicoes/</link>
<pubDate>Fri, 06 Nov 2009 14:36:31 +0000</pubDate>
<dc:creator>Édipo Luis Féderle</dc:creator>
<guid>http://edipolf.wordpress.com/2009/11/06/serie-ruby-2-atribuicoes/</guid>
<description><![CDATA[No último post foi visto como o Ruby trabalha com os 5 tipos de varíaveis, falamos bastante sobre at]]></description>
<content:encoded><![CDATA[<div class='snap_preview'><p>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.</p>
<h2>Atribuições</h2>
<p>Uma atribuição é um expressão que pode especificar um ou mais de um valor para uma dada varíavel ou mais corretamente<br />
de um Ivalue.<br />
IValue é um termo para indicar o que aparece antes de um operador de atribuição, por exemplo:</p>
<p><strong>x = 10</strong></p>
<p>Na expressão acima x é um ivalue e um rvalue que é 10.<br />
No Ruby existem três tipos de expressões de atribuição, a mais simples vista acima e outras duas que vamos ver agora.</p>
<p>As atribuições abreviadas que são expressões que além de atualizar um valor ainda aplicam alguma matemática sobre o ivalue<br />
certamente você já fez isso:</p>
<p><strong>x *= 10</strong></p>
<p>Também tempos as atribuições paralelas que são aquelas em que um rvalue é atribuido a n ivalues, por exemplo:</p>
<p><strong>x, y, z = 10</strong></p>
<p>Também é possivel tem n ivalues e n rvalues, assim:</p>
<p><strong>x, y, z = 2, 4, 6</strong></p>
<p>Aqui x recebe 2, t recebe 4 e z recebe 6.<br />
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:</p>
<p><strong>a = b = 4</strong></p>
<p>Aqui  b recebe 4 e a também recebe 4.</p>
<h2>Efeitos colaterias &#8211; Idempotent.</h2>
<p>Como vimos uma atribuição muda o estado de uma varíavel isso muda o estado de um programa por exemplo,<br />
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:</p>
<p>Dado um método para calcular a raiz quadrada de um número inteiro e positivo:</p>
<pre class="brush: ruby;">
	def raiz(x)
	   return x * x
	end
</pre>
<p>Esse método não tem efeitos colaterais, esse tipo de expressão é chamado de idempotent, você pode<br />
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:</p>
<p><strong>x += 1</strong></p>
<p>Você pode ler mais sobre isso em: http://en.wikipedia.org/wiki/Idempotence<br />
Bom pessoal, esse foi o segundo post da série Ruby. Até mais e Obrigado.</p>
</div>]]></content:encoded>
</item>
<item>
<title><![CDATA[Série Ruby #1 - Varíaveis não inicializadas]]></title>
<link>http://edipolf.wordpress.com/2009/11/03/serie-ruby-1-variaveis-nao-inicializadas/</link>
<pubDate>Tue, 03 Nov 2009 02:01:53 +0000</pubDate>
<dc:creator>Édipo Luis Féderle</dc:creator>
<guid>http://edipolf.wordpress.com/2009/11/03/serie-ruby-1-variaveis-nao-inicializadas/</guid>
<description><![CDATA[Varíaveis não inicializadas Olá esse será o primeiro post de uma série que pretendo fazer falando so]]></description>
<content:encoded><![CDATA[<div class='snap_preview'><h2><strong><strong>Varíaveis não inicializadas</strong></strong></h2>
<p><img class="aligncenter size-full wp-image-342" title="cplx" src="http://edipolf.wordpress.com/files/2009/11/cplx.gif" alt="cplx" width="465" height="216" /></p>
<p>Olá esse será o primeiro post de uma série que pretendo fazer falando sobre Ruby(A Linguagem)<br />
Tentarei manter em posts pequenos com exemplos de código ou não,  não terá uma ordem do tipo: básico &#8211; intermediário &#8211; 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.</p>
<p>Para começar irei falar um pouco sobre <strong>&#8220;Varíaveis Não Inicializadas&#8221;</strong>. Então chega de bate papo e vamos ao post.</p>
<p>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.</p>
<h3>1.a)</h3>
<p>Básicamente falando a memória é vista pelo processador como uma tabela cada &#8220;entrada&#8221; desta tabela pode guardar um byte e cada entrada é referenciada pela sua posicão.</p>
<p><strong>1 Byte</strong> é um conjunto de<strong> 8 bits</strong> pode representar um número de ate <strong>255(na base 10).</strong></p>
<p>Veja mais sobre essa matemática <a href="http://informatica.hsw.uol.com.br/bits-bytes.htm">aqui</a>.</p>
<p>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.</p>
<p>Vejamos os tipos de váriaveis presentes no Ruby.</p>
<pre> - Varíaveis de Classe.
 - Varíaveis de instância.
 - Varíaveis globais.
 - Varíavies locais.</pre>
<h4>Varíaveis de Classe.</h4>
<p>Sempre devem ter um valor atribuido antes de serem usadas, caso você à utilize sem inicializar irá receber um <strong>NameError</strong>, Como isso:</p>
<pre class="brush: ruby;">
 class Class_Variable
puts @@var
 end
</pre>
<p><em>NameError: uninitialized class variable @@var in Class_Variable</em></p>
<p><em><br />
</em></p>
<h4>Varíavies de Instância</h4>
<p>Quando você tentar usar um varíiavel de instância sem ela ter sido devidamente inicializada o Ruby irá retornar um Nil, veja:</p>
<pre class="brush: ruby;">
 def instance_variable
puts @name
 end

instance_variable

=&#62; Nil
&#60;pre&#62;</pre>
<p>Veja passando a opção<strong> -W</strong> para o comando Ruby em linha de comando, ele irá dar um aviso que você possue a varíavel não inicializada:</p>
<p>ruby -W teste.rb<br />
teste.rb:2: warning: instance variable @x not initialized<br />
nil</p>
<p><em><strong>DICA</strong>: 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.</em></p>
<p><em><br />
</em></p>
<h4>Varíaveis Globais.</h4>
<p>Para esse tipo de varíavel vale a mesma regra que das de instância.</p>
<h4>Varíaveis Locais.</h4>
<p>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 &#8220;veja&#8221; 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 <strong>NameError</strong>.</p>
<p>Por Exemplo se simplesmente fizermos isso:</p>
<pre class="brush: ruby;">
 a
 NameError: undefined local variable or method `a' for main:Object
 from (irb):1
&#60;pre&#62;</pre>
<p>Viram?</p>
<p>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:</p>
<pre class="brush: ruby;">
 &#62;&#62; a = 0.0 if false
 =&#62; nil
 &#62;&#62; puts a
 nil
</pre>
<p>Bom pessoal é isso por hoje, espero que alguem leia isso <img src='http://s.wordpress.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> .</p>
<p>Referencia: Livro &#8211; &#8220;A linguagem de Programação Ruby&#8221; &#8211; David Flanagan &#38; Yukihiro Matsumoto.</p>
<p>Até Mais Pessoa e Orbrigado.</p>
</div>]]></content:encoded>
</item>
<item>
<title><![CDATA[Pequena Intro BDD com Cucumber]]></title>
<link>http://edipolf.wordpress.com/2009/10/22/pequena-intro-bdd-com-cucumber/</link>
<pubDate>Thu, 22 Oct 2009 22:28:14 +0000</pubDate>
<dc:creator>Édipo Luis Féderle</dc:creator>
<guid>http://edipolf.wordpress.com/2009/10/22/pequena-intro-bdd-com-cucumber/</guid>
<description><![CDATA[Neste post vamos ver um pouco(bem pouco) sobre BDD ou Behavior Driven Development utilizando o Cucum]]></description>
<content:encoded><![CDATA[<div class='snap_preview'><p>Neste post vamos ver um pouco(bem pouco) sobre BDD ou Behavior Driven Development utilizando o Cucumber.</p>
<p>Aqui você ira escrever os testes antes de escrever</p>
<p>Primeiramente vamos começar criando uma &#8220;funcionalidade&#8221; 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.</p>
<p>Uma feature no cucumber tem seu esqueleto assim:</p>
<p>Feature: Be Awesome (Fazer alguam coisa, Responder alguma coisa, funcionalidade)</p>
<pre class="brush: ruby;">
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
</pre>
<p>Ou no bom Português:</p>
<pre class="brush: ruby;">
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
</pre>
<p>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.</p>
<p>Nosso pequeno exemplo:</p>
<p>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&#8230;. <img src='http://s.wordpress.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  ).</p>
<p>Com uma conversa de uns minutos com o cliente juntos criamos uma feature assim:</p>
<pre class="brush: ruby;">
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
</pre>
<p>Vamos começar executando nossa feature, inicialmente somente com o primeiro cenário, crie um arquivo chamado calculadora.feature e coloque o seguinte conteudo:</p>
<pre class="brush: ruby;">
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
</pre>
<p>Agora vá até um terminal e execute:</p>
<pre class="brush: ruby;">
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
</pre>
<p>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.</p>
<p>Rodando a feature iremos receber algo do tipo:</p>
<pre class="brush: ruby;">
$ 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
</pre>
<p>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 é:</p>
<pre class="brush: ruby;">
Given /^I initialize calculator with 10 and 10$/ do
  pending
end
[/sourcecode&#34;]

Fazemos isso:

[sourcecode language=&#34;ruby&#34;]
Given /^I initialize calculator with 10 and 10$/ do
  @c = Clac.new(x,y)
end
</pre>
<p>E rodamos nossa feature:</p>
<pre class="brush: ruby;">
 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
</pre>
<p>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 <img src='http://s.wordpress.com/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> .</p>
<p>Então no começo do arquivo calculadora_steps.rb iremos ter:</p>
<pre class="brush: ruby;">
class Calc
	def initialize(x,y)
		@x =x
		@y = y
	end
end
</pre>
<p>Certamente isso irá fazer com que o teste passe, rodando a feature:</p>
<pre class="brush: ruby;">
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 #&#60;Object:0x8df61c&#62; (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
</pre>
<p>E como diria Dave Thomas em Agile Web Development With Rails &#8220;&#8230;&#8221;, erro:</p>
<p>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:</p>
<pre class="brush: ruby;">
Given /^I initialize calculator with (.*) and (.*)$/ do &#124;x,y&#124;
  @c = Calc.new(x.to_i, y.to_i)
end
</pre>
<p>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.</p>
<pre class="brush: ruby;">
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
</pre>
<p>E Bingo, passou! Vamos para o segundo passo:</p>
<pre class="brush: ruby;">
When /^I press go$/ do
  @result = @c.go
end
</pre>
<p>Quermos o resultado do metodo go na variavel result, vamos executar a feature:</p>
<pre class="brush: ruby;">
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 #&#60;Calc:0x11c5358 @y=10, @x=10&#62; (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
</pre>
<p>Olha, não temos ainda o metodo go, então vamos cirar-lo e fazer ele multiplicar os dois numeros.</p>
<pre class="brush: ruby;">
def go
 @x * @y
end
</pre>
<p>E rodando mais um vez nossa feature, passou!</p>
<pre class="brush: ruby;">
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
</pre>
<p>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.</p>
<pre class="brush: ruby;">
Then /^I should see (.*)$/ do &#124;result&#124;
  @result.should == result.to_i
end
</pre>
<p>Aqui usamos o metodo should(deveria) para verificar se o resultado bate com o que definimos, se rodarmos o teste veremos que tudo passou.</p>
<pre class="brush: ruby;">
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
</pre>
<p>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 <img src='http://s.wordpress.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> ), Novamente recomendo a leitura dos textos sobre bdd e afims.</p>
<p>Também fiz um pequeno screencast demostrando o que foi postado aqui:</p>
<p><a href="http://vimeo.com/7164228">http://vimeo.com/7164228</a></p>
<p>Não deixe de ver o seguinte link:</p>
<p>http://en.wikipedia.org/wiki/Behavior_Driven_Development</p>
<p>Até mais pessoal e não deixem de comentar!</p>
</div>]]></content:encoded>
</item>
<item>
<title><![CDATA[Rails for Kids 2009....]]></title>
<link>http://edipolf.wordpress.com/2009/08/14/rails-for-kids-2009/</link>
<pubDate>Fri, 14 Aug 2009 01:14:17 +0000</pubDate>
<dc:creator>Édipo Luis Féderle</dc:creator>
<guid>http://edipolf.wordpress.com/2009/08/14/rails-for-kids-2009/</guid>
<description><![CDATA[Irá sair no dia 12/09/2009 o Rails for Kids 2009,  se trata de uma série de palestras sobre assuntos]]></description>
<content:encoded><![CDATA[<div class='snap_preview'><p><img class="aligncenter size-full wp-image-326" title="2929102250_a1ac31a20f" src="http://edipolf.wordpress.com/files/2009/08/2929102250_a1ac31a20f.jpg" alt="2929102250_a1ac31a20f" width="375" height="500" /></p>
<p>Irá sair no dia 12/09/2009 o<a href="http://www.railsforkids.com/inscriptions"> Rails for Kids 2009</a>,  se trata de uma série de palestras sobre assuntos relacionados com o mundo rails, as palestras irão ser mistradas por <a href="http://www.railsforkids.com/site/programming">grandes nomes da comunidade Rails</a> 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 <a href="http://www.cotolengo.com.br/" target="_blank"> aqui</a>.</p>
<p>Acesse o site <a href="http://www.railsforkids.com/">Rails for Kids</a> e de uma olhada nas palestras e palestrantes e realize sua inscrição.</p>
<p>Para se escrever clique nesse <a href="http://www.railsforkids.com/inscriptions">link</a>.</p>
<p>É isso ai pessoal agente se encontra por lá&#8230; OPS, eh online tinha me esquecido <img src='http://s.wordpress.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
</div>]]></content:encoded>
</item>
<item>
<title><![CDATA[TDD + Ruby: Número de Fibonacci ]]></title>
<link>http://edipolf.wordpress.com/2009/06/15/tdd-ruby-numero-de-fibonacci/</link>
<pubDate>Mon, 15 Jun 2009 03:34:17 +0000</pubDate>
<dc:creator>Édipo Luis Féderle</dc:creator>
<guid>http://edipolf.wordpress.com/2009/06/15/tdd-ruby-numero-de-fibonacci/</guid>
<description><![CDATA[Estou necessitado de escrever posts melhores, eu sei, mas enquanto isso, tava brincando aqui com TDD]]></description>
<content:encoded><![CDATA[<div class='snap_preview'><p>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.</p>
<p>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:</p>
<p>Começamos com 1, então o proximo numero será : 0 + 1 = 1, o seguinte será 1 + 1 = 2 &#8230; 2 +1 = 3 &#8230; e assim vai&#8230; essa sequencia é defenida como sendo recursiva, a formula é:</p>
<p><img class="aligncenter size-full wp-image-294" title="0d5cce25d67941bb4661afd52609d93c" src="http://edipolf.wordpress.com/files/2009/06/0d5cce25d67941bb4661afd52609d93c.png" alt="0d5cce25d67941bb4661afd52609d93c" width="408" height="75" /></p>
<p>Bom, o problema ta entendido(eu acho) rs.</p>
<p>Como vamos fazer o uso de TDD, vamos começar escrevendo nossos testes</p>
<p>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:</p>
<pre class="brush: ruby;">

require &quot;test/unit&quot;

require &quot;fibonacci.rb&quot;

class Test &lt; Test::Unit::TestCase
   def test_case_name

   end
end
</pre>
<p>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.</p>
<pre class="brush: ruby;">
require &quot;test/unit&quot;
require &quot;fibonacci.rb&quot;
class TestFibonacci &lt; Test::Unit::TestCase
	def test_fiboZero
		assert_equal(0, Fibonacci.seqfibo(0))
	end
end
</pre>
<p>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:</p>
<p><strong><strong>LoadError:</strong> no such file to load  fibonacci.rb</strong></p>
<p><strong>Ops, </strong>certamente teriamos um erro ai mesmo, pois ainda nao criamos nossa classe fibonacci, vamos cria-la,(sem nehum codigo ainda) e rodar novamente:</p>
<p>Ops, denov, so temos um arquivo e mais nada então recebemos o seguinte:</p>
<p><strong><br />
Started<br />
E<br />
Finished in 0.002 seconds.</strong></p>
<p><strong>1) Error:<br />
test_fiboZero(TestFibonacci):<br />
NameError: uninitialized constant TestFibonacci::Fibonacci<br />
C:\Documents and Settings\casa\Desktop\Nova pasta\fibonacciTest:5:in `test_fiboZero&#8217;</strong></p>
<p><strong>1 tests, 0 assertions, 0 failures, 1 errors</strong></p>
<p>Vamos criar essa classe<strong>, </strong>acresente o seguinte em fibonacci.rb:</p>
<pre class="brush: ruby;">

class Fibonacci
    def self.seqfibo(num)
       return 0 if num == 0
    end
end
</pre>
<p>Bom, isso provavelmente irá fazer nosso teste passar, rodando recebemos o seguinte:</p>
<p><strong>Started<br />
.<br />
Finished in 0.002 seconds.</strong></p>
<p><strong>1 tests, 1 assertions, 0 failures, 0 errors</strong></p>
<p>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:</p>
<pre class="brush: ruby;">

require &quot;test/unit&quot;
require &quot;fibonacci.rb&quot;
class TestFibonacci &lt; Test::Unit::TestCase
    def test_fiboZero
       assert_equal(0, Fibonacci.seqfibo(0))
    end
    def test_fiboUm
       assert_equal(1, Fibonacci.seqfibo(1))
    end
end
</pre>
<p>a lógica dos teste aqui, nao mudou nada, vamos rodar para ver:</p>
<p><strong>Started<br />
F.<br />
Finished in 0.033 seconds.</strong></p>
<p><strong>1) Failure:<br />
test_fiboUm(TestFibonacci) [C:\Documents and Settings\casa\Desktop\Nova pasta\fibonacciTest:8]:<br />
&#60;1&#62; expected but was<br />
&#60;nil&#62;.</strong></p>
<p><strong>2 tests, 2 assertions, 1 failures, 0 errors</strong></p>
<p>Bom, vimos ali que o teste esperava 1 mas retornou nil, vamos implementar essa lógica na nossa classe, agora temos isso:</p>
<pre class="brush: ruby;">

class Fibonacci
    def self.seqfibo(num)
       return 0 if num == 0
      return 1 if num == 1
    end
end
</pre>
<p>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:</p>
<p>testes = [[0,0][1,1][2,1] . . .]</p>
<p>e logo interar por esse array passando esses valores para nosso teste, logo iremos ter um unico método, nossa classe teste fica +  &#8211; assim agora:</p>
<pre class="brush: ruby;">

require &quot;test/unit&quot;
require &quot;fibonacci.rb&quot;
class TestFibonacci &lt; Test::Unit::TestCase
    def test_fiboZero
       teste = [[0,0],[1,1],[2,2],[4,5],[3,2]]
       teste.each do &amp;#124;t&amp;#124;
          assert_equal(t[1], Fibonacci.seqfibo(t[0]))            
       end
    end
end
</pre>
<p>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:</p>
<pre class="brush: ruby;">

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
</pre>
<p>Agora rodamos o código de teste e recebemos:</p>
<p><strong><br />
Started<br />
.<br />
Finished in 0.002 seconds.</strong></p>
<p><strong>1 tests, 5 assertions, 0 failures, 0 errors</strong></p>
<p>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.</p>
</div>]]></content:encoded>
</item>
<item>
<title><![CDATA[[Dica Rápida] Problema ao rodar Ruby no E-TextEditor]]></title>
<link>http://edipolf.wordpress.com/2009/06/11/dica-rapida-problema-ao-rodar-ruby-no-e-texteditor/</link>
<pubDate>Thu, 11 Jun 2009 14:19:40 +0000</pubDate>
<dc:creator>Édipo Luis Féderle</dc:creator>
<guid>http://edipolf.wordpress.com/2009/06/11/dica-rapida-problema-ao-rodar-ruby-no-e-texteditor/</guid>
<description><![CDATA[Se você é um usuário Windows e usa o E-textEditor e estiver tentando usar o comando ctrl+r para roda]]></description>
<content:encoded><![CDATA[<div class='snap_preview'><p>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:</p>
<p><strong>ruby: no such file to load &#8212; ubygems (LoadError)</strong><br />
faça o seguinte para concertar esse problema:</p>
<p>1 &#8211; Baixe a ultima versao do RubyGems do <a href="http://rubygems.org/">site</a></p>
<p>2 &#8211; Descompacte-o dentro da sua pasta de usuario do Cygwin, no meu caso em:  <strong>C:\cygwin\home\edipo</strong></p>
<p>3 &#8211; Abra o terminal do Cygwin e execute os seguintes comando:</p>
<p><strong> $  unset RUBYOPT<br />
$ ruby setup.rb</strong></p>
<p>Pronto isso deve resolver.</p>
</div>]]></content:encoded>
</item>
<item>
<title><![CDATA[PHP Redirect To Another URL / Page Script]]></title>
<link>http://sunfjun.wordpress.com/2009/03/05/php-redirect-to-another-url-page-script/</link>
<pubDate>Thu, 05 Mar 2009 15:39:14 +0000</pubDate>
<dc:creator>sunfjun</dc:creator>
<guid>http://sunfjun.wordpress.com/2009/03/05/php-redirect-to-another-url-page-script/</guid>
<description><![CDATA[Under PHP you need to use header() to send a raw HTTP header. Using headers() method, you can easily]]></description>
<content:encoded><![CDATA[<div class='snap_preview'><p>Under PHP you need to use header()  to send a raw HTTP  header.</p>
<p>Using headers() method, you can easily transferred to the new page without having to click a link to continue. This is also useful for search engines. Remember that header() must be called before any actual output is sent, either by normal HTML tags, blank lines in a file, or from PHP. It is a very common error to read code with include(), or require(), functions, or another file access function, and have spaces or empty lines that are output before header() is called. The same problem exists when using a single PHP/HTML file.</p>
<h2>PHP Redirect Script</h2>
<p>You can easily redirect using following code:</p>
<pre class="php"> 
<span style="color:#000000;font-weight:bold;">&#60;?php</span>
<span style="color:#808080;font-style:italic;">/* Redirect browser */</span>
<a href="http://www.php.net/header"><span style="color:#000066;">header</span></a><span style="color:#66cc66;">(</span><span style="color:#ff0000;">"Location: http://theos.in/"</span><span style="color:#66cc66;">)</span>;
<span style="color:#808080;font-style:italic;">/* Make sure that code below does not get executed when we redirect. */</span>
<a href="http://www.php.net/exit"><span style="color:#000066;">exit</span></a>;
<span style="color:#000000;font-weight:bold;">?&#62;</span></pre>
<h3>Another sample hack</h3>
<p>Sample function &#8211; sitefunctions.php (note I&#8217;m not the author of the following I found it somewhere else on the Internet):</p>
<pre class="php"><span style="color:#000000;font-weight:bold;">function</span> movePage<span style="color:#66cc66;">(</span><span style="color:#0000ff;">$num</span>,<span style="color:#0000ff;">$url</span><span style="color:#66cc66;">)</span><span style="color:#66cc66;">{</span>
   <a href="http://www.php.net/static"><span style="color:#000066;">static</span></a> <span style="color:#0000ff;">$http</span> = <a href="http://www.php.net/array"><span style="color:#000066;">array</span></a> <span style="color:#66cc66;">(</span>
       <span style="color:#cc66cc;">100</span> =&#62; <span style="color:#ff0000;">"HTTP/1.1 100 Continue"</span>,
       <span style="color:#cc66cc;">101</span> =&#62; <span style="color:#ff0000;">"HTTP/1.1 101 Switching Protocols"</span>,
       <span style="color:#cc66cc;">200</span> =&#62; <span style="color:#ff0000;">"HTTP/1.1 200 OK"</span>,
       <span style="color:#cc66cc;">201</span> =&#62; <span style="color:#ff0000;">"HTTP/1.1 201 Created"</span>,
       <span style="color:#cc66cc;">202</span> =&#62; <span style="color:#ff0000;">"HTTP/1.1 202 Accepted"</span>,
       <span style="color:#cc66cc;">203</span> =&#62; <span style="color:#ff0000;">"HTTP/1.1 203 Non-Authoritative Information"</span>,
       <span style="color:#cc66cc;">204</span> =&#62; <span style="color:#ff0000;">"HTTP/1.1 204 No Content"</span>,
       <span style="color:#cc66cc;">205</span> =&#62; <span style="color:#ff0000;">"HTTP/1.1 205 Reset Content"</span>,
       <span style="color:#cc66cc;">206</span> =&#62; <span style="color:#ff0000;">"HTTP/1.1 206 Partial Content"</span>,
       <span style="color:#cc66cc;">300</span> =&#62; <span style="color:#ff0000;">"HTTP/1.1 300 Multiple Choices"</span>,
       <span style="color:#cc66cc;">301</span> =&#62; <span style="color:#ff0000;">"HTTP/1.1 301 Moved Permanently"</span>,
       <span style="color:#cc66cc;">302</span> =&#62; <span style="color:#ff0000;">"HTTP/1.1 302 Found"</span>,
       <span style="color:#cc66cc;">303</span> =&#62; <span style="color:#ff0000;">"HTTP/1.1 303 See Other"</span>,
       <span style="color:#cc66cc;">304</span> =&#62; <span style="color:#ff0000;">"HTTP/1.1 304 Not Modified"</span>,
       <span style="color:#cc66cc;">305</span> =&#62; <span style="color:#ff0000;">"HTTP/1.1 305 Use Proxy"</span>,
       <span style="color:#cc66cc;">307</span> =&#62; <span style="color:#ff0000;">"HTTP/1.1 307 Temporary Redirect"</span>,
       <span style="color:#cc66cc;">400</span> =&#62; <span style="color:#ff0000;">"HTTP/1.1 400 Bad Request"</span>,
       <span style="color:#cc66cc;">401</span> =&#62; <span style="color:#ff0000;">"HTTP/1.1 401 Unauthorized"</span>,
       <span style="color:#cc66cc;">402</span> =&#62; <span style="color:#ff0000;">"HTTP/1.1 402 Payment Required"</span>,
       <span style="color:#cc66cc;">403</span> =&#62; <span style="color:#ff0000;">"HTTP/1.1 403 Forbidden"</span>,
       <span style="color:#cc66cc;">404</span> =&#62; <span style="color:#ff0000;">"HTTP/1.1 404 Not Found"</span>,
       <span style="color:#cc66cc;">405</span> =&#62; <span style="color:#ff0000;">"HTTP/1.1 405 Method Not Allowed"</span>,
       <span style="color:#cc66cc;">406</span> =&#62; <span style="color:#ff0000;">"HTTP/1.1 406 Not Acceptable"</span>,
       <span style="color:#cc66cc;">407</span> =&#62; <span style="color:#ff0000;">"HTTP/1.1 407 Proxy Authentication Required"</span>,
       <span style="color:#cc66cc;">408</span> =&#62; <span style="color:#ff0000;">"HTTP/1.1 408 Request Time-out"</span>,
       <span style="color:#cc66cc;">409</span> =&#62; <span style="color:#ff0000;">"HTTP/1.1 409 Conflict"</span>,
       <span style="color:#cc66cc;">410</span> =&#62; <span style="color:#ff0000;">"HTTP/1.1 410 Gone"</span>,
       <span style="color:#cc66cc;">411</span> =&#62; <span style="color:#ff0000;">"HTTP/1.1 411 Length Required"</span>,
       <span style="color:#cc66cc;">412</span> =&#62; <span style="color:#ff0000;">"HTTP/1.1 412 Precondition Failed"</span>,
       <span style="color:#cc66cc;">413</span> =&#62; <span style="color:#ff0000;">"HTTP/1.1 413 Request Entity Too Large"</span>,
       <span style="color:#cc66cc;">414</span> =&#62; <span style="color:#ff0000;">"HTTP/1.1 414 Request-URI Too Large"</span>,
       <span style="color:#cc66cc;">415</span> =&#62; <span style="color:#ff0000;">"HTTP/1.1 415 Unsupported Media Type"</span>,
       <span style="color:#cc66cc;">416</span> =&#62; <span style="color:#ff0000;">"HTTP/1.1 416 Requested range not satisfiable"</span>,
       <span style="color:#cc66cc;">417</span> =&#62; <span style="color:#ff0000;">"HTTP/1.1 417 Expectation Failed"</span>,
       <span style="color:#cc66cc;">500</span> =&#62; <span style="color:#ff0000;">"HTTP/1.1 500 Internal Server Error"</span>,
       <span style="color:#cc66cc;">501</span> =&#62; <span style="color:#ff0000;">"HTTP/1.1 501 Not Implemented"</span>,
       <span style="color:#cc66cc;">502</span> =&#62; <span style="color:#ff0000;">"HTTP/1.1 502 Bad Gateway"</span>,
       <span style="color:#cc66cc;">503</span> =&#62; <span style="color:#ff0000;">"HTTP/1.1 503 Service Unavailable"</span>,
       <span style="color:#cc66cc;">504</span> =&#62; <span style="color:#ff0000;">"HTTP/1.1 504 Gateway Time-out"</span>
   <span style="color:#66cc66;">)</span>;
   <a href="http://www.php.net/header"><span style="color:#000066;">header</span></a><span style="color:#66cc66;">(</span><span style="color:#0000ff;">$http</span><span style="color:#66cc66;">[</span><span style="color:#0000ff;">$num</span><span style="color:#66cc66;">]</span><span style="color:#66cc66;">)</span>;
   <a href="http://www.php.net/header"><span style="color:#000066;">header</span></a> <span style="color:#66cc66;">(</span><span style="color:#ff0000;">"Location: $url"</span><span style="color:#66cc66;">)</span>;
<span style="color:#66cc66;">}</span></pre>
<p>Now call it as follows:</p>
<pre class="php"><span style="color:#000000;font-weight:bold;">&#60;?php</span>
@<span style="color:#b1b100;">include</span><span style="color:#66cc66;">(</span><span style="color:#ff0000;">"/path/to/sitefunctions.php"</span><span style="color:#66cc66;">)</span>;
movePage<span style="color:#66cc66;">(</span><span style="color:#cc66cc;">403</span>,<span style="color:#ff0000;">"http://www.cyberciti.biz/"</span><span style="color:#66cc66;">)</span>;
<span style="color:#000000;font-weight:bold;">?&#62;</span></pre>
</div>]]></content:encoded>
</item>
<item>
<title><![CDATA[Growl notifications with autotest made easy]]></title>
<link>http://benl.wordpress.com/2009/01/07/growl-notifications-with-autotest-made-easy/</link>
<pubDate>Wed, 07 Jan 2009 18:59:04 +0000</pubDate>
<dc:creator>benl</dc:creator>
<guid>http://benl.wordpress.com/2009/01/07/growl-notifications-with-autotest-made-easy/</guid>
<description><![CDATA[Setting up a new project to use growl notification via autotest can be a bit tricky. There is a fant]]></description>
<content:encoded><![CDATA[<div class='snap_preview'><p>Setting up a new project to use growl notification via autotest can be a bit tricky. There is a fantastic gem called <a href="http://growl-glue.rubyforge.org/">growl-glue</a> that can simplify the whole procedure. Simply:</p>
<p><code>[sudo] gem install growl-glue</code></p>
<p>Then add the following lines to your .autotest file:</p>
<p><code>require 'growl_glue'<br />
GrowlGlue::Autotest.initialize</code></p>
<p>initialize will accept a block containing a stack of different configuration options. <a href="http://growl-glue.rubyforge.org/">Take a look at what is possible here</a>.</p>
</div>]]></content:encoded>
</item>
<item>
<title><![CDATA[Rails - Testando - Test::Unit - Parte 1]]></title>
<link>http://edipolf.wordpress.com/2009/01/05/rails-testando-testunit-parte-1/</link>
<pubDate>Mon, 05 Jan 2009 17:39:03 +0000</pubDate>
<dc:creator>Édipo Luis Féderle</dc:creator>
<guid>http://edipolf.wordpress.com/2009/01/05/rails-testando-testunit-parte-1/</guid>
<description><![CDATA[Olá, não sou um cara que sabe tudo sobre testes,( não sei quase nada , mas vejo a importância que el]]></description>
<content:encoded><![CDATA[<div class='snap_preview'><p><img class="aligncenter size-full wp-image-213" title="testing" src="http://edipolf.wordpress.com/files/2009/01/testing.jpg" alt="testing" width="382" height="261" /></p>
<p>Olá, não sou um cara que sabe tudo sobre testes,( não sei quase nada <img src='http://s.wordpress.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> , mas vejo a importância que eles tem no bom desenvolvimento, tendo isso em mente começei a estudar testes não escolhi um framework específico para fazer isso como o Rspec, ou algum outro, optei por escolher o framework que vem junto com o Rails que é o Test::Unit, então resolvi escrever aqui um pouco sobre isso e compartilhar, isso é algo simples, sendo que é o primeiro post de um série que eu acredito que será, então fazam bom proveito, e me desculpem os erros( deixem comentários).</p>
<p><strong><br />
1 &#8211; Começando: Criando um CRUD simples para os exemplo<br />
</strong><br />
Criei apenas um pequeno projeto rails como um CRUD normal para realizar algumas demos aqui, criei um modelo product, contendo o titulo do produto e a quantidade.</p>
<p><strong>2 &#8211; Testes de Unidade.</strong></p>
<p>Teste de Unidade são testes realizados nos models.</p>
<p><em>class ProductTest &#60; Test::Unit::TestCase </em></p>
<p>ProductTeste é uma subclasse da classe  Test::Unit::TestCase que é onde fica o framework Test::Unit que esta pré-instalado com o rails.</p>
<pre><span style="color:#000080;">require</span><span style="color:#141312;"> </span><span style="color:#0057ae;">File</span><span style="color:#4000a7;">.dirname</span><span style="color:#141312;">(</span><span style="color:#b08000;">__FILE__</span><span style="color:#141312;">) </span><span style="color:#ff9fec;">+</span><span style="color:#141312;"> </span><span style="color:#dd4a4a;">'/../test_helper'</span><span style="color:#141312;"> </span>

<span style="color:#141312;"><strong>class</strong> </span><span style="color:#0057ae;">ProductTest</span><span style="color:#141312;"> </span><span style="color:#ff9fec;">&#60;</span><span style="color:#141312;"> </span><span style="color:#0057ae;">Test</span><span style="color:#ff9fec;">::</span><span style="color:#0057ae;">Unit</span><span style="color:#ff9fec;">::</span><span style="color:#0057ae;">TestCase</span><span style="color:#141312;"> </span>
<span style="color:#141312;">  fixtures </span><span style="color:#d40000;">:products</span><span style="color:#141312;"> </span>

<span style="color:#141312;">  </span><span style="color:#888786;"><em># Replace this with your real tests. </em></span>
<span style="color:#141312;">  <strong>def</strong> test_truth </span>
<span style="color:#141312;">    assert </span><span style="color:#b08000;">true</span><span style="color:#141312;"> </span>
<span style="color:#141312;">  <strong>end</strong> </span>
<span style="color:#141312;"><strong>end</strong> </span>

aqui está o codigo que o rails gerou para nós, então: (veremos fixtures no proximo post)

fixtures :products 

Permite pré-pencher o banco de dados apenas com os dados de testes corretos e o método test_truth,
tudo que começa com test quer dizer que ele irá ser executado como teste pelo framework  a linha assert
true que é de fato o teste, mas o que ela simplesmente faz aqui é um teste se true é verdadeiro <img src='http://s.wordpress.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />
______________________________________________________________

OBS 1: Definir um nome de teste como por exemplo:

	<strong>def teste_valide_empty_price
		# . . .
	end</strong>
isso gera um erro de sintaxe, pois testes devem começar com test e não teste
______________________________________________________________

Porque testar se true é verdaderiro?, Isso serve maior ou menos como um “verificador” para você se
assegurar que tudo está funcionando corretamente com o framework de testes. Bom você pode pensar o que
poderia dar errado mesmo antes de você começar a escrever os seus teste?

Bom tente executar então o teste de unidade:

<strong>Loaded suite test/unit/product_test
Started
EE
Finished in 0.014967 seconds.
1) Error:
test_truth(ProductTest):
Mysql::Error: Unknown database 'demo_test' 

2) Error:
test_truth(ProductTest):
Mysql::Error: Unknown database 'demo_test' 

1 tests, 0 assertions, 0 failures, 2 errors </strong>

Viu?? Falhou, facilmente vimos que que ele não conseguiu localizar o banco de dados demo_test, e não
é de menos, não criamos esse banco ainda, como poderia achar?

<em>mysql &#62;&#62; create database demo_test;</em>

Agora rodando novamente o teste:

<strong>ruby test/unit/product_test.rb Loaded suite test/unit/product_test
Started
E
Finished in 0.599951 seconds. 

  1) Error:
test_truth(ProductTest):
ActiveRecord::StatementInvalid: Mysql::Error: Table 'demo_test.products' doesn't exist: DELETE FROM
products 

1 tests, 0 assertions, 0 failures, 1 errors </strong>

E BUM, falhou de novo, agora vimos que a tebela não existe, então o rails tem uma tarefa rake que  faz isso:
<em>
rake db:test:prepare</em>

Agora sim, rode novamente o teste e tudo deverá funcionar:

<strong>ruby test/unit/product_test.rb
Loaded suite test/unit/product_test
Started
.
Finished in 0.014913 seconds. 

1 tests, 1 assertions, 0 failures, 0 errors </strong>

__________________________________________________________
<em>Teste de Unidade são teste que testam models, o que testa uma acão em um controller são testes
funcionais, e o que testa o fluxo por um ou mais controllers são testes de integracão.
__________________________________________________________</em>

o camando rake prenche o esquema de banco de dados igual a do de desevolvimento. 

Agora rodando o teste e vemos que tudo esta certo: 

<strong>ruby test/unit/product_test.rb
Loaded suite test/unit/product_test
Started
.
Finished in 0.017633 seconds. 

1 tests, 1 assertions, 0 failures, 0 errors

:</strong>) ok.

Agora que esta tudo OK, podemos começar a escrever uns pequenos testes.

O primeiro teste que vamos fazer é assegurar que esses dois campos não passem por um teste onde
seus atributos são vazios.

Como Fazer isso?

Caso um produto inválido( vazio ) seja criado, isso deve ser considerado inválido pelo nosso teste,
e por vez um erro deve ser associado ao campo em questão.

O rails possue um método chamado invalid? Para ver se o produto é valido, e usar o método invalid?
Para ver se existem erros associados a aquele atributo em questão.

Como dizemos para o teste se ele passou ou não ? A resposta para a pergunta são as assertivas(assert),
 elas informam ao framework o que esperamos ser verdade, caso for true nada ocorre, e se for false a
assert falha.

<span style="color:#000080;">require</span><span style="color:#141312;"> </span><span style="color:#0057ae;">File</span><span style="color:#4000a7;">.dirname</span><span style="color:#141312;">(</span><span style="color:#b08000;">__FILE__</span><span style="color:#141312;">) </span><span style="color:#ff9fec;">+</span><span style="color:#141312;"> </span><span style="color:#dd4a4a;">'/../test_helper'</span><span style="color:#141312;"> </span>

<span style="color:#141312;"><strong>class</strong> </span><span style="color:#0057ae;">ProductTest</span><span style="color:#141312;"> </span><span style="color:#ff9fec;">&#60;</span><span style="color:#141312;"> </span><span style="color:#0057ae;">Test</span><span style="color:#ff9fec;">::</span><span style="color:#0057ae;">Unit</span><span style="color:#ff9fec;">::</span><span style="color:#0057ae;">TestCase</span><span style="color:#141312;"> </span>
<span style="color:#141312;">  fixtures </span><span style="color:#d40000;">:products</span><span style="color:#141312;"> </span>

<span style="color:#141312;">  </span><span style="color:#888786;"><em># Replace this with your real tests. </em></span>
<span style="color:#141312;">  <strong>def</strong> test_truth </span>
<span style="color:#141312;">    assert </span><span style="color:#b08000;">true</span><span style="color:#141312;"> </span>
<span style="color:#141312;">  <strong>end</strong> </span>
<span style="color:#141312;">  </span>
<span style="color:#141312;">  <strong>def</strong> test_invalid_empty </span>
<span style="color:#141312;">     product </span><span style="color:#ff9fec;">=</span><span style="color:#141312;"> </span><span style="color:#0057ae;">Product</span><span style="color:#4000a7;">.new</span><span style="color:#141312;"> </span>
<span style="color:#ff9fec;">=&#62;</span><span style="color:#141312;">assert !product</span><span style="color:#4000a7;">.valid?</span><span style="color:#141312;"> </span>
<span style="color:#141312;">     assert product</span><span style="color:#4000a7;">.errors.invalid?</span><span style="color:#141312;">(</span><span style="color:#d40000;">:titulo</span><span style="color:#141312;">) </span>
<span style="color:#141312;">     assert product</span><span style="color:#4000a7;">.errors.invalid?</span><span style="color:#141312;">(</span><span style="color:#d40000;">:quantidade</span><span style="color:#141312;">) </span>
<span style="color:#141312;">  <strong>end</strong> </span>
<span style="color:#141312;"><strong>end

</strong>Na linha em destaque, dizemos ao framework que  o modelo product não é valido, e usamos o método invalid?
Para verificar se contém algum erro asociado a tal atributo.
Tente executar esse teste e você irá ver que ele vai falhar, então vamos até o nosso model e coloquemos a
validação dos dois campos:

</span><span style="color:#141312;"><strong>class</strong> </span><span style="color:#0057ae;">Product</span><span style="color:#141312;"> </span><span style="color:#ff9fec;">&#60;</span><span style="color:#141312;"> </span><span style="color:#0057ae;">ActiveRecord</span><span style="color:#ff9fec;">::</span><span style="color:#0057ae;">Base</span><span style="color:#141312;"> </span>
<span style="color:#141312;">   validates_presence_of </span><span style="color:#d40000;">:titulo</span><span style="color:#141312;"> </span>
<span style="color:#141312;">   validates_presence_of </span><span style="color:#d40000;">:quantidade</span><span style="color:#141312;"> </span>
<span style="color:#141312;"><strong>end

</strong>Rode e teste e... passou, validação está certa.

Temos um campo chamado quantidade seria interessante que esse campo fosse maior que zero, entao eu me
faço a pergunta:

<em>1 – Quantidade pode ser menor que 0? Não.</em>

OBS 2: Essa dica de se fazer perguntas, é um jeito mais facil de descobrir como escrever seus testes,
ela foi dita pelo Tapájos, na excelente série sobre testes feita por ele.
</span>
<span style="color:#141312;">  <strong>def</strong> test_quantidade_positiva </span>
<span style="color:#141312;">  	   product </span><span style="color:#ff9fec;">=</span><span style="color:#141312;"> </span><span style="color:#0057ae;">Product</span><span style="color:#4000a7;">.new</span><span style="color:#141312;">(</span><span style="color:#d40000;">:titulo</span><span style="color:#141312;"> </span><span style="color:#ff9fec;">=&#62;</span><span style="color:#141312;"> </span><span style="color:#bf0303;">"TV LCD"</span><span style="color:#141312;">) </span>
<span style="color:#141312;">  	   		                             </span>
<span style="color:#141312;">  	   product</span><span style="color:#4000a7;">.quantidade</span><span style="color:#141312;"> </span><span style="color:#ff9fec;">=</span><span style="color:#141312;"> </span><span style="color:#ff9fec;">-</span><span style="color:#b08000;">1</span><span style="color:#141312;"> </span>
<span style="color:#141312;">  	   assert !product</span><span style="color:#4000a7;">.valid?</span><span style="color:#141312;"> </span>
<span style="color:#141312;">  	   assert_equal </span><span style="color:#bf0303;">"Should be at least 0"</span><span style="color:#141312;">, product</span><span style="color:#4000a7;">.errors.on</span><span style="color:#141312;">(</span><span style="color:#d40000;">:quantidade</span><span style="color:#141312;">) </span>
<span style="color:#141312;">  	   </span>
<span style="color:#141312;">  	   product</span><span style="color:#4000a7;">.quantidade</span><span style="color:#141312;"> </span><span style="color:#ff9fec;">=</span><span style="color:#141312;"> </span><span style="color:#b08000;">0</span><span style="color:#141312;"> </span>
<span style="color:#141312;">  	   assert !product</span><span style="color:#4000a7;">.valid?</span><span style="color:#141312;"> </span>
<span style="color:#141312;">  	   assert_equal </span><span style="color:#bf0303;">"Should be at least 0"</span><span style="color:#141312;">, product</span><span style="color:#4000a7;">.errors.on</span><span style="color:#141312;">(</span><span style="color:#d40000;">:quantidade</span><span style="color:#141312;">) </span>
<span style="color:#141312;">  	   </span>
<span style="color:#141312;">  	   product</span><span style="color:#4000a7;">.quantidade</span><span style="color:#141312;"> </span><span style="color:#ff9fec;">=</span><span style="color:#141312;"> </span><span style="color:#b08000;">1</span><span style="color:#141312;"> </span>
<span style="color:#141312;">  	   assert product</span><span style="color:#4000a7;">.valid?</span><span style="color:#141312;"> </span>
<span style="color:#141312;">  <strong>end</strong></span>

Aqui há uma configuração de três possíveis valores que o campo quantidade pode receber, para ele ver
válido deve ter seu valor &#62;  0, o que o teste faz é criar um novo produto, e configurar a quantidade em 0,
-1, e 1 respectivamente, os dois primeiros asserts são inválidos, pois os valores são 0 e -1, e o último
configurado como 1 dizemos que é valido.

Rode o teste, e BUM, falhou, não estamos fazendo a validacão correta para esse campo, entao no seu model
coloque algo do tipo:

<span style="color:#0000ff;"><strong>protected</strong></span><span style="color:#141312;"> </span>
<span style="color:#141312;">   <strong>def</strong> validate </span>
<span style="color:#141312;">      errors</span><span style="color:#4000a7;">.add</span><span style="color:#141312;">(</span><span style="color:#d40000;">:quantidade</span><span style="color:#141312;">, </span><span style="color:#bf0303;">"Deve ser maior que 0"</span><span style="color:#141312;">)  <strong>if</strong> quantidade</span><span style="color:#4000a7;">.nil?</span><span style="color:#141312;"> </span><span style="color:#ff9fec;">&#124;&#124;</span><span style="color:#141312;"> quantidade </span><span style="color:#ff9fec;">&#60;=</span><span style="color:#141312;"> </span><span style="color:#b08000;">0</span><span style="color:#141312;"> </span>
<span style="color:#141312;">  <strong>end
</strong>

Criei um método validate, com o conteúdo acima, ele é protected por que não pode ser chamado fora do
contesto do model.

Agora rode o teste novamente e... OK.

Vamos à mais um pergunta:

	<em>A quantidade pode ser um valor quebrado(float)? - Não.</em>

Então vamos ao teste, muito similar aos outros.

</span><span style="color:#141312;"><strong>def</strong> test_inteiro_value</span>
<span style="color:#141312;">  	   product </span><span style="color:#ff9fec;">=</span><span style="color:#141312;"> </span><span style="color:#0057ae;">Product</span><span style="color:#4000a7;">.new</span><span style="color:#141312;">(</span><span style="color:#d40000;">:titulo</span><span style="color:#141312;"> </span><span style="color:#ff9fec;">=&#62;</span><span style="color:#141312;"> </span><span style="color:#bf0303;">"TV LCD"</span><span style="color:#141312;">,</span>
<span style="color:#141312;">  	                                        </span><span style="color:#d40000;">:quantidade</span><span style="color:#141312;"> </span><span style="color:#ff9fec;">=&#62;</span><span style="color:#141312;"> </span><span style="color:#b08000;">1.2</span><span style="color:#141312;"> )</span>
<span style="color:#141312;">  	   </span>
<span style="color:#141312;">  	   assert !product</span><span style="color:#4000a7;">.valid?</span>
<span style="color:#141312;">  	   assert product</span><span style="color:#4000a7;">.errors.invalid?</span><span style="color:#141312;">(</span><span style="color:#d40000;">:quantidade</span><span style="color:#141312;">)</span>
<span style="color:#141312;"><strong>end

</strong>Certo, sem problemas, rodando o teste vemos que o teste não passou, isso significa que temos uma falha
no nosso modelo de validação.

Vamos acresentar a seguinte validação:

	<strong>validates_numericality_of :quantidade, <img src='http://s.wordpress.com/wp-includes/images/smilies/icon_surprised.gif' alt=':o' class='wp-smiley' /> nly_integer =&#62; true</strong>

Aqui dizemos que estamos aceitado apenas numero inteiros, para o campo quantidade.<strong>
</strong></span><span style="color:#141312;"><strong>
</strong></span>Bom, esse é o fim do primeiro post sobre Testes usando Test Unit, espero que tenha ficado claro,
obviamente isso foi muito superficial, mas creio que deu para dar uma compreendida e ver o quão
importante são os teste( e legal ). Esse post falamos apenas de testes de unidade, no próximo post,
continuaremos falando de testes de unidade.... é isso ai, espero comentários com críticas e sugestões,
abraço a todos.<strong>

Referências:</strong>

	Agil Development With Rails  - 2<strong> (Livro)
</strong></pre>
</div>]]></content:encoded>
</item>
<item>
<title><![CDATA[Gerando arquivos PDF com Ruby(pdf/writer)  - Parte 1.]]></title>
<link>http://edipolf.wordpress.com/2008/12/11/gerando-arquivos-pdf-com-rubypdfwriter-parte-1/</link>
<pubDate>Thu, 11 Dec 2008 15:49:24 +0000</pubDate>
<dc:creator>Édipo Luis Féderle</dc:creator>
<guid>http://edipolf.wordpress.com/2008/12/11/gerando-arquivos-pdf-com-rubypdfwriter-parte-1/</guid>
<description><![CDATA[Olá, pessoal, uma forma de se gerar documentos PDF usando Ruby é utilizar o pdf-writer, é uma gem qu]]></description>
<content:encoded><![CDATA[<div class='snap_preview'><p>Olá, pessoal, uma forma de se gerar documentos PDF usando Ruby é utilizar o  <a href="http://ruby-pdf.rubyforge.org/pdf-writer/">pdf-writer</a>, é uma gem que pode ser usada tanto em Rails e Ruby, nessa primeira parte vamos conhecer o básico , criar alguns exemplos e ver como o negocio funciona, não iremos ver tudo da gem(é obvio) bem que para isso tem o manual no site(99 páginas em Inglês), nesse post não iremos interar com o Rails, somente Ruby.</p>
<p><strong>1 &#8211; Instalação</strong></p>
<p>Para instalar o pdf-writer temos dois caminhos, 1) Instalar via RubyGems(recomendo) e 2) Instalar manualmente usando o pacote. Recomendo via rubygems pois ele irá reconhecer as dependências que o pdf-writer tem, já a segunda você irá ter que instalar a dependencia, ou transaction-simple ou colors-tools.<br />
<em><br />
Via RubyGems:</em></p>
<p><strong>sudo gem install pdf-writer</strong></p>
<p><em>Via “package”</em></p>
<p><strong>wget http://rubyforge.org/frs/download.php/33972/pdf-writer.1.1.8.tar.gz<br />
tar -xvzf pdf-writer.1.1.8.tar.gz<br />
cd pdf_writer-1.1.8<br />
sudo ruby setup.rb</strong></p>
<p>agora instale o transaction-simple ou colors-tools da mesma forma.<br />
Mas acho melhor a primeiro opção</p>
<p><strong>2 – Criando um Exemplo Muito Simples.</strong></p>
<p>Vamos criar um  exemplo “Hello PDF::Writer” para não ficar “Hello World”  , crie arquivo chamado teste_pdf1.pfd com o seguinte conteúdo:</p>
<pre class="brush: ruby;">
require &quot;rubygems&quot;
require &quot;pdf/writer&quot;

pdf = PDF::Writer.new
pdf.text(&quot;Hello PDF::Writer&quot;, :font_size =&gt; 35)
pdf.save_as(&quot;file1.pdf&quot;)
</pre>
<p>Isto produz:</p>
<p><img class="aligncenter size-full wp-image-168" title="imagen1" src="http://edipolf.wordpress.com/files/2008/12/imagen1.jpg" alt="imagen1" width="480" height="184" /></p>
<p>Fizemos dois requires ali no começo, com rubygems e pdf/writer, após fizemos a chamada de PDF::Writer, logo depois “escrevemos” no documento  o texto “Hello PDF::Writer” e definimos o tamanho da fonte para 35 pontos, então por ultimo salvamos o documento como file1.pdf.</p>
<p><strong>3 – Fontes e Posições.</strong></p>
<p>Para configurar  o tipo de fonte usada você pode usar  pdf.select_font &#8220;Times-Roman&#8221; por exemplo, opções de posição , :left, :right, :absolute_left, :absolute_right, vamos a um exemplo:</p>
<pre class="brush: ruby;">

require &quot;rubygems&quot;
require &quot;pdf/writer&quot;

pdf = PDF::Writer.new
pdf.select_font &quot;Courier-BoldOblique&quot;
pdf.text(&quot;Hello PDF::Writer&quot;, :font_size =&gt; 35, :left =&gt; 100)
pdf.save_as(&quot;file2.pdf&quot;)
</pre>
<p>Isto produz:</p>
<p><img class="aligncenter size-full wp-image-169" title="imagen2" src="http://edipolf.wordpress.com/files/2008/12/imagen2.jpg" alt="imagen2" width="480" height="126" /><strong>Justificações:</strong><br />
Com as seguinte quatro formas de justificação:</p>
<pre class="brush: ruby;">
pdf.text(&quot;Hello Ruby!&quot;, :justification =&gt; :left)
pdf.text(&quot;Hello Ruby!&quot;, :justification =&gt; :right)
pdf.text(“Hello Ruby!&quot;, :justification =&gt; :center)
pdf.text(&quot;Hello Ruby&quot;, :justification =&gt; :full)
</pre>
<p><strong>4 – Espaçamento entre Linhas</strong></p>
<p>Você pode configurar o espaço entre determindas linhas do texto por exemplo:</p>
<pre class="brush: ruby;">

require &quot;rubygems&quot;
require &quot;pdf/writer&quot;

pdf = PDF::Writer.new
pdf.select_font &quot;Courier-BoldOblique&quot;
pdf.text(&quot;Hello PDF::Writer&quot;, :font_size =&gt; 35, :left =&gt; 100)
pdf.text(&quot;Ola Mundo Cruel!&quot;, :font_size =&gt; 35, :left =&gt; 100, :spacing =&gt; 5)
pdf.save_as(&quot;file3.pdf&quot;)
</pre>
<p><img class="aligncenter size-full wp-image-170" title="imagen3" src="http://edipolf.wordpress.com/files/2008/12/imagen3.jpg" alt="imagen3" width="480" height="313" /></p>
<p><strong><br />
5 – Documento final</strong></p>
<p>Para finalizar esse post vamos criar um “documento real” com um simples texto, usando o que vimos nesse post.</p>
<pre class="brush: ruby;">

require &quot;rubygems&quot;
require &quot;pdf/writer&quot;

pdf = PDF::Writer.new

BODY = &lt;&lt;-'EOS'
Benjamin Franklin (January 17, 1706 [O.S. January 6, 1705]   April 17, 1790) was one of the Founding Fathers of the United States of America. A noted polymath, Franklin was a leading author and printer, satirist, political theorist, politician, scientist, inventor, civic activist, statesman, and diplomat. As a scientist, he was a major figure in the Enlightenment and the history of physics for his discoveries and theories regarding electricity. He invented the lightning rod, bifocals, the Franklin stove, a carriage odometer, and a musical instrument. He formed both the first public lending library in America and first fire department in Pennsylvania. He was an early proponent of colonial unity and as a political writer and activist he, more than anyone, invented the idea of an American nation[1] and as a diplomat during the American Revolution, he secured the French alliance that helped to make independence possible.
Franklin is credited as being foundational to the roots of American values and character, a marriage of the practical and democratic Puritan values of thrift, hard work, education, community spirit, self-governing institutions, and opposition to authoritarianism both political and religious, with the scientific and tolerant values of the Enlightenment. In the words of Henry Steele Commager, &quot;In Franklin could be merged the virtues of Puritanism without its defects, the illumination of the Enlightenment without its heat.&quot;[2] To Walter Isaacson, this makes Franklin, &quot;the most accomplished American of his age and the most influential in inventing the type of society America would become.&quot;
EOS

corpo = BODY.split($/).join(&quot; &quot;).squeeze(&quot; &quot;)

pdf.text(&quot;Benjamin Franklin&quot;, :font_size =&gt; 20, :justification =&gt; :center)
pdf.move_pointer(36)
pdf.text(corpo, :font_size =&gt; 12, :justification =&gt; :full)
pdf.move_pointer(50)
pdf.text(&quot;Fonte: Wikipedia&quot;, :font_size =&gt; 10, :left =&gt; 370)
pdf.save_as(&quot;final.pdf&quot;)
</pre>
<p><img class="aligncenter size-full wp-image-171" title="imagen4" src="http://edipolf.wordpress.com/files/2008/12/imagen4.jpg" alt="imagen4" width="480" height="384" /></p>
<p>Bom para começo é isso, logo irei postar algo mais sobre o pdf-writer, obviamente isso é muito mas muito básico.</p>
</div>]]></content:encoded>
</item>
<item>
<title><![CDATA[JSON &amp; XML parsing with Sinatra, RestClient &amp; HTTParty]]></title>
<link>http://newoldstuff.wordpress.com/2008/12/09/json-xml-parsing-with-sinatra-restclient-httparty/</link>
<pubDate>Tue, 09 Dec 2008 16:57:37 +0000</pubDate>
<dc:creator>alinpopa</dc:creator>
<guid>http://newoldstuff.wordpress.com/2008/12/09/json-xml-parsing-with-sinatra-restclient-httparty/</guid>
<description><![CDATA[These days I was playing with Sinatra, RestClient and HTTParty microframeworks for Ruby and from wha]]></description>
<content:encoded><![CDATA[<div class='snap_preview'><p>These days I was playing with <a href="http://sinatra.rubyforge.org/">Sinatra</a>, <a href="http://rest-client.heroku.com/rdoc/">RestClient</a> and <a href="http://github.com/jnunemaker/httparty/tree/master">HTTParty</a> microframeworks for Ruby and from what I know, there is no automatic parsing for RestClient like in HTTParty, so I tried the following test by using all three of them:</p>
<p>Sinatra quick test:</p>
<pre class="brush: ruby;">
require 'rubygems'
require 'sinatra'

get &quot;/my/get&quot; do
  '{&quot;response&quot;:{&quot;error&quot;:false,&quot;message&quot;:&quot;Back to you from get&quot;}}'
end
post &quot;/my/post&quot; do
  '&lt;response&gt;&lt;error&gt;false&lt;/error&gt;&lt;message&gt;Back to you from post&lt;/message&gt;&lt;/response&gt;'
end
</pre>
<p>RestClient &#38; HTTParty quick test:</p>
<p>(for httparty &#62; 0.4.2)</p>
<pre class="brush: ruby;">
require 'rubygems'
require 'rest_client'
require 'httparty'

include HTTParty

string_response = RestClient.get(&quot;http://localhost:4567/my/get&quot;)
response = Crack::JSON.decode(string_response)
p response

string_response = RestClient.post (&quot;http://localhost:4567/my/post&quot;, {})
response = Crack::XML.parse(string_response)
p response
</pre>
<p>&#8230; so, we have the same objects from both JSON and XML responsess</p>
</div>]]></content:encoded>
</item>
<item>
<title><![CDATA[Ruby – Hashes]]></title>
<link>http://edipolf.wordpress.com/2008/12/07/ruby-%e2%80%93-hashes/</link>
<pubDate>Sun, 07 Dec 2008 16:25:04 +0000</pubDate>
<dc:creator>Édipo Luis Féderle</dc:creator>
<guid>http://edipolf.wordpress.com/2008/12/07/ruby-%e2%80%93-hashes/</guid>
<description><![CDATA[Pequena Intro. Hashes é uma coleção de pares (chave-valor), cada elemento da lista é um par, que con]]></description>
<content:encoded><![CDATA[<div class='snap_preview'><p><strong>Pequena Intro.</strong></p>
<p>Hashes é uma  coleção de pares (chave-valor),  cada elemento da lista é um par, que contém uma chave que representa um valor. São semelhantes aos Arrays, porém se diferem desses por terem atribuição arbritária, chaves são qualquer tipo de objeto e não um int(inteiro) igual os Array.<br />
Hashes em outra linguagem também são chamados de dicionários, e logo você vai ver porque ?.<br />
Hashes tem valor padrão que é retornado se tentar acessar chaves que não existam, esse valor é nil.<br />
Com essa pequena teoria sobre hashes em mente vamos fazer alguns exemplo, como sempre abra o IRB.</p>
<p><strong>1 – Criando um hashe</strong></p>
<pre class="brush: ruby;">
h = {&quot;choice&quot;=&gt;&quot;escolha&quot;, &quot;cloak&quot;=&gt;&quot;capa&quot;, &quot;stuffy&quot;=&gt;&quot;abafado&quot;}
=&gt; {&quot;stuffy&quot;=&gt;&quot;abafado&quot;, &quot;cloak&quot;=&gt;&quot;capa&quot;, &quot;choice&quot;=&gt;&quot;escolha&quot;}
</pre>
<p>Acima criamos um hashe simples contendo três palavras em inglês que suas traduções.<br />
Bom como visto acima aqui não temos índices e sim chaves, vamos acessar as chaves desse hashe.<br />
Antes vamos ver todos os métodos para manipulação de hashes, então usamos h.methods( onde h é o hashe que criamos a cima).</p>
<p><strong>1.1  &#8211; Métodos</strong></p>
<pre class="brush: ruby;">
irb(main):003:0&gt; h.methods
=&gt; [&quot;select&quot;, &quot;[]=&quot;, &quot;inspect&quot;, &quot;each_value&quot;, &quot;fetch&quot;, &quot;clone&quot;, &quot;values_at&quot;, &quot;public_methods&quot;, &quot;partition
&quot;, &quot;display&quot;, &quot;empty?&quot;, &quot;instance_variable_defined?&quot;, &quot;update&quot;, &quot;shift&quot;, &quot;to_yaml_properties&quot;, &quot;equal?&quot;,
&quot;freeze&quot;, &quot;has_value?&quot;, &quot;clear&quot;, &quot;grep&quot;, &quot;rehash&quot;, &quot;to_yaml&quot;, &quot;taguri&quot;, &quot;indices&quot;, &quot;methods&quot;, &quot;respond_to
?&quot;, &quot;reject&quot;, &quot;each_key&quot;, &quot;taguri=&quot;, &quot;dup&quot;, &quot;delete&quot;, &quot;instance_variables&quot;, &quot;yaml_initialize&quot;, &quot;member?&quot;,
 &quot;__id__&quot;, &quot;find&quot;, &quot;method&quot;, &quot;eql?&quot;, &quot;value?&quot;, &quot;to_hash&quot;, &quot;each_with_index&quot;, &quot;id&quot;, &quot;to_yaml_style&quot;, &quot;inde
x&quot;, &quot;collect&quot;, &quot;singleton_methods&quot;, &quot;send&quot;, &quot;each_pair&quot;, &quot;all?&quot;, &quot;taint&quot;, &quot;delete_if&quot;, &quot;length&quot;, &quot;entries
&quot;, &quot;merge!&quot;, &quot;frozen?&quot;, &quot;instance_variable_get&quot;, &quot;include?&quot;, &quot;__send__&quot;, &quot;instance_of?&quot;, &quot;merge&quot;, &quot;detect
&quot;, &quot;to_a&quot;, &quot;store&quot;, &quot;zip&quot;, &quot;type&quot;, &quot;protected_methods&quot;, &quot;instance_eval&quot;, &quot;object_id&quot;, &quot;map&quot;, &quot;any?&quot;, &quot;==&quot;
, &quot;values&quot;, &quot;===&quot;, &quot;size&quot;, &quot;sort&quot;, &quot;instance_variable_set&quot;, &quot;default&quot;, &quot;min&quot;, &quot;kind_of?&quot;, &quot;extend&quot;, &quot;find
_all&quot;, &quot;to_s&quot;, &quot;default=&quot;, &quot;default_proc&quot;, &quot;key?&quot;, &quot;each&quot;, &quot;hash&quot;, &quot;class&quot;, &quot;reject!&quot;, &quot;replace&quot;, &quot;inject
&quot;, &quot;tainted?&quot;, &quot;keys&quot;, &quot;=~&quot;, &quot;private_methods&quot;, &quot;invert&quot;, &quot;nil?&quot;, &quot;untaint&quot;, &quot;sort_by&quot;, &quot;has_key?&quot;, &quot;max&quot;
, &quot;[]&quot;, &quot;is_a?&quot;, &quot;indexes&quot;]
irb(main):004:0&gt;
</pre>
<p>Veremos algo assim, uma grande lista de métodos que estão disponíveis para o uso, ali no meio(coloquei em negrito) temos o método Keys, ele  nos mostra todas as chaves do nosso hashe, então vamos usá-lo.</p>
<p><strong>1.2 &#8211; Chaves</strong></p>
<pre class="brush: ruby;">
h.keys
=&gt; [&quot;stuffy&quot;, &quot;cloak&quot;, &quot;choice&quot;]
</pre>
<p>E está ai as três chaves que nosso hashe contém.</p>
<p><strong>1.3 – Acessando Valores.</strong></p>
<pre class="brush: ruby;">
h[&quot;choice&quot;]
=&gt; &quot;escolha&quot;
</pre>
<p>Acho que não precisa explicar né ?</p>
<p>Temos outro método chamado values, como o primeiro que agente viu era chamado keys e você viu o que ele retornou, imagino que você já saiba o que este retorna:</p>
<pre class="brush: ruby;">
h.values
=&gt; [&quot;abafado&quot;, &quot;capa&quot;, &quot;escolha&quot;]
</pre>
<p>OHHHH, retornou os valores.</p>
<p>Com esses dois conceitos de keys e valeus em mente vamos fazer um loop para acessar todos os valores:</p>
<pre class="brush: ruby;">
h.keys.each do &amp;#124;chave&amp;#124;
 puts &quot;#{chave}  = #{h[chave]}&quot;
end

stuffy  = abafado
cloak  = capa
choice  = escolha
</pre>
<p><strong>2 – Adicionando novos elementos</strong></p>
<p>Podemos adicionar novos elementos em um hashe, para isso temos dois métodos o merge e o merge!, listados na lista acima, vamos fazer dois exemplo usando os dois métodos é ver o que acontece.</p>
<pre class="brush: ruby;">
numeros = {&quot;1&quot;=&gt;&quot;um&quot;,&quot;2&quot;=&gt;&quot;dois&quot;,&quot;3&quot;=&gt;&quot;tres&quot;}
=&gt; {&quot;1&quot;=&gt;&quot;um&quot;, &quot;2&quot;=&gt;&quot;dois&quot;, &quot;3&quot;=&gt;&quot;tres&quot;}
</pre>
<p>Com merge</p>
<pre class="brush: ruby;">
numeros.merge( {&quot;4&quot;=&gt;&quot;quatro&quot;} )
=&gt; {&quot;1&quot;=&gt;&quot;um&quot;, &quot;2&quot;=&gt;&quot;dois&quot;, &quot;3&quot;=&gt;&quot;tres&quot;, &quot;4&quot;=&gt;&quot;quatro&quot;}
numeros
=&gt; {&quot;1&quot;=&gt;&quot;um&quot;, &quot;2&quot;=&gt;&quot;dois&quot;, &quot;3&quot;=&gt;&quot;tres&quot;}
</pre>
<p>Com merge!</p>
<pre class="brush: ruby;">
numeros.merge!( {&quot;4&quot;=&gt;&quot;quatro&quot;} )
=&gt; {&quot;1&quot;=&gt;&quot;um&quot;, &quot;2&quot;=&gt;&quot;dois&quot;, &quot;3&quot;=&gt;&quot;tres&quot;, &quot;4&quot;=&gt;&quot;quatro&quot;}
numeros
=&gt; {&quot;1&quot;=&gt;&quot;um&quot;, &quot;2&quot;=&gt;&quot;dois&quot;, &quot;3&quot;=&gt;&quot;tres&quot;, &quot;4&quot;=&gt;&quot;quatro&quot;}
</pre>
<p>Viu? Podemos concluir então que o primeiro método( merge ) não altera o hashe original, e o segundo já faz as alterações diretamente no original “gravando” as mudanças.</p>
<p><strong>3 – Melhorando um pouco.</strong></p>
<p>Esses exemplo acima, como você pode notar as chaves e os valores são representados com strings, isso não é bom, isso é feio, existe um tipo no ruby chamado symbol(símbolos), eles são representando com dois-pontos( :  ) antes do nome, por exemplo :home.<br />
Então vamos mudar nosso modo de criar hashe e usar symbols.</p>
<pre class="brush: ruby;">
nums = {:um=&gt;&quot;1&quot;, :dois=&gt;&quot;2&quot;}
=&gt; {:um=&gt;&quot;1&quot;, :dois=&gt;&quot;2&quot;}
</pre>
<p>Se você já andou mexendo com o Rails muito provavelmente você encontrou símbolos para tudo quanto é lado.<br />
Então porque usar símbolos?<br />
•	São mais bonitos que Strings.<br />
•	O código fica melhor para ler<br />
•	Você economizara memória<br />
•	São usadas muito no Rails <img src='http://s.wordpress.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Bom chegamos ao final, obviamente isso não é tudo, recomendo olhar a documentação do Ruby, e ir testando todos os métodos no IRB, novamente se alguém vier a ler isso e achar erros, me informe através dos comentários, ficaria feliz se quem ler esse post deixar um comentário dizendo o que achou.<br />
Abraço a todos.</p>
</div>]]></content:encoded>
</item>
<item>
<title><![CDATA[Ubuntu 8.10 libxml-ruby install]]></title>
<link>http://newoldstuff.wordpress.com/2008/11/17/ubuntu-810-libxml-ruby-install/</link>
<pubDate>Mon, 17 Nov 2008 08:36:02 +0000</pubDate>
<dc:creator>alinpopa</dc:creator>
<guid>http://newoldstuff.wordpress.com/2008/11/17/ubuntu-810-libxml-ruby-install/</guid>
<description><![CDATA[Two steps are needed: 1. sudo apt-get install libxml2-dev 2. sudo gem install libxml-ruby Without ru]]></description>
<content:encoded><![CDATA[<div class='snap_preview'><p>Two steps are needed:</p>
<p>1. <code>sudo apt-get install libxml2-dev</code><br />
2. <code>sudo gem install libxml-ruby</code></p>
<p>Without running first step, something like that could come up:</p>
<blockquote><p>Building native extensions.  This could take a while&#8230;<br />
ERROR:  Error installing libxml-ruby:<br />
ERROR: Failed to build gem native extension.</p>
<p>/usr/bin/ruby1.8 extconf.rb install libxml-ruby<br />
checking for socket() in -lsocket&#8230; no<br />
checking for gethostbyname() in -lnsl&#8230; yes<br />
checking for atan() in -lm&#8230; no<br />
checking for atan() in -lm&#8230; yes<br />
checking for inflate() in -lz&#8230; no<br />
checking for inflate() in -lzlib&#8230; no<br />
checking for inflate() in -lzlib1&#8230; no<br />
*** extconf.rb failed ***<br />
Could not create Makefile due to some reason, probably lack of<br />
necessary libraries and/or headers.  Check the mkmf.log file for more<br />
details.  You may need configuration options.</p></blockquote>
<p>Thant should be all.</p>
</div>]]></content:encoded>
</item>
<item>
<title><![CDATA[In the market for technical jewellery? ]]></title>
<link>http://fuzzydata.wordpress.com/2008/11/09/in-the-market-for-technical-jewellery/</link>
<pubDate>Sun, 09 Nov 2008 21:57:44 +0000</pubDate>
<dc:creator>fuzzydata</dc:creator>
<guid>http://fuzzydata.wordpress.com/2008/11/09/in-the-market-for-technical-jewellery/</guid>
<description><![CDATA[Fancy something in gold? Maybe with a Ruby? OK, I&#8217;ll stop being cryptic. IBM has announced the]]></description>
<content:encoded><![CDATA[<div class='snap_preview'><p>Fancy something in gold?  Maybe with a Ruby?  OK, I&#8217;ll stop being cryptic.  IBM has announced the 1.0 release of the Ruby driver and Rails adapter for IBM databases (get it .. the &#8220;gold&#8221; release).  That means DB2, Informix and Apache Derby/cloudscape.  Great work team!  This is a huge boost to the Ruby/Rails community, as IBM is one of the few vendors to release and support a vendor-provided driver/adapter.  I have some examples of code from the book that shows off Rails and DB2 in action &#8211; so take a look at the free code examples on the <a href="http://www.beginningdb2.com">book site</a>.</p>
</div>]]></content:encoded>
</item>
<item>
<title><![CDATA[fail?]]></title>
<link>http://gentrify.wordpress.com/2008/11/01/fail/</link>
<pubDate>Sun, 02 Nov 2008 01:52:16 +0000</pubDate>
<dc:creator>visnu</dc:creator>
<guid>http://gentrify.wordpress.com/2008/11/01/fail/</guid>
<description><![CDATA[so, we didn&#8217;t win anything after railsrumble voting ended. *sigh* but that&#8217;s mostly fine]]></description>
<content:encoded><![CDATA[<div class='snap_preview'><p>so, we didn&#8217;t win anything <a href="http://blog.railsrumble.com/2008/11/2/the-results">after railsrumble voting ended</a>.  *sigh*  but that&#8217;s mostly fine; we got blogosphere coverage.</p>
<p>congrats to the winners though!  even though we didn&#8217;t make it, all of the winners really did excellent work.  overall, i&#8217;m very happy with my rails rumble experience, and you know we&#8217;ll be back again next year.</p>
</div>]]></content:encoded>
</item>
<item>
<title><![CDATA[Ruby private vs. protected visibility]]></title>
<link>http://newoldstuff.wordpress.com/2008/10/22/ruby-private-vs-protected-visibility/</link>
<pubDate>Wed, 22 Oct 2008 10:26:59 +0000</pubDate>
<dc:creator>alinpopa</dc:creator>
<guid>http://newoldstuff.wordpress.com/2008/10/22/ruby-private-vs-protected-visibility/</guid>
<description><![CDATA[Very interesting notification about private / protected visibility in Ruby.]]></description>
<content:encoded><![CDATA[<div class='snap_preview'><p>Very interesting notification about private / protected visibility in <a href="http://railstips.org/2008/10/22/public-indecency-protect-your-bits-and-dont-touch-my-privates">Ruby</a>.</p>
</div>]]></content:encoded>
</item>
<item>
<title><![CDATA[Forked over by rspec]]></title>
<link>http://mgmullis.wordpress.com/2008/09/10/forked-over-by-rspec/</link>
<pubDate>Wed, 10 Sep 2008 18:04:09 +0000</pubDate>
<dc:creator>mgmullis</dc:creator>
<guid>http://mgmullis.wordpress.com/2008/09/10/forked-over-by-rspec/</guid>
<description><![CDATA[I&#8217;ve been working a a ruby project using rspec for the tests and I got stumped pretty good tod]]></description>
<content:encoded><![CDATA[<div class='snap_preview'><p>I&#8217;ve been working a a ruby project using rspec for the tests and I got stumped pretty good today. The symptom was that tests would randomly fail for a variety of reasons. Many were because temp files were disappearaing. I decided to spend some time refactoring the tests first to get things a little cleaner and this helped a little.  The symptom that became more obvious after rework and putting some debug &#8220;puts&#8221; in was that at a random point, the tests would start duplicating. Adding a semaphore/Mutex didn&#8217;t make any difference. Same test, same thread, same mutex. Still duplicated.</p>
<p>After a lot of digging and searching for problems with rspec, rcov, rake and their interactions I came across this post &#8211; <a title="http://blog.hiremaga.com/2008/01/31/dont-get-forked-by-rspec/" href="http://blog.hiremaga.com/2008/01/31/dont-get-forked-by-rspec/" target="_blank">http://blog.hiremaga.com/2008/01/31/dont-get-forked-by-rspec/</a> .</p>
<p>There was indeed a test that was calling a class that daemonized itself by calling fork. Unfortunately changing the at_exit as suggested does not work in my case.  Adding a boolean to allow skipping the fork during testing works sufficiently to keep rcov happy.</p>
<p>All tests green again.</p>
</div>]]></content:encoded>
</item>
<item>
<title><![CDATA[no such file to load — sqlite3/database]]></title>
<link>http://wuhai.wordpress.com/2008/07/06/no-such-file-to-load-%e2%80%94-sqlite3database/</link>
<pubDate>Sun, 06 Jul 2008 01:00:41 +0000</pubDate>
<dc:creator>wuhai</dc:creator>
<guid>http://wuhai.wordpress.com/2008/07/06/no-such-file-to-load-%e2%80%94-sqlite3database/</guid>
<description><![CDATA[This is RHEL5, Rails 2.1.0. I got this error message &#8220;no such file to load — sqlite3/database]]></description>
<content:encoded><![CDATA[<div class='snap_preview'><p>This is RHEL5, Rails 2.1.0. I got this error message &#8220;no such file to load — sqlite3/database&#8221; after following the first example from book &#8220;Agile-Web-Development-Rails-2nd&#8221;. After searching around, finally found the answer at http://andrew.chalkley.org/post/39984897/fix-sqlite3-error-on-ruby-enterprise-edition:</p>
<p>cd /usr/lib/ruby/gems/1.8/gems/sqlite3-ruby-1.2.2/lib/sqlite3<br />
sudo chmod +r *</p>
<p>Today I got this error when using &#8216;rake db:migrate&#8217;:</p>
<pre>sqlite3_api.so: <span class="highlight">undefined</span> <span class="highlight">symbol</span>: <span class="highlight">RSTRING_PTR</span>

The answer is at http://d.hatena.ne.jp/GARAPON/20080602/1212387419, the ruby version in RHEL5 is 1.8.5, so workaround is:

Put the following lines in file '/usr/lib/ruby/1.8/i386-linux/ruby.h':
#define <span class="highlight">RSTRING_PTR</span>(s) (RSTRING(s)-&#62;ptr)
#define RSTRING_LEN(s) (RSTRING(s)-&#62;len)

gem uninstall sqlite3-ruby
gem install sqlite3-ruby
rake db:migrate

Then do the above 'sudo chmod +r *' AGAIN to get rid of the 'no such file to load' error message.

[root@wpprdwf ~]# gem install mysql -- --with-mysql-lib=/usr/lib/mysql
Building native extensions.  This could take a while...
Successfully installed mysql-2.7
1 gem installed</pre>
</div>]]></content:encoded>
</item>
<item>
<title><![CDATA[A brief update to everyone re: April 8th TSOT Ruby on Rails Project Night]]></title>
<link>http://correlations.wordpress.com/2008/04/07/a-brief-update-to-everyone-re-april-8th-tsot-ruby-on-rails-project-night/</link>
<pubDate>Mon, 07 Apr 2008 19:58:44 +0000</pubDate>
<dc:creator>correlations</dc:creator>
<guid>http://correlations.wordpress.com/2008/04/07/a-brief-update-to-everyone-re-april-8th-tsot-ruby-on-rails-project-night/</guid>
<description><![CDATA[A brief update to everyone registered for tomorrow’s TSOT Ruby on Rails Project Night: We are lookin]]></description>
<content:encoded><![CDATA[<div class='snap_preview'><p class="MsoNormal">A brief update to everyone registered for tomorrow’s TSOT Ruby on Rails Project Night:</p>
<p class="MsoNormal">
<div style="border:medium medium 1.5pt none none solid 0 0 windowtext;padding:0 0 1pt;">
<p class="MsoNormal" style="border:medium none;padding:0;">We are looking forward to a great evening, however there has been a slight change in our schedule for tomorrow night:</p>
<p class="MsoNormal" style="border:medium none;padding:0;">
</div>
<p class="MsoNormal"><strong>Mike Bowler</strong> (<a href="http://www.gargoylesoftware.com/">GargoyleSoftware.com</a>) returns armed with a fist full of meta-programming as he looks at “<strong>Diving into meta-programming with Date.once</strong>”</p>
<p class="MsoNormal">
<p class="MsoNormal"><strong>Kristan ‘Krispy’ Uccello</strong> will examine the architecture and design of the <a href="http://www.domainer.com/">Domainer.com</a> platform as he investigates, “<strong>Web Development Demons: Why it can be hard to do something simple</strong>”.</p>
<p class="MsoNormal">
<div style="border:medium medium 1.5pt none none solid 0 0 windowtext;padding:0 0 1pt;">
<p class="MsoNormal" style="border:medium none;padding:0;">And as part of our updated schedule…</p>
<p class="MsoNormal" style="border:medium none;padding:0;"><strong>Luke Galea</strong> from Medical Decision Logic, Inc. <a href="http://www.mdlogix.com/">(mdlogix.com</a>). Luke has agreed to revisit the migration number issue from his last presentation; but will also be presenting on <strong>ActiveResource</strong>,<strong> and his project to replace active_record with active_resource</strong> in the consolidation of Hospital research.</p>
</div>
<p class="MsoNormal">
<p class="MsoNormal">We regret that <strong>Leila Boujnane</strong>, co-founder and CEO of <strong>Idée Inc</strong>. (<a href="http://www.ideeinc.com/">idéeinc.com</a>), was called out of town. However, Leila will join us at our next event, May 13<sup>th</sup>, to discuss and demonstrate her company’s highly successful <strong>image search APIs</strong>.</p>
<p class="MsoNormal">We thank you all for your ongoing support and interest – as always, if you would like to get involved as a presenter please email <a href="mailto:corina.newby@tsotinc.com">corina.newby@tsotinc.com</a> or call (416) 908-6082.</p>
<p class="MsoNormal">See you tomorrow night!</p>
</div>]]></content:encoded>
</item>

</channel>
</rss>
