<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet href="http://feeds.feedburner.com/~d/styles/rss2full.xsl" type="text/xsl" media="screen"?><?xml-stylesheet href="http://feeds.feedburner.com/~d/styles/itemcontent.css" type="text/css" media="screen"?><rss 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:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">

<channel>
	<title>Cairo'sBlog</title>
	
	<link>http://www.caironoleto.com</link>
	<description>Mais um blog sobre tecnologia ...</description>
	<pubDate>Mon, 17 Nov 2008 17:20:16 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.5.1</generator>
	<language>en</language>
			<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" href="http://feeds.feedburner.com/caironoleto" type="application/rss+xml" /><item>
		<title>Tradução: Refatorando seu código legado - Parte 1: No início houve…</title>
		<link>http://feeds.feedburner.com/~r/caironoleto/~3/456173071/</link>
		<comments>http://www.caironoleto.com/2008/11/17/traducao-refatorando-seu-codigo-legado-parte-1-no-inicio-houve/#comments</comments>
		<pubDate>Mon, 17 Nov 2008 16:58:11 +0000</pubDate>
		<dc:creator>Cairo Noleto</dc:creator>
		
		<category><![CDATA[PHP]]></category>

		<category><![CDATA[TDD]]></category>

		<category><![CDATA[Traduções]]></category>

		<category><![CDATA[Desenvolvimento Guiado por Testes]]></category>

		<category><![CDATA[Desenvolvimento Orientado a Testes]]></category>

		<category><![CDATA[Refactoring]]></category>

		<category><![CDATA[Refatoração]]></category>

		<category><![CDATA[Selenium]]></category>

		<category><![CDATA[Test-Driven Development]]></category>

		<category><![CDATA[Testes]]></category>

		<category><![CDATA[Tradução]]></category>

		<guid isPermaLink="false">http://www.caironoleto.com/?p=135</guid>
		<description><![CDATA[Este artigo é uma tradução do artigo Refactoring your legacy code - Part One: In the beginning there was&#8230;, caso você encontre erros de português, concordância, tem algum comentário ou agradecimento, FAÇA! É como um amigo meu sempre fala, se você ver alguma coisa errada, conserte!
Lars Jankowfsky é desenvolvedor PHP e participou da International PHP [...]]]></description>
			<content:encoded><![CDATA[<p>Este artigo é uma tradução do artigo <a title="Refactoring your legacy code - Part One: In the beginning there was..." href="http://www.frontalaufprall.com/2008/10/15/refactoring-your-legacy-code-part-one-in-the-beginning-there-was/#comment-338" target="_blank">Refactoring your legacy code - Part One: In the beginning there was&#8230;</a>, caso você encontre erros de português, concordância, tem algum comentário ou agradecimento, FAÇA! É como um amigo meu sempre fala, se você ver alguma coisa errada, conserte!</p>
<p>Lars Jankowfsky é desenvolvedor PHP e participou da International PHP Conference 2008. Ele possui o <a href="http://www.frontalaufprall.com/">Frontalaufpral</a> onde ele fala sobre PHP, Agile Development e outros assuntos.</p>
<p>Deixa de papo e vamos a tradução!</p>
<h3>Refatorando seu código legado - Parte Um: No início houve&#8230;</h3>
<p>Como prometido, <a href="http://tomas.liubinas.com/" target="_blank">Tomas</a> e <a title="Lars Jankowfsky" href="http://www.frontalaufprall.com" target="_blank">eu</a> iremos procurar mostrar uma visão sobre o que você precisa considerar quando você planejar refatorar suas velhas (legadas) aplicações. Não será um guia detalhado nem muito ordenado. Será mais ou menos nossas experiências e pensamentos nos últimos anos.</p>
<p>Se você precisa de uma introdução mais detalhada (incluindo a nível de código) você deve participar de nosso workshop na <a href="http://it-republik.de/php/phpconference/">Internation PHP Conference 2008</a>. Eu irei ministrar o workshop juntamente com dois dos melhores programadores PHP (Johann Peter Hartmann e <a href="http://www.thorsten-rinne.de/" target="_blank">Thorsten Rinne</a>), você pode esperar muito mais detalhes.</p>
<p>Com certeza eu irei publicar a apresentação após o IPC - mas não antes ;)</p>
<p>Agora - Refatorando, hmm&#8230; Refatorar é, por definição, o meio de modificar (limpando) sem alterar o comportamento. Mas como você pode ter certeza que não está mudando o comportamento se você não está fazendo testes? Isto significa - você só pode refatorar um código se ele possui testes. E é aqui que começa o problema - onde está os testes?</p>
<p>E lá vamos nós. Vamos assumir que você possui um grande projeto - que cresceu durante anos. E agora você está na sorte que seu chefe concorda com você sobre a necessidade dos testes. Mas como iniciar? O time não possui experiência escrevendo testes. Pior ainda, nem sabem o que é Test Driven Development.</p>
<p>Você precisará investir um tempo no time para que eles aprendam como escrever testes. E você experimentará que <strong>conhecer</strong> e <strong>compreender</strong> são duas coisas diferentes. Na minha opinião, somente uma coisa pode ser comparada. A diferença entre programação procedural e orientada a objetos. Estranho exemplo? Não.</p>
<p>Deixe-me explicar. É muito fácil pegar um livro e aprender um pouco sobre classes, objetos, etc. Mas somente depois de você usar por um tempo é que você entenderá profundamente o conceito de OOP e buscar o bom senso. O mesmo é para o TDD - escrever testes é mais ou menos questão de minutos. Ou digamos horas se for o seu primeiro teste. Mas entender por quê os testes são importantes e como usá-los. Isto precisa de tempo. E você terá que investir esse tempo.</p>
<p>Depois de eu ter empurrado o time dentro desta direção ( e ei! - isto não foi tão fácil, como muitos desenvolvedores tendem a ser mais conservadores), eles fizeram os testes - simplesmente por quê o chefe disse isso. Mas somente poucas semanas depois, um desenvolvedor disse-me &#8220;Ei! Testes são legais! Eu encontrei um bug, eu nunca teria encontrado antes&#8221;. Este é o ponto que você precisa para o seu time.</p>
<p>Um pouco mais de teoria. Mas o que dizer dos testes? Por onde começar? Essa resposta é fácil. Você precisa começar com o mais sórdido, mais sujo, e maior arquivo que você pode achar no seu projeto. Eu sei, Eu sei. Eles querem começar com os arquivos mais fáceis, onde os testes são feitos rapidamente e você ver algum progresso. Os desenvolvedores realmente terão medo deste arquivo. Mas o que vai acontecer se você iniciar pelos fáceis? Simples - você verá algum progresso e terá a sensação que as coisas estão tudo bem. Seu time não entenderá os testes completamente - e eles deixam as partes mais sórdidas do código para o final. Você tem que ter forças para resolver os demônios logo no começo. Isso vai demorar um pouco. Mas então você pode ter certeza que o restante vai ser um bom e delicioso pedaço de bolo. De outro modo, você irá mover o parte do risco para o fim do período de refatoração -  e isto não é uma boa idéia.</p>
<p>Você poderia pensar &#8220;Esse cara é louco, onde está o problema em escrever testes&#8230;?&#8221; Ei! Nós estamos falando de velho código crescido ( == espaguete ). Este código é massivamente interconectado. Variáveis globais, classes mistas, selvagens chamadas entre módulos e objetos, etc. É muito difícil escrever testes para isto.</p>
<p>Na verdade, enquanto estiver escrevendo testes você notará que precisa refatorar o código. Você simplesmente tem que refatorar. Pois de outra forma você não pode escrever os testes. Ou - vamos ser honesto - você pode. Se você escrever mocks e stubs que é o triplo do tamanho do seu código. Isto é exatamente o que desenvolvedores sem experiência com TDD irão fazer. Se você ver isso - chutem eles! E em seguida novamente, por que a sensação é muito boa ;).</p>
<p>Cada teste leva ao refatoramento. Como o nó górdio (<a title="Gordian Knot" href="http://en.wikipedia.org/wiki/Gordian_Knot" target="_blank">Vejam no wikipedia</a>) você começará a puxar o worm, e irá puxar, puxar e puxar. E após algum tempo a refatoração estará pronta e o primeiro teste pode ser escrito. Ok, só estava brincando. Mas há alguma verdade nesta afirmação. Você precisa refatorar o código primeiro - então escrever o teste. Sem grandes stubs.</p>
<p>E isto será trabalhoso - especialmente no início, onde tudo está interconectado. E algumas dependencias precisam ser abordadas e resolvidas. Primeiro. Separe o modelo da visão. Na visão, deixe sem lógica - somente I/O. E então teste o modelo. Algumas pessoas até mesmo testam as visões com testes unitários. Eu não. Eu prefiro testar o modelo, com pequenas visões sem lógica e deixar o resto para os testes com selenium.</p>
<p>O sórdido. Leva tempo. Muito trabalho. Mas acredite em mim. Não há outra forma.</p>
<p>Durante a leitura, você pode ficar com a idéia de que você vai fugir com os testes de aceitação. (selenium). Você acha que isso é um bom negócio? A idéia é sensacional. Se você escrever testes do selenium para toda a aplicação - então refatorar - e você não quebrar nenhum teste, você pode ter certeza que você não alterou qualquer funcionalidade. Boa ideia? Não vai funcionar. Desculpe</p>
<p>Lembre-se. Eu estou falando de uma grande aplicação que cresceu. Ela terá toneladas de funcionalidades. Isto significa centenas ou milhares de testes. E estes testes podem durar muito. Eu sei disso. Eu fui até esta estrada - e ela é uma estrada de mão uníca. Nós terminamos com um teste completo rodando por 10 horas. Isso não é desenvolvimento guiado a testes. Para fazer isso que você precisa instantaneamente - instantaneamente - de feedback. Ninguém pode trabalhar assim.</p>
<p>Contínua na parte dois.</p>
<p>Essa foi a primeira parte do artigo. Mais uma vez, espero que vocês gostem. Qualquer dúvida entre em contato! Não deixe de me passar seu feedback.</p>

