<?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>sauloarruda.eti.br</title>
	<atom:link href="http://www.sauloarruda.eti.br/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.sauloarruda.eti.br</link>
	<description>...revirando até chegar do outro lado...</description>
	<lastBuildDate>Thu, 04 Mar 2010 14:54:25 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>TDD em PHP</title>
		<link>http://www.sauloarruda.eti.br/2010/03/tdd-em-php/</link>
		<comments>http://www.sauloarruda.eti.br/2010/03/tdd-em-php/#comments</comments>
		<pubDate>Thu, 04 Mar 2010 14:51:39 +0000</pubDate>
		<dc:creator>sauloarruda</dc:creator>
				<category><![CDATA[Agence]]></category>
		<category><![CDATA[Agile]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Agile Adoption]]></category>
		<category><![CDATA[BDD]]></category>
		<category><![CDATA[CakePHP]]></category>
		<category><![CDATA[github]]></category>
		<category><![CDATA[JUnit]]></category>
		<category><![CDATA[JWebUnit]]></category>
		<category><![CDATA[SimpleTest]]></category>
		<category><![CDATA[TDD]]></category>
		<category><![CDATA[Teste de Software]]></category>

		<guid isPermaLink="false">http://www.sauloarruda.eti.br/?p=292</guid>
		<description><![CDATA[Continuando os relatos sobre imersão Agil da Agence, essa semana estamos trabalhando em provas de conceito para desenvolver orientado a testes (TDD) em PHP. Como acontece com Ruby (Linguagem) + Rails (Framework), partimos para a premissa de utilizar um framework PHP, no caso, o que estamos mais usando por aqui que é o CakePHP.
Para nossa [...]]]></description>
			<content:encoded><![CDATA[<div>Continuando os relatos sobre imersão Agil da Agence, essa semana estamos trabalhando em provas de conceito para desenvolver orientado a testes (TDD) em PHP. Como acontece com Ruby (Linguagem) + Rails (Framework), partimos para a premissa de utilizar um framework PHP, no caso, o que estamos mais usando por aqui que é o <a href="http://cakephp.org" target="_blank">CakePHP</a>.</div>
<p>Para nossa &#8220;sorte&#8221; o Cake já tem algumas facilidades para implementação de testes no estilo <a href="http://pt.wikipedia.org/wiki/XUnit" target="_blank">xUnit</a>, usando o framework <a href="http://www.simpletest.org/" target="_blank">SimpleTest</a>, que é uma mistura de <a href="http://junit.org/" target="_blank">JUnit</a> com <a href="http://jwebunit.sourceforge.net/" target="_blank">JWebUnit</a> permitindo tanto a implementação de testes de unidade/integração como testes funcionais/aceitação simulando comportando do Browser.</p>
<p>O código-fonte produzido está <a href="http://github.com/sauloarruda/libres/tree/libres-php" target="_blank">disponível no GitHub</a>, e em breve vamos escrever alguns artigos explicando melhor como foi a experiência. Mas, como sempre, feedbacks já são muito bem vindos!</p>
<p>Fica algumas boas referências de sites e blogs sobre o assunto:</p>
<ul>
<li><a href="http://kiss.souagil.com.br/" target="_blank">KISS</a>: blog muito movimentado sobre TDD em CakePHP, em PT-BR!</li>
<li><a href="http://www.debuggable.com/blog" target="_blank">Debuggable</a>: empresa especializada em desenvolvimento em CakePHP, acredito que alguns componentes de teste foram desenvolvidos por eles.</li>
<li><a href="http://mark-story.com/" target="_blank">Mark Story</a>: blog dedicado a CakePHP e assuntos relacionados.</li>
<li><a href="http://www.slideshare.net/joaojose/testes-automatizados-no-cakephp" target="_blank">Testes automatizados no CakePHP</a>: excelente apresentação sobre TDD em CakePHP.</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.sauloarruda.eti.br/2010/03/tdd-em-php/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Kanban em projetos de manutenção</title>
		<link>http://www.sauloarruda.eti.br/2010/03/kanban-em-projetos-de-manutencao/</link>
		<comments>http://www.sauloarruda.eti.br/2010/03/kanban-em-projetos-de-manutencao/#comments</comments>
		<pubDate>Wed, 03 Mar 2010 13:02:19 +0000</pubDate>
		<dc:creator>sauloarruda</dc:creator>
				<category><![CDATA[Agence]]></category>
		<category><![CDATA[Agile]]></category>
		<category><![CDATA[Agile Adoption]]></category>
		<category><![CDATA[Fernando Cézar]]></category>
		<category><![CDATA[Geeks Anônimos]]></category>
		<category><![CDATA[Kanban]]></category>
		<category><![CDATA[Scrum]]></category>

		<guid isPermaLink="false">http://www.sauloarruda.eti.br/?p=289</guid>
		<description><![CDATA[Dando continuidade aos relatos da imersão Ágil na Agence, nosso colega Fernando Cezar publicou no Geeks Anônimos um artigo explicando (e ilustrando) como estamos usando Kanban (e SCRUM??) em projetos 12 projetos de manutenção. Aproveite e deixe seus comentários sobre o tema, o feedback da comunidade é muito importante.
]]></description>
			<content:encoded><![CDATA[<p>Dando continuidade aos relatos da imersão Ágil na Agence, nosso colega <a href="http://blog.fernandocezar.net/" target="_blank">Fernando Cezar</a> publicou no <a href="http://www.geeksanonimos.com/2010/03/01/como-nos-aplicamos-scrum-em-projetos-de-manutencao/" target="_blank">Geeks Anônimos um artigo</a> explicando (e ilustrando) como estamos usando <a href="http://pt.wikipedia.org/wiki/Kanban" target="_blank">Kanban</a> (e SCRUM??) em projetos 12 projetos de manutenção. Aproveite e deixe seus comentários sobre o tema, o feedback da comunidade é muito importante.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.sauloarruda.eti.br/2010/03/kanban-em-projetos-de-manutencao/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Compartilhando repositórios locais no Git</title>
		<link>http://www.sauloarruda.eti.br/2010/03/compartilhando-repositorios-locais-no-git/</link>
		<comments>http://www.sauloarruda.eti.br/2010/03/compartilhando-repositorios-locais-no-git/#comments</comments>
		<pubDate>Tue, 02 Mar 2010 22:28:42 +0000</pubDate>
		<dc:creator>sauloarruda</dc:creator>
				<category><![CDATA[Drops]]></category>
		<category><![CDATA[CVS]]></category>
		<category><![CDATA[DCVS]]></category>
		<category><![CDATA[git]]></category>
		<category><![CDATA[SVN]]></category>

		<guid isPermaLink="false">http://www.sauloarruda.eti.br/?p=286</guid>
		<description><![CDATA[Estou começando a usar Git de verdade em um projeto da Agence e já de início me deparei com uma situação que o SVN não atenderia. Estamos desenvolvendo uma prova de conceito e ainda não está pronto para enviar ao servidor central, porém, gostaria de compartilhar minha versão com outro desenvolvedor que seguirá uma linha [...]]]></description>
			<content:encoded><![CDATA[<p>Estou começando a usar Git de verdade em um projeto da Agence e já de início me deparei com uma situação que o SVN não atenderia. Estamos desenvolvendo uma prova de conceito e ainda não está pronto para enviar ao servidor central, porém, gostaria de compartilhar minha versão com outro desenvolvedor que seguirá uma linha diferente da minha.</p>
<p>Com o SVN, enviaria pra ele um .zip do meu projeto, mas como estamos usando um <a href="http://en.wikipedia.org/wiki/Distributed_Concurrent_Versions_System" target="_blank">DCVS</a> podemos fazer isso com os recursos do Git. Primeiramente, devo rodar um processo na minha máquina que permitirá outra pessoa dentro da mesma rede acessar meu repositório usando o protocolo git. Existem outras opções para compartilhar repositórios, <a href="http://stackoverflow.com/questions/978052/githow-can-i-make-my-local-repository-available-for-git-pull">veja aqui</a> mais detalhes. Para iniciar o git-daemon usei o comando abaixo:</p>
<p><code>git daemon --verbose --export-all --enable=upload-pack --enable=receive-pack --base-path=/Users/sauloarruda/Projetos/Users/sauloarruda/Projetos/sauloarruda.eti.br/libres/libres-php/.git</code></p>
<p>E o outro desenvolvedor simplesmente usou o comando abaixo para clonar meu repositório. O legal nesse caso é que ele consegue pegar minhas atualizações com git pull, mas quando ele faz um commit as mudanças não são feitas no meu repositório.</p>
<p><code>git clone git://172.20.12.180/sauloarruda.eti.br/libres/libres-php/.git</code></p>
<p><strong>Referências</strong>:</p>
<ul>
<li><a href="http://henriquebastos.net/2009/01/08/using-git-daemon-to-share-your-git-repository/ " target="_blank">Using Git Daemon to share your Git repository</a></li>
<li><a href="http://www-cs-students.stanford.edu/~blynn/gitmagic/ch03.html" target="_blank">Git Magic &#8211; Cloning Around</a></li>
<li><a href="http://stackoverflow.com/questions/978052/githow-can-i-make-my-local-repository-available-for-git-pull" target="_blank">Stack Overflow &#8211; How can I make my local repository available for git-pull?</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.sauloarruda.eti.br/2010/03/compartilhando-repositorios-locais-no-git/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Proposta para o Agile Brazil 2010</title>
		<link>http://www.sauloarruda.eti.br/2010/02/proposta-para-o-agile-brazil-2010/</link>
		<comments>http://www.sauloarruda.eti.br/2010/02/proposta-para-o-agile-brazil-2010/#comments</comments>
		<pubDate>Mon, 01 Mar 2010 02:47:04 +0000</pubDate>
		<dc:creator>sauloarruda</dc:creator>
				<category><![CDATA[Agence]]></category>
		<category><![CDATA[Agile]]></category>
		<category><![CDATA[Drops]]></category>
		<category><![CDATA[Eventos]]></category>
		<category><![CDATA[Agile Adoption]]></category>
		<category><![CDATA[Agile Brazil]]></category>
		<category><![CDATA[BDD]]></category>
		<category><![CDATA[Campo Grande]]></category>
		<category><![CDATA[CMMI]]></category>
		<category><![CDATA[DDD]]></category>
		<category><![CDATA[Evento]]></category>
		<category><![CDATA[eXtreme Programming]]></category>
		<category><![CDATA[MPS]]></category>
		<category><![CDATA[MPS.br]]></category>
		<category><![CDATA[OpenUP]]></category>
		<category><![CDATA[Pair Programming]]></category>
		<category><![CDATA[Porto Alegre]]></category>
		<category><![CDATA[Scrum]]></category>

		<guid isPermaLink="false">http://www.sauloarruda.eti.br/?p=274</guid>
		<description><![CDATA[Nos dias 22 a 25 de Junho de 2010 acontecerá em Porto Alegre um grande evento dedicado ao tema Agile, o Agil Brazil 2010. As submissões de palestra tiveram seu prazo aumentado para dia 07/03 pelo site http://submissoes.agilebrazil.com/. Submeti a palestra abaixo e estou na torcida pela aprovação! Aproveite e deixe seus comentários, será de [...]]]></description>
			<content:encoded><![CDATA[<p>Nos dias 22 a 25 de Junho de 2010 acontecerá em Porto Alegre um grande evento dedicado ao tema Agile, o <a href="http://www.agilebrazil.com/2010/" target="_blank">Agil Brazil 2010</a>. As submissões de palestra tiveram seu prazo aumentado para dia 07/03 pelo site <a href="http://submissoes.agilebrazil.com/" target="_blank">http://submissoes.agilebrazil.com/</a>. Submeti a palestra abaixo e estou na torcida pela aprovação! Aproveite e deixe seus comentários, será de grande valia!</p>
<dt>
<h3>Em 6 meses de imersão ágil o que mudou?</h3>
</dt>
<dt><strong>Público alvo</strong></dt>
<dd>Desenvolvedores e testadores, gerentes de projeto, executivos, entusiastas e iniciantes em métodos ágeis, quem mais tiver interesse!</p>
</dd>
<dt><strong>Resumo</strong></dt>
<dd>Começamos o ano de 2010 com um desafio: reverter o cenário de baixa produtividade e desmotivação da equipe que estava pairando no ar. Após várias discussões entre as pessoas chave da equipe bolamos um plano e entramos de cabeça em um projeto de agile adoption. Este trabalho mostra os principais resultados e dificuldades deste processo.</p>
</dd>
<dt><strong>Descrição completa</strong></dt>
<dd>No final de 2009, iniciamos uma reforma na unidade de Campo Grande da Agence. Literalmente o teto caiu e passamos grandes dificuldades com a chuva diária no chão do escritório. A reforma está construindo um segundo andar na nossa sede, mas como todos sabemos, não é nada agradável “morar” em uma casa em reforma.</p>
<p>Além disso, nossa equipe estava pecando no quesito qualidade e prazo em alguns projetos, o que gerou um descrédito por parte da diretoria da empresa. No final do ano, tivemos o desligamento de 3 profissionais, além da insatisfação com as dificuldades no ambiente de trabalho e projetos.</p>
<p>Nesse contexto, reunimos as pessoas chave da equipe e após várias discussões bolamos um plano para adotar desenvolvimento ágil como uma forma de motivação da equipe e melhoria no produto desenvolvido.</p>
<p>O plano abrange 6 meses a começar a partir de janeiro de 2010 e têm metas bastante agressivas que envolve várias mudanças na forma de trabalho, além de sessões semanais de treinamento (tech thursday) e vários finais de semana dedicados à estudos.</p>
<p>A proposta deste trabalho é mostrar nossa experiência na adoção de métodos ágeis em uma equipe de 20 pessoas que trabalha com vários tipos diferentes de projetos: novos sistemas, manutenção e pesquisa &amp; desenvolvimento.</p>
<p>O plano prevê adoção da técnica pomodoro, SCRUM, Behavior Driven Development (BDD), Domain Driven Design (DDD) e Programação em Pares. Ufa! Continuamos com a mão na massa e já estamos colhendo resultados desse trabalho e gostaríamos muito de compartilhar essas experiências com a comunidade.</p>
</dd>
<dt><strong>Mecânica/Processo</strong></dt>
<dd>Apresentação de slides seguindo a Agenda abaixo:<br />
- Como estávamos no final de 2009?<br />
- Qual nosso plano?<br />
- 1º mês: Pomodoro<br />
- 2º mês: Scrum<br />
- 3º mês: Behavior Driven Development<br />
- 4º mês: Domain Driven Design<br />
- 5º mês: Pair Programming<br />
- 6º mês: E agora?<br />
- Conclusões e resultados</p>
</dd>
<dt><strong>Benefícios</strong></dt>
<dd>Durante esses 6 meses de projeto, estamos publicando vários artigos, no blog da empresa e individuais, com o objetivo de trocar idéias e mostrar como estamos buscando melhorar nossa forma de trabalho. Acredito na importância da apresentação dessas experiências em um evento dedicado ao assunto, que permitirá excelente troca de idéias com pessoas que também tem os mesmos interesses</p>
</dd>
<dt><strong>Experiência com o assunto</strong></dt>
<dd>Venho estudando métodos ágeis há pelo menos 3 anos e já aplicando algumas práticas na Agence, que tem um processo mais próximo do “OpenUP”. Já ministrei treinamentos em diversas áreas sempre divulgando métodos ágeis e pregando boas práticas de engenharia e já dei consultoria em algumas empresas para MPS nas áreas de gerenciamento de projetos e requisitos, baseado nos modelos MPS.br e CMMi.</p>
</dd>
]]></content:encoded>
			<wfw:commentRss>http://www.sauloarruda.eti.br/2010/02/proposta-para-o-agile-brazil-2010/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Transformar string separada por vírgula em Array</title>
		<link>http://www.sauloarruda.eti.br/2010/02/transformar-string-separada-por-virgula-em-array/</link>
		<comments>http://www.sauloarruda.eti.br/2010/02/transformar-string-separada-por-virgula-em-array/#comments</comments>
		<pubDate>Wed, 24 Feb 2010 17:45:37 +0000</pubDate>
		<dc:creator>sauloarruda</dc:creator>
				<category><![CDATA[Drops]]></category>
		<category><![CDATA[Receitas]]></category>
		<category><![CDATA[Ruby on Rails]]></category>
		<category><![CDATA[ActiveRecord]]></category>
		<category><![CDATA[auto-complete]]></category>
		<category><![CDATA[Domain Driven Design]]></category>
		<category><![CDATA[github]]></category>
		<category><![CDATA[Libres]]></category>
		<category><![CDATA[Receita]]></category>

		<guid isPermaLink="false">http://www.sauloarruda.eti.br/?p=261</guid>
		<description><![CDATA[Estou trabalhando em uma prova de conceito usando Rails e me deparei com uma situação muito comum no dia-a-dia de desenvolvedores: Implementar um auto-complete que no banco de dados refere-se a um relacionamento has_and_belongs_to_many. No meu caso, a tela se parece com algo assim:

Nesse exemplo, o campo Authors permite que conforme você vá digitando, ele [...]]]></description>
			<content:encoded><![CDATA[<p>Estou trabalhando em uma prova de conceito usando Rails e me deparei com uma situação muito comum no dia-a-dia de desenvolvedores: Implementar um auto-complete que no banco de dados refere-se a um relacionamento <code>has_and_belongs_to_many</code>. No meu caso, a tela se parece com algo assim:</p>
<p><a href="http://www.sauloarruda.eti.br/wp-content/uploads/2010/02/Captura-de-tela-2010-02-24-às-13.06.12.jpg"><img class="alignnone size-full wp-image-264" title="new_books" src="http://www.sauloarruda.eti.br/wp-content/uploads/2010/02/Captura-de-tela-2010-02-24-às-13.06.12.jpg" alt="" width="428" height="219" /></a></p>
<p>Nesse exemplo, o campo Authors permite que conforme você vá digitando, ele abre sugestões de autores já cadastrados no banco de dados. Permite também que você separe vários autores por vírgula e cadastra os autores que não existem ainda no banco de dados.</p>
<p>A implementação do controller nesse caso, usa o componente <a href="http://wiki.github.com/madrobby/scriptaculous/autocompleter-local" target="_blank"><code>Autocomplete.Local</code></a> do <a href="http://wiki.github.com/madrobby/scriptaculous/" target="_blank">Script.aculo.us</a> que não é muito complicado de ser usado e inclusive já vem de brinde com o Rails. Se você quer saber mais detalhes sobre isso, dá uma olhada no arquivo <a href="http://github.com/sauloarruda/libres/blob/article-part2/app/views/books/_authors.html.erb" target="_blank">app/views/books/_authors.html.erb</a>.  O que vejo ser mais complicado nesse exemplo é a implementação do model Book que deve ter uma lista de autores.</p>
<p>Neste momento você deve estar se perguntando: Mas não tem nada complicado nisso! Eu simplesmente vou receber um parâmetro <code>param[:book][:authors_s]</code> e chamar o método <code>split(",")</code> para obter um <code>array</code> de nomes de autores e chamar o método <code>Author.find_or_create_by_name(author_name)</code> para criá-lo.</p>
<p>E eu respondo: Exatamente! Sua solução está perfeita. Mas tenho uma pequena pergunta: Onde esse código será colocado? [  ] Na classe <code>books_controller</code> no método <code>create</code>. [  ] Na classe <code>book</code>.</p>
<p>Tendenciosa minha pergunta, não? Se você pensar um pouco e lembrar das palestras sobre MVC na hora você responde &#8220;Na classe book&#8221;. Mas o primeiro instinto é implementar no controller, inclusive já vi centenas de códigos em Rails cometendo exatamente esse erro. Lógica de negócio deve ficar em objeto de negócio (ou de domínio se você preferir) e não no controller.</p>
<p>Logo, no nosso caso, o código da classe Book ficaria algo parecido com isso (repare que o campo Tags, logo abaixo do campo Authors, tem o mesmo comportamento):</p>
<p><script src="http://pastie.org/842144.js"></script> O objetivo do código acima é permitir que um objeto da classe Book seja instanciado no controller desta forma:    <script src="http://pastie.org/840809.js"></script></p>
<p>Vamos dissecar um pouco mais o código:</p>
<ul>
<li>Na <a href="http://github.com/sauloarruda/libres/blob/article-part2/app/views/books/_authors.html.erb" target="_blank">view</a>, fazemos um bind para o atributo book.authors_s, que é uma representação string do objeto authors criada por nós: <code>&lt;%= f.text_field :authors_s %&gt;</code>. Logo, o parâmetro <code>params[:book][:authors_s]</code> no exemplo seria <code>"Kent Beck, Martin Fowler"</code>.</li>
<li>Declarar o atributo authors com o comando: <code>has_and_belongs_to_many :authors, :join_table =&gt; "books_authors"</code> permite que a classe receba um array de objetos da classe <code>Author</code> como o parâmetro <code>:authors</code>. Logo, temos que converter o atributo authors_s para o atributo authors, lembrando da necessidade de gravar os autores novos no banco de dados.</li>
<li>Para resolver esse problema, implementei alguns callbacks:</li>
<li> O primeiro no método before_save que faz o algoritmo que falamos anteriormente (<code>split + find_or_create_by_name</code>). Desta forma, os autores novos só serão gravados caso o objeto book seja válido (before_save só é chamado após a validação).</li>
<li>O segundo no método after_find que carrega o atributo authors_s com os valores do atributo author. Desta forma, permite a edição de livros.</li>
</ul>
<p>Naturalmente é possível fazer algumas melhorias no código, mas a idéia que gostaria de apresentar é essa. Sinta-se à vontade para <a href="http://github.com/sauloarruda/libres/tree/article-part2" target="_blank">baixar o código completo no githut</a> e deixar seus comentários/dúvidas/sugestões/críticas abaixo.</p>
<p><strong>Updated 25/02</strong>: Meu amigo e co-worker Rodrigo Toledo me deu várias dicas sobre como este exemplo pode ser implementado, inclusive resolvendo alguns bugs que ficaram pra trás. Resumo das alterações:</p>
<ul>
<li>Retiramos o controller &#8220;autocomplete_controller&#8221; incluindo a lógica no helper e simplesmente imprimindo um json na view para auto completar os campos tags e authors.</li>
<li>Alteramos a lógica do model book.rb para usar os callbacks after_find e before_save para fazer o bind da string separada por vírgulas para um array.</li>
<li>Pequena alteração para não usar eval no método Book.array_to_string conforme o comentário.</li>
</ul>
<p>Todo o código já está comitado no github e já fiz as alterações nos pasties mostrados no artigo.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.sauloarruda.eti.br/2010/02/transformar-string-separada-por-virgula-em-array/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Uso correto da Técnica Pomodoro</title>
		<link>http://www.sauloarruda.eti.br/2010/02/uso-correto-da-tecnica-pomodoro/</link>
		<comments>http://www.sauloarruda.eti.br/2010/02/uso-correto-da-tecnica-pomodoro/#comments</comments>
		<pubDate>Wed, 24 Feb 2010 01:49:59 +0000</pubDate>
		<dc:creator>sauloarruda</dc:creator>
				<category><![CDATA[Agile]]></category>
		<category><![CDATA[Drops]]></category>
		<category><![CDATA[Agence]]></category>
		<category><![CDATA[InfoQ]]></category>
		<category><![CDATA[Lucas Souza]]></category>
		<category><![CDATA[Pomodoro]]></category>
		<category><![CDATA[Produtividade]]></category>

		<guid isPermaLink="false">http://www.sauloarruda.eti.br/?p=253</guid>
		<description><![CDATA[Há alguns dias postei sobre o uso da Técnica Pomodoro na Agence. Hoje o Lucas Souza iniciou uma discussão no InfoQ sobre o &#8220;mérito&#8221; do uso da técnica para troca de idéias dos entusiastas e dos céticos. Estamos participando, vejo vocês lá!
]]></description>
			<content:encoded><![CDATA[<p>Há alguns dias postei sobre o <a href="http://www.sauloarruda.eti.br/2010/02/tecnica-pomodoro/">uso da Técnica Pomodoro na Agence</a>. Hoje o <a href="http://twitter.com/lucasas" target="_blank">Lucas Souza</a> iniciou uma <a href="http://www.infoq.com/br/news/2010/02/pomodoro-technique-correto" target="_blank">discussão no InfoQ sobre o &#8220;mérito&#8221; do uso da técnica</a> para troca de idéias dos entusiastas e dos céticos. Estamos participando, vejo vocês lá!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.sauloarruda.eti.br/2010/02/uso-correto-da-tecnica-pomodoro/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Problema com Webrat e Mechanize 1.0.0</title>
		<link>http://www.sauloarruda.eti.br/2010/02/problema-com-webrat-e-mechanize-1-0-0/</link>
		<comments>http://www.sauloarruda.eti.br/2010/02/problema-com-webrat-e-mechanize-1-0-0/#comments</comments>
		<pubDate>Thu, 18 Feb 2010 19:15:45 +0000</pubDate>
		<dc:creator>sauloarruda</dc:creator>
				<category><![CDATA[Bugs]]></category>
		<category><![CDATA[Drops]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Ruby on Rails]]></category>
		<category><![CDATA[BDD]]></category>
		<category><![CDATA[CakePHP]]></category>
		<category><![CDATA[Cucumber]]></category>
		<category><![CDATA[Mechanize]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[Teste de Software]]></category>
		<category><![CDATA[Webrat]]></category>

		<guid isPermaLink="false">http://www.sauloarruda.eti.br/?p=244</guid>
		<description><![CDATA[Estou trabalhando com uma prova de conceito usando Webrat e Cucumber para testes de aplicações CakePHP (em breve renderá um artigo) e me deparei com o seguinte problema:
Quando rodo os testes usando o comando &#8220;cucumber&#8221; recebia a seguinte warning:
!!!!! DEPRECATION NOTICE !!!!!
The WWW constant is deprecated, please switch to the new top-level Mechanize
constant.  WWW [...]]]></description>
			<content:encoded><![CDATA[<p>Estou trabalhando com uma prova de conceito usando <a href="http://github.com/brynary/webrat" target="_blank">Webrat</a> e <a href="http://cukes.info/" target="_blank">Cucumber</a> para testes de aplicações <a href="http://cakephp.org/" target="_blank">CakePHP</a> (em breve renderá um artigo) e me deparei com o seguinte problema:</p>
<p>Quando rodo os testes usando o comando &#8220;<strong>cucumber</strong>&#8221; recebia a seguinte warning:</p>
<p><code>!!!!! DEPRECATION NOTICE !!!!!<br />
The WWW constant is deprecated, please switch to the new top-level Mechanize<br />
constant.  WWW will be removed in Mechanize version 2.0</code></p>
<p><code>You've referenced the WWW constant from /opt/local/lib/ruby/gems/1.8/gems/webrat-0.7.0/lib/webrat/adapters/mechanize.rb:43:in `mechanize', please<br />
switch the "WWW" to "Mechanize".  Thanks!</code></p>
<p><code>Sincerely,</p>
<p></code></p>
<p><code>Pew Pew Pew</code></p>
<p>Consultando o <a href="http://mechanize.rubyforge.org/mechanize/CHANGELOG_rdoc.html" target="_blank">changelog do Mechanize</a>, a versão 1.0.0 deprecia o uso do módulo WWW, que ainda não foi atualizado no Webrat. Para resolver o problema basta instalar a versão anterior do Mechanize (0.9.0) usando o comando:<br />
<code><br />
sudo gem install mechanize --version '= 0.9.0'<br />
</code><br />
E dizendo no arquivo env.rb para usar a versão 0.9.0 conforme abaixo:<br />
<code><br />
require 'rubygems'<br />
gem 'mechanize', '= 0.9.0'<br />
</code></p>
]]></content:encoded>
			<wfw:commentRss>http://www.sauloarruda.eti.br/2010/02/problema-com-webrat-e-mechanize-1-0-0/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Testes funcionais com Cucumber e Selenium</title>
		<link>http://www.sauloarruda.eti.br/2010/02/testes-funcionais-com-cucumber-e-selenium/</link>
		<comments>http://www.sauloarruda.eti.br/2010/02/testes-funcionais-com-cucumber-e-selenium/#comments</comments>
		<pubDate>Wed, 10 Feb 2010 17:38:46 +0000</pubDate>
		<dc:creator>sauloarruda</dc:creator>
				<category><![CDATA[Agile]]></category>
		<category><![CDATA[Artigos]]></category>
		<category><![CDATA[Ruby on Rails]]></category>
		<category><![CDATA[BDD]]></category>
		<category><![CDATA[Cássio Marques]]></category>
		<category><![CDATA[Cucumber]]></category>
		<category><![CDATA[eXtreme Programming]]></category>
		<category><![CDATA[Jefferson Girão]]></category>
		<category><![CDATA[MacOS]]></category>
		<category><![CDATA[RSpec]]></category>
		<category><![CDATA[Selenium]]></category>
		<category><![CDATA[TDD]]></category>
		<category><![CDATA[Teste de Software]]></category>
		<category><![CDATA[Urubatan]]></category>

		<guid isPermaLink="false">http://www.sauloarruda.eti.br/?p=217</guid>
		<description><![CDATA[Venho estudando um framework para Behavioral Driven Development chamado Cucumber e me impressionado com a facilidade e clareza que a atividade de implementar testes automatizados vem se tornando. Para quem quiser saber mais sobre Cucumber, antes mesmo de continuar essa leitura, recomendo consultar esses links:

http://miud.in/1zU: Série de artigos sobre Cucumber. Muito bem elaborado!
http://miud.in/1zS: Artigo introdutório [...]]]></description>
			<content:encoded><![CDATA[<p>Venho estudando um framework para <a href="http://behaviour-driven.org" target="_blank">Behavioral Driven Development</a> chamado <a href="http://miud.in/1zQ" target="_blank">Cucumber</a> e me impressionado com a facilidade e clareza que a atividade de implementar testes automatizados vem se tornando. Para quem quiser saber mais sobre Cucumber, antes mesmo de continuar essa leitura, recomendo consultar esses links:</p>
<ul>
<li><a href="http://miud.in/1zU" target="_blank">http://miud.in/1zU</a>: Série de artigos sobre Cucumber. Muito bem elaborado!</li>
<li><a href="http://miud.in/1zS" target="_blank">http://miud.in/1zS</a>: Artigo introdutório do Urubatan.</li>
<li><a href="http://miud.in/1zR" target="_blank">http://miud.in/1zR</a>: Introdução sobre Cucumber para testes funcionais (usando o webrat).</li>
<li><a href="http://miud.in/1zQ" target="_blank">http://miud.in/1zQ</a>: Site oficial, tem vários exemplos mas a documentação não é bem organizada.</li>
<li><a href="http://miud.in/1zP" target="_blank">http://miud.in/1zP</a>: Como integrar o Cucumber com o Selenium.</li>
<li><a href="http://miud.in/1zT" target="_blank">http://miud.in/1zT</a>: Livro &#8211; The RSpec Book: Behaviour Driven Development with RSpec, Cucumber, and Friends &#8211; tem vários capítulos sobre Cucumber</li>
<li><a href="http://miud.in/1Kc" target="_blank">http://miud.in/1Kc</a>: Artigo bastante simples que usa Webrat para testar aplicação PHP.</li>
</ul>
<p>O foco deste, é apresentar minha experiência em usar o Cucumber integrado com o Selenium e mostrar um exemplo de como é simples implementar testes funcionais. Para começar, leia essa documentação que explica como <a href="http://miud.in/1zP" target="_blank">configurar seu ambiente</a>. Se você usa MacOS Snow Leopard (10.5) deve passar pelos mesmos problemas que eu tive e que encontrei a solução <a href="http://www.mail-archive.com/mac@porting.openoffice.org/msg03502.html" target="_blank">neste link</a>.</p>
<p>A idéia central é escrever estórias para teste de telas (caixa preta). Disponibilizei no <a href="http://github.com/sauloarruda/cucumber-selenium" target="_blank">github</a> o código-fonte da aplicação em Rails que está sendo testada e de outra aplicação, somente Ruby, usando Cucumber + Selenium. Para demonstrar o uso do Selenium, escolhi um cenário bastante simples, trata-se de um história de autenticação de usuários:</p>
<p><script src="http://pastie.org/816719.js"></script> Perceba que nos preocupamos em escrever a história o mais &#8220;<em>User Friendly</em>&#8221; possível. Isso facilita bastante o entendimento sobre o que você está de fato testando e o que o seu usuário (ou cliente) acha que você deveria testar.  E, como você já deve saber, as palavras-chave &#8220;dado&#8221;, &#8220;quando&#8221; e &#8220;então&#8221; representam ações que são implementadas em Ruby. Para começar, configuramos no arquivo <strong>support/env.rb</strong> o ambiente da API para Selenium em Ruby criando uma instância da classe <a href="http://selenium.rubyforge.org/rdoc/classes/Selenium/SeleniumDriver.html" target="_blank">Selenium::SeleniumDriver</a>.     <script src="http://pastie.org/818547.js"></script></p>
<p>No arquivo <strong>support/paths.rb</strong> configuramos o mapeamento de nome de páginas para URIs e também de label de campos para o nome do campo no formulário HTML. Os métodos path_to, field_for e button_for fazem essas funções.</p>
<p><script src="http://pastie.org/818553.js"></script> OK, concordo com vocês que essas funções não fazem lá muita coisa, mas lembre-se que estamos fazendo o nosso primeiro caso de teste, tenha certeza que serão úteis no futuro próximo. Um exemplo que eu já posso citar foram os testes que implementamos para testar uma aplicação, na verdade um portal, desenvolvido em Drupal, onde o &#8220;label&#8221; dos campos não era nem um pouco parecido com o nome (do componente HTML) do campo. Lembrando que as histórias tem de ficar o mais próximo possível da taxonomia (ou idioma) do seu usuário.</p>
<p>Agora, vamos à parte que interessa, de fato a implementação dos passos descritos nas estórias. Criei o arquivo <strong>step_definitions/common_steps.rb</strong> contendo os passos mais comuns que você deverá usar na maioria de suas estórias. Para passos específicos de determinada história, recomenda-se criar um outro arquivo no diretório step_definitions com o nome da estória.  <script src="http://pastie.org/818575.js"></script></p>
<p>O exemplo é bastante simples, e a aplicação Rails do github contém uma implementação bastante simples do que está sendo testado. Para executar, basta usar o comando &#8220;cucumber&#8221; na raiz do projeto de testes. Lembrando que você deve iniciar o servidor do Selenium usando o comando &#8220;selenium&#8221; (isso funcionou pra mim após instalar o Selenium RC).</p>
<p>Se você tiver dúvidas ou problemas na execução do exemplo, fique à vontade de postar nos comentários que farei o possível para tentar ajudar. E, por hora ficamos por aqui. Em breve devo postar alguns exemplos de passos mais complexos como uso de tabelas e/ou editores ricos. Estamos trabalhando nisso agora!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.sauloarruda.eti.br/2010/02/testes-funcionais-com-cucumber-e-selenium/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Técnica Pomodoro</title>
		<link>http://www.sauloarruda.eti.br/2010/02/tecnica-pomodoro/</link>
		<comments>http://www.sauloarruda.eti.br/2010/02/tecnica-pomodoro/#comments</comments>
		<pubDate>Fri, 05 Feb 2010 21:34:04 +0000</pubDate>
		<dc:creator>sauloarruda</dc:creator>
				<category><![CDATA[Drops]]></category>
		<category><![CDATA[Agence]]></category>
		<category><![CDATA[Agile]]></category>
		<category><![CDATA[Gestão]]></category>
		<category><![CDATA[Gráfico de Controle]]></category>
		<category><![CDATA[Pomodoro]]></category>
		<category><![CDATA[Produtividade]]></category>
		<category><![CDATA[Scrum]]></category>
		<category><![CDATA[Slideshare]]></category>
		<category><![CDATA[Treinamento]]></category>

		<guid isPermaLink="false">http://www.sauloarruda.eti.br/?p=213</guid>
		<description><![CDATA[Há mais ou menos duas semanas temos usado na Agence a técnica Pomodoro. Como vocês já devem saber, a técnica objetiva aumento da produtividade para trabalhos que exigem esforço intelectual, ou, em outras palavras, para quem usa a cabeça. Serve como uma luva para estudo e desenvolvimento de software!
O princípio básico da técnica é dedicar [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.sauloarruda.eti.br/wp-content/uploads/2010/02/pomodoro.jpg"><img class="size-medium wp-image-214 alignleft" title="pomodoro" src="http://www.sauloarruda.eti.br/wp-content/uploads/2010/02/pomodoro-300x249.jpg" alt="" width="300" height="249" /></a>Há mais ou menos duas semanas temos usado na Agence a <a href="http://www.pomodorotechnique.com" target="_blank">técnica Pomodoro</a>. Como vocês já devem saber, a técnica objetiva aumento da produtividade para trabalhos que exigem esforço intelectual, ou, em outras palavras, para quem usa a cabeça. Serve como uma luva para estudo e desenvolvimento de software!</p>
<p>O princípio básico da técnica é dedicar 25 minutos de puro trabalho com 5 minutos de descanso. Isso é o que se chama 1 (um) &#8220;Pomodoro&#8221;. Após 4 Pomodoros você faz uma pausa maior. A apresentação que usei para apresentar a técnica aqui na Agence está disponível no <a href="http://www.slideshare.net/sauloarruda/pomodoro-technique" target="_blank">slideshare</a>. Além disso, tem um livro gratuito escrito pelo autor da técnica, <a href="http://cirillosscrapbook.wordpress.com/" target="_blank">Francesco Cirillo</a>.</p>
<p>Nossa experiência até o momento tem sido bastante produtiva. Estamos usando <a href="http://img.efetividade.net/img/ficha-3x5.jpg" target="_blank">fichas pautadas</a> 4&#8221; x 6&#8221; para registrar diariamente e no fim da semana o estagiário lança as atividades em um sistema que ele mesmo fez. Estamos trabalhando em alguns relatórios para avaliar, principalmente, a constância da equipe. Provavelmente usaremos um <a href="http://papogp.wordpress.com/tag/grafico-de-controle/" target="_blank">gráfico de controle</a> pra isso.</p>
<p>Por enquanto é isso que temos a dizer. Assim que as coisas começarem a fazer mais sentido pra gente, vou postando aqui as experiências.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.sauloarruda.eti.br/2010/02/tecnica-pomodoro/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Palestra: Java no Mundo Real, em Coxim/MS</title>
		<link>http://www.sauloarruda.eti.br/2009/11/palestra-java-no-mundo-real-em-coximms/</link>
		<comments>http://www.sauloarruda.eti.br/2009/11/palestra-java-no-mundo-real-em-coximms/#comments</comments>
		<pubDate>Tue, 10 Nov 2009 19:58:24 +0000</pubDate>
		<dc:creator>sauloarruda</dc:creator>
				<category><![CDATA[Drops]]></category>
		<category><![CDATA[Eventos]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Palestras]]></category>
		<category><![CDATA[Coxim]]></category>
		<category><![CDATA[CPCX]]></category>
		<category><![CDATA[Mato Grosso do Sul]]></category>
		<category><![CDATA[UFMS]]></category>

		<guid isPermaLink="false">http://www.sauloarruda.eti.br/?p=204</guid>
		<description><![CDATA[Ontem estive em Coxim/MS a convite da UFMS para ministrar uma palestra falando de mercado Java na Semana de Sistemas de Informação. Apesar da viagem ter sido um pouco cansativa fiquei bastante satisfeito com a recepção e com a participação dos alunos, que fizeram várias perguntas de grande relevância.
Após a palestra participei de uma mesa [...]]]></description>
			<content:encoded><![CDATA[<p>Ontem estive em Coxim/MS a convite da UFMS para ministrar uma palestra falando de mercado Java na <a href="http://www.cpcx.ufms.br/semanasi2009" target="_blank">Semana de Sistemas de Informação</a>. Apesar da viagem ter sido um pouco cansativa fiquei bastante satisfeito com a recepção e com a participação dos alunos, que fizeram várias perguntas de grande relevância.</p>
<p>Após a palestra participei de uma mesa redonda com os professores Karen, Alfredo e Jane para discussão de temas relacionado a tecnologia e como os alunos podem escolher suas especialidades após formados e entrar no mercado de trabalho.</p>
<p>Parabéns ao pessoal da organização e bom restante de semana de sistemas da informação para os alunos!</p>
<p>Updated in 18/11: Fotos disponíveis em <a href="http://www.cpcx.ufms.br/semanasi2009/?page_id=120" target="_blank">http://www.cpcx.ufms.br/semanasi2009/?page_id=120</a>.</p>
<p>PS: Coloquei os slides no SlideShare abaixo para consultas aos links, downloads, etc.</p>
<div style="width: 425px; text-align: left;"><a style="font:14px Helvetica,Arial,Sans-serif;display:block;margin:12px 0 3px 0;text-decoration:underline;" title="Java No Mundo Real" href="http://www.slideshare.net/sauloarruda/java-no-mundo-real">Java No Mundo Real</a><object style="margin:0px" classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="425" height="355" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="allowFullScreen" value="true" /><param name="allowScriptAccess" value="always" /><param name="src" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=javanomundoreal-091110133103-phpapp02&amp;rel=0&amp;stripped_title=java-no-mundo-real" /><param name="allowfullscreen" value="true" /><embed style="margin:0px" type="application/x-shockwave-flash" width="425" height="355" src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=javanomundoreal-091110133103-phpapp02&amp;rel=0&amp;stripped_title=java-no-mundo-real" allowscriptaccess="always" allowfullscreen="true"></embed></object></div>
<div id="__ss_2468359" style="width: 425px; text-align: left;">
<div style="font-size: 11px; font-family: tahoma,arial; height: 26px; padding-top: 2px;">View more <a style="text-decoration:underline;" href="http://www.slideshare.net/">presentations</a> from <a style="text-decoration:underline;" href="http://www.slideshare.net/sauloarruda">Saulo Arruda</a>.</div>
</div>
]]></content:encoded>
			<wfw:commentRss>http://www.sauloarruda.eti.br/2009/11/palestra-java-no-mundo-real-em-coximms/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
