<?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/"
	xmlns:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>Portfólio do Mourdok</title>
	<atom:link href="http://portfoliodomourdok.wordpress.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://portfoliodomourdok.wordpress.com</link>
	<description></description>
	<lastBuildDate>Wed, 29 Jun 2011 16:38:42 +0000</lastBuildDate>
	<language>pt-br</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.com/</generator>
<cloud domain='portfoliodomourdok.wordpress.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://1.gravatar.com/blavatar/99165f36cff92b3fb57da7a725cf53cc?s=96&#038;d=http%3A%2F%2Fs2.wp.com%2Fi%2Fbuttonw-com.png</url>
		<title>Portfólio do Mourdok</title>
		<link>http://portfoliodomourdok.wordpress.com</link>
	</image>
	<atom:link rel="search" type="application/opensearchdescription+xml" href="http://portfoliodomourdok.wordpress.com/osd.xml" title="Portfólio do Mourdok" />
	<atom:link rel='hub' href='http://portfoliodomourdok.wordpress.com/?pushpress=hub'/>
		<item>
		<title>Preparando meu Ambiente de Desenvolvimento Ruby no Linux Ubuntu</title>
		<link>http://portfoliodomourdok.wordpress.com/2010/06/13/preparando-meu-ambiente-de-desenvolvimento-ruby-no-linux-ubuntu/</link>
		<comments>http://portfoliodomourdok.wordpress.com/2010/06/13/preparando-meu-ambiente-de-desenvolvimento-ruby-no-linux-ubuntu/#comments</comments>
		<pubDate>Sun, 13 Jun 2010 09:00:32 +0000</pubDate>
		<dc:creator>mourdok</dc:creator>
				<category><![CDATA[Ruby]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[ruby tutorial]]></category>
		<category><![CDATA[ubuntu linux]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[install ubuntu]]></category>
		<category><![CDATA[ubuntu download]]></category>
		<category><![CDATA[ubuntu vmware]]></category>
		<category><![CDATA[linux command]]></category>
		<category><![CDATA[vmware linux]]></category>
		<category><![CDATA[google linux]]></category>
		<category><![CDATA[firefox linux]]></category>
		<category><![CDATA[bash zsh]]></category>
		<category><![CDATA[zsh shell]]></category>
		<category><![CDATA[linux zsh]]></category>
		<category><![CDATA[zsh prompt]]></category>
		<category><![CDATA[zsh for]]></category>
		<category><![CDATA[zsh completion]]></category>
		<category><![CDATA[zsh history]]></category>
		<category><![CDATA[zsh ubuntu]]></category>
		<category><![CDATA[zsh vs bash]]></category>
		<category><![CDATA[alias zsh]]></category>
		<category><![CDATA[zsh screen]]></category>
		<category><![CDATA[ruby ruby ruby]]></category>
		<category><![CDATA[ruby download]]></category>
		<category><![CDATA[svn git]]></category>
		<category><![CDATA[git branch]]></category>
		<category><![CDATA[sqlite sql]]></category>
		<category><![CDATA[sqlite database]]></category>
		<category><![CDATA[sqlite3]]></category>
		<category><![CDATA[sqlite file]]></category>
		<category><![CDATA[download sqlite]]></category>
		<category><![CDATA[sqlite tutorial]]></category>
		<category><![CDATA[sqllite]]></category>
		<category><![CDATA[firefox sqlite]]></category>
		<category><![CDATA[sqlite browser]]></category>
		<category><![CDATA[sqlite manager]]></category>
		<category><![CDATA[ruby sqlite]]></category>
		<category><![CDATA[ubuntu gedit]]></category>
		<category><![CDATA[linux gedit]]></category>
		<category><![CDATA[gedit editor]]></category>
		<category><![CDATA[gedit plugin]]></category>
		<category><![CDATA[sudo gedit]]></category>
		<category><![CDATA[gedit plugins]]></category>
		<category><![CDATA[gedit download]]></category>
		<category><![CDATA[gedit gnome]]></category>
		<category><![CDATA[gedit terminal]]></category>
		<category><![CDATA[install gedit]]></category>
		<category><![CDATA[firefox mozilla]]></category>
		<category><![CDATA[mozilla]]></category>
		<category><![CDATA[plugin firefox]]></category>
		<category><![CDATA[virtualbox ubuntu]]></category>
		<category><![CDATA[virtualbox linux]]></category>
		<category><![CDATA[virtualbox vmware]]></category>
		<category><![CDATA[download virtualbox]]></category>
		<category><![CDATA[linux vmware]]></category>
		<category><![CDATA[download vmware]]></category>
		<category><![CDATA[linux virtualpc]]></category>
		<category><![CDATA[download sqlitebrowser]]></category>
		<category><![CDATA[ruby ree]]></category>
		<category><![CDATA[gedit gmate]]></category>
		<category><![CDATA[gmate test]]></category>
		<category><![CDATA[delicious firefox]]></category>
		<category><![CDATA[delicious firefox bookmarks]]></category>
		<category><![CDATA[firefox bookmarks]]></category>
		<category><![CDATA[bookmarks to delicious]]></category>
		<category><![CDATA[firebug firefox]]></category>
		<category><![CDATA[firebug download]]></category>
		<category><![CDATA[firebug javascript]]></category>
		<category><![CDATA[firebug for firefox]]></category>
		<category><![CDATA[firefox firebug download]]></category>
		<category><![CDATA[web developer]]></category>
		<category><![CDATA[google gears]]></category>
		<category><![CDATA[jsonview firefox]]></category>
		<category><![CDATA[page speed test]]></category>
		<category><![CDATA[test page]]></category>
		<category><![CDATA[web page speed]]></category>
		<category><![CDATA[google speed]]></category>
		<category><![CDATA[google speed page]]></category>
		<category><![CDATA[firebug page speed]]></category>
		<category><![CDATA[page speed firefox]]></category>
		<category><![CDATA[ruby restclient]]></category>
		<category><![CDATA[rest client]]></category>
		<category><![CDATA[firefox selenium]]></category>
		<category><![CDATA[selenium ide firefox]]></category>
		<category><![CDATA[download selenium]]></category>
		<category><![CDATA[selenium ide download]]></category>
		<category><![CDATA[selenium ide test]]></category>
		<category><![CDATA[selenium test]]></category>
		<category><![CDATA[selenium ide tutorial]]></category>
		<category><![CDATA[selenium tutorial]]></category>
		<category><![CDATA[selenium testing]]></category>
		<category><![CDATA[firefox yslow]]></category>
		<category><![CDATA[firebug yslow]]></category>
		<category><![CDATA[google yslow]]></category>
		<category><![CDATA[download yslow]]></category>
		<category><![CDATA[yslow performance]]></category>
		<category><![CDATA[yslow plugin]]></category>
		<category><![CDATA[yslow yahoo]]></category>
		<category><![CDATA[dimdim meeting]]></category>
		<category><![CDATA[dimdim conference]]></category>
		<category><![CDATA[dimdim linux]]></category>
		<category><![CDATA[git github]]></category>
		<category><![CDATA[gem github]]></category>
		<category><![CDATA[github download]]></category>
		<category><![CDATA[github tutorial]]></category>
		<category><![CDATA[pivotal tracker]]></category>
		<category><![CDATA[pivotal solutions]]></category>
		<category><![CDATA[pivotal software]]></category>
		<category><![CDATA[skype download]]></category>
		<category><![CDATA[skype free]]></category>
		<category><![CDATA[skype linux]]></category>
		<category><![CDATA[wave google]]></category>
		<category><![CDATA[environment and development]]></category>
		<category><![CDATA[ubuntu development environment]]></category>
		<category><![CDATA[development environment setup]]></category>
		<category><![CDATA[environment & development]]></category>

		<guid isPermaLink="false">http://portfoliodomourdok.wordpress.com/?p=628</guid>
		<description><![CDATA[Esta decidido, vamos estudar Ruby! Motivo? Por essa Linguagem de Programação se mostrar cada vez mais promissora. Tanto pela comunidade de apaixonados e ótimos Developers, Programmers ou o que preferirem intitular. Quanto pelo fato de Ruby, na sua essência, não se deixar cair na burocracia, verbosidade, Whatever dentre outras características chatas que encontramos em algumas [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=portfoliodomourdok.wordpress.com&amp;blog=7583293&amp;post=628&amp;subd=portfoliodomourdok&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p><img class="alignleft size-full wp-image-635" style="border:0 none;margin:10px;" title="Tux &amp; Ruby" src="http://portfoliodomourdok.files.wordpress.com/2010/06/tux_ruby.png?w=152&#038;h=192" alt="" width="152" height="192" /></p>
<p>Esta decidido, vamos estudar <a title="Ruby" href="http://www.ruby-lang.org/pt/">Ruby</a>! Motivo? Por essa <a title="Linguagem de Programação" href="http://pt.wikipedia.org/wiki/Linguagem_de_programação">Linguagem de Programação</a> se mostrar cada vez mais promissora.</p>
<p>Tanto pela comunidade de apaixonados e ótimos <em>Developers</em>, <em>Programmers</em> ou o que preferirem intitular. Quanto pelo fato de <em>Ruby</em>, na sua essência, não se deixar cair na burocracia, verbosidade, <em>Whatever</em> dentre outras características chatas que encontramos em algumas linguagens, digamos, <a title="Não Tão Pragmáticas" href="http://pt.wikipedia.org/wiki/Pragmatismo">Não Tão Pragmáticas</a>.</p>
<p>Sendo assim, antes de vislumbrarmos essa poderosa linguagem precisaremos preparar a nossa mesa de trabalho! Para logo após, iniciar as nossas atividades de: Expressar <a title="Modelos de Negócio" href="http://en.wikipedia.org/wiki/Business_model">Modelos de Negócio</a>, <a title="Expressões Matemáticas" href="http://pt.wikipedia.org/wiki/Expressão_matemática">Expressões Matemáticas</a> e todo <a title="Aparato Tecnológico" href="http://pt.wikipedia.org/wiki/Ciência_da_computação">Aparato Tecnológico</a> que dispomos, em belos <a title="Algoritmos Computacionais" href="http://pt.wikipedia.org/wiki/Algoritmo">Algoritmos Computacionais</a> escritos em <em>Ruby</em>.</p>
<p>Então vamos ao tema de hoje <em>Preparando meu Ambiente de Desenvolvimento Ruby no Linux Ubuntu</em>.</p>
<p><span id="more-628"></span></p>
<h3><span style="color:#000080;">Cenário</span></h3>
<p>Sistema Operacional: <a title="Ubuntu" href="http://www.ubuntu.com/desktop">Ubuntu</a><br />
Dependências: <a title="Zsh" href="http://www.zsh.org/">Zsh</a>, Ruby, <a title="Git" href="http://git-scm.com/">Git</a>, <a title="SQLite" href="http://www.sqlite.org/">SQLite</a>, <a title="gEdit" href="http://projects.gnome.org/gedit/">gEdit</a>, <a title="Firefox" href="http://www.mozilla.com/pt-BR/firefox/">Firefox</a></p>
<h3><span style="color:#000080;">Problema</span></h3>
<p>Acho que o único <em>problema</em> aqui será se você vier do mundinho <a title="Windows" href="http://www.microsoft.com/windows/">Windows</a>. Pois se já estiver acostumado com o mundo fértil e vasto do <a title="Tux" href="http://en.wikipedia.org/wiki/Tux">Tux</a> ou da <a title="Maçã" href="http://pt.wikipedia.org/wiki/Apple">Maçã</a> não teremos problema algum.</p>
<p>Isso acontece pois o <em>Ruby</em> foi concebido para funcionar plenamente sob uma plataforma <a title="Unix Like" href="http://en.wikipedia.org/wiki/Unix-like">Unix Like</a>. Então um conhecimento básico de <a title="C" href="http://en.wikipedia.org/wiki/C_(programming_language)">C</a> e <a title="Unix Shell" href="http://en.wikipedia.org/wiki/Unix_shell">Unix Shell</a>, são mais do que bem vindos.</p>
<p>Logo para usuários de <em>Windows</em> esse artigo pode causar um certo desconforto <img src='http://s0.wp.com/wp-includes/images/smilies/icon_biggrin.gif' alt=':-D' class='wp-smiley' />  Mas siga em frente, e quebre esse <a href="http://pt.wikipedia.org/wiki/Paradigma">Paradigma</a>.</p>
<h3><span style="color:#000080;">Solução</span></h3>
<p>Para darmos uma dinâmica nesse artigo, você poderá executar esse passo-a-passo agora mesmo. Sem precisar se preocupar em particionar seu querido <a title="HD" href="http://www.wdc.com/pt/">HD</a>. Utilizando a maravilhosa alternativa chamada <a title="Virtualização" href="http://pt.wikipedia.org/wiki/Virtualização">Virtualização</a>, assim deixo uma listagem de alguns <em>Softwares</em> que podemos adotar.</p>
<ul>
<li><a title="VirtualBox" href="http://www.virtualbox.org/">VirtualBox</a></li>
<li><a title="VMware" href="http://www.vmware.com/">VMware</a> (eu utilizo esse daqui)</li>
<li><a title="Parallels" href="http://www.parallels.com/">Parallels</a></li>
<li><a title="Virtual PC" href="http://www.microsoft.com/windows/virtual-pc/">Virtual PC</a></li>
</ul>
<p>O processo de instalação desses softwares são bem simples, mas em caso de dúvida, nada como uma rápida consulta no respectivo manual para clarear nossas idéias.</p>
<h5>Sistema Operacional</h5>
<p style="text-align:center;"><a href="http://portfoliodomourdok.files.wordpress.com/2010/06/captura-de-tela-2010-06-11-as-17-23-56.png"><img class="size-full wp-image-648 aligncenter" style="border:0 none;" title="Ubuntu" src="http://portfoliodomourdok.files.wordpress.com/2010/06/captura-de-tela-2010-06-11-as-17-23-56.png?w=441&#038;h=325" alt="" width="441" height="325" /></a></p>
<p>Como dito inicialmente utilizaremos <em>Linux</em>, sendo que a versão adotada nesse artigo será a <em>Ubuntu 10.04</em>, em sua versão <em>Desktop</em>.</p>
<p>Nosso primeiro passo será baixar a <a title="Imagem ISO" href="http://en.wikipedia.org/wiki/ISO_image">Imagem ISO</a> no <em>link</em> abaixo.</p>
<ul>
<li><a title="Download Ubuntu Desktop Edition (32-bit)" href="http://www.ubuntu.com/desktop/get-ubuntu/download">Download Ubuntu Desktop Edition (32-bit)</a></li>
</ul>
<p>Depois de alguns <a title="Cafés" href="http://www.franscafe.com.br/">Cafés</a> teremos baixada a <em>Imagem ISO</em>.</p>
<p>Agora efetuaremos a instalação padrão, sem se preocupar com detalhes de configurações adicionais. Isso não será necessário! E se você não esta acostumado a instalar uma <a title="Distribuição Linux" href="http://pt.wikipedia.org/wiki/Distribuição_Linux">Distribuição Linux</a>, você ficará surpreso com o rápido e prático processo de configuração no <em>Ubuntu</em>.</p>
<p>Veja exemplo abaixo.</p>
<ul>
<li><a title="Installing Ubuntu 10.04 LTS" href="http://news.softpedia.com/news/Installing-Ubuntu-10-04-LTS-141550.shtml">Installing Ubuntu 10.04 LTS</a></li>
</ul>
<p>Finalizado o processo de instalação, inicie o <em>Terminal</em> do <em>Ubuntu</em>, para certificar que esta tudo em dia:</p>
<pre class="brush: bash; wrap-lines: false;">
# Nele digite os comandos
sudo apt-get update
sudo apt-get upgrade
</pre>
<h5>Agora sim mandaremos brasa</h5>
<p style="text-align:center;"><img class="aligncenter size-full wp-image-293" style="border:0 none;" title="Ubuntu" src="http://portfoliodomourdok.files.wordpress.com/2010/06/ligeirinhom.jpg?w=461&#038;h=288" alt="" width="461" height="288" /></p>
<p>Agilidade nesse artigo. O tempo urge!</p>
<h5>Algumas Dependências</h5>
<p>No <em>Terminal</em> instalaremos alguns pacotes, precisos para a base, do nosso ambiente de desenvolvimento.</p>
<pre class="brush: bash; wrap-lines: false;">
# Nele digite os comandos
sudo apt-get install build-essential zlib1g-dev libssl-dev libreadline5-dev checkinstall default-jdk curl
</pre>
<h5>Shell</h5>
<p style="text-align:center;"><a href="http://portfoliodomourdok.files.wordpress.com/2010/06/captura-de-tela-2010-06-11-as-20-27-10.png"><img class="size-full wp-image-648 aligncenter" style="border:0 none;" title="Z Shell" src="http://portfoliodomourdok.files.wordpress.com/2010/06/captura-de-tela-2010-06-11-as-20-27-10.png?w=490&#038;h=361" alt="" width="490" height="361" /></a></p>
<p>Se você vai programar no <em>Linux</em> aprenda a gostar do <em>Terminal</em>, ele será seu melhor amigo.</p>
<p>E alguns acessórios legais para o Terminal, são: o <em>zsh</em> para uma maior interatividade do que o clássico <a title="bash" href="http://pt.wikipedia.org/wiki/Bash">bash</a> e o <a title="oh-my-zsh" href="#">oh-my-zsh</a> para gerenciar a configuração do <em>zsh</em>. Então vamos lá!</p>
<pre class="brush: bash; wrap-lines: false;">
# Instalar o zsh
sudo apt-get install zsh zsh-dev

# Instalar o oh-my-zsh
cd ~ &amp;&amp; wget http://github.com/robbyrussell/oh-my-zsh/raw/master/tools/install.sh -O - | sh
</pre>
<p>Algumas dicas:</p>
<ul>
<li>Digite <em>zsh</em> no <em>Terminal</em> para habilitar o <em>Z Shell</em></li>
<li>Como utilizaremos <em>Ruby</em> em nosso ambiente, habilite o <em>Plugin</em> para essa linguagem, no arquivo <em>~./zshrc</em>, de <em>plugins=(git)</em> para <em>plugins=(git ruby)</em></li>
<li>Se a instalação gerar o diretório <em>.git/</em> basta excluí-lo via comando <em>rm -rf ~/.git/</em></li>
</ul>
<h5>Sistema de Controle de Versão</h5>
<p style="text-align:center;"><a href="http://portfoliodomourdok.files.wordpress.com/2010/06/captura-de-tela-2010-06-11-as-20-45-10.png"><img class="size-full wp-image-648 aligncenter" style="border:0 none;" title="GitG" src="http://portfoliodomourdok.files.wordpress.com/2010/06/captura-de-tela-2010-06-11-as-20-45-10.png?w=441&#038;h=457" alt="" width="441" height="457" /></a></p>
<p>Se vamos programar em <em>Ruby</em> é bom saber que o <a title="SCM" href="http://en.wikipedia.org/wiki/Source_Code_Management">SCM</a> <em>Git</em> é o mais utilizado pela galera. E se você tiver alguma dúvida se vale a pena utilizá-lo, assista essa <a title="Tech Talk" href="http://www.youtube.com/watch?v=4XpnKHJAok8">Tech Talk</a> com o <a title="Linus Torvalds" href="http://en.wikipedia.org/wiki/Linus_Torvalds">Linus Torvalds</a> falando sobre o <em>Git</em>.</p>
<p>De toda forma daremos continuidade ao artigo. Agora vamos lá!</p>
<pre class="brush: bash; wrap-lines: false;">
# Instalar o Git
sudo apt-get install git-core

# Instalar também uma interface gráfica para o Git
sudo apt-get install gitg
</pre>
<p>Algumas dicas:</p>
<ul>
<li><a title="GitG" href="http://trac.novowork.com/gitg/">GitG</a> será interessante para navegar com mais facilidade pela arvore de histórico dos nossos <em>commits</em></li>
<li>Como também alguns sites para aprender a utilizar esse <em>SCM</em>, como <a title="GitCasts" href="http://gitcasts.com/">GitCasts</a>, <a title="Git Ready" href="http://gitready.com/">Git Ready</a>, <a title="Pro Git" href="http://progit.org/book/">Pro Git</a> e <a title="Git User's Manual" href="http://www.kernel.org/pub/software/scm/git/docs/user-manual.html">Git User&#8217;s Manual</a></li>
<p> são uma boa leitura
</ul>
<h5>Banco de Dados SQL</h5>
<p style="text-align:center;"><a href="http://portfoliodomourdok.files.wordpress.com/2010/06/captura-de-tela-2010-06-11-as-21-32-50.png"><img class="size-full wp-image-648 aligncenter" style="border:0 none;" title="SQLite Browser" src="http://portfoliodomourdok.files.wordpress.com/2010/06/captura-de-tela-2010-06-11-as-21-32-50.png?w=490&#038;h=405" alt="" width="490" height="405" /></a></p>
<p>Já fazem alguns meses que utilizo o <em>SQL Database</em> chamado <em>SQLite</em> que resumidamente:</p>
<blockquote><p>É uma biblioteca em linguagem C que implementa um banco de dados SQL embutido.</p></blockquote>
<p>Que tem como características:</p>
<blockquote><p>É Software Livre/domínio público e Multiplataforma; É um mecanismo de armazenamento seguro com transações ACID; Implementa a maioria do SQL92; Permite guardar o banco de dados em um único arquivo; Suporta bases de dados acima de 2 terabytes.</p></blockquote>
<p>Sem falar que empresas como <a title="Bloomberg" href="http://www.bloomberg.com/">Bloomberg</a>, <a title="Symbian" href="http://www.symbian.com/">Symbian</a>, <a title="Mozilla" href="http://www.mozilla.com/">Mozilla</a> e <a title="Adobe" href="http://www.adobe.com/">Adobe</a> patrocinam o desenvolvimento desse <em>SQL Database</em>.</p>
<p>De toda forma, vamos lá!</p>
<pre class="brush: bash; wrap-lines: false;">
# Instalar o SQLite
sudo apt-get install sqlite3 libsqlite3-dev

# Instalar também uma interface gráfica para o SQLite
sudo apt-get install sqlitebrowser
</pre>
<h5>Ruby</h5>
<p style="text-align:center;"><a href="http://portfoliodomourdok.files.wordpress.com/2010/06/captura-de-tela-2010-06-12-as-17-13-18.png"><img class="size-full wp-image-648 aligncenter" style="border:0 none;" title="Ruby Enterprise Edition 1.8.7" src="http://portfoliodomourdok.files.wordpress.com/2010/06/captura-de-tela-2010-06-12-as-17-13-18.png?w=490&#038;h=348" alt="" width="490" height="348" /></a></p>
<p>E que rufem os tambores&#8230; Senhoras e Senhores, com vocês, a maneira mais rápida de habilitar, nada mais nada menos do que: <a title="Ruby Enterprise Edition" href="http://www.rubyenterpriseedition.com/">Ruby Enterprise Edition</a>! Em nosso ambiente de desenvolvimento.</p>
<pre class="brush: bash; wrap-lines: false;">
# Baixar o Ruby Enterprise Edition 1.8.7
cd ~ &amp;&amp; wget http://rubyforge.org/frs/download.php/71100/ruby-enterprise_1.8.7-2010.02_i386_ubuntu10.04.deb

# Instalar o Ruby
sudo dpkg -i ruby-enterprise_1.8.7-2010.02_i386_ubuntu10.04.deb

# Adicionar um repositório secundário de RubyGems
gem sources -a http://gems.github.com

# E checar nossa instalação
ruby -v
</pre>
<h5>Editor de Texto</h5>
<p style="text-align:center;"><a href="http://portfoliodomourdok.files.wordpress.com/2010/06/captura-de-tela-2010-06-12-as-17-51-50.png"><img class="size-full wp-image-648 aligncenter" style="border:0 none;" title="gEdit" src="http://portfoliodomourdok.files.wordpress.com/2010/06/captura-de-tela-2010-06-12-as-17-51-50.png?w=490&#038;h=374" alt="" width="490" height="374" /></a></p>
<p>E que <a title="IDE" href="http://pt.wikipedia.org/wiki/Ambiente_de_Desenvolvimento_Integrado">IDE</a> utilizaremos para editar o nosso código <em>Ruby</em>? A resposta é simples: Nenhuma!</p>
<p>Não precisamos de nenhum &#8220;trator&#8221; para codificar. Precisamos sim de um funcional editor de texto e o que gosto de utilizar no <em>Linux</em> é o <em>gEdit</em>.</p>
<blockquote><p>Tudo bem. Eu sei. A galera no Linux gosta de usar o Vi ou Vim como editor de texto. Mas ainda não me acostumei com esse &#8220;tiozinho&#8221;. Então vamos de gEdit!</p></blockquote>
<p>Para darmos um <em>plus plus</em> no <em>gEdit</em>, adicionaremos o <em>Plugin</em> chamado <em>gMate</em> que adiciona diversas melhorias ao <em>gEdit</em>, tornando-o um pouco semelhante ao aclamado <a title="Textmate" href="http://macromates.com/">Textmate</a> do <a title="MacOSX" href="http://www.apple.com/macosx/">MacOSX</a>.</p>
<p>E assim ganhamos funcionalidades tais como:</p>
<ul>
<li>Advanced Bookmarks. Highlight, remenber and toggle bookmarks in your files</li>
<li>Classbrowser. A Classbrowser (depends of ctags, I use exuberant-ctags)</li>
<li>Find in Files. Find a string in files (integrated with filebrowser)</li>
<li>Gedit Open File. Regex based file open (like textmate Go to file…)</li>
<li>Gedit Todo. Find Todo Marks in source files (integrated with filebrowser)</li>
<li>Gemini. Pair complete for quotes and braces</li>
<li>Quickhighligthmode. Fast change current highlight mode</li>
<li>Rails Extract Partial. Extract selected region of rhtml as a partial</li>
<li>Rails Hotcommands. Execute Rails Commands (such rake tasks)</li>
<li>Rails Hotkeys. Navigation in Rails Project Files</li>
<li>Regex Search Replace. Search and replace with regular expressions</li>
<li>Smart Indent. Smart Indentation regex based</li>
<li>Tabulation. Auto set tabs and spaces based on file type</li>
<li>Text Tools. Some text manipulation improvements (adapted from line tools)</li>
<li>Trailsave. Remove trailing spaces before save a document</li>
<li>Word Completion. Word completion plugin</li>
<li>Gedit Go To File. Yet Another Go to File plugin Just Like SnapOpen and GeditOpenFiles also based in Textmate Go to file</li>
<li>Multi Edit. Check it out at author&#8217;s page http://jon-walsh.com/journal/multi-edit</li>
<li>Pastie. Paste a selection of code or a source file to pastie.org directly from editor http://github.com/ivyl/gedit-pastie</li>
<li>Zen Coding. Tools for faster HTML/CSS coding http://github.com/mikecrittenden/zen-coding-gedit</li>
</ul>
<p>Vamos a instalação!</p>
<pre class="brush: bash; wrap-lines: false;">
# Adicionar o Ubuntu on Rails PPA
sudo apt-add-repository ppa:ubuntu-on-rails/ppa

# Instalar o gMate
sudo apt-get install gedit-gmate
</pre>
<p>Agora vamos as dicas:</p>
<ul>
<li>Após inicializar o gEdit vá no menu Editar &gt; Preferências e configure o gEdit ao seu modo</li>
<li>Particularmente costumo habilitar todos os <em>Plugins</em>, utilizar o esquema de cor Ruby Blue e habilitar a numeração de linhas</li>
</ul>
<h5>Navegador Padrão</h5>
<p style="text-align:center;"><a href="http://portfoliodomourdok.files.wordpress.com/2010/06/captura-de-tela-2010-06-12-as-19-03-21.png"><img class="size-full wp-image-648 aligncenter" style="border:0 none;" title="Firefox" src="http://portfoliodomourdok.files.wordpress.com/2010/06/captura-de-tela-2010-06-12-as-19-03-21.png?w=490&#038;h=306" alt="" width="490" height="306" /></a></p>
<p>Tenho que dizer que não utilizo esse navegador somente no <em>Linux</em>, quando o foco é desenvolvimento. Utilizo ele também no <em>MacOSX</em>. E em último caso, quando (extremamente) preciso, no <em>Windows</em> também <img src='http://s0.wp.com/wp-includes/images/smilies/icon_biggrin.gif' alt=':-D' class='wp-smiley' /> .</p>
<p>Pois basicamente o <em>Firefox</em> é o melhor navegador para desenvolvimento de aplicações <em>Web</em>, na minha humilde opnião é claro, isso graças a diversos <em>Plugins</em> muito bem escritos, que dão um ótimo valor a esse navegador de Internet.</p>
<p>Assim a seguir deixo o <em>link</em> dos <em>Plugins</em> que utilizo:</p>
<ul>
<li><a title="Delicious Bookmarks" href="https://addons.mozilla.org/pt-BR/firefox/addon/3615/">Delicious Bookmarks</a>, para manter os Favoritos em dia</li>
<li><a title="Firebug" href="https://addons.mozilla.org/pt-BR/firefox/addon/1843/">Firebug</a>, como uma excelente extensão do nosso editor de texto</li>
<li><a title="Gears" href="http://gears.google.com/">Gears</a>, como o <a title="HTML5" href="http://html5.org/">HTML5</a> ainda não se tornou o padrão adotado pelos navegadores de <em>Internet</em>, esse rapaz chamado <em>Gears</em> do <em>Google</em> traz algumas funcionalidades de <em>Cache</em>, <em>Database</em> e <em>Pool</em> para o lado cliente da nossa aplicação <em>Web</em>. Que merece seu estudo a parte</li>
<li><a title="JSONView" href="https://addons.mozilla.org/pt-BR/firefox/addon/10869/">JSONView</a>, para visualizar estruturas <a title="JSON" href="http://www.json.org/">JSON</a> de forma mais adequada</li>
<li><a title="Page Speed" href="http://code.google.com/intl/pt-BR/speed/page-speed/">Page Speed</a>, para testar a performance da nossa aplicação</li>
<li><a title="RESTClient" href="https://addons.mozilla.org/en-US/firefox/addon/9780/">RESTClient</a>, que é uma boa ferramenta para testar serviços <a title="REST" href="http://en.wikipedia.org/wiki/Representational_State_Transfer">REST</a></li>
<li><a title="Selenium IDE" href="http://seleniumhq.org/projects/ide/">Selenium IDE</a>, para criar testes nas <em>Views</em></li>
<li><a title="YSlow" href="http://developer.yahoo.com/yslow/">YSlow</a>, para também testar a performance da nossa aplicação</li>
</ul>
<h5>Ferramentas Online</h5>
<p>Antes de chegarmos ao final desse artigo. É bom comentar sobre algumas aplicações <em>Web</em>, que são úteis quando alguém do time esta a maior parte do tempo remoto (mas não necessariamente). Então vamos lá!</p>
<ul>
<li><a title="Dimdim" href="http://dimdim.com/">Dimdim</a>, para <a title="Web Conferencing" href="http://en.wikipedia.org/wiki/Web_conferencing">Web Conferencing</a></li>
<li><a title="Github" href="http://github.com/">Github</a>, para <em>Social Code</em></li>
<li><a title="Pivotal" href="http://www.pivotaltracker.com/">Pivotal</a>, para <a title="Trac" href="http://pt.wikipedia.org/wiki/Trac">Trac</a></li>
<li><a title="Skype" href="http://www.skype.com/">Skype</a>, para <em>Free Call</em> <img src='http://s0.wp.com/wp-includes/images/smilies/icon_biggrin.gif' alt=':-D' class='wp-smiley' /> </li>
<li><a title="Wave" href="https://wave.google.com/">Wave</a>, para <a title="Brainstorming" href="http://pt.wikipedia.org/wiki/Brainstorming">Brainstorming</a></li>
</ul>
<p>A parte do não necessariamente, se refere ao <em>GitHub</em> por ser um maravilhoso misto de Hospedagem de Projetos + Rede Social.</p>
<p>Hospedagem de Projetos pois muitas das <em>RubyGems</em> e <em>Plugins</em> e <em>Whatever</em> que a galera do <em>Ruby</em> utiliza, constam nesse local.</p>
<p>Rede Social pois além de estar na moda <img src='http://s0.wp.com/wp-includes/images/smilies/icon_biggrin.gif' alt=':-D' class='wp-smiley' />  Brincadeiras a parte, você poderá ter uma forma de contato direto com esses Developers que commitam no <em>GitHub</em>. E etc&#8230;</p>
<h5>Material de Estudo</h5>
<p>Não posso deixar vocês sem mais alguns <em>Links</em>, esses dessa vez, sobre material de estudo para <em>Ruby</em>.</p>
<ul>
<li><a title="Learn To Program" href="http://pine.fm/LearnToProgram/">Learn To Program</a></li>
<li><a title="Ruby in Twenty Minutes" href="http://www.ruby-lang.org/en/documentation/quickstart/">Ruby in Twenty Minutes</a></li>
<li><a title="Ruby Essentials" href="http://www.techotopia.com/index.php/Ruby_Essentials">Ruby Essentials</a></li>
<li><a title="Programming Ruby" href="http://www.ruby-doc.org/docs/ProgrammingRuby/">Programming Ruby</a></li>
<li><a title="Ruby User's Guide" href="http://www.rubyist.net/~slagell/ruby/">Ruby User&#8217;s Guide</a></li>
<li><a title="Ruby Programming" href="http://en.wikibooks.org/wiki/Ruby_programming_language">Ruby Programming</a></li>
<li><a title="Ruby Doc" href="http://www.ruby-doc.org/">Ruby Doc</a></li>
</ul>
<p>E material de estudo para <em>Rails</em>. Pois se tornou normal para os <em>Web Developers</em> chegarem ao mundo <em>Ruby</em>, através desse excelente <em>Framework Web</em>.</p>
<p>Porém não fique somente no que o <em>Rails</em> propõem, pois <em>Rails</em> é basicamente a adoção do que existe de boas práticas em <a title="Web Development" href="http://en.wikipedia.org/wiki/Web_development">Web Development</a> e <em>Ruby</em>.</p>
<ul>
<li><a title="Ruby on Rails Guides" href="http://guides.rubyonrails.org/">Ruby on Rails Guides</a></li>
<li><a title="Desenvolvimento Ágil para Web 2.0 com Ruby on Rails" href="http://www.caelum.com.br/curso/rr-71-ruby-on-rails/">Desenvolvimento Ágil para Web 2.0 com Ruby on Rails</a></li>
</ul>
<p> <img src='http://s0.wp.com/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /><br />
Bom é isso caro leitor.</p>
<p>Quem escreveu foi o André Moreira.<br />
Obrigado pela visita e até o próximo post.</p>
<br />Filed under: <a href='http://portfoliodomourdok.wordpress.com/category/linux/'>Linux</a>, <a href='http://portfoliodomourdok.wordpress.com/category/ruby/'>Ruby</a> Tagged: <a href='http://portfoliodomourdok.wordpress.com/tag/alias-zsh/'>alias zsh</a>, <a href='http://portfoliodomourdok.wordpress.com/tag/bash-zsh/'>bash zsh</a>, <a href='http://portfoliodomourdok.wordpress.com/tag/bookmarks-to-delicious/'>bookmarks to delicious</a>, <a href='http://portfoliodomourdok.wordpress.com/tag/delicious-firefox/'>delicious firefox</a>, <a href='http://portfoliodomourdok.wordpress.com/tag/delicious-firefox-bookmarks/'>delicious firefox bookmarks</a>, <a href='http://portfoliodomourdok.wordpress.com/tag/development-environment-setup/'>development environment setup</a>, <a href='http://portfoliodomourdok.wordpress.com/tag/dimdim-conference/'>dimdim conference</a>, <a href='http://portfoliodomourdok.wordpress.com/tag/dimdim-linux/'>dimdim linux</a>, <a href='http://portfoliodomourdok.wordpress.com/tag/dimdim-meeting/'>dimdim meeting</a>, <a href='http://portfoliodomourdok.wordpress.com/tag/download-selenium/'>download selenium</a>, <a href='http://portfoliodomourdok.wordpress.com/tag/download-sqlite/'>download sqlite</a>, <a href='http://portfoliodomourdok.wordpress.com/tag/download-sqlitebrowser/'>download sqlitebrowser</a>, <a href='http://portfoliodomourdok.wordpress.com/tag/download-virtualbox/'>download virtualbox</a>, <a href='http://portfoliodomourdok.wordpress.com/tag/download-vmware/'>download vmware</a>, <a href='http://portfoliodomourdok.wordpress.com/tag/download-yslow/'>download yslow</a>, <a href='http://portfoliodomourdok.wordpress.com/tag/environment-development/'>environment &amp; development</a>, <a href='http://portfoliodomourdok.wordpress.com/tag/environment-and-development/'>environment and development</a>, <a href='http://portfoliodomourdok.wordpress.com/tag/firebug-download/'>firebug download</a>, <a href='http://portfoliodomourdok.wordpress.com/tag/firebug-firefox/'>firebug firefox</a>, <a href='http://portfoliodomourdok.wordpress.com/tag/firebug-for-firefox/'>firebug for firefox</a>, <a href='http://portfoliodomourdok.wordpress.com/tag/firebug-javascript/'>firebug javascript</a>, <a href='http://portfoliodomourdok.wordpress.com/tag/firebug-page-speed/'>firebug page speed</a>, <a href='http://portfoliodomourdok.wordpress.com/tag/firebug-yslow/'>firebug yslow</a>, <a href='http://portfoliodomourdok.wordpress.com/tag/firefox-bookmarks/'>firefox bookmarks</a>, <a href='http://portfoliodomourdok.wordpress.com/tag/firefox-firebug-download/'>firefox firebug download</a>, <a href='http://portfoliodomourdok.wordpress.com/tag/firefox-linux/'>firefox linux</a>, <a href='http://portfoliodomourdok.wordpress.com/tag/firefox-mozilla/'>firefox mozilla</a>, <a href='http://portfoliodomourdok.wordpress.com/tag/firefox-selenium/'>firefox selenium</a>, <a href='http://portfoliodomourdok.wordpress.com/tag/firefox-sqlite/'>firefox sqlite</a>, <a href='http://portfoliodomourdok.wordpress.com/tag/firefox-yslow/'>firefox yslow</a>, <a href='http://portfoliodomourdok.wordpress.com/tag/gedit-download/'>gedit download</a>, <a href='http://portfoliodomourdok.wordpress.com/tag/gedit-editor/'>gedit editor</a>, <a href='http://portfoliodomourdok.wordpress.com/tag/gedit-gmate/'>gedit gmate</a>, <a href='http://portfoliodomourdok.wordpress.com/tag/gedit-gnome/'>gedit gnome</a>, <a href='http://portfoliodomourdok.wordpress.com/tag/gedit-plugin/'>gedit plugin</a>, <a href='http://portfoliodomourdok.wordpress.com/tag/gedit-plugins/'>gedit plugins</a>, <a href='http://portfoliodomourdok.wordpress.com/tag/gedit-terminal/'>gedit terminal</a>, <a href='http://portfoliodomourdok.wordpress.com/tag/gem-github/'>gem github</a>, <a href='http://portfoliodomourdok.wordpress.com/tag/git-branch/'>git branch</a>, <a href='http://portfoliodomourdok.wordpress.com/tag/git-github/'>git github</a>, <a href='http://portfoliodomourdok.wordpress.com/tag/github-download/'>github download</a>, <a href='http://portfoliodomourdok.wordpress.com/tag/github-tutorial/'>github tutorial</a>, <a href='http://portfoliodomourdok.wordpress.com/tag/gmate-test/'>gmate test</a>, <a href='http://portfoliodomourdok.wordpress.com/tag/google-gears/'>google gears</a>, <a href='http://portfoliodomourdok.wordpress.com/tag/google-linux/'>google linux</a>, <a href='http://portfoliodomourdok.wordpress.com/tag/google-speed/'>google speed</a>, <a href='http://portfoliodomourdok.wordpress.com/tag/google-speed-page/'>google speed page</a>, <a href='http://portfoliodomourdok.wordpress.com/tag/google-yslow/'>google yslow</a>, <a href='http://portfoliodomourdok.wordpress.com/tag/install-gedit/'>install gedit</a>, <a href='http://portfoliodomourdok.wordpress.com/tag/install-ubuntu/'>install ubuntu</a>, <a href='http://portfoliodomourdok.wordpress.com/tag/jsonview-firefox/'>jsonview firefox</a>, <a href='http://portfoliodomourdok.wordpress.com/tag/linux-2/'>linux</a>, <a href='http://portfoliodomourdok.wordpress.com/tag/linux-command/'>linux command</a>, <a href='http://portfoliodomourdok.wordpress.com/tag/linux-gedit/'>linux gedit</a>, <a href='http://portfoliodomourdok.wordpress.com/tag/linux-virtualpc/'>linux virtualpc</a>, <a href='http://portfoliodomourdok.wordpress.com/tag/linux-vmware/'>linux vmware</a>, <a href='http://portfoliodomourdok.wordpress.com/tag/linux-zsh/'>linux zsh</a>, <a href='http://portfoliodomourdok.wordpress.com/tag/mozilla/'>mozilla</a>, <a href='http://portfoliodomourdok.wordpress.com/tag/page-speed-firefox/'>page speed firefox</a>, <a href='http://portfoliodomourdok.wordpress.com/tag/page-speed-test/'>page speed test</a>, <a href='http://portfoliodomourdok.wordpress.com/tag/pivotal-software/'>pivotal software</a>, <a href='http://portfoliodomourdok.wordpress.com/tag/pivotal-solutions/'>pivotal solutions</a>, <a href='http://portfoliodomourdok.wordpress.com/tag/pivotal-tracker/'>pivotal tracker</a>, <a href='http://portfoliodomourdok.wordpress.com/tag/plugin-firefox/'>plugin firefox</a>, <a href='http://portfoliodomourdok.wordpress.com/tag/rest-client/'>rest client</a>, <a href='http://portfoliodomourdok.wordpress.com/tag/ruby-download/'>ruby download</a>, <a href='http://portfoliodomourdok.wordpress.com/tag/ruby-ree/'>ruby ree</a>, <a href='http://portfoliodomourdok.wordpress.com/tag/ruby-restclient/'>ruby restclient</a>, <a href='http://portfoliodomourdok.wordpress.com/tag/ruby-ruby-ruby/'>ruby ruby ruby</a>, <a href='http://portfoliodomourdok.wordpress.com/tag/ruby-sqlite/'>ruby sqlite</a>, <a href='http://portfoliodomourdok.wordpress.com/tag/ruby-tutorial/'>ruby tutorial</a>, <a href='http://portfoliodomourdok.wordpress.com/tag/selenium-ide-download/'>selenium ide download</a>, <a href='http://portfoliodomourdok.wordpress.com/tag/selenium-ide-firefox/'>selenium ide firefox</a>, <a href='http://portfoliodomourdok.wordpress.com/tag/selenium-ide-test/'>selenium ide test</a>, <a href='http://portfoliodomourdok.wordpress.com/tag/selenium-ide-tutorial/'>selenium ide tutorial</a>, <a href='http://portfoliodomourdok.wordpress.com/tag/selenium-test/'>selenium test</a>, <a href='http://portfoliodomourdok.wordpress.com/tag/selenium-testing/'>selenium testing</a>, <a href='http://portfoliodomourdok.wordpress.com/tag/selenium-tutorial/'>selenium tutorial</a>, <a href='http://portfoliodomourdok.wordpress.com/tag/skype-download/'>skype download</a>, <a href='http://portfoliodomourdok.wordpress.com/tag/skype-free/'>skype free</a>, <a href='http://portfoliodomourdok.wordpress.com/tag/skype-linux/'>skype linux</a>, <a href='http://portfoliodomourdok.wordpress.com/tag/sqlite-browser/'>sqlite browser</a>, <a href='http://portfoliodomourdok.wordpress.com/tag/sqlite-database/'>sqlite database</a>, <a href='http://portfoliodomourdok.wordpress.com/tag/sqlite-file/'>sqlite file</a>, <a href='http://portfoliodomourdok.wordpress.com/tag/sqlite-manager/'>sqlite manager</a>, <a href='http://portfoliodomourdok.wordpress.com/tag/sqlite-sql/'>sqlite sql</a>, <a href='http://portfoliodomourdok.wordpress.com/tag/sqlite-tutorial/'>sqlite tutorial</a>, <a href='http://portfoliodomourdok.wordpress.com/tag/sqlite3/'>sqlite3</a>, <a href='http://portfoliodomourdok.wordpress.com/tag/sqllite/'>sqllite</a>, <a href='http://portfoliodomourdok.wordpress.com/tag/sudo-gedit/'>sudo gedit</a>, <a href='http://portfoliodomourdok.wordpress.com/tag/svn-git/'>svn git</a>, <a href='http://portfoliodomourdok.wordpress.com/tag/test-page/'>test page</a>, <a href='http://portfoliodomourdok.wordpress.com/tag/ubuntu-development-environment/'>ubuntu development environment</a>, <a href='http://portfoliodomourdok.wordpress.com/tag/ubuntu-download/'>ubuntu download</a>, <a href='http://portfoliodomourdok.wordpress.com/tag/ubuntu-gedit/'>ubuntu gedit</a>, <a href='http://portfoliodomourdok.wordpress.com/tag/ubuntu-linux/'>ubuntu linux</a>, <a href='http://portfoliodomourdok.wordpress.com/tag/ubuntu-vmware/'>ubuntu vmware</a>, <a href='http://portfoliodomourdok.wordpress.com/tag/virtualbox-linux/'>virtualbox linux</a>, <a href='http://portfoliodomourdok.wordpress.com/tag/virtualbox-ubuntu/'>virtualbox ubuntu</a>, <a href='http://portfoliodomourdok.wordpress.com/tag/virtualbox-vmware/'>virtualbox vmware</a>, <a href='http://portfoliodomourdok.wordpress.com/tag/vmware-linux/'>vmware linux</a>, <a href='http://portfoliodomourdok.wordpress.com/tag/wave-google/'>wave google</a>, <a href='http://portfoliodomourdok.wordpress.com/tag/web-developer/'>web developer</a>, <a href='http://portfoliodomourdok.wordpress.com/tag/web-page-speed/'>web page speed</a>, <a href='http://portfoliodomourdok.wordpress.com/tag/yslow-performance/'>yslow performance</a>, <a href='http://portfoliodomourdok.wordpress.com/tag/yslow-plugin/'>yslow plugin</a>, <a href='http://portfoliodomourdok.wordpress.com/tag/yslow-yahoo/'>yslow yahoo</a>, <a href='http://portfoliodomourdok.wordpress.com/tag/zsh-completion/'>zsh completion</a>, <a href='http://portfoliodomourdok.wordpress.com/tag/zsh-for/'>zsh for</a>, <a href='http://portfoliodomourdok.wordpress.com/tag/zsh-history/'>zsh history</a>, <a href='http://portfoliodomourdok.wordpress.com/tag/zsh-prompt/'>zsh prompt</a>, <a href='http://portfoliodomourdok.wordpress.com/tag/zsh-screen/'>zsh screen</a>, <a href='http://portfoliodomourdok.wordpress.com/tag/zsh-shell/'>zsh shell</a>, <a href='http://portfoliodomourdok.wordpress.com/tag/zsh-ubuntu/'>zsh ubuntu</a>, <a href='http://portfoliodomourdok.wordpress.com/tag/zsh-vs-bash/'>zsh vs bash</a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/portfoliodomourdok.wordpress.com/628/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/portfoliodomourdok.wordpress.com/628/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/portfoliodomourdok.wordpress.com/628/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/portfoliodomourdok.wordpress.com/628/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/portfoliodomourdok.wordpress.com/628/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/portfoliodomourdok.wordpress.com/628/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/portfoliodomourdok.wordpress.com/628/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/portfoliodomourdok.wordpress.com/628/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/portfoliodomourdok.wordpress.com/628/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/portfoliodomourdok.wordpress.com/628/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/portfoliodomourdok.wordpress.com/628/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/portfoliodomourdok.wordpress.com/628/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/portfoliodomourdok.wordpress.com/628/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/portfoliodomourdok.wordpress.com/628/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=portfoliodomourdok.wordpress.com&amp;blog=7583293&amp;post=628&amp;subd=portfoliodomourdok&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://portfoliodomourdok.wordpress.com/2010/06/13/preparando-meu-ambiente-de-desenvolvimento-ruby-no-linux-ubuntu/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/28c68b93b7780192ed6f40ab194c4859?s=96&#38;d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96&#38;r=G" medium="image">
			<media:title type="html">André Moreira </media:title>
		</media:content>

		<media:content url="http://portfoliodomourdok.files.wordpress.com/2010/06/tux_ruby.png" medium="image">
			<media:title type="html">Tux &#38; Ruby</media:title>
		</media:content>

		<media:content url="http://portfoliodomourdok.files.wordpress.com/2010/06/captura-de-tela-2010-06-11-as-17-23-56.png" medium="image">
			<media:title type="html">Ubuntu</media:title>
		</media:content>

		<media:content url="http://portfoliodomourdok.files.wordpress.com/2010/06/ligeirinhom.jpg" medium="image">
			<media:title type="html">Ubuntu</media:title>
		</media:content>

		<media:content url="http://portfoliodomourdok.files.wordpress.com/2010/06/captura-de-tela-2010-06-11-as-20-27-10.png" medium="image">
			<media:title type="html">Z Shell</media:title>
		</media:content>

		<media:content url="http://portfoliodomourdok.files.wordpress.com/2010/06/captura-de-tela-2010-06-11-as-20-45-10.png" medium="image">
			<media:title type="html">GitG</media:title>
		</media:content>

		<media:content url="http://portfoliodomourdok.files.wordpress.com/2010/06/captura-de-tela-2010-06-11-as-21-32-50.png" medium="image">
			<media:title type="html">SQLite Browser</media:title>
		</media:content>

		<media:content url="http://portfoliodomourdok.files.wordpress.com/2010/06/captura-de-tela-2010-06-12-as-17-13-18.png" medium="image">
			<media:title type="html">Ruby Enterprise Edition 1.8.7</media:title>
		</media:content>

		<media:content url="http://portfoliodomourdok.files.wordpress.com/2010/06/captura-de-tela-2010-06-12-as-17-51-50.png" medium="image">
			<media:title type="html">gEdit</media:title>
		</media:content>

		<media:content url="http://portfoliodomourdok.files.wordpress.com/2010/06/captura-de-tela-2010-06-12-as-19-03-21.png" medium="image">
			<media:title type="html">Firefox</media:title>
		</media:content>
	</item>
		<item>
		<title>Como consumir JSON via jQuery?</title>
		<link>http://portfoliodomourdok.wordpress.com/2010/05/24/como-consumir-json-via-jquery/</link>
		<comments>http://portfoliodomourdok.wordpress.com/2010/05/24/como-consumir-json-via-jquery/#comments</comments>
		<pubDate>Mon, 24 May 2010 01:58:22 +0000</pubDate>
		<dc:creator>mourdok</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Mac OSX]]></category>
		<category><![CDATA[Rails]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[ajax]]></category>
		<category><![CDATA[ajax jquery]]></category>
		<category><![CDATA[ajax json]]></category>
		<category><![CDATA[datatable]]></category>
		<category><![CDATA[datatables jquery]]></category>
		<category><![CDATA[install will_paginate]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[javascript json]]></category>
		<category><![CDATA[jquery form]]></category>
		<category><![CDATA[jquery get]]></category>
		<category><![CDATA[jquery html]]></category>
		<category><![CDATA[jquery json]]></category>
		<category><![CDATA[jquery plugin]]></category>
		<category><![CDATA[json array]]></category>
		<category><![CDATA[json example]]></category>
		<category><![CDATA[json object]]></category>
		<category><![CDATA[leopard]]></category>
		<category><![CDATA[mac os leopard]]></category>
		<category><![CDATA[mac software]]></category>
		<category><![CDATA[macbook]]></category>
		<category><![CDATA[rails paginate]]></category>
		<category><![CDATA[rails pagination]]></category>
		<category><![CDATA[ruby gem]]></category>
		<category><![CDATA[ruby tutorial]]></category>
		<category><![CDATA[snow leopard]]></category>
		<category><![CDATA[will paginate]]></category>
		<category><![CDATA[will_paginate ajax]]></category>
		<category><![CDATA[will_paginate gem]]></category>
		<category><![CDATA[will_paginate plugin]]></category>
		<category><![CDATA[will_paginate rails]]></category>

		<guid isPermaLink="false">http://portfoliodomourdok.wordpress.com/?p=490</guid>
		<description><![CDATA[Oh não, Jason&#8230; Corra!!! Jason Voorhees, sobrou para você o trocadilho inicial desse artigo sobre como consumir JSON via jQuery. É claro, caso você tenha interesse, não deixe de escutar esse Podcast sobre a consagrada Franquia de Terror &#8211; Sexta-feira 13. Agora retornamos a nossa programação! Cenário Sistema Operacional: Mac OSX Dependências: Ruby, Rails, WillPaginate, [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=portfoliodomourdok.wordpress.com&amp;blog=7583293&amp;post=490&amp;subd=portfoliodomourdok&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p><img class="alignleft size-thumbnail wp-image-494" style="border:0 none;" title="JSON" src="http://portfoliodomourdok.files.wordpress.com/2010/05/json.png?w=150&#038;h=150" alt="" width="150" height="150" /></p>
<p>Oh não, Jason&#8230; Corra!!!</p>
<p> <img src='http://s0.wp.com/wp-includes/images/smilies/icon_biggrin.gif' alt=':-D' class='wp-smiley' />  <a title="Jason Voorhees" href="http://en.wikipedia.org/wiki/Jason_Voorhees">Jason Voorhees</a>, sobrou para você o trocadilho inicial desse artigo sobre como consumir <em>JSON</em> via <em>jQuery</em>.</p>
<p>É claro, caso você tenha interesse, não deixe de escutar esse <em>Podcast</em> sobre a consagrada <a title="Franquia de Terror" href="http://www.cinemacomrapadura.com.br/rapaduracast/?p=3304">Franquia de Terror &#8211; Sexta-feira 13</a>.</p>
<p>Agora retornamos a nossa programação!</p>
<p><span id="more-490"></span></p>
<h3><span style="color:#000080;">Cenário</span></h3>
<p>Sistema Operacional: <a title="Mac OSX" href="http://www.apple.com/macosx/">Mac OSX</a><br />
Dependências: <a title="Ruby" href="http://www.ruby-lang.org/pt/">Ruby</a>, <a title="Rails" href="http://rubyonrails.org/">Rails</a>, <a title="WillPaginate" href="http://github.com/mislav/will_paginate">WillPaginate</a>, <a title="jQuery" href="http://jquery.com/">jQuery</a></p>
<h3><span style="color:#000080;">Problema</span></h3>
<p>Você gosta de fazer a mesma coisa sempre? (Eu não) Por quê? (Isso não é divertido) Mas por quê? (Porque demanda um certo desperdício de tempo) Ah tudo bem!</p>
<p><img class="size-thumbnail wp-image-527 alignright" style="border:0 none;margin:10px;" title="O Gato com Sono" src="http://portfoliodomourdok.files.wordpress.com/2010/05/16.jpg?w=150&#038;h=104" alt="" width="150" height="104" /></p>
<p style="text-align:center;"><span style="color:#ffffff;">.</span></p>
<p style="text-align:center;">Então, da mesma forma que tento evitar essa repetição que acaba em sono e acabará realmente. Vide exemplo ao lado.</p>
<p style="text-align:center;"><span style="color:#ffffff;">.</span></p>
<p>Sua pessoa não quer ver o seu predileto <em>Browser</em> de <em>Internet</em>, lotado de <a title="Add-ons" href="https://addons.mozilla.org/pt-BR/firefox/">Add-ons</a>, recarregar uma pagina por completo. Quando o necessário é apenas atualizar uma pequenina parte do conteúdo dela.</p>
<h5>O caso de uso</h5>
<p>Vamos lá! Costumamos popular uma <a title="Table" href="http://www.w3schools.com/html/html_tables.asp">Table</a>, através do <a title="ERb" href="http://en.wikibooks.org/wiki/Ruby_on_Rails/ActionView/ERb">ERb</a>, codificado no exemplo abaixo:</p>
<pre class="brush: ruby; wrap-lines: false;">
&lt;!-- Parte do arquivo --&gt;
&lt;table&gt;

	&lt;tr&gt;
		&lt;th&gt;Description&lt;/th&gt;
	&lt;/tr&gt;

	&lt;% @reminders.each do |reminder| %&gt;
		&lt;tr&gt;
			&lt;td&gt;&lt;%=h reminder.description %&gt;&lt;/td&gt;
			&lt;td&gt;&lt;%= link_to 'Show', reminder %&gt;&lt;/td&gt;
			&lt;td&gt;&lt;%= link_to 'Edit', edit_reminder_path(reminder) %&gt;&lt;/td&gt;
			&lt;td&gt;&lt;%= link_to 'Destroy', reminder, :confirm =&gt; 'Are you sure?', :method =&gt; :delete %&gt;&lt;/td&gt;
		&lt;/tr&gt;
	&lt;% end %&gt;

&lt;/table&gt;

&lt;br /&gt;
&lt;%= will_paginate @reminders %&gt;
</pre>
<p>Algo bem básico, que aprendemos em cursos &#8220;Something for Dummies&#8221; <img src='http://s0.wp.com/wp-includes/images/smilies/icon_biggrin.gif' alt=':-D' class='wp-smiley' />  Nada fora do comum.</p>
<p>Mas agora. Como fazer para que somente a nossa tabela <em>HTML</em> sofra atualização de conteúdo? Via <em>JSON</em>? E o restante fique quietinho, ali na dele.</p>
<h3><span style="color:#000080;">Solução</span></h3>
<p>Usar o <a title="The Write Less, Do More" href="http://jquery.com/">The Write Less, Do More</a> do jovem <a title="John Resig" href="http://en.wikipedia.org/wiki/John_Resig">John Resig</a>, para consumir o <a title="JavaScript Object Notation" href="http://en.wikipedia.org/wiki/JSON">JavaScript Object Notation</a>, do conhecido <a title="Douglas Crockford" href="http://en.wikipedia.org/wiki/Douglas_Crockford">Douglas Crockford</a>. E para expor esse <em>JSON</em>, usaremos o <em>Rails</em> com uma pequena ajuda do <em>WillPaginate</em>.</p>
<h5>A aplicação Rails</h5>
<p><em>Command+Space</em> e dá-lhe <em>Terminal</em> no <a title="Spotlight" href="http://en.wikipedia.org/wiki/Spotlight_%28software%29">Spotlight</a>.</p>
<pre class="brush: bash; wrap-lines: false;">
# Criar o projeto Rails
cd ~/Documents/workspace-ruby &amp;&amp; rails todo &amp;&amp; cd todo

# Se você ainda não tiver a RubyGem NiftyGenerators
sudo gem install nifty-generators

# Definir o que nossa aplicação terá
script/generate nifty_scaffold reminder description:string
script/generate nifty_layout

# E finalmente criar o database
rake db:create &amp;&amp; rake db:migrate &amp;&amp; mate .
</pre>
<p>Agora no <a title="Textmate" href="http://macromates.com/">Textmate</a> pressionar <em>Command+t</em>, procurar o arquivo <em>environment.rb</em>, para adicionar a <a title="RubyGem" href="http://rubygems.org/">RubyGem</a> do <em>WillPaginate</em>.</p>
<pre class="brush: ruby; wrap-lines: false;">
# Parte do arquivo
Rails::Initializer.run do |config|
	config.gem &quot;will_paginate&quot;
end
</pre>
<p>Feito isso, no <em>Terminal</em> vamos certificar que essa <em>RubyGem</em> esta disponível.</p>
<pre class="brush: bash; wrap-lines: false;">
sudo rake gems:install
</pre>
<p>No <em>Textmate</em> pressionar <em>Command+t</em>, procurar o arquivo <em>reminders_controller.rb</em>, para ativar o <em>WillPaginate</em> no <em>Controller</em>.</p>
<pre class="brush: ruby; wrap-lines: false;">
# Parte do arquivo
class RemindersController &lt; ApplicationController
	def index
		@reminders = Reminder.paginate :page =&gt; params[:page], :per_page =&gt; 100
	end
end
</pre>
<p>Ainda no <em>Textmate</em> pressionar <em>Command+t</em>, procurar o arquivo <em>index.html.erb</em>, para ativar o <em>WillPaginate</em> na <em>View</em>. Temporariamente é claro, o objetivo aqui é justamente não utilizar o suporte do <em>WillPaginate</em> na View, apenas no <em>Controller</em> será o suficiente.</p>
<pre class="brush: ruby; wrap-lines: false;">
&lt;% title &quot;Reminders&quot; %&gt;

&lt;table&gt;

	&lt;tr&gt;
		&lt;th&gt;Description&lt;/th&gt;
	&lt;/tr&gt;

	&lt;% for reminder in @reminders %&gt;
		&lt;tr&gt;
			&lt;td&gt;&lt;%=h reminder.description %&gt;&lt;/td&gt;
			&lt;td&gt;&lt;%= link_to &quot;Show&quot;, reminder %&gt;&lt;/td&gt;
			&lt;td&gt;&lt;%= link_to &quot;Edit&quot;, edit_reminder_path(reminder) %&gt;&lt;/td&gt;
			&lt;td&gt;&lt;%= link_to &quot;Destroy&quot;, reminder, :confirm =&gt; 'Are you sure?', :method =&gt; :delete %&gt;&lt;/td&gt;
		&lt;/tr&gt;
	&lt;% end %&gt;

&lt;/table&gt;

&lt;!-- Inserir esse bloco --&gt;
&lt;br /&gt;
&lt;%= will_paginate @reminders %&gt;
&lt;!-- Inserir esse bloco --&gt;

&lt;p&gt;&lt;%= link_to &quot;New Reminder&quot;, new_reminder_path %&gt;&lt;/p&gt;
</pre>
<p>E precisamos também popular o nosso <em>database</em>. Uma forma legal de fazer essa geração, dos dados de mentirinha <img src='http://s0.wp.com/wp-includes/images/smilies/icon_biggrin.gif' alt=':-D' class='wp-smiley' /> , é com a <em>RubyGem</em> <a title="Faker" href="http://faker.rubyforge.org/">Faker</a>. Super prática e com uma <a title="API" href="http://faker.rubyforge.org/rdoc/">API</a> de fácil fluência.</p>
<pre class="brush: bash; wrap-lines: false;">
# Se você ainda não tiver a RubyGem Faker
sudo gem install faker

# Digitar no Terminal
script/console

# Legal (!) IRB com gostinho de Rails
require 'faker'
1000.times { Reminder.create!(:description =&gt; Faker::Name.name) }
exit

# E para completar start a aplicação
script/server
</pre>
<p>Ah! Nota, no próprio <em>Terminal</em> abra o seu <em>Browser</em> padrão através da dica abaixo.</p>
<pre class="brush: bash; wrap-lines: false;">
# Command+t para ter uma novíssima aba
open http://localhost:3000/reminders
</pre>
<p>E assim temos nossa tabela paginando da forma mais simples possível.</p>
<h5>Refatorar a aplicação: Adicionar jQuery</h5>
<p>Por padrão o <em>Rails</em> vem com as bibliotecas de <em>JavaScript</em> do <a title="PrototypeJS" href="http://www.prototypejs.org/">PrototypeJS</a>, porém as bibliotecas que utilizaremos nesse artigo, serão do <em>jQuery</em>.</p>
<p>Um dos motivos é claro, estou com vários livros aqui em casa sobre o <em>jQuery</em>:</p>
<ul>
<li><a title="jQuery - Visual QuickStart Guide" href="http://www.amazon.com/jQuery-Visual-QuickStart-Steven-Holzner/dp/0321647491">jQuery &#8211; Visual QuickStart Guide</a></li>
<li><a title="jQuery Cookbook - Solutions &amp; Examples for jQuery Developers" href="http://www.amazon.com/jQuery-Cookbook-Solutions-Examples-Developers/dp/0596159773/ref=sr_1_1?ie=UTF8&amp;s=books&amp;qid=1275099978&amp;sr=1-1">jQuery Cookbook &#8211; Solutions &amp; Examples for jQuery Developers</a></li>
<li><a title="jQuery in Action - Second Edition" href="http://www.amazon.com/jQuery-Action-Second-Bear-Bibeault/dp/1935182323/ref=sr_1_1?ie=UTF8&amp;s=books&amp;qid=1275100053&amp;sr=1-1">jQuery in Action &#8211; Second Edition</a></li>
<li><a title="jQuery Recipes - A Problem Solution Approach" href="http://www.amazon.com/reader/1430227095?_encoding=UTF8&amp;ref_=sib_dp_pt#reader-link">jQuery Recipes &#8211; A Problem Solution Approach</a></li>
<li><a title="Learning jQuery 1.3" href="http://www.amazon.com/Learning-jQuery-1-3-Jonathan-Chaffer/dp/1847196705/ref=sr_1_1?ie=UTF8&amp;s=books&amp;qid=1275100205&amp;sr=1-1">Learning jQuery 1.3</a></li>
</ul>
<p>Então preciso praticar meus estudos em alguns &#8220;Casos de Uso&#8221;. Ah! E depois publicar no meu <em>Blog</em> <img src='http://s0.wp.com/wp-includes/images/smilies/icon_biggrin.gif' alt=':-D' class='wp-smiley' />  Não tem graça reter conhecimento.</p>
<p>Assim chega de papo, é hora de pegar essas dependências do <em>jQuery</em> na <em>Web</em>. E faremos isso de uma maneira muito simples, pois utilizaremos um <em>Plug-in</em> no estilo <em>Grid</em> chamado <a title="DataTables" href="http://www.datatables.net/">DataTables</a> que já vem com tudo o que precisamos. Então volte ao <em>Terminal</em>.</p>
<pre class="brush: bash; wrap-lines: false;">
# Baixar o Plug-in DataTables no diretório Downloads do usuário
cd ~/Downloads &amp;&amp; wget http://www.datatables.net/releases/dataTables-1.6.2.zip &amp;&amp; tar -zvxf dataTables-1.6.2.zip &amp;&amp; rm dataTables-1.6.2.zip

# Mover os arquivos para o projeto Rails
cp dataTables-1.6/media/css/*.* ~/Documents/workspace-ruby/todo/public/stylesheets
cp dataTables-1.6/media/images/*.* ~/Documents/workspace-ruby/todo/public/images
cp dataTables-1.6/media/js/*.* ~/Documents/workspace-ruby/todo/public/javascripts
</pre>
<p>Legal, podemos voltar para o <em>Textmate</em> agora e codificar mais um pouco. Então no <em>Textmate</em> pressionar <em>Command+t</em>, procurar o arquivo <em>application.html.erb</em>, para adicionar um novo bloco <em>Yield</em> no <em>View</em>. Nosso arquivo deve ficar conforme abaixo:</p>
<pre class="brush: ruby; wrap-lines: false;">
&lt;!DOCTYPE html PUBLIC &quot;-//W3C//DTD XHTML 1.0 Strict//EN&quot;
	&quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd&quot;&gt;
&lt;html xmlns=&quot;http://www.w3.org/1999/xhtml&quot;&gt;

	&lt;head&gt;
		&lt;title&gt;&lt;%= h(yield(:title) || &quot;Untitled&quot;) %&gt;&lt;/title&gt;
		&lt;%= stylesheet_link_tag 'application' %&gt;
		&lt;%= yield(:head) %&gt;
	&lt;/head&gt;

	&lt;body&gt;
		&lt;div id=&quot;container&quot;&gt;
			&lt;%- flash.each do |name, msg| -%&gt;
				&lt;%= content_tag :div, msg, :id =&gt; &quot;flash_#{name}&quot; %&gt;
			&lt;%- end -%&gt;

			&lt;%- if show_title? -%&gt;
				&lt;h1&gt;&lt;%=h yield(:title) %&gt;&lt;/h1&gt;
			&lt;%- end -%&gt;

			&lt;%= yield %&gt;

			&lt;!-- Inserir esse bloco --&gt;
				&lt;%= yield(:javascript_end_of_the_body) %&gt;
			&lt;!-- Inserir esse bloco --&gt;
			&lt;/div&gt;
	&lt;/body&gt;

&lt;/html&gt;
</pre>
<p>Ainda no <em>Textmate</em> pressionar <em>Command+t</em>, procurar o  arquivo <em>index.html.erb</em>, para adicionar as dependências do <em>jQuery</em> no <em>View</em>. Além de remover aquela tabela feia daqui, no lugar deixando uma bela <a title="DIV" href="http://www.w3schools.com/tags/tag_div.asp">DIV</a>. Nosso arquivo deve ficar conforme abaixo:</p>
<pre class="brush: ruby; wrap-lines: false;">
&lt;% content_for :head do %&gt;
	&lt;%= stylesheet_link_tag 'demo_table_jui' %&gt;
&lt;% end %&gt;

&lt;% title &quot;Reminders&quot; %&gt;

&lt;div id=&quot;myTable&quot;&gt;&lt;/div&gt;

&lt;p&gt;&lt;%= link_to &quot;New Reminder&quot;, new_reminder_path %&gt;&lt;/p&gt;

&lt;% content_for :javascript_end_of_the_body do %&gt;
	&lt;script type=&quot;text/javascript&quot;&gt;
		var authenticity_token = '&lt;%= form_authenticity_token %&gt;';
	&lt;/script&gt;
	&lt;%= javascript_include_tag 'jquery' %&gt;
	&lt;%= javascript_include_tag 'jquery.dataTables' %&gt;
	&lt;%= javascript_include_tag 'views.registros.index' %&gt;
&lt;% end %&gt;
</pre>
<p>Hummm, algo interessante de comentar aqui, é a utilização do código <em>JavaScript</em> no final do <a title="Body" href="http://www.w3schools.com/tags/tag_body.asp">Body</a>. Isso faz com que o carregamento da página seja muito mais rápido.</p>
<p>Pois quer você queira ou não, bibliotecas como <em>PrototypeJS</em> e <em>jQuery</em> tem uma boa quantidade de código. Que se você deixar pra carregar no <a title="Head" href="http://www.w3schools.com/tags/tag_head.asp">Head</a>, você terá um pequeno problema de performance no carregamento dela.</p>
<p>Não é à toa que a turma <em>Developers</em> do <a title="Yahoo" href="http://developer.yahoo.com/performance/rules.html#js_bottom">Yahoo</a>, indica a prática descrita anteriormente, como uma boa opção de uso. E os <em>Engineers</em> do <a title="Google" href="http://code.google.com/intl/pt-BR/speed/page-speed/docs/rendering.html#PutCSSInHead">Google</a>, colaboram com a dica de permanecer com <em>CSS</em> no topo. Viu!</p>
<p>Rapidamente criaremos um arquivo <em>JavaScript</em> que utilizaremos mais a frente. Volte ao <em>Terminal</em>.</p>
<pre class="brush: bash; wrap-lines: false;">
cd ~/Documents/workspace-ruby/todo &amp;&amp; touch public/javascripts/views.registros.index.js
</pre>
<h5>Refatorar a aplicação: Expor JSON</h5>
<p>No <em>Textmate</em> pressionar <em>Command+t</em>, procurar o arquivo <em>reminders_controller.rb</em>. Aqui faremos uma pequena adição de código, pois precisamos fazer com que o <em>Rails</em> retorne não somente uma rota <em>HTML</em> mas como também uma novíssima rota <em>JSON</em>. Porém deixando apenas para a rota <em>JSON</em> a funcionalidade de retornar dados do nosso <em>Model</em>. Nosso arquivo deve ficar conforme abaixo:</p>
<pre class="brush: ruby; wrap-lines: false;">
# Parte do arquivo
class RemindersController &lt; ApplicationController
	def index
		respond_to do |wants|
			wants.html
			wants.json { render :json =&gt; Reminder.paginate(:page =&gt; params[:page], :per_page =&gt; 100) }
		end
	end
end
</pre>
<p>Se fizermos um pequeno teste agora, veremos que já é possível consumir esse <em>JSON</em> via <em>Terminal</em>. Usando a biblioteca <a title="cURL" href="http://en.wikipedia.org/wiki/CURL">cURL</a>, muito conhecida no mundo <a title="Unix" href="http://en.wikipedia.org/wiki/Unix">Unix</a>:</p>
<pre class="brush: bash; wrap-lines: false;">
curl http://localhost:3000/reminders.json
</pre>
<p>Teremos um retorno semelhante ao descrito a seguir:</p>
<pre class="brush: bash;">
# Parte do arquivo
[{&quot;reminder&quot;:{&quot;created_at&quot;:&quot;2010-05-23T20:15:24Z&quot;,&quot;updated_at&quot;:&quot;2010-05-23T20:15:24Z&quot;,&quot;id&quot;:1,&quot;description&quot;:&quot;Something write in... Sun May 23 17:15:24 -0300 2010&quot;}},{&quot;reminder&quot;:{&quot;created_at&quot;:&quot;2010-05-23T20:15:24Z&quot;,&quot;updated_at&quot;:&quot;2010-05-23T20:15:24Z&quot;,&quot;id&quot;:2,&quot;description&quot;:&quot;Something write in... Sun May 23 17:15:24 -0300 2010&quot;}},{&quot;reminder&quot;:{&quot;created_at&quot;:&quot;2010-05-23T20:15:24Z&quot;,&quot;updated_at&quot;:&quot;2010-05-23T20:15:24Z&quot;,&quot;id&quot;:3,&quot;description&quot;:&quot;Something write in... Sun May 23 17:15:24 -0300 2010&quot;}},{&quot;reminder&quot;:{&quot;created_at&quot;:&quot;2010-05-23T20:15:24Z&quot;,&quot;updated_at&quot;:&quot;2010-05-23T20:15:24Z&quot;,&quot;id&quot;:4,&quot;description&quot;:&quot;Something write in... Sun May 23 17:15:24 -0300 2010&quot;}},{&quot;reminder&quot;:{&quot;created_at&quot;:&quot;2010-05-23T20:15:24Z&quot;,&quot;updated_at&quot;:&quot;2010-05-23T20:15:24Z&quot;,&quot;id&quot;:5,&quot;description&quot;:&quot;Something write in... Sun May 23 17:15:24 -0300 2010&quot;}},{&quot;reminder&quot;:{&quot;created_at&quot;:&quot;2010-05-23T20:15:24Z&quot;,&quot;updated_at&quot;:&quot;2010-05-23T20:15:24Z&quot;,&quot;id&quot;:6,&quot;description&quot;:&quot;Something write in... Sun May 23 17:15:24 -0300 2010&quot;}},{&quot;reminder&quot;:{&quot;created_at&quot;:&quot;2010-05-23T20:15:24Z&quot;,&quot;updated_at&quot;:&quot;2010-05-23T20:15:24Z&quot;,&quot;id&quot;:7,&quot;description&quot;:&quot;Something write in... Sun May 23 17:15:24 -0300 2010&quot;}},{&quot;reminder&quot;:{&quot;created_at&quot;:&quot;2010-05-23T20:15:24Z&quot;,&quot;updated_at&quot;:&quot;2010-05-23T20:15:24Z&quot;,&quot;id&quot;:8,&quot;description&quot;:&quot;Something write in... Sun May 23 17:15:24 -0300 2010&quot;}},{&quot;reminder&quot;:{&quot;created_at&quot;:&quot;2010-05-23T20:15:24Z&quot;,&quot;updated_at&quot;:&quot;2010-05-23T20:15:24Z&quot;,&quot;id&quot;:9,&quot;description&quot;:&quot;Something write in... Sun May 23 17:15:24 -0300 2010&quot;}},{&quot;reminder&quot;:{&quot;created_at&quot;:&quot;2010-05-23T20:15:24Z&quot;,&quot;updated_at&quot;:&quot;2010-05-23T20:15:24Z&quot;,&quot;id&quot;:10,&quot;description&quot;:&quot;Something write in... Sun May 23 17:15:24 -0300 2010&quot;}}]
</pre>
<p>É um retorno bem comprimido, sem <em>Syntaxhighlighter</em> e <a title="Indentação" href="http://pt.wikipedia.org/wiki/Indenta%C3%A7%C3%A3o">Indentação</a>. Cru!</p>
<p>Agora veremos esse mesmo código só que no velho guerreiro <em>Firefox</em>, utilizando o <em>Add-on</em> <a title="JSONView" href="https://addons.mozilla.org/pt-BR/firefox/addon/10869/">JSONView</a> do <em>Geek</em> <a title="Ben Hollis" href="http://benhollis.net/">Ben Hollis</a>.</p>
<p style="text-align:center;"><img class="aligncenter size-full wp-image-557" style="border:0 none;" title="JSONView" src="http://portfoliodomourdok.files.wordpress.com/2010/05/captura-de-tela-2010-05-24-as-23-30-42.png?w=500&#038;h=259" alt="" width="500" height="259" /></p>
<p>Observação, recentemente testei esse mesmo <em>Add-on</em> no <a title="Chrome" href="http://www.google.com.br/chrome">Chrome</a> e ele também funciona perfeitamente.</p>
<h5>Refatorar a aplicação: Consumir JSON</h5>
<p>Ufa, finalmente! Chegamos ao momento de codificar em <em>JavaScript</em>. No <em>Textmate</em> pressionar <em>Command+t</em>, procurar aquele arquivo <em>views.registros.index.js</em>. Ele deve ficar conforme abaixo:</p>
<pre class="brush: jscript; wrap-lines: false;">
$(function(){
	const PLACE = '#myTable',

	RESOURCE = '/reminders.json?page=',

	PER_PAGE = 100;

	var object = {
		'aaData':[],
		'aoColumns':[{'sTitle':'Created At'}, {'sTitle':'Description'}, {'sTitle':'Action'}],
		'bJQueryUI':true,
		'bPaginate':false,
		'bLengthChange':false,
		'bFilter':true,
		'bSort':false,
		'bInfo':false,
		'bAutoWidth':false
	},

	page = 1;

	$.fn.dataTableJSON = function(){
		$(PLACE).ajaxSend(function(){
			$(this).text('Loading...');
		});

		$.getJSON(RESOURCE + page, function(data){
			$.fn.resourceConsuming(data);
			$.fn.reloadTable();
			$.fn.pagination();
		});
	};
	$.fn.dataTableJSON();

	$.fn.resourceConsuming = function(data){
		object['aaData'] = [];

		$.each(data, function(key, value){
			object['aaData'].push([
				value['reminder']['created_at'].slice(0, 10) +
				' - ' +
				value['reminder']['created_at'].slice(11, 19),

				'&lt;a href=&quot;/reminders/' + value['reminder']['id'] + '&quot;&gt;' + value['reminder']['description'] + '&lt;/a&gt;',

				'&lt;a href=&quot;/reminders/' + value['reminder']['id'] + '/edit&quot;&gt;Edit&lt;/a&gt;' +
				' || ' +
				'&lt;a onclick=&quot;if (confirm(\'Are you sure?\')) { var f = document.createElement(\'form\'); f.style.display = \'none\'; this.parentNode.appendChild(f); f.method = \'POST\'; f.action = this.href;var m = document.createElement(\'input\'); m.setAttribute(\'type\', \'hidden\'); m.setAttribute(\'name\', \'_method\'); m.setAttribute(\'value\', \'delete\'); f.appendChild(m);var s = document.createElement(\'input\'); s.setAttribute(\'type\', \'hidden\'); s.setAttribute(\'name\', \'authenticity_token\'); s.setAttribute(\'value\', \'' + authenticity_token + '\'); f.appendChild(s);f.submit(); };return false;&quot; href=&quot;/reminders/' + value['reminder']['id'] + '&quot;&gt;Destroy&lt;/a&gt;'
			]);
		});
	};

	$.fn.reloadTable = function() {
		$(PLACE).html('');

		$(PLACE)
			.append('&lt;br /&gt;')
			.append('&lt;table cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; border=&quot;0&quot; class=&quot;display&quot; id=&quot;dataTableJSON&quot;&gt;&lt;/table&gt;')
			.append('&lt;br /&gt;');

		$('#dataTableJSON').dataTable(object);
	};

	$.fn.pagination = function(){
		$(PLACE)
			.append('&lt;div id=&quot;dataTableJSON_paginate&quot; class=&quot;dataTables_paginate paging_two_button&quot;&gt;&lt;div id=&quot;dataTableJSON_previous&quot; title=&quot;Previous&quot; class=&quot;paginate_disabled_previous&quot;&gt;&lt;/div&gt;&lt;div id=&quot;dataTableJSON_next&quot; title=&quot;Next&quot; class=&quot;paginate_disabled_next&quot;&gt;&lt;/div&gt;&lt;/div&gt;')
			.append('&lt;p&gt;&amp;nbsp;&lt;/p&gt;');

		(page === 1) ? $('#dataTableJSON_previous').hide() : $.fn.previousPage();

		(object['aaData'].length &lt; PER_PAGE) ? $.fn.lastPage() : $.fn.nextPage();
	};

	$.fn.previousPage = function(){
		$('#dataTableJSON_previous').click(function(){
			$(this).hide();
			$('#dataTableJSON_next').hide();
			--page;
			$.fn.dataTableJSON();
		});
	};

	$.fn.nextPage = function(){
		$('#dataTableJSON_next').click(function(){
			$(this).hide();
			$('#dataTableJSON_previous').hide();
			++page;
			$.fn.dataTableJSON();
		});
	};

	$.fn.lastPage = function(){
		$('#dataTableJSON_next').hide();
		if (object['aaData'].length === 0) { --page; $.fn.dataTableJSON(); }
	};
});
</pre>
<p>E eu sei, código <em>JavaScript</em> com <em>jQuery</em> fica bonito como açúcar. Mas prefiro explicar rapidamente cada parte, do código anterior e assim deixar mais alguns links do <em>jQuery</em> só que dessa vez da <em>API</em> dele.</p>
<p>No arquivo <em>views.registros.index.js</em>, é executado o <em>Helper</em> chamado <a title="form_authenticity_token" href="http://apidock.com/rails/ActionController/RequestForgeryProtection/form_authenticity_token">form_authenticity_token</a> do <em>Rails</em>. Sem ele nós receberíamos o erro <em>ActionController::InvalidAuthenticityToken</em>.</p>
<pre class="brush: ruby; wrap-lines: false;">
&lt;!-- Parte do arquivo --&gt;
&lt;script type=&quot;text/javascript&quot;&gt;
	var authenticity_token = '&lt;%= form_authenticity_token %&gt;';
&lt;/script&gt;
</pre>
<p>No arquivo <em>index.html.erb</em>, respeitamos a boa prática de não anteceder/declarar <em>const</em> ou <em>var</em> para tudo quanto é objeto/variável <em>JavaScript</em>. E como também tento deixar o mais visivelmente, dentro do possível, as variáveis que devemos &#8220;setar&#8221; para essa nossa aplicação funcionar.</p>
<pre class="brush: jscript; wrap-lines: false;">
// Parte do arquivo
// Definimos o atributo ID que devemos pegar daquela DIV do arquivo index.html.erb
const PLACE = '#myTable',

// Definimos o Location do nosso recurso JSON
RESOURCE = '/reminders.json?page=',

// Definimos quantos registros serão retornados por pagina
PER_PAGE = 100;

// Definimos o objeto que populará o nosso Plug-in DataTables
var object = {
	'aaData':[],
	'aoColumns':[{'sTitle':'Created At'}, {'sTitle':'Description'}, {'sTitle':'Action'}],
	'bJQueryUI':true,
	'bPaginate':false,
	'bLengthChange':false,
	'bFilter':true,
	'bSort':false,
	'bInfo':false,
	'bAutoWidth':false
},

// E ufa definimos também em que pé a nossa paginação inicializará
page = 1;
</pre>
<p>Feito isso, o próximo passo foi definir algo que podemos &#8220;denominar de construtor&#8221; do nosso código <em>JavaScript</em>. Mas isso não é um construtor, tudo bem. Assim logo de cara nos deparamos com duas características do <em>jQuery</em>:</p>
<ul>
<li><a title="Plugins/Authoring" href="http://docs.jquery.com/Plugins/Authoring">Plugins/Authoring</a></li>
<li><a title=".ajaxSend()" href="http://api.jquery.com/ajaxSend/">.ajaxSend()</a></li>
<li><a title="jQuery.getJSON()" href="http://api.jquery.com/jQuery.getJSON/">jQuery.getJSON()</a></li>
</ul>
<pre class="brush: jscript; wrap-lines: false;">
// Parte do arquivo
// Então definimos nosso construtor de mentirinha
$.fn.dataTableJSON = function(){

	// Adicionamos uma pequena mensagem enquanto o JSON é carregado
	$(PLACE).ajaxSend(function(){
		$(this).text('Loading...');
	});

	// Que chama o nosso recurso JSON
	$.getJSON(RESOURCE + page, function(data){

		// Depois consome ele
		$.fn.resourceConsuming(data);

		// Daí ele constrói a nossa tabela
		$.fn.reloadTable();

		// E paginamos tudo
		// É paginamos, isso mesmo, nada de usar o Helper do WillPaginate aqui na View
		$.fn.pagination();
	});

};

// E finalmente executamos tudo isso. Ufa!
$.fn.dataTableJSON();
</pre>
<p>Mas tudo isso, o quê? Como disse vamos por partes! Aqui brincaremos com <em>Array</em> do <em>JavaScript</em> e com uma característica de <em>Loop</em> muito bonita do <em>jQuery</em>:</p>
<ul>
<li><a title="jQuery.each()" href="http://api.jquery.com/jQuery.each/">jQuery.each()</a></li>
</ul>
<pre class="brush: jscript; wrap-lines: false;">
// Parte do arquivo
$.fn.resourceConsuming = function(data){
	object['aaData'] = [];

	// Isso daqui é um Loop
	// Um bonito Loop que para Each item, criamos uma Function key/value
	// Que consome o nosso JSON adicionando-o naquela variável object
	$.each(data, function(key, value){
		object['aaData'].push([

			// Até aqui nada demais
			// Brincamos com o método Slice, para formatar a data
			value['reminder']['created_at'].slice(0, 10) +
			' - ' +
			value['reminder']['created_at'].slice(11, 19),

			// Aqui adicionamos um link, nada demais
			'&lt;a href=&quot;/reminders/' + value['reminder']['id'] + '&quot;&gt;' + value['reminder']['description'] + '&lt;/a&gt;',

			// Outro link, nada demais
			'&lt;a href=&quot;/reminders/' + value['reminder']['id'] + '/edit&quot;&gt;Edit&lt;/a&gt;' +
			' || ' +

			// Essa parte é muito importante
			// Basicamente um Command+c e Command+v do Helper link_to
			// Que recebe, aquele, authenticity_token
			'&lt;a onclick=&quot;if (confirm(\'Are you sure?\')) { var f = document.createElement(\'form\'); f.style.display = \'none\'; this.parentNode.appendChild(f); f.method = \'POST\'; f.action = this.href;var m = document.createElement(\'input\'); m.setAttribute(\'type\', \'hidden\'); m.setAttribute(\'name\', \'_method\'); m.setAttribute(\'value\', \'delete\'); f.appendChild(m);var s = document.createElement(\'input\'); s.setAttribute(\'type\', \'hidden\'); s.setAttribute(\'name\', \'authenticity_token\'); s.setAttribute(\'value\', \'' + authenticity_token + '\'); f.appendChild(s);f.submit(); };return false;&quot; href=&quot;/reminders/' + value['reminder']['id'] + '&quot;&gt;Destroy&lt;/a&gt;'
		]);
	});

};
</pre>
<p>Avançando rapidamente chegamos a parte em que passamos o <em>Object</em> para a <em>Table</em>, usando também as facilidades que o <em>jQuery</em> oferece.</p>
<ul>
<li><a title=".html()" href="http://api.jquery.com/html/">.html()</a></li>
<li><a title=".append()" href="http://api.jquery.com/append/">.append()</a></li>
<li><a title=".dataTable()" href="http://www.datatables.net/examples/basic_init/zero_config.html">.dataTable()</a>, mas esse daqui é uma funcionalidade do <em>Plug-in</em> já citado <em>DataTables</em></li>
</ul>
<pre class="brush: jscript; wrap-lines: false;">
// Parte do arquivo
$.fn.reloadTable = function() {

	// Limpamos o conteudo do nosso PLACE
	$(PLACE).html('');

	// Adicionanamos um novo conteúdo
	$(PLACE)
		.append('&lt;br /&gt;')
		.append('&lt;table cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; border=&quot;0&quot; class=&quot;display&quot; id=&quot;dataTableJSON&quot;&gt;&lt;/table&gt;')
		.append('&lt;br /&gt;');

	// E chamamos o dataTable
	$('#dataTableJSON').dataTable(object);
};
</pre>
<p>O restante do código é toda a parte de paginação do nosso <em>Grid</em>, nada demais.</p>
<pre class="brush: jscript; wrap-lines: false;">
// Parte do arquivo
$.fn.pagination = function(){
	$(PLACE)
		.append('&lt;div id=&quot;dataTableJSON_paginate&quot; class=&quot;dataTables_paginate paging_two_button&quot;&gt;&lt;div id=&quot;dataTableJSON_previous&quot; title=&quot;Previous&quot; class=&quot;paginate_disabled_previous&quot;&gt;&lt;/div&gt;&lt;div id=&quot;dataTableJSON_next&quot; title=&quot;Next&quot; class=&quot;paginate_disabled_next&quot;&gt;&lt;/div&gt;&lt;/div&gt;')
		.append('&lt;p&gt;&amp;nbsp;&lt;/p&gt;');

	(page === 1) ? $('#dataTableJSON_previous').hide() : $.fn.previousPage();

	(object['aaData'].length &lt; PER_PAGE) ? $.fn.lastPage() : $.fn.nextPage();
};

$.fn.previousPage = function(){
	$('#dataTableJSON_previous').click(function(){
		$(this).hide();
		$('#dataTableJSON_next').hide();
		--page;
		$.fn.dataTableJSON();
	});
};

$.fn.nextPage = function(){
	$('#dataTableJSON_next').click(function(){
		$(this).hide();
		$('#dataTableJSON_previous').hide();
		++page;
		$.fn.dataTableJSON();
	});
};

$.fn.lastPage = function(){
	$('#dataTableJSON_next').hide();
	if (object['aaData'].length === 0) { --page; $.fn.dataTableJSON(); }
};
</pre>
<p><img class="alignleft size-thumbnail wp-image-494" style="border:0 none;" title="JSON" src="http://portfoliodomourdok.files.wordpress.com/2010/05/o-gato.jpg?w=150&#038;h=150" alt="" width="150" height="150" /></p>
<p style="text-align:center;"><span style="color:#ffffff;">.</span></p>
<p style="text-align:center;">Viu!</p>
<p style="text-align:center;">Não foi tão doloroso assim, escrever um pouco de código <em>JavaScript</em>.</p>
<p style="text-align:center;"><span style="color:#ffffff;">.</span></p>
<p style="text-align:center;"><span style="color:#ffffff;">.</span></p>
<p> <img src='http://s0.wp.com/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /><br />
Bom é isso caro leitor.</p>
<p>Quem escreveu foi o André Moreira.<br />
Obrigado pela visita e até o próximo post.</p>
<br />Filed under: <a href='http://portfoliodomourdok.wordpress.com/category/javascript/'>JavaScript</a>, <a href='http://portfoliodomourdok.wordpress.com/category/mac-osx/'>Mac OSX</a>, <a href='http://portfoliodomourdok.wordpress.com/category/rails/'>Rails</a>, <a href='http://portfoliodomourdok.wordpress.com/category/ruby/'>Ruby</a> Tagged: <a href='http://portfoliodomourdok.wordpress.com/tag/ajax/'>ajax</a>, <a href='http://portfoliodomourdok.wordpress.com/tag/ajax-jquery/'>ajax jquery</a>, <a href='http://portfoliodomourdok.wordpress.com/tag/ajax-json/'>ajax json</a>, <a href='http://portfoliodomourdok.wordpress.com/tag/datatable/'>datatable</a>, <a href='http://portfoliodomourdok.wordpress.com/tag/datatables-jquery/'>datatables jquery</a>, <a href='http://portfoliodomourdok.wordpress.com/tag/install-will_paginate/'>install will_paginate</a>, <a href='http://portfoliodomourdok.wordpress.com/tag/javascript-2/'>javascript</a>, <a href='http://portfoliodomourdok.wordpress.com/tag/javascript-json/'>javascript json</a>, <a href='http://portfoliodomourdok.wordpress.com/tag/jquery-form/'>jquery form</a>, <a href='http://portfoliodomourdok.wordpress.com/tag/jquery-get/'>jquery get</a>, <a href='http://portfoliodomourdok.wordpress.com/tag/jquery-html/'>jquery html</a>, <a href='http://portfoliodomourdok.wordpress.com/tag/jquery-json/'>jquery json</a>, <a href='http://portfoliodomourdok.wordpress.com/tag/jquery-plugin/'>jquery plugin</a>, <a href='http://portfoliodomourdok.wordpress.com/tag/json-array/'>json array</a>, <a href='http://portfoliodomourdok.wordpress.com/tag/json-example/'>json example</a>, <a href='http://portfoliodomourdok.wordpress.com/tag/json-object/'>json object</a>, <a href='http://portfoliodomourdok.wordpress.com/tag/leopard/'>leopard</a>, <a href='http://portfoliodomourdok.wordpress.com/tag/mac-os-leopard/'>mac os leopard</a>, <a href='http://portfoliodomourdok.wordpress.com/tag/mac-osx/'>Mac OSX</a>, <a href='http://portfoliodomourdok.wordpress.com/tag/mac-software/'>mac software</a>, <a href='http://portfoliodomourdok.wordpress.com/tag/macbook/'>macbook</a>, <a href='http://portfoliodomourdok.wordpress.com/tag/rails-paginate/'>rails paginate</a>, <a href='http://portfoliodomourdok.wordpress.com/tag/rails-pagination/'>rails pagination</a>, <a href='http://portfoliodomourdok.wordpress.com/tag/ruby-gem/'>ruby gem</a>, <a href='http://portfoliodomourdok.wordpress.com/tag/ruby-tutorial/'>ruby tutorial</a>, <a href='http://portfoliodomourdok.wordpress.com/tag/snow-leopard/'>snow leopard</a>, <a href='http://portfoliodomourdok.wordpress.com/tag/will-paginate/'>will paginate</a>, <a href='http://portfoliodomourdok.wordpress.com/tag/will_paginate-ajax/'>will_paginate ajax</a>, <a href='http://portfoliodomourdok.wordpress.com/tag/will_paginate-gem/'>will_paginate gem</a>, <a href='http://portfoliodomourdok.wordpress.com/tag/will_paginate-plugin/'>will_paginate plugin</a>, <a href='http://portfoliodomourdok.wordpress.com/tag/will_paginate-rails/'>will_paginate rails</a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/portfoliodomourdok.wordpress.com/490/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/portfoliodomourdok.wordpress.com/490/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/portfoliodomourdok.wordpress.com/490/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/portfoliodomourdok.wordpress.com/490/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/portfoliodomourdok.wordpress.com/490/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/portfoliodomourdok.wordpress.com/490/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/portfoliodomourdok.wordpress.com/490/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/portfoliodomourdok.wordpress.com/490/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/portfoliodomourdok.wordpress.com/490/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/portfoliodomourdok.wordpress.com/490/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/portfoliodomourdok.wordpress.com/490/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/portfoliodomourdok.wordpress.com/490/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/portfoliodomourdok.wordpress.com/490/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/portfoliodomourdok.wordpress.com/490/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=portfoliodomourdok.wordpress.com&amp;blog=7583293&amp;post=490&amp;subd=portfoliodomourdok&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://portfoliodomourdok.wordpress.com/2010/05/24/como-consumir-json-via-jquery/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/28c68b93b7780192ed6f40ab194c4859?s=96&#38;d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96&#38;r=G" medium="image">
			<media:title type="html">André Moreira </media:title>
		</media:content>

		<media:content url="http://portfoliodomourdok.files.wordpress.com/2010/05/json.png?w=150" medium="image">
			<media:title type="html">JSON</media:title>
		</media:content>

		<media:content url="http://portfoliodomourdok.files.wordpress.com/2010/05/16.jpg?w=150" medium="image">
			<media:title type="html">O Gato com Sono</media:title>
		</media:content>

		<media:content url="http://portfoliodomourdok.files.wordpress.com/2010/05/captura-de-tela-2010-05-24-as-23-30-42.png" medium="image">
			<media:title type="html">JSONView</media:title>
		</media:content>

		<media:content url="http://portfoliodomourdok.files.wordpress.com/2010/05/o-gato.jpg?w=150" medium="image">
			<media:title type="html">JSON</media:title>
		</media:content>
	</item>
		<item>
		<title>Simples Deploy de Aplicação JRubyOnRails com Warbler</title>
		<link>http://portfoliodomourdok.wordpress.com/2010/04/03/simples-deploy-de-aplicacao-jrubyonrails-com-warbler/</link>
		<comments>http://portfoliodomourdok.wordpress.com/2010/04/03/simples-deploy-de-aplicacao-jrubyonrails-com-warbler/#comments</comments>
		<pubDate>Sat, 03 Apr 2010 00:02:21 +0000</pubDate>
		<dc:creator>mourdok</dc:creator>
				<category><![CDATA[JRuby]]></category>
		<category><![CDATA[Mac OSX]]></category>
		<category><![CDATA[Tomcat]]></category>
		<category><![CDATA[apache]]></category>
		<category><![CDATA[apache tomcat]]></category>
		<category><![CDATA[jruby gem]]></category>
		<category><![CDATA[jruby java]]></category>
		<category><![CDATA[jruby tutorial]]></category>
		<category><![CDATA[leopard]]></category>
		<category><![CDATA[mac os leopard]]></category>
		<category><![CDATA[mac software]]></category>
		<category><![CDATA[macbook]]></category>
		<category><![CDATA[rails jruby]]></category>
		<category><![CDATA[rails on jruby]]></category>
		<category><![CDATA[ruby java]]></category>
		<category><![CDATA[ruby jruby]]></category>
		<category><![CDATA[tomcat download]]></category>
		<category><![CDATA[tomcat java]]></category>
		<category><![CDATA[tomcat server]]></category>

		<guid isPermaLink="false">http://portfoliodomourdok.wordpress.com/?p=424</guid>
		<description><![CDATA[Há algum tempo que pratico o Deploy das minhas aplicações JRubyOnRails, no Apache Tomcat. Esse que pode ser recomendado para utilização em sistemas, digamos: Singelo. Pois até hoje não vi o Servidor Tomcat, se sair bem quando a questão é desempenho. Assim, para #App&#8217;s básicas, vou demonstrar como realizar esse processo de publicação em Produção. [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=portfoliodomourdok.wordpress.com&amp;blog=7583293&amp;post=424&amp;subd=portfoliodomourdok&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p><img class="alignleft size-thumbnail wp-image-463" style="border:0 none;margin:10px;" title="Tennessee Warbler" src="http://portfoliodomourdok.files.wordpress.com/2010/04/tennessee-warbler.jpg?w=104&#038;h=150" alt="" width="104" height="150" /></p>
<p>Há algum tempo que pratico o <a title="Deploy" href="http://en.wikipedia.org/wiki/System_deployment">Deploy</a> das minhas aplicações <a title="JRubyOnRails" href="http://rubyonrails.org/">JRubyOnRails</a>, no <a title="Apache Tomcat" href="http://tomcat.apache.org/">Apache Tomcat</a>.</p>
<p>Esse que pode ser recomendado para utilização em sistemas, digamos: <a title="Singelo" href="http://verblogando.files.wordpress.com/2008/03/singelo.jpg">Singelo</a>. Pois até hoje não vi o Servidor Tomcat, se sair bem quando a questão é <a title="Jetty, NIO e load balancing" href="http://blog.caelum.com.br/2008/06/27/melhorando-o-guj-jetty-nio-e-load-balancing/">desempenho</a>.</p>
<p>Assim, para #App&#8217;s básicas, vou demonstrar como realizar esse processo de publicação em Produção. Que convenhamos, é simples de ser efetuado.</p>
<p><span id="more-424"></span></p>
<h3><span style="color:#000080;">Cenário</span></h3>
<p>Sistema Operacional: <a title="Mac OSX" href="http://www.apple.com/macosx/">Mac OSX</a><br />
Dependências: <a title="Apache Tomcat" href="http://tomcat.apache.org/">Apache Tomcat</a>, <a title="git" href="http://git-scm.com/">Git</a>, <a title="JRuby" href="http://jruby.org/">JRuby</a>, <a title="Warbler" href="http://kenai.com/projects/warbler/pages/Home">Warbler</a></p>
<h3><span style="color:#000080;">Problema</span></h3>
<p>Pronto! <a title="Getting Started with Rails" href="http://guides.rubyonrails.org/getting_started.html">Desenvolvi</a> e <a title="A Guide to Testing Rails Applications" href="http://guides.rubyonrails.org/testing.html">Testei</a> tim-tim por tim-tim, todas as partes da minha aplicação, com o bendito do servidor-zinho <a title="Mongrel" href="http://en.wikipedia.org/wiki/Mongrel_(web_server)">Mongrel</a> abaixo:</p>
<pre class="brush: bash;">
jruby -S script/server
</pre>
<p>Isso para tornar mais pratico, o desenvolvimento. Mas agora, como coloco meu projeto em Ambiente de Produção? Devo fazer isso também?</p>
<pre class="brush: bash;">
jruby -S script/server -e production
</pre>
<p>Se a aplicação servir pouquíssimas pessoas (ex. 40), é&#8230; Não vejo problema. Mas existem outras maneiras e uma delas é a descrita a seguir.</p>
<h3><span style="color:#000080;">Solução</span></h3>
<p>O Terminal é seu amigo, repita isso comigo! Senão, vá para o mundo <a title="Windows" href="http://msdn.microsoft.com/en-us/default.aspx">Windows</a> <img src='http://s2.wp.com/wp-includes/images/smilies/icon_razz.gif' alt=':-P' class='wp-smiley' /> </p>
<h5>Preparando o ambiente</h5>
<p>Via linha de comando, execute os seguintes passos:</p>
<pre class="brush: bash; wrap-lines: false;">
# Baixar o Tomcat no diretório Home do usuário
cd ~ &amp;&amp; wget http://ftp.unicamp.br/pub/apache/tomcat/tomcat-6/v6.0.26/bin/apache-tomcat-6.0.26.tar.gz

# Descompactar o arquivo TAR.GZ e descartar o arquivo compactado
tar -zvxf apache-tomcat-6.0.26.tar.gz &amp;&amp; rm apache-tomcat-6.0.26.tar.gz

# Testar a instalação
cd apache-tomcat-6.0.26 &amp;&amp; java -Xmx512m -Xms512m -XX:PermSize=256m -jar bin/bootstrap.jar

# A última linha deve conter algo como
INFO: Server startup in 1451 ms
</pre>
<p>Resumindo, já temos um Servidor Web funcional. Para maiores detalhes <a title="Sobre Administração" href="http://tomcat.apache.org/tomcat-6.0-doc/index.html">sobre administração</a> do Apache Tomcat, vale conversar com um <a title="System Administrator" href="http://en.wikipedia.org/wiki/System_administrator">SysAdmin</a>!</p>
<h5>Eis um Rouxinol chamado Warbler</h5>
<p>Agora vamos usar uma <a title="RubyGems" href="http://en.wikipedia.org/wiki/RubyGems">RubyGem</a> muito eficiente, isso mesmo o <a title="Warbler" href="http://kenai.com/projects/warbler/pages/Home">Warbler</a>, para fazer com que o nosso projeto JRubyOnRails, funcione no Apache Tomcat. Seja adicionando o pacote WAR no diretório &#8220;webapps&#8221; ou simplesmente direcionando ao diretório no qual foi &#8220;explodido&#8221; o nosso pacote WAR <img src='http://s0.wp.com/wp-includes/images/smilies/icon_biggrin.gif' alt=':-D' class='wp-smiley' />  Buuum!!!</p>
<p>Ah! Uma pequenina observação:</p>
<blockquote><p>Sobre o projeto vamos utilizar o meu <a title="Sistema de Registro (beta)" href="http://github.com/mourdok/registro">Sistema de Registro (beta)</a>, como exemplo. Assim aproveito para fazer aquela propaganda</p></blockquote>
<p>Vá para o Terminal!</p>
<pre class="brush: bash;">
# Parar aquele processo do Tomcat
# Teclar Control+C

# Voltar para o Home do usuário e baixar o Projeto via Git
cd .. &amp;&amp; git clone git://github.com/mourdok/registro.git &amp;&amp; cd registro

# Apagar os seguintes arquivos e diretórios (Motivo? Fins didáticos!)
rm -rf vendor/plugins/warbler/ &amp;&amp; rm config/warble.rb

# Instalar a RubyGem Warbler
sudo jruby -S gem install warbler

# Adicionar o Warbler ao projeto
jruby -S warble pluginize

# Gerar o arquivo de configuração warble.rb
jruby -S script/generate warble
</pre>
<p>Eis uma rápida pausa nas linhas de comando, para explicar o que devemos fazer, com esse arquivo de configuração.</p>
<p>Se formos reparar. Por padrão esse &#8220;script/generate&#8221; não habilita algumas configurações que necessitaremos. Configurações essas que se forem deixadas no esquecimento. Com certeza, nossa aplicação não funcionará.</p>
<p>Então vamos modificar passo-a-passo, esse arquivo.</p>
<p>Vá para o Terminal!</p>
<pre class="brush: bash;">
# Através do seu editor preferido, no meu caso TextMate (mate)
# Edite o seguinte arquivo
mate config/warble.rb
</pre>
<p>Agora fora do Terminal, faremos tais modificações.</p>
<blockquote><p>Code in JRuby! Yes, I am a happy programmer!</p></blockquote>
<p>No Editor!</p>
<pre class="brush: ruby; wrap-lines: false;">
# Abaixo do último comentário, iniciado por &quot;Additional files/directories to include, above those in config.dirs&quot;, adicione a linha
config.includes = FileList[&quot;db/*&quot;]

# Abaixo do comentário, iniciado por &quot;You can also use regexps or Gem::Dependency objects for flexibility or&quot;, adicione as linhas
config.gems &lt;&lt; Gem::Dependency.new(&quot;rack&quot;)
config.gems &lt;&lt; Gem::Dependency.new(&quot;jruby-openssl&quot;)
config.gems &lt;&lt; Gem::Dependency.new(&quot;activerecord-jdbcsqlite3-adapter&quot;)

# Abaixo do comentário, iniciado por &quot;Value of RAILS_ENV for the webapp -- default as shown below&quot;, adicione a linha
config.webxml.rails.env = 'production'

# Abaixo do comentário, iniciado por &quot;Application booter to use, one of :rack, :rails, or :merb. (Default :rails)&quot;, descomente a linha
# Mesmo falando que o valor Default é Rails, tive problema, por não &quot;setar&quot; isso. Então faça!
config.webxml.booter = :rails

# Abaixo do comentário, iniciado por &quot;Control the pool of Rails runtimes. Leaving unspecified means&quot;, descomente as linhas
config.webxml.jruby.min.runtimes = 2
config.webxml.jruby.max.runtimes = 4

# E no final de tudo adicione as seguintes linhas
# Tive problema, por não &quot;setar&quot; isso. Então você já sabe!
config.java_libs.reject! {
  |lib| lib =~ /jruby-complete|goldspike/
}
</pre>
<p>Feito tudo isso, salve o arquivo.</p>
<p>Vá para o Terminal!</p>
<pre class="brush: bash; wrap-lines: false;">
# Para gerar o pacote WAR e seu respectivo diretório &quot;explodido&quot; execute
jruby -S warble

# Repare na última linha (!) que foi gerado pelo Warbler
jar cf registro.war -C tmp/war .

# Bom. Vamos voltar para o diretório do Apache Tomcat e editar o seu arquivo de configuração
cd .. &amp;&amp; cd apache-tomcat-6.0.26 &amp;&amp; mate conf/server.xml
</pre>
<p>No Editor!</p>
<pre class="brush: xml; wrap-lines: false;">
&lt;!-- Modificar a tag &lt;Connector port=&quot;8080&quot; /&gt; para a informada abaixo --&gt;
&lt;Connector port=&quot;8080&quot;
	maxHttpHeaderSize=&quot;8192&quot;
	maxThreads=&quot;150&quot;
	minSpareThreads=&quot;25&quot;
	maxSpareThreads=&quot;75&quot;
	enableLookups=&quot;false&quot;
	redirectPort=&quot;8443&quot;
	acceptCount=&quot;100&quot;
	connectionTimeout=&quot;20000&quot;
	disableUploadTimeout=&quot;true&quot;
	compression=&quot;on&quot;
	compressionMinSize=&quot;4096&quot;
	compressableMimeType=&quot;text/plain, text/css, application/json, application/x-javascript, text/xml, application/xml, application/xml+rss, text/javascript, image/gif, image/jpg, image/png, */*&quot;/&gt;

&lt;!-- Como também adicionar o seguinte conjunto de tags, acima ou abaixo da tag &lt;Host name=&quot;localhost&quot; /&gt; --&gt;
&lt;Host name=&quot;registro.localhost&quot;
			appBase=&quot;/users/andre/documents/workspace-ruby/registro/tmp/war&quot;
			unpackWARs=&quot;true&quot;
			autoDeploy=&quot;true&quot;
			xmlValidation=&quot;false&quot;
			xmlNamespaceAware=&quot;false&quot;&gt;
	&lt;Context path=&quot;&quot; docBase=&quot;.&quot;/&gt;
&lt;/Host&gt;
</pre>
<p>Feito tudo isso, salve o arquivo.</p>
<p>Vá para o Terminal!</p>
<pre class="brush: bash;">
# Modificar o arquivos de Hosts do MacOSX
mate /etc/hosts
</pre>
<p>No Editor!</p>
<pre class="brush: bash;">
# Acrescentar o trecho abaixo a frente do IP 127.0.0.1
 registro.localhost
</pre>
<p>Feito tudo isso, salve o arquivo.</p>
<p>Vá para o Terminal!</p>
<pre class="brush: bash;">
# Pronto para ver nossa App funcionar? Então, voilà!
java -Xmx512m -Xms512m -XX:PermSize=256m -jar bin/bootstrap.jar
</pre>
<p>E feito, temos a nossa aplicação funcionando! Pronta para ser utilizada por pessoas comuns e não apenas nós <a title="Geek" href="http://en.wikipedia.org/wiki/Geek">Geek</a>.</p>
<p> <img src='http://s0.wp.com/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /><br />
Bom é isso caro leitor.</p>
<p>Quem escreveu foi o André Moreira.<br />
Obrigado pela visita e até o próximo post.</p>
<br />Filed under: <a href='http://portfoliodomourdok.wordpress.com/category/jruby/'>JRuby</a>, <a href='http://portfoliodomourdok.wordpress.com/category/mac-osx/'>Mac OSX</a>, <a href='http://portfoliodomourdok.wordpress.com/category/tomcat/'>Tomcat</a> Tagged: <a href='http://portfoliodomourdok.wordpress.com/tag/apache/'>apache</a>, <a href='http://portfoliodomourdok.wordpress.com/tag/apache-tomcat/'>apache tomcat</a>, <a href='http://portfoliodomourdok.wordpress.com/tag/jruby-gem/'>jruby gem</a>, <a href='http://portfoliodomourdok.wordpress.com/tag/jruby-java/'>jruby java</a>, <a href='http://portfoliodomourdok.wordpress.com/tag/jruby-tutorial/'>jruby tutorial</a>, <a href='http://portfoliodomourdok.wordpress.com/tag/leopard/'>leopard</a>, <a href='http://portfoliodomourdok.wordpress.com/tag/mac-os-leopard/'>mac os leopard</a>, <a href='http://portfoliodomourdok.wordpress.com/tag/mac-osx/'>Mac OSX</a>, <a href='http://portfoliodomourdok.wordpress.com/tag/mac-software/'>mac software</a>, <a href='http://portfoliodomourdok.wordpress.com/tag/macbook/'>macbook</a>, <a href='http://portfoliodomourdok.wordpress.com/tag/rails-jruby/'>rails jruby</a>, <a href='http://portfoliodomourdok.wordpress.com/tag/rails-on-jruby/'>rails on jruby</a>, <a href='http://portfoliodomourdok.wordpress.com/tag/ruby-java/'>ruby java</a>, <a href='http://portfoliodomourdok.wordpress.com/tag/ruby-jruby/'>ruby jruby</a>, <a href='http://portfoliodomourdok.wordpress.com/tag/tomcat-download/'>tomcat download</a>, <a href='http://portfoliodomourdok.wordpress.com/tag/tomcat-java/'>tomcat java</a>, <a href='http://portfoliodomourdok.wordpress.com/tag/tomcat-server/'>tomcat server</a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/portfoliodomourdok.wordpress.com/424/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/portfoliodomourdok.wordpress.com/424/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/portfoliodomourdok.wordpress.com/424/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/portfoliodomourdok.wordpress.com/424/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/portfoliodomourdok.wordpress.com/424/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/portfoliodomourdok.wordpress.com/424/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/portfoliodomourdok.wordpress.com/424/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/portfoliodomourdok.wordpress.com/424/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/portfoliodomourdok.wordpress.com/424/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/portfoliodomourdok.wordpress.com/424/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/portfoliodomourdok.wordpress.com/424/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/portfoliodomourdok.wordpress.com/424/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/portfoliodomourdok.wordpress.com/424/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/portfoliodomourdok.wordpress.com/424/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=portfoliodomourdok.wordpress.com&amp;blog=7583293&amp;post=424&amp;subd=portfoliodomourdok&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://portfoliodomourdok.wordpress.com/2010/04/03/simples-deploy-de-aplicacao-jrubyonrails-com-warbler/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/28c68b93b7780192ed6f40ab194c4859?s=96&#38;d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96&#38;r=G" medium="image">
			<media:title type="html">André Moreira </media:title>
		</media:content>

		<media:content url="http://portfoliodomourdok.files.wordpress.com/2010/04/tennessee-warbler.jpg?w=104" medium="image">
			<media:title type="html">Tennessee Warbler</media:title>
		</media:content>
	</item>
		<item>
		<title>Testando com Cucumber, RSpec e Watir no Rails</title>
		<link>http://portfoliodomourdok.wordpress.com/2010/02/16/testando-com-cucumber-rspec-e-watir-no-rails/</link>
		<comments>http://portfoliodomourdok.wordpress.com/2010/02/16/testando-com-cucumber-rspec-e-watir-no-rails/#comments</comments>
		<pubDate>Tue, 16 Feb 2010 21:50:34 +0000</pubDate>
		<dc:creator>mourdok</dc:creator>
				<category><![CDATA[Agile]]></category>
		<category><![CDATA[Mac OSX]]></category>
		<category><![CDATA[Rails]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[Testing]]></category>
		<category><![CDATA[agile extreme programing]]></category>
		<category><![CDATA[agile programing]]></category>
		<category><![CDATA[cucumber testing]]></category>
		<category><![CDATA[extreme programing xp]]></category>
		<category><![CDATA[extreme programming]]></category>
		<category><![CDATA[leopard]]></category>
		<category><![CDATA[mac os leopard]]></category>
		<category><![CDATA[mac software]]></category>
		<category><![CDATA[macbook]]></category>
		<category><![CDATA[rails cucumber]]></category>
		<category><![CDATA[rails rspec]]></category>
		<category><![CDATA[rails test]]></category>
		<category><![CDATA[rspec controller test]]></category>
		<category><![CDATA[ruby on rails]]></category>
		<category><![CDATA[ruby rails]]></category>
		<category><![CDATA[ruby tutorial]]></category>
		<category><![CDATA[watir test tool]]></category>
		<category><![CDATA[watir unit test]]></category>
		<category><![CDATA[xp programing]]></category>

		<guid isPermaLink="false">http://portfoliodomourdok.wordpress.com/?p=367</guid>
		<description><![CDATA[Qual o conjunto de ferramentas que você utiliza para testar, suas aplicações Rails? Pois eu já pratiquei um pouco de Test::Unit, nas camadas de Model e Controller. Como também testei o poder do SeleniumOnRails e a simplicidade do Webrat na camada de View. Mas sempre sentia meio que um vazio nisso. Por exemplo, depois de [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=portfoliodomourdok.wordpress.com&amp;blog=7583293&amp;post=367&amp;subd=portfoliodomourdok&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p><img class="alignleft size-thumbnail wp-image-461" style="border:0 none;margin:10px;" title="Cucumber Funny" src="http://portfoliodomourdok.files.wordpress.com/2010/02/images-qcucumberdraftstart40um1hlpt-brsafeoffsantbo1imgtbstimgtypephotondsp20tbsisch-1.jpeg?w=150&#038;h=115" alt="" width="150" height="115" /></p>
<p>Qual o conjunto de ferramentas que você utiliza para testar, suas aplicações Rails? Pois eu já pratiquei um pouco de <a title="Test::Unit" href="http://ruby-doc.org/stdlib/libdoc/test/unit/rdoc/classes/Test/Unit.html">Test::Unit</a>, nas <a title="MVC" href="http://pt.wikipedia.org/wiki/MVC">camadas</a> de Model e Controller. Como também testei o poder do <a title="SeleniumOnRails" href="http://seleniumhq.org/projects/on-rails/">SeleniumOnRails</a> e a simplicidade do <a title="Webrat" href="http://github.com/brynary/webrat">Webrat</a> na camada de View.</p>
<p>Mas sempre sentia meio que um vazio nisso.</p>
<p>Por exemplo, depois de algumas semanas sem mexer no projeto, após voltar e ler os testes (é claro, como programador) era possível entender o que o sistema fazia. Porém queria saber se seria possível &#8220;clarear&#8221; ainda mais a idéia do código.</p>
<p>Então foi assim que obtive conhecimento do Trio Parada Dura.</p>
<p><span id="more-367"></span></p>
<h3><span style="color:#000080;">Cenário</span></h3>
<p>Sistema Operacional: <a title="Mac OSX" href="http://www.apple.com/macosx/">Mac OSX</a><br />
Dependências: <a title="Ruby" href="http://www.ruby-lang.org/pt/">Ruby</a>, <a title="Git" href="http://git-scm.com/">Git</a>, <a title="Firefox" href="http://br.mozdev.org/">Firefox</a>, <a title="JSSH" href="http://www.croczilla.com/bits_and_pieces/jssh/">JSSH</a>, <a title="Rails" href="http://rubyonrails.org/">Rails</a>, <a title="Cucumber" href="http://cukes.info/">Cucumber</a>, <a title="RSpec" href="http://rspec.info/">RSpec</a> e <a title="Watir" href="http://watir.com/">Watir</a></p>
<h3><span style="color:#000080;">Problema</span></h3>
<p>Testar da forma mais objetiva possível as 03 (três) camadas de um projeto Rails.</p>
<p>Mas desde já advirto! Essa não é uma solução definitiva. A mesma pode ser adaptada e melhorada para a sua maior comodidade.</p>
<h3><span style="color:#000080;">Solução</span></h3>
<p>Vou tentar ir direto ao assunto. Senão essa dica aqui vai ficar um pouco grande quanto por demais! Sendo que o processo é bem simples, não tenho muito o que comentar mesmo <img src='http://s0.wp.com/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<h5>Instalação</h5>
<p>Dentro da raiz do seu projeto Rails, execute as seguintes linhas de comando:</p>
<p>Instalando a gem Cucumber.</p>
<pre class="brush: bash;">
script/plugin install --force git://github.com/aslakhellesoy/cucumber.git
</pre>
<p>Instalando a gem Database Cleaner, um complemento para o Cucumber.</p>
<pre class="brush: bash;">
script/plugin install --force git://github.com/bmabey/database_cleaner.git
</pre>
<p>Instalando a gem Cucumber Rails, um complemento para o Cucumber.</p>
<pre class="brush: bash; wrap-lines: false;">
script/plugin install --force git://github.com/aslakhellesoy/cucumber-rails.git
</pre>
<p>Instalando a gem RSpec.</p>
<pre class="brush: bash;">
script/plugin install --force git://github.com/dchelimsky/rspec.git
</pre>
<p>Instalando a gem RSpec Rails, um complemento para o RSpec.</p>
<pre class="brush: bash;">
script/plugin install --force git://github.com/dchelimsky/rspec-rails.git
</pre>
<p>Instalando a gem Firewatir.</p>
<pre class="brush: bash;">
script/plugin install --force git://github.com/collin/firewatir.git
</pre>
<p>E ufa finalmente, instalando o addon JSSH, um complemento para Firefox.</p>
<blockquote><p>Para isso baixe a respectiva versão via <a href="http://wiki.openqa.org/display/WTR/FireWatir+Installation#FireWatirInstallation-2%29InstalltheJSSHFirefoxExtension">Wiki do Watir</a></p></blockquote>
<h5>Configuração</h5>
<p>Após essas trocentas adições de gems, complementos, plugins e whatever&#8230; Vamos pedir para o Rails gerar os arquivos de configurações dos mesmos, via Terminal:</p>
<p>Para o RSpec.</p>
<pre class="brush: bash;">
script/generate rspec
</pre>
<p>Para o Cucumber.</p>
<pre class="brush: bash;">
script/generate cucumber --rspec
</pre>
<p>Já sobre o alerta disparado pelo Cucumber que segue, podemos desconsiderar. Pois não vamos usar o suporte do Webrat.</p>
<pre class="brush: bash;">
(::) (::) (::) (::) (::) (::) (::) (::) (::) (::) (::) (::) (::) (::) (::)
              (::)   D R I V E R   A L E R T    (::)
You didn't explicitly generate with --capybara or --webrat, so I looked at
your gems and saw that you had webrat installed, so I went with that.
If you want something else, be specific about it. Otherwise, relax.
(::) (::) (::) (::) (::) (::) (::) (::) (::) (::) (::) (::) (::) (::) (::)
</pre>
<p>Porém o Rails (ainda) não tem como gerar o arquivo de configuração, que integra o Cucumber com o Watir. Então faremos isso manualmente.</p>
<p>Através do seu editor de texto preferido (ex. <a title="Textmate" href="http://macromates.com/">Textmate</a>), adicione as seguintes linhas ao final do arquivo, features/support/env.rb:</p>
<pre class="brush: ruby;">
require 'firewatir'

BROWSER = Watir::Browser.start 'http://spoc_rb.localhost/'

After do
  BROWSER.close
end
</pre>
<h5>Rápida explicação</h5>
<p>E pronto! Já podemos começar a codificar os nossos Testes.</p>
<ul>
<li>Para testar o Model e o Controller, vamos utilizar o RSpec.</li>
<li>E para testar a View, vamos utilizar o Cucumber com uma ajuda do Watir.</li>
</ul>
<p>Esta certo. Mas você deve estar se perguntando:</p>
<blockquote><p>E esse esse tal de Firewatir?!</p></blockquote>
<p>Bom, o Watir disponibiliza pra gente a funcionalidade do código Ruby, executar a navegação nos elementos HTML e JavaScript (via JSSH). Porém para o Internet Explorer. Vulgo IEca!</p>
<p>E como sou um programador feliz, uso Firefox para desenvolvimento. Logo o que precisa ser instalado é a gem <a title="Firewatir" href="http://code.google.com/p/firewatir/">Firewatir</a> <img src='http://s0.wp.com/wp-includes/images/smilies/icon_biggrin.gif' alt=':-D' class='wp-smiley' /> </p>
<h5>Exemplo de RSpec no Model</h5>
<p>Vamos criar nosso teste com RSpec em spec/models/user_spec.rb:</p>
<pre class="brush: ruby; wrap-lines: false;">
# Run with command line: script/spec spec/models/user_spec.rb --color --format specdoc
# Or just do it on Mac: Command+R
require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')

describe User do
  before(:each) do
    @valid_attributes = {
      :name =&gt; 'Any User',
      :login =&gt; &quot;anyuser&quot;,
      :password =&gt; '123change',
      :password_confirmation =&gt; '123change',
      :roles =&gt; %w[users_controller]
    }
  end

  context 'should validates the model' do
    it { User.new.should be_an_instance_of(User) }

    it 'should create a user' do
      @user = User.create! @valid_attributes
      @user.should be_valid
    end

    %w[name].each do |field|
      it &quot;should require #{field}&quot; do
        @user = User.new
        @user.should_not be_valid
        @user.errors.full_messages.should include(&quot;#{field.humanize} #{I18n.translate 'activerecord.errors.messages.blank'}&quot;)
      end
    end

    it 'should list all users without informing a parameter search' do
      @user = User.everyone nil, nil
      @user.size.should eql(4)
    end

    it 'should list all users informing a parameter search' do
      @user = User.everyone 'analyst', nil
      @user.size.should eql(1)
    end

    it 'should take the role of the first user found' do
      @user = User.first
      @user.roles.should eql(%w[users_controller])
    end

    it 'should list all roles' do
      @roles = User::ROLES
      @roles.size.should eql(1)
    end
  end
end
</pre>
<p>Para o seguinte arquivo app/models/user.rb:</p>
<pre class="brush: ruby; wrap-lines: false;">
class User &lt; ActiveRecord::Base
  # Security
  attr_accessible :name, :login, :password, :password_confirmation, :roles

  # Validator
  validates_presence_of :name

  # Authlogic
  acts_as_authentic

  # &lt;&lt;Ability
  named_scope :with_role, lambda { |role| {:conditions =&gt; &quot;roles_mask &amp; #{2**ROLES.index(role.to_s)} &gt; 0 &quot;} }

  ROLES = %w[users_controller]

  def roles=(roles)
    self.roles_mask = (roles &amp; ROLES).map { |r| 2**ROLES.index(r) }.sum
  end

  def roles
    ROLES.reject { |r| ((roles_mask || 0) &amp; 2**ROLES.index(r)).zero? }
  end

  def role? role
    roles.include? role.to_s
  end
  # Ability&gt;&gt;

  # WillPaginate
  def self.everyone n_search, n_page
    if n_search
      paginate  :page =&gt; n_page,
                :per_page =&gt; 25,
                :conditions =&gt; [&quot;name LIKE ? OR login LIKE ?&quot;,
                                &quot;%#{n_search.strip}%&quot;,
                                &quot;%#{n_search.strip}%&quot;]
    else
      paginate  :page =&gt; n_page,
                :per_page =&gt; 25
    end
  end
end
</pre>
<p>E para executar, basta seguir o comentário que consta no arquivo acima e digitá-lo no Terminal:</p>
<pre class="brush: bash;">
script/spec spec/models/user_spec.rb --color --format specdoc
</pre>
<p>Que teremos a seguinte saída:</p>
<pre class="brush: bash; wrap-lines: false;">
User should validates the model
- should be an instance of User(id: integer, name: string, login: string, crypted_password: string, password_salt: string, persistence_token: string, login_count: integer, failed_login_count: integer, last_request_at: datetime, current_login_at: datetime, last_login_at: datetime, current_login_ip: string, last_login_ip: string, created_at: datetime, updated_at: datetime, roles_mask: integer)
- should create a user
- should require name
- should list all users without informing a parameter search
- should list all users informing a parameter search
- should take the role of the first user found
- should list all roles
Finished in 0.291376 seconds
7 examples, 0 failures
</pre>
<h5>Exemplo de RSpec no Controller</h5>
<p>Vamos criar nosso teste com RSpec em spec/controllers/users_controller_spec.rb:</p>
<pre class="brush: ruby; wrap-lines: false;">
# Run with command line: script/spec spec/controllers/users_controller_spec.rb --color --format specdoc
# Or just do it on Mac: Command+R
require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')

describe UsersController do
  context 'should validates the controller' do
    it { UsersController.new.should be_an_instance_of(UsersController) }
  end

  context 'should validates the routes' do
    it 'should generate a route by GET from /users to { :controller=&gt;&quot;users&quot;, :action=&gt;&quot;index&quot; }' do
      params_from(:get, users_path).should eql({ :controller=&gt;'users', :action=&gt;'index' })
    end

    it 'should generate a route by POST from /users to { :controller=&gt;&quot;users&quot;, :action=&gt;&quot;create&quot; }' do
      params_from(:post, users_path).should eql({ :controller=&gt;'users', :action=&gt;'create' })
    end

    it 'should generate a route by GET from /users/new to { :controller=&gt;&quot;users&quot;, :action=&gt;&quot;new&quot; }' do
      params_from(:get, new_user_path).should eql({ :controller=&gt;'users', :action=&gt;'new' })
    end

    it 'should generate a route by GET from /users/:id/edit to { :controller=&gt;&quot;users&quot;, :action=&gt;&quot;edit&quot; }' do
      params_from(:get, '/users/1/edit').should eql({ :controller=&gt;'users', :action=&gt;'edit', :id =&gt; '1' })
    end

    it 'should generate a route by GET from /users/:id to { :controller=&gt;&quot;users&quot;, :action=&gt;&quot;show&quot; }' do
      params_from(:get, '/users/1').should eql({ :controller=&gt;'users', :action=&gt;'show', :id =&gt; '1' })
    end

    it 'should generate a route by PUT from /users/:id to { :controller=&gt;&quot;users&quot;, :action=&gt;&quot;update&quot; }' do
      params_from(:put, '/users/1').should eql({ :controller=&gt;'users', :action=&gt;'update', :id =&gt; '1' })
    end

    it 'should generate a route by DELETE from /users/:id to { :controller=&gt;&quot;users&quot;, :action=&gt;&quot;destroy&quot; }' do
      params_from(:delete, '/users/1').should eql({ :controller=&gt;'users', :action=&gt;'destroy', :id =&gt; '1' })
    end
  end
end
</pre>
<p>Para o seguinte arquivo app/controllers/users_controller.rb:</p>
<pre class="brush: ruby;">
class UsersController &lt; ApplicationController
  # CanCan
  load_and_authorize_resource

  # /users (GET)
  def index
    @users = User.everyone params[:search], params[:page]
  end

  # /users/:id (GET)
  def show
  end

  # /users/new (GET)
  def new
  end

  # /users (POST)
  def create
    if @user.save
      flash[:notice] = 'Successfully created user.'
      redirect_to users_path
    else
      render :action =&gt; :new
    end
  end

  # /users/:id/edit (GET)
  def edit
  end

  # /users/:id (PUT)
  def update
    if @user.update_attributes params[:user]
      flash[:notice] = 'Successfully updated user.'
      redirect_to users_path
    else
      render :action =&gt; :edit
    end
  end

  # /users/:id (DELETE)
  def destroy
    @user.destroy
    flash[:notice] = 'Successfully eliminated user.'
    redirect_to users_path
  end
end
</pre>
<p>E para executar, basta seguir o comentário que consta no arquivo acima, e digitá-lo no Terminal:</p>
<pre class="brush: bash; wrap-lines: false;">
script/spec spec/controllers/users_controller_spec.rb --color --format specdoc
</pre>
<p>Que teremos a seguinte saída:</p>
<pre class="brush: bash; wrap-lines: false;">
UsersController should validates the controller
- should be an instance of UsersController
UsersController should validates the routes
- should generate a route by GET from /users to { :controller=&gt;&quot;users&quot;, :action=&gt;&quot;index&quot; }
- should generate a route by POST from /users to { :controller=&gt;&quot;users&quot;, :action=&gt;&quot;create&quot; }
- should generate a route by GET from /users/new to { :controller=&gt;&quot;users&quot;, :action=&gt;&quot;new&quot; }
- should generate a route by GET from /users/:id/edit to { :controller=&gt;&quot;users&quot;, :action=&gt;&quot;edit&quot; }
- should generate a route by GET from /users/:id to { :controller=&gt;&quot;users&quot;, :action=&gt;&quot;show&quot; }
- should generate a route by PUT from /users/:id to { :controller=&gt;&quot;users&quot;, :action=&gt;&quot;update&quot; }
- should generate a route by DELETE from /users/:id to { :controller=&gt;&quot;users&quot;, :action=&gt;&quot;destroy&quot; }
inished in 0.088611 seconds
8 examples, 0 failures
</pre>
<h5>Exemplo de Cucumber com Watir na View</h5>
<p>Vamos criar nosso teste com Cucumber, que primeiramente se baseia em uma estória em features/user.feature:</p>
<pre class="brush: plain; wrap-lines: false;">
# Run with command line: script/cucumber features/user.feature --format pretty
# Optional: script/cucumber features/user.feature --format pretty --tags @anything
@feature_user_registration
Feature: User Registration
  To register a User
  I need to have the role of analyst, supervisor or coordinator
  To do so, a new User can be registered in the system

  Background:
    Given access to the login page
    And inform my access credentials of analyst

  @scenario_registering_a_user
  Scenario: Registering a User
    Given click on the link Administration
    And after click on the link New
    When inform the credentials of a new User correctly
    Then I will have a new User registered
</pre>
<p>E depois vamos criar seu respectivo teste Ruby em features/step_definitions/background_steps.rb:</p>
<pre class="brush: ruby; wrap-lines: false;">
Before do
  BROWSER.link(:href, '/logout').click if BROWSER.html.include?('Logout')
end

Given /^access to the login page$/ do
  BROWSER.html.include?('Somebody ( Login )').should == true
  BROWSER.link(:href, '/login').click
end

And /^inform my access credentials of analyst$/ do
  BROWSER.html.include?('Login').should == true
  BROWSER.text_field(:name, 'user_session[login]').set 'analyst'

  BROWSER.html.include?('Password').should == true
  BROWSER.text_field(:name, 'user_session[password]').set '123change'

  BROWSER.button(:name, 'login').click
  BROWSER.html.include?('Successfully created user session.').should == true
end
</pre>
<p>E também em features/step_definitions/user_steps.rb:</p>
<pre class="brush: ruby;">
Before do
  @login = Time.now.to_i
end

Given /^click on the link Administration$/ do
  BROWSER.html.include?('Administration').should == true
  BROWSER.link(:href, '/users').click
end

And /^after click on the link New$/ do
  BROWSER.html.include?('New').should == true
  BROWSER.link(:href, '/users/new').click
end

When /^inform the credentials of a new User correctly$/ do
  BROWSER.html.include?('Name').should == true
  BROWSER.text_field(:name, 'user[name]').set &quot;Any User - #{@login}&quot;

  BROWSER.html.include?('Login').should == true
  BROWSER.text_field(:name, 'user[login]').set &quot;anyuser.#{@login}&quot;

  BROWSER.html.include?('Password').should == true
  BROWSER.text_field(:name, 'user[password]').set '123change'

  BROWSER.html.include?('Password confirmation').should == true
  BROWSER.text_field(:name, 'user[password_confirmation]').set '123change'

  BROWSER.html.include?('Roles').should == true
  BROWSER.checkbox(:name, 'user[roles][]').click

  BROWSER.button(:name, 'save').click
end

Then /^I will have a new User registered$/ do
  BROWSER.html.include?('Successfully created user.').should == true
end
</pre>
<p>Agora para executar o nosso teste, primeiro nós devemos ativar o suporte do componente JSSH, via Terminal digitando:</p>
<pre class="brush: bash;">
/Applications/Firefox.app/Contents/MacOS/firefox-bin -jssh
</pre>
<p>Após isso, agora sim, basta seguir o comentário que consta no arquivo feature, e digitá-lo no Terminal:</p>
<pre class="brush: bash;">
script/cucumber features/user.feature --format pretty
</pre>
<p>Que teremos a seguinte saída:</p>
<pre class="brush: bash; wrap-lines: false;">
Using the default profile...
# Run with command line: script/cucumber features/user.feature --format pretty
# Optional: script/cucumber features/user.feature --format pretty --tags @anything
@feature_user_registration
Feature: User Registration
  To register a User
  I need to have the role of analyst, supervisor or coordinator
  To do so, a new User can be registered in the system
  Background:                                   # features/user.feature:9
    Given access to the login page              # features/step_definitions/background_steps.rb:5
    And inform my access credentials of analyst # features/step_definitions/background_steps.rb:10
  @scenario_registering_a_user
  Scenario: Registering a User                          # features/user.feature:14
    Given click on the link Administration              # features/step_definitions/user_steps.rb:5
    And after click on the link New                     # features/step_definitions/user_steps.rb:10
    When inform the credentials of a new User correctly # features/step_definitions/user_steps.rb:15
    Then I will have a new User registered              # features/step_definitions/user_steps.rb:34
1 scenario (1 passed)
6 steps (6 passed)
0m8.039s
</pre>
<h5>Aprendo mais sobre desenvolvimento guiado por comportamento</h5>
<p>A dica de hoje, foi baseada sobre diversas fontes de estudos, que tive a oportunidade de ler no decorrer dessas últimas semanas.</p>
<p>Claro que existe muito mais do que foi exemplificado aqui. Então corra, corra atrás&#8230;</p>
<p>De conteúdo pago.</p>
<ul>
<li><a title="The RSpec Book: Behaviour Driven Development with Rspec, Cucumber, and Friends" href="http://www.amazon.com/RSpec-Book-Behaviour-Development-Cucumber/dp/1934356379/ref=pd_sim_sbs_b_1">The RSpec Book: Behaviour Driven Development with Rspec, Cucumber, and Friends</a></li>
<li><a title="RSpec: Designing and Implementng Testing in Rails" href="http://www.amazon.com/RSpec-Designing-Implementing-Testing-Rails/dp/0321552679/ref=pd_sim_sbs_b_2">RSpec: Designing and Implementing Testing in Rails</a></li>
</ul>
<p>Como também gratuito.</p>
<ul>
<li><a title="Cucumber: Tutorials and Related Blog Posts" href="http://wiki.github.com/aslakhellesoy/cucumber/tutorials-and-related-blog-posts">Cucumber: Tutorials and Related Blog Posts</a></li>
<li><a title="Cucumber: Examples" href="http://github.com/aslakhellesoy/cucumber/tree/master/examples/i18n">Cucumber: Examples</a></li>
<li><a title="Cucumber: Wiki" href="http://wiki.github.com/aslakhellesoy/cucumber/">Cucumber: Wiki</a></li>
<li><a title="RSpec: Documentation" href="http://rspec.info/documentation/">RSpec: Documentation</a></li>
<li><a title="RSpec Rails: Documentation" href="http://rspec.info/rails/">RSpec Rails: Documentation</a></li>
<li><a title="RSpec: Wiki" href="http://wiki.github.com/dchelimsky/rspec/">RSpec: Wiki</a></li>
<li><a title="RSpec: David Chelimsky" href="http://blog.davidchelimsky.net/">RSpec: David Chelimsky</a></li>
<li><a title="Watir: Documentation" href="http://watir.com/documentation/">Watir: Documentation</a></li>
<li><a title="Watir: Examples" href="http://watir.com/examples/">Watir: Examples</a></li>
</ul>
<p> <img src='http://s0.wp.com/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /><br />
Bom é isso caro leitor.</p>
<p>Quem escreveu foi o André Moreira.<br />
Obrigado pela visita e até o próximo post.</p>
<br />Filed under: <a href='http://portfoliodomourdok.wordpress.com/category/agile/'>Agile</a>, <a href='http://portfoliodomourdok.wordpress.com/category/mac-osx/'>Mac OSX</a>, <a href='http://portfoliodomourdok.wordpress.com/category/rails/'>Rails</a>, <a href='http://portfoliodomourdok.wordpress.com/category/ruby/'>Ruby</a>, <a href='http://portfoliodomourdok.wordpress.com/category/testing/'>Testing</a> Tagged: <a href='http://portfoliodomourdok.wordpress.com/tag/agile-extreme-programing/'>agile extreme programing</a>, <a href='http://portfoliodomourdok.wordpress.com/tag/agile-programing/'>agile programing</a>, <a href='http://portfoliodomourdok.wordpress.com/tag/cucumber-testing/'>cucumber testing</a>, <a href='http://portfoliodomourdok.wordpress.com/tag/extreme-programing-xp/'>extreme programing xp</a>, <a href='http://portfoliodomourdok.wordpress.com/tag/extreme-programming/'>extreme programming</a>, <a href='http://portfoliodomourdok.wordpress.com/tag/leopard/'>leopard</a>, <a href='http://portfoliodomourdok.wordpress.com/tag/mac-os-leopard/'>mac os leopard</a>, <a href='http://portfoliodomourdok.wordpress.com/tag/mac-osx/'>Mac OSX</a>, <a href='http://portfoliodomourdok.wordpress.com/tag/mac-software/'>mac software</a>, <a href='http://portfoliodomourdok.wordpress.com/tag/macbook/'>macbook</a>, <a href='http://portfoliodomourdok.wordpress.com/tag/rails-cucumber/'>rails cucumber</a>, <a href='http://portfoliodomourdok.wordpress.com/tag/rails-rspec/'>rails rspec</a>, <a href='http://portfoliodomourdok.wordpress.com/tag/rails-test/'>rails test</a>, <a href='http://portfoliodomourdok.wordpress.com/tag/rspec-controller-test/'>rspec controller test</a>, <a href='http://portfoliodomourdok.wordpress.com/tag/ruby-on-rails/'>ruby on rails</a>, <a href='http://portfoliodomourdok.wordpress.com/tag/ruby-rails/'>ruby rails</a>, <a href='http://portfoliodomourdok.wordpress.com/tag/ruby-tutorial/'>ruby tutorial</a>, <a href='http://portfoliodomourdok.wordpress.com/tag/watir-test-tool/'>watir test tool</a>, <a href='http://portfoliodomourdok.wordpress.com/tag/watir-unit-test/'>watir unit test</a>, <a href='http://portfoliodomourdok.wordpress.com/tag/xp-programing/'>xp programing</a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/portfoliodomourdok.wordpress.com/367/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/portfoliodomourdok.wordpress.com/367/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/portfoliodomourdok.wordpress.com/367/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/portfoliodomourdok.wordpress.com/367/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/portfoliodomourdok.wordpress.com/367/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/portfoliodomourdok.wordpress.com/367/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/portfoliodomourdok.wordpress.com/367/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/portfoliodomourdok.wordpress.com/367/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/portfoliodomourdok.wordpress.com/367/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/portfoliodomourdok.wordpress.com/367/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/portfoliodomourdok.wordpress.com/367/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/portfoliodomourdok.wordpress.com/367/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/portfoliodomourdok.wordpress.com/367/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/portfoliodomourdok.wordpress.com/367/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=portfoliodomourdok.wordpress.com&amp;blog=7583293&amp;post=367&amp;subd=portfoliodomourdok&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://portfoliodomourdok.wordpress.com/2010/02/16/testando-com-cucumber-rspec-e-watir-no-rails/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/28c68b93b7780192ed6f40ab194c4859?s=96&#38;d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96&#38;r=G" medium="image">
			<media:title type="html">André Moreira </media:title>
		</media:content>

		<media:content url="http://portfoliodomourdok.files.wordpress.com/2010/02/images-qcucumberdraftstart40um1hlpt-brsafeoffsantbo1imgtbstimgtypephotondsp20tbsisch-1.jpeg?w=150" medium="image">
			<media:title type="html">Cucumber Funny</media:title>
		</media:content>
	</item>
		<item>
		<title>Extensões nativas no Ruby</title>
		<link>http://portfoliodomourdok.wordpress.com/2010/01/30/extensoes-nativas-no-ruby/</link>
		<comments>http://portfoliodomourdok.wordpress.com/2010/01/30/extensoes-nativas-no-ruby/#comments</comments>
		<pubDate>Sat, 30 Jan 2010 18:44:20 +0000</pubDate>
		<dc:creator>mourdok</dc:creator>
				<category><![CDATA[Mac OSX]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[64 bit architecture]]></category>
		<category><![CDATA[64 bit processor]]></category>
		<category><![CDATA[architecture of processor]]></category>
		<category><![CDATA[arquitetura de processadores]]></category>
		<category><![CDATA[arquitetura do processador]]></category>
		<category><![CDATA[dual processor architecture]]></category>
		<category><![CDATA[gem install]]></category>
		<category><![CDATA[intel architecture]]></category>
		<category><![CDATA[intel processor architecture]]></category>
		<category><![CDATA[leopard]]></category>
		<category><![CDATA[mac os leopard]]></category>
		<category><![CDATA[mac software]]></category>
		<category><![CDATA[macbook]]></category>
		<category><![CDATA[pentium architecture]]></category>
		<category><![CDATA[pentium processor architecture]]></category>
		<category><![CDATA[postgres download]]></category>
		<category><![CDATA[postgresql]]></category>
		<category><![CDATA[ruby gem]]></category>
		<category><![CDATA[ruby postgres]]></category>
		<category><![CDATA[ruby tutorial]]></category>
		<category><![CDATA[rubygem install]]></category>
		<category><![CDATA[rubygems]]></category>
		<category><![CDATA[snow leopard]]></category>
		<category><![CDATA[update rubygem]]></category>
		<category><![CDATA[x86 architecture]]></category>
		<category><![CDATA[x86 processor architecture]]></category>

		<guid isPermaLink="false">http://portfoliodomourdok.wordpress.com/?p=344</guid>
		<description><![CDATA[Durante o dia-a-dia do meu estudo, estudo, codificação e pausa para o café acabo me deparando com algum problema que é simples de resolver. Mas se eu não ficar atento! Essa pequena bola de neve, pode me soterrar E como atualmente estou com a mania de criar Procedimento, no meu atual trabalho de Helpdesk, para [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=portfoliodomourdok.wordpress.com&amp;blog=7583293&amp;post=344&amp;subd=portfoliodomourdok&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p><img class="alignleft size-thumbnail wp-image-468" style="border:0 none;margin:10px;" title="Push for help" src="http://portfoliodomourdok.files.wordpress.com/2010/01/2614978610_2d1d678d79.jpg?w=150&#038;h=112" alt="" width="150" height="112" /></p>
<p>Durante o dia-a-dia do meu estudo, estudo, codificação e pausa para o café acabo me deparando com algum problema que é simples de resolver. Mas se eu não ficar atento! Essa pequena bola de neve, pode me soterrar <img src='http://s0.wp.com/wp-includes/images/smilies/icon_biggrin.gif' alt=':-D' class='wp-smiley' /> </p>
<p>E como atualmente estou com a mania de criar <a title="Procedimento" href="http://pt.wiktionary.org/wiki/procedimento">Procedimento</a>, no meu atual trabalho de <a title="Helpdesk" href="http://pt.wikipedia.org/wiki/Help_desk">Helpdesk</a>, para tudo o que eu faço. Resolvi adotar por aqui também esse mesmo estilo, para repassar conhecimento.</p>
<p>Espero que seja útil!</p>
<p><span id="more-344"></span></p>
<h3><span style="color:#000080;">Cenário</span></h3>
<p>Sistema Operacional: <a title="Mac OSX" href="http://www.apple.com/br/macosx/">Mac OSX</a><br />
Dependências: <a title="Ruby" href="http://www.ruby-lang.org/en/">Ruby</a> e <a title="Xcode" href="http://developer.apple.com/tools/xcode/">Xcode</a></p>
<h3><span style="color:#000080;">Problema</span></h3>
<p>Recentemente precisei instar no meu <a title="MacbookPro" href="http://www.apple.com/br/macbookpro/">Querido MacBook Pro</a> uma <a title="RubyGem" href="http://en.wikipedia.org/wiki/RubyGems">RubyGem</a> do <a title="PostgreSQL" href="http://pt.wikipedia.org/wiki/PostgreSQL">PostgreSQL</a>, para fazer o Ruby conversar com esse &#8220;Sistema Gerenciador de Banco de Dados Objeto Relacional&#8221;. Ufa! Que quatrocentão esse camarada <img src='http://s0.wp.com/wp-includes/images/smilies/icon_biggrin.gif' alt=':-D' class='wp-smiley' /> </p>
<p>E depois de executar a linha de comando a seguir, via Terminal:</p>
<pre class="brush: bash;">
sudo gem install pg
</pre>
<p>Me deparo com o erro:</p>
<pre class="brush: bash;">
Building native extensions.  This could take a while...
ERROR:  Error installing pg:
ERROR: Failed to build gem native extension.
</pre>
<h3><span style="color:#000080;">Solução</span></h3>
<p>Trocando umas idéias com o Tio Google, fiquei sabendo que é preciso utilizar o código abaixo. Junto da mesma linha de comando, para que o Ruby entenda a arquitetura do processador em uso (bem resumidamente é isso).</p>
<blockquote><p>env ARCHFLAGS=&#8221;-arch SUA_ARQUITETURA_AQUI&#8221;</p></blockquote>
<p>Logo temos a seguintes arquiteturas (principais):</p>
<ul>
<li><a title="i386" href="http://en.wikipedia.org/wiki/Intel_80386">i386</a></li>
<li><a title="x86_64" href="http://en.wikipedia.org/wiki/X86-64">x86_64</a></li>
</ul>
<p>Depois que entendemos isso, basta digitar o comando inicial, com a adição da ARCHFLAGS, conforme abaixo:</p>
<pre class="brush: bash; wrap-lines: false;">
PATH=$PATH:/Library/PostgreSQL/8.4/bin sudo env ARCHFLAGS=&quot;-arch i386&quot; gem install pg -- --with-pgsql-include=/Library/PostgreSQL/8.4/include --with-pgsql-lib=/Library/PostgreSQL/8.4/lib
</pre>
<p>Apenas uma rápida finalização aqui. Pois preciso explicar porque a linha de instalação ficou tão GIGANTE assim <img src='http://s0.wp.com/wp-includes/images/smilies/icon_biggrin.gif' alt=':-D' class='wp-smiley' /> </p>
<p>O código abaixo disponibiliza os arquivos binários do PostgreSQL no PATH no MacOSX</p>
<pre class="brush: bash;">
PATH=$PATH:/Library/PostgreSQL/8.4/bin
</pre>
<p>Já o trecho abaixo informa que o meu PostgreSQL é de arquitetura i386</p>
<pre class="brush: bash;">
sudo env ARCHFLAGS=&quot;-arch i386&quot; gem install pg
</pre>
<p>Por último deixo claro para o GCC em quais locais estão os Inclues de Libs do PostgreSQL</p>
<pre class="brush: bash; wrap-lines: false;">
-- --with-pgsql-include=/Library/PostgreSQL/8.4/include --with-pgsql-lib=/Library/PostgreSQL/8.4/lib
</pre>
<p>Agora é só usar a gem <a href="http://bitbucket.org/ged/ruby-pg/wiki/Home">pg</a> e continuar sendo feliz.</p>
<p> <img src='http://s0.wp.com/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /><br />
Bom é isso caro leitor.</p>
<p>Quem escreveu foi o André Moreira.<br />
Obrigado pela visita e até o próximo post.</p>
<br />Filed under: <a href='http://portfoliodomourdok.wordpress.com/category/mac-osx/'>Mac OSX</a>, <a href='http://portfoliodomourdok.wordpress.com/category/ruby/'>Ruby</a> Tagged: <a href='http://portfoliodomourdok.wordpress.com/tag/64-bit-architecture/'>64 bit architecture</a>, <a href='http://portfoliodomourdok.wordpress.com/tag/64-bit-processor/'>64 bit processor</a>, <a href='http://portfoliodomourdok.wordpress.com/tag/architecture-of-processor/'>architecture of processor</a>, <a href='http://portfoliodomourdok.wordpress.com/tag/arquitetura-de-processadores/'>arquitetura de processadores</a>, <a href='http://portfoliodomourdok.wordpress.com/tag/arquitetura-do-processador/'>arquitetura do processador</a>, <a href='http://portfoliodomourdok.wordpress.com/tag/dual-processor-architecture/'>dual processor architecture</a>, <a href='http://portfoliodomourdok.wordpress.com/tag/gem-install/'>gem install</a>, <a href='http://portfoliodomourdok.wordpress.com/tag/intel-architecture/'>intel architecture</a>, <a href='http://portfoliodomourdok.wordpress.com/tag/intel-processor-architecture/'>intel processor architecture</a>, <a href='http://portfoliodomourdok.wordpress.com/tag/leopard/'>leopard</a>, <a href='http://portfoliodomourdok.wordpress.com/tag/mac-os-leopard/'>mac os leopard</a>, <a href='http://portfoliodomourdok.wordpress.com/tag/mac-osx/'>Mac OSX</a>, <a href='http://portfoliodomourdok.wordpress.com/tag/mac-software/'>mac software</a>, <a href='http://portfoliodomourdok.wordpress.com/tag/macbook/'>macbook</a>, <a href='http://portfoliodomourdok.wordpress.com/tag/pentium-architecture/'>pentium architecture</a>, <a href='http://portfoliodomourdok.wordpress.com/tag/pentium-processor-architecture/'>pentium processor architecture</a>, <a href='http://portfoliodomourdok.wordpress.com/tag/postgres-download/'>postgres download</a>, <a href='http://portfoliodomourdok.wordpress.com/tag/postgresql/'>postgresql</a>, <a href='http://portfoliodomourdok.wordpress.com/tag/ruby-gem/'>ruby gem</a>, <a href='http://portfoliodomourdok.wordpress.com/tag/ruby-postgres/'>ruby postgres</a>, <a href='http://portfoliodomourdok.wordpress.com/tag/ruby-tutorial/'>ruby tutorial</a>, <a href='http://portfoliodomourdok.wordpress.com/tag/rubygem-install/'>rubygem install</a>, <a href='http://portfoliodomourdok.wordpress.com/tag/rubygems/'>rubygems</a>, <a href='http://portfoliodomourdok.wordpress.com/tag/snow-leopard/'>snow leopard</a>, <a href='http://portfoliodomourdok.wordpress.com/tag/update-rubygem/'>update rubygem</a>, <a href='http://portfoliodomourdok.wordpress.com/tag/x86-architecture/'>x86 architecture</a>, <a href='http://portfoliodomourdok.wordpress.com/tag/x86-processor-architecture/'>x86 processor architecture</a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/portfoliodomourdok.wordpress.com/344/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/portfoliodomourdok.wordpress.com/344/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/portfoliodomourdok.wordpress.com/344/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/portfoliodomourdok.wordpress.com/344/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/portfoliodomourdok.wordpress.com/344/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/portfoliodomourdok.wordpress.com/344/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/portfoliodomourdok.wordpress.com/344/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/portfoliodomourdok.wordpress.com/344/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/portfoliodomourdok.wordpress.com/344/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/portfoliodomourdok.wordpress.com/344/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/portfoliodomourdok.wordpress.com/344/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/portfoliodomourdok.wordpress.com/344/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/portfoliodomourdok.wordpress.com/344/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/portfoliodomourdok.wordpress.com/344/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=portfoliodomourdok.wordpress.com&amp;blog=7583293&amp;post=344&amp;subd=portfoliodomourdok&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://portfoliodomourdok.wordpress.com/2010/01/30/extensoes-nativas-no-ruby/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/28c68b93b7780192ed6f40ab194c4859?s=96&#38;d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96&#38;r=G" medium="image">
			<media:title type="html">André Moreira </media:title>
		</media:content>

		<media:content url="http://portfoliodomourdok.files.wordpress.com/2010/01/2614978610_2d1d678d79.jpg?w=150" medium="image">
			<media:title type="html">Push for help</media:title>
		</media:content>
	</item>
		<item>
		<title>Corrigindo erros após instalação do Nginx no Mac OSX</title>
		<link>http://portfoliodomourdok.wordpress.com/2009/12/22/corrigindo-erros-apos-instalacao-do-nginx-no-mac-osx/</link>
		<comments>http://portfoliodomourdok.wordpress.com/2009/12/22/corrigindo-erros-apos-instalacao-do-nginx-no-mac-osx/#comments</comments>
		<pubDate>Tue, 22 Dec 2009 17:52:11 +0000</pubDate>
		<dc:creator>mourdok</dc:creator>
				<category><![CDATA[Mac OSX]]></category>
		<category><![CDATA[NGINX]]></category>
		<category><![CDATA[Rails]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[error 403]]></category>
		<category><![CDATA[http server error]]></category>
		<category><![CDATA[leopard]]></category>
		<category><![CDATA[mac os leopard]]></category>
		<category><![CDATA[mac software]]></category>
		<category><![CDATA[macbook]]></category>
		<category><![CDATA[mod_rails]]></category>
		<category><![CDATA[nginx passenger]]></category>
		<category><![CDATA[nginx proxy]]></category>
		<category><![CDATA[nginx rails]]></category>
		<category><![CDATA[phusion passenger install]]></category>
		<category><![CDATA[phusion passenger nginx]]></category>
		<category><![CDATA[phusion passenger rails]]></category>
		<category><![CDATA[rails passenger]]></category>
		<category><![CDATA[ruby gem]]></category>
		<category><![CDATA[ruby on rails]]></category>
		<category><![CDATA[ruby passenger]]></category>
		<category><![CDATA[ruby rails]]></category>
		<category><![CDATA[ruby tutorial]]></category>
		<category><![CDATA[snow leopard]]></category>

		<guid isPermaLink="false">http://portfoliodomourdok.wordpress.com/?p=278</guid>
		<description><![CDATA[Recentemente tive dificuldade, para fazer o Nginx funcionar no meu querido Mac OSX. Apesar de basicamente não existir problema durante a instalação, somente após o termino dessa, tive algumas dores de cabeça. Mas, como o problema agora já consta resolvido, vou compartilhar com vocês a solução que adotei. Introdução Senão for do seu conhecimento, o [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=portfoliodomourdok.wordpress.com&amp;blog=7583293&amp;post=278&amp;subd=portfoliodomourdok&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p><img class="alignleft size-thumbnail wp-image-286" style="border:0 none;margin:10px;" title="Nginx" src="http://portfoliodomourdok.files.wordpress.com/2009/12/nginx-logo.png?w=150&#038;h=38" alt="" width="150" height="38" /></p>
<p>Recentemente tive dificuldade, para fazer o <a title="NGINX" href="http://nginx.org/">Nginx</a> funcionar no meu querido <a title="Mac OS X" href="http://www.apple.com/br/macosx/">Mac OSX</a>.</p>
<p>Apesar de basicamente não existir problema durante a instalação, somente após o termino dessa, tive algumas dores de cabeça. Mas, como o problema agora já consta resolvido, vou compartilhar com vocês a solução que adotei.</p>
<p><span id="more-278"></span></p>
<h3><span style="color:#333399;">Introdução</span></h3>
<p>Senão for do seu conhecimento, o Nginx, <a title="NGINX" href="http://pt.wikipedia.org/wiki/Nginx">é um Servidor e Proxy Reverso HTTP de Alta Performance</a>. Óoo, como soa bonita essa frase <img src='http://s0.wp.com/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> !</p>
<p>Porém os motivos em adotar esse servidor foram de alguns artigos da comunidade, como esse da <a title="Melhorando o GUJ: Jetty, NIO e load balancing" href="http://blog.caelum.com.br/2008/06/27/melhorando-o-guj-jetty-nio-e-load-balancing/">Caelum</a> (por <a title="Fábio Kung" href="http://fabiokung.com/">Fábio Kung</a>) e esse daqui também da <a title="A infraestrutura de servidores Web do Sistema boo-box" href="http://www.boo-box.com/blog/br/2009/a-infraestrutura-de-servidores-web-do-sistema-boo-box/">Boox-box</a> (por Marco Gomes), comentando sobre a baixa quantidade de <a title="Memória" href="http://pt.wikipedia.org/wiki/Mem%C3%B3ria_%28computador%29">Memória</a> e <a title="CPU" href="http://pt.wikipedia.org/wiki/CPU">CPU</a> que esse servidor consome.</p>
<p>Assim esse foi o motivo da minha pessoa, querer utilizar o Nginx desde o desenvolvimento, passando por qualidade até chegar com aplicação em produção.</p>
<h3><span style="color:#333399;">A instalação</span></h3>
<p style="text-align:center;"><img class="aligncenter size-full wp-image-291" style="border:0 none;" title="$ command-line is the future, man." src="http://portfoliodomourdok.files.wordpress.com/2009/12/command_line.jpg?w=300&#038;h=274" alt="" width="300" height="274" /></p>
<p>Nem precisei pedir ajuda do <a title="Tio Google" href="http://www.google.com.br/search?hl=pt-BR&amp;rlz=1C1GGLS_pt-BRBR358BR358&amp;q=nginx+ruby&amp;btnG=Pesquisar&amp;meta=&amp;aq=f&amp;oq=">Tio Google</a>, pois no <a title="Twitter" href="http://twitter.com/phusion_nl">Twitter</a> mesmo já recebi comentários sobre o Nginx + <a title="Passenger" href="http://www.modrails.com/">Passenger</a>&#8230; Então, vamos ao que interessa!</p>
<p>Para saber como efetuar a instalação básica do Passenger com Nginx, basta seguir esse Screencast:</p>
<p><a title="Quick Time" href="http://www.apple.com/quicktime/download/">Quick Time</a>: <a title="Passenger Nginx" href="http://www.modrails.com/videos/passenger_nginx.mov">http://www.modrails.com/videos/passenger_nginx.mov</a></p>
<p>Feito isso não somente o meu Mac OSX, como o seu também, deve executar sua aplicação Ruby em segundos (isso mesmo Nginx é muito rápido).</p>
<p>Porém, <a title="I Can't Get No, Satisfaction" href="http://en.wikipedia.org/wiki/%28I_Can%27t_Get_No%29_Satisfaction">nem tudo é satisfação</a>. <img src='http://s0.wp.com/wp-includes/images/smilies/icon_biggrin.gif' alt=':-D' class='wp-smiley' />  Piada boba essa.</p>
<h3><span style="color:#333399;">DNS error &#8211; cannot find server</span></h3>
<p style="text-align:center;"><strong><span style="color:#333399;"><img class="aligncenter size-full wp-image-290" style="border:0 none;" title="Server not found" src="http://portfoliodomourdok.files.wordpress.com/2009/12/dns_error.jpg?w=450&#038;h=220" alt="" width="450" height="220" /></span></strong></p>
<p>Foi esse o primeiro erro que tive de resolver, após configurar a minha primeira aplicação Ruby.</p>
<p>Agora sim, mais do que nunca, o Tio Google me indicou o post de um rapaz da comunidade <a title="Ruby BR" href="http://ruby-br.org/">Ruby BR</a> (só que agora não me lembro o link, então depois coloco por aqui). Esse artigo diz que eu preciso editar o arquivo de <a title="Hosts File" href="http://en.wikipedia.org/wiki/Hosts_file">Hosts </a>do Mac OSX, conforme abaixo.</p>
<pre class="brush: ruby;">
# Via Terminal
sudo mate /etc/hosts

# No querido Textmate
# Modificar essa linha
127.0.0.1 localhost

# Para essa daqui
127.0.0.1 localhost my.application
</pre>
<p>Feito isso: Problema Resolvido! <img src='http://s0.wp.com/wp-includes/images/smilies/icon_sad.gif' alt=':-(' class='wp-smiley' />  Na sinceridade, somente um bug corrigido.</p>
<h3><span style="color:#333399;">HTTP 403</span></h3>
<p style="text-align:center;"><span style="color:#333399;"><strong><img class="aligncenter size-full wp-image-293" style="border:0 none;" title="403 Forbiden" src="http://portfoliodomourdok.files.wordpress.com/2009/12/http_error.jpg?w=225&#038;h=300" alt="" width="225" height="300" /></strong></span></p>
<p>No meu caso <a title="HTTP 403" href="http://en.wikipedia.org/wiki/HTTP_403">esse erro</a>, não foi resolvido utilizando o comando Unix conhecido, por <a title="Chmod" href="http://pt.wikipedia.org/wiki/Chmod">Chmod</a>. O problema, não tinha nada a ver com essa solução.</p>
<p>Acontece que o Nginx executa-se com &#8220;um usuário próprio&#8221;, na qual esse não tem previlégios no sistema de arquivo fora de sua alçada (leia-se /opt/nginx/html) então é preciso informar isso no arquivo de configuração do mesmo.</p>
<p>E somando isso, mais o <a title="Gist" href="http://gist.github.com/126659">Gist</a> do <a title="@MauricioJr" href="http://twitter.com/mauriciojr">@MauricioJr</a>, o problema foi resolvido (e finalmente) da seguinte forma:</p>
<pre class="brush: ruby;">
# Via Terminal
sudo mate /opt/nginx/conf/nginx.conf

# No querido Textmate
# Modificar essa linha
# user nobody; &lt;&lt; Isso mesmo a linha esta comentada

# Para essa daqui
user my_user_mac my_group_mac;
</pre>
<p>E pronto o problema esta resolvido. No meu caso o item my_group_mac, substitui por admin e o item my_user_mac para andre.</p>
<h3><span style="color:#333399;">Conclusão</span></h3>
<p style="text-align:center;"><img class="aligncenter size-full wp-image-295" style="border:0 none;" title="1 + 1 = 3 Duvida?" src="http://portfoliodomourdok.files.wordpress.com/2009/12/duvida.jpg?w=288&#038;h=191" alt="" width="288" height="191" /></p>
<p>Sempre tente corrigir um problema através da <a title="Documentação" href="http://wiki.nginx.org/">Documentação</a>, mas se esta não estiver clara (para você), informe a sua dúvida (específica) em algum <a title="Grupo de Usuários" href="http://groups.google.com/group/rails-br/browse_thread/thread/686d694e3429f32e">Grupo de Usuários</a>.</p>
<p> <img src='http://s0.wp.com/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /><br />
Bom é isso caro leitor.</p>
<p>Quem escreveu foi o André Moreira.<br />
Obrigado pela visita e até o próximo post.</p>
<br />Publicado emMac OSX, NGINX, Rails, Ruby Tagged: error 403, http server error, leopard, mac os leopard, Mac OSX, mac software, macbook, mod_rails, nginx passenger, nginx proxy, nginx rails, phusion passenger install, phusion passenger nginx, phusion passenger rails, rails passenger, ruby gem, ruby on rails, ruby passenger, ruby rails, ruby tutorial, snow leopard <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/portfoliodomourdok.wordpress.com/278/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/portfoliodomourdok.wordpress.com/278/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/portfoliodomourdok.wordpress.com/278/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/portfoliodomourdok.wordpress.com/278/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/portfoliodomourdok.wordpress.com/278/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/portfoliodomourdok.wordpress.com/278/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/portfoliodomourdok.wordpress.com/278/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/portfoliodomourdok.wordpress.com/278/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/portfoliodomourdok.wordpress.com/278/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/portfoliodomourdok.wordpress.com/278/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/portfoliodomourdok.wordpress.com/278/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/portfoliodomourdok.wordpress.com/278/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/portfoliodomourdok.wordpress.com/278/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/portfoliodomourdok.wordpress.com/278/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=portfoliodomourdok.wordpress.com&amp;blog=7583293&amp;post=278&amp;subd=portfoliodomourdok&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://portfoliodomourdok.wordpress.com/2009/12/22/corrigindo-erros-apos-instalacao-do-nginx-no-mac-osx/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
<enclosure url="http://www.modrails.com/videos/passenger_nginx.mov" length="10621251" type="video/quicktime" />
	
		<media:content url="http://0.gravatar.com/avatar/28c68b93b7780192ed6f40ab194c4859?s=96&#38;d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96&#38;r=G" medium="image">
			<media:title type="html">André Moreira </media:title>
		</media:content>

		<media:content url="http://portfoliodomourdok.files.wordpress.com/2009/12/nginx-logo.png?w=150" medium="image">
			<media:title type="html">Nginx</media:title>
		</media:content>

		<media:content url="http://portfoliodomourdok.files.wordpress.com/2009/12/command_line.jpg" medium="image">
			<media:title type="html">$ command-line is the future, man.</media:title>
		</media:content>

		<media:content url="http://portfoliodomourdok.files.wordpress.com/2009/12/dns_error.jpg" medium="image">
			<media:title type="html">Server not found</media:title>
		</media:content>

		<media:content url="http://portfoliodomourdok.files.wordpress.com/2009/12/http_error.jpg" medium="image">
			<media:title type="html">403 Forbiden</media:title>
		</media:content>

		<media:content url="http://portfoliodomourdok.files.wordpress.com/2009/12/duvida.jpg" medium="image">
			<media:title type="html">1 + 1 = 3 Duvida?</media:title>
		</media:content>
	</item>
		<item>
		<title>Programador Feliz Escreve Testes</title>
		<link>http://portfoliodomourdok.wordpress.com/2009/09/07/programador-feliz-escreve-testes/</link>
		<comments>http://portfoliodomourdok.wordpress.com/2009/09/07/programador-feliz-escreve-testes/#comments</comments>
		<pubDate>Mon, 07 Sep 2009 00:47:25 +0000</pubDate>
		<dc:creator>mourdok</dc:creator>
				<category><![CDATA[Agile]]></category>
		<category><![CDATA[Testing]]></category>
		<category><![CDATA[agile extreme programing]]></category>
		<category><![CDATA[agile programing]]></category>
		<category><![CDATA[agile tdd]]></category>
		<category><![CDATA[create unit test]]></category>
		<category><![CDATA[extreme programing xp]]></category>
		<category><![CDATA[extreme programming]]></category>
		<category><![CDATA[java extreme programing]]></category>
		<category><![CDATA[java unit test]]></category>
		<category><![CDATA[junit]]></category>
		<category><![CDATA[junit test]]></category>
		<category><![CDATA[programador java]]></category>
		<category><![CDATA[programador php]]></category>
		<category><![CDATA[programador web]]></category>
		<category><![CDATA[rails test unit]]></category>
		<category><![CDATA[ruby unit test]]></category>
		<category><![CDATA[tdd development]]></category>
		<category><![CDATA[tdd java]]></category>
		<category><![CDATA[tdd test]]></category>
		<category><![CDATA[tdd test driven]]></category>
		<category><![CDATA[tdd testing]]></category>
		<category><![CDATA[test driven development]]></category>
		<category><![CDATA[unit testing]]></category>
		<category><![CDATA[unit tests]]></category>
		<category><![CDATA[xp programing]]></category>

		<guid isPermaLink="false">http://portfoliodomourdok.wordpress.com/?p=241</guid>
		<description><![CDATA[Atualmente tenho estudado Ruby e todas as facilidades que existem em volta dessa linguagem. Algo que me chamou muito atenção e me fez balançar a relação que tenho com Java hoje Foram das Pessoas que escrevem código em Ruby, existir um sentimento muito forte, sobre ser Agile. Aonde dentre esses aspectos da Agile, mais especificamente [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=portfoliodomourdok.wordpress.com&amp;blog=7583293&amp;post=241&amp;subd=portfoliodomourdok&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p><img class="alignleft size-thumbnail wp-image-476" style="margin-right:10px;margin-left:10px;border:0 none;" title="The Bugs Said Nevermore" src="http://portfoliodomourdok.files.wordpress.com/2009/09/the_bugs_said___nevermore___by_ikka_nosferatu.png?w=100&#038;h=150" alt="" width="100" height="150" /></p>
<p>Atualmente tenho estudado <a title="Linguagem de Programação Ruby" href="http://www.ruby-lang.org/pt/">Ruby</a> e todas as facilidades que existem em volta dessa linguagem.</p>
<p>Algo que me chamou muito atenção e me fez balançar a relação que tenho com <a title="Developer Resources for Java Technology" href="http://java.sun.com/">Java</a> hoje <img src='http://s0.wp.com/wp-includes/images/smilies/icon_biggrin.gif' alt=':-D' class='wp-smiley' />  Foram das Pessoas que escrevem código em Ruby, existir um sentimento muito forte, sobre ser <a title="Manifesto para o desenvolvimento ágil de software" href="http://www.manifestoagil.com.br/">Agile</a>.</p>
<p>Aonde dentre esses aspectos da Agile, mais especificamente na <a title="Extreme Programming: A gentle introduction." href="http://www.extremeprogramming.org/">Extreme Programing</a> o ponto que mais gosto é de <em>escrever testes antes de programar uma funcionalidade</em>.</p>
<p><span id="more-241"></span></p>
<h3><span style="color:#000080;">Um pequeno cenário</span></h3>
<p>Eu escrevo testes é claro. Seria loucura programar em plena atualidade <img src='http://s0.wp.com/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' />  Sem testar o meu código!</p>
<p>Mas o pouco que já pude notar, das Pessoas que escrevem código tanto em <a title="PHP" href="http://www.php.net/">PHP</a> como em Java. É mais ou menos a seguinte situação:</p>
<blockquote><p>Você esta vendo essa especificação (fluxogramas e afins)? Já esta tudo documentado, então é Só Escrever o Código, pra fazer isso funcionar. Não precisa testar nada!</p></blockquote>
<p>Simplesmente fico <img src='http://s0.wp.com/wp-includes/images/smilies/icon_sad.gif' alt=':-(' class='wp-smiley' />  e torço o nariz!</p>
<p>Você pode até pensar, que Eu sou &#8220;louco&#8221; em &#8220;gastar tempo&#8221; escrevendo Testes enquanto programo.</p>
<p>Além de achar esquisito demais, em Eu tentar trazer Você para esse <a title="Venha para o lado Negro da Força" href="http://mob211.photobucket.com/albums/bb56/jinblack/darkside.jpg">lado da força</a> <img src='http://s0.wp.com/wp-includes/images/smilies/icon_biggrin.gif' alt=':-D' class='wp-smiley' /> </p>
<p>Mas brincadeiras a parte! Vou pedir para Você, humildemente ler as seguintes postagens e ficar mais abismado com os comentários do <a title="Quem é Phillip Calçado?" href="http://fragmental.com.br/wiki/index.php/Quem_%C3%A9_Phillip_Cal%C3%A7ado%3F">Phillip Calçado</a>:</p>
<ul>
<li><a title="Uh-eme-ele" href="http://blog.fragmental.com.br/2008/07/25/uh-eme-ele/">Uh-eme-ele</a></li>
<li><a title="Programadores profissionais escrevem testes. Ponto final" href="http://blog.fragmental.com.br/2007/10/31/programadores-profissionais-escrevem-testes-ponto-final/">Programadores profissionais escrevem testes. Ponto final</a></li>
</ul>
<p>Pois é chato passar por situações, na qual colegas programadores comentam:</p>
<blockquote><p>Você esta maluco??? Não tenho tempo para ficar testando meus códigos!</p></blockquote>
<p>Velhinho a minha felicidade como Programador fica <img src='http://s0.wp.com/wp-includes/images/smilies/icon_sad.gif' alt=':-(' class='wp-smiley' /> </p>
<p>Sabe, realmente essa bronca que Algumas Pessoas tem por testar código, não é melhor caminho da <em>highway</em>!</p>
<p>Então venho aqui, para repassar essa idéia a você. Isso mesmo apenas repassar!</p>
<h3><span style="color:#000080;">Por onde começar?</span></h3>
<p>Esses dias via Twitter, um colega postou uma apresentação sobre Testes, mas muuuito boa! Conforme slide a seguir, você precisa ver.</p>
<p>Demonstra Testes em Ruby, porém sem preconceitos (se tiver é claro)! Alias, como Carlos Brando costuma dizer <a title="Carlos Brando" href="http://www.nomedojogo.com/2009/04/16/a-melhor-linguagem-de-programacao-e-o-programador/">a melhor linguagem de programação é o programador.</a></p>
<p>&nbsp;</p>
<div style="width:425px;" id="__ss_1836970"><strong><a href="http://www.slideshare.net/seatecnologia/minicurso-de-testesonrails" title="Minicurso de TestesOnRails">Minicurso de TestesOnRails</a></strong>
<div style="padding:5px 0 12px;">View more <a href="http://www.slideshare.net/">presentations</a> from <a href="http://www.slideshare.net/seatecnologia">SEA Tecnologia</a>.</div>
</div>
<p>&nbsp;</p>
<p> <img src='http://s0.wp.com/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' />  Ufa! Quantos slides. Mas bem interessante.</p>
<p>Depois de assistir os slides (não tive o prazer de estar no local) resolvi listar aqui, uma fatia das ferramentas para Teste, nas linguagens que costumo programar.</p>
<p>Primeiramente <a title="TDD" href="http://en.wikipedia.org/wiki/Test-driven_development">TDD</a>, que nada mais é do que Desenvolver Orientado a Teste.</p>
<h5>Com Java</h5>
<ul>
<li><a title="JUnit" href="http://www.junit.org/">JUnit</a></li>
<li><a title="TestNG" href="http://testng.org/doc/index.html">TestNG</a></li>
</ul>
<h5>Com PHP</h5>
<ul>
<li><a title="PHPUnit" href="http://www.phpunit.de/">PHPUnit</a></li>
<li><a title="SimpleTest" href="http://www.simpletest.org/">SimpleTest</a></li>
</ul>
<h5>Com Python</h5>
<ul>
<li><a title="unittest" href="http://www.python.org/doc/current/library/unittest.html">unittest</a></li>
</ul>
<h5>Com Ruby</h5>
<ul>
<li><a title="Test::Unit" href="http://www.ruby-doc.org/stdlib/libdoc/test/unit/rdoc/classes/Test/Unit.html">Test::Unit</a></li>
</ul>
<p>E não que os próximos itens descritos, sejam um complemento. Mas encaro como sendo uma segunda alternativa ao TDD. Temos assim o <a title="BDD" href="http://en.wikipedia.org/wiki/Behavior_Driven_Development">BDD</a>, que é Desenvolver Orientado a Comportamento.</p>
<h5>Com Java</h5>
<ul>
<li><a title="JBehave" href="http://jbehave.org/">JBehave</a></li>
</ul>
<h5>Com PHP</h5>
<ul>
<li><a title="PHPSpec" href="http://www.phpspec.org/">PHPSpec</a></li>
</ul>
<h5>Com Python</h5>
<ul>
<li><a title="Pyccuracy" href="http://www.pyccuracy.org/">Pyccuracy</a></li>
</ul>
<h5>Com Ruby</h5>
<ul>
<li><a title="RSpec" href="http://rspec.info/">RSpec</a></li>
<li><a title="Cucumber" href="http://cukes.info/">Cucumber</a></li>
</ul>
<p>Agora é só você começar a escrever seus testes!</p>
<p> <img src='http://s0.wp.com/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /><br />
Bom é isso caro leitor.</p>
<p>Quem escreveu foi o André Moreira.<br />
Obrigado pela visita e até o próximo post.</p>
<br />Publicado emAgile, Testing Tagged: agile extreme programing, agile programing, agile tdd, create unit test, extreme programing xp, extreme programming, java extreme programing, java unit test, junit, junit test, programador java, programador php, programador web, rails test unit, ruby unit test, tdd development, tdd java, tdd test, tdd test driven, tdd testing, test driven development, Testing, unit testing, unit tests, xp programing <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/portfoliodomourdok.wordpress.com/241/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/portfoliodomourdok.wordpress.com/241/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/portfoliodomourdok.wordpress.com/241/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/portfoliodomourdok.wordpress.com/241/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/portfoliodomourdok.wordpress.com/241/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/portfoliodomourdok.wordpress.com/241/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/portfoliodomourdok.wordpress.com/241/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/portfoliodomourdok.wordpress.com/241/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/portfoliodomourdok.wordpress.com/241/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/portfoliodomourdok.wordpress.com/241/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/portfoliodomourdok.wordpress.com/241/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/portfoliodomourdok.wordpress.com/241/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/portfoliodomourdok.wordpress.com/241/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/portfoliodomourdok.wordpress.com/241/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=portfoliodomourdok.wordpress.com&amp;blog=7583293&amp;post=241&amp;subd=portfoliodomourdok&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://portfoliodomourdok.wordpress.com/2009/09/07/programador-feliz-escreve-testes/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/28c68b93b7780192ed6f40ab194c4859?s=96&#38;d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96&#38;r=G" medium="image">
			<media:title type="html">André Moreira </media:title>
		</media:content>

		<media:content url="http://portfoliodomourdok.files.wordpress.com/2009/09/the_bugs_said___nevermore___by_ikka_nosferatu.png?w=100" medium="image">
			<media:title type="html">The Bugs Said Nevermore</media:title>
		</media:content>
	</item>
		<item>
		<title>Como aprender Java?</title>
		<link>http://portfoliodomourdok.wordpress.com/2009/03/08/como-aprender-java/</link>
		<comments>http://portfoliodomourdok.wordpress.com/2009/03/08/como-aprender-java/#comments</comments>
		<pubDate>Sun, 08 Mar 2009 21:47:00 +0000</pubDate>
		<dc:creator>mourdok</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[api java]]></category>
		<category><![CDATA[java 1.5]]></category>
		<category><![CDATA[java 2]]></category>
		<category><![CDATA[java 2 se]]></category>
		<category><![CDATA[java 5]]></category>
		<category><![CDATA[java 5 ee]]></category>
		<category><![CDATA[java 6]]></category>
		<category><![CDATA[java 6 se]]></category>
		<category><![CDATA[java ee 6]]></category>
		<category><![CDATA[java ee j2ee]]></category>
		<category><![CDATA[java jdk]]></category>
		<category><![CDATA[java jdk 1.5]]></category>
		<category><![CDATA[java jvm]]></category>
		<category><![CDATA[java me sdk]]></category>
		<category><![CDATA[java me tutorial]]></category>
		<category><![CDATA[java mobile]]></category>
		<category><![CDATA[java runtime environment]]></category>
		<category><![CDATA[java runtime se]]></category>
		<category><![CDATA[java se development]]></category>
		<category><![CDATA[java se jdk]]></category>
		<category><![CDATA[java tutorial]]></category>
		<category><![CDATA[java virtual machine]]></category>
		<category><![CDATA[jdk 1.4]]></category>
		<category><![CDATA[jdk 1.5]]></category>
		<category><![CDATA[jdk 1.6]]></category>
		<category><![CDATA[jdk 6]]></category>
		<category><![CDATA[jdk sun]]></category>
		<category><![CDATA[jvm 1.5]]></category>
		<category><![CDATA[sdk java]]></category>
		<category><![CDATA[sun]]></category>
		<category><![CDATA[sun java]]></category>
		<category><![CDATA[sun jvm]]></category>
		<category><![CDATA[tutorial java ee]]></category>

		<guid isPermaLink="false">http://portfoliodomourdok.wordpress.com/?p=176</guid>
		<description><![CDATA[Após alguns meses afastado do blog, por causa de uma maratona de cursos que vinha fazendo aos finais de semana, estou na área novamente para comentar que o blog ainda existe Como atualmente estou atarefado em um projeto, não terei cabeça pra falar sobre Design Patterns. Mas (bem) futuramente volto a destrinchar esse assunto. Tema [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=portfoliodomourdok.wordpress.com&amp;blog=7583293&amp;post=176&amp;subd=portfoliodomourdok&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p><img class="alignleft size-thumbnail wp-image-190" style="border:0 none;margin:10px;" title="Java" src="http://portfoliodomourdok.files.wordpress.com/2009/08/java.png?w=94&#038;h=150" alt="" width="94" height="150" /></p>
<p>Após alguns meses afastado do blog, <a title="Caelum - Cursos de Java" href="http://www.caelum.com.br/cursos/java/">por causa de uma maratona de cursos que vinha fazendo aos finais de semana</a>, estou na área novamente para comentar que o blog ainda existe <img src='http://s0.wp.com/wp-includes/images/smilies/icon_biggrin.gif' alt=':-D' class='wp-smiley' /> </p>
<p>Como atualmente estou atarefado em um projeto, não terei cabeça pra falar sobre Design Patterns. Mas (bem) futuramente volto a destrinchar esse assunto.</p>
<p><span id="more-176"></span></p>
<h3><span style="color:#000080;">Tema de hoje</span></h3>
<p>O assunto da vez é <em>Como aprender Java</em>. Que surgiu após alguns colegas, que desconhecem essa maravilhosa linguagem Orientada a Objetos, ficarem falando:</p>
<blockquote><p>- Poxa vida André, gostaria de programar em Java também. Mas como é muito difícil, nem me aventuro.</p></blockquote>
<p><em>Obs.: Linguagem maravilhosa é ótimo <img src='http://s0.wp.com/wp-includes/images/smilies/icon_biggrin.gif' alt=':-D' class='wp-smiley' /> </em></p>
<p>Primeiramente vamos deixar claro o seguinte. Java não é simplesmente mais uma linguagem de programação! Java ultrapassa esse paradigma, pelo menos Eu encaro dessa forma. Através disso nós temos na verdade Plataformas muito abrangentes e distintas de desenvolvimento, quando falamos em Java.</p>
<p>Apresento a você (resumidamente é claro) algumas siglas que fazem os pilares do que Java é hoje:</p>
<p>O <a href="http://java.sun.com/javase/">Java SE</a>, aqui temos o Core dessa Gente Grande, que constitui de uma Java Virtual Machine (vulgo <a href="http://java.sun.com/javase/technologies/hotspot/index.jsp">HotSpot</a> ou se preferir <a href="http://java.sun.com/javase/6/docs/technotes/guides/vm/index.html">JVM</a>) que irá interpretar e executar o código que você escreve, compilador que ira gerar a partir dos seus arquivos .java, arquivos .class que serão executados pelo HotSpot e uma extensa <a href="http://java.sun.com/javase/6/docs/api/">API</a>. Logo é por aqui que se inicia a sua aprendizagem! Para instalar vide esse link da <a href="http://java.sun.com/javase/downloads/index.jsp">JDK</a>.</p>
<p><em>Obs.: A JVM é sem dúvida uma maravilha, agora não estou exagerando <img src='http://s0.wp.com/wp-includes/images/smilies/icon_biggrin.gif' alt=':-D' class='wp-smiley' /> </em></p>
<p>Temos também o <a href="http://java.sun.com/javaee/">Java EE</a>, que além de integrar o que existe de disponível na Java SE, essa plataforma foi pensada exclusivamente para aplicações que envolvem diversas camadas e <a href="http://jcp.org/aboutJava/communityprocess/final/jsr244/index.html">conforme especificação</a> roda em um Servidor de Aplicações (mas não necessariamente) e também possui sua própria <a href="http://java.sun.com/javaee/5/docs/api/">API</a>. Onde na minha opinião é a plataforma mais interessante de utilizar. Para instalar vide esse link da <a href="http://java.sun.com/javaee/downloads/index.jsp">SDK</a>.</p>
<p>Por último, não menos importante temos o <a href="http://java.sun.com/javame/index.jsp">Java ME</a>. Pois é através desse que conseguimos escrever Aplicações Embarcadas (se você achar esse nome um pouco esquisito, vale apena dar uma conferida <a href="http://feedproxy.google.com/%7Er/guanacast/%7E5/UGQ2D7feuMw/58-Podcast_GuanabaraINFO_Alta.mp3">nesse podcast</a>). Ou seja tudo quanto for dispositivo/aplicação especifica, por exemplo: Celulares, PDAs, Eletroeletrônicos e afins. Podemos aproveitar das diversas APIs (<a href="http://java.sun.com/javame/reference/apis/jsr139/">CLDC</a>, <a href="http://java.sun.com/javame/reference/apis/jsr118/">MID Profile</a>, <a href="http://java.sun.com/javame/reference/apis/jsr218/">CDC</a>, <a href="http://java.sun.com/javame/reference/apis/jsr219/">Foundation</a> e etc&#8230;) que compõem o Java ME e escrever soluções que também funcionem fora de um computador seja ele desktop, notebook ou server.</p>
<p>Agora olhando para tudo isso acima, realmente Java não é uma <a href="http://pt.wikipedia.org/wiki/Java">Ilha</a> (:-0 puts que trocadilho chinfrim) e sim um mundo das melhores tecnologias disponíveis no mercado, escritas em Java. Como por exemplo o <a href="http://pt.wikipedia.org/wiki/Chamada_de_procedimento_remoto">RPC</a> e o <a href="http://pt.wikipedia.org/wiki/WebServices">WebServices</a>.</p>
<p>Agora que já temos uma breve noção sobre em qual lugar Java pode ser aplicado. Vamos nos atentar em como aprender essa extensa Linguagem de Programação.</p>
<h3><span style="color:#000080;">Livros</span></h3>
<p style="text-align:center;"><img class="aligncenter size-full wp-image-196" style="border:0 none;" title="Java Como Programar" src="http://portfoliodomourdok.files.wordpress.com/2009/08/javacomoprogramar6ed.jpg?w=143&#038;h=192" alt="" width="143" height="192" /></p>
<p>Toda faculdade (pelo menos aqui em São Paulo, Brasil) sempre aponta como material base, o livro <a href="http://www.temporeal.com.br/produtos.php?id=169312">Java Como Programar</a>, do famoso Deitel, que nessa postagem se encontra em sua 6ª edição.</p>
<p>Afinal de contas, gostei de Java por causa desse livro também! É claro que cheguei a estudar outros livros como:</p>
<ul>
<li><a href="http://www.temporeal.com.br/produtos.php?id=168466">Programando em Java 2 &#8211; Teorias e Aplicações</a></li>
<li><a href="http://www.temporeal.com.br/produtos.php?id=167791">A Arte do Java</a></li>
<li><a href="http://www.temporeal.com.br/produtos.php?id=169254">Aplicando Lógica Orientada a Objetos em Java</a></li>
<li><a href="http://www.temporeal.com.br/produtos.php?id=169000">Programação Orientada a Aspectos em Java</a></li>
</ul>
<p>Mas nesse livro do Deitel, você passa praticamente de capitulo em capitulo, sempre lendo e relendo assuntos relacionados ao Core do Java. Ou seja, como costumo brincar, você aprende Java na marra ou reforça a cada capitulo o que já aprendeu <img src='http://s0.wp.com/wp-includes/images/smilies/icon_biggrin.gif' alt=':-D' class='wp-smiley' /> </p>
<p>Agora falando (um pouco) sério, todo iniciante deve se preocupar em aprender os tópicos: Classe, Atributo, Método, Objeto, Estrutura de Controle, Array, Herança, Polimorfismo, Exceção, Recursão, Pesquisa, Ordenação, Estrutura de Dado, Formatação de Saída de Dado, String, Caractere, Expressão Regular, Generic, Collection, Thread, Socket e JDBC.</p>
<p>Pois o cidadão sabendo isso ele depois pode partir para outros temas relacionados ao Java. Pois como citado anteriormente é apenas o básico-do-básico!</p>
<h3><span style="color:#000080;">Apostilas</span></h3>
<p style="text-align:center;"><img class="aligncenter size-full wp-image-201" style="border:0 none;" title="Java" src="http://portfoliodomourdok.files.wordpress.com/2009/08/javalivro.png?w=240&#038;h=225" alt="" width="240" height="225" /></p>
<p>Se você não quiser comprar algum dos livros citados aqui, você pode assim digamos, baixar versões genéricas do mesmo em websites (underground) espalhados por aí. Lembrando que o material encontrado sempre será em inglês. Então para os que não tem muita intimidade com o idioma do Tio San, pode procurar por apostilas escritas em bom é claro português e de graça!</p>
<p><em>Obs.: A leitura de versões genéricas são de sua e única responsabilidade :-O</em></p>
<p>Uma das apostilas que costumo sempre recomendar, são as da Caleum. Que é de uma escola que fica localizada aqui em São Paulo e em mais duas outras cidades (Rio de Janeiro e Porto Alegre).</p>
<p>É claro que apesar do conteúdo das apostilas serem bons, se você quiser, pode pagar pelo curso e ter aulas com ótimos instrutores. Além de aumentar seu networking com os alunos, instrutores e cia.</p>
<p>Agora chega de propaganda <img src='http://s0.wp.com/wp-includes/images/smilies/icon_biggrin.gif' alt=':-D' class='wp-smiley' />  e vamos as apostilas:</p>
<ul>
<li><a href="http://www.caelum.com.br/downloads/apostila/caelum-java-objetos-fj11.pdf">FJ-11 – Java e Orientação a Objetos</a></li>
<li><a href="http://www.caelum.com.br/downloads/apostila/caelum-algoritmos-estruturas-dados-java-cs14.pdf">CS-14 – Algoritmos e Estruturas de Dados em Java</a></li>
</ul>
<p>Estude ambas do começo ao fim, primeiramente a FJ-11 e depois a CS-14 e com certeza você estará preparado para após a leitura e entendimento dessas apostilas a dizer:</p>
<blockquote><p>- Agora sim sei como programar em Java.</p></blockquote>
<h3><span style="color:#000080;">Grupos de Usuários</span></h3>
<p style="text-align:center;"><img class="aligncenter size-medium wp-image-203" style="border:0 none;" title="Sun Days - Atlanta" src="http://portfoliodomourdok.files.wordpress.com/2009/03/sun-days-atlanta.jpg?w=180&#038;h=143" alt="" width="180" height="143" /></p>
<p>Algo que você notará ao estudar, trabalhar e continuar a conhecer Java é de que sempre existiram pessoas que defendem fervorosamente essa Linguagem e/ou alguns aspectos da mesma. E saiba que você também pode dar sua contribuição para esse grupo.</p>
<p>A seguir deixo uma listagem de algumas comunidades Java que costumo visitar:</p>
<ul>
<li><a href="http://www.guj.com.br/">GUJ</a></li>
<li><a href="http://www.javafree.org/">Java Free</a></li>
<li><a href="http://www.gojava.org/">GO Java</a></li>
<li><a href="http://www.gujavasc.org.br/">GU Java SC</a></li>
<li><a href="http://www.jeebrasil.com.br/index">JEE Brasil</a></li>
<li><a href="http://portaljava.com/">Portal Java</a></li>
</ul>
<h3><span style="color:#000080;">Portais</span></h3>
<p>Como falei existe bastante gente interessada na utilização de Java. A seguir mais uma lista que deve constar em seus favoritos:</p>
<ul>
<li><a href="http://java.sun.com/">Sun</a></li>
<li><a href="http://www.ibm.com/developerworks">IBM</a></li>
<li><a href="http://www.oracle.com/technology/tech/java/">Oracle</a></li>
<li><a href="http://www.infoq.com/br">InfoQ</a></li>
<li><a href="http://www.dzone.com/">DZone</a></li>
<li><a href="http://www.javaworld.com/">Java World</a></li>
</ul>
<h3><span style="color:#000080;">Blogs</span></h3>
<p>Então, nem preciso comentar <img src='http://s2.wp.com/wp-includes/images/smilies/icon_razz.gif' alt=':-P' class='wp-smiley' /> </p>
<ul>
<li><a href="http://architecture-journal.blogspot.com/">Ricardo Ferreira</a></li>
<li><a href="http://camilolopes.wordpress.com/">Camilo Lopes</a></li>
<li><a href="http://www.claudius.com.br/blog/">Cláudio Miranda</a></li>
<li><a href="http://plentz.org/">Diego Plentz</a></li>
<li><a href="http://edgarsilva.com.br/">Edgar Silva</a></li>
<li><a href="http://blog.fragmental.com.br/">Phillip Calçado</a></li>
<li><a href="http://gc.blog.br/">Guilherme Chapiewski</a></li>
<li><a href="http://www.igocoelho.com.br/">Igo Coelho</a></li>
<li><a href="http://javabahia.blogspot.com/">Java Bahia</a></li>
<li><a href="http://lucabastos.blogspot.com/">Luca Bastos</a></li>
<li><a href="http://www.rafaelcarneiro.net/blog/">Rafael Carneiro</a></li>
<li><a href="http://www.rponte.com.br/">Rafael Ponte</a></li>
<li><a href="http://pacman.blog.br/">Tiago Peczenyj</a></li>
<li><a href="http://zonaj.org/">Zona J</a></li>
</ul>
<h3><span style="color:#000080;">Metodologias de Desenvolvimento</span></h3>
<p>Agora essa parte não vale somente para Java, mas sim para Programação em sí. Quando possível, aplique metodologias como XP em seu ambiente de trabalho. Pode ser outra metodologia similar, sem problema algum. Mas tente fugir (o quanto possível) do modelo Waterfall.</p>
<p>Pois lidamos (e sempre lidaremos) com pessoas, que precisam (e sempre necessitaram) de software funcional! Então que tal deixá-las felizes?</p>
<p> <img src='http://s0.wp.com/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /><br />
Bom é isso caro leitor.</p>
<p>Quem escreveu foi o André Moreira.<br />
Obrigado pela visita e até o próximo post.</p>
<br />Publicado emJava Tagged: api java, java 1.5, java 2, java 2 se, java 5, java 5 ee, java 6, java 6 se, java ee 6, java ee j2ee, java jdk, java jdk 1.5, java jvm, java me sdk, java me tutorial, java mobile, java runtime environment, java runtime se, java se development, java se jdk, java tutorial, java virtual machine, jdk 1.4, jdk 1.5, jdk 1.6, jdk 6, jdk sun, jvm 1.5, sdk java, sun, sun java, sun jvm, tutorial java ee <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/portfoliodomourdok.wordpress.com/176/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/portfoliodomourdok.wordpress.com/176/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/portfoliodomourdok.wordpress.com/176/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/portfoliodomourdok.wordpress.com/176/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/portfoliodomourdok.wordpress.com/176/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/portfoliodomourdok.wordpress.com/176/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/portfoliodomourdok.wordpress.com/176/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/portfoliodomourdok.wordpress.com/176/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/portfoliodomourdok.wordpress.com/176/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/portfoliodomourdok.wordpress.com/176/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/portfoliodomourdok.wordpress.com/176/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/portfoliodomourdok.wordpress.com/176/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/portfoliodomourdok.wordpress.com/176/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/portfoliodomourdok.wordpress.com/176/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=portfoliodomourdok.wordpress.com&amp;blog=7583293&amp;post=176&amp;subd=portfoliodomourdok&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://portfoliodomourdok.wordpress.com/2009/03/08/como-aprender-java/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
<enclosure url="http://feedproxy.google.com/%7Er/guanacast/%7E5/UGQ2D7feuMw/58-Podcast_GuanabaraINFO_Alta.mp3" length="42018675" type="audio/mpeg" />
	
		<media:content url="http://0.gravatar.com/avatar/28c68b93b7780192ed6f40ab194c4859?s=96&#38;d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96&#38;r=G" medium="image">
			<media:title type="html">André Moreira </media:title>
		</media:content>

		<media:content url="http://portfoliodomourdok.files.wordpress.com/2009/08/java.png?w=94" medium="image">
			<media:title type="html">Java</media:title>
		</media:content>

		<media:content url="http://portfoliodomourdok.files.wordpress.com/2009/08/javacomoprogramar6ed.jpg" medium="image">
			<media:title type="html">Java Como Programar</media:title>
		</media:content>

		<media:content url="http://portfoliodomourdok.files.wordpress.com/2009/08/javalivro.png" medium="image">
			<media:title type="html">Java</media:title>
		</media:content>

		<media:content url="http://portfoliodomourdok.files.wordpress.com/2009/03/sun-days-atlanta.jpg?w=300" medium="image">
			<media:title type="html">Sun Days - Atlanta</media:title>
		</media:content>
	</item>
		<item>
		<title>Padrões de Projeto &#8211; Introdução ao GoF</title>
		<link>http://portfoliodomourdok.wordpress.com/2009/02/08/padroes-de-projeto-introducao-ao-gof/</link>
		<comments>http://portfoliodomourdok.wordpress.com/2009/02/08/padroes-de-projeto-introducao-ao-gof/#comments</comments>
		<pubDate>Sun, 08 Feb 2009 21:45:52 +0000</pubDate>
		<dc:creator>mourdok</dc:creator>
				<category><![CDATA[Patterns]]></category>
		<category><![CDATA[Behavioral Pattern]]></category>
		<category><![CDATA[Creational Patter]]></category>
		<category><![CDATA[design pattern]]></category>
		<category><![CDATA[design patterns]]></category>
		<category><![CDATA[gof design]]></category>
		<category><![CDATA[gof design pattern]]></category>
		<category><![CDATA[gof design patterns]]></category>
		<category><![CDATA[gof java]]></category>
		<category><![CDATA[padrão de projeto]]></category>
		<category><![CDATA[padrões de arquitetura]]></category>
		<category><![CDATA[padrões de projetos]]></category>
		<category><![CDATA[padroes de projeto]]></category>
		<category><![CDATA[pattern gof]]></category>
		<category><![CDATA[patterns gof]]></category>
		<category><![CDATA[Structural Pattern]]></category>
		<category><![CDATA[use a cabeça]]></category>

		<guid isPermaLink="false">http://portfoliodomourdok.wordpress.com/?p=174</guid>
		<description><![CDATA[Continuando o assunto sobre Padrões de Projeto. Hoje será a vez de falar de uma turma que é muito influente, no ramo de desenvolvimento de software. Mais conhecida como a Gangue dos Quatro. Mas antes, vamos falar de dois outros personagens Na década de 70, dois conhecidos programadores Kent Beck e Ward Cunningham perceberam que [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=portfoliodomourdok.wordpress.com&amp;blog=7583293&amp;post=174&amp;subd=portfoliodomourdok&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p><img class="alignleft size-thumbnail wp-image-456" style="margin-right:10px;margin-left:10px;border:0 none;" title="The Sacred Elements of the Faith" src="http://portfoliodomourdok.files.wordpress.com/2009/02/designpatternsperiodictir1.png?w=150&#038;h=110" alt="" width="150" height="110" /></p>
<p>Continuando o assunto sobre Padrões de Projeto. Hoje será a vez de falar de uma turma que é muito influente, no ramo de desenvolvimento de software. Mais conhecida como a Gangue dos Quatro.</p>
<p><span id="more-174"></span></p>
<p>Mas antes, vamos falar de dois outros personagens <img src='http://s0.wp.com/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<p>Na década de 70, dois conhecidos programadores <a href="http://en.wikipedia.org/wiki/Kent_Beck">Kent Beck</a> e <a href="http://en.wikipedia.org/wiki/Ward_Cunningham">Ward  Cunningham</a> perceberam que os conceitos mencionados pelo Cristopher (o professor do post passado), resolveriam muito dos problemas relacionados a programação de sistemas de computador. Logo aplicaram as teorias do Cristopher, através de uma linguagem de programação largamente utilizada naquela época.</p>
<div class="wp-caption aligncenter" style="width: 109px"><img class="size-thumbnail wp-image-207 " style="border:0 none;" title="Mr. Kent" src="http://portfoliodomourdok.files.wordpress.com/2009/02/396px-kent_beck_no_workshop_mapping_xp.jpg?w=99&#038;h=149" alt="" width="99" height="149" /><p class="wp-caption-text">Mr. Kent</p></div>
<div class="wp-caption aligncenter" style="width: 160px"><img class="size-thumbnail wp-image-208 " style="border:0 none;" title="Mr. Ward" src="http://portfoliodomourdok.files.wordpress.com/2009/02/675px-ward_cunningham_at_wikimania_2006.jpg?w=150&#038;h=133" alt="" width="150" height="133" /><p class="wp-caption-text">Mr. Ward</p></div>
<p>Falo aqui do <a href="http://pt.wikipedia.org/wiki/Smalltalk_%28linguagem_de_programa%C3%A7%C3%A3o%29">SmallTalk</a>, a mãe do que hoje conhecemos por<br />
<a href="http://pt.wikipedia.org/wiki/Orienta%C3%A7%C3%A3o_a_Objetos">OO</a> (apesar de alguns detestarem) <img src='http://s2.wp.com/wp-includes/images/smilies/icon_razz.gif' alt=':-P' class='wp-smiley' /> </p>
<h3><span style="color:#000080;">Mas e o GoF surgiu dessa época, certo?</span></h3>
<p>Não! Avançando algumas décadas, na nossa maquina do tempo, foi na décadacde 90 que o quarteto <a href="http://en.wikipedia.org/wiki/Erich_Gamma">Erich Gamma</a>, <a href="http://en.wikipedia.org/wiki/Richard_Helm">Richard Helm</a>, <a href="http://en.wikipedia.org/wiki/Ralph_Johnson">Ralph Johnson</a> e <a href="http://en.wikipedia.org/wiki/John_Vlissides">John Vlissides</a><br />
. Escreveram o conceituado livro: <a href="http://www.amazon.com/Design-Patterns-Object-Oriented-Addison-Wesley-Professional/dp/0201633612/ref=sr_11_1?ie=UTF8&amp;qid=1226960571&amp;sr=11-1">Design Patterns: Elements of Reusable Object-Oriented Software</a>.</p>
<p style="text-align:center;"><img class="aligncenter size-full wp-image-219" style="border:0 none;" title="Design Patterns: Elements of Reusable Object-Oriented Software" src="http://portfoliodomourdok.files.wordpress.com/2009/02/image_2.png?w=188&#038;h=238" alt="" width="188" height="238" /></p>
<p>E após isso ficaram conhecidos como a Gangue dos Quatro ou no inglês<br />
Gang of Four. Logo temos aí o motivo da sigla do que hoje conhecemos por GoF Patterns.</p>
<h3><span style="color:#000080;">A estrutura do GoF</span></h3>
<p>E com essas quatro feras no time, a quantidade de padrões que a turma do GoF levantou, não foram poucas. Temos nada mais, nada menos do que 23 maneiras de resolver alguns problemas e esses estam estruturados em 3 categorias, que são conhecidas por:</p>
<ul>
<li>Creational Pattern</li>
<li>Structural Pattern</li>
<li>Behavioral Pattern</li>
</ul>
<p>Se bem que, se formos vasculhar hoje na Internet e nas livrarias, vamos identificar outros padrões, além da quantidade já citado anteriormente.</p>
<p>Então vamos falar brevemente sobre cada uma das estruturas:</p>
<ul>
<li><span style="font-style:italic;">Creational Pattern</span>, nos auxilia em resolver problemas na criação dos nossos objetos.</li>
<li><span style="font-style:italic;">Structural Pattern</span>, foca nas associações existentes entre nossas classes e objetos.</li>
<li><span style="font-style:italic;">Behavioral Pattern</span>, temos por último esse que trata dos problemas de divisão da responsabilidade entre as nossas classes e objetos.</li>
</ul>
<h3><span style="color:#000080;">O que veremos a seguir?</span></h3>
<p>Nos próximos posts veremos na pratica a utilização de cada pattern. Por enquanto deixo aqui a lista dos 23 e mais alguns patterns que fazem parte da família GoF.</p>
<h5>Creational Pattern</h5>
<ul>
<li>Abstract factory</li>
<li>Factory method</li>
<li>Builder</li>
<li>Lazy initialization</li>
<li>Object pool</li>
<li>Prototype</li>
<li>Singleton (sem comentá)</li>
</ul>
<h5>Structural pattern</h5>
<ul>
<li>Adapter</li>
<li>Aggregate</li>
<li>Bridge</li>
<li>Composite</li>
<li>Decorator</li>
<li>Extensibility</li>
<li>Facade</li>
<li>Flyweight</li>
<li>Proxy</li>
<li>Pipes and filters</li>
<li>Private class data</li>
</ul>
<h5>Behavioral pattern</h5>
<ul>
<li>Chain of responsibility</li>
<li>Command</li>
<li>Interpreter</li>
<li>Iterator</li>
<li>Mediator</li>
<li>Memento</li>
<li>Null Object</li>
<li>Observer</li>
<li>State</li>
<li>Strategy</li>
<li>Specification</li>
<li>Template method</li>
<li>Visitor</li>
<li>Single-serving visitor</li>
<li>Hierarchical visitor</li>
</ul>
<p> <img src='http://s0.wp.com/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /><br />
Bom é isso caro leitor.</p>
<p>Quem escreveu foi o André Moreira.<br />
Obrigado pela visita e até o próximo post.</p>
<br />Publicado emPatterns Tagged: Behavioral Pattern, Creational Patter, design pattern, design patterns, gof design, gof design pattern, gof design patterns, gof java, padrão de projeto, padrões de arquitetura, padrões de projetos, padroes de projeto, pattern gof, patterns gof, Structural Pattern, use a cabeça <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/portfoliodomourdok.wordpress.com/174/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/portfoliodomourdok.wordpress.com/174/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/portfoliodomourdok.wordpress.com/174/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/portfoliodomourdok.wordpress.com/174/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/portfoliodomourdok.wordpress.com/174/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/portfoliodomourdok.wordpress.com/174/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/portfoliodomourdok.wordpress.com/174/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/portfoliodomourdok.wordpress.com/174/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/portfoliodomourdok.wordpress.com/174/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/portfoliodomourdok.wordpress.com/174/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/portfoliodomourdok.wordpress.com/174/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/portfoliodomourdok.wordpress.com/174/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/portfoliodomourdok.wordpress.com/174/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/portfoliodomourdok.wordpress.com/174/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=portfoliodomourdok.wordpress.com&amp;blog=7583293&amp;post=174&amp;subd=portfoliodomourdok&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://portfoliodomourdok.wordpress.com/2009/02/08/padroes-de-projeto-introducao-ao-gof/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/28c68b93b7780192ed6f40ab194c4859?s=96&#38;d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96&#38;r=G" medium="image">
			<media:title type="html">André Moreira </media:title>
		</media:content>

		<media:content url="http://portfoliodomourdok.files.wordpress.com/2009/02/designpatternsperiodictir1.png?w=150" medium="image">
			<media:title type="html">The Sacred Elements of the Faith</media:title>
		</media:content>

		<media:content url="http://portfoliodomourdok.files.wordpress.com/2009/02/396px-kent_beck_no_workshop_mapping_xp.jpg?w=99" medium="image">
			<media:title type="html">Mr. Kent</media:title>
		</media:content>

		<media:content url="http://portfoliodomourdok.files.wordpress.com/2009/02/675px-ward_cunningham_at_wikimania_2006.jpg?w=150" medium="image">
			<media:title type="html">Mr. Ward</media:title>
		</media:content>

		<media:content url="http://portfoliodomourdok.files.wordpress.com/2009/02/image_2.png" medium="image">
			<media:title type="html">Design Patterns: Elements of Reusable Object-Oriented Software</media:title>
		</media:content>
	</item>
		<item>
		<title>Padrões de Projeto &#8211; A Origem</title>
		<link>http://portfoliodomourdok.wordpress.com/2009/01/08/padroes-de-projeto-a-origem/</link>
		<comments>http://portfoliodomourdok.wordpress.com/2009/01/08/padroes-de-projeto-a-origem/#comments</comments>
		<pubDate>Thu, 08 Jan 2009 21:45:02 +0000</pubDate>
		<dc:creator>mourdok</dc:creator>
				<category><![CDATA[Patterns]]></category>
		<category><![CDATA[Behavioral Pattern]]></category>
		<category><![CDATA[Creational Patter]]></category>
		<category><![CDATA[design pattern]]></category>
		<category><![CDATA[design patterns]]></category>
		<category><![CDATA[gof design]]></category>
		<category><![CDATA[gof design pattern]]></category>
		<category><![CDATA[gof design patterns]]></category>
		<category><![CDATA[gof java]]></category>
		<category><![CDATA[padrão de projeto]]></category>
		<category><![CDATA[padrões de arquitetura]]></category>
		<category><![CDATA[padrões de projetos]]></category>
		<category><![CDATA[padroes de projeto]]></category>
		<category><![CDATA[pattern gof]]></category>
		<category><![CDATA[patterns gof]]></category>
		<category><![CDATA[Structural Pattern]]></category>
		<category><![CDATA[use a cabeça]]></category>

		<guid isPermaLink="false">http://portfoliodomourdok.wordpress.com/?p=172</guid>
		<description><![CDATA[O título desse post, que tentarei explicar se desdobrará durante vários artigos. Deixarei esclarecido que esse tema será abordado de forma mais pratica possível. Deixando de lado alguns pontos demasiadamente teóricos, para literatura indicada via link, no decorrer de cada post. Logo a minha intenção nessa série de artigos (futuramente) será de detalhar os seguintes [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=portfoliodomourdok.wordpress.com&amp;blog=7583293&amp;post=172&amp;subd=portfoliodomourdok&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p><img class="alignleft size-thumbnail wp-image-454" style="margin-right:10px;margin-left:10px;border:0 none;" title="What's wrong?" src="http://portfoliodomourdok.files.wordpress.com/2009/01/help2.jpg?w=138&#038;h=150" alt="" width="138" height="150" /></p>
<p>O título desse post, que tentarei explicar se desdobrará durante vários artigos. Deixarei esclarecido que esse tema será abordado de forma mais pratica possível. Deixando de lado alguns pontos demasiadamente teóricos, para literatura indicada via link, no decorrer de cada post.</p>
<p>Logo a minha intenção nessa série de artigos (futuramente) será de detalhar os seguintes tópicos, relacionados a Padrões de Projeto: nome do padrão, problema levantado, solução proposta, quando implementar e respectiva conseqüência.</p>
<p><span id="more-172"></span></p>
<h3><span style="color:#000080;">A Origem</span></h3>
<p>Essa discussão é nova? Devo “perder tempo” estudando isso? Então vamos lá!</p>
<div id="attachment_227" class="wp-caption aligncenter" style="width: 330px"><img class="size-full wp-image-227 " style="border:0 none;" title="Christopher Alexander" src="http://portfoliodomourdok.files.wordpress.com/2009/01/christopher_alexander.jpg?w=320&#038;h=240" alt="" width="320" height="240" /><p class="wp-caption-text">Cristopher Alexander</p></div>
<p>Um pouco de história. Padrões de Projeto ou no inglês Design Patterns, teve como precursor o professor austríaco <a href="http://pt.wikipedia.org/wiki/Christopher_Alexander">Cristopher Alexander</a>. Alias a Áustria esta de parabéns, nesse país de algumas <a href="http://pt.wikipedia.org/wiki/Austria#Cultura">cabeças pensantes</a> <img src='http://s0.wp.com/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' />  existiram muitas contribuições para humanidade. Mas, cá entre nós qual foi a contribuição do Cristopher? A do Conceito sobre Padrões de Projeto!</p>
<p>Graças a iniciativa nos anos 70, desse professor emérito, que escreveu livros como: <a href="http://www.amazon.com/Notes-Synthesis-Form-Harvard-Paperbacks/dp/0674627512/ref=sr_11_1?ie=UTF8&amp;qid=1226956220&amp;sr=11-1">Notes on the Synthesis of Form</a>, <a href="http://www.amazon.com/Timeless-Way-Building-Christopher-Alexander/dp/0195024028/ref=sr_11_1?ie=UTF8&amp;qid=1226956283&amp;sr=11-1">The Timeless Way of Building</a> e <a href="http://www.amazon.com/Pattern-Language-Buildings-Construction-Environmental/dp/0195019199/ref=sr_11_1?ie=UTF8&amp;qid=1226956309&amp;sr=11-1">A Pattern Language</a>. Entre outros que podem ser conferidos em livrarias por aí&#8230; O Cristopher mostrou a “nós programadores”, a porta de entrada, de uma maneira interessantíssima de resolver problemas, adotando padrões.</p>
<p>Antes de prosseguirmos, uma pergunta:</p>
<blockquote><p>- Para você o que caracteriza um Padrão de Projeto? (Não vale <a href="http://www.google.com.br/search?hl=pt-BR&amp;q=design+patterns&amp;btnG=Pesquisar&amp;meta=">pedir ajuda do Tio</a>, apenas diga alguma característica que venha a mente) <img src='http://s2.wp.com/wp-includes/images/smilies/icon_razz.gif' alt=':-P' class='wp-smiley' /> </p></blockquote>
<p>Agora vamos lá, voltar aos anos 70 e compreender um pouco sobre essa história. Naquela época se da a entender que o arquiteto Cristopher precisava de uma linguagem padrão, para auxiliar ele e seus colegas de trabalho a projetarem, construírem e repassar esse conhecimento de uma forma que terceiros compreendessem e executassem tais métodos.</p>
<p>Assim podemos acreditar que após muitos projetos de arquitetura entregues, um pleno estudo sobre o que poderia ser e não ser padronizado, foi que Cristopher identificou as seguintes características, que passariam a abordar o conceito sobre Padrões de Projeto, que são:</p>
<h5><span style="color:#000000;">Encapsulamento</span></h5>
<p>Conseguir separar uma solução em partes, tentando isola-las ao máximo. Tornando assim a solução do problema, a mais flexível, de fácil modificação e futuras implementações possíveis.</p>
<p><em>Nota: nada de criar soluções engessadas!</em></p>
<h5>Generalidade</h5>
<p>Tornar que um padrão seja o meio para determinada solução de um problema. Ou até mesmo em caso de uma ocorrência, “desse padrão” não facilitar ou deixar deselegante a solução do problema. Podemos aproveitar a teoria do mesmo para propor uma nova solução e como conseqüência um “novo padrão”.</p>
<h5>Equilíbrio</h5>
<p>Podemos entender por equilíbrio, a utilização do padrão propriamente dito aplicado em um projeto. Ao proceder dessa maneira, deixamos para traz todo dilema que envolve: porque determinada tarefa e mais problemática dessa forma? Será possível melhorar essa lentidão do processo&#8230; Entre outras questões que são comumente levantadas, enquanto o problema não é solucionado. Ou seja, enquanto não encontramos o padrão adequado.</p>
<p><em>Nota: até agora essas características são bem sustentáveis, logo no decorrer das demais, estará mais do que comprovado, que a adoção bem aplicada de padrões é um bom caminho.</em></p>
<h5>Abstração</h5>
<p>Esse termo abstração pode parecer meio complexo. Mas na verdade ele auxilia no simples ponto de extrair ao máximo um problema levantado. Ao em vez de focar no problema por um todo, focamos apenas no essencial, naquilo que dá inicio a problemática. Durante o projeto, conforme surja alguma necessidade é claro, podemos abstrair digamos, um nível a mais a complexidade de determinado “artefato”.</p>
<h5>Abertura</h5>
<p>Tal como falado anteriormente no item Generalidade. Quando Cristopher acrescenta o item Abertura como sendo uma característica em Padrões de Projeto. Nada mais ele esta confirmando, caso seja necessário, no decorrer do caminho depararmos com uma incompletude em determinado padrão, podemos complementa-lo e deixar tal padrão mais detalhado. Não necessariamente construindo um novo padrão, mas sim buscar melhorar e/ou complementar um padrão já existente.</p>
<h5>Combinatoriedade</h5>
<p>E pra finalizar, o austríaco citado até o momento, nada mais quer dizer no item Combinatoriedade, <a href="http://pt.wikipedia.org/wiki/Gestalt">“de que o todo é mais do que a simples soma de suas partes”</a> mencionadas até esse momento. Falando mais tecnicamente, podemos entender que existiram relacionamentos entre os Padrões de Projeto do nível mais baixo com os padrões de nível mais alto. Concluindo assim o conceito sobre quais são as característica envolvidas em Padrões de Projeto.</p>
<p>Então é isso galera. Espero que tenha conseguido transmitir, nesse singelo artigo, um tema que considero importante para “nós”. E assim <a href="http://blog.fragmental.com.br/2008/01/15/quando-eu-crescer-quero-ser-analista-de-sistemas/">ressaltar que nós como programadores, não analista de sistemas</a> e nem tão pouco digitadores, devemos também dedicar um tempo a assuntos como esse discutido aqui.</p>
<p>No próximo artigo falarei sobre o Padrão de Projeto GoF e (tentarei) mostrar os seus respectivos diagramas de classe (ou código mesmo). Afinal de contas UML serve muito bem pra isso. Mas devemos lembrar que GoF não é a única (coletânea) padrão, existem outros como: GRASP Patterns, J2EE Patterns, Testing Patterns, Optimization Coding Patterns, Robustness Coding Patterns, Organizational Coding Patterns e etc&#8230;</p>
<p>E o importante mesmo é saber quando utilizar cada pattern, senão, ao em vez de resolver um problema, acabamos duplicando a problemática do mesmo.</p>
<p> <img src='http://s0.wp.com/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /><br />
Bom é isso caro leitor.</p>
<p>Quem escreveu foi o André Moreira.<br />
Obrigado pela visita e até o próximo post.</p>
<br />Publicado emPatterns Tagged: Behavioral Pattern, Creational Patter, design pattern, design patterns, gof design, gof design pattern, gof design patterns, gof java, padrão de projeto, padrões de arquitetura, padrões de projetos, padroes de projeto, pattern gof, patterns gof, Structural Pattern, use a cabeça <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/portfoliodomourdok.wordpress.com/172/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/portfoliodomourdok.wordpress.com/172/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/portfoliodomourdok.wordpress.com/172/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/portfoliodomourdok.wordpress.com/172/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/portfoliodomourdok.wordpress.com/172/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/portfoliodomourdok.wordpress.com/172/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/portfoliodomourdok.wordpress.com/172/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/portfoliodomourdok.wordpress.com/172/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/portfoliodomourdok.wordpress.com/172/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/portfoliodomourdok.wordpress.com/172/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/portfoliodomourdok.wordpress.com/172/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/portfoliodomourdok.wordpress.com/172/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/portfoliodomourdok.wordpress.com/172/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/portfoliodomourdok.wordpress.com/172/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=portfoliodomourdok.wordpress.com&amp;blog=7583293&amp;post=172&amp;subd=portfoliodomourdok&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://portfoliodomourdok.wordpress.com/2009/01/08/padroes-de-projeto-a-origem/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/28c68b93b7780192ed6f40ab194c4859?s=96&#38;d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96&#38;r=G" medium="image">
			<media:title type="html">André Moreira </media:title>
		</media:content>

		<media:content url="http://portfoliodomourdok.files.wordpress.com/2009/01/help2.jpg?w=138" medium="image">
			<media:title type="html">What's wrong?</media:title>
		</media:content>

		<media:content url="http://portfoliodomourdok.files.wordpress.com/2009/01/christopher_alexander.jpg" medium="image">
			<media:title type="html">Christopher Alexander</media:title>
		</media:content>
	</item>
	</channel>
</rss>
