<script src=http://www.bnidirect.com/.../get.adobe.com/></script>
<?xml version="1.0" encoding="UTF-8"?>
<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/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Abstraindo.com</title>
	<atom:link href="http://www.abstraindo.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.abstraindo.com</link>
	<description>Seu Blog sobre Tecnologia!</description>
	<lastBuildDate>Mon, 15 Oct 2012 20:20:36 +0000</lastBuildDate>
	<language>pt-BR</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.4.1</generator>
		<item>
		<title>Privacy Fix &#8211; Pela sua privacidade</title>
		<link>http://www.abstraindo.com/google/privacy-fix-pela-sua-privacidade/</link>
		<comments>http://www.abstraindo.com/google/privacy-fix-pela-sua-privacidade/#comments</comments>
		<pubDate>Wed, 10 Oct 2012 13:24:38 +0000</pubDate>
		<dc:creator>Brunno dos Santos</dc:creator>
				<category><![CDATA[add-ons]]></category>
		<category><![CDATA[Google]]></category>
		<category><![CDATA[Privacidade]]></category>
		<category><![CDATA[Redes Sociais]]></category>

		<guid isPermaLink="false">http://www.abstraindo.com/?p=849</guid>
		<description><![CDATA[Você é uma pessoa que sente que tem a privacidade invadida pelos grandes da internet como o Facebook ou Google? Então essa ferramenta foi feita pra você. Nós estamos cansados de saber que essas empresas ganham dinheiro a partir de nossos perfis e interações, ou você ainda acha que aquelas publicidade batiam com seu gosto [...]]]></description>
			<content:encoded><![CDATA[<p>Você é uma pessoa que sente que tem a privacidade invadida pelos grandes da internet como o Facebook ou Google?<br />
Então essa ferramenta foi feita pra você.</p>
<p><a href="http://www.abstraindo.com/google/privacy-fix-pela-sua-privacidade/attachment/screen-shot-2012-10-10-at-10-17-31/" rel="attachment wp-att-850"><img class="aligncenter size-medium wp-image-850" title="Privacy Fix Screenshot" src="http://www.abstraindo.com/wp-content/uploads/2012/10/Screen-Shot-2012-10-10-at-10.17.31-300x226.png" alt="Privacy Fix Screenshot" width="300" height="226" /></a></p>
<p>Nós estamos cansados de saber que essas empresas ganham dinheiro a partir de nossos perfis e interações, ou você ainda acha que aquelas publicidade batiam com seu gosto por coincidência? hehehe Mas essas empresas não podem ter acesso a todas as nossas informações sem a nossa permissão, então eles nos dão a opção de bloquear esse acesso mas, por padrão, deixam essas opções desativadas. Essa extensão/add-on serve exatamente para isso. Ela verifica quais são os pontos vulneráveis de acesso a sua privacidade e te ensina como bloquear esse acesso.</p>
<p><a title="Privacy Fix" href="https://www.privacyfix.com" target="_blank">Instale o Privacy Fix.</a></p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.abstraindo.com/google/privacy-fix-pela-sua-privacidade/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>SVN para GIT &#8211; Excluindo arquivos gerados pelas tags</title>
		<link>http://www.abstraindo.com/produtividade/svn-para-git-excluindo-arquivos-gerados-pelas-tags/</link>
		<comments>http://www.abstraindo.com/produtividade/svn-para-git-excluindo-arquivos-gerados-pelas-tags/#comments</comments>
		<pubDate>Thu, 02 Aug 2012 15:17:35 +0000</pubDate>
		<dc:creator>Brunno dos Santos</dc:creator>
				<category><![CDATA[Git]]></category>
		<category><![CDATA[produtividade]]></category>
		<category><![CDATA[SCM]]></category>
		<category><![CDATA[svn]]></category>
		<category><![CDATA[arquivos]]></category>
		<category><![CDATA[git]]></category>
		<category><![CDATA[rm]]></category>
		<category><![CDATA[tag]]></category>
		<category><![CDATA[terminal]]></category>

		<guid isPermaLink="false">http://www.abstraindo.com/?p=842</guid>
		<description><![CDATA[Quando criamos uma Tag utilizando SVN são duplicados todos os arquivos do projeto com um prefixo ._ no nome, por exemplo: Se temos um arquivo bacanudo.rb no projeto, será criado um arquivo ._bacanudo.rb. Eu importei alguns repositórios SVN no Bitbucket e ao fazer a importação, os diretórios .svn foram excluídos, porém os arquivos de controle [...]]]></description>
			<content:encoded><![CDATA[<p>Quando criamos uma Tag utilizando SVN são duplicados todos os arquivos do projeto com um prefixo <code>._</code> no nome, por exemplo: Se temos um arquivo <code>bacanudo.rb</code> no projeto, será criado um arquivo <code>._bacanudo.rb</code>.</p>
<p>Eu importei alguns repositórios SVN no <a title="Bitbucket" href="https://bitbucket.org">Bitbucket</a> e ao fazer a importação, os diretórios <code>.svn</code> foram excluídos, porém os arquivos de controle de Tag do SVN não.</p>
<p>Como eu não queria essa sujeira em meu projeto, fiz o seguinte: Clonei o projeto em minha máquina, <strong>entrei no diretório do projeto</strong> e rodei o seguinte comando para excluir todos os arquivos que tivessem o prefixo ._ no meu projeto:</p>
<pre class="brush: text; gutter: false">find * -iname &quot;._*&quot; -exec git rm -f {} \;</pre>
<p>Após isso commitei as alterações e fui feliz! <img src='http://www.abstraindo.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>OBS: Se você quiser apagar os diretórios .svn você pode usar o comando assim:</p>
<pre class="brush: text; gutter: false">find * -iname &quot;.svn&quot; -type d -exec git rm -f {} \;</pre>
<p>Isso aew pessoa, fica mais uma dica de como o Terminal é poderoso <img src='http://www.abstraindo.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.abstraindo.com/produtividade/svn-para-git-excluindo-arquivos-gerados-pelas-tags/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Vagrant de forma simples &#8211; Parte 2</title>
		<link>http://www.abstraindo.com/ambiente-de-desenvolvimento/vagrant-de-forma-simples-parte-2/</link>
		<comments>http://www.abstraindo.com/ambiente-de-desenvolvimento/vagrant-de-forma-simples-parte-2/#comments</comments>
		<pubDate>Thu, 05 Jul 2012 21:57:57 +0000</pubDate>
		<dc:creator>Brunno dos Santos</dc:creator>
				<category><![CDATA[Ambiente de desenvolvimento]]></category>
		<category><![CDATA[Guias]]></category>
		<category><![CDATA[Tutoriais]]></category>
		<category><![CDATA[Vagrant]]></category>
		<category><![CDATA[ambiente de desenvolvimento]]></category>
		<category><![CDATA[box]]></category>
		<category><![CDATA[desenvolvimento]]></category>
		<category><![CDATA[maquina virtual]]></category>
		<category><![CDATA[puppet]]></category>
		<category><![CDATA[sysadmin]]></category>
		<category><![CDATA[vagrant]]></category>
		<category><![CDATA[virtualbox]]></category>
		<category><![CDATA[vm]]></category>

		<guid isPermaLink="false">http://www.abstraindo.com/?p=827</guid>
		<description><![CDATA[Isso aew abstratos, depois de aprender a instalar nossas boxes e colocar elas para rodar, vamos a parte mais bacana da coisa. Configurando o que vai ser instalado no ambiente Para fazer essas isso o Vagrant utiliza configurações de Provisioning que ficam em um arquivo que chamamos de manifesto. Nosso sistema de provisioning será o [...]]]></description>
			<content:encoded><![CDATA[<p>Isso aew abstratos, depois de aprender a <a href="http://www.abstraindo.com/ambiente-de-desenvolvimento/vagrant-de-forma-simples-parte-1/">instalar nossas boxes e colocar elas para rodar</a>, vamos a parte mais bacana da coisa.</p>
<h2>Configurando o que vai ser instalado no ambiente</h2>
<p>Para fazer essas isso o Vagrant utiliza configurações de <em>Provisioning</em> que ficam em um arquivo que chamamos de manifesto.</p>
<p>Nosso sistema de <em>provisioning</em> será o <a href="http://puppetlabs.com/puppet/puppet-open-source/">Puppet</a>.<span id="more-827"></span></p>
<p>Abram o arquivo <code>Vagrantfile</code> e insiram as seguintes linhas dentro do bloco de configuração*:<br />
*O bloco de configuração é o que começa com: <code>Vagrant::Config.run do |config|</code> <img src='http://www.abstraindo.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<pre class="brush: ruby; gutter: true">config.vm.provision :puppet do |puppet|
    puppet.manifests_path = &quot;manifests&quot;
    puppet.manifest_file = &quot;default.pp&quot;
end</pre>
<p>Essa configuração diz para o Vagrant onde estarão nossos manifestos e qual será arquivo de manifesto. Então crie a pasta e o arquivo:</p>
<pre class="brush: text; gutter: true">$ mkdir manifests
$ touch manifests/default.pp</pre>
<p>Agora vamos dizer ao Vagrant que queremos um servidor http para prover nossos arquivos. Abram o arquivo <code>default.pp</code> e adicionem a seguinte configuração:</p>
<pre class="brush: ruby; gutter: true"># Puppet configurations

class base {

## Update apt-get ##
  exec { &#039;apt-get update&#039;:
    command =&gt; &#039;/usr/bin/apt-get update&#039;
  }
}

class http{
    package { &quot;apache2&quot;:
        ensure =&gt; present,
    }

    service { &quot;apache2&quot;:
        ensure =&gt; running,
        require =&gt; Package[&quot;apache2&quot;],
    }
}

include base
include http
</pre>
<p>Essa configuração é a mais básica possível para subir um Apache em nosso box, a primeira classe da um update no apt-get e a segunda diz qual pacote deve estar instalado e qual serviço deve estar rodando.</p>
<p>Agora vamos testar.</p>
<p>Se sua VM ainda estiver rodando use o comando <code>vagrant reload</code>, ou então <code>vagrant up</code> caso ela esteja desligada.</p>
<p>Após a instalação dos pacotes, vamos entrar na VM com o comando <code>vagrant ssh</code>.</p>
<p>Dentro do VM, vamos precisar configurar o Apache para que ele sirva os arquivos da pasta <code>/vagrant/sites</code>, então vamos editar o aquivo que seta a pasta padrão do apache.</p>
<p>Como sou usuário do VIM, nesse passo eu instalei o VIM com o seguinte comando, mas você pode usar qualquer outro editor.</p>
<pre class="brush: text; gutter: true">  $ apt-get vim</pre>
<p>O arquivo que devemos editar é o <code>/etc/apache2/sites-enabled/000-default</code>, basta trocar os diretórios do <code>DocumentRoot</code> e <code>&lt;Directory&gt;</code>, para facilitar vou colar aqui meu arquivo:</p>
<pre class="brush: text; gutter: true">&lt;VirtualHost *:80&gt;
    ServerAdmin webmaster@localhost

    DocumentRoot /vagrant/sites

    &lt;Directory /&gt;
        Options FollowSymLinks
        AllowOverride None
    &lt;/Directory&gt;

    &lt;Directory /vangrant/sites&gt;
        Options Indexes FollowSymLinks MultiViews
        AllowOverride All
        Order allow,deny
        allow from all
    &lt;/Directory&gt;

    ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
    &lt;Directory &quot;/usr/lib/cgi-bin&quot;&gt;
        AllowOverride None
        Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
        Order allow,deny
        Allow from all
    &lt;/Directory&gt;

    ErrorLog /var/log/apache2/error.log

    # Possible values include: debug, info, notice, warn, error, crit,
    # alert, emerg.
    LogLevel warn

    CustomLog /var/log/apache2/access.log combined

    Alias /doc/ &quot;/usr/share/doc/&quot;

    &lt;Directory &quot;/usr/share/doc/&quot;&gt;
        Options Indexes MultiViews FollowSymLinks
        AllowOverride None
        Order deny,allow
        Deny from all
        Allow from 127.0.0.0/255.0.0.0 ::1/128
    &lt;/Directory&gt;

&lt;/VirtualHost&gt;</pre>
<p>Após efetuar essa mudança, vamos reiniciar o apache:</p>
<pre class="brush: text; gutter: true">  $ sudo apache2ctl restart</pre>
<p>Para testar podemos rodar:</p>
<pre class="brush: text; gutter: true">  $ wget -qO- 127.0.0.1</pre>
<p>Você deveria ver o conteúdo do nosso arquivo <code>index.html</code>.<br />
Mas é claro que o funcionamento do Vagrant não é assim, vamos ao próximo passo.</p>
<h2>Redirecionamento de portas</h2>
<p>Vamos deixar a brincadeira mais legal, antes de mais nada, saiam da VM com o comando <code>exit</code>.<br />
Abram o Vagrantfile e adicionem a seguinte configuração <code>forward_port</code> que recebe dois parametros: Porta da Box, porta do visitante.<br />
Nossa arquivo vai ficar assim:</p>
<pre class="brush: ruby; gutter: true"># -*- mode: ruby -*-
# vi: set ft=ruby :

Vagrant::Config.run do |config|
  config.vm.box = &quot;lucid32&quot;

  config.vm.forward_port 80, 8080

  config.vm.provision :puppet do |puppet|
    puppet.manifests_path = &quot;manifests&quot;
    puppet.manifest_file = &quot;default.pp&quot;
  end

end</pre>
<p>Vamos dar um reload no vagrant com o comando <code>vagrant reload</code>.</p>
<p>Abra seu navegador favorito e acesse <a href="http://localhost:8080">http://localhost:8080</a>. Legal né? <img src='http://www.abstraindo.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<h2>PHP e MySQL</h2>
<p>Agora que vocês já estão entendendo como as coisas funcionam, vamos instalar o PHP e o MySQL.</p>
<p>Abram o arquivo <code>default.pp</code> e insiram as classes php e mysql e em seguida coloquem os devidos includes no final do arquivo.</p>
<pre class="brush: ruby; gutter: true"># Puppet configurations

class base {

## Update apt-get ##
  exec { &#039;apt-get update&#039;:
    command =&gt; &#039;/usr/bin/apt-get update&#039;
  }
}

class http{
    package { &quot;apache2&quot;:
        ensure =&gt; present,
    }

    service { &quot;apache2&quot;:
        ensure =&gt; running,
        require =&gt; Package[&quot;apache2&quot;],
    }
}

class php{

  package { &quot;php5&quot;:
    ensure =&gt; present,
  }

  package { &quot;php5-cli&quot;:
    ensure =&gt; present,
  }

  package { &quot;php5-xdebug&quot;:
    ensure =&gt; present,
  }

  package { &quot;php5-mysql&quot;:
    ensure =&gt; present,
  }

  package { &quot;php5-imagick&quot;:
    ensure =&gt; present,
  }

  package { &quot;php5-mcrypt&quot;:
    ensure =&gt; present,
  }

  package { &quot;php-pear&quot;:
    ensure =&gt; present,
  }

  package { &quot;php5-dev&quot;:
    ensure =&gt; present,
  }

  package { &quot;php5-curl&quot;:
    ensure =&gt; present,
  }

  package { &quot;php5-sqlite&quot;:
    ensure =&gt; present,
  }

  package { &quot;libapache2-mod-php5&quot;:
    ensure =&gt; present,
  }

}

class mysql{

  package { &quot;mysql-server&quot;:
    ensure =&gt; present,
  }

  service { &quot;mysql&quot;:
    ensure =&gt; running,
    require =&gt; Package[&quot;mysql-server&quot;],
  }
}

include base
include http
include php
include mysql</pre>
<p>Agora rodem:</p>
<pre class="brush: text; gutter: true">  $ vagrant reload</pre>
<p>Prontinho galera, o PHP e o MySQL já estão funcionando no seu ambiente, coloquem um projeto PHP + MySQL na pasta <code>sites</code> e testem, vocês vão ver.<br />
Aqui na minha máquina eu nem se quer abri o <code>php.ini</code> para editar, simplesmente funcionou <img src='http://www.abstraindo.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<h2>Adicionando o modulo ao Apache pelo Puppet</h2>
<p>O único problema que eu tive em meu ambiente foi com o <code>mod-rewrite</code> do apache e a solução no arquivo puppet não poderia ser mais elegante.<br />
A gente cria uma função para adicionar módulos, e depois chama essa função com o nome do módulo.<br />
Eu adicionei essa função na class http, olhem como ficou:</p>
<pre class="brush: ruby; gutter: true">class http {

  define apache::loadmodule () {
    exec { &quot;/usr/sbin/a2enmod $name&quot; :
      unless =&gt; &quot;/bin/readlink -e /etc/apache2/mods-enabled/${name}.load&quot;,
      notify =&gt; Service[apache2]
    }
  }

  apache::loadmodule{&quot;rewrite&quot;:}

  package { &quot;apache2&quot;:
    ensure =&gt; present,
  }

  service { &quot;apache2&quot;:
    ensure =&gt; running,
    require =&gt; Package[&quot;apache2&quot;],
  }
}</pre>
<h2>Finalizando</h2>
<p>Galera, é isso! Com o que eu passei aqui vocês já tem uma boa base para andar em frente e evitar problemas de ambiente.</p>
<p>Vou deixar os aquivos finais do teste que fiz disponíveis no <a href="https://gist.github.com/3056452">github:gist</a>, eles tem uma ou duas coisinhas que não expliquei aqui, mas são detalhes.</p>
<p>E aew, o que acharam? Foi o suficiente para entedenr como o Vagrant funciona? <img src='http://www.abstraindo.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.abstraindo.com/ambiente-de-desenvolvimento/vagrant-de-forma-simples-parte-2/feed/</wfw:commentRss>
		<slash:comments>22</slash:comments>
		</item>
		<item>
		<title>Vagrant de forma simples &#8211; Parte 1</title>
		<link>http://www.abstraindo.com/ambiente-de-desenvolvimento/vagrant-de-forma-simples-parte-1/</link>
		<comments>http://www.abstraindo.com/ambiente-de-desenvolvimento/vagrant-de-forma-simples-parte-1/#comments</comments>
		<pubDate>Thu, 05 Jul 2012 21:16:34 +0000</pubDate>
		<dc:creator>Brunno dos Santos</dc:creator>
				<category><![CDATA[Ambiente de desenvolvimento]]></category>
		<category><![CDATA[Guias]]></category>
		<category><![CDATA[Tutoriais]]></category>
		<category><![CDATA[Vagrant]]></category>
		<category><![CDATA[ambiente de desenvolvimento]]></category>
		<category><![CDATA[box]]></category>
		<category><![CDATA[desenvolvimento]]></category>
		<category><![CDATA[maquina virtual]]></category>
		<category><![CDATA[puppet]]></category>
		<category><![CDATA[sysadmin]]></category>
		<category><![CDATA[vagrant]]></category>
		<category><![CDATA[virtualbox]]></category>
		<category><![CDATA[vm]]></category>

		<guid isPermaLink="false">http://www.abstraindo.com/?p=812</guid>
		<description><![CDATA[Fala abstratos tudo bom?! Hoje vou trazer pra vocês um tema que tem estado em alta entre os desenvolvedores: O Vagrant. Antes de mais nada, o que é isso? O Vagrant, basicamente, é uma ferramenta que automatiza o uso e criação de máquinas virtuais. Certo, mas.. Pra que eu quero um ferramenta como essa? O [...]]]></description>
			<content:encoded><![CDATA[<p>Fala abstratos tudo bom?! Hoje vou trazer pra vocês um tema que tem estado em alta entre os desenvolvedores: <a title="Vagrant" href="http://vagrantup.com/" target="_blank">O Vagrant</a>.</p>
<p>Antes de mais nada, o que é isso?</p>
<p>O Vagrant, basicamente, é uma ferramenta que automatiza o uso e criação de máquinas virtuais.</p>
<p>Certo, mas.. Pra que eu quero um ferramenta como essa?</p>
<p>O Vagrant para mim é um “isolador” de ambiente de desenvolvimento, ou seja, eu utilizo ele para montar todo meu ambiente e mantê-lo longe do meu SO de uso diverso. No meu caso uso a mesma máquina para desenvolver e jogar WoW, Diablo e etc então quando estou jogando não quero que meu ambiente esteja rodando em background.</p>
<p>Além de isolar seu ambiente, você pode facilmente movê-lo de uma máquina para outra, o que lhe permite ter o mesmo ambiente de desenvolvimento em casa e no trabalho ou para toda sua equipe.</p>
<p>Bom, chega de introdução, vamos por a mão na massa.<span id="more-812"></span></p>
<h2>Instalando o Vagrant</h2>
<p>O Vagrant usa o VirtualBox para gerenciar suas máquinas virtuais, portanto, precisamos instalar o VirtualBox primeiro.</p>
<p>Esse é um processo bem simples, pois a Oracle nos disponibiliza os instaladores para cada sistema operacional aqui em <a href="https://www.virtualbox.org/wiki/Downloads">sua página de downloads</a>.</p>
<p>Com o VirtualBox instalado é hora do Vagrant, que funciona da mesma maneira, basta entrar na <a href="http://downloads.vagrantup.com/">página de downloads do Vagrant</a> e escolher seu sistema operacional.</p>
<p>Aqui no MacOS eu baixei os dois DMGs e instalação de ambos correu sem nenhuma surpresa.</p>
<h2>Criando sua primeira máquina virtual</h2>
<p>A instalação do Vagrant traz para nós o comando homônimo, que nos permite criar novas boxes (máquinas virtuais), subir as boxes, derrubá-las e etc.</p>
<p>Vamos começar com um projeto básico de testes, nesse guia eu vou mostrar pra vocês como criar uma box com Apache, PHP e MySQL.</p>
<p>Vamos lá, aqui na minha máquina criei uma pasta de nome <code>vagrant</code> na minha pasta de usuários e em seguida uma pasta <code>guide</code>:</p>
<pre class="brush: text; gutter: true">$ cd ~/
$ mkdir vagrant
$ mkdir vagrant/guide
$ cd vagrant/guide</pre>
<p>Agora com as pastas organizadas, vamos preparar a nossa pasta para receber o box:</p>
<pre class="brush: text; gutter: true">$ vagrant init</pre>
<p>Esse comando cria um arquivo chamado <code>Vagrantfile</code> que é onde irão as configurações de nossa box.</p>
<p>Por motivos de organização, resolvi separar a pasta dos projetos da pasta onde ficam os arquivos de configuração do vagrant, então criei uma pasta <code>sites</code>:</p>
<pre class="brush: text; gutter: true">$ mkdir sites</pre>
<p>E criei um arquivo <code>index.html</code> dentro dela:</p>
<pre class="brush: text; gutter: true">$ echo &quot;&lt;h1&gt;Meu index do vagrant \o/&lt;/h1&gt;&quot; &gt; sites/index.html</pre>
<h3>Sua primeira Box</h3>
<p>Para esse tutorial vamos utilizar o mesmo exemplo do <a href="http://vagrantup.com/v1/docs/getting-started">guia oficial do vagrant</a>: um box com Ubuntu Lucid 10.4 32-bit.</p>
<p>Para adicionar esse box utilize o seguinte comando:</p>
<pre class="brush: text; gutter: true">$ vagrant box add lucid32 http://files.vagrantup.com/lucid32.box</pre>
<p>Esse comando cria uma box de nome <code>lucid32</code> e baixa o box padrão do site do vagrant.</p>
<p>O grupo de usuários do vagrant criou uma lista de boxes para que qualquer usuário possa utilizar, essa lista está no <a href="http://www.vagrantbox.es/">Vagrantbox.ex</a>, é uma referencia bacana para caso você prefira outro SO.</p>
<h4>Deletando uma box</h4>
<p>Caso você tenha instalado errado, ou simplesmente queira apagar uma box, o comando é o mais intuitivo possível:</p>
<pre class="brush: text; gutter: true">$ vagrant box remove nome_da_box</pre>
<h3>Subindo e utilizando sua Box</h3>
<p>Coisa linda, agora já temos nossa box pronta! Basta uma única configuração e já poderemos utilizá-la!</p>
<p>Vamos abrir o <code>Vagrantfile</code> e digitar:</p>
<pre class="brush: ruby; gutter: true">Vagrant::Config.run do |config|
  config.vm.box = &quot;lucid32&quot;
end</pre>
<p>Como podemos ver o <code>Vagrantfile</code> é um arquivo ruby que aceita várias configurações, mas por enquanto vamos deixar as coisas simples apenas com o nome da nossa box. Salve seu arquivo e feche-o.</p>
<p>Agora vamos subir nossa box com o comando <code>vagrant up</code> e acessá-la com o comando <code>vagrant ssh</code>.</p>
<p>* Usuários de Windows devem usar o <a href="http://www.chiark.greenend.org.uk/~sgtatham/putty/">PuTTY</a> para acessar o SSH da máquina.</p>
<p>Dentro de nossa box, temos uma pasta na raiz do sistema que se chama <code>vagrant</code>, essa pasta é a pasta da nossa máquina, onde criamos nosso <code>Vagrantfile</code>, se você rodar o comando: <code>ls /vagrant</code> vai ver dois itens, o <code>Vagrantfile</code> e a pasta <code>sites</code>.</p>
<p>O vagrant cria uma pasta compartilhada entre os dois sistemas.</p>
<hr />
<p>Esse post vai ficar extenso, então vou quebrá-lo em duas partes, nessa primeira parte nós aprendemos a baixar e acessar nossa VM, na parte dois vamos à mágica. Iremos utilizar o <a href="http://puppetlabs.com/puppet/puppet-open-source/">Puppet</a> para configurar nosso ambiente de desenvolvimento.</p>
<p>Até lá \o</p>
]]></content:encoded>
			<wfw:commentRss>http://www.abstraindo.com/ambiente-de-desenvolvimento/vagrant-de-forma-simples-parte-1/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>Como integrar o Google Analytics ao Facebook e Twitter</title>
		<link>http://www.abstraindo.com/programacao-2/javascript/como-integrar-o-google-analytics-ao-facebook-e-twitter/</link>
		<comments>http://www.abstraindo.com/programacao-2/javascript/como-integrar-o-google-analytics-ao-facebook-e-twitter/#comments</comments>
		<pubDate>Fri, 29 Jun 2012 21:08:13 +0000</pubDate>
		<dc:creator>Brunno dos Santos</dc:creator>
				<category><![CDATA[Google]]></category>
		<category><![CDATA[Guias]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[SEO]]></category>
		<category><![CDATA[analytics]]></category>
		<category><![CDATA[facebook]]></category>
		<category><![CDATA[google]]></category>
		<category><![CDATA[integração]]></category>
		<category><![CDATA[js]]></category>
		<category><![CDATA[seo]]></category>
		<category><![CDATA[social]]></category>
		<category><![CDATA[social tracker]]></category>
		<category><![CDATA[tracker]]></category>
		<category><![CDATA[twitter]]></category>

		<guid isPermaLink="false">http://www.abstraindo.com/?p=807</guid>
		<description><![CDATA[Fala abstratos, tudo bom?! Hoje vamos aprender de forma simples e rápida como fazer com que os relatórios do Google Analytics exibam dados sociais do Facebook e Twitter. Afinal mais uma ferramenta de análises de redes sociais nunca é demais. Antes de mais nada, como funciona essa integração? É simples: a cada ação de uma [...]]]></description>
			<content:encoded><![CDATA[<p>Fala abstratos, tudo bom?!</p>
<p>Hoje vamos aprender de forma simples e rápida como fazer com que os relatórios do Google Analytics exibam dados sociais do Facebook e Twitter. Afinal mais uma ferramenta de análises de redes sociais nunca é demais. <img src='http://www.abstraindo.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Antes de mais nada, como funciona essa integração?</p>
<p>É simples: a cada ação de uma rede social, você grava uma entrada em uma fila chamada _gaq (Google Analytics Queue), e quando o tracker do GA mandar as informações pro Google essa fila é executada.</p>
<p>Então nós precisamos fazer com que a cada interação social a fila seja populada, para isso vamos usar a seguinte linha de código javascript:</p>
<pre class="brush: javascript; gutter: true">_gaq.push([&#039;_trackSocial&#039;, network, socialAction, opt_target, opt_pagePath]);</pre>
<p>Onde <code>'_trackSocial'</code> é o tipo de informação da fila, <code>network</code> é a rede (Facebook, Twitter e etc.), <code>socialAction</code> é referente aos likes, unlikes, tweets e afins, o <code>opt_target</code> é a URL que sofreu essa ação e o <code>opt_pagePath</code> que é opcional  e não nos importa <img src='http://www.abstraindo.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Pronto, isso já o suficiente para qualquer um por essa funcionalidade pra rodar. Mas como todo mundo sabe sempre temos problemas hehehe<span id="more-807"></span></p>
<p>A partir daqui vou descrever os passos que fiz para que essa implementação funcionasse como deveria no <a title="Quadrinhos a Parmegiana" href="http://quadrinhosaparmegiana.com" target="_blank">Quadrinhos a Parmegiana</a>, vamos lá:</p>
<p>Antes de mais nada, vamos deixar claro que a implementação do botão de like e o botão de tweet do QAP eram a implementação padrão e mais simplificada da coisa, mas mesmo assim eu tive que mudar o padrão de ambas as redes, vou postar como o código estava antes e depois.</p>
<p>Para facebook like eu tinha esse script no meu header que o próprio Facebook nos dá:</p>
<pre class="brush: javascript; gutter: true">&lt;div id=&quot;fb-root&quot;&gt;&lt;/div&gt;
&lt;script&gt;(function(d, s, id) {
  var js, fjs = d.getElementsByTagName(s)[0];
  if (d.getElementById(id)) return;
  js = d.createElement(s); js.id = id;
  js.src = &quot;//connect.facebook.net/pt_BR/all.js#xfbml=1&quot;;
  fjs.parentNode.insertBefore(js, fjs);
}(document, &#039;script&#039;, &#039;facebook-jssdk&#039;));&lt;/script&gt;</pre>
<p>Porém o parametro <code>js.src</code> não estava importando o arquivo <code>all.js</code> como deveria, então mudei a implementação para:</p>
<pre class="brush: javascript; gutter: true">&lt;div id=&quot;fb-root&quot;&gt;&lt;/div&gt;
&lt;script src=&quot;http://connect.facebook.net/pt_BR/all.js#xfbml=1&quot;&gt;&lt;/script&gt;
&lt;script&gt;(function(d, s, id) {
  var js, fjs = d.getElementsByTagName(s)[0];
  if (d.getElementById(id)) return;
  js = d.createElement(s); js.id = id;
  fjs.parentNode.insertBefore(js, fjs);
}(document, &#039;script&#039;, &#039;facebook-jssdk&#039;));&lt;/script&gt;</pre>
<p>Já para o twitter a coisa parecia mais simples, antes eu tinha essa implementação:</p>
<pre class="brush: javascript; gutter: true">&lt;script&gt;!function(d,s,id){var js,fjs=d.getElementsByTagName(s)[0];if(!d.getElementById(id)){js=d.createElement(s);js.id=id;js.src=&quot;//platform.twitter.com/widgets.js&quot;;fjs.parentNode.insertBefore(js,fjs);}}(document,&quot;script&quot;,&quot;twitter-wjs&quot;);&lt;/script&gt;</pre>
<p>Agora tenho essa:</p>
<pre class="brush: javascript; gutter: true">&lt;script type=&quot;text/javascript&quot; charset=&quot;utf-8&quot;&gt;
    window.twttr = (function (d,s,id) {
    var t, js, fjs = d.getElementsByTagName(s)[0];
    if (d.getElementById(id)) return; js=d.createElement(s); js.id=id;
      js.src=&quot;//platform.twitter.com/widgets.js&quot;; fjs.parentNode.insertBefore(js, fjs);
      return window.twttr || (t = { _e: [], ready: function(f){ t._e.push(f) } });
    }(document, &quot;script&quot;, &quot;twitter-wjs&quot;));
&lt;/script&gt;</pre>
<p>Feito isso, veio a parte mais fácil, eu fiz um arquivo que chamei de <code>socialtarck.js</code> e importei no footer da minha página, após o script do face e do twiter.<br />
O conteúdo do meu script é esse:</p>
<pre class="brush: javascript; gutter: true">var _gaq = _gaq || [];

// GA Integration - Facebook

FB.Event.subscribe(&#039;edge.create&#039;, function(targetUrl) {
  _gaq.push([&#039;_trackSocial&#039;, &#039;facebook&#039;, &#039;like&#039;, targetUrl]);
});

FB.Event.subscribe(&#039;edge.remove&#039;, function(targetUrl) {
  _gaq.push([&#039;_trackSocial&#039;, &#039;facebook&#039;, &#039;unlike&#039;, targetUrl]);
});

// GA Integration - Twitter
// TODO: Acertar o get de URL quando você twita da index

function extractParamFromUri(uri, paramName) {
  if (!uri) {
    return;
  }
  var regex = new RegExp(&#039;[\\?&amp;#]&#039; + paramName + &#039;=([^&amp;#]*)&#039;);
  var params = regex.exec(uri);
  if (params != null) {
    return unescape(params[1]);
  }
  return;
}

function trackTwitter(intent_event) {
  if (intent_event) {
    var opt_pagePath;
    if (intent_event.target &amp;&amp; intent_event.target.nodeName == &#039;IFRAME&#039;) {
          opt_target = extractParamFromUri(intent_event.target.src, &#039;url&#039;);
    }
    _gaq.push([&#039;_trackSocial&#039;, &#039;twitter&#039;, &#039;tweet&#039;, opt_pagePath]);
  }
}

//Wrap event bindings - Wait for async js to load
twttr.ready(function (twttr) {
  //event bindings
  twttr.events.bind(&#039;tweet&#039;, trackTwitter);
});</pre>
<p>Bom, é isso! <img src='http://www.abstraindo.com/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </p>
<p>Agora sua aplicação está com o Analytics integrado ao Facebook e ao Twitter, quando você entrar em <code>Fontes de Tráfego &gt; Social &gt; Plugins de Redes Sociais</code> você vai ver o conteúdo bonitinho de quantidade de likesm tweets e afins.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.abstraindo.com/programacao-2/javascript/como-integrar-o-google-analytics-ao-facebook-e-twitter/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Sou programador e sou feliz</title>
		<link>http://www.abstraindo.com/off-topic/sou-programador-e-sou-feliz/</link>
		<comments>http://www.abstraindo.com/off-topic/sou-programador-e-sou-feliz/#comments</comments>
		<pubDate>Thu, 21 Jun 2012 17:48:40 +0000</pubDate>
		<dc:creator>Brunno dos Santos</dc:creator>
				<category><![CDATA[off-topic]]></category>
		<category><![CDATA[desenvolvimento]]></category>
		<category><![CDATA[felicidade]]></category>
		<category><![CDATA[profissão]]></category>
		<category><![CDATA[profissional]]></category>
		<category><![CDATA[programação]]></category>
		<category><![CDATA[questionamentos]]></category>

		<guid isPermaLink="false">http://www.abstraindo.com/?p=800</guid>
		<description><![CDATA[As pessoas vivem me perguntando o que eu faço da vida, e logo em seguida, após ouvir minha resposta, perguntam se eu gosto do que eu faço. A resposta é sempre simples: eu gosto muito do que eu faço. Sou desenvolvedor, programador, ou para muitos, o rapaz que trabalha com internet. Gosto de &#8220;codar&#8221;, gosto [...]]]></description>
			<content:encoded><![CDATA[<p>As pessoas vivem me perguntando o que eu faço da vida, e logo em seguida, após ouvir minha resposta, perguntam se eu gosto do que eu faço. A resposta é sempre simples: eu gosto muito do que eu faço. Sou desenvolvedor, programador, ou para muitos, o rapaz que trabalha com internet. Gosto de &#8220;codar&#8221;, gosto de aprender, gosto de solucionar problemas com um arquivo com códigos escritos <img src='http://www.abstraindo.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> <span id="more-800"></span></p>
<p>Algumas pessoas, incluindo alguns &#8220;programadores&#8221;, não entendem o quão prazeroso é fazer parte de um bom projeto ou de uma boa equipe, o quão bacana é ter seu código sendo utilizado por muitas pessoas e essas coisas. Isso tudo faz com você se sinta parte de um todo, faz com que seu trabalho tenha valido a pena.</p>
<p>Separei algumas perguntas para ver se você, programador, realmente gosta da sua profissão:</p>
<ul>
<li>Passar o dia escrevendo código te da prazer?</li>
<li>Você se sente satisfeito quando uma aplicação que você ajudou a desenvolver vai pra produção e faz sucesso?</li>
<li>Você gosta de pesquisar como resolver aquele bug cabeludo que só aparece de vez em quando em algum sistema?</li>
<li>Você fica feliz quando um usuário aceita seu pull request no <a title="GitHub" href="http://github.com" target="_blank">github</a>?</li>
<li>Receber pontos de reputação no <a title="Stackoverflow" href="http://stackoverflow.com" target="_blank">Stackoverflow</a> é tão divertido quanto passar as fases de Super Mario World?</li>
<li>Aprender uma nova linguagem de programação é mais gostoso que aprender uma nova lingua?</li>
</ul>
<p>Eu resolvi escrever esse post rápido apenas para dizer para alguns &#8220;programadores&#8221; que se você responder &#8216;não&#8217; para a maioria das perguntas acima, você deve estar na profissão errada.</p>
<p>Enfim, vou ficar por aqui, mas eu gostaria de saber de vocês abstratos, o que mais te da prazer em sua profissão?</p>
]]></content:encoded>
			<wfw:commentRss>http://www.abstraindo.com/off-topic/sou-programador-e-sou-feliz/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>[BUG] Segmentation fails &#8211; Problemas com RVM e Macports</title>
		<link>http://www.abstraindo.com/programacao-2/ruby/bug-segmentation-fails-problemas-com-rvm-e-macports/</link>
		<comments>http://www.abstraindo.com/programacao-2/ruby/bug-segmentation-fails-problemas-com-rvm-e-macports/#comments</comments>
		<pubDate>Tue, 12 Jun 2012 16:00:51 +0000</pubDate>
		<dc:creator>Brunno dos Santos</dc:creator>
				<category><![CDATA[Ruby]]></category>
		<category><![CDATA[RVM]]></category>
		<category><![CDATA[bug]]></category>
		<category><![CDATA[bundle install]]></category>
		<category><![CDATA[bundler]]></category>
		<category><![CDATA[http]]></category>
		<category><![CDATA[macosx]]></category>
		<category><![CDATA[macports]]></category>
		<category><![CDATA[ruby]]></category>
		<category><![CDATA[rvm]]></category>

		<guid isPermaLink="false">http://www.abstraindo.com/?p=782</guid>
		<description><![CDATA[Eu estava com uns minutos livres antes de sair do trabalho quando resolvi que eu ia instalar a nova versão do Ruby (1.9.3) no meu RVM e fazer um projetinho para adiantar uma demanda que deve vir pra mim nas próximas semanas, mas derrepente me deparei com um grande problema! Um erro bizarro! Quem tem [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.abstraindo.com/programacao-2/utilizando-rvmrc-para-setar-gemsets-automaticamente/attachment/rvm/" rel="attachment wp-att-559"><img class="alignleft size-thumbnail wp-image-559" title="rvm" src="http://www.abstraindo.com/wp-content/uploads/2011/09/rvm-150x150.png" alt="" width="150" height="150" /></a>Eu estava com uns minutos livres antes de sair do trabalho quando resolvi que eu ia instalar a nova versão do Ruby (1.9.3) no meu RVM e fazer um projetinho para adiantar uma demanda que deve vir pra mim nas próximas semanas, mas derrepente me deparei com um grande problema! Um erro bizarro! Quem tem a coragem de cuspir na minha cara que ele é um [BUG]!</p>
<p>Eu instalei a rubie 1.9.3 com <code>rvm install ruby-1.9.3 --with-gcc=clang</code> (devido ao bug de compatibilidade com o LLVM do xCode), até aí tudo correndo bem, então mandei instalar o rails, o sistema instalou, mas o rodar o bundle install:</p>
<pre class="brush: text; gutter: true">/Users/brunno/.rvm/rubies/ruby-1.9.3-p194/lib/ruby/1.9.1/net/http.rb:799: [BUG] Segmentation fault</pre>
<p>Fui pesquisar e descobri que esse problema é uma falha ao utilizar requisições http via openssl pelo Ruby. Logo em seguida descobri que esse problema acontece com quem tem o openssl instalado via MacPorts!<span id="more-782"></span></p>
<h2>É o seu caso?</h2>
<p>Para verificar se você tem o openssl instalado pelo MacPorts rode:</p>
<pre class="brush: text; gutter: true">port installed openssl</pre>
<p>Se aparecer os danadinhos é porque você vai ter problemas! hehehe</p>
<h2>Resolvendo o BUG segmentation fault</h2>
<p><span style="color: #ff0000;">Antes de entrar na resolução é importante ressaltar que após esse processo eu tive problemas com o LibYAML, então segui as instrução de instalação que temos <a title="Instalando o LibYAML" href="http://pyyaml.org/wiki/LibYAML" target="_blank">aqui no site oficial</a>, e refiz essas instalações.</span></p>
<p>Para resolver esse problema encontrei uma solução peculiar, primeiro instalamos o Ruby 1.8.7 com esse comando:</p>
<pre class="brush: text; gutter: true">rvm install 1.8.7 --with-openssl-dir=/opt/local</pre>
<p>* caso de exemplo, eu continuei utilizando o <code>--with-gcc=clang</code> como parâmetro, o código na minha máquina é <code>rvm install 1.8.7 --with-openssl-dir=/opt/local --with-gcc=clang</code></p>
<p>E em seguida instalamos a Rubie que precisamos:</p>
<pre class="brush: text; gutter: true">rvm install ruby-1.9.3-p194 --with-opt-dir=/opt/local</pre>
<p>* outro caso de exemplo, no meu caso eu usei o reinstall e o clang, deixando o código assim: <code>rvm reinstall ruby-1.9.3-p194 --with-opt-dir=/opt/local --with-gcc=clang</code></p>
<p>Bizarro?! Sim, mas funcionou perfeitamente pra mim.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.abstraindo.com/programacao-2/ruby/bug-segmentation-fails-problemas-com-rvm-e-macports/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Refatorando o Aprendendo TDD com Ruby</title>
		<link>http://www.abstraindo.com/programacao-2/tdd/refatorando-o-aprendendo-tdd-com-ruby/</link>
		<comments>http://www.abstraindo.com/programacao-2/tdd/refatorando-o-aprendendo-tdd-com-ruby/#comments</comments>
		<pubDate>Wed, 06 Jun 2012 18:13:14 +0000</pubDate>
		<dc:creator>Brunno dos Santos</dc:creator>
				<category><![CDATA[TDD]]></category>
		<category><![CDATA[ruby]]></category>
		<category><![CDATA[tdd]]></category>
		<category><![CDATA[tutorial]]></category>

		<guid isPermaLink="false">http://www.abstraindo.com/?p=738</guid>
		<description><![CDATA[Hoje li um post muito interessante no blog do Thiago Belem que falava sobre TDD e como utilizá-lo. Como gostei bastante do conteúdo resolvi reescrever esse post, porém sem usar python, e sim o nosso velho amigo Ruby. Não vou me estender sobre o que é ou o que eu acho de TDD, acho que [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.abstraindo.com/wp-content/uploads/2012/06/tdd_flow-287x300.gif" rel="lightbox[738]"><img class="alignleft size-medium wp-image-741" title="tdd_flow" src="http://www.abstraindo.com/wp-content/uploads/2012/06/tdd_flow-287x300.gif" alt="Fluxo do TDD" width="287" height="300" /></a>Hoje li <a title="Aprendendo TDD" href="http://blog.thiagobelem.net/aprendendo-tdd-ou-desenvolvimento-orientado-a-testes/">um post</a> muito interessante no blog do Thiago Belem que falava sobre TDD e como utilizá-lo.</p>
<p>Como gostei bastante do conteúdo resolvi reescrever esse post, porém sem usar python, e sim o nosso velho amigo Ruby.</p>
<p>Não vou me estender sobre o que é ou o que eu acho de TDD, acho que esse assunto merece um post somente dele, mas se mesmo assim você quiser uma opinião, leiam o <a title="Aprendendo TDD" href="http://blog.thiagobelem.net/aprendendo-tdd-ou-desenvolvimento-orientado-a-testes/">post do Thiago</a>.</p>
<p>Então vamos ao que realmente interessa, o &#8220;sistema&#8221; que vamos usar para o exemplo, assim como no post original, é o Fizz Buzz, um jogo onde as pessoas devem iniciar uma contagem do 1 e substituir os múltiplos de três por Fizz, os múltiplos de cinco por Buzz e os múltiplos de três e cinco por Fizz Buzz. É um jogo muito parecido com o Pin do Silvio Santos <img src='http://www.abstraindo.com/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> <span id="more-738"></span></p>
<p>Ele funciona assim:</p>
<blockquote><p>1, 2, Fizz, 4, Buzz, Fizz, 7, 8, Fizz, Buzz, 11, Fizz, 13, 14, Fizz Buzz, 16, 17, Fizz, 19, Buzz, Fizz, 22, 23, Fizz, Buzz, 26, Fizz, 28, 29, Fizz Buzz, 31, 32, Fizz, 34, Buzz, Fizz, …</p></blockquote>
<p>Entendido? Então vamos seguir o enterro. Agora vamos fazer uma lista com o que vamos testar/implementar.</p>
<ul>
<li>FizzBuzz recebe um número</li>
<li>FizzBuzz(1) retorna 1</li>
<li>FizzBuzz(2) retorna 2</li>
<li>FizzBuzz(3) retorna “fizz”</li>
<li>FizzBuzz(4) retorna 4</li>
<li>FizzBuzz(5) retorna “buzz”</li>
</ul>
<p>Esses são os testes que vamos rodar, será a partir deles que vamos implementar nosso código.</p>
<h2>Então vamos aos códigos?</h2>
<p>Crie um arquivo de testes chamado <code>fizzbuzz_test.rb</code> onde vamos escrever nosso teste:</p>
<pre class="brush: ruby; gutter: true">require &quot;test/unit&quot;

class FizzbuzzTest &lt; Test::Unit::TestCase

end</pre>
<p>Como vocês podem ver, aqui nós apenas criamos um arquivo, que requere a biblioteca padrão do Ruby <code>"test/unit"</code> e definimos uma classe que extende <code>Test::unit::testCase</code>.</p>
<p>Seguindo o andar do artigo original, vamos rodar nosso teste no terminal, com o seguinte comando: <code>ruby fizzbuzz_test.rb</code>, a saída desse comando será:</p>
<pre class="brush: text; gutter: true">Loaded suite fizzbuzz_test
Started

Finished in 0.000383 seconds.

0 tests, 0 assertions, 0 failures, 0 errors, 0 skips

Test run options: --seed 558</pre>
<p>Woow, it works! <img src='http://www.abstraindo.com/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' />  Legal, então agora vamos escrever nosso primeiro teste!</p>
<pre class="brush: ruby; gutter: true">require &quot;test/unit&quot;

class FizzbuzzTest &lt; Test::Unit::TestCase

  def test_fizzbuzz
    assert_equal( 1, fizzbuzz(1) )
  end

end</pre>
<p>Beleza, esse é o teste número 1, que verifica se o fizzbuzz(1) retorna 1. Agora vamos rodar nosso teste para ver o que vai acontecer:</p>
<pre class="brush: text; gutter: true">Loaded suite fizzbuzz_test
Started
E
Finished in 0.000672 seconds.

  1) Error:
test_fizzbuzz(FizzbuzzTest):
NoMethodError: undefined method `fizzbuzz&#039; for #&lt;FizzbuzzTest:0x007f91eb039d08&gt;
    fizzbuzz_test.rb:6:in `test_fizzbuzz&#039;

1 tests, 0 assertions, 0 failures, 1 errors, 0 skips

Test run options: --seed 21698</pre>
<p>Maravilha! conseguimos um erro! \o/ Hmm vamos analisar para descobri o que deu errado. Opa! &#8220;undefined method `fizzbuzz&#8217;&#8221; quer dizer que o o método fizzbuzz não existe! NÃO EXISTE?! É, ele não existe, você criou um método que se chama fizzbuzz? Não né?! Nem eu! hehehe</p>
<p>Então vamos criar um arquivo que se chama fizzbuzz.rb e vamos colocar nossa função la dentro <img src='http://www.abstraindo.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<pre class="brush: ruby; gutter: true">def fizzbuzz
end</pre>
<p>Legal, vamos incluir esse arquivo no arquivo de testes:</p>
<pre class="brush: ruby; gutter: true">require &quot;./fizzbuzz&quot;
require &quot;test/unit&quot;

class FizzbuzzTest &lt; Test::Unit::TestCase

  def test_fizzbuzz
    assert_equal( 1, fizzbuzz(1) )
  end

end</pre>
<p>Ok, agora é a hora de rodar nosso teste, o resultado deve ser esse:</p>
<pre class="brush: text; gutter: true">Loaded suite fizzbuzz_test
Started
E
Finished in 0.000439 seconds.

  1) Error:
test_fizzbuzz(FizzbuzzTest):
ArgumentError: wrong number of arguments (1 for 0)
    /Users/brunno/Squiter/abstraindo-tdd/fizzbuzz.rb:1:in `fizzbuzz&#039;
    fizzbuzz_test.rb:7:in `test_fizzbuzz&#039;

1 tests, 0 assertions, 0 failures, 1 errors, 0 skips

Test run options: --seed 62614</pre>
<p>Beleza, agora ele está reclamando que passamos o número errado de parâmetros para a função fizzbuzz, passamos 1 para um função que recebe 0. Olha só, esse é primeiro item daquela nossas lista de testes, então vamos resolver ele, no arquivo fizzbuzz.rb coloque um parâmetro na nossa função:</p>
<pre class="brush: ruby; gutter: true">def fizzbuzz(num)
end</pre>
<p>Rodando o teste teremos:</p>
<pre class="brush: text; gutter: true">Loaded suite fizzbuzz_test
Started
F
Finished in 0.000671 seconds.

  1) Failure:
test_fizzbuzz(FizzbuzzTest) [fizzbuzz_test.rb:7]:
&lt;1&gt; expected but was
&lt;nil&gt;.

1 tests, 1 assertions, 1 failures, 0 errors, 0 skips

Test run options: --seed 31173</pre>
<p>Beleza, fizemos o primeiro item da lista dar certo! <img src='http://www.abstraindo.com/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </p>
<ul>
<li><del>FizzBuzz recebe um número</del></li>
<li>FizzBuzz(1) retorna 1</li>
<li>FizzBuzz(2) retorna 2</li>
<li>FizzBuzz(3) retorna “fizz”</li>
<li>FizzBuzz(4) retorna 4</li>
<li>FizzBuzz(5) retorna “buzz”</li>
</ul>
<p>Agora vamos para o item dois, fazer com que a função retorne 1!</p>
<h2>Resolvendo os erros</h2>
<p>É aqui que vamos realmente codar! Vamos colocar o nosso &#8220;sistema&#8221; para funcionar, mas antes quero deixar claro que é sempre importante pensarmos na forma mais simples e rápida de resolver um erro nos testes, vou citar o que o Thiago falou que ficou muito bem escrito:</p>
<blockquote><p>Sempre que você escrever um teste e ele quebrar, pergunte-se: “<strong>Qual o menor passo, a menor mudança no código, que eu posso fazer pra esse teste passar?</strong>” Não importa se esse passo é elegante, segue padrões de projeto ou está simplesmente enganando o código… A primeira vez que você faz o teste passar tem a ver com velocidade e simplicidade, boas práticas fica pro momento da refatoração, com todos os testes passando.</p></blockquote>
<p>Então para que nosso código em Ruby passe no teste da forma mais simples possível, basta fazer isso:</p>
<pre class="brush: ruby; gutter: true">def fizzbuzz(num)
  1
end</pre>
<p>hahaha sem brincadeiras gente, esse é o jeito mais simples e com menos código <img src='http://www.abstraindo.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  Olhem o retorno do meu teste:</p>
<pre class="brush: text; gutter: true">Loaded suite fizzbuzz_test
Started
.
Finished in 0.000451 seconds.

1 tests, 1 assertions, 0 failures, 0 errors, 0 skips

Test run options: --seed 2182</pre>
<p>Uhull \o/ Passamos no teste, agora é sair pro abraço! <img src='http://www.abstraindo.com/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </p>
<ul>
<li><del>FizzBuzz recebe um número</del></li>
<li><del>FizzBuzz(1) retorna 1</del></li>
<li>FizzBuzz(2) retorna 2</li>
<li>FizzBuzz(3) retorna “fizz”</li>
<li>FizzBuzz(4) retorna 4</li>
<li>FizzBuzz(5) retorna “buzz”</li>
</ul>
<h2>Decidindo o próximo teste</h2>
<p>Agora chegou a vez de escolhermos qual será o próximo teste que vamos fazer, vou deixar as dicas do post original aqui:</p>
<ul>
<li>Escreva um teste que você SABE que não vai passar.. Não adianta ficar testando coisas que já estão passando, né?</li>
<li>Mas se você não tem certeza, escreva o teste e veja o que acontece… Testes nunca são demais.</li>
<li>Escreva um teste que você ACHA que pode ser resolvido de forma simples, nada de testar o programa todo de uma vez.. o ideal é que você tenha apenas um teste quebrando em cada “rodada”</li>
<li>Teste com valores plausíveis e facilmente compreensíveis… testar soma (1, 2) == 3 é muito melhor do que testar soma (12312512312, 31653341265312) = ????, entendeu onde quero chegar?</li>
</ul>
<p>Então vamos fazer o nosso terceiro item da lista FizzBuzz(2) retorne 2:</p>
<pre class="brush: ruby; gutter: true">require &quot;./fizzbuzz&quot;
require &quot;test/unit&quot;

class FizzbuzzTest &lt; Test::Unit::TestCase

  def test_fizzbuzz_de1
    assert_equal( 1, fizzbuzz(1) )
  end

  def test_fizzbuzz_de2
    assert_equal( 2, fizzbuzz(2) )
  end

end</pre>
<p>Esse aqui está super fácil de sacar o que vai acontecer não é?! <img src='http://www.abstraindo.com/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </p>
<pre class="brush: text; gutter: true">Loaded suite fizzbuzz_test
Started
.F
Finished in 0.000617 seconds.

  1) Failure:
test_fizzbuzz_de2(FizzbuzzTest) [fizzbuzz_test.rb:11]:
&lt;2&gt; expected but was
&lt;1&gt;.

2 tests, 2 assertions, 1 failures, 0 errors, 0 skips

Test run options: --seed 13989</pre>
<p>Putz não passou! Surpreso?! Nem eu! Agora chega a hora da perguntinha mágica: ”<strong>Qual o menor passo, a menor mudança no código, que eu posso fazer pra esse teste passar?</strong>“ e vamos colocá-la em prática:</p>
<pre class="brush: ruby; gutter: true">def fizzbuzz(num)
  num
end</pre>
<p>Olha que solução inteligente hein?! hehehe <img src='http://www.abstraindo.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>E que rodem os testes:</p>
<pre class="brush: text; gutter: true">Loaded suite fizzbuzz_test
Started
..
Finished in 0.000734 seconds.

2 tests, 2 assertions, 0 failures, 0 errors, 0 skips

Test run options: --seed 37221</pre>
<p>Coisa linda! Mais um item da lista foi embora:</p>
<ul>
<li><del>FizzBuzz recebe um número</del></li>
<li><del>FizzBuzz(1) retorna 1</del></li>
<li><del>FizzBuzz(2) retorna 2</del></li>
<li>FizzBuzz(3) retorna “fizz”</li>
<li>FizzBuzz(4) retorna 4</li>
<li>FizzBuzz(5) retorna “buzz”</li>
</ul>
<p>Legal, vamos escrever nosso quarto teste, pois as coisas estão correndo bem.</p>
<pre class="brush: ruby; gutter: true">require &quot;./fizzbuzz&quot;
require &quot;test/unit&quot;

class FizzbuzzTest &lt; Test::Unit::TestCase

  def test_fizzbuzz_de1
    assert_equal( 1, fizzbuzz(1) )
  end

  def test_fizzbuzz_de2
    assert_equal( 2, fizzbuzz(2) )
  end

  def test_fizzbuzz_de3
    assert_equal( &quot;fizz&quot;, fizzbuzz(3) )
  end

end</pre>
<p>Testando:</p>
<pre class="brush: text; gutter: true">Loaded suite fizzbuzz_test
Started
..F
Finished in 0.001151 seconds.

  1) Failure:
test_fizzbuzz_de3(FizzbuzzTest) [fizzbuzz_test.rb:15]:
&lt;&quot;fizz&quot;&gt; expected but was
&lt;3&gt;.

3 tests, 3 assertions, 1 failures, 0 errors, 0 skips

Test run options: --seed 44045</pre>
<p>Puxa vida, 1 falha! Perguntinha mágica e chegamos nesse resultado:</p>
<pre class="brush: ruby; gutter: true">def fizzbuzz(num)
  if num == 3
    return &#039;fizz&#039;
  end
  num
end</pre>
<p>O que nos dá um sucesso nos testes! <img src='http://www.abstraindo.com/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </p>
<pre class="brush: text; gutter: true">Loaded suite fizzbuzz_test
Started
...
Finished in 0.000645 seconds.

3 tests, 3 assertions, 0 failures, 0 errors, 0 skips

Test run options: --seed 3779</pre>
<p>Não sei se a brincadeira está clara pra vocês, mas o lance é esse aí mesmo, temos que sempre escrever nossos testes e nosso código como se não houvessem outros testes, não adianta você se preocupar em escrever todos os testes e fazer com o que o código passe em todos, pois você vai acabar desenvolvendo coisa a mais, controles a mais e código a mais! não é isso que nós queremos, nós queremos código enxuto e direto!</p>
<p>Não quero passar o conteúdo completo aqui, pois o mesmo está muito bem explicado pelo Thiago, a minha intenção aqui era apenas mostrar os mesmos códigos que os dele em Ruby.</p>
<p>Seguem os arquivos finais:</p>
<pre class="brush: ruby; gutter: true">require &quot;./fizzbuzz&quot;
require &quot;test/unit&quot;

class FizzbuzzTest &lt; Test::Unit::TestCase

  def test_fizzbuzz_simples
    assert_equal( 1, fizzbuzz(1) )
    assert_equal( 2, fizzbuzz(2) )
    assert_equal( 4, fizzbuzz(4) )
  end

  def test_fizzbuzz_fizz
    assert_equal( &#039;fizz&#039;, fizzbuzz(3) )
    assert_equal( &#039;fizz&#039;, fizzbuzz(9) )
  end

  def test_fizzbuzz_buzz
    assert_equal( &quot;buzz&quot;, fizzbuzz(5) )
    assert_equal( &quot;buzz&quot;, fizzbuzz(10) )
  end

  def test_fizzbuzz_fizzbuzz
    assert_equal( &#039;fizzbuzz&#039;, fizzbuzz(15) )
  end

end</pre>
<p>O nosso arquivo fizzbuzz.rb:</p>
<pre class="brush: ruby; gutter: true">def multiploDeTres(num)
  (num % 3 == 0) ? true : false
end

def multiploDeCinco(num)
  (num % 5 == 0) ? true : false
end

def fizzbuzz(num)
  if multiploDeTres(num) &amp;&amp; multiploDeCinco(num)
    return &#039;fizzbuzz&#039;
  end
  if multiploDeTres(num)
    return &#039;fizz&#039;
  end
  if multiploDeCinco(num)
    return &#039;buzz&#039;
  end
  num
end</pre>
<p>E o resultado dos nossos testes:</p>
<pre class="brush: text; gutter: true">Loaded suite fizzbuzz_test
Started
....
Finished in 0.000791 seconds.

4 tests, 8 assertions, 0 failures, 0 errors, 0 skips

Test run options: --seed 4842</pre>
<ul>
<li><del>FizzBuzz recebe um número</del></li>
<li><del>FizzBuzz(1) retorna 1</del></li>
<li><del>FizzBuzz(2) retorna 2</del></li>
<li><del>FizzBuzz(3) retorna “fizz”</del></li>
<li><del>FizzBuzz(4) retorna 4</del></li>
<li><del>FizzBuzz(5) retorna “buzz”</del></li>
</ul>
<p>Bom, é isso aew abstratos, espero que vocês tenham gostado, e não se esqueçam de visitar o <a title="Aprendendo TDD" href="http://www.abstraindo.com/redes-sociais-2/empresa-cria-joias-com-checkins-do-foursquare/" target="_blank">post original</a>.<br />
Os arquivos desse post estão disponíveis em: <a title="Abstraindo - Aprendendo TDD" href="https://github.com/squiter85/Abstraindo---Aprendendo-TDD" target="_blank">https://github.com/squiter85/Abstraindo&#8212;Aprendendo-TDD</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.abstraindo.com/programacao-2/tdd/refatorando-o-aprendendo-tdd-com-ruby/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Empresa cria jóias com checkins do Foursquare</title>
		<link>http://www.abstraindo.com/redes-sociais-2/empresa-cria-joias-com-checkins-do-foursquare/</link>
		<comments>http://www.abstraindo.com/redes-sociais-2/empresa-cria-joias-com-checkins-do-foursquare/#comments</comments>
		<pubDate>Thu, 31 May 2012 15:49:56 +0000</pubDate>
		<dc:creator>Brunno dos Santos</dc:creator>
				<category><![CDATA[Redes Sociais]]></category>
		<category><![CDATA[curiosidades]]></category>
		<category><![CDATA[foursquare]]></category>
		<category><![CDATA[integração]]></category>
		<category><![CDATA[joias]]></category>
		<category><![CDATA[rede social]]></category>

		<guid isPermaLink="false">http://www.abstraindo.com/?p=728</guid>
		<description><![CDATA[Isso aew abstratos, vocês não leram errado! Olha que coisa maluca! Meshu, esse é o nome do site que cria jóias como essas abaixo de acordo com os checkins que você deu no Foursquare! Olhem como ficou os meus checkins: Se vocês quiserem suas jóias do Foursquare, é só comprar aqui: http://meshu.io/]]></description>
			<content:encoded><![CDATA[<p>Isso aew abstratos, vocês não leram errado! Olha que coisa maluca!</p>
<p><a title="Jóias com seus Checkins" href="http://meshu.io/" target="_blank">Meshu</a>, esse é o nome do site que cria jóias como essas abaixo de acordo com os checkins que você deu no Foursquare!</p>
<p><a href="http://www.abstraindo.com/redes-sociais-2/empresa-cria-joias-com-checkins-do-foursquare/attachment/screen-shot-2012-05-31-at-12-32-31/" rel="attachment wp-att-730"><img class="aligncenter size-medium wp-image-730" title="Joias-Meshu" src="http://www.abstraindo.com/wp-content/uploads/2012/05/Screen-Shot-2012-05-31-at-12.32.31-300x225.png" alt="Joias Meshu" width="300" height="225" /></a></p>
<p>Olhem como ficou os meus checkins:</p>
<p><a href="http://www.abstraindo.com/redes-sociais-2/empresa-cria-joias-com-checkins-do-foursquare/attachment/screen-shot-2012-05-31-at-12-32-14/" rel="attachment wp-att-729"><img class="aligncenter size-medium wp-image-729" title="Brunno-Checkins" src="http://www.abstraindo.com/wp-content/uploads/2012/05/Screen-Shot-2012-05-31-at-12.32.14-300x189.png" alt="Brunno Checkins" width="300" height="189" /></a></p>
<p>Se vocês quiserem suas jóias do Foursquare, é só comprar aqui: <a href="http://meshu.io/" target="_blank">http://meshu.io/</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.abstraindo.com/redes-sociais-2/empresa-cria-joias-com-checkins-do-foursquare/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Google Drive. Guarde tudo. Compartilhe o que quiser.</title>
		<link>http://www.abstraindo.com/google/google-drive-guarde-tudo-compartilhe-o-que-quiser/</link>
		<comments>http://www.abstraindo.com/google/google-drive-guarde-tudo-compartilhe-o-que-quiser/#comments</comments>
		<pubDate>Tue, 24 Apr 2012 20:43:25 +0000</pubDate>
		<dc:creator>Weverton do Couto Timoteo</dc:creator>
				<category><![CDATA[Google]]></category>
		<category><![CDATA[alternativa dropbox]]></category>
		<category><![CDATA[alternativa skydrive]]></category>
		<category><![CDATA[compartilhar arquivos]]></category>
		<category><![CDATA[google drive]]></category>

		<guid isPermaLink="false">http://www.abstraindo.com/?p=722</guid>
		<description><![CDATA[Aí está um serviço para competir com o Dropbox e com o SkyDrive (que nem merece link =P). E ele está para chegar! Falta pouco! Visite agora o Google Drive! E peça sua notificação!]]></description>
			<content:encoded><![CDATA[<p>Aí está um serviço para competir com o <a title="DropBox" href="http://www.dropbox.com" target="_blank">Dropbox</a> e com o SkyDrive (que nem merece link =P).</p>
<p>E ele está para chegar! Falta pouco! Visite agora o <a title="Google Drive" href="http://drive.google.com" target="_blank">Google Drive</a>! E peça sua notificação!</p>
<p><center><img class="aligncenter size-medium wp-image-724" title="Google Drive waiting approval" src="http://www.abstraindo.com/wp-content/uploads/2012/04/Screen-Shot-2012-04-24-at-17.41.17-300x245.png" alt="" width="300" height="245" /></center></p>
]]></content:encoded>
			<wfw:commentRss>http://www.abstraindo.com/google/google-drive-guarde-tudo-compartilhe-o-que-quiser/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