<p><a href="http://feeds.feedburner.com/~a/caironoleto?a=HUl0oD"><img src="http://feeds.feedburner.com/~a/caironoleto?i=HUl0oD" border="0"></img></a></p><img src="http://feeds.feedburner.com/~r/caironoleto/~4/456173071" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.caironoleto.com/2008/11/17/traducao-refatorando-seu-codigo-legado-parte-1-no-inicio-houve/feed/</wfw:commentRss>
		<feedburner:origLink>http://www.caironoleto.com/2008/11/17/traducao-refatorando-seu-codigo-legado-parte-1-no-inicio-houve/</feedburner:origLink></item>
		<item>
		<title>Mídias alternativas - A vida além dos 30 segundos</title>
		<link>http://feeds.feedburner.com/~r/caironoleto/~3/455497109/</link>
		<comments>http://www.caironoleto.com/2008/11/16/midias-alternativas-a-vida-alem-dos-30-segundos/#comments</comments>
		<pubDate>Mon, 17 Nov 2008 02:54:14 +0000</pubDate>
		<dc:creator>Cairo Noleto</dc:creator>
		
		<category><![CDATA[Sem categoria]]></category>

		<guid isPermaLink="false">http://www.caironoleto.com/?p=148</guid>
		<description><![CDATA[Esse foi o tema da mesa redonda na semana de comunicação da faculdade CEUT. Estava lá eu ( :P ), Thiago Emérito, Igor Drey e Itallo Victor.
Bom, eu falei um pouco sobre minha experiência com a Web 2.0 e como você pode utiliza-la para lucro (não apenas para diversão).
Eu já esperava que a maior parte [...]]]></description>
			<content:encoded><![CDATA[<p>Esse foi o tema da mesa redonda na semana de comunicação da <a title="Semana de Comunicação" href="http://www.ceut.com.br/semanadecomunicacao.asp">faculdade CEUT</a>. Estava lá eu ( :P ), <a title="Thiago Emérito" href="http://twitter.com/thiagoemerito" target="_blank">Thiago Emérito</a>, <a title="Igor Drey" href="http://www.meionorte.com/igordrey" target="_blank">Igor Drey</a> e <a title="Bloco de notas" href="http://itallo.wordpress.com/" target="_blank">Itallo Victor</a>.</p>
<p>Bom, eu falei um pouco sobre minha experiência com a Web 2.0 e como você pode utiliza-la para lucro (não apenas para diversão).</p>
<p>Eu já esperava que a maior parte do tempo nós quatro falaríamos e que em algumas partes quem estava lá, iria contribuir, mas eu não esperava que seriam umas quatro pessoas (de mais de 40). A impressão que eu tive é que essas pessoas ainda não entraram de cabeça dentro do novo mundo, ou que ainda não tiveram o interesse necessário para fazer esse tipo de coisa.</p>
<p>Uma coisa que eu sempre falo para todos é que vocês devem estar atentos as mudanças mundiais, acompanhar bolsa de valores, política, novas tecnologias, enfim, se manter atualizado frente ao mundo. Fazendo isso você está preparado para qualquer desafio, independente da sua área de atuação.</p>
<p>Bom, eu queria ter colocado algumas fotos aqui, mas ainda não achei nenhuma. Queria agradecer a todos que participaram e contribuiram para a mesa redonda, agradecer a <a title="Add4 Comunicação" href="http://www.add4.com.br" target="_blank">Add4 Comunicação</a> e a todos que fazem e fizeram parte de tudo.</p>

<p><a href="http://feeds.feedburner.com/~a/caironoleto?a=W0B2jv"><img src="http://feeds.feedburner.com/~a/caironoleto?i=W0B2jv" border="0"></img></a></p><img src="http://feeds.feedburner.com/~r/caironoleto/~4/455497109" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.caironoleto.com/2008/11/16/midias-alternativas-a-vida-alem-dos-30-segundos/feed/</wfw:commentRss>
		<feedburner:origLink>http://www.caironoleto.com/2008/11/16/midias-alternativas-a-vida-alem-dos-30-segundos/</feedburner:origLink></item>
		<item>
		<title>Tradução: Rails Database Migrations - Parte IV</title>
		<link>http://feeds.feedburner.com/~r/caironoleto/~3/450940463/</link>
		<comments>http://www.caironoleto.com/2008/11/12/traducao-rails-database-migrations-parte-iv/#comments</comments>
		<pubDate>Wed, 12 Nov 2008 17:59:46 +0000</pubDate>
		<dc:creator>Cairo Noleto</dc:creator>
		
		<category><![CDATA[Rails]]></category>

		<category><![CDATA[Ruby]]></category>

		<category><![CDATA[Traduções]]></category>

		<category><![CDATA[Migrações]]></category>

		<category><![CDATA[Migrations]]></category>

		<category><![CDATA[rails]]></category>

		<category><![CDATA[Ruby on Rails]]></category>

		<category><![CDATA[RubyOnRails]]></category>

		<guid isPermaLink="false">http://www.caironoleto.com/?p=146</guid>
		<description><![CDATA[Esta é a última parte da tradução do guia sobre Rails Database Migrations. Espero que vocês gostem, agora irei partir para tradução de mais guias :) Mais uma vez, dúvidas, erros de português, tradução com sentido diferente, por favor, me comuniquem!! Podem me mandar email (caironoleto NOT SPAM at gmail dot com ), pelo twitter [...]]]></description>
			<content:encoded><![CDATA[<p>Esta é a última parte da tradução do <a title="Rails Database Migrations" href="http://guide.rails.info/migrations.html">guia sobre Rails Database Migrations</a>. Espero que vocês gostem, agora irei partir para tradução de mais guias :) Mais uma vez, dúvidas, erros de português, tradução com sentido diferente, por favor, me comuniquem!! Podem me mandar email (caironoleto NOT SPAM at gmail dot com ), pelo twitter (@caironoleto) ou pela seção de contato ou pelo Gtalk, msn, skype, enfim, me comuniquem!!</p>
<p><a title="Rails Database Migrations - Parte I" href="http://www.caironoleto.com/2008/09/23/traducao-rails-database-migrations-parte-i/" target="_self">Rails Database Migration - Parte I</a></p>
<p><a title="Rails Database Migrations - Parte II" href="http://www.caironoleto.com/2008/10/20/traducao-rails-database-migrations-parte-ii-2/" target="_self">Rails Database Migration - Parte II</a></p>
<p><a title="Rails Database Migrations - Parte III" href="http://www.caironoleto.com/2008/11/04/traducao-rails-database-migrations-parte-3/" target="_self">Rails Database Migration - Parte III</a></p>
<h3>6. Armazenando esquemas e você</h3>
<h3>6.1 Quais são os arquivos do esquema?</h3>
<p>Migrações, poderosas como são, não são fontes autorizada para o esquema do seu banco de dados. Esse papel cabe ao <tt>schema.rb</tt> ou ao um arquivo SQL gerado pelo Active Record através da análise do banco de dados. Este arquivo não foi projetado para ser editado, ele é uma representação do estado atual do banco de dados.</p>
<p>Não é necessário (e isto é um erro propenso) para implantar uma nova instancia de uma aplicação repetindo o histórico inteiro da migração. É mais simples e rápido apenas carregar dentro do banco de dados a descrição do esquema atual.</p>
<p>Por exemplo, esta é a forma de como o banco de dados de testes é criado: o banco de dados atual de desenvolvimento é excluído (tanto para o <tt>schema.rb</tt> ou para <tt>development.sql</tt>) e então carregado dentro do banco de dados de teste.</p>
<p>Arquivos de esquema também são uteis se deseja olhar rapidamente quais atributos o objeto do Active Record possui. Estas informações não está no código do modelo e frequentemente está espalhado pelas várias migrações mas está resumido no arquivo de esquema. O plugin <a href="http://agilewebdevelopment.com/plugins/annotate_models" target="_blank">annotate_models</a>, adiciona automaticamente cada (e atualiza) um dos comentários no início de cada modelo resumindo o esquema, que pode ser de seu interesse.</p>
<h3>6.2 Formas de armazenar o esquema</h3>
<p>Existe duas formas de armazenar o esquema. Uma é setar em <tt>config/environment.rb</tt> atribuindo o <tt>config.active_record.schema_format</tt>, que pode ser <tt>:sql</tt> ou <tt>:ruby</tt>.</p>
<p>Se <tt>:ruby</tt> é selecionada então o esquema será armazenado em <tt>db/schema.rb</tt>. Se você olhar este arquivo você verá que não encontrará um pouco mais do que uma grande migração:</p>
<pre><tt><tt>ActiveRecord<span style="color: #990000;">::</span>Schema<span style="color: #990000;">.</span>define<span style="color: #990000;">(:</span>version <span style="color: #990000;">=&gt;</span> <span style="color: #993399;">20080906171750</span><span style="color: #990000;">)</span> <span style="font-weight: bold;"><span style="color: #0000ff;">do</span></span>
  create_table <span style="color: #ff0000;">&#8220;authors&#8221;</span><span style="color: #990000;">,</span> <span style="color: #990000;">:</span>force <span style="color: #990000;">=&gt;</span> <span style="font-weight: bold;"><span style="color: #0000ff;">true</span></span> <span style="font-weight: bold;"><span style="color: #0000ff;">do</span></span> <span style="color: #990000;">|</span>t<span style="color: #990000;">|</span>
    t<span style="color: #990000;">.</span>string   <span style="color: #ff0000;">&#8220;name&#8221;</span>
    t<span style="color: #990000;">.</span>datetime <span style="color: #ff0000;">&#8220;created_at&#8221;</span>
    t<span style="color: #990000;">.</span>datetime <span style="color: #ff0000;">&#8220;updated_at&#8221;</span>
  <span style="font-weight: bold;"><span style="color: #0000ff;">end</span></span>

  create_table <span style="color: #ff0000;">&#8220;products&#8221;</span><span style="color: #990000;">,</span> <span style="color: #990000;">:</span>force <span style="color: #990000;">=&gt;</span> <span style="font-weight: bold;"><span style="color: #0000ff;">true</span></span> <span style="font-weight: bold;"><span style="color: #0000ff;">do</span></span> <span style="color: #990000;">|</span>t<span style="color: #990000;">|</span>
    t<span style="color: #990000;">.</span>string   <span style="color: #ff0000;">&#8220;name&#8221;</span>
    t<span style="color: #990000;">.</span>text     <span style="color: #ff0000;">&#8220;description&#8221;</span>
    t<span style="color: #990000;">.</span>datetime <span style="color: #ff0000;">&#8220;created_at&#8221;</span>
    t<span style="color: #990000;">.</span>datetime <span style="color: #ff0000;">&#8220;updated_at&#8221;</span>
    t<span style="color: #990000;">.</span>string   <span style="color: #ff0000;">&#8220;part_number&#8221;</span>
  <span style="font-weight: bold;"><span style="color: #0000ff;">end</span></span>
<span style="font-weight: bold;"><span style="color: #0000ff;">end</span></span></tt></tt></pre>
<p>De muitas formas é exatamente isso. Este arquivo é criado pela examinação do banco de dados e expressado em estruturas usando <tt>create_table</tt>, <tt>add_index</tt> e assim por diante. Por causa da independência do banco de dados ele deve carregar dentro de qualquer banco de dados que o Active Record suporta. Isso poderia ser muito útil se você quiser distribuir a aplicação para rodar em vários banco de dados.</p>
<p>Existe porém uma desvantagem: <tt>schema.rb</tt> não expressa itens específicos de banco de dados como constraints de chaves estrangeiras, triggers ou stored procedures. Enquanto na migração você pode executar SQL customizadas, o esquema armazenado não pode reconstituir essas atribuições do banco de dados. Se você usar recursos como este, então você deve atribuir o esquema para <tt>:sql</tt>.</p>
<p>Em vez de usar o esquema de armazenamento do Active Record a estrutura será armazenada usando uma ferramenta específica do banco de dados (pela tarefa rake <tt>db:structure:dump</tt>) dentro de <tt>db/#\{RAILS_ENV\}_structure.sql</tt>. Por exemplo para o PostgreSQL a utilidade <tt>pg_dump</tt> é usada e para o MySQL este arquivo irá conter a saída de SHOW CREATE TABLE para as várias tabelas. Carregando este esquema é uma simples questão de executar as declarações SQL contida dentro.</p>
<p>Por definição irá fazer uma copia perfeita da estrutura do banco de dados mas isso vai impedir o carregamento do esquema dentro de outros banco de dados que não seja um dos utilizados para criá-lo.</p>
<h3>6.3 Armazenamento de esquema e controle de código</h3>
<p>Por causa da autoridade do código do seu esquema de banco de dados, é altamente recomendado que você verifique dentro de seu controle de código.</p>
<h3>7. Active Record e Integridade Referencial</h3>
<p>O Active Record é a maneira inteligente de permanecer em seus modelos, não no banco de dados. Alguns recursos como triggers ou constraints de chaves estrangeiras, que empurra alguma inteligência de volta para os banco de dados não são muito usados.</p>
<p>Validações como <tt>validates_uniqueness_of</tt> é uma forma de seus modelos podem valer a integridade dos dados. A opção <tt>:dependent</tt> em associações adiciona aos modelos automaticamente destruir os objetos filhos que seus pais são destruídos. Como tudo que funciona a nível de aplicação, estes não podem garantir integridade referencial e algumas pessoas aumentam com constraints de chaves estrangeiras.</p>
<p>Apesar de o Active Record não fornecer todas as ferramentas para trabalhar diretamente com todos os recursos, o método <tt>execute</tt> pode ser usado para executar SQL arbitrárias. Há também uma série de plugins como <a href="http://agilewebdevelopment.com/plugins/search?search=redhillonrails" target="_blank">redhillonrails</a> que adicionam suporte a chaves estrangeiras para o Active Record (incluindo suporte para destruir chaves estrangeiras no <tt>schema.rb</tt>)</p>

<p><a href="http://feeds.feedburner.com/~a/caironoleto?a=q6mGDj"><img src="http://feeds.feedburner.com/~a/caironoleto?i=q6mGDj" border="0"></img></a></p><img src="http://feeds.feedburner.com/~r/caironoleto/~4/450940463" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.caironoleto.com/2008/11/12/traducao-rails-database-migrations-parte-iv/feed/</wfw:commentRss>
		<feedburner:origLink>http://www.caironoleto.com/2008/11/12/traducao-rails-database-migrations-parte-iv/</feedburner:origLink></item>
		<item>
		<title>Mesa redonda hoje!</title>
		<link>http://feeds.feedburner.com/~r/caironoleto/~3/450595205/</link>
		<comments>http://www.caironoleto.com/2008/11/12/mesa-redonda-hoje/#comments</comments>
		<pubDate>Wed, 12 Nov 2008 11:25:07 +0000</pubDate>
		<dc:creator>Cairo Noleto</dc:creator>
		
		<category><![CDATA[Carreira]]></category>

		<category><![CDATA[Ceut]]></category>

		<category><![CDATA[Comunicação]]></category>

		<category><![CDATA[Marketing]]></category>

		<category><![CDATA[Mesa Redonda]]></category>

		<category><![CDATA[Mídias Alternativas]]></category>

		<category><![CDATA[Palestra]]></category>

		<category><![CDATA[Palestras]]></category>

		<category><![CDATA[Propaganda]]></category>

		<guid isPermaLink="false">http://www.caironoleto.com/?p=147</guid>
		<description><![CDATA[Olá, fui convidado para participar de uma mesa redonda na semana de comunicação da faculdade CEUT.
O assunto da mesa será Mídias Alternativas - vida                                [...]]]></description>
			<content:encoded><![CDATA[<p>Olá, fui convidado para participar de uma mesa redonda na <a title="Semana de Comunicação" href="http://www.ceut.com.br/semanadecomunicacao.asp" target="_blank">semana de comunicação</a> da <a title="Faculdade CEUT" href="http://www.ceut.com.br" target="_blank">faculdade CEUT</a>.</p>
<p>O assunto da mesa será <span style="color: #000000;"><strong>Mídias Alternativas - vida                                                além dos 30 segundos</strong>. Falaremos sobre como a internet pode ajudar a aumentar suas iniciativas de marketing e de como ela pode ser altamente lucrativa.</span></p>
<p>Vou falar sobre alguns cases que considero bastante interessantes, vai ser uma ótima experiência. Então se você está querendo um local agradavél com uma conversa boa é só aparecer lá às 17:00 no horário de verão brasileiro :P</p>

<p><a href="http://feeds.feedburner.com/~a/caironoleto?a=ncEvjl"><img src="http://feeds.feedburner.com/~a/caironoleto?i=ncEvjl" border="0"></img></a></p><img src="http://feeds.feedburner.com/~r/caironoleto/~4/450595205" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.caironoleto.com/2008/11/12/mesa-redonda-hoje/feed/</wfw:commentRss>
		<feedburner:origLink>http://www.caironoleto.com/2008/11/12/mesa-redonda-hoje/</feedburner:origLink></item>
		<item>
		<title>Cake: Codeigniter mAKE!</title>
		<link>http://feeds.feedburner.com/~r/caironoleto/~3/444546631/</link>
		<comments>http://www.caironoleto.com/2008/11/06/cake-codeigniter-make/#comments</comments>
		<pubDate>Thu, 06 Nov 2008 16:49:37 +0000</pubDate>
		<dc:creator>Cairo Noleto</dc:creator>
		
		<category><![CDATA[CodeIgniter]]></category>

		<category><![CDATA[PHP]]></category>

		<category><![CDATA[cake]]></category>

		<category><![CDATA[cakePHP]]></category>

		<guid isPermaLink="false">http://www.caironoleto.com/?p=145</guid>
		<description><![CDATA[Olá, hoje eu lancei o cake e primeiramente, não, não é nada relacionado ao cake PHP. Ele tem esse nome por que é um acrônimo de CodeIgniter mAKE.
Mas o que ele faz?
Ele aumenta a velocidade para você trabalhar com CodeIgniter. Ele tem a mesma funcionalidade dos scripts/generate do Ruby On Rails, apenas criando uma estrutura [...]]]></description>
			<content:encoded><![CDATA[<p>Olá, hoje eu lancei o <a title="cake" href="http://github.com/caironoleto/cake/tree/master" target="_blank">cake</a> e primeiramente, não, não é nada relacionado ao <a title="Cake PHP" href="http://cakephp.org/" target="_blank">cake PHP</a>. Ele tem esse nome por que é um acrônimo de <a title="CodeIgniter" href="http://www.codeigniter.com" target="_blank"><strong>C</strong>odeIgniter</a> m<strong>AKE</strong>.</p>
<h3>Mas o que ele faz?</h3>
<p>Ele aumenta a velocidade para você trabalhar com CodeIgniter. Ele tem a mesma funcionalidade dos scripts/generate do Ruby On Rails, apenas criando uma estrutura para seu projeto CodeIgniter.</p>
<p>Ele cria magicamente controllers, views e models.</p>
<h3>E o que ele gera?</h3>
<p>Bom, no momento ele está gerando controllers e models, e com um aperitivo a mais, ele está gerando também as views passada como parâmetro para gerar os controllers.</p>
<p>Outra coisa ele está o seguindo padrão <strong>nomeController.php</strong> e o nome da classe como <strong>NomeController</strong>, para os models está criando as classes como <strong>nome.php</strong> e <strong>Nome</strong>.</p>
<p>As views estão sendo geradas em <strong>nome_controller/</strong> com o sufixo <strong>_view.php</strong>, algo como <strong>nome_controller/index_view.php</strong>.</p>
<p>Ele é verboso, então ele vai dizendo o que está sendo feito a cada passo.</p>
<h3>Como faço pra usar?!</h3>
<p>Eu escrevi um <a title="Read ME!" href="http://github.com/caironoleto/cake/tree/master/README.mkdn">Read Me</a> bem simples, assim mesmo para quem não está muito bem no inglês possa entender.</p>
<h3>O que eu espero para o futuro?</h3>
<p>Atualmente só tem suporte ao linux e ao macOS, então quem se interessar em portar para funcionar no windows, fique a vontade ;) (Os scripts que geram os arquivos estão em php então independe de OS para funcionar, o que falta é o script funciona no windows, que se não me engano é necessário fazer os bats e configurar a PATH, isso é quase a solução :).</p>
<p>Bom, primeiramente vou ajustar para também gerar rotas padrões para cada controller.</p>
<p>Depois vou adicionar opções como nomenclaturas diferentes.</p>
<p>Vou adicionar também um suporte para gerar os testes para controllers e models.</p>
<p>E gostaria de incluir a opção de baixar a versão mais nova do CodeIgniter e criar a estrutura do projeto, algo como <strong>cake &#8211;app nomeDaApp</strong> e <strong>cake &#8211;update</strong>.</p>
<p>O projeto está sobre licença <a title="Creative Commons" href="http://creativecommons.org/licenses/by/3.0/legalcode" target="_blank">Creative Commons 3.0</a>, você pode usar comercialmente, modificar e distribuir, apenas mantendo meus créditos!</p>
<p>e o mais importante: <strong>VOCÊ PODE CONTRIBUIR</strong>, só ir lá no github, fazer um git clone e depois me mandar um pull request ou um patch :P</p>
<p>Até a próxima!</p>

<p><a href="http://feeds.feedburner.com/~a/caironoleto?a=XhXQvl"><img src="http://feeds.feedburner.com/~a/caironoleto?i=XhXQvl" border="0"></img></a></p><img src="http://feeds.feedburner.com/~r/caironoleto/~4/444546631" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.caironoleto.com/2008/11/06/cake-codeigniter-make/feed/</wfw:commentRss>
		<feedburner:origLink>http://www.caironoleto.com/2008/11/06/cake-codeigniter-make/</feedburner:origLink></item>
		<item>
		<title>Namespaces em PHP e a confusão!</title>
		<link>http://feeds.feedburner.com/~r/caironoleto/~3/443169391/</link>
		<comments>http://www.caironoleto.com/2008/11/05/namespaces-em-php-e-a-confusao/#comments</comments>
		<pubDate>Wed, 05 Nov 2008 12:07:31 +0000</pubDate>
		<dc:creator>Cairo Noleto</dc:creator>
		
		<category><![CDATA[PHP]]></category>

		<category><![CDATA[Namespace]]></category>

		<guid isPermaLink="false">http://www.caironoleto.com/?p=144</guid>
		<description><![CDATA[A semana passada foi movimentada no PHP. Para quem ainda não sabe Namespaces é a forma conveniente de agrupar e distribuir bibliotecas, para quem já programa em Java são os velhos pacotes e quem programa em ruby são os módulos.
E só agora o PHP está querendo colocar no seu Core o uso de namespaces, que [...]]]></description>
			<content:encoded><![CDATA[<p>A semana passada foi movimentada no PHP. Para quem ainda não sabe Namespaces é a forma conveniente de agrupar e distribuir bibliotecas, para quem já programa em Java são os velhos pacotes e quem programa em ruby são os módulos.</p>
<p>E só agora o PHP está querendo colocar no seu Core o uso de namespaces, que vai ser uma boa forma de programar, adicionando mais paradigmas legais em PHP.</p>
<p>Mas a grande confusão que se teve na semana passada, foi sobre a forma de requisitar os Namespaces.</p>
<p>No início, seu uso seria com 3 dois pontos ( ::: ), depois mudaram para 2 dois pontos ( :: ) e viram que haveria conflito com chamadas estáticas e por fim decidiram o uso de uma barra invertida ( \ ), como por exemplo:</p>
<p style="padding-left: 30px;">MeuNameSpace:::metodo();</p>
<p style="padding-left: 30px;">MeuNameSpace::metodo();</p>
<p style="padding-left: 30px;">MeuNameSpace\metodo();</p>
<p>Mas com isso surgiu vários problemas como poder ser facilmente trocado por \, \ é usada para escapar strings entre outros problemas. <a href="http://wiki.php.net/rfc/backslashnamespaces" target="_blank">Aqui</a> você pode ver com detalhes a discussão sobre NameSpaces.</p>
<p>Depois de toda essa discussão, quem já estava querendo no próximo release utilizar namespaces, pode ir tirando o cavalinho da chuva :P</p>
<p>Agora é aguardar e observar as próximas decisões do CoreTeam do PHP.</p>

<p><a href="http://feeds.feedburner.com/~a/caironoleto?a=idircw"><img src="http://feeds.feedburner.com/~a/caironoleto?i=idircw" border="0"></img></a></p><img src="http://feeds.feedburner.com/~r/caironoleto/~4/443169391" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.caironoleto.com/2008/11/05/namespaces-em-php-e-a-confusao/feed/</wfw:commentRss>
		<feedburner:origLink>http://www.caironoleto.com/2008/11/05/namespaces-em-php-e-a-confusao/</feedburner:origLink></item>
		<item>
		<title>Tradução: Rails Database Migrations - Parte III</title>
		<link>http://feeds.feedburner.com/~r/caironoleto/~3/442020011/</link>
		<comments>http://www.caironoleto.com/2008/11/04/traducao-rails-database-migrations-parte-3/#comments</comments>
		<pubDate>Tue, 04 Nov 2008 11:52:47 +0000</pubDate>
		<dc:creator>Cairo Noleto</dc:creator>
		
		<category><![CDATA[Rails]]></category>

		<category><![CDATA[Ruby]]></category>

		<category><![CDATA[Traduções]]></category>

		<category><![CDATA[Migrações]]></category>

		<category><![CDATA[Migrations]]></category>

		<category><![CDATA[rails]]></category>

		<category><![CDATA[Ruby on Rails]]></category>

		<category><![CDATA[RubyOnRails]]></category>

		<guid isPermaLink="false">http://www.caironoleto.com/?p=139</guid>
		<description><![CDATA[Esta é a terceira parte da tradução do artigo Rails Database Migrations. Mais uma vez, antes de desfrutarem da leitura, quero dizer-lhes que se encontrar erros de português ou a tradução com sentido diferente, por favor, comuniquem-me! Avisem-me por email, twitter (@caironoleto), ou qualquer mensageiro!! :P
Rails Database Migrations - Parte I
Rails Database Migrations - Parte [...]]]></description>
			<content:encoded><![CDATA[<p>Esta é a terceira parte da tradução do artigo Rails Database Migrations. Mais uma vez, antes de desfrutarem da leitura, quero dizer-lhes que se encontrar erros de português ou a tradução com sentido diferente, por favor, <strong>comuniquem-me!</strong> Avisem-me por email, twitter (@caironoleto), ou qualquer mensageiro!! :P</p>
<p><a title="Rails Database Migrations - Parte I" href="../2008/09/23/traducao-rails-database-migrations-parte-i/" target="_self">Rails Database Migrations - Parte I</a></p>
<p><a title="Rails Database Migrations - Parte II" href="http://www.caironoleto.com/2008/10/20/traducao-rails-database-migrations-parte-ii-2/" target="_self">Rails Database Migrations - Parte II</a></p>
<h3>4. Rodando migrações</h3>
<p>Rails fornece um conjunto de tarefas rake para trabalhar com as migrações, que se resume em rodar alguns conjuntos de migrações. A tarefa rake mais relatada que você provavelmente usará é <tt>db:migrate</tt>. Na sua forma mais básica certamente rodará o método <tt>up</tt> para todas as migrações que ainda não foram rodadas. Se não existir migrações ele sai.</p>
<p>Se você especificar uma migração, o Active Record irá rodar as migrações requeridas (up ou down) até que ela tenha chegado nessa versão específica. A versão é o prefixo numérico do nome de uma migração. Por exemplo para migrar até a versão 20080906120000 execute</p>
<pre><tt>rake db:migrate VERSION=20080906120000</tt></pre>
<p>Se a versão for maior do que a versão corrente (ou seja, está migrando para cima) irá rodar o método <tt>up</tt> de em todas as migrações acima e incluindo a versão 20080906120000, se a migração for para baixo, então será executado os métodos <tt>down</tt> de todas as migrações para baixo até, mas não incluindo, 20080906120000.</p>
<h3>4.1 Reversão</h3>
<p>Uma tarefa comum é regressar a última migração, por exemplo, se você cometeu um engano e deseja corrigi-lo. Ao invés de monitorar o método down com a migração anterior, você pode rodar</p>
<pre><tt>rake db:rollback</tt></pre>
<p>Isso irá rodar o método down da migração mais recente. Se você precisa se desfazer de várias migrações, você pode fornecer o parâmetro <tt>STEP</tt>:</p>
<pre><tt>rake db:rollback STEP=3</tt></pre>
<p>irá rodar o método <tt>down</tt> das 3 últimas migrações.</p>
<p>A tarefa <tt>db:migrate:redo</tt> é um atalho para fazer uma reversão e a migração de volta. Assim como na tarefa <tt>db:rollback</tt> você pode usar o parâmetro <tt>STEP</tt> se você precisar voltar em mais de uma versão, por exemplo</p>
<pre><tt>rake db:migrate:redo STEP=3</tt></pre>
<p>Nenhuma dessas tarefas Rake fazem qualquer coisa que você não poderia fazer com <tt>db:migrate</tt>, são simplesmente mais convenientes, desde que você não precise especificar explicitamente de uma migração para outra.</p>
<p>Finalmente, a tarefa <tt>db:reset</tt> irá destruir sua base de dados, recria-la e carregar o schema atual dentro dela.</p>
<h3>4.2 Especificando uma migração</h3>
<p>Se você precisa especificar uma migração para cima ou para baixo, as tarefas <tt>db:migrate:up</tt> e <tt>db:migrate:down</tt> irão fazer isso. Basta especificar a versão apropriada e a migração correspondente e terá seu método <tt>up</tt> ou <tt>down</tt> invocado, por exemplo</p>
<pre><tt>rake db:migrate:up VERSION=20080906120000</tt></pre>
<p>irá rodar o método <tt>up</tt> da migração 20080906120000. Estas tarefas checa se a migração já tenha sido executada, se por exemplo <tt>db:migrate:up VERSION=20080906120000</tt> não irá fazer nada se o Active Record acreditar que 20080906120000 já tenha sido executada.</p>
<h3>4.3 Sendo comunicativo</h3>
<p>Por padrão, as migrações falam exatamente o que elas estão fazendo e o tempo de duração. Uma migração criando uma tabela e adicionando um index produz uma saída como esta</p>
<pre><tt>== 20080906170109 CreateProducts: migrating ===================================
&#8211; create_table(:products)
   -&gt; 0.0021s
&#8211; add_index(:products, :name)
   -&gt; 0.0026s
== 20080906170109 CreateProducts: migrated (0.0059s) ==========================</tt></pre>
<p>Vários método fornecem para você o controle tudo isto:</p>
<ul>
<li><tt>suppress_messages</tt> suprime qualquer mensagem gerada pelo bloco</li>
<li><tt>say</tt> saída de texto (o segundo argumento controle se é recortado ou não)</li>
<li><tt>say_with_time</tt> saída de texto com o tempo utilizado pelos blocos. Se o bloco retornar um inteiro, assume-se que este é o número de linhas afetadas.</li>
</ul>
<p>Por exemplo, esta migração</p>
<pre><tt><span style="font-weight: bold;"><span style="color: #0000ff;">class</span></span> CreateProducts <span style="color: #990000;">&lt;</span> ActiveRecord<span style="color: #990000;">::</span>Migration
  <span style="font-weight: bold;"><span style="color: #0000ff;">def</span></span> <span style="font-weight: bold;"><span style="color: #0000ff;">self</span></span><span style="color: #990000;">.</span>up
    suppress_messages <span style="font-weight: bold;"><span style="color: #0000ff;">do</span></span>
      create_table <span style="color: #990000;">:</span>products <span style="font-weight: bold;"><span style="color: #0000ff;">do</span></span> <span style="color: #990000;">|</span>t<span style="color: #990000;">|</span>
        t<span style="color: #990000;">.</span>string <span style="color: #990000;">:</span>name
        t<span style="color: #990000;">.</span>text <span style="color: #990000;">:</span>description
        t<span style="color: #990000;">.</span>timestamps
      <span style="font-weight: bold;"><span style="color: #0000ff;">end</span></span>
    <span style="font-weight: bold;"><span style="color: #0000ff;">end</span></span>
    say <span style="color: #ff0000;">&#8220;Created a table&#8221;</span>
    suppress_messages <span style="color: #ff0000;">{</span>add_index <span style="color: #990000;">:</span>products<span style="color: #990000;">,</span> <span style="color: #990000;">:</span>name<span style="color: #ff0000;">}</span>
    say <span style="color: #ff0000;">&#8220;and an index!&#8221;</span><span style="color: #990000;">,</span> <span style="font-weight: bold;"><span style="color: #0000ff;">true</span></span>
    say_with_time <span style="color: #ff0000;">&#8216;Waiting for a while&#8217;</span> <span style="font-weight: bold;"><span style="color: #0000ff;">do</span></span>
      sleep <span style="color: #993399;">10</span>
      <span style="color: #993399;">250</span>
    <span style="font-weight: bold;"><span style="color: #0000ff;">end</span></span>
  <span style="font-weight: bold;"><span style="color: #0000ff;">end</span></span>

  <span style="font-weight: bold;"><span style="color: #0000ff;">def</span></span> <span style="font-weight: bold;"><span style="color: #0000ff;">self</span></span><span style="color: #990000;">.</span>down
    drop_table <span style="color: #990000;">:</span>products
  <span style="font-weight: bold;"><span style="color: #0000ff;">end</span></span>
<span style="font-weight: bold;"><span style="color: #0000ff;">end</span></span></tt></pre>
<p>gera a seguinte saída</p>
<pre><tt>== 20080906170109 CreateProducts: migrating ===================================
&#8211; Created a table
   -&gt; and an index!
&#8211; Waiting for a while
   -&gt; 10.0001s
   -&gt; 250 rows
== 20080906170109 CreateProducts: migrated (10.0097s) =========================</tt></pre>
<p>Se você quiser que o Active Record mantenha-se em silêncio, então execute <tt>rake db:migrate VERBOSE=false</tt> irá suprimir qualquer saída.</p>
<h3>5. Usando Models nas suas migrações</h3>
<p>Ao criar ou atualizar dados na sua migração, muitas vezes, é tentador utilizar um de seus models. Afinal eles existem para fornecer acesso fácil nos dados subjacentes. Isto pode ser feito mas um certo cuidado devem ser observados.</p>
<p>Considere por exemplo a migração que usa o modelo Product para atualizar a linha na tabela correspondente. Alice depois atualiza o modelo Product, adicionando uma nova coluna e uma validação. Bobs volta do feriado, atualiza o código e roda as migrações pendentes com <tt>rake db:migrate</tt>, incluindo o modelo que é utilizado para o Product. Quando o código é atualizado e só então o modelo Product possui a atualização adicionada pela Alice. O banco de dados entretanto não é atualizado e assim não possui a coluna e então gerará um erro, por que a validação para esta coluna ainda não existe.</p>
<p>Frequentemente eu preciso atualizar as linhas no banco de dados sem escrever SQL pelas minhas mãos. Eu não estou usando qualquer especialidade do modelo. Um padrão para isso é definir uma cópia do modelo dentro da própria migração, por exemplo</p>
<pre><tt><span style="font-weight: bold;"><span style="color: #0000ff;">class</span></span> AddPartNumberToProducts <span style="color: #990000;">&lt;</span> ActiveRecord<span style="color: #990000;">::</span>Migration
  <span style="font-weight: bold;"><span style="color: #0000ff;">class</span></span> Product <span style="color: #990000;">&lt;</span> ActiveRecord<span style="color: #990000;">::</span>Base
  <span style="font-weight: bold;"><span style="color: #0000ff;">end</span></span>

  <span style="font-weight: bold;"><span style="color: #0000ff;">def</span></span> <span style="font-weight: bold;"><span style="color: #0000ff;">self</span></span><span style="color: #990000;">.</span>up
    <span style="color: #990000;">&#8230;</span>
  <span style="font-weight: bold;"><span style="color: #0000ff;">end</span></span>

  <span style="font-weight: bold;"><span style="color: #0000ff;">def</span></span> <span style="font-weight: bold;"><span style="color: #0000ff;">self</span></span><span style="color: #990000;">.</span>down
    <span style="color: #990000;">&#8230;</span>
  <span style="font-weight: bold;"><span style="color: #0000ff;">end</span></span>
<span style="font-weight: bold;"><span style="color: #0000ff;">end</span></span></tt></pre>
<p>A migração possuirá uma própria copia do modelo Product e não mais precisará saber sobre o modelo Product definido na própria aplicação.</p>
<h3>5.1 Lidando com as mudanças no modelo</h3>
<p>Por razões de performance, as informações sobre as colunas de um modelo é cacheada. Por exemplo, se você adicionar a coluna na tabela e tentar usar o modelo correspondente para inserir uma nova linha, ele pode tentar usar as informações antigas. Você pode forçar o Active Record para reler a informação da coluna com o método <tt>reset_column_information</tt>, por exemplo</p>
<pre><tt><span style="font-weight: bold;"><span style="color: #0000ff;">class</span></span> AddPartNumberToProducts <span style="color: #990000;">&lt;</span> ActiveRecord<span style="color: #990000;">::</span>Migration
  <span style="font-weight: bold;"><span style="color: #0000ff;">class</span></span> Product <span style="color: #990000;">&lt;</span> ActiveRecord<span style="color: #990000;">::</span>Base
  <span style="font-weight: bold;"><span style="color: #0000ff;">end</span></span>

  <span style="font-weight: bold;"><span style="color: #0000ff;">def</span></span> <span style="font-weight: bold;"><span style="color: #0000ff;">self</span></span><span style="color: #990000;">.</span>up
    add_column <span style="color: #990000;">:</span>product<span style="color: #990000;">,</span> <span style="color: #990000;">:</span>part_number<span style="color: #990000;">,</span> <span style="color: #990000;">:</span>string
    Product<span style="color: #990000;">.</span>reset_column_information
    <span style="color: #990000;">&#8230;</span>
  <span style="font-weight: bold;"><span style="color: #0000ff;">end</span></span>

  <span style="font-weight: bold;"><span style="color: #0000ff;">def</span></span> <span style="font-weight: bold;"><span style="color: #0000ff;">self</span></span><span style="color: #990000;">.</span>down
    <span style="color: #990000;">&#8230;</span>
  <span style="font-weight: bold;"><span style="color: #0000ff;">end</span></span>
<span style="font-weight: bold;"><span style="color: #0000ff;">end</span></span></tt></pre>
<p><a title="Rails Database Migrations - Parte IV" href="http://www.caironoleto.com/2008/11/12/traducao-rails-database-migrations-parte-iv/" target="_self">Continuação: Rails Database Migrations - Parte IV</a></p>

<p><a href="http://feeds.feedburner.com/~a/caironoleto?a=UqkTcZ"><img src="http://feeds.feedburner.com/~a/caironoleto?i=UqkTcZ" border="0"></img></a></p><img src="http://feeds.feedburner.com/~r/caironoleto/~4/442020011" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.caironoleto.com/2008/11/04/traducao-rails-database-migrations-parte-3/feed/</wfw:commentRss>
		<feedburner:origLink>http://www.caironoleto.com/2008/11/04/traducao-rails-database-migrations-parte-3/</feedburner:origLink></item>
		<item><title>Links for 2008-11-01 [del.icio.us]</title><link>http://feeds.feedburner.com/~r/caironoleto/~3/439658772/caironoleto</link><pubDate>Sun, 02 Nov 2008 00:00:00 -0500</pubDate><guid isPermaLink="false">http://del.icio.us/caironoleto#2008-11-01</guid><content:encoded><![CDATA[<ul>
<li><a href="http://www.slideshare.net/wycats/jquery-presentation-to-rails-developers-110063">jQuery Presentation to Rails Developers - SlideShare</a><br/>
jQuery Presentation to Rails Developers</li>
</ul><img src="http://feeds.feedburner.com/~r/caironoleto/~4/439658772" height="1" width="1"/>]]></content:encoded><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.slideshare.net/wycats/jquery-presentation-to-rails-developers-110063"&gt;jQuery Presentation to Rails Developers - SlideShare&lt;/a&gt;&lt;br/&gt;
jQuery Presentation to Rails Developers&lt;/li&gt;
&lt;/ul&gt;</description><feedburner:origLink>http://del.icio.us/caironoleto#2008-11-01</feedburner:origLink></item><item>
		<title>Caravana Add4 Comunicação para PHP Conference 2008</title>
		<link>http://feeds.feedburner.com/~r/caironoleto/~3/437172016/</link>
		<comments>http://www.caironoleto.com/2008/10/30/caravana-add4-comunicacao-para-php-conference-2008/#comments</comments>
		<pubDate>Thu, 30 Oct 2008 18:04:44 +0000</pubDate>
		<dc:creator>Cairo Noleto</dc:creator>
		
		<category><![CDATA[Dicas e Tutoriais]]></category>

		<category><![CDATA[PHP Conference]]></category>

		<category><![CDATA[phpBurn]]></category>

		<guid isPermaLink="false">http://www.caironoleto.com/?p=143</guid>
		<description><![CDATA[Agora além de ingressos, temos camisas! Sim, camisas exclusivas da Add4 Comunicação + phpBURN. Está afim?! Passe aqui e dê uma olhada sbre como você pode obter as camisas.
E não esqueçam, nos dias 27, 28 e 29 a gente se encontra, todos com as camisas da Add4 no PHP Conference :D E não perca a [...]]]></description>
			<content:encoded><![CDATA[<p>Agora além de ingressos, temos camisas! Sim, camisas exclusivas da Add4 Comunicação + phpBURN. Está afim?! Passe <a href="http://www.add4.com.br/blog/2008/10/caravana-php-conference-add4/" target="_blank">aqui</a> e dê uma olhada sbre como você pode obter as camisas.</p>
<p>E não esqueçam, nos dias 27, 28 e 29 a gente se encontra, todos com as camisas da Add4 no PHP Conference :D E não perca a nossa palestra por lá.</p>

<p><a href="http://feeds.feedburner.com/~a/caironoleto?a=HO0Ya6"><img src="http://feeds.feedburner.com/~a/caironoleto?i=HO0Ya6" border="0"></img></a></p><img src="http://feeds.feedburner.com/~r/caironoleto/~4/437172016" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.caironoleto.com/2008/10/30/caravana-add4-comunicacao-para-php-conference-2008/feed/</wfw:commentRss>
		<feedburner:origLink>http://www.caironoleto.com/2008/10/30/caravana-add4-comunicacao-para-php-conference-2008/</feedburner:origLink></item>
		<item>
		<title>phpBURN está no Twitter</title>
		<link>http://feeds.feedburner.com/~r/caironoleto/~3/436831959/</link>
		<comments>http://www.caironoleto.com/2008/10/30/phpburn-esta-no-twitter/#comments</comments>
		<pubDate>Thu, 30 Oct 2008 11:33:00 +0000</pubDate>
		<dc:creator>Cairo Noleto</dc:creator>
		
		<category><![CDATA[PHP]]></category>

		<category><![CDATA[phpBurn]]></category>

		<category><![CDATA[twitter]]></category>

		<guid isPermaLink="false">http://www.caironoleto.com/?p=141</guid>
		<description><![CDATA[Talvez em alguns dias o phpBURN ganhe vida própria! :P
Se você quiser seguir clica aqui.
]]></description>
			<content:encoded><![CDATA[<p>Talvez em alguns dias o <a title="Site oficial do phpBURN" href="http://www.phpburn.com" target="_blank">phpBURN</a> ganhe vida própria! :P</p>
<p>Se você quiser seguir <a title="Twitter PHPBurn" href="http://www.twitter.com/phpburn">clica aqui</a>.</p>

<p><a href="http://feeds.feedburner.com/~a/caironoleto?a=ECOLfF"><img src="http://feeds.feedburner.com/~a/caironoleto?i=ECOLfF" border="0"></img></a></p><img src="http://feeds.feedburner.com/~r/caironoleto/~4/436831959" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.caironoleto.com/2008/10/30/phpburn-esta-no-twitter/feed/</wfw:commentRss>
		<feedburner:origLink>http://www.caironoleto.com/2008/10/30/phpburn-esta-no-twitter/</feedburner:origLink></item>
		<item>
		<title>Notícias sobre PHPUnit</title>
		<link>http://feeds.feedburner.com/~r/caironoleto/~3/435754573/</link>
		<comments>http://www.caironoleto.com/2008/10/29/noticias-sobre-phpunit/#comments</comments>
		<pubDate>Wed, 29 Oct 2008 11:53:27 +0000</pubDate>
		<dc:creator>Cairo Noleto</dc:creator>
		
		<category><![CDATA[PHP]]></category>

		<category><![CDATA[PHPUnit]]></category>

		<guid isPermaLink="false">http://www.caironoleto.com/?p=140</guid>
		<description><![CDATA[No dia 20/10 foi lançado a versão 3.3.2 desse framework de testes.
Foram adicionados algumas funcionalidades e corrigidas vários bugs. Quem já tem instalado o PHPUnit sobre o pear, apenas faça o upgrade
sudo pear upgrade phpunit/PHPUnit
quem ainda não tem, é uma boa hora de começar a instalar ;)
]]></description>
			<content:encoded><![CDATA[<p>No dia 20/10 foi lançado a versão 3.3.2 desse framework de testes.</p>
<p>Foram adicionados algumas funcionalidades e corrigidas vários bugs. Quem já tem instalado o PHPUnit sobre o pear, apenas faça o upgrade</p>
<blockquote><p><em>sudo pear upgrade phpunit/PHPUnit</em></p></blockquote>
<p>quem ainda não tem, é uma boa hora de <a title="Instalando PHPUnit e PHPSpec no Ubuntu Linux" href="http://www.caironoleto.com/2008/08/07/instalando-phpunit-e-phpspec-no-ubuntu-linux/" target="_self">começar a instalar</a> ;)</p>

<p><a href="http://feeds.feedburner.com/~a/caironoleto?a=lybzYp"><img src="http://feeds.feedburner.com/~a/caironoleto?i=lybzYp" border="0"></img></a></p><img src="http://feeds.feedburner.com/~r/caironoleto/~4/435754573" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.caironoleto.com/2008/10/29/noticias-sobre-phpunit/feed/</wfw:commentRss>
		<feedburner:origLink>http://www.caironoleto.com/2008/10/29/noticias-sobre-phpunit/</feedburner:origLink></item>
	<item><title>Links for 2008-10-22 [del.icio.us]</title><link>http://feeds.feedburner.com/~r/caironoleto/~3/429284127/caironoleto</link><pubDate>Thu, 23 Oct 2008 00:00:00 -0500</pubDate><guid isPermaLink="false">http://del.icio.us/caironoleto#2008-10-22</guid><content:encoded><![CDATA[<ul>
<li><a href="http://tuxpepino.wordpress.com/2007/05/30/steam-y-counter-strike-en-ubuntu-linux/">Steam y Counter-Strike en Ubuntu Linux &laquo; Entre tuxes y pepinos</a><br/>
$ wine msiexec /i SteamInstall.msi</li>
</ul><img src="http://feeds.feedburner.com/~r/caironoleto/~4/429284127" height="1" width="1"/>]]></content:encoded><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="http://tuxpepino.wordpress.com/2007/05/30/steam-y-counter-strike-en-ubuntu-linux/"&gt;Steam y Counter-Strike en Ubuntu Linux &amp;laquo; Entre tuxes y pepinos&lt;/a&gt;&lt;br/&gt;
$ wine msiexec /i SteamInstall.msi&lt;/li&gt;
&lt;/ul&gt;</description><feedburner:origLink>http://del.icio.us/caironoleto#2008-10-22</feedburner:origLink></item><item><title>Links for 2008-10-13 [del.icio.us]</title><link>http://feeds.feedburner.com/~r/caironoleto/~3/420201633/caironoleto</link><pubDate>Tue, 14 Oct 2008 00:00:00 -0500</pubDate><guid isPermaLink="false">http://del.icio.us/caironoleto#2008-10-13</guid><content:encoded><![CDATA[<ul>
<li><a href="http://robwilkerson.org/2008/09/12/ignore-gits-suspicious-patch-lines/">Rob Wilkerson &raquo; Ignore Git's Suspicious Patch Lines</a><br/>
Ignore Git&#039;s Suspicious Patch Lines</li>
</ul><img src="http://feeds.feedburner.com/~r/caironoleto/~4/420201633" height="1" width="1"/>]]></content:encoded><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="http://robwilkerson.org/2008/09/12/ignore-gits-suspicious-patch-lines/"&gt;Rob Wilkerson &amp;raquo; Ignore Git's Suspicious Patch Lines&lt;/a&gt;&lt;br/&gt;
Ignore Git&amp;#039;s Suspicious Patch Lines&lt;/li&gt;
&lt;/ul&gt;</description><feedburner:origLink>http://del.icio.us/caironoleto#2008-10-13</feedburner:origLink></item><item><title>Links for 2008-09-25 [del.icio.us]</title><link>http://feeds.feedburner.com/~r/caironoleto/~3/403452632/caironoleto</link><pubDate>Fri, 26 Sep 2008 00:00:00 -0500</pubDate><guid isPermaLink="false">http://del.icio.us/caironoleto#2008-09-25</guid><content:encoded><![CDATA[<ul>
<li><a href="http://www.bencurtis.com/archives/2008/06/restful-searching-in-rails/">BenCurtis.com &raquo; RESTful searching in Rails</a><br/>
RESTful searching in Rails</li>
</ul><img src="http://feeds.feedburner.com/~r/caironoleto/~4/403452632" height="1" width="1"/>]]></content:encoded><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.bencurtis.com/archives/2008/06/restful-searching-in-rails/"&gt;BenCurtis.com &amp;raquo; RESTful searching in Rails&lt;/a&gt;&lt;br/&gt;
RESTful searching in Rails&lt;/li&gt;
&lt;/ul&gt;</description><feedburner:origLink>http://del.icio.us/caironoleto#2008-09-25</feedburner:origLink></item><item><title>Links for 2008-09-22 [del.icio.us]</title><link>http://feeds.feedburner.com/~r/caironoleto/~3/400475000/caironoleto</link><pubDate>Tue, 23 Sep 2008 00:00:00 -0500</pubDate><guid isPermaLink="false">http://del.icio.us/caironoleto#2008-09-22</guid><content:encoded><![CDATA[<ul>
<li><a href="http://blog.wolfman.com/articles/2007/07/28/rspec-testing-all-actions-of-a-controller">RSpec testing all actions of a controller</a></li>
<li><a href="http://weblog.techno-weenie.net/2007/12/26/controller-specs-are-a-drag">Controller specs are a drag -- techno weenie</a><br/>
Controller specs are a drag</li>
</ul><img src="http://feeds.feedburner.com/~r/caironoleto/~4/400475000" height="1" width="1"/>]]></content:encoded><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="http://blog.wolfman.com/articles/2007/07/28/rspec-testing-all-actions-of-a-controller"&gt;RSpec testing all actions of a controller&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://weblog.techno-weenie.net/2007/12/26/controller-specs-are-a-drag"&gt;Controller specs are a drag -- techno weenie&lt;/a&gt;&lt;br/&gt;
Controller specs are a drag&lt;/li&gt;
&lt;/ul&gt;</description><feedburner:origLink>http://del.icio.us/caironoleto#2008-09-22</feedburner:origLink></item><item><title>Links for 2008-09-17 [del.icio.us]</title><link>http://feeds.feedburner.com/~r/caironoleto/~3/395893343/caironoleto</link><pubDate>Thu, 18 Sep 2008 00:00:00 -0500</pubDate><guid isPermaLink="false">http://del.icio.us/caironoleto#2008-09-17</guid><content:encoded><![CDATA[<ul>
<li><a href="http://thinkrefresh.com/">ThinkRefresh</a></li>
</ul><img src="http://feeds.feedburner.com/~r/caironoleto/~4/395893343" height="1" width="1"/>]]></content:encoded><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="http://thinkrefresh.com/"&gt;ThinkRefresh&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description><feedburner:origLink>http://del.icio.us/caironoleto#2008-09-17</feedburner:origLink></item><item><title>Links for 2008-09-16 [del.icio.us]</title><link>http://feeds.feedburner.com/~r/caironoleto/~3/394891743/caironoleto</link><pubDate>Wed, 17 Sep 2008 00:00:00 -0500</pubDate><guid isPermaLink="false">http://del.icio.us/caironoleto#2008-09-16</guid><content:encoded><![CDATA[<ul>
<li><a href="http://guides.rails.info/">Ruby on Rails guides</a></li>
<li><a href="http://blog.imperialdune.com/2007/2/12/rspec-ing-rails-views">graeme nelson: Rspec'ing Rails Views</a><br/>
Rspec&#039;ing Rails Views</li>
<li><a href="http://kpumuk.info/rspec/useful-helpers-for-rspec-mocks/">Useful helpers for RSpec mocks | Dmytro Shteflyuk's Home</a><br/>
Useful helpers for RSpec mocks</li>
<li><a href="http://www.robbyonrails.com/articles/2007/08/02/spec-your-views">Robby on Rails : Spec Your Views</a><br/>
Spec Your Views</li>
</ul><img src="http://feeds.feedburner.com/~r/caironoleto/~4/394891743" height="1" width="1"/>]]></content:encoded><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="http://guides.rails.info/"&gt;Ruby on Rails guides&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blog.imperialdune.com/2007/2/12/rspec-ing-rails-views"&gt;graeme nelson: Rspec'ing Rails Views&lt;/a&gt;&lt;br/&gt;
Rspec&amp;#039;ing Rails Views&lt;/li&gt;
&lt;li&gt;&lt;a href="http://kpumuk.info/rspec/useful-helpers-for-rspec-mocks/"&gt;Useful helpers for RSpec mocks | Dmytro Shteflyuk's Home&lt;/a&gt;&lt;br/&gt;
Useful helpers for RSpec mocks&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.robbyonrails.com/articles/2007/08/02/spec-your-views"&gt;Robby on Rails : Spec Your Views&lt;/a&gt;&lt;br/&gt;
Spec Your Views&lt;/li&gt;
&lt;/ul&gt;</description><feedburner:origLink>http://del.icio.us/caironoleto#2008-09-16</feedburner:origLink></item></channel>
</rss>
