<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:coop="http://www.google.com/coop/namespace" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">

<channel>
	<title>Blog do Urubatan</title>
	
	<link>http://www.urubatan.com.br</link>
	<description>Desenvolvedor, Palestrante, Escritor, Nerd Assumido e Pai do Marcus :D</description>
	<lastBuildDate>Thu, 19 Aug 2010 20:02:41 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/BlogDoUrubatan" /><feedburner:info uri="blogdourubatan" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><feedburner:emailServiceId>BlogDoUrubatan</feedburner:emailServiceId><feedburner:feedburnerHostname>http://feedburner.google.com</feedburner:feedburnerHostname><item>
		<title>Slides, videos e código da minha palestra no FISL 2010</title>
		<link>http://feedproxy.google.com/~r/BlogDoUrubatan/~3/i9_x8bji4Fo/</link>
		<comments>http://www.urubatan.com.br/slides-videos-e-codigo-da-minha-palestra-no-fisl-2010/#comments</comments>
		<pubDate>Thu, 19 Aug 2010 19:47:17 +0000</pubDate>
		<dc:creator>Urubatan</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[rails]]></category>
		<category><![CDATA[apresentação]]></category>
		<category><![CDATA[bdd]]></category>
		<category><![CDATA[cucumber]]></category>
		<category><![CDATA[fisl]]></category>
		<category><![CDATA[palestra]]></category>

		<guid isPermaLink="false">http://www.urubatan.com.br/?p=1924</guid>
		<description><![CDATA[Bom, este post esta bastante atrasado, mas me lembraram hoje pelo twitter que eu não publiquei por aqui o material da minha palestra do FISL deste ano. O título da palestra era: Transformando os pepinos do cliente no código de testes da sua aplicação com OSS Quase a mesma apresentação que fiz no Agile Brazil [...]<p>Post de: <a href="http://www.urubatan.com.br">Blog do Urubatan</a><br/>
Quer comprar meu livro <a href="http://livro.urubatan.com.br">Desenvolvimento F&aacute;cil e R&aacute;pido de Aplica&ccedil;&otilde;es web</a> com 30% de desconto? &Eacute; s&oacute; acessar o meu <a href="http://www.urubatan.com.br">blog</a> e pegar o c&oacute;digo :D<br/><br/><a href="http://www.urubatan.com.br/slides-videos-e-codigo-da-minha-palestra-no-fisl-2010/">Slides, videos e código da minha palestra no FISL 2010</a></p>
]]></description>
			<content:encoded><![CDATA[<p>Bom, este post esta bastante atrasado, mas me lembraram hoje pelo twitter que eu não publiquei por aqui o material da minha palestra do FISL deste ano.<br />
O título da palestra era:<br />
Transformando os pepinos do cliente no código de testes da sua aplicação com OSS<br />
Quase a mesma apresentação que fiz no <a href="http://www.urubatan.com.br/material-da-minha-palestra-do-agile-brazil-2010/">Agile Brazil 2010</a>, mesmo assunto, exemplos parecidos, mas melhorei um pouco a forma de apresentar, e em vez de tentar escrever código na hora eu utilizei videos para os exemplos <img src='http://www.urubatan.com.br/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /><br />
Quem quiser dar uma olhada nos slides, coloquei eles no <a href="http://www.slideshare.net/urubatan/bdd-cucumber-4809533">SlideShare</a>.</p>
<div style="width:425px" id="__ss_4809533"><strong style="display:block;margin:12px 0 4px"><a href="http://www.slideshare.net/urubatan/bdd-cucumber-4809533" title="pepinos do cliente no código de testes da aplicação com OSS">pepinos do cliente no código de testes da aplicação com OSS</a></strong><object id="__sse4809533" width="425" height="355"><param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=bddcucumber-100721212444-phpapp01&#038;stripped_title=bdd-cucumber-4809533" /><param name="allowFullScreen" value="true"/><param name="allowScriptAccess" value="always"/><embed name="__sse4809533" src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=bddcucumber-100721212444-phpapp01&#038;stripped_title=bdd-cucumber-4809533" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"></embed></object>
<div style="padding:5px 0 12px">View more <a href="http://www.slideshare.net/">presentations</a> from <a href="http://www.slideshare.net/urubatan">Rodrigo Urubatan</a>.</div>
</div>
<p>E os videos coloquei no Vimeo, o com <a href="http://vimeo.com/13524790">exemplo Java aqui</a>, e o com <a href="http://vimeo.com/13523947">exemplo Rails aqui</a>.<br />
<iframe src="http://player.vimeo.com/video/13523947" width="400" height="285" frameborder="0"></iframe>
<p><a href="http://vimeo.com/13523947">FISL 2010 &#8211; Rails Cucumber BDD Sample creation</a> from <a href="http://vimeo.com/urubatan">Rodrigo Urubatan</a> on <a href="http://vimeo.com">Vimeo</a>.</p>
<p>Rails + BDD sample created as a sample to my presentation at Forum Internacional de Software Livre 2010.</p>
<p><iframe src="http://player.vimeo.com/video/13524790" width="400" height="285" frameborder="0"></iframe>
<p><a href="http://vimeo.com/13524790">FISL 2010 &#8211; Java Cucumber BDD Sample creation</a> from <a href="http://vimeo.com/urubatan">Rodrigo Urubatan</a> on <a href="http://vimeo.com">Vimeo</a>.</p>
<p>Java + BDD sample created as a sample to my presentation at Forum Internacional de Software Livre 2010.</p>
<p></p>
<p>Bom, espero que seja útil, se tiverem dúvidas é só deixar um comentário &#8230;</p>
<p>PS.: não tenho o código comigo agora, assim que possível subo pro github e coloco o link para o código aqui <img src='http://www.urubatan.com.br/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </p>
<p>Post de: <a href="http://www.urubatan.com.br">Blog do Urubatan</a><br/>
Quer comprar meu livro <a href="http://livro.urubatan.com.br">Desenvolvimento F&aacute;cil e R&aacute;pido de Aplica&ccedil;&otilde;es web</a> com 30% de desconto? &Eacute; s&oacute; acessar o meu <a href="http://www.urubatan.com.br">blog</a> e pegar o c&oacute;digo :D<br/><br/><a href="http://www.urubatan.com.br/slides-videos-e-codigo-da-minha-palestra-no-fisl-2010/">Slides, videos e código da minha palestra no FISL 2010</a></p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/BlogDoUrubatan?a=i9_x8bji4Fo:i_QABCjFdpc:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/BlogDoUrubatan?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/BlogDoUrubatan?a=i9_x8bji4Fo:i_QABCjFdpc:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/BlogDoUrubatan?i=i9_x8bji4Fo:i_QABCjFdpc:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/BlogDoUrubatan?a=i9_x8bji4Fo:i_QABCjFdpc:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/BlogDoUrubatan?i=i9_x8bji4Fo:i_QABCjFdpc:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/BlogDoUrubatan?a=i9_x8bji4Fo:i_QABCjFdpc:HCBZNhuKwNY"><img src="http://feeds.feedburner.com/~ff/BlogDoUrubatan?d=HCBZNhuKwNY" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/BlogDoUrubatan?a=i9_x8bji4Fo:i_QABCjFdpc:Iu4eqwUi9wI"><img src="http://feeds.feedburner.com/~ff/BlogDoUrubatan?d=Iu4eqwUi9wI" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/BlogDoUrubatan?a=i9_x8bji4Fo:i_QABCjFdpc:BxLlmz8_Wzw"><img src="http://feeds.feedburner.com/~ff/BlogDoUrubatan?d=BxLlmz8_Wzw" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/BlogDoUrubatan/~4/i9_x8bji4Fo" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.urubatan.com.br/slides-videos-e-codigo-da-minha-palestra-no-fisl-2010/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<coop:keyword>Java</coop:keyword><coop:keyword>Ruby</coop:keyword><coop:keyword>rails</coop:keyword><coop:keyword>apresentação</coop:keyword><coop:keyword>bdd</coop:keyword><coop:keyword>cucumber</coop:keyword><coop:keyword>fisl</coop:keyword><coop:keyword>palestra</coop:keyword><feedburner:origLink>http://www.urubatan.com.br/slides-videos-e-codigo-da-minha-palestra-no-fisl-2010/</feedburner:origLink></item>
		<item>
		<title>Algoritmos básicos são importantes, você consegue melhorar este?</title>
		<link>http://feedproxy.google.com/~r/BlogDoUrubatan/~3/2jY_kKBwis8/</link>
		<comments>http://www.urubatan.com.br/algoritmos-basicos-sao-importantes-voce-consegue-melhorar-este/#comments</comments>
		<pubDate>Mon, 05 Jul 2010 16:28:22 +0000</pubDate>
		<dc:creator>Urubatan</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[Trabalho]]></category>
		<category><![CDATA[algoritmo]]></category>
		<category><![CDATA[opinião]]></category>
		<category><![CDATA[programação]]></category>
		<category><![CDATA[teste]]></category>

		<guid isPermaLink="false">http://www.urubatan.com.br/?p=1919</guid>
		<description><![CDATA[Bom, este post é mais minha opinião do que qualquer outra coisa, mas o que motivou a escrita dele foi este post no dzone: Will the real programmers please stand up? automated edition, onde o autor diz que apenas 1 em 20 entrevistados por ele conseguiam resolver de forma satisfatória testes simples como: Escreva em [...]<p>Post de: <a href="http://www.urubatan.com.br">Blog do Urubatan</a><br/>
Quer comprar meu livro <a href="http://livro.urubatan.com.br">Desenvolvimento F&aacute;cil e R&aacute;pido de Aplica&ccedil;&otilde;es web</a> com 30% de desconto? &Eacute; s&oacute; acessar o meu <a href="http://www.urubatan.com.br">blog</a> e pegar o c&oacute;digo :D<br/><br/><a href="http://www.urubatan.com.br/algoritmos-basicos-sao-importantes-voce-consegue-melhorar-este/">Algoritmos básicos são importantes, você consegue melhorar este?</a></p>
]]></description>
			<content:encoded><![CDATA[<p>Bom, este post é mais minha opinião do que qualquer outra coisa, mas o que motivou a escrita dele foi este post no dzone: <a href="http://bit.ly/acRQhR">Will the real programmers please stand up? automated edition</a>, onde o autor diz que apenas 1 em 20 entrevistados por ele conseguiam resolver de forma satisfatória testes simples como:</p>
<blockquote><p>Escreva em C um método que inverta uma lista encadeada.</p></blockquote>
<p>Claro que algumas restrições eram aplicadas, a assinatura do método não deveria ser alterada e a estrutura que armazenaria a lista encadeada também não deveria ser alterada. Elas eram apresentadas como o código abaixo:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
</pre></td><td class="code"><pre class="c" style="font-family:monospace;"><span style="color: #993333;">typedef</span> <span style="color: #993333;">struct</span> nodetype <span style="color: #009900;">&#123;</span>
  <span style="color: #993333;">int</span> value<span style="color: #339933;">;</span>
  <span style="color: #993333;">struct</span> nodetype <span style="color: #339933;">*</span>next<span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span> node<span style="color: #339933;">;</span>
&nbsp;
node<span style="color: #339933;">*</span> reverselist<span style="color: #009900;">&#40;</span>node<span style="color: #339933;">*</span><span style="color: #009900;">&#41;</span></pre></td></tr></table></div>

<p>Tentando automatizar um pouco o processo, ele tentou apresentar o código pronto com um bug, para que o bug fosse encontrado, mas o candidato sempre poderia escolher reescrever o código do zero se seguisse as regras acima.<br />
Bom, olhei o código e achei que a recursividade utilizada estava só piorando o algoritmo, ele precisa de duas iterações para inverter a lista, então eu pensei, por que não escrever uma versão sem recursividade e que faça o processo todo em apenas uma iteração?<br />
Bom, a minha resposta para o problema foi esta que esta abaixo:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
</pre></td><td class="code"><pre class="java" style="font-family:monospace;">	<span style="color: #000000; font-weight: bold;">static</span> <span style="color: #000000; font-weight: bold;">class</span> LinkedItem <span style="color: #009900;">&#123;</span>
		<span style="color: #000066; font-weight: bold;">int</span> value<span style="color: #339933;">;</span>
		LinkedItem next<span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #000000; font-weight: bold;">public</span> LinkedItem<span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">int</span> value<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
			<span style="color: #000000; font-weight: bold;">super</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			<span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">value</span> <span style="color: #339933;">=</span> value<span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000000; font-weight: bold;">static</span> LinkedItem reverseLinkedList<span style="color: #009900;">&#40;</span>LinkedItem currentHead<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		LinkedItem nextHead <span style="color: #339933;">=</span> <span style="color: #000066; font-weight: bold;">null</span>, previousHead <span style="color: #339933;">=</span> <span style="color: #000066; font-weight: bold;">null</span><span style="color: #339933;">;</span>
		<span style="color: #000000; font-weight: bold;">while</span> <span style="color: #009900;">&#40;</span>currentHead <span style="color: #339933;">!=</span> <span style="color: #000066; font-weight: bold;">null</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
			nextHead <span style="color: #339933;">=</span> currentHead<span style="color: #339933;">;</span>
			currentHead <span style="color: #339933;">=</span> nextHead.<span style="color: #006633;">next</span><span style="color: #339933;">;</span>
			nextHead.<span style="color: #006633;">next</span> <span style="color: #339933;">=</span> previousHead<span style="color: #339933;">;</span>
			previousHead <span style="color: #339933;">=</span> nextHead<span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span>
		<span style="color: #000000; font-weight: bold;">return</span> nextHead<span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>Eu escrevi em java, mas não faz diferença pois para o algoritmo que escrevi a unica diferença seria a sintaxe.<br />
Para testar isto escrevi um programa simples que inicializa uma lista encadeada com números de 1 a 10 e imprime a lista antes e depois desta ser invertida. O código esta abaixo, se alguem quiser fazer uma versão melhor deste algoritmo por favor poste a sua resposta nos comentários.</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
</pre></td><td class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">package</span> <span style="color: #006699;">test</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> Main <span style="color: #009900;">&#123;</span>
	<span style="color: #000000; font-weight: bold;">static</span> <span style="color: #000000; font-weight: bold;">class</span> LinkedItem <span style="color: #009900;">&#123;</span>
		<span style="color: #000066; font-weight: bold;">int</span> value<span style="color: #339933;">;</span>
		LinkedItem next<span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #000000; font-weight: bold;">public</span> LinkedItem<span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">int</span> value<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
			<span style="color: #000000; font-weight: bold;">super</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			<span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">value</span> <span style="color: #339933;">=</span> value<span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000000; font-weight: bold;">static</span> LinkedItem reverseLinkedList<span style="color: #009900;">&#40;</span>LinkedItem currentHead<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		LinkedItem nextHead <span style="color: #339933;">=</span> <span style="color: #000066; font-weight: bold;">null</span>, previousHead <span style="color: #339933;">=</span> <span style="color: #000066; font-weight: bold;">null</span><span style="color: #339933;">;</span>
		<span style="color: #000000; font-weight: bold;">while</span> <span style="color: #009900;">&#40;</span>currentHead <span style="color: #339933;">!=</span> <span style="color: #000066; font-weight: bold;">null</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
			nextHead <span style="color: #339933;">=</span> currentHead<span style="color: #339933;">;</span>
			currentHead <span style="color: #339933;">=</span> nextHead.<span style="color: #006633;">next</span><span style="color: #339933;">;</span>
			nextHead.<span style="color: #006633;">next</span> <span style="color: #339933;">=</span> previousHead<span style="color: #339933;">;</span>
			previousHead <span style="color: #339933;">=</span> nextHead<span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span>
		<span style="color: #000000; font-weight: bold;">return</span> nextHead<span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">static</span> <span style="color: #000066; font-weight: bold;">void</span> main<span style="color: #009900;">&#40;</span><span style="color: #003399;">String</span><span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span> args<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		LinkedItem head <span style="color: #339933;">=</span> initializeSampleList<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		printLinkedList<span style="color: #009900;">&#40;</span>head<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		head <span style="color: #339933;">=</span> reverseLinkedList<span style="color: #009900;">&#40;</span>head<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		printLinkedList<span style="color: #009900;">&#40;</span>head<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000000; font-weight: bold;">static</span> LinkedItem initializeSampleList<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		LinkedItem it <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> LinkedItem<span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#41;</span>, head <span style="color: #339933;">=</span> it<span style="color: #339933;">;</span>
		<span style="color: #000000; font-weight: bold;">for</span> <span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">int</span> i <span style="color: #339933;">=</span> <span style="color: #cc66cc;">2</span><span style="color: #339933;">;</span> i <span style="color: #339933;">&lt;</span> <span style="color: #cc66cc;">10</span><span style="color: #339933;">;</span> i<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
			LinkedItem it2 <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> LinkedItem<span style="color: #009900;">&#40;</span>i<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			it.<span style="color: #006633;">next</span> <span style="color: #339933;">=</span> it2<span style="color: #339933;">;</span>
			it <span style="color: #339933;">=</span> it2<span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span>
		<span style="color: #000000; font-weight: bold;">return</span> head<span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000000; font-weight: bold;">static</span> <span style="color: #000066; font-weight: bold;">void</span> printLinkedList<span style="color: #009900;">&#40;</span>LinkedItem it<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">while</span> <span style="color: #009900;">&#40;</span>it <span style="color: #339933;">!=</span> <span style="color: #000066; font-weight: bold;">null</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
			<span style="color: #003399;">System</span>.<span style="color: #006633;">out</span>.<span style="color: #006633;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;%d &quot;</span>, it.<span style="color: #006633;">value</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			it <span style="color: #339933;">=</span> it.<span style="color: #006633;">next</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span>
		<span style="color: #003399;">System</span>.<span style="color: #006633;">out</span>.<span style="color: #006633;">println</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>Eu achei espetacular a idéia deles de criar um site para automatizar este tipo de smoke test para entrevista de emprego de programadores, se o cara não consegue resolver isto deveria estudar um pouco mais antes de querer trabalhar com programação mesmo.<br />
Mas se a idéia for testar a habilidade com algoritmos acredito que o candidato deveria poder escolher em que linguagem implementar, caso contrario, em alguns casos a habilidade com a linguagem estaria sendo testada, e acho que estas duas coisas deveriam ser testadas em separado.</p>
<p>E vocês o que acham sobre isto? Sobre este tipo de testes?<br />
Já fizeram algum teste parecido com este em alguma entrevista de emprego?<br />
E se você é o entrevistador, gostou da idéia deste tipo de teste? Acha util ou desnecessário?<br />
Utiliza alguma técnica alternativa?<br />
Olha o código produzido pelo candidato em projetos open source? </p>
<p>Bom, acho que por enquanto é isto <img src='http://www.urubatan.com.br/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </p>
<p>PS.: me decepcionei com a minha demora para implementar este algoritmo simples, levei uns 10 minutos, quando comecei a escrever achei que seria algo natural e funcionaria de primeira. Isto deve ter sido causado pela facilidade que temos hoje, como um Collections.reverse do java ou um [].reverse do ruby por exemplo. Raramente temos que lidar diretamente com este tipo de algoritmo básico, mas saber implementa-los é extremamente importante, pelo menos na minha opinião <img src='http://www.urubatan.com.br/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </p>
<p>Post de: <a href="http://www.urubatan.com.br">Blog do Urubatan</a><br/>
Quer comprar meu livro <a href="http://livro.urubatan.com.br">Desenvolvimento F&aacute;cil e R&aacute;pido de Aplica&ccedil;&otilde;es web</a> com 30% de desconto? &Eacute; s&oacute; acessar o meu <a href="http://www.urubatan.com.br">blog</a> e pegar o c&oacute;digo :D<br/><br/><a href="http://www.urubatan.com.br/algoritmos-basicos-sao-importantes-voce-consegue-melhorar-este/">Algoritmos básicos são importantes, você consegue melhorar este?</a></p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/BlogDoUrubatan?a=2jY_kKBwis8:FifWhT_cbX8:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/BlogDoUrubatan?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/BlogDoUrubatan?a=2jY_kKBwis8:FifWhT_cbX8:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/BlogDoUrubatan?i=2jY_kKBwis8:FifWhT_cbX8:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/BlogDoUrubatan?a=2jY_kKBwis8:FifWhT_cbX8:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/BlogDoUrubatan?i=2jY_kKBwis8:FifWhT_cbX8:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/BlogDoUrubatan?a=2jY_kKBwis8:FifWhT_cbX8:HCBZNhuKwNY"><img src="http://feeds.feedburner.com/~ff/BlogDoUrubatan?d=HCBZNhuKwNY" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/BlogDoUrubatan?a=2jY_kKBwis8:FifWhT_cbX8:Iu4eqwUi9wI"><img src="http://feeds.feedburner.com/~ff/BlogDoUrubatan?d=Iu4eqwUi9wI" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/BlogDoUrubatan?a=2jY_kKBwis8:FifWhT_cbX8:BxLlmz8_Wzw"><img src="http://feeds.feedburner.com/~ff/BlogDoUrubatan?d=BxLlmz8_Wzw" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/BlogDoUrubatan/~4/2jY_kKBwis8" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.urubatan.com.br/algoritmos-basicos-sao-importantes-voce-consegue-melhorar-este/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		<coop:keyword>Java</coop:keyword><coop:keyword>Ruby</coop:keyword><coop:keyword>Trabalho</coop:keyword><coop:keyword>algoritmo</coop:keyword><coop:keyword>opinião</coop:keyword><coop:keyword>programação</coop:keyword><coop:keyword>teste</coop:keyword><feedburner:origLink>http://www.urubatan.com.br/algoritmos-basicos-sao-importantes-voce-consegue-melhorar-este/</feedburner:origLink></item>
		<item>
		<title>Material da minha palestra do Agile Brazil 2010</title>
		<link>http://feedproxy.google.com/~r/BlogDoUrubatan/~3/CItXJPHW9b0/</link>
		<comments>http://www.urubatan.com.br/material-da-minha-palestra-do-agile-brazil-2010/#comments</comments>
		<pubDate>Sat, 26 Jun 2010 01:51:49 +0000</pubDate>
		<dc:creator>Urubatan</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[Trabalho]]></category>
		<category><![CDATA[rails]]></category>
		<category><![CDATA[.net]]></category>
		<category><![CDATA[2010]]></category>
		<category><![CDATA[agilebrazil]]></category>
		<category><![CDATA[bdd]]></category>
		<category><![CDATA[cucumber]]></category>
		<category><![CDATA[palestra]]></category>
		<category><![CDATA[presentation]]></category>
		<category><![CDATA[test]]></category>

		<guid isPermaLink="false">http://www.urubatan.com.br/?p=1913</guid>
		<description><![CDATA[Para quem não sabe, eu apresentei hoje mais cedo, no Agile Brazil 2010, a palestra &#8220;Transformando os pepinos do cliente no código de testes da aplicação com Cucumber&#8221;. O conteúdo da palestra ficou muito bom na minha opinião, mas a forma como eu apresentei, eu, durante a palestra comecei a achar chato &#8230; Bom, espero [...]<p>Post de: <a href="http://www.urubatan.com.br">Blog do Urubatan</a><br/>
Quer comprar meu livro <a href="http://livro.urubatan.com.br">Desenvolvimento F&aacute;cil e R&aacute;pido de Aplica&ccedil;&otilde;es web</a> com 30% de desconto? &Eacute; s&oacute; acessar o meu <a href="http://www.urubatan.com.br">blog</a> e pegar o c&oacute;digo :D<br/><br/><a href="http://www.urubatan.com.br/material-da-minha-palestra-do-agile-brazil-2010/">Material da minha palestra do Agile Brazil 2010</a></p>
]]></description>
			<content:encoded><![CDATA[<p>Para quem não sabe, eu apresentei hoje mais cedo, no Agile Brazil 2010, a palestra &#8220;Transformando os pepinos do cliente no código de testes da aplicação com Cucumber&#8221;.<br />
O conteúdo da palestra ficou muito bom na minha opinião, mas a forma como eu apresentei, eu, durante a palestra comecei a achar chato &#8230;<br />
Bom, espero que quem assistiu a paletra tenha aproveitado, e vou melhorar a forma de apresentar isto para o FISL, mas como eu sempre faço, o material da paletra esta sendo disponibilizado por aqui!<br />
<a href="http://bit.ly/dbLgBc">Os slides eu coloquei no slideshare</a>:</p>
<div style="width:425px" id="__ss_4617858"><strong style="display:block;margin:12px 0 4px"><a href="http://www.slideshare.net/urubatan/transformando-os-pep" title="Transformando os pepinos do cliente no código de testes da sua aplicação">Transformando os pepinos do cliente no código de testes da sua aplicação</a></strong><object id="__sse4617858" width="425" height="355"><param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=bddcucumber-100625185804-phpapp01&#038;stripped_title=transformando-os-pep" /><param name="allowFullScreen" value="true"/><param name="allowScriptAccess" value="always"/><embed name="__sse4617858" src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=bddcucumber-100625185804-phpapp01&#038;stripped_title=transformando-os-pep" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"></embed></object>
<div style="padding:5px 0 12px">View more <a href="http://www.slideshare.net/">presentations</a> from <a href="http://www.slideshare.net/urubatan">Rodrigo Urubatan</a>.</div>
</div>
<p>Os videos da execução do cucumber estão aqui para quem quiser pegar:<br />
<a href="http://bit.ly/bD3OVc" target="download">Aplicação ASP.NET MVC 2</a> e <a href="http://bit.ly/b53Yqa" target="download">Aplicação Java</a></p>
<p>E para quem quiser pegar o código dos exemplos, os links estão aqui:<br />
<a href="http://bit.ly/aCMggf">Aplicação ASP.NET</a>, <a href="http://bit.ly/9RSEEa">Aplicação Java</a> e <a href="http://bit.ly/bOsq7Y">Aplicação Ruby on Rails</a></p>
<p>A idéia que eu queria passar era que o cucumber pode ser utilizado para testar diversos tipos de aplicação, e acho que isto ficou claro <img src='http://www.urubatan.com.br/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </p>
<p>Espero que este material seja útil, e quem quiser comentar, sugerir, criticar, xingar, &#8230;<br />
Pode usar o campo de comentários aqui do blog para isto.</p>
<p>Post de: <a href="http://www.urubatan.com.br">Blog do Urubatan</a><br/>
Quer comprar meu livro <a href="http://livro.urubatan.com.br">Desenvolvimento F&aacute;cil e R&aacute;pido de Aplica&ccedil;&otilde;es web</a> com 30% de desconto? &Eacute; s&oacute; acessar o meu <a href="http://www.urubatan.com.br">blog</a> e pegar o c&oacute;digo :D<br/><br/><a href="http://www.urubatan.com.br/material-da-minha-palestra-do-agile-brazil-2010/">Material da minha palestra do Agile Brazil 2010</a></p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/BlogDoUrubatan?a=CItXJPHW9b0:V5gV29e-K7s:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/BlogDoUrubatan?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/BlogDoUrubatan?a=CItXJPHW9b0:V5gV29e-K7s:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/BlogDoUrubatan?i=CItXJPHW9b0:V5gV29e-K7s:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/BlogDoUrubatan?a=CItXJPHW9b0:V5gV29e-K7s:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/BlogDoUrubatan?i=CItXJPHW9b0:V5gV29e-K7s:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/BlogDoUrubatan?a=CItXJPHW9b0:V5gV29e-K7s:HCBZNhuKwNY"><img src="http://feeds.feedburner.com/~ff/BlogDoUrubatan?d=HCBZNhuKwNY" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/BlogDoUrubatan?a=CItXJPHW9b0:V5gV29e-K7s:Iu4eqwUi9wI"><img src="http://feeds.feedburner.com/~ff/BlogDoUrubatan?d=Iu4eqwUi9wI" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/BlogDoUrubatan?a=CItXJPHW9b0:V5gV29e-K7s:BxLlmz8_Wzw"><img src="http://feeds.feedburner.com/~ff/BlogDoUrubatan?d=BxLlmz8_Wzw" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/BlogDoUrubatan/~4/CItXJPHW9b0" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.urubatan.com.br/material-da-minha-palestra-do-agile-brazil-2010/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<coop:keyword>Java</coop:keyword><coop:keyword>Ruby</coop:keyword><coop:keyword>Trabalho</coop:keyword><coop:keyword>rails</coop:keyword><coop:keyword>.net</coop:keyword><coop:keyword>2010</coop:keyword><coop:keyword>agilebrazil</coop:keyword><coop:keyword>bdd</coop:keyword><coop:keyword>cucumber</coop:keyword><coop:keyword>palestra</coop:keyword><coop:keyword>presentation</coop:keyword><coop:keyword>test</coop:keyword><feedburner:origLink>http://www.urubatan.com.br/material-da-minha-palestra-do-agile-brazil-2010/</feedburner:origLink></item>
		<item>
		<title>Brincadeirinha com Kanban Board Online</title>
		<link>http://feedproxy.google.com/~r/BlogDoUrubatan/~3/gju-g5IER-g/</link>
		<comments>http://www.urubatan.com.br/brincadeirinha-com-kanban-board-online/#comments</comments>
		<pubDate>Fri, 18 Jun 2010 18:43:58 +0000</pubDate>
		<dc:creator>Urubatan</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[Trabalho]]></category>
		<category><![CDATA[rails]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[kanban]]></category>
		<category><![CDATA[teste]]></category>

		<guid isPermaLink="false">http://www.urubatan.com.br/?p=1901</guid>
		<description><![CDATA[Depois de ter algumas idéias mirabolantes, que acabei deixando de lado, resolvi brincar um pouquinho com javascript e fazer um mini protótipo de  um &#8220;Kanban Board&#8221;, sem usar nenhuma imagem, onde as tarefas fossem parecidas com aqueles alertas tipo &#8220;buble&#8221;, bom, o protótipo ficou beem feinho, mas deu pra tirar uma febre do meu CSS. [...]<p>Post de: <a href="http://www.urubatan.com.br">Blog do Urubatan</a><br/>
Quer comprar meu livro <a href="http://livro.urubatan.com.br">Desenvolvimento F&aacute;cil e R&aacute;pido de Aplica&ccedil;&otilde;es web</a> com 30% de desconto? &Eacute; s&oacute; acessar o meu <a href="http://www.urubatan.com.br">blog</a> e pegar o c&oacute;digo :D<br/><br/><a href="http://www.urubatan.com.br/brincadeirinha-com-kanban-board-online/">Brincadeirinha com Kanban Board Online</a></p>
]]></description>
			<content:encoded><![CDATA[<p>Depois de ter algumas idéias mirabolantes, que acabei deixando de lado, resolvi brincar um pouquinho com javascript e fazer um mini protótipo de  um &#8220;Kanban Board&#8221;, sem usar nenhuma imagem, onde as tarefas fossem parecidas com aqueles alertas tipo &#8220;buble&#8221;, bom, o protótipo ficou beem feinho, mas deu pra tirar uma febre do meu CSS.<br />
Para a parte Javascript usei o Jquery, a idéia básica é o seguinte:<br />
Tenho 3 divs que representam 3 estados que qualquer tarefa pode estar: Backlog, Work In Progress e Done<br />
Estas tem que estar uma ao lado da outra.<br />
Dentro destas, quero ter blocos representando cada tarefa, e preciso conseguir mover estas tarefas entre os estados, para isto o JQuery facilita bastante a nossa vida, adicionei o jquery ui, e tudo o que eu precisei fazer foi o seguinte:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
</pre></td><td class="code"><pre class="html" style="font-family:monospace;">&lt;script src=&quot;http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js&quot;&gt;&lt;/script&gt;
&lt;script src=&quot;http://ajax.googleapis.com/ajax/libs/jqueryui/1.8.2/jquery-ui.min.js&quot;&gt;&lt;/script&gt;
&lt;script&gt;
$(document).ready(function(){
    $(&quot;#backlog,#wip,#done&quot;).sortable({
        connectWith: '.connectedSortable',
        receive: function(event, ui) { 
            /*alert($(ui.item).attr('data-id') + ' -&gt; ' + $(this).attr('id'));*/
            //Do something with the recently dropped item here
        }
    }).disableSelection();
&nbsp;
});
&lt;/script&gt;</pre></td></tr></table></div>

<p>Onde #backlog, #wip e #done são os IDs das divs principais &#8230;<br />
Para posicionar estas divs coloquei elas dentro de um container de ID bublecontainers, e usei o seguinte CSS:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
</pre></td><td class="code"><pre class="css" style="font-family:monospace;">            <span style="color: #cc00cc;">#bublecontainers</span> <span style="color: #00AA00;">&#123;</span>
                <span style="color: #000000; font-weight: bold;">background-color</span><span style="color: #00AA00;">:</span> <span style="color: #993333;">gray</span><span style="color: #00AA00;">;</span>
                <span style="color: #000000; font-weight: bold;">width</span><span style="color: #00AA00;">:</span> <span style="color: #933;">600px</span><span style="color: #00AA00;">;</span>
                <span style="color: #000000; font-weight: bold;">margin</span><span style="color: #00AA00;">:</span> <span style="color: #cc66cc;">0</span> <span style="color: #cc66cc;">0</span> <span style="color: #cc66cc;">0</span> <span style="color: #cc66cc;">0</span><span style="color: #00AA00;">;</span>
                <span style="color: #000000; font-weight: bold;">padding</span><span style="color: #00AA00;">:</span> <span style="color: #cc66cc;">0</span> <span style="color: #cc66cc;">0</span> <span style="color: #cc66cc;">0</span> <span style="color: #cc66cc;">0</span><span style="color: #00AA00;">;</span>
            <span style="color: #00AA00;">&#125;</span>
            <span style="color: #cc00cc;">#backlog</span><span style="color: #00AA00;">,</span> <span style="color: #cc00cc;">#wip</span><span style="color: #00AA00;">,</span> <span style="color: #cc00cc;">#done</span> <span style="color: #00AA00;">&#123;</span>
                <span style="color: #000000; font-weight: bold;">width</span><span style="color: #00AA00;">:</span> <span style="color: #933;">190px</span><span style="color: #00AA00;">;</span>
                <span style="color: #000000; font-weight: bold;">margin-left</span><span style="color: #00AA00;">:</span> <span style="color: #933;">5px</span><span style="color: #00AA00;">;</span>
                <span style="color: #000000; font-weight: bold;">height</span><span style="color: #00AA00;">:</span> <span style="color: #933;">340px</span><span style="color: #00AA00;">;</span>
                <span style="color: #000000; font-weight: bold;">display</span><span style="color: #00AA00;">:</span> inline-<span style="color: #993333;">block</span><span style="color: #00AA00;">;</span>
                <span style="color: #000000; font-weight: bold;">float</span><span style="color: #00AA00;">:</span><span style="color: #000000; font-weight: bold;">left</span><span style="color: #00AA00;">;</span>
                <span style="color: #000000; font-weight: bold;">border</span><span style="color: #00AA00;">:</span> <span style="color: #993333;">solid</span> <span style="color: #933;">1px</span><span style="color: #00AA00;">;</span>
            <span style="color: #00AA00;">&#125;</span></pre></td></tr></table></div>

<p>E agora a parte importante, para fazer as tarefas parecerem bolhas, usei a seguinte estrutura HTML:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
</pre></td><td class="code"><pre class="html" style="font-family:monospace;">&lt;div class=&quot;buble&quot;&gt;
  &lt;div class=&quot;buble-content&quot;&gt;
Texto da task aqui
  &lt;/div&gt;
  &lt;div class=&quot;buble-arrow&quot;&gt;&lt;/div&gt;
&lt;/div&gt;</pre></td></tr></table></div>

<p>E me aproveitei de como as bordas do HTML são montadas via CSS, para transformar isto em uma bolha, só precisei do CSS abaixo:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
</pre></td><td class="code"><pre class="css" style="font-family:monospace;"><span style="color: #6666ff;">.buble-content</span> <span style="color: #00AA00;">&#123;</span>
                <span style="color: #000000; font-weight: bold;">width</span><span style="color: #00AA00;">:</span> <span style="color: #933;"><span style="color: #cc66cc;">100</span>%</span><span style="color: #00AA00;">;</span>
                <span style="color: #000000; font-weight: bold;">top</span><span style="color: #00AA00;">:</span> <span style="color: #cc66cc;">0</span><span style="color: #00AA00;">;</span>
                <span style="color: #000000; font-weight: bold;">margin</span><span style="color: #00AA00;">:</span> <span style="color: #cc66cc;">0</span> <span style="color: #cc66cc;">0</span> <span style="color: #cc66cc;">0</span> <span style="color: #cc66cc;">0</span><span style="color: #00AA00;">;</span>
                <span style="color: #000000; font-weight: bold;">padding</span><span style="color: #00AA00;">:</span> <span style="color: #933;">8px</span> <span style="color: #933;">8px</span> <span style="color: #933;">8px</span> <span style="color: #933;">8px</span><span style="color: #00AA00;">;</span>
                <span style="color: #000000; font-weight: bold;">text-align</span><span style="color: #00AA00;">:</span><span style="color: #993333;">justify</span><span style="color: #00AA00;">;</span>
                <span style="color: #000000; font-weight: bold;">overflow</span><span style="color: #00AA00;">:</span> <span style="color: #993333;">hidden</span><span style="color: #00AA00;">;</span>
                border-radius<span style="color: #00AA00;">:</span><span style="color: #933;">10px</span><span style="color: #00AA00;">;</span>
                -moz-border-radius<span style="color: #00AA00;">:</span><span style="color: #933;">10px</span><span style="color: #00AA00;">;</span>
                -webkit-border-radius<span style="color: #00AA00;">:</span><span style="color: #933;">10px</span><span style="color: #00AA00;">;</span>
                <span style="color: #000000; font-weight: bold;">background-color</span><span style="color: #00AA00;">:</span><span style="color: #cc00cc;">#FFF</span><span style="color: #00AA00;">;</span>
                <span style="color: #000000; font-weight: bold;">border-style</span><span style="color: #00AA00;">:</span> <span style="color: #993333;">outset</span><span style="color: #00AA00;">;</span>
                <span style="color: #000000; font-weight: bold;">text-indent</span><span style="color: #00AA00;">:</span> <span style="color: #933;">10px</span><span style="color: #00AA00;">;</span>
&nbsp;
&nbsp;
            <span style="color: #00AA00;">&#125;</span>
            <span style="color: #6666ff;">.buble</span>
            <span style="color: #00AA00;">&#123;</span>
                <span style="color: #000000; font-weight: bold;">display</span><span style="color: #3333ff;">:inline-</span>block<span style="color: #00AA00;">;</span>
                <span style="color: #000000; font-weight: bold;">width</span><span style="color: #00AA00;">:</span><span style="color: #933;"><span style="color: #cc66cc;">90</span>%</span><span style="color: #00AA00;">;</span>
            <span style="color: #00AA00;">&#125;</span>
&nbsp;
            <span style="color: #6666ff;">.buble-arrow</span>
            <span style="color: #00AA00;">&#123;</span>
                <span style="color: #000000; font-weight: bold;">border-color</span><span style="color: #00AA00;">:</span><span style="color: #cc00cc;">#FFF</span> <span style="color: #993333;">transparent</span> <span style="color: #993333;">transparent</span> <span style="color: #993333;">transparent</span><span style="color: #00AA00;">;</span>
                <span style="color: #000000; font-weight: bold;">border-style</span><span style="color: #00AA00;">:</span><span style="color: #993333;">solid</span><span style="color: #00AA00;">;</span>
                <span style="color: #000000; font-weight: bold;">border-width</span><span style="color: #00AA00;">:</span><span style="color: #933;">17px</span><span style="color: #00AA00;">;</span>
                <span style="color: #000000; font-weight: bold;">margin</span><span style="color: #00AA00;">:</span> -<span style="color: #cc66cc;">4</span> <span style="color: #cc66cc;">0</span> <span style="color: #cc66cc;">0</span> <span style="color: #cc66cc;">0</span><span style="color: #00AA00;">;</span>
                <span style="color: #000000; font-weight: bold;">height</span><span style="color: #00AA00;">:</span><span style="color: #cc66cc;">0</span><span style="color: #00AA00;">;</span>
                <span style="color: #000000; font-weight: bold;">width</span><span style="color: #00AA00;">:</span><span style="color: #cc66cc;">0</span><span style="color: #00AA00;">;</span>
                <span style="color: #000000; font-weight: bold;">position</span><span style="color: #00AA00;">:</span> <span style="color: #993333;">relative</span><span style="color: #00AA00;">;</span>
                <span style="color: #000000; font-weight: bold;">left</span><span style="color: #00AA00;">:</span> <span style="color: #933;"><span style="color: #cc66cc;">30</span>%</span><span style="color: #00AA00;">;</span>
            <span style="color: #00AA00;">&#125;</span></pre></td></tr></table></div>

<p>As bordas arredondadas só vão aparecer em browsers mais modernos que tenham algum suporte a CSS3 rounded corners.</p>
<p>O experimento até que foi divertido, mas o código tem diversas falhas ainda, serviu para brincar um pouco <img src='http://www.urubatan.com.br/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </p>
<p>E o resultado vocês podem ver nesta coisa horrenda aqui de baixo <img src='http://www.urubatan.com.br/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' />  (deem uma folga, fiz isto em 20 minutos  ais ou menos só pra brincar e ver se a minha idéia era viável <img src='http://www.urubatan.com.br/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' />  )<br />
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"></script><br />
<script src="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8.2/jquery-ui.min.js"></script></p>
<style>
#bublecontainers {background-color: gray;width: 600px;margin: 0 0 0 0;padding: 0 0 0 0;}
.buble-content {width: 100%;top: 0;margin: 0 0 0 0;padding: 8px 8px 8px 8px;text-align:justify;overflow: hidden;border-radius:10px;-moz-border-radius:10px;-webkit-border-radius:10px;background-color:#FFF;border-style: outset;text-indent: 10px;}
.buble{display:inline-block;width:90%;}
.buble-arrow{border-color:#FFF transparent transparent transparent;border-style:solid;border-width:17px;margin: -4 0 0 0;height:0;width:0;position: relative;left: 30%;}
#backlog, #wip, #done {width: 190px;margin-left: 5px;height: 340px;display: inline-block;float:left;border: solid 1px;}
#bltitle, #wiptitle, #donetitle {height: 15px;text-align: center;width: 190px;display: inline-block;font-size: 20;font-height: bold;}
        </style>
<p>        <script>
            $(document).ready(function(){$("#backlog,#wip,#done").sortable({connectWith: '.connectedSortable'}).disableSelection();});
        </script></p>
<div id="bublecontainers">
<div id="bltitle">Back Log</div>
<div id="wiptitle">Work In Progress</div>
<div id="donetitle">Done</div>
<div id="backlog" class="connectedSortable">
<div class="buble" data-id="buble1">
<div class="buble-content">
                        Create a virtual Kanban Board
                    </div>
<div class="buble-arrow"></div>
</p></div>
<div class="buble" data-id="buble2">
<div class="buble-content">
                        Make this VKB usable
                    </div>
<div class="buble-arrow"></div>
</p></div>
<div class="buble" data-id="buble2">
<div class="buble-content">
                        write a blog post about it
                    </div>
<div class="buble-arrow"></div>
</p></div>
<div class="buble" data-id="buble2">
<div class="buble-content">
                        make it using no images, just CSS
                    </div>
<div class="buble-arrow"></div>
</p></div>
</p></div>
<div id="wip" class="connectedSortable">
            </div>
<div id="done" class="connectedSortable">
            </div>
<div style="clear:both"></div>
</p></div>
<p>Se quiserem o código completo, segue abaixo:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
</pre></td><td class="code"><pre class="html" style="font-family:monospace;">&lt;html&gt;
    &lt;head&gt;
        &lt;script src=&quot;http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js&quot;&gt;&lt;/script&gt;
        &lt;script src=&quot;http://ajax.googleapis.com/ajax/libs/jqueryui/1.8.2/jquery-ui.min.js&quot;&gt;&lt;/script&gt;
        &lt;style&gt;
            #bublecontainers {
                background-color: gray;
                width: 600px;
                margin: 0 0 0 0;
                padding: 0 0 0 0;
            }
            .buble-content {
                width: 100%;
                top: 0;
                margin: 0 0 0 0;
                padding: 8px 8px 8px 8px;
                text-align:justify;
                overflow: hidden;
                border-radius:10px;
                -moz-border-radius:10px;
                -webkit-border-radius:10px;
                background-color:#FFF;
                border-style: outset;
                text-indent: 10px;
&nbsp;
&nbsp;
            }
            .buble
            {
                display:inline-block;
                width:90%;
            }
&nbsp;
            .buble-arrow
            {
                border-color:#FFF transparent transparent transparent;
                border-style:solid;
                border-width:17px;
                margin: -4 0 0 0;
                height:0;
                width:0;
                position: relative;
                left: 30%;
            }
            #backlog, #wip, #done {
                width: 190px;
                margin-left: 5px;
                height: 340px;
                display: inline-block;
                float:left;
                border: solid 1px;
            }
            #bltitle, #wiptitle, #donetitle {
                height: 15px;
                text-align: center;
                width: 190px;
                display: inline-block;
                font-size: 20;
                font-height: bold;
            }
        &lt;/style&gt;
        &lt;script&gt;
            $(document).ready(function(){
                $(&quot;#backlog,#wip,#done&quot;).sortable({
                    connectWith: '.connectedSortable',
                    receive: function(event, ui) { 
                        /*alert($(ui.item).attr('data-id') + ' -&gt; ' + $(this).attr('id'));*/
                        //Do something with the recently dropped item here
                    }
                }).disableSelection();
&nbsp;
            });
        &lt;/script&gt;
    &lt;/head&gt;
    &lt;body&gt;
        &lt;div id=&quot;bublecontainers&quot;&gt;
            &lt;div id=&quot;bltitle&quot;&gt;Back Log&lt;/div&gt;
            &lt;div id=&quot;wiptitle&quot;&gt;Work In Progress&lt;/div&gt;
            &lt;div id=&quot;donetitle&quot;&gt;Done&lt;/div&gt;
            &lt;div id=&quot;backlog&quot; class=&quot;connectedSortable&quot;&gt;
                &lt;div class=&quot;buble&quot; data-id=&quot;buble1&quot;&gt;
                    &lt;div class=&quot;buble-content&quot;&gt;
                        Create a virtual Kanban Board
                    &lt;/div&gt;
                    &lt;div class=&quot;buble-arrow&quot;&gt;&lt;/div&gt;
                &lt;/div&gt;
                &lt;div class=&quot;buble&quot; data-id=&quot;buble2&quot;&gt;
                    &lt;div class=&quot;buble-content&quot;&gt;
                        Make this VKB usable
                    &lt;/div&gt;
                    &lt;div class=&quot;buble-arrow&quot;&gt;&lt;/div&gt;
                &lt;/div&gt;
                &lt;div class=&quot;buble&quot; data-id=&quot;buble2&quot;&gt;
                    &lt;div class=&quot;buble-content&quot;&gt;
                        write a blog post about it
                    &lt;/div&gt;
                    &lt;div class=&quot;buble-arrow&quot;&gt;&lt;/div&gt;
                &lt;/div&gt;
                &lt;div class=&quot;buble&quot; data-id=&quot;buble2&quot;&gt;
                    &lt;div class=&quot;buble-content&quot;&gt;
                        make it using no images, just CSS
                    &lt;/div&gt;
                    &lt;div class=&quot;buble-arrow&quot;&gt;&lt;/div&gt;
                &lt;/div&gt;
            &lt;/div&gt;
            &lt;div id=&quot;wip&quot; class=&quot;connectedSortable&quot;&gt;
            &lt;/div&gt;
            &lt;div id=&quot;done&quot; class=&quot;connectedSortable&quot;&gt;
            &lt;/div&gt;
            &lt;div style=&quot;clear:both&quot;&gt;&lt;/div&gt;
        &lt;/div&gt;
    &lt;/body&gt;
&lt;/html&gt;</pre></td></tr></table></div>

<p>Post de: <a href="http://www.urubatan.com.br">Blog do Urubatan</a><br/>
Quer comprar meu livro <a href="http://livro.urubatan.com.br">Desenvolvimento F&aacute;cil e R&aacute;pido de Aplica&ccedil;&otilde;es web</a> com 30% de desconto? &Eacute; s&oacute; acessar o meu <a href="http://www.urubatan.com.br">blog</a> e pegar o c&oacute;digo :D<br/><br/><a href="http://www.urubatan.com.br/brincadeirinha-com-kanban-board-online/">Brincadeirinha com Kanban Board Online</a></p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/BlogDoUrubatan?a=gju-g5IER-g:1sXIBNqoHtc:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/BlogDoUrubatan?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/BlogDoUrubatan?a=gju-g5IER-g:1sXIBNqoHtc:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/BlogDoUrubatan?i=gju-g5IER-g:1sXIBNqoHtc:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/BlogDoUrubatan?a=gju-g5IER-g:1sXIBNqoHtc:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/BlogDoUrubatan?i=gju-g5IER-g:1sXIBNqoHtc:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/BlogDoUrubatan?a=gju-g5IER-g:1sXIBNqoHtc:HCBZNhuKwNY"><img src="http://feeds.feedburner.com/~ff/BlogDoUrubatan?d=HCBZNhuKwNY" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/BlogDoUrubatan?a=gju-g5IER-g:1sXIBNqoHtc:Iu4eqwUi9wI"><img src="http://feeds.feedburner.com/~ff/BlogDoUrubatan?d=Iu4eqwUi9wI" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/BlogDoUrubatan?a=gju-g5IER-g:1sXIBNqoHtc:BxLlmz8_Wzw"><img src="http://feeds.feedburner.com/~ff/BlogDoUrubatan?d=BxLlmz8_Wzw" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/BlogDoUrubatan/~4/gju-g5IER-g" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.urubatan.com.br/brincadeirinha-com-kanban-board-online/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<coop:keyword>Java</coop:keyword><coop:keyword>Ruby</coop:keyword><coop:keyword>Trabalho</coop:keyword><coop:keyword>rails</coop:keyword><coop:keyword>javascript</coop:keyword><coop:keyword>kanban</coop:keyword><coop:keyword>teste</coop:keyword><feedburner:origLink>http://www.urubatan.com.br/brincadeirinha-com-kanban-board-online/</feedburner:origLink></item>
		<item>
		<title>Agendamento de tarefas muito fácil com com Ruby on Rails</title>
		<link>http://feedproxy.google.com/~r/BlogDoUrubatan/~3/voVqjMV1vLk/</link>
		<comments>http://www.urubatan.com.br/agendamento-de-tarefas-muito-facil-com-com-ruby-on-rails/#comments</comments>
		<pubDate>Wed, 19 May 2010 20:52:54 +0000</pubDate>
		<dc:creator>Urubatan</dc:creator>
				<category><![CDATA[Artigos]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[rails]]></category>
		<category><![CDATA[agendamento]]></category>
		<category><![CDATA[dicas]]></category>
		<category><![CDATA[scheduler]]></category>

		<guid isPermaLink="false">http://www.urubatan.com.br/?p=1858</guid>
		<description><![CDATA[Em um projeto pequeno, que precisava rodar em um desktop, eu precisei de um agendador de tarefas, o sistema precisava rodar em windows, linux ou mac, então utilizar o Cron para isto não era uma opção, e eu precisava de algo semelhante ao Cron, rodar algum código a cada X tempo não era o suficiente, [...]<p>Post de: <a href="http://www.urubatan.com.br">Blog do Urubatan</a><br/>
Quer comprar meu livro <a href="http://livro.urubatan.com.br">Desenvolvimento F&aacute;cil e R&aacute;pido de Aplica&ccedil;&otilde;es web</a> com 30% de desconto? &Eacute; s&oacute; acessar o meu <a href="http://www.urubatan.com.br">blog</a> e pegar o c&oacute;digo :D<br/><br/><a href="http://www.urubatan.com.br/agendamento-de-tarefas-muito-facil-com-com-ruby-on-rails/">Agendamento de tarefas muito fácil com com Ruby on Rails</a></p>
]]></description>
			<content:encoded><![CDATA[<p>Em um projeto pequeno, que precisava rodar em um desktop, eu precisei de um agendador de tarefas, o sistema precisava rodar em windows, linux ou mac, então utilizar o Cron para isto não era uma opção, e eu precisava de algo semelhante ao Cron, rodar algum código a cada X tempo não era o suficiente, ou pelo menos tornaria a minha vida muito mais difícil.</p>
<p>Eu também não queria ter que iniciar um processo separado da aplicação para cuidar disto pois eram tarefas simples, e depois de algumas pesquisas, encontrei o<a href="http://github.com/jmettraux/rufus-scheduler"> Rufus-Scheduler</a> que resolve o problema que eu tinha, então resolvi escrever este post para que eu lembre dele caso precise novamente.</p>
<p>Sempre lembrando que aqui não serão mostrados todos do Rufus-Scheduler, apenas uma forma simples de usa-lo, se tiver dúvidas deixe um comentário que farei o melhor para esclarece-las.</p>
<p>Este exemplo vai começar com uma aplicação simples, um scaffold de uma entidade de nome SimpleTask com os seguintes parâmetros:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">rails generate scaffold SampleTask name:string cron:string <span style="color: #7a0874; font-weight: bold;">times</span>:integer <span style="color: #000000; font-weight: bold;">done</span>:boolean job_id:string
rake db:migrate</pre></div></div>

<p>A premissa para este exemplo é a seguinte:<br />
Quando o sistema for iniciado as tarefas ainda não completas tem que ser agendadas novamente, e toda vez que eu criar uma tarefa nova esta tem que ser agendada automaticamente.</p>
<h2>Então vamos a implementação com o Rufus-Scheduler.</h2>
<ul>
<li> Apagar o arquivo public/index.html</li>
<li> No arquivo routes.rb adicionar a linha &#8216;root :to =&gt; &#8220;sample_tasks#index&#8221;&#8216;</li>
<li> No Gemfile adicionar a linha &#8216;gem &#8220;rufus-scheduler&#8221;&#8216;</li>
<li>Criar um arquivo config/initializers/scheduler_initialization.rb com a seguinte linha: MySampleScheduler.update_schedules</li>
</ul>
<p>No model criado adicionar o seguinte código:</p>

<div class="wp_syntax"><div class="code"><pre class="rails" style="font-family:monospace;"><span style="color:#9966CC; font-weight:bold;">class</span> SampleTask <span style="color:#006600; font-weight:bold;">&lt;</span> <span style="color:#6666ff; font-weight:bold;">ActiveRecord::Base</span>
	<span style="color:#5A0A0A; font-weight:bold;">after_create</span> <span style="color:#ff3333; font-weight:bold;">:schedule_me</span>
	after_destroy <span style="color:#ff3333; font-weight:bold;">:unschedule_me</span>
&nbsp;
	<span style="color:#9966CC; font-weight:bold;">def</span> schedule_me
		MySampleScheduler.<span style="color:#9900CC;">schedule</span> read_attribute<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#ff3333; font-weight:bold;">:id</span><span style="color:#006600; font-weight:bold;">&#41;</span>
	<span style="color:#9966CC; font-weight:bold;">end</span>
	<span style="color:#9966CC; font-weight:bold;">def</span> unschedule_me
		MySampleScheduler.<span style="color:#9900CC;">unschedule</span> read_attribute<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#ff3333; font-weight:bold;">:job_id</span><span style="color:#006600; font-weight:bold;">&#41;</span>
	<span style="color:#9966CC; font-weight:bold;">end</span>
<span style="color:#9966CC; font-weight:bold;">end</span></pre></div></div>

<p>Criar o arquivo lib/my_sample_scheduler.rb com o seguinte conteúdo:</p>

<div class="wp_syntax"><div class="code"><pre class="rails" style="font-family:monospace;"><span style="color:#9966CC; font-weight:bold;">class</span> MySampleScheduler
	@@scheduler = <span style="color:#6666ff; font-weight:bold;">Rufus::Scheduler::PlainScheduler</span>.<span style="color:#9900CC;">start_new</span>
	<span style="color:#9966CC; font-weight:bold;">def</span> <span style="color:#0000FF; font-weight:bold;">self</span>.<span style="color:#9900CC;">update_schedules</span>
		@@scheduler.<span style="color:#9966CC; font-weight:bold;">in</span> <span style="color:#996600;">'1m'</span> <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#008000; font-style:italic;">#delay initialization because of problems acessing rails models during rails initialization</span>
			jobs = @@scheduler.<span style="color:#9900CC;">cron_jobs</span>
			tasks = SampleTask.<span style="color:#9900CC;">all</span>
			tasks.<span style="color:#5A0A0A; font-weight:bold;">each</span> <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span>task<span style="color:#006600; font-weight:bold;">|</span>
				job = jobs<span style="color:#006600; font-weight:bold;">&#91;</span>task.<span style="color:#9900CC;">job_id</span><span style="color:#006600; font-weight:bold;">&#93;</span> <span style="color:#9966CC; font-weight:bold;">if</span> task.<span style="color:#9900CC;">job_id</span>
				job.<span style="color:#9900CC;">unschedule</span> <span style="color:#9966CC; font-weight:bold;">if</span> job <span style="color:#006600; font-weight:bold;">&amp;&amp;</span> <span style="color:#006600; font-weight:bold;">&#40;</span>task.<span style="color:#9900CC;">done</span> <span style="color:#006600; font-weight:bold;">||</span> job.<span style="color:#9900CC;">cron_line</span>!=task.<span style="color:#9900CC;">cron</span><span style="color:#006600; font-weight:bold;">&#41;</span>
				<span style="color:#9966CC; font-weight:bold;">if</span> !task.<span style="color:#9900CC;">done</span>
					schedule<span style="color:#006600; font-weight:bold;">&#40;</span>task<span style="color:#006600; font-weight:bold;">&#41;</span>
				<span style="color:#9966CC; font-weight:bold;">end</span>
			<span style="color:#9966CC; font-weight:bold;">end</span>
		<span style="color:#9966CC; font-weight:bold;">end</span>
	<span style="color:#9966CC; font-weight:bold;">end</span>
	<span style="color:#9966CC; font-weight:bold;">def</span> <span style="color:#0000FF; font-weight:bold;">self</span>.<span style="color:#9900CC;">unschedule</span><span style="color:#006600; font-weight:bold;">&#40;</span>job_id<span style="color:#006600; font-weight:bold;">&#41;</span>
		@@scheduler.<span style="color:#9900CC;">unschedule</span><span style="color:#006600; font-weight:bold;">&#40;</span>job_id<span style="color:#006600; font-weight:bold;">&#41;</span>
	<span style="color:#9966CC; font-weight:bold;">end</span>
	<span style="color:#9966CC; font-weight:bold;">def</span> <span style="color:#0000FF; font-weight:bold;">self</span>.<span style="color:#9900CC;">schedule</span><span style="color:#006600; font-weight:bold;">&#40;</span>task_id<span style="color:#006600; font-weight:bold;">&#41;</span>
		task = SampleTask.<span style="color:#9900CC;">find</span> task_id
		job = @@scheduler.<span style="color:#9900CC;">cron</span> task.<span style="color:#9900CC;">cron</span> <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span>j<span style="color:#006600; font-weight:bold;">|</span>
			task = SampleTask.<span style="color:#9900CC;">find</span> task_id
			<span style="color:#9966CC; font-weight:bold;">if</span> task
				<span style="color:#CC0066; font-weight:bold;">puts</span> <span style="color:#996600;">&quot;#{task.name} executing at #{Time.now} ---- #{task.times}&quot;</span>
				task.<span style="color:#9900CC;">times</span> = task.<span style="color:#9900CC;">times</span> <span style="color:#006600; font-weight:bold;">-</span> <span style="color:#006666;">1</span>
				task.<span style="color:#9900CC;">done</span> = task.<span style="color:#9900CC;">times</span>==<span style="color:#006666;">0</span>
				task.<span style="color:#5A0A0A; font-weight:bold;">save</span>
				unschedule task.<span style="color:#9900CC;">job_id</span> <span style="color:#9966CC; font-weight:bold;">if</span> task.<span style="color:#9900CC;">done</span>
			<span style="color:#9966CC; font-weight:bold;">else</span>
				<span style="color:#CC0066; font-weight:bold;">puts</span> <span style="color:#996600;">&quot;Task deleted #{task_id}&quot;</span>
				unschedule j.<span style="color:#9900CC;">job_id</span>
			<span style="color:#9966CC; font-weight:bold;">end</span>
		<span style="color:#9966CC; font-weight:bold;">end</span>
		task.<span style="color:#9900CC;">job_id</span> = job.<span style="color:#9900CC;">job_id</span>
		task.<span style="color:#5A0A0A; font-weight:bold;">save</span>
	<span style="color:#9966CC; font-weight:bold;">end</span>
<span style="color:#9966CC; font-weight:bold;">end</span></pre></div></div>

<p>Rodar a aplicação e já deve ser possível cadastrar tarefas.<br />
Quando a aplicação for finalizada e novamente inicializada, as tarefas pendentes terão um delay de 1 minuto para re-iniciarem, isto foi necessário porque <strong>se acessarmos os models diretamente durante a inicialização do rails, muitas coisas ruins podem acontecer.</strong></p>
<p>Não se esqueça que para este exemplo funcionar você precisa ter o <a href="http://github.com/jmettraux/rufus-scheduler">Rufus-Scheduler</a> instalado. Se você seguiu todos os passos, um &#8220;bundle install&#8221; do diretório do projeto deve resolver o problema.</p>
<p>Se quiser o código da aplicação que eu escrevi, ele esta disponível neste endereço:<a href="http://github.com/urubatan/rails_schedule_samples">http://github.com/urubatan/rails_schedule_samples</a></p>
<p>Se você já usa o GIT pode baixar o código com o comando: <em><strong>git clone git://github.com/urubatan/rails_schedule_samples.git</strong></em></p>
<p>Post de: <a href="http://www.urubatan.com.br">Blog do Urubatan</a><br/>
Quer comprar meu livro <a href="http://livro.urubatan.com.br">Desenvolvimento F&aacute;cil e R&aacute;pido de Aplica&ccedil;&otilde;es web</a> com 30% de desconto? &Eacute; s&oacute; acessar o meu <a href="http://www.urubatan.com.br">blog</a> e pegar o c&oacute;digo :D<br/><br/><a href="http://www.urubatan.com.br/agendamento-de-tarefas-muito-facil-com-com-ruby-on-rails/">Agendamento de tarefas muito fácil com com Ruby on Rails</a></p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/BlogDoUrubatan?a=voVqjMV1vLk:oAMihNpb5kM:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/BlogDoUrubatan?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/BlogDoUrubatan?a=voVqjMV1vLk:oAMihNpb5kM:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/BlogDoUrubatan?i=voVqjMV1vLk:oAMihNpb5kM:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/BlogDoUrubatan?a=voVqjMV1vLk:oAMihNpb5kM:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/BlogDoUrubatan?i=voVqjMV1vLk:oAMihNpb5kM:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/BlogDoUrubatan?a=voVqjMV1vLk:oAMihNpb5kM:HCBZNhuKwNY"><img src="http://feeds.feedburner.com/~ff/BlogDoUrubatan?d=HCBZNhuKwNY" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/BlogDoUrubatan?a=voVqjMV1vLk:oAMihNpb5kM:Iu4eqwUi9wI"><img src="http://feeds.feedburner.com/~ff/BlogDoUrubatan?d=Iu4eqwUi9wI" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/BlogDoUrubatan?a=voVqjMV1vLk:oAMihNpb5kM:BxLlmz8_Wzw"><img src="http://feeds.feedburner.com/~ff/BlogDoUrubatan?d=BxLlmz8_Wzw" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/BlogDoUrubatan/~4/voVqjMV1vLk" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.urubatan.com.br/agendamento-de-tarefas-muito-facil-com-com-ruby-on-rails/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<coop:keyword>Artigos</coop:keyword><coop:keyword>Ruby</coop:keyword><coop:keyword>rails</coop:keyword><coop:keyword>agendamento</coop:keyword><coop:keyword>dicas</coop:keyword><coop:keyword>scheduler</coop:keyword><feedburner:origLink>http://www.urubatan.com.br/agendamento-de-tarefas-muito-facil-com-com-ruby-on-rails/</feedburner:origLink></item>
		<item>
		<title>HTTP e URL – Dois ilustres pouco conhecidos</title>
		<link>http://feedproxy.google.com/~r/BlogDoUrubatan/~3/GUroz924RBQ/</link>
		<comments>http://www.urubatan.com.br/http-e-url-dois-ilustres-pouco-conhecidos/#comments</comments>
		<pubDate>Wed, 19 May 2010 02:33:08 +0000</pubDate>
		<dc:creator>Urubatan</dc:creator>
				<category><![CDATA[Artigos]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[Trabalho]]></category>
		<category><![CDATA[rails]]></category>
		<category><![CDATA[basico]]></category>
		<category><![CDATA[http]]></category>
		<category><![CDATA[iniciante]]></category>
		<category><![CDATA[uri]]></category>
		<category><![CDATA[url]]></category>

		<guid isPermaLink="false">http://www.urubatan.com.br/?p=1883</guid>
		<description><![CDATA[Este post foi extraido de uma apostila de um curso que ministrei em 2007, eu queria passar este texto para um colega novo do trabalho e não tinha o texto disponível, então resolvi publicar isto aqui no blog que vai ser útil para mim e pode ajudar mais alguem também Para que seja possível acessar [...]<p>Post de: <a href="http://www.urubatan.com.br">Blog do Urubatan</a><br/>
Quer comprar meu livro <a href="http://livro.urubatan.com.br">Desenvolvimento F&aacute;cil e R&aacute;pido de Aplica&ccedil;&otilde;es web</a> com 30% de desconto? &Eacute; s&oacute; acessar o meu <a href="http://www.urubatan.com.br">blog</a> e pegar o c&oacute;digo :D<br/><br/><a href="http://www.urubatan.com.br/http-e-url-dois-ilustres-pouco-conhecidos/">HTTP e URL &#8211; Dois ilustres pouco conhecidos</a></p>
]]></description>
			<content:encoded><![CDATA[<p>Este post foi extraido de uma apostila de um curso que ministrei em 2007, eu queria passar este texto para um colega novo do trabalho e não tinha o texto disponível, então resolvi publicar isto aqui no blog que vai ser útil para mim e pode ajudar mais alguem também <img src='http://www.urubatan.com.br/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </p>
<hr />Para que seja possível acessar qualquer página na internet, alem de outros recursos, como FTP, SSH e diversos outros serviços, foi definido um padrão de endereçamento chamado URL (<em>Uniform Resource Locator</em>), que possui o seguinte formato:</p>
<p>PROTOCOLO://[USUARIO[:SENHA]@]ENDERECO_SERVIDOR/CAMINHO_NO_SERVIDOR?parametro=valor&amp;outro_parametro=outro_valor#ancoraNaPagina</p>
<p>Por exemplo:</p>
<p>http://www.google.com/search?q=ruby+on+rails</p>
<p>onde:</p>
<ul>
<li>http é o protocolo</li>
<li>www.google.com é o endereço do <em>host</em></li>
<li>/search é o caminho dentro do servidor</li>
<li>q=ruby+on+rails é o parâmetro de nome “q” com o valor “ruby on rails”</li>
</ul>
<p>Como uma URL não pode conter espaços os espaços são substituídos pelo sinal “+”, isto se chama codificar o parâmetro.</p>
<p>Como uma URL não aceita nenhum caractere com código <a href="http://pt.wikipedia.org/wiki/Ascii">ASCII</a> maior que 127, qualquer caractere nesta categoria precisa ser codificado. Esta codificação consiste em substituir os caracteres por um “%” mais 2 dígitos numéricos representando o código ASCII em hexadecimal do caractere desejado, como na tabela a baixo:</p>
<table border="1" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td>Caractere</td>
<td>Código   Hexadecimal</td>
</tr>
<tr>
<td>$</td>
<td>24</td>
</tr>
<tr>
<td>&amp;</td>
<td>26</td>
</tr>
<tr>
<td>+</td>
<td>2B</td>
</tr>
<tr>
<td>,</td>
<td>2C</td>
</tr>
<tr>
<td>/</td>
<td>2F</td>
</tr>
<tr>
<td>:</td>
<td>3A</td>
</tr>
<tr>
<td>;</td>
<td>3B</td>
</tr>
<tr>
<td>=</td>
<td>3D</td>
</tr>
<tr>
<td>?</td>
<td>3F</td>
</tr>
<tr>
<td>@</td>
<td>40</td>
</tr>
<tr>
<td>Espaço</td>
<td>20</td>
</tr>
<tr>
<td>“</td>
<td>22</td>
</tr>
<tr>
<td>&lt;</td>
<td>3C</td>
</tr>
<tr>
<td>&gt;</td>
<td>3E</td>
</tr>
<tr>
<td>#</td>
<td>23</td>
</tr>
<tr>
<td>%</td>
<td>25</td>
</tr>
<tr>
<td>{</td>
<td>7B</td>
</tr>
<tr>
<td>}</td>
<td>7D</td>
</tr>
<tr>
<td>|</td>
<td>7C</td>
</tr>
<tr>
<td>\</td>
<td>5C</td>
</tr>
<tr>
<td>^</td>
<td>5E</td>
</tr>
<tr>
<td>~</td>
<td>7E</td>
</tr>
<tr>
<td>[</td>
<td>5B</td>
</tr>
<tr>
<td>]</td>
<td>5D</td>
</tr>
<tr>
<td>`</td>
<td>60</td>
</tr>
</tbody>
</table>
<p>Alguns destes caracteres são aceitáveis em uma URL, mas em algumas situações precisam ser codificados, como por exemplo o # que pode ser utilizado no final de uma URL para indicar ao <em>browser</em> qual parte da página mostrar, quando não for utilizado para este fim, deve ser codificado para evitar confusões.</p>
<h3>Cabeçalhos HTTP</h3>
<p>Cabeçalhos HTTP são uma forma de passar parâmetros extras, além da URL do <em>browser </em>para o servidor. Normalmente, estes parâmetros são utilizados para informar ao servidor as capacidades do <em>browser</em> e preferências do usuário, mas podem também ser utilizados para trocar dados adicionais além dos informados pelo usuário (que podem ser passados pela URL).</p>
<p>Os cabeçalhos HTTP são enviados com o seguinte formato, logo depois da URL e antes da primeira linha em branco na requisição:</p>
<p>nome: valor</p>
<p>O valor dos cabeçalhos deve ser codificados utilizando a mesma tabela de conversão das URLs.</p>
<h4>Exemplo de Requisião HTTP</h4>
<p>O usuário digita no browser a URL: http://www.google.com/search?q=ruby+on+rails</p>
<p>O browser abre uma conexão TCP/IP na porta 80 (padrão) do servidor www.google.com e envia o seguinte texto:</p>
<pre>GET http://www.google.com/search?q=ruby+rails HTTP/1.0
User-Agent: Mozilla/4.73 [en] (X11; U; Linux 2.0.35  i686)
&lt;Linha em branco no final&gt;</pre>
<p>O Servidor Responde:</p>
<pre>HTTP/1.0 200 OK
Cache-Control: private
Content-Type: text/html; charset=ISO-8859-1
Set-Cookie: PREF=ID=059bd3c506c56f82:TM=1189888548:LM=1189888548:S=hV0hCZi26b1SuRY7; expires=Mon, 14-Sep-2009 20:35:48 GMT; path=/; domain=.google.com
Server: gws
Date: Sat, 15 Sep 2007 20:35:48 GMT
Connection: Close

&lt;html&gt;&lt;head&gt;
&lt;Resto do HTML da página&gt;</pre>
<h4>Explicando o que foi enviado:</h4>
<ul>
<li>GET http://www.google.com/search?q=ruby+rails HTTP/1.0
<ul>
<li>GET é o método sendo utilizado</li>
<li>http://www.google.com/search?q=ruby+rails é a URL solicitada no servidor</li>
<li>HTTP/1.0 é a versão do protocolo sendo utilizada</li>
</ul>
</li>
<li>User-Agent: Mozilla/4.73 [en] (X11; U; Linux 2.0.35  i686)
<ul>
<li><em>User-Agent</em> é um cabeçalho enviado que informa ao servidor qual <em>browser</em> esta fazendo a requisição</li>
</ul>
</li>
<li>Linha em branco marcando o final da transmissão.</li>
</ul>
<h4>Explicando a resposta:</h4>
<ul>
<li>HTTP/1.0 200 OK
<ul>
<li>HTTP/1.0 é a versão do protocolo</li>
<li>200 é o código da resposta que informa que o processamento esta OK</li>
<li>OK é um texto livre escrevendo o status, cada servidor pode responder com uma descrição diferente relativa ao código</li>
</ul>
</li>
<li>Nas linhas seguintes, antes do espaço, tem diversos HEADERS que podem ser utilizados pelo <em>browser</em></li>
<li>Após a linha em branco, há o conteúdo da URL solicitada</li>
</ul>
<h4>Métodos HTTP</h4>
<h5>GET</h5>
<p>O método GET é utilizado para buscar o conteúdo de uma URL e o conteúdo retornado para a mesma URL deve ser sempre o mesmo. Isso facilita que o <em>browser </em>possa guardar páginas em cache por algum tempo para melhorar a experiência do usuário.</p>
<h5>POST</h5>
<p>O método POST é utilizado para enviar dados para o servidor. Esse método não possui a obrigatoriedade de ter sempre o mesmo resultado para os mesmos dados enviados.</p>
<h5>PUT</h5>
<p>O método PUT é utilizado para criar recursos no servidor. Ele possui a característica do método GET, de ter a mesma resposta para o mesmo conteúdo enviado.</p>
<h5>DELETE</h5>
<p>Este método é utilizado para remover recursos do servidor.</p>
<h5>HEAD</h5>
<p>O método HEAD serve para solicitar ao servidor apenas o cabeçalho do conteúdo com os headers, para que o cliente decida se precisa requisitar o conteúdo completo ou não.</p>
<p>Os métodos mais utilizados pela maioria das aplicações são o GET para buscar dados e o POST para enviar dados. Os métodos PUT e DELETE raramente são suportados por uma aplicação, mas são bastante úteis quando se deseja implementar<em> Web Services</em> seguindo o padrão <a href="http://pt.wikipedia.org/wiki/REST">REST</a>. Alguns outros protocolos utilizam métodos adicionais e até definem alguns novos, como por exemplo o protocolo <a href="http://pt.wikipedia.org/wiki/Webdav">WebDav</a>.</p>
<h4>Códigos de resposta HTTP</h4>
<p>Os códigos de resposta HTTP possuem 4 famílias básicas que serão apresentadas abaixo. Mais informações sobre estes códigos de resposta podem ser encontradas nesta URL: <a href="http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html">http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html</a></p>
<ul>
<li>1XX – Códigos de informação, muito pouco utilizados</li>
<li>2XX – Sucesso: o código mais utilizado desta família é o 200 que significa OK</li>
<li>3XX – Redirecionamento: os códigos mais utilizados desta família são: 301 redirecionamento permanente e 307 redirecionamento temporário</li>
<li>4XX – Erro do cliente: o código mais conhecido desta família é o 404 que significa recurso não encontrado</li>
<li>5XX – Erro do servidor: o código mais conhecido desta família é o 500 que significa erro interno do servidor.</li>
</ul>
<h4>Cabeçalhos comuns</h4>
<p>Como o protocolo HTTP não mantém estado portanto, cada request é independente. Para solucionar este problema os cookies podem informar ao servidor quem é o cliente que está acessando o recurso.</p>
<p>Segue uma lista de alguns cabeçalhos bastante utilizados.</p>
<ul>
<li>Location: utilizado junto com os códigos 301 e 307 informando o novo endereço do recurso</li>
<li>Content-Type: informa o tipo MIME do recurso retornado ou enviado ao servidor</li>
<li>Set-Cookie: grava um cookie no browser</li>
<li>Cookie: envia os cookies armazenados no servidor</li>
<li>Cache-Control: informa se o browser pode ou não armazenar o recurso em cache</li>
<li>Content-Length: informa o tamanho do conteúdo enviado ou da resposta</li>
<li>Last-Modified: informa ao cliente quando foi a ultima alteração do recurso solicitado</li>
<li>Accept: informa ao servidor quais são os tipos de recursos que o cliente sabe processar</li>
<li>Allow: informa ao cliente quais as ações disponíveis para um recurso especifico</li>
<li>Content-Encoding: informa ao cliente ou ao servidor qual a codificação que está sendo utilizada para o conteúdo enviado ou recebido</li>
<li>Host: informa ao servidor qual o nome do host utilizado no request. Bastante útil para possibilitar a configuração de hosts virtuais no mesmo endereço IP</li>
</ul>
<p>Bom, acho que era isto, claro que isto não é tudo sobre formação de URLs e sobre o protocolo HTTP, mas já é um bom começo.</p>
<p>Post de: <a href="http://www.urubatan.com.br">Blog do Urubatan</a><br/>
Quer comprar meu livro <a href="http://livro.urubatan.com.br">Desenvolvimento F&aacute;cil e R&aacute;pido de Aplica&ccedil;&otilde;es web</a> com 30% de desconto? &Eacute; s&oacute; acessar o meu <a href="http://www.urubatan.com.br">blog</a> e pegar o c&oacute;digo :D<br/><br/><a href="http://www.urubatan.com.br/http-e-url-dois-ilustres-pouco-conhecidos/">HTTP e URL &#8211; Dois ilustres pouco conhecidos</a></p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/BlogDoUrubatan?a=GUroz924RBQ:gwPSBsx9xWE:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/BlogDoUrubatan?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/BlogDoUrubatan?a=GUroz924RBQ:gwPSBsx9xWE:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/BlogDoUrubatan?i=GUroz924RBQ:gwPSBsx9xWE:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/BlogDoUrubatan?a=GUroz924RBQ:gwPSBsx9xWE:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/BlogDoUrubatan?i=GUroz924RBQ:gwPSBsx9xWE:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/BlogDoUrubatan?a=GUroz924RBQ:gwPSBsx9xWE:HCBZNhuKwNY"><img src="http://feeds.feedburner.com/~ff/BlogDoUrubatan?d=HCBZNhuKwNY" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/BlogDoUrubatan?a=GUroz924RBQ:gwPSBsx9xWE:Iu4eqwUi9wI"><img src="http://feeds.feedburner.com/~ff/BlogDoUrubatan?d=Iu4eqwUi9wI" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/BlogDoUrubatan?a=GUroz924RBQ:gwPSBsx9xWE:BxLlmz8_Wzw"><img src="http://feeds.feedburner.com/~ff/BlogDoUrubatan?d=BxLlmz8_Wzw" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/BlogDoUrubatan/~4/GUroz924RBQ" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.urubatan.com.br/http-e-url-dois-ilustres-pouco-conhecidos/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		<coop:keyword>Artigos</coop:keyword><coop:keyword>Java</coop:keyword><coop:keyword>Ruby</coop:keyword><coop:keyword>Trabalho</coop:keyword><coop:keyword>rails</coop:keyword><coop:keyword>basico</coop:keyword><coop:keyword>http</coop:keyword><coop:keyword>iniciante</coop:keyword><coop:keyword>uri</coop:keyword><coop:keyword>url</coop:keyword><feedburner:origLink>http://www.urubatan.com.br/http-e-url-dois-ilustres-pouco-conhecidos/</feedburner:origLink></item>
		<item>
		<title>Personalizando o código gerado pelo Rails 3</title>
		<link>http://feedproxy.google.com/~r/BlogDoUrubatan/~3/FVyUdWr7pwI/</link>
		<comments>http://www.urubatan.com.br/personalizando-o-codigo-gerado-pelo-rails-3/#comments</comments>
		<pubDate>Mon, 10 May 2010 21:02:00 +0000</pubDate>
		<dc:creator>Urubatan</dc:creator>
				<category><![CDATA[Ruby]]></category>
		<category><![CDATA[rails]]></category>
		<category><![CDATA[customize]]></category>
		<category><![CDATA[generator]]></category>
		<category><![CDATA[personalização]]></category>
		<category><![CDATA[produtividade]]></category>
		<category><![CDATA[templat]]></category>

		<guid isPermaLink="false">http://www.urubatan.com.br/?p=1873</guid>
		<description><![CDATA[Eu sempre digo, tanto no meu livro, como em palestras ou conversas por ai, que o código gerado pelo Scaffold do rails (e praticamente qualquer outro gerador de código por ai) só serve para fazer um quick start do desenvolvimento. Uma excessão a isto, na minha opinião pelo menos, é o código gerado pelo &#8220;scaffold&#8221; [...]<p>Post de: <a href="http://www.urubatan.com.br">Blog do Urubatan</a><br/>
Quer comprar meu livro <a href="http://livro.urubatan.com.br">Desenvolvimento F&aacute;cil e R&aacute;pido de Aplica&ccedil;&otilde;es web</a> com 30% de desconto? &Eacute; s&oacute; acessar o meu <a href="http://www.urubatan.com.br">blog</a> e pegar o c&oacute;digo :D<br/><br/><a href="http://www.urubatan.com.br/personalizando-o-codigo-gerado-pelo-rails-3/">Personalizando o código gerado pelo Rails 3</a></p>
]]></description>
			<content:encoded><![CDATA[<p><center><img src="http://www.urubatan.com.br/wp-content/uploads/2010/05/monkeywork.jpg" alt="" title="monkeywork" width="210" height="210" class="alignnone size-full wp-image-1875" /></center><br />
Eu sempre digo, tanto no meu livro, como em palestras ou conversas por ai, que o código gerado pelo Scaffold do rails (e praticamente qualquer outro gerador de código por ai) só serve para fazer um quick start do desenvolvimento.</p>
<p>Uma excessão a isto, na minha opinião pelo menos, é o código gerado pelo &#8220;scaffold&#8221; do Grails, pelo simples fato que ele sempre permitiu que a aplicação alterasse os templates que seriam utilizados para gerar o código. No rails isto sempre foi mais complicado, era preciso criar um generator e duplicar todo o generator que você queria personalizar para algumas vezes mudar quase nada no código gerado, ou seja, na maior parte das vezes isto não valeria a pena mesmo &#8230;</p>
<p>Mas com o Rails 3 seus problemas acabaramse! <sub>(alusão sem graça nenhuma ao seu Creiçom do Casseta e Planeta)</sub></p>
<p>O Rails 3 permite que você personalize de forma bastante fácil os templates utilizados pelos generators do rails, basta criar uma pasta templates dentro do diretório lib do projeto, e neste diretório copiar para lá o template original do rails e fazer as alterações que você achar interessante para o seu projeto.</p>
<p>Os templates do rails ficam dentro da Ruby Gem &#8220;railties&#8221;, dentro de lib/generators.</p>
<p>Neste diretório existem os grupos de generators (erb, rails e test_unit) e dentro destes, um diretório para cada generator e dentro deste um diretório templates. O conteúdo deste diretório templates deve ser copiado para <b>RAILS_ROOT/lib/templates/&lt;grupo>/&lt;nome do generator></b>.</p>
<p>E pronto, as alterações que você fizer na copia do seu projeto vão refletir no resultado da próxima vez que você executar o generator &#8230;</p>
<p>Acho que isto ficou meio confuso certo?</p>
<p>Então é o seguinte, vamos supor que queiramos alterar o código das views geradas pelo generator &#8220;scaffold&#8221;. O código original vai estar no diretório<br />
<b>RAILTIES_GEM/lib/rails/generators/erb/scaffold/templates</b><br />
Este diretório contem os templates que vão gerar os arquivos .html.erb, para personalizar o código gerado para o seu projeto, basta copiar o conteúdo deste diretório para<br />
<b>RAILS_ROOT/lib/templates/erb/scaffold</b> (isto mesmo, sem o diretório templates)<br />
Alterar o que você quiser, e pronto, tudo vai funcionar &#8230;</p>
<p>Mas vamos combinar que ficar copiando estes arquivos da trabalho né? Isto me faz sentir falta de uma task de nome &#8220;install-templates&#8221; do grails, que copiava todos os templates de geração de código para o diretório da aplicação para que fossem personalizados. E como sou preguiçoso demais para ficar copiando arquivos a mão, criei uma task rake que faz isto. Não empacotei em um plugin por que achei muito simples, mas se alguem achar interessante posso fazer isto <img src='http://www.urubatan.com.br/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /><br />
Enquanto isto, quem quiser copiar o código desta task, <a href="http://gist.github.com/396453">esta disponível no gist</a>, é só copiar o código e colocar em um arquivo .rake no diretório lib/tasks da aplicação.<br />
<script src="http://gist.github.com/396453.js"></script><br />
E para usar a task é só rodar: <b>rake templates:copy</b></p>
<p>Ahh, mas pra que serve isto?<br />
Bom, para diversas coisas, como por exemplo fazer com que o código gerado pelo scaffold chegue mais próximo de um cadastro real da sua aplicação, ou para fazer um exemplo simples, eu personalizei o controller.rb do scaffold_generator para utilizar o novo Responder do Rails 3, o <a href="http://gist.github.com/396530">template ficou assim</a>:<br />
<script src="http://gist.github.com/396530.js"></script></p>
<p>E o controlador gerado, mantem exatamente a mesma funcionalidade, mas em vez das 84 linhas padrão de um controlador gerado pelo scaffold do rails, ele tem apelas 51 linhas. O <a href="http://gist.github.com/396527">código gerado ficou assim</a>:<br />
<script src="http://gist.github.com/396527.js"></script></p>
<p>Se você quiser saber mais sobre o Responder, o <a href="http://www.akitaonrails.com/2010/05/10/rails-3-introducao-a-javascript-nao-obstrusivo-e-responders">Akita publicou um post sobre isto hoje no blog dele</a>.</p>
<p><b>Espero que este post ajude vocês a trabalhar menos daqui pra frente.</b></p>
<p>PS.: Achei legal testar o Gist, mas se vocês não gostaram e preferirem o código embedded nos posts do blog como eu sempre faço, é só avisar que volto a colar o código por aqui mesmo <img src='http://www.urubatan.com.br/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </p>
<p>Post de: <a href="http://www.urubatan.com.br">Blog do Urubatan</a><br/>
Quer comprar meu livro <a href="http://livro.urubatan.com.br">Desenvolvimento F&aacute;cil e R&aacute;pido de Aplica&ccedil;&otilde;es web</a> com 30% de desconto? &Eacute; s&oacute; acessar o meu <a href="http://www.urubatan.com.br">blog</a> e pegar o c&oacute;digo :D<br/><br/><a href="http://www.urubatan.com.br/personalizando-o-codigo-gerado-pelo-rails-3/">Personalizando o código gerado pelo Rails 3</a></p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/BlogDoUrubatan?a=FVyUdWr7pwI:wvvn-SQshWc:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/BlogDoUrubatan?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/BlogDoUrubatan?a=FVyUdWr7pwI:wvvn-SQshWc:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/BlogDoUrubatan?i=FVyUdWr7pwI:wvvn-SQshWc:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/BlogDoUrubatan?a=FVyUdWr7pwI:wvvn-SQshWc:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/BlogDoUrubatan?i=FVyUdWr7pwI:wvvn-SQshWc:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/BlogDoUrubatan?a=FVyUdWr7pwI:wvvn-SQshWc:HCBZNhuKwNY"><img src="http://feeds.feedburner.com/~ff/BlogDoUrubatan?d=HCBZNhuKwNY" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/BlogDoUrubatan?a=FVyUdWr7pwI:wvvn-SQshWc:Iu4eqwUi9wI"><img src="http://feeds.feedburner.com/~ff/BlogDoUrubatan?d=Iu4eqwUi9wI" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/BlogDoUrubatan?a=FVyUdWr7pwI:wvvn-SQshWc:BxLlmz8_Wzw"><img src="http://feeds.feedburner.com/~ff/BlogDoUrubatan?d=BxLlmz8_Wzw" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/BlogDoUrubatan/~4/FVyUdWr7pwI" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.urubatan.com.br/personalizando-o-codigo-gerado-pelo-rails-3/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<coop:keyword>Ruby</coop:keyword><coop:keyword>rails</coop:keyword><coop:keyword>customize</coop:keyword><coop:keyword>generator</coop:keyword><coop:keyword>personalização</coop:keyword><coop:keyword>produtividade</coop:keyword><coop:keyword>templat</coop:keyword><feedburner:origLink>http://www.urubatan.com.br/personalizando-o-codigo-gerado-pelo-rails-3/</feedburner:origLink></item>
		<item>
		<title>Os 5 segredos para um sistema altamente escalável</title>
		<link>http://feedproxy.google.com/~r/BlogDoUrubatan/~3/kjyz-K8VeRo/</link>
		<comments>http://www.urubatan.com.br/os-4-segredos-para-um-sistema-altamente-escalavel/#comments</comments>
		<pubDate>Tue, 27 Apr 2010 21:40:16 +0000</pubDate>
		<dc:creator>Urubatan</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[Trabalho]]></category>
		<category><![CDATA[rails]]></category>
		<category><![CDATA[escalabilidade]]></category>
		<category><![CDATA[produtividade]]></category>

		<guid isPermaLink="false">http://www.urubatan.com.br/?p=1860</guid>
		<description><![CDATA[Ontem enquanto caminhava do trabalho até o carro, conversando com um colega sobre infra estrutura para um sistema que ele estava pensando em construir. Qual arquitetura seguir, qual linguagem utilizar, qual framework, se rails era o suficiente para o que ele queria ou não, se devia usar ruby ou java, se ruby escala ou não [...]<p>Post de: <a href="http://www.urubatan.com.br">Blog do Urubatan</a><br/>
Quer comprar meu livro <a href="http://livro.urubatan.com.br">Desenvolvimento F&aacute;cil e R&aacute;pido de Aplica&ccedil;&otilde;es web</a> com 30% de desconto? &Eacute; s&oacute; acessar o meu <a href="http://www.urubatan.com.br">blog</a> e pegar o c&oacute;digo :D<br/><br/><a href="http://www.urubatan.com.br/os-4-segredos-para-um-sistema-altamente-escalavel/">Os 5 segredos para um sistema altamente escalável</a></p>
]]></description>
			<content:encoded><![CDATA[<p>Ontem enquanto caminhava do trabalho até o carro, conversando com um colega sobre infra estrutura para um sistema que ele estava pensando em construir. Qual arquitetura seguir, qual linguagem utilizar, qual framework, se rails era o suficiente para o que ele queria ou não, se devia usar ruby ou java, se ruby escala ou não escala, consegui convencer ele de que a resposta para a pergunta inicial dele é &#8220;depende&#8221;, mas também lembrei de alguns segredos que se aplicam em todos os casos que consigo lembrar agora para se criar um sistema web altamente escalável,por conseqüência, também são segredos bastante importantes para colocar a sua aplicação na &#8220;nuvem&#8221; e também são muito importantes para você escrever os serviços que farão parte da sua arquitetura <a href="http://sledge.boo-box.com/list/page/U09BXyMjX2JveF8jI190YWdnaW5nLXRvb2wtd3BfIyNfMzYyOQ==-52" class="bbli">SOA<img src="http://boo-box.com/bbli" alt="[bb]" class="bbic" /></a> ou seus serviços REST.<br />
Ou seja, sempre mantenha estas cinco regras em mente se o sistema que você esta desenvolvendo pode crescer um dia.</p>
<p><span style="font-size: smaller;">Sim, eu sei que estou sendo um pouco categórico demais, e que nenhuma regra se aplica a tudo e que existem excessões para o que estou escrevendo.</span></p>
<h2>Stateless</h2>
<p>Se você quer um sistema ou um serviço escalável, com certeza você quer que todas as requisições para este serviço sejam stateless.<br />
Mas por que?<br />
Simplesmente por que caso em um futuro próximo você precise rodar a sua aplicação em um cluster, você não prende um cliente a um nó do cluster, cada requisição pode ir para o nó do cluster que estiver com a menór carga naquele momento, fazendo com que o tempo de resposta aquela requisição seja o menor possível, mantendo o nó do cluster que vai atender a esta requisição ocupado o menor tempo possível.</p>
<h2>Request Response Time</h2>
<p>Acho que já falei um pouco sobre isto, mas imagine a seguinte situação, o sistema que você acabou de publicar bombou e agora em vez de ter que atender a 5 clientes (Você, seu melhor amigo, sua mãe, seu pai, sua namorada), agora o sistema tem que atender a 1k clientes simultâneos, e você pensa: Beleza, só preciso fazer um clusterzinho aqui, coloco mais duas maquinas e tudo beleza.<br />
O problema é que o seu sistema antes estava com um &#8220;RRT&#8221; médio de 30s ou seja, com uma maquina só, você conseguia responder a duas requisições por minuto (considerando apenas um thread por máquina para facilitar o exemplo), agora com as duas maquinas novas você consegue atender a maravilhosos 6 requests por minuto. Ou seja, você tem um baita fiasco nas mãos.<br />
Por isto o Request Response Time, ou seja, o tempo que a sua aplicação leva para atender a cada requisição tem que ser o mais baixo possível.<br />
Por exemplo, enquanto escrevia este post criei uma aplicação rails com um cadastro de usuários de brinquedo, gerado pelo scaffold e o RRT é de 15.6ms (alto mas a maquina esta bastante carregada agora) o que permite que com uma thread seja possível atender a 64 requisições por segundo. Em um outro sistema que trabalhei, algumas requisições por diversos motivos chegaram a demorar 20s para retornar, mas isto foi resolvido claro <img src='http://www.urubatan.com.br/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /><br />
Bom, acho que deu para entender o por que o RRT é tão importante. Para clarear mais a idéia, imagine a seguinte situação que você já deve ter visto diversas vezes: Uma loja grande, com fila unica e 4 caixas atendendo. Se cada um dos caixas for muito demorado, você vai passar horas na fila, e não é economicamente viável ter um caixa por usuário. então a solução viável para este problema é otimizar o trabalho dos caixas para que cada caixa seja mais rápido e consiga atender a um maior número de clientes por minuto.</p>
<h2>Cache</h2>
<p>Cache é uma forma de melhorar muito o RRT, imagine que a sua mega aplicação seja uma página de classificados, em que a página inicial, que todos os clientes acessam ao chegar no site. Tenha uma lista com os produtos mais baratos anunciados.<br />
Esta página precisa de uma consulta no banco de dados para ser renderizada, mas se você pensar bem os dados serão sempre os mesmos até que alguem delete um dos produtos listados ali ou cadastre outro mais barato.<br />
Então faz todo o sentido &#8220;guardar uma copia&#8221; da página prontinha, e só mostrar aquela cópia para o próximo que acessar a página, e simplesmente deletar esta cópia quando uma das duas situações que pode alterar a página acontecer, ai no próximo acesso a página é renderizada novamente e a copia atualizada é guardada, e novamente ficamos utilizando apenas aquela cópia até que algo aconteça que possa fazer os dados ficarem desatualizados.<br />
Isto é chamado de &#8220;cache&#8221;, na verdade esta é uma forma bem simples de cache. Estude aos recursos de caching do framework que você esta utilizando, do servidor de aplicações, do sistema operacional, do banco de dados.<br />
Mas não ative tudo ao mesmo tempo, o correto uso de cache vai melhorar muito a performance da sua aplicação, mas o uso incorreto pode causar muitos problemas.</p>
<h2>Remote Data</h2>
<p>Muito pouca coisa é pior para um cluster do que uma aplicação que guarda dados localmente.<br />
Imagine só o seguinte, naquela aplicação de classificados, você resolveu que as imagens correspondentes a cada anuncio ficariam gravadas na própria maquina do servidor, barbadinha, facilita o upload.<br />
Ai é que mora o perigo.<br />
Quando você precisar colocar isto pra rodar em um cluster, o segundo nó do cluster quando atendendo uma requisição, vai acreditar que as imagens estão naquele nó também, mas ele nem existia quando o anuncio foi criado, o upload foi feito pra outra maquina. Isto vai fazer com que o usuário veja uma página com a imagem quebrada.<br />
Ahh, e como resolver isto?<br />
Bom, existem diversas formas, uma bem simples é criar um servidor de &#8220;recursos estáticos&#8221;, ou seja, tudo o que é estático no site é servido por um endereço diferente, e quando for feito o upload de uma imagem, ela deve ser salva neste outro servidor. Também é possível utilizar um serviço como o Amazon S3 que vai fazer exatamente a mesma coisa que o seu servidor de recursos estáticos, mas de fora <img src='http://www.urubatan.com.br/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /><br />
Outra coisa a lembrar é do banco de dados, ele também não deve ficar na mesma maquina que o servidor da aplicação, ou o endereço do banco (seja ele SQL, document driven, &#8230;) deve ser configurável. Isto por que em um cluster, o ideal é que todos os nós acessem o mesmo banco de dados, ou no mínimo que todos os bancos do cluster estejam sincronizados.</p>
<h2>Proxy Reverso</h2>
<p>Um próxi reverso no contexto deste post vai ser utilizado para mascarar algumas das técnicas de caching, para implementar algumas técnicas de caching e principalmente para esconder do usuário que você tem diversos servidores, ele vai ser o &#8220;front-end&#8221; da sua aplicação, a mágica do cloud só pode acontecer atrás do proxy, e ele também pode esconder do usuário o fato de você usar um &#8220;servidor de recursos estáticos&#8221; sendo ele interno criado por você mesmo ou você usando um S3 da vida, o proxy reverso pode mascarar o endereço real da aplicação.<br />
Mas nunca esqueça de um detalhe importante. Este proxy mesmo sendo vital para uma arquitetura cloud, ou um cluster menorzinho, ele acaba de adicionar um SPoF (Single Point Of Failure) se o proxy morrer, a sua mega aplicação esta fora do ar.</p>
<p>Bom, acho que era isto, sempre tem alguem perguntando como fazer um sistema escalável, como fazer um sistema robusto, como fazer um sistema para rodar em cluster ou na nuvem.<br />
Este post não é a resposta final para todos os problemas, este post não responde estas perguntas para todos os casos, mas para a maior parte dos casos que me lembro agora, as dicas deste post são pontos imprescindíveis para qualquer aplicação ou arquitetura que pretenda ter um mínimo de escalabilidade.<br />
Espero que este post seja útil para alguem, e se não concordarem com alguma coisa é só deixar um comentário.</p>
<p>Post de: <a href="http://www.urubatan.com.br">Blog do Urubatan</a><br/>
Quer comprar meu livro <a href="http://livro.urubatan.com.br">Desenvolvimento F&aacute;cil e R&aacute;pido de Aplica&ccedil;&otilde;es web</a> com 30% de desconto? &Eacute; s&oacute; acessar o meu <a href="http://www.urubatan.com.br">blog</a> e pegar o c&oacute;digo :D<br/><br/><a href="http://www.urubatan.com.br/os-4-segredos-para-um-sistema-altamente-escalavel/">Os 5 segredos para um sistema altamente escalável</a></p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/BlogDoUrubatan?a=kjyz-K8VeRo:74pDZsNe2Ro:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/BlogDoUrubatan?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/BlogDoUrubatan?a=kjyz-K8VeRo:74pDZsNe2Ro:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/BlogDoUrubatan?i=kjyz-K8VeRo:74pDZsNe2Ro:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/BlogDoUrubatan?a=kjyz-K8VeRo:74pDZsNe2Ro:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/BlogDoUrubatan?i=kjyz-K8VeRo:74pDZsNe2Ro:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/BlogDoUrubatan?a=kjyz-K8VeRo:74pDZsNe2Ro:HCBZNhuKwNY"><img src="http://feeds.feedburner.com/~ff/BlogDoUrubatan?d=HCBZNhuKwNY" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/BlogDoUrubatan?a=kjyz-K8VeRo:74pDZsNe2Ro:Iu4eqwUi9wI"><img src="http://feeds.feedburner.com/~ff/BlogDoUrubatan?d=Iu4eqwUi9wI" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/BlogDoUrubatan?a=kjyz-K8VeRo:74pDZsNe2Ro:BxLlmz8_Wzw"><img src="http://feeds.feedburner.com/~ff/BlogDoUrubatan?d=BxLlmz8_Wzw" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/BlogDoUrubatan/~4/kjyz-K8VeRo" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.urubatan.com.br/os-4-segredos-para-um-sistema-altamente-escalavel/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		<coop:keyword>Java</coop:keyword><coop:keyword>Ruby</coop:keyword><coop:keyword>Trabalho</coop:keyword><coop:keyword>rails</coop:keyword><coop:keyword>escalabilidade</coop:keyword><coop:keyword>produtividade</coop:keyword><feedburner:origLink>http://www.urubatan.com.br/os-4-segredos-para-um-sistema-altamente-escalavel/</feedburner:origLink></item>
		<item>
		<title>Agile Brazil 2010 – A chamada para trabalhos está aberta!</title>
		<link>http://feedproxy.google.com/~r/BlogDoUrubatan/~3/QUe5pgTSTgo/</link>
		<comments>http://www.urubatan.com.br/agile-brazil-2010-a-chamada-para-trabalhos-esta-aberta/#comments</comments>
		<pubDate>Thu, 18 Feb 2010 00:25:32 +0000</pubDate>
		<dc:creator>Urubatan</dc:creator>
				<category><![CDATA[Dia a Dia]]></category>
		<category><![CDATA[agile]]></category>
		<category><![CDATA[bdd]]></category>
		<category><![CDATA[cucumber]]></category>
		<category><![CDATA[eventos]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[palestras]]></category>
		<category><![CDATA[rails]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[tdd]]></category>

		<guid isPermaLink="false">http://www.urubatan.com.br/?p=1854</guid>
		<description><![CDATA[Estou de férias, e eu não ia escrever nada aqui no blog antes de voltar ao trabalho, mas isto merece o post A chamada de trabalhos para o Agile Brazil 2010 esta aberta. Se você tem algo interessante sobre Agile para falar, envie sua proposta de palestra, tutorial ou workshop por este link. A Agile [...]<p>Post de: <a href="http://www.urubatan.com.br">Blog do Urubatan</a><br/>
Quer comprar meu livro <a href="http://livro.urubatan.com.br">Desenvolvimento F&aacute;cil e R&aacute;pido de Aplica&ccedil;&otilde;es web</a> com 30% de desconto? &Eacute; s&oacute; acessar o meu <a href="http://www.urubatan.com.br">blog</a> e pegar o c&oacute;digo :D<br/><br/><a href="http://www.urubatan.com.br/agile-brazil-2010-a-chamada-para-trabalhos-esta-aberta/">Agile Brazil 2010 &#8211; A chamada para trabalhos está aberta!</a></p>
]]></description>
			<content:encoded><![CDATA[<p>Estou de férias, e eu não ia escrever nada aqui no blog antes de  voltar ao trabalho, mas isto merece o post <img src='http://www.urubatan.com.br/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /><br />
A <a href="http://www.agilebrazil.com/2010/chamadatrabalhos.html">chamada de trabalhos para o Agile Brazil 2010</a> esta aberta.<br />
Se você tem algo interessante sobre Agile para falar, envie sua proposta de palestra, tutorial ou workshop por <a href="http://submissoes.agilebrazil.com/">este link</a>.</p>
<p>A <a href="http://www.agilebrazil.com/2010/">Agile Brazil 2010</a> é um evento nacional organizado por representantes das principais comunidades ágeis brasileiras. Junte-se a nós submetendo trabalhos, participando do concurso do logo e divulgando o evento.</p>
<p>Acompanhe as novidades do <a href="http://twitter.com/agilebrazil">@agilebrazil</a> pelo Twitter.</p>
<p>O evento vai acontecer em  Porto Alegre de 22 a 25 de Junho 2010.</p>
<p>Espero ver alguns de vocês por lá!</p>
<p>Post de: <a href="http://www.urubatan.com.br">Blog do Urubatan</a><br/>
Quer comprar meu livro <a href="http://livro.urubatan.com.br">Desenvolvimento F&aacute;cil e R&aacute;pido de Aplica&ccedil;&otilde;es web</a> com 30% de desconto? &Eacute; s&oacute; acessar o meu <a href="http://www.urubatan.com.br">blog</a> e pegar o c&oacute;digo :D<br/><br/><a href="http://www.urubatan.com.br/agile-brazil-2010-a-chamada-para-trabalhos-esta-aberta/">Agile Brazil 2010 &#8211; A chamada para trabalhos está aberta!</a></p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/BlogDoUrubatan?a=QUe5pgTSTgo:EWtRYHNR5Io:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/BlogDoUrubatan?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/BlogDoUrubatan?a=QUe5pgTSTgo:EWtRYHNR5Io:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/BlogDoUrubatan?i=QUe5pgTSTgo:EWtRYHNR5Io:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/BlogDoUrubatan?a=QUe5pgTSTgo:EWtRYHNR5Io:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/BlogDoUrubatan?i=QUe5pgTSTgo:EWtRYHNR5Io:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/BlogDoUrubatan?a=QUe5pgTSTgo:EWtRYHNR5Io:HCBZNhuKwNY"><img src="http://feeds.feedburner.com/~ff/BlogDoUrubatan?d=HCBZNhuKwNY" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/BlogDoUrubatan?a=QUe5pgTSTgo:EWtRYHNR5Io:Iu4eqwUi9wI"><img src="http://feeds.feedburner.com/~ff/BlogDoUrubatan?d=Iu4eqwUi9wI" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/BlogDoUrubatan?a=QUe5pgTSTgo:EWtRYHNR5Io:BxLlmz8_Wzw"><img src="http://feeds.feedburner.com/~ff/BlogDoUrubatan?d=BxLlmz8_Wzw" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/BlogDoUrubatan/~4/QUe5pgTSTgo" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.urubatan.com.br/agile-brazil-2010-a-chamada-para-trabalhos-esta-aberta/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<coop:keyword>Dia a Dia</coop:keyword><coop:keyword>agile</coop:keyword><coop:keyword>bdd</coop:keyword><coop:keyword>cucumber</coop:keyword><coop:keyword>eventos</coop:keyword><coop:keyword>Java</coop:keyword><coop:keyword>palestras</coop:keyword><coop:keyword>rails</coop:keyword><coop:keyword>Ruby</coop:keyword><coop:keyword>tdd</coop:keyword><feedburner:origLink>http://www.urubatan.com.br/agile-brazil-2010-a-chamada-para-trabalhos-esta-aberta/</feedburner:origLink></item>
		<item>
		<title>Flex For Kids – Aprendendo o que precisa e ajudando a quem precisa :D</title>
		<link>http://feedproxy.google.com/~r/BlogDoUrubatan/~3/Ml2G4uxh8Qk/</link>
		<comments>http://www.urubatan.com.br/flex-for-kids-aprendendo-o-que-precisa-e-ajudando-a-quem-precisa-d/#comments</comments>
		<pubDate>Mon, 01 Feb 2010 13:27:49 +0000</pubDate>
		<dc:creator>Urubatan</dc:creator>
				<category><![CDATA[flex]]></category>
		<category><![CDATA[caridade]]></category>
		<category><![CDATA[evento]]></category>

		<guid isPermaLink="false">http://www.urubatan.com.br/?p=1841</guid>
		<description><![CDATA[Ok, o trocadilho do título do post foi muito ruim, mas eu tenho esperança de conseguir ser engraçado uma hora destas Mas o Flex For Kids é um evento que tem dois objetivos principais: Ajudar a quem precisa, neste caso a Cotolengo Compartilhar conhecimento sobre Adobe Flex, e o pessoal que vai estar compartilhando conhecimento [...]<p>Post de: <a href="http://www.urubatan.com.br">Blog do Urubatan</a><br/>
Quer comprar meu livro <a href="http://livro.urubatan.com.br">Desenvolvimento F&aacute;cil e R&aacute;pido de Aplica&ccedil;&otilde;es web</a> com 30% de desconto? &Eacute; s&oacute; acessar o meu <a href="http://www.urubatan.com.br">blog</a> e pegar o c&oacute;digo :D<br/><br/><a href="http://www.urubatan.com.br/flex-for-kids-aprendendo-o-que-precisa-e-ajudando-a-quem-precisa-d/">Flex For Kids &#8211; Aprendendo o que precisa e ajudando a quem precisa :D</a></p>
]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.flexforkids.com" target="_blank"><img title="Flex for Kids" src="http://www.flexforkids.com/images/flex_for_kids_728x90.jpg" alt="Flex for Kids" width="100%" /></a><br />
Ok, o trocadilho do título do post foi muito ruim, mas eu tenho esperança de conseguir ser engraçado uma hora destas <img src='http://www.urubatan.com.br/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /><br />
Mas o <a href="http://www.flexforkids.com">Flex For Kids</a> é um evento que tem dois objetivos principais:</p>
<ol>
<li>Ajudar a quem precisa, neste caso a <a href="http://www.cotolengo.com.br/">Cotolengo</a></li>
<li>Compartilhar conhecimento sobre Adobe Flex, e o pessoal que vai estar compartilhando conhecimento é muito fera!!</li>
</ol>
<p>Quem organiza o evento é a <a href="http://www.egenial.com.br">e-Genial</a>, que também organiza o <a href="http://www.railsforkids.com">Rails for Kids</a>.<br />
No Flex For Kids as doações recebidas vão direto para a Cotolengo, o que é bem legal, na prática você estara assistindo a excelentes palestras de grátis, a única coisa que é cobrada é que você faça um pouquinho de caridade <img src='http://www.urubatan.com.br/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /><br />
Bom, veja o que você vai poder aproveitar neste evento, e tudo isto sem sair de casa (ou do trabalho) já que o evento utiliza a excelente plataforma Treina Tom (Também da e-Genial)</p>
<ul style="list-style: none;">
<li>
<h3>Vicente Maciel Junior</h3>
<p><strong>Palestra:</strong> Desenvolvimento Multi-touch com AIR 2.0<br />
Nesta palestra o participante irá conhecer a API Multi-touch introduzida na versão 2.0 do Adobe Integrated Runtime, que traz grande facilidade para o desenvolvimento de aplicações explorando este recurso.<br />
<strong>Público Alvo:</strong> Desenvolvedores, gerentes de projeto e entusiastas no desenvolvimento de soluções utilizando o AIR 2.0</li>
<li>
<h3>Igor Musardo</h3>
<p><strong>Palestra:</strong> Construa painéis administrativos em Flex integrados com ASP.NET MVC.<br />
Você verá na prática como integrar o Flex com a nova abordagem MVC do ASP.NET, indo além do CRUD.<br />
<strong>Público Alvo:</strong> Desenvolvedores Flex que utilizem ou querem utilizar o ASP.NET MVC como Back-End.</li>
<li>
<h3>Mário Júnior</h3>
<p><strong>Palestra:</strong> Swiz Framework: MVC Simples e Poderoso para projetos Flex/AIR<br />
Essa palestra visa mostrar a brutal diferença entre seus &#8220;concorrentes&#8221; e entender melhor a &#8220;conceptual constraint&#8221; que levou os autores do Swiz Framework a desenvolverem uma solução simples e flexível para projetos Flex/AIR, em relação aos demais frameworks conhecidos. (Cainrgorm, PureMVC, Mate, etc). Pré requisito: Conhecer &#8220;Dependency Injection&#8221; (DI) e &#8220;Inverse of Control&#8221; (IoC).<br />
<strong>Público Alvo:</strong> Desenvolvedores Flex.</li>
<li>
<h3>Eberton Consolim</h3>
<p><strong>Palestra:</strong> Flex e VOIP: Adicione essa tecnologia em suas aplicações<br />
Essa palestra tem por objetivo demonstrar a desenvolvedores Flex como implementar em suas aplicações funcionalidades de um discador VOIP, usando soluções open source.<br />
<strong>Público Alvo:</strong> Desenvolvedores Flex.</li>
<li>
<h3>Daniel Lopes</h3>
<p><strong>Palestra:</strong> Desktop com HTML, Javascript e Adobe AIR<br />
Conheça um novo mundo de possibilidades e tecnologias com Javascript e HTML para desktop e descubra como Adobe Air se integra a este ambiente, utilizando como case o PomoDo.<br />
<strong>Público Alvo:</strong> Desenvolvedores de qualquer linguagem.</li>
<li>
<h3>Gabriela Trindade Perry</h3>
<p><strong>Palestra:</strong> Estudo de caso: User Experience em um RIA<br />
Será debatido um estudo de caso onde implementamos um mecanismo de busca semântica através do design (!) A interface apenas pode ser viabilizada pela alta capacidade de componentização do Flex e porque entendemos o que o usuário precisava fazer com a interface.<br />
<strong>Público Alvo:</strong> Desenvolvedores Flex e designers de todos os credos e cores.</li>
<li>
<h3>Eric Cavalcanti</h3>
<p><strong>Palestra:</strong> Desmistificando o Cairngorm<br />
O Cairngorm é considerado por muitos como um framework com uma curva de aprendizado elevada. A finalidade desta palestra é desvendar o Cairngorm utilizando uma abordagem diferenciada, com o objetivo de facilitar o aprendizado do mesmo.<br />
<strong>Público Alvo:</strong> Desenvolvedores Flex.</li>
<li>
<h3>Fábio Vedovelli</h3>
<p><strong>Palestra:</strong> Introdução ao Mate: a importância de um framework MVC para Flex<br />
Muitos ainda não se convenceram da necessidade da utilização de um dos frameworks MVC (Model &#8211; View &#8211; Controller) presentes no mercado e esta palestra tem como objetivo mostrar a sua importância e indicar o framework escolhido pela RIA Labs.<br />
<strong>Público Alvo:</strong> Desenvolvedores Flex.</li>
<li>
<h3>Igor Costa</h3>
<p><strong>Palestra:</strong> Coloque uma interface Flex em seus projetos JEE<br />
Entenda como funciona a integração Adobe Flex com todos os serializadores disponíveis no mercado (BlazeDs, LivecycleDs,WebOrb for java,Pimento,Red5) para integração com seu back-end Java e crie novas ferramentas com recursos ímpar para seu negócio.<br />
<strong>Público Alvo:</strong> Desenvolvedores Java.</li>
<li>
<h3>Beck Novaes</h3>
<p><strong>Palestra:</strong> O Quarteto Fantástico: Flash 10.1, Flex 4, Flash Catalyst e Flash Builder<br />
Como as principais novidades da Plataforma Flash poderão impactar o desenvolvimento de Rich Internet Applications.<br />
<strong>Público Alvo:</strong> Pessoas interessadas no desenvolvimento de Rich Internet Applications.</li>
</ul>
<p>Para se inscrever, ou só para ver mais alguns detalhes antes de se inscrever, é só acessar o <a href="http://www.flexforkids.com">site do evento</a>.</p>
<p>Post de: <a href="http://www.urubatan.com.br">Blog do Urubatan</a><br/>
Quer comprar meu livro <a href="http://livro.urubatan.com.br">Desenvolvimento F&aacute;cil e R&aacute;pido de Aplica&ccedil;&otilde;es web</a> com 30% de desconto? &Eacute; s&oacute; acessar o meu <a href="http://www.urubatan.com.br">blog</a> e pegar o c&oacute;digo :D<br/><br/><a href="http://www.urubatan.com.br/flex-for-kids-aprendendo-o-que-precisa-e-ajudando-a-quem-precisa-d/">Flex For Kids &#8211; Aprendendo o que precisa e ajudando a quem precisa :D</a></p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/BlogDoUrubatan?a=Ml2G4uxh8Qk:lzTmY4Q5c6c:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/BlogDoUrubatan?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/BlogDoUrubatan?a=Ml2G4uxh8Qk:lzTmY4Q5c6c:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/BlogDoUrubatan?i=Ml2G4uxh8Qk:lzTmY4Q5c6c:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/BlogDoUrubatan?a=Ml2G4uxh8Qk:lzTmY4Q5c6c:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/BlogDoUrubatan?i=Ml2G4uxh8Qk:lzTmY4Q5c6c:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/BlogDoUrubatan?a=Ml2G4uxh8Qk:lzTmY4Q5c6c:HCBZNhuKwNY"><img src="http://feeds.feedburner.com/~ff/BlogDoUrubatan?d=HCBZNhuKwNY" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/BlogDoUrubatan?a=Ml2G4uxh8Qk:lzTmY4Q5c6c:Iu4eqwUi9wI"><img src="http://feeds.feedburner.com/~ff/BlogDoUrubatan?d=Iu4eqwUi9wI" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/BlogDoUrubatan?a=Ml2G4uxh8Qk:lzTmY4Q5c6c:BxLlmz8_Wzw"><img src="http://feeds.feedburner.com/~ff/BlogDoUrubatan?d=BxLlmz8_Wzw" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/BlogDoUrubatan/~4/Ml2G4uxh8Qk" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.urubatan.com.br/flex-for-kids-aprendendo-o-que-precisa-e-ajudando-a-quem-precisa-d/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<coop:keyword>flex</coop:keyword><coop:keyword>caridade</coop:keyword><coop:keyword>evento</coop:keyword><feedburner:origLink>http://www.urubatan.com.br/flex-for-kids-aprendendo-o-que-precisa-e-ajudando-a-quem-precisa-d/</feedburner:origLink></item>
		<item>
		<title>As 8 Falácias da programação distribuida</title>
		<link>http://feedproxy.google.com/~r/BlogDoUrubatan/~3/s_v_5-M15lc/</link>
		<comments>http://www.urubatan.com.br/as-8-falacias-da-programacao-distribuida/#comments</comments>
		<pubDate>Fri, 22 Jan 2010 12:21:44 +0000</pubDate>
		<dc:creator>Urubatan</dc:creator>
				<category><![CDATA[Artigos]]></category>
		<category><![CDATA[Trabalho]]></category>
		<category><![CDATA[distribuida]]></category>
		<category><![CDATA[programação]]></category>
		<category><![CDATA[rede]]></category>
		<category><![CDATA[tradução]]></category>

		<guid isPermaLink="false">http://www.urubatan.com.br/?p=1833</guid>
		<description><![CDATA[Encontrei esta lista no blog do James Gosling. Essencialmente todos, ao desenvolver a primeira aplicação distribuída, assumem os 8 itens seguintes como verdade. Todos se provam falsos ao longo do tempo, e estes erros causam problemas graves e aprendizados dolorosos. A rede é confiável A latência é zero A banda é infinita A rede é [...]<p>Post de: <a href="http://www.urubatan.com.br">Blog do Urubatan</a><br/>
Quer comprar meu livro <a href="http://livro.urubatan.com.br">Desenvolvimento F&aacute;cil e R&aacute;pido de Aplica&ccedil;&otilde;es web</a> com 30% de desconto? &Eacute; s&oacute; acessar o meu <a href="http://www.urubatan.com.br">blog</a> e pegar o c&oacute;digo :D<br/><br/><a href="http://www.urubatan.com.br/as-8-falacias-da-programacao-distribuida/">As 8 Falácias da programação distribuida</a></p>
]]></description>
			<content:encoded><![CDATA[<p><center><img alt="" src="http://upload.wikimedia.org/wikipedia/commons/9/91/Backbone.jpg" title="Backbone" class="alignnone" width="272" height="235" /></center><br />
Encontrei esta <a href="http://blogs.sun.com/jag/resource/Fallacies.html">lista</a> no blog do <a href="http://blogs.sun.com/jag/">James Gosling</a>.</p>
<p>Essencialmente todos, ao desenvolver a primeira aplicação distribuída, assumem os 8 itens seguintes como verdade. Todos se provam falsos ao longo do tempo, e estes erros causam problemas graves e aprendizados dolorosos.</p>
<ol>
<li>A <a href="http://pt.wikipedia.org/wiki/Rede">rede</a> é confiável</li>
<li>A <a href="http://pt.wikipedia.org/wiki/Lat%C3%AAncia">latência</a> é zero</li>
<li>A <a href="http://pt.wikipedia.org/wiki/Largura_de_banda_(telecomunica%C3%A7%C3%B5es)">banda</a> é infinita</li>
<li>A <a href="http://pt.wikipedia.org/wiki/Rede_de_computadores">rede</a> é segura</li>
<li>A <a href="http://pt.wikipedia.org/wiki/Rede_de_computadores#Topologia">topologia</a> não muda</li>
<li>Existe um administrador de rede</li>
<li>O custo de <a href="http://pt.wikipedia.org/wiki/Camada_de_transporte">transporte</a> é zero</li>
<li>A rede é homogênea</li>
</ol>
<p>Para mais detalhes, leiam o <a href="http://www.rgoarchitects.com/Files/fallacies.pdf">artigo</a> escrito por Arnon Rotem-Gal-Oz.</p>
<p>James Gosling em um link fala o seguinte sobre a origem desta lista:</p>
<blockquote><p>
A verdadeira origem desta lista é um pouco mítica, sendo amplamente baseada na experiência coletiva de muitos hackers nos primórdios da construção de sistemas distribuídos. Peter Deutch foi o primeiro agrupar os itens em uma lista. Ele diz o seguinte em sua página:</p>
<p>    Eu publiquei as &#8220;8 falácias da programação em rede&#8221; internamente enquanto trabalhava para &#8220;Sun Microsystem Labs&#8221; em 1991-92. (As primeiras 4 foram originalmente listadas por Bill ou Dick Lyon; Eu adicionei as outras 4.)
</p></blockquote>
<p>Achei que vali a tradução já que muita gente comete os mesmos erros até hoje <img src='http://www.urubatan.com.br/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </p>
<p>Post de: <a href="http://www.urubatan.com.br">Blog do Urubatan</a><br/>
Quer comprar meu livro <a href="http://livro.urubatan.com.br">Desenvolvimento F&aacute;cil e R&aacute;pido de Aplica&ccedil;&otilde;es web</a> com 30% de desconto? &Eacute; s&oacute; acessar o meu <a href="http://www.urubatan.com.br">blog</a> e pegar o c&oacute;digo :D<br/><br/><a href="http://www.urubatan.com.br/as-8-falacias-da-programacao-distribuida/">As 8 Falácias da programação distribuida</a></p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/BlogDoUrubatan?a=s_v_5-M15lc:gVEUMLGoeMs:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/BlogDoUrubatan?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/BlogDoUrubatan?a=s_v_5-M15lc:gVEUMLGoeMs:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/BlogDoUrubatan?i=s_v_5-M15lc:gVEUMLGoeMs:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/BlogDoUrubatan?a=s_v_5-M15lc:gVEUMLGoeMs:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/BlogDoUrubatan?i=s_v_5-M15lc:gVEUMLGoeMs:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/BlogDoUrubatan?a=s_v_5-M15lc:gVEUMLGoeMs:HCBZNhuKwNY"><img src="http://feeds.feedburner.com/~ff/BlogDoUrubatan?d=HCBZNhuKwNY" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/BlogDoUrubatan?a=s_v_5-M15lc:gVEUMLGoeMs:Iu4eqwUi9wI"><img src="http://feeds.feedburner.com/~ff/BlogDoUrubatan?d=Iu4eqwUi9wI" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/BlogDoUrubatan?a=s_v_5-M15lc:gVEUMLGoeMs:BxLlmz8_Wzw"><img src="http://feeds.feedburner.com/~ff/BlogDoUrubatan?d=BxLlmz8_Wzw" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/BlogDoUrubatan/~4/s_v_5-M15lc" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.urubatan.com.br/as-8-falacias-da-programacao-distribuida/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		<coop:keyword>Artigos</coop:keyword><coop:keyword>Trabalho</coop:keyword><coop:keyword>distribuida</coop:keyword><coop:keyword>programação</coop:keyword><coop:keyword>rede</coop:keyword><coop:keyword>tradução</coop:keyword><feedburner:origLink>http://www.urubatan.com.br/as-8-falacias-da-programacao-distribuida/</feedburner:origLink></item>
		<item>
		<title>Quick Review – Windows Mobile 6.5</title>
		<link>http://feedproxy.google.com/~r/BlogDoUrubatan/~3/U_SuvKk-kro/</link>
		<comments>http://www.urubatan.com.br/quick-review-windows-mobile-6-5/#comments</comments>
		<pubDate>Wed, 13 Jan 2010 16:16:46 +0000</pubDate>
		<dc:creator>Urubatan</dc:creator>
				<category><![CDATA[Mobile]]></category>
		<category><![CDATA[pim]]></category>
		<category><![CDATA[ppc]]></category>
		<category><![CDATA[Review]]></category>
		<category><![CDATA[windows mobile]]></category>
		<category><![CDATA[wm 6.5]]></category>

		<guid isPermaLink="false">http://www.urubatan.com.br/?p=1828</guid>
		<description><![CDATA[A garantia do meu celular ja esta terminando, então finalmente achei que valia a pena instalar uma ROM não oficial no meu P3301, já que isto viola a garantia Procurei um pouco no forum.xda-developers.com e encontrei uma ROM com windows mobile 6.5 para o meu HTC Artemis, instalei a Original Microsoft Edition (sim, eu sei [...]<p>Post de: <a href="http://www.urubatan.com.br">Blog do Urubatan</a><br/>
Quer comprar meu livro <a href="http://livro.urubatan.com.br">Desenvolvimento F&aacute;cil e R&aacute;pido de Aplica&ccedil;&otilde;es web</a> com 30% de desconto? &Eacute; s&oacute; acessar o meu <a href="http://www.urubatan.com.br">blog</a> e pegar o c&oacute;digo :D<br/><br/><a href="http://www.urubatan.com.br/quick-review-windows-mobile-6-5/">Quick Review &#8211; Windows Mobile 6.5</a></p>
]]></description>
			<content:encoded><![CDATA[<p><center><img src="http://www.urubatan.com.br/wp-content/uploads/2010/01/65chrome_head_logo.gif" alt="" title="Windows Phone" width="280" height="57" class="alignnone size-full wp-image-1829" /></center><br />
A garantia do meu celular ja esta terminando, então finalmente achei que valia a pena instalar uma ROM não oficial no meu <a href="http://sledge.boo-box.com/list/page/UDMzMDFfIyNfYm94XyMjX3RhZ2dpbmctdG9vbC13cF8jI18=-48" class="bbli">P3301<img src="http://boo-box.com/bbli" alt="[bb]" class="bbic" /></a>, já que isto viola a garantia <img src='http://www.urubatan.com.br/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </p>
<p>Procurei um pouco no <a href="http://forum.xda-developers.com">forum.xda-developers.com</a> e encontrei uma ROM com <a href="http://forum.xda-developers.com/showthread.php?t=546805">windows mobile 6.5 para o meu HTC Artemis</a>, instalei a Original Microsoft Edition (sim, eu sei que não foi uma atualização oficial feita pela MS, até por que eles não liberam atualizações, apenas o fabricante do celular pode fazer isto).</p>
<p>Bom, o que eu tenho a dizer é que o WM 6.5 esta realmente muito melhor que o 6.0 (que eu tinha antes no celular).</p>
<p>A tela inicial (Chamada de Titanium se não me engano) ficou bem legal. Poderia ser mais costumizável, mas ficou legal, e com certeza é criativa e foge bastante dos dois padrões existentes atualmente (estilo iPhone com botões e estilo <a href="http://sledge.boo-box.com/list/page/Z29vZ2xlK0FuZHJvaWRfIyNfYm94XyMjX3RhZ2dpbmctdG9vbC13cF8jI18=-60" class="bbli">Android<img src="http://boo-box.com/bbli" alt="[bb]" class="bbic" /></a>/<a href="http://sledge.boo-box.com/list/page/SFRDXyMjX2JveF8jI190YWdnaW5nLXRvb2wtd3BfIyNf-44" class="bbli">HTC<img src="http://boo-box.com/bbli" alt="[bb]" class="bbic" /></a> com muitas informações, widgets e páginas).</p>
<p>O menu &#8220;Honey Comb&#8221; ficou espetacular, é impossível abrir a aplicação errada com este formato de menu, só não gostei do tempo que se leva para organizar manualmente as aplicações, mas pelo menos agora é possível, o que antes não era &#8230;</p>
<p>O Windows Marketplace é um completo fiasco, não tem nada la, deve ter no máximo umas 40 aplicações &#8230;</p>
<p>O Internet Explorer parece bem mais rápido, e o esquema de zoom e navegação em tela cheia desta nova versão ficou beem legal &#8230;</p>
<p>O Media Player Mobile também melhorou, mas não foi nada que realmente chame atenção.</p>
<p>O PIM melhorou bastante, mas não tem nenhum recurso novo excepcional, ja que na minha opinião o anterior não tinha nada faltando (Isto inclui os aplicativos de contatos e calendário).</p>
<p>Não sei se é um problema com a ROM que instalei ou com o WM 6.5, mas na configuração de o que cada botão vai fazer eu posso configurar ações para os botões 1, 2, 3, 5, 6, 6(Hold), é isto ai, ta faltando o botão 4 na lista. Mas isto não chega a ser grave.</p>
<p>Uma das coisas que mais gostei, é que agora o SO todo é &#8220;finger friendly&#8221;, provavelmente por causa da onda de iPhones e Androids e de todo o esforço dos fabricantes para melhorar a interface do WM. Se bem que não tem disculpa para o 6.0 não ser assim, já que já existia o <a href="http://sledge.boo-box.com/list/page/aVBob25lXyMjX2JveF8jI190YWdnaW5nLXRvb2wtd3BfIyNf-48" class="bbli">iPhone<img src="http://boo-box.com/bbli" alt="[bb]" class="bbic" /></a> quando lançaram o WM 6.0 &#8230;</p>
<p>No geral, a performance do PDA/celular melhorou muito com esta nova ROM, não sei o que exatamente causou isto, se foi a versão nova do windows mobile, se é a quantidade de memória livre, mas agora estou bem mais feliz com o meu <a href="http://sledge.boo-box.com/list/page/c21hcnRwaG9uZV8jI19ib3hfIyNfdGFnZ2luZy10b29sLXdwXyMjXw==-56" class="bbli">smartphone<img src="http://boo-box.com/bbli" alt="[bb]" class="bbic" /></a> <img src='http://www.urubatan.com.br/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </p>
<p>PS.: se algum usuário de windows mobile estiver com medo de atualizar a ROM, é só seguir os passo a passo encontrados no forum.xda-developers.com que fica tudo tranqüilo, tem até instruções de como fazer backup da ROM original para uma possível restauração em caso de problemas <img src='http://www.urubatan.com.br/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /><br />
Se quiserem um passo a passo em português aqui no blog é só pedir nos comentários &#8230;</p>
<p>Post de: <a href="http://www.urubatan.com.br">Blog do Urubatan</a><br/>
Quer comprar meu livro <a href="http://livro.urubatan.com.br">Desenvolvimento F&aacute;cil e R&aacute;pido de Aplica&ccedil;&otilde;es web</a> com 30% de desconto? &Eacute; s&oacute; acessar o meu <a href="http://www.urubatan.com.br">blog</a> e pegar o c&oacute;digo :D<br/><br/><a href="http://www.urubatan.com.br/quick-review-windows-mobile-6-5/">Quick Review &#8211; Windows Mobile 6.5</a></p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/BlogDoUrubatan?a=U_SuvKk-kro:CrW2UoFT0hE:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/BlogDoUrubatan?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/BlogDoUrubatan?a=U_SuvKk-kro:CrW2UoFT0hE:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/BlogDoUrubatan?i=U_SuvKk-kro:CrW2UoFT0hE:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/BlogDoUrubatan?a=U_SuvKk-kro:CrW2UoFT0hE:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/BlogDoUrubatan?i=U_SuvKk-kro:CrW2UoFT0hE:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/BlogDoUrubatan?a=U_SuvKk-kro:CrW2UoFT0hE:HCBZNhuKwNY"><img src="http://feeds.feedburner.com/~ff/BlogDoUrubatan?d=HCBZNhuKwNY" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/BlogDoUrubatan?a=U_SuvKk-kro:CrW2UoFT0hE:Iu4eqwUi9wI"><img src="http://feeds.feedburner.com/~ff/BlogDoUrubatan?d=Iu4eqwUi9wI" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/BlogDoUrubatan?a=U_SuvKk-kro:CrW2UoFT0hE:BxLlmz8_Wzw"><img src="http://feeds.feedburner.com/~ff/BlogDoUrubatan?d=BxLlmz8_Wzw" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/BlogDoUrubatan/~4/U_SuvKk-kro" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.urubatan.com.br/quick-review-windows-mobile-6-5/feed/</wfw:commentRss>
		<slash:comments>11</slash:comments>
		<coop:keyword>Mobile</coop:keyword><coop:keyword>pim</coop:keyword><coop:keyword>ppc</coop:keyword><coop:keyword>Review</coop:keyword><coop:keyword>windows mobile</coop:keyword><coop:keyword>wm 6.5</coop:keyword><feedburner:origLink>http://www.urubatan.com.br/quick-review-windows-mobile-6-5/</feedburner:origLink></item>
		<item>
		<title>Ruby on Rails 101 – Encurtador de URLs = Novo Blog</title>
		<link>http://feedproxy.google.com/~r/BlogDoUrubatan/~3/thYW-bCPGDA/</link>
		<comments>http://www.urubatan.com.br/ruby-on-rails-101-encurtador-de-urls-novo-blog/#comments</comments>
		<pubDate>Mon, 11 Jan 2010 16:15:17 +0000</pubDate>
		<dc:creator>Urubatan</dc:creator>
				<category><![CDATA[Artigos]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[rails]]></category>
		<category><![CDATA[101]]></category>
		<category><![CDATA[tutorial]]></category>
		<category><![CDATA[url shortener]]></category>

		<guid isPermaLink="false">http://www.urubatan.com.br/?p=1713</guid>
		<description><![CDATA[Ok, o titulo do post não ficou legal, mas a idéia é que tem tanto encurtador de URLs por ai que eu resolvi fazer um em rails também para brincar um pouco, e como a implementação ficou muito simples, vou tentar transformar isto em um tutorial bem básico de Rails. Mas vejam bem, a idéia [...]<p>Post de: <a href="http://www.urubatan.com.br">Blog do Urubatan</a><br/>
Quer comprar meu livro <a href="http://livro.urubatan.com.br">Desenvolvimento F&aacute;cil e R&aacute;pido de Aplica&ccedil;&otilde;es web</a> com 30% de desconto? &Eacute; s&oacute; acessar o meu <a href="http://www.urubatan.com.br">blog</a> e pegar o c&oacute;digo :D<br/><br/><a href="http://www.urubatan.com.br/ruby-on-rails-101-encurtador-de-urls-novo-blog/">Ruby on Rails 101 &#8211; Encurtador de URLs = Novo Blog</a></p>
]]></description>
			<content:encoded><![CDATA[<p>Ok, o titulo do post não ficou legal, mas a idéia é que tem tanto encurtador de URLs por ai que eu resolvi fazer um em rails também para brincar um pouco, e como a implementação ficou muito simples, vou tentar transformar isto em um tutorial bem básico de Rails.<br />
Mas vejam bem, a idéia é só mostrar o básico, não vou colocar mais um no ar, já tem um excelente feito pelo nosso amigo <a href="http://manoellemos.com/">Manoel Lemos</a>, o <a href="http://zapt.in/">zapt.in</a> onde ele esta adicionando recursos muito legais. Só peguei a idéia por que achei que se tornaria um tutorial mais divertido do que o famoso blog em rails <img src='http://www.urubatan.com.br/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </p>
<p>Primeiro, você vai precisar do <a href="http://sledge.boo-box.com/list/page/UmFpbHMrdXJ1YmF0YW5fIyNfY2xvdWRfIyNfdGFnZ2luZy10b29sLXdwXyMjXw==-64" class="bbli">Rails<img src="http://boo-box.com/bbli" alt="[bb]" class="bbic" /></a> instalado, e para ter o Rails instalado você vai precisar do interpretador Ruby instalado, tem diversos posts sobre isto por ai, mas basicamente numa maquina windows, sugiro instalar o &#8220;Instant Rails&#8221;, num linux instale o Ruby e depois o Ruby Gems e logo depois execute o comando &#8220;gem install rails&#8221;.</p>
<p><i>Deste ponto em diante vou considerar que você já tem o rails instalado e funcionando.</i></p>
<p>Agora com o Rails instalado, vamos começar a desenvolver a aplicação, vou chamar de &#8220;us&#8221; para &#8220;URL Shortener&#8221;, como qualquer projeto rails, vamos começar digitando:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
</pre></td><td class="code"><pre class="dos" style="font-family:monospace;">rails us
<span style="color: #b1b100; font-weight: bold;">cd</span> us</pre></td></tr></table></div>

<p>Uma aplicação rails tem inicialmente a seguinte estrutura de diretórios:</p>
<ul>
<li>app
<ul>
<li>controllers</li>
<li>helpers</li>
<li>models</li>
<li>views
<ul>
<li>layouts</li>
</ul>
</li>
</ul>
</li>
<li>config
<ul>
<li>environments</li>
<li>initializers</li>
<li>locales</li>
</ul>
</li>
<li>db</li>
<li>doc</li>
<li>lib
<ul>
<li>tasks</li>
</ul>
</li>
<li>log</li>
<li>public
<ul>
<li>images</li>
<li>javascripts</li>
<li>stylesheets</li>
</ul>
</li>
<li>script
<ul>
<li>performance</li>
</ul>
</li>
<li>test
<ul>
<li>fixtures</li>
<li>functional</li>
<li>integration</li>
<li>performance</li>
<li>unit</li>
</ul>
</li>
<li>tmp
<ul>
<li>cache</li>
<li>pids</li>
<li>sessions</li>
<li>sockets</li>
</ul>
</li>
<li>vendor
<ul>
<li>plugins</li>
</ul>
</li>
</ul>
<p>Não vou explicar para que serve cada um deles, mas os mais importantes para este mini tutorial são:</p>
<ul>
<li>app/controllers &#8211; onde vão ficar os controladores, o código que faz o meio de campo entre a lógica e a view.</li>
<li>app/models &#8211; onde vão ficar os models, a interface da aplicação com o banco de dados e toda a lógica</li>
<li>app/views &#8211; onde vamos renderizar os dados para os usuários</li>
<li>public/* &#8211; onde ficam os recursos estáticos, como imagens, estilos, javascripts</li>
<li>config &#8211; onde ficam as configurações da aplicação</li>
<li>scripts &#8211; scripts para poupar trabalho, gerar código, rodar servidores, &#8230;</li>
</ul>
<p>A nossa aplicação vai ser composta de dois controladores, um model e algumas views. </p>
<p>O ideal seria começar escrevendo testes, mas como este é um post estilo &#8220;introdução ao rails&#8221; vou deixar os testes de lado.</p>
<p>A primeira coisa que vamos fazer é criar um cadastro básico de URLs, para isto vamos utilizar o gerador do rails, com o seguinte comando:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
</pre></td><td class="code"><pre class="dos" style="font-family:monospace;">ruby script/generate scaffold url_info href:string clicks:integer</pre></td></tr></table></div>

<p>Este comando vai gerar uma série de arquivos, vamso dar uma olhada em alguns deles:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
</pre></td><td class="code"><pre class="rails" style="font-family:monospace;"><span style="color:#9966CC; font-weight:bold;">class</span> UrlInfo <span style="color:#006600; font-weight:bold;">&lt;</span> <span style="color:#6666ff; font-weight:bold;">ActiveRecord::Base</span>
<span style="color:#9966CC; font-weight:bold;">end</span></pre></td></tr></table></div>

<p>Este é o conteúdo do arquivo app/models/url_info.rb, toda a implementação do nosso model para um cadastro simples e, por enquanto, sem validações.</p>
<p>E já podemos inclusive criar o banco de dados padrão da aplicação, o rails veio configurado por padrão para utilizar o banco de dados sqlite3, mas isto pode ser facilmente alterado, mas por enquanto vamos aceitar esta configuração e executar o comando:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
</pre></td><td class="code"><pre class="dos" style="font-family:monospace;">rake db:migrate</pre></td></tr></table></div>

<p>Isto vai executar as migrations da aplicação, uma migration foi criada no último comando, vamos dar uma olhada rápida nela:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
</pre></td><td class="code"><pre class="rails" style="font-family:monospace;"><span style="color:#9966CC; font-weight:bold;">class</span> CreateUrlInfos <span style="color:#006600; font-weight:bold;">&lt;</span> <span style="color:#6666ff; font-weight:bold;">ActiveRecord::Migration</span>
  <span style="color:#9966CC; font-weight:bold;">def</span> <span style="color:#0000FF; font-weight:bold;">self</span>.<span style="color:#9900CC;">up</span>
    create_table <span style="color:#ff3333; font-weight:bold;">:url_infos</span> <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span>t<span style="color:#006600; font-weight:bold;">|</span>
      t.<span style="color:#9900CC;">string</span> <span style="color:#ff3333; font-weight:bold;">:href</span>
      t.<span style="color:#9900CC;">integer</span> <span style="color:#ff3333; font-weight:bold;">:clicks</span>
&nbsp;
      t.<span style="color:#9900CC;">timestamps</span>
    <span style="color:#9966CC; font-weight:bold;">end</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
  <span style="color:#9966CC; font-weight:bold;">def</span> <span style="color:#0000FF; font-weight:bold;">self</span>.<span style="color:#9900CC;">down</span>
    drop_table <span style="color:#ff3333; font-weight:bold;">:url_infos</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
<span style="color:#9966CC; font-weight:bold;">end</span></pre></td></tr></table></div>

<p>Esta migration possui o código para criar uma tabela de nome &#8220;url_infos&#8221;, com um campo de nome &#8220;href&#8221; de tipo &#8220;string&#8221; e um campo &#8220;clicks&#8221; de tipo &#8220;integer&#8221;, o mapeamento do tipo ruby para o tipo SQL vai depender do banco de dados, do driver que o rails utilizar para acessar o banco.</p>
<p>Em uma migration é importatne sempre implementar os dois métodos, o self.up cria coisas no banco de dados, e o self.down apaga coisas do banco de dados, tudo o que for criado no self.up tem que ser apagado no self.down, desta forma permitindo que voltemos a qualquer versão da aplicação para corrigir algum bug se necessário.</p>
<p>No exemplo estamos utilizando os métodos create_table e drop_table da migration, mais informações sobre estes métodos podem ser obtidas <a href="http://api.rubyonrails.org/classes/ActiveRecord/Migration.html">nesta página</a> da documentação do Rails.<br />
<!-–nextpage–-><br />
A configuração de qual banco a aplicação esta acessando fica no arquivo config/database.yml que podemos ver abaixo com o conteúdo padrão:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
</pre></td><td class="code"><pre class="yml" style="font-family:monospace;"># SQLite version 3.x
#   gem install sqlite3-ruby (not necessary on OS X Leopard)
development:
  adapter: sqlite3
  database: db/development.sqlite3
  pool: 5
  timeout: 5000
&nbsp;
# Warning: The database defined as &quot;test&quot; will be erased and
# re-generated from your development database when you run &quot;rake&quot;.
# Do not set this db to the same as development or production.
test:
  adapter: sqlite3
  database: db/test.sqlite3
  pool: 5
  timeout: 5000
&nbsp;
production:
  adapter: sqlite3
  database: db/production.sqlite3
  pool: 5
  timeout: 5000</pre></td></tr></table></div>

<p>Este arquivo tem 3 sessões, correspondentes aos ambientes de desenvolvimento, testes e produção, ou seja, já podemos deixar estes 3 <a href="http://sledge.boo-box.com/list/page/YmFuY29zK2RlK2RhZG9zXyMjX2Nsb3VkXyMjX3RhZ2dpbmctdG9vbC13cF8jI18=-64" class="bbli">bancos de dados<img src="http://boo-box.com/bbli" alt="[bb]" class="bbic" /></a> configurados, o que pode facilitar bastante a vida, ou complicar as vezes <img src='http://www.urubatan.com.br/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </p>
<p>Mas a idéia básica é que em cada ambiente é possível configurar qual o driver do banco de dados &#8220;adapter&#8221;, e os parâmetros deste driver, neste caso apenas o nome do banco é o suficiente, não vou entrar em maiores detalhes aqui por que não é a idéia deste post, quero fazer o encurtador de URLs funcionar antes de você dormir ou cansar de ler &#8230;</p>
<p>Então vamos lá, o rails criou um cadastro completo, que se você digitar o seguinte comando para inicializar o servidor, já pode acessar:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
</pre></td><td class="code"><pre class="dos" style="font-family:monospace;">ruby script/server</pre></td></tr></table></div>

<p>Agora abra o seu browser preferido e acesse o endereço: http://localhost:3000/url_infos</p>
<p>Você vai ver uma listagem de informações de URLs, e quantos clicks cada URL já recebeu, você já pode até cadastrar algumas URLs ai, não vamos mexer muito neste controlador que foi criado, vamos alterar só um pouquinho, não faz sentido na hora do cadastro de uma URL ser necessário informar o número de clicks, então vamos abrir o arquivo app/views/url_infos/edit.html.erb e deixe ele como o que esta abaixo:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
</pre></td><td class="code"><pre class="html" style="font-family:monospace;">&lt;h1&gt;Editing url_info&lt;/h1&gt;
&lt;% form_for(@url_info) do |f| %&gt;
  &lt;%= f.error_messages %&gt;
  &lt;p&gt;
    &lt;%= f.label :href %&gt;&lt;br /&gt;
    &lt;%= f.text_field :href %&gt;
  &lt;/p&gt;
  &lt;p&gt;
    &lt;%= f.submit 'Update' %&gt;
  &lt;/p&gt;
&lt;% end %&gt;
&nbsp;
&lt;%= link_to 'Show', @url_info %&gt; |
&lt;%= link_to 'Back', url_infos_path %&gt;</pre></td></tr></table></div>

<p>(Dica, eu removi o parágrafo que continha o campo &#8220;clicks&#8221;)</p>
<p>Nesta página podemos ver alguns dos helpers do rails para a geração de formulários HTML, e para tratamento de mensagens, a idéia do helper &#8220;form_for&#8221; é que a variável passada como argumento para o bloco representa um formulário para &#8220;aquele elemento&#8221;, isto torna possível utilizar os outros helpers &#8220;formulário.text_field&#8221;.<br />
O Rails tem diversos helpers, tanto para <a href="http://api.rubyonrails.org/classes/ActionView/Helpers/FormHelper.html">formulários</a>, para <a href="http://api.rubyonrails.org/classes/ActionView/Helpers/FormOptionsHelper.html">options</a>,  para <a href="http://api.rubyonrails.org/classes/ActionView/Helpers/PrototypeHelper.html">AJAX</a> e diversos outros.</p>
<p>Agora vamos duplicar a mudança no outro formulário no arquivo app/views/url_infos/new.html.erb</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
</pre></td><td class="code"><pre class="html" style="font-family:monospace;">&lt;h1&gt;New url_info&lt;/h1&gt;
&nbsp;
&lt;% form_for(@url_info) do |f| %&gt;
  &lt;%= f.error_messages %&gt;
&nbsp;
  &lt;p&gt;
    &lt;%= f.label :href %&gt;&lt;br /&gt;
    &lt;%= f.text_field :href %&gt;
  &lt;/p&gt;
  &lt;p&gt;
    &lt;%= f.submit 'Create' %&gt;
  &lt;/p&gt;
&lt;% end %&gt;
&nbsp;
&lt;%= link_to 'Back', url_infos_path %&gt;</pre></td></tr></table></div>

<p>Claro que estes dois arquivos são bem parecidos, e que poderíamos juntar todo o código repetido dos dois, mas vamos deixar isto para depois, por enquanto isto não nos interessa muito.</p>
<p>Agora vamos editar o controlador no arquivo app/controllers/url_infos_controller.rb</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
</pre></td><td class="code"><pre class="rails" style="font-family:monospace;"><span style="color:#9966CC; font-weight:bold;">class</span> UrlInfosController <span style="color:#006600; font-weight:bold;">&lt;</span> ApplicationController
  <span style="color:#008000; font-style:italic;"># GET /url_infos</span>
  <span style="color:#008000; font-style:italic;"># GET /url_infos.xml</span>
  <span style="color:#9966CC; font-weight:bold;">def</span> index
    <span style="color:#0066ff; font-weight:bold;">@url_infos</span> = UrlInfo.<span style="color:#9900CC;">all</span>
&nbsp;
    <span style="color:#5A0A0A; font-weight:bold;">respond_to</span> <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span>format<span style="color:#006600; font-weight:bold;">|</span>
      <span style="color:#CC0066; font-weight:bold;">format</span>.<span style="color:#9900CC;">html</span> <span style="color:#008000; font-style:italic;"># index.html.erb</span>
      <span style="color:#CC0066; font-weight:bold;">format</span>.<span style="color:#9900CC;">xml</span>  <span style="color:#006600; font-weight:bold;">&#123;</span> <span style="color:#5A0A0A; font-weight:bold;">render</span> <span style="color:#ff3333; font-weight:bold;">:xml</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#0066ff; font-weight:bold;">@url_infos</span> <span style="color:#006600; font-weight:bold;">&#125;</span>
    <span style="color:#9966CC; font-weight:bold;">end</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
  <span style="color:#008000; font-style:italic;"># GET /url_infos/1</span>
  <span style="color:#008000; font-style:italic;"># GET /url_infos/1.xml</span>
  <span style="color:#9966CC; font-weight:bold;">def</span> <span style="color:#5A0A0A; font-weight:bold;">show</span>
    <span style="color:#0066ff; font-weight:bold;">@url_info</span> = UrlInfo.<span style="color:#9900CC;">find</span><span style="color:#006600; font-weight:bold;">&#40;</span>params<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#ff3333; font-weight:bold;">:id</span><span style="color:#006600; font-weight:bold;">&#93;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
&nbsp;
    <span style="color:#5A0A0A; font-weight:bold;">respond_to</span> <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span>format<span style="color:#006600; font-weight:bold;">|</span>
      <span style="color:#CC0066; font-weight:bold;">format</span>.<span style="color:#9900CC;">html</span> <span style="color:#008000; font-style:italic;"># show.html.erb</span>
      <span style="color:#CC0066; font-weight:bold;">format</span>.<span style="color:#9900CC;">xml</span>  <span style="color:#006600; font-weight:bold;">&#123;</span> <span style="color:#5A0A0A; font-weight:bold;">render</span> <span style="color:#ff3333; font-weight:bold;">:xml</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#0066ff; font-weight:bold;">@url_info</span> <span style="color:#006600; font-weight:bold;">&#125;</span>
    <span style="color:#9966CC; font-weight:bold;">end</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
  <span style="color:#008000; font-style:italic;"># GET /url_infos/new</span>
  <span style="color:#008000; font-style:italic;"># GET /url_infos/new.xml</span>
  <span style="color:#9966CC; font-weight:bold;">def</span> <span style="color:#5A0A0A; font-weight:bold;">new</span>
    <span style="color:#0066ff; font-weight:bold;">@url_info</span> = UrlInfo.<span style="color:#5A0A0A; font-weight:bold;">new</span>
&nbsp;
    <span style="color:#5A0A0A; font-weight:bold;">respond_to</span> <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span>format<span style="color:#006600; font-weight:bold;">|</span>
      <span style="color:#CC0066; font-weight:bold;">format</span>.<span style="color:#9900CC;">html</span> <span style="color:#008000; font-style:italic;"># new.html.erb</span>
      <span style="color:#CC0066; font-weight:bold;">format</span>.<span style="color:#9900CC;">xml</span>  <span style="color:#006600; font-weight:bold;">&#123;</span> <span style="color:#5A0A0A; font-weight:bold;">render</span> <span style="color:#ff3333; font-weight:bold;">:xml</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#0066ff; font-weight:bold;">@url_info</span> <span style="color:#006600; font-weight:bold;">&#125;</span>
    <span style="color:#9966CC; font-weight:bold;">end</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
  <span style="color:#008000; font-style:italic;"># GET /url_infos/1/edit</span>
  <span style="color:#9966CC; font-weight:bold;">def</span> edit
    <span style="color:#0066ff; font-weight:bold;">@url_info</span> = UrlInfo.<span style="color:#9900CC;">find</span><span style="color:#006600; font-weight:bold;">&#40;</span>params<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#ff3333; font-weight:bold;">:id</span><span style="color:#006600; font-weight:bold;">&#93;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
  <span style="color:#008000; font-style:italic;"># POST /url_infos</span>
  <span style="color:#008000; font-style:italic;"># POST /url_infos.xml</span>
  <span style="color:#9966CC; font-weight:bold;">def</span> create
    <span style="color:#0066ff; font-weight:bold;">@url_info</span> = UrlInfo.<span style="color:#5A0A0A; font-weight:bold;">new</span><span style="color:#006600; font-weight:bold;">&#40;</span>params<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#ff3333; font-weight:bold;">:url_info</span><span style="color:#006600; font-weight:bold;">&#93;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
    <span style="color:#0066ff; font-weight:bold;">@url_info</span>.<span style="color:#9900CC;">clicks</span> = <span style="color:#006666;">0</span>
    <span style="color:#5A0A0A; font-weight:bold;">respond_to</span> <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span>format<span style="color:#006600; font-weight:bold;">|</span>
      <span style="color:#9966CC; font-weight:bold;">if</span> <span style="color:#0066ff; font-weight:bold;">@url_info</span>.<span style="color:#5A0A0A; font-weight:bold;">save</span>
        <span style="color:#5A0A0A; font-weight:bold;">flash</span><span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#ff3333; font-weight:bold;">:notice</span><span style="color:#006600; font-weight:bold;">&#93;</span> = <span style="color:#996600;">'UrlInfo was successfully created.'</span>
        <span style="color:#CC0066; font-weight:bold;">format</span>.<span style="color:#9900CC;">html</span> <span style="color:#006600; font-weight:bold;">&#123;</span> <span style="color:#5A0A0A; font-weight:bold;">redirect_to</span><span style="color:#006600; font-weight:bold;">&#40;</span>@url_info<span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#006600; font-weight:bold;">&#125;</span>
        <span style="color:#CC0066; font-weight:bold;">format</span>.<span style="color:#9900CC;">xml</span>  <span style="color:#006600; font-weight:bold;">&#123;</span> <span style="color:#5A0A0A; font-weight:bold;">render</span> <span style="color:#ff3333; font-weight:bold;">:xml</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#0066ff; font-weight:bold;">@url_info</span>, <span style="color:#ff3333; font-weight:bold;">:status</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#ff3333; font-weight:bold;">:created</span>, <span style="color:#ff3333; font-weight:bold;">:location</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#0066ff; font-weight:bold;">@url_info</span> <span style="color:#006600; font-weight:bold;">&#125;</span>
      <span style="color:#9966CC; font-weight:bold;">else</span>
        <span style="color:#CC0066; font-weight:bold;">format</span>.<span style="color:#9900CC;">html</span> <span style="color:#006600; font-weight:bold;">&#123;</span> <span style="color:#5A0A0A; font-weight:bold;">render</span> <span style="color:#ff3333; font-weight:bold;">:action</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#996600;">&quot;new&quot;</span> <span style="color:#006600; font-weight:bold;">&#125;</span>
        <span style="color:#CC0066; font-weight:bold;">format</span>.<span style="color:#9900CC;">xml</span>  <span style="color:#006600; font-weight:bold;">&#123;</span> <span style="color:#5A0A0A; font-weight:bold;">render</span> <span style="color:#ff3333; font-weight:bold;">:xml</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#0066ff; font-weight:bold;">@url_info</span>.<span style="color:#5A0A0A; font-weight:bold;">errors</span>, <span style="color:#ff3333; font-weight:bold;">:status</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#ff3333; font-weight:bold;">:unprocessable_entity</span> <span style="color:#006600; font-weight:bold;">&#125;</span>
      <span style="color:#9966CC; font-weight:bold;">end</span>
    <span style="color:#9966CC; font-weight:bold;">end</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
  <span style="color:#008000; font-style:italic;"># PUT /url_infos/1</span>
  <span style="color:#008000; font-style:italic;"># PUT /url_infos/1.xml</span>
  <span style="color:#9966CC; font-weight:bold;">def</span> <span style="color:#5A0A0A; font-weight:bold;">update</span>
    <span style="color:#0066ff; font-weight:bold;">@url_info</span> = UrlInfo.<span style="color:#9900CC;">find</span><span style="color:#006600; font-weight:bold;">&#40;</span>params<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#ff3333; font-weight:bold;">:id</span><span style="color:#006600; font-weight:bold;">&#93;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
&nbsp;
    <span style="color:#5A0A0A; font-weight:bold;">respond_to</span> <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span>format<span style="color:#006600; font-weight:bold;">|</span>
      <span style="color:#9966CC; font-weight:bold;">if</span> <span style="color:#0066ff; font-weight:bold;">@url_info</span>.<span style="color:#9900CC;">update_attributes</span><span style="color:#006600; font-weight:bold;">&#40;</span>params<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#ff3333; font-weight:bold;">:url_info</span><span style="color:#006600; font-weight:bold;">&#93;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
        <span style="color:#5A0A0A; font-weight:bold;">flash</span><span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#ff3333; font-weight:bold;">:notice</span><span style="color:#006600; font-weight:bold;">&#93;</span> = <span style="color:#996600;">'UrlInfo was successfully updated.'</span>
        <span style="color:#CC0066; font-weight:bold;">format</span>.<span style="color:#9900CC;">html</span> <span style="color:#006600; font-weight:bold;">&#123;</span> <span style="color:#5A0A0A; font-weight:bold;">redirect_to</span><span style="color:#006600; font-weight:bold;">&#40;</span>@url_info<span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#006600; font-weight:bold;">&#125;</span>
        <span style="color:#CC0066; font-weight:bold;">format</span>.<span style="color:#9900CC;">xml</span>  <span style="color:#006600; font-weight:bold;">&#123;</span> head <span style="color:#ff3333; font-weight:bold;">:ok</span> <span style="color:#006600; font-weight:bold;">&#125;</span>
      <span style="color:#9966CC; font-weight:bold;">else</span>
        <span style="color:#CC0066; font-weight:bold;">format</span>.<span style="color:#9900CC;">html</span> <span style="color:#006600; font-weight:bold;">&#123;</span> <span style="color:#5A0A0A; font-weight:bold;">render</span> <span style="color:#ff3333; font-weight:bold;">:action</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#996600;">&quot;edit&quot;</span> <span style="color:#006600; font-weight:bold;">&#125;</span>
        <span style="color:#CC0066; font-weight:bold;">format</span>.<span style="color:#9900CC;">xml</span>  <span style="color:#006600; font-weight:bold;">&#123;</span> <span style="color:#5A0A0A; font-weight:bold;">render</span> <span style="color:#ff3333; font-weight:bold;">:xml</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#0066ff; font-weight:bold;">@url_info</span>.<span style="color:#5A0A0A; font-weight:bold;">errors</span>, <span style="color:#ff3333; font-weight:bold;">:status</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#ff3333; font-weight:bold;">:unprocessable_entity</span> <span style="color:#006600; font-weight:bold;">&#125;</span>
      <span style="color:#9966CC; font-weight:bold;">end</span>
    <span style="color:#9966CC; font-weight:bold;">end</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
  <span style="color:#008000; font-style:italic;"># DELETE /url_infos/1</span>
  <span style="color:#008000; font-style:italic;"># DELETE /url_infos/1.xml</span>
  <span style="color:#9966CC; font-weight:bold;">def</span> <span style="color:#5A0A0A; font-weight:bold;">destroy</span>
    <span style="color:#0066ff; font-weight:bold;">@url_info</span> = UrlInfo.<span style="color:#9900CC;">find</span><span style="color:#006600; font-weight:bold;">&#40;</span>params<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#ff3333; font-weight:bold;">:id</span><span style="color:#006600; font-weight:bold;">&#93;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
    <span style="color:#0066ff; font-weight:bold;">@url_info</span>.<span style="color:#5A0A0A; font-weight:bold;">destroy</span>
&nbsp;
    <span style="color:#5A0A0A; font-weight:bold;">respond_to</span> <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span>format<span style="color:#006600; font-weight:bold;">|</span>
      <span style="color:#CC0066; font-weight:bold;">format</span>.<span style="color:#9900CC;">html</span> <span style="color:#006600; font-weight:bold;">&#123;</span> <span style="color:#5A0A0A; font-weight:bold;">redirect_to</span><span style="color:#006600; font-weight:bold;">&#40;</span>url_infos_url<span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#006600; font-weight:bold;">&#125;</span>
      <span style="color:#CC0066; font-weight:bold;">format</span>.<span style="color:#9900CC;">xml</span>  <span style="color:#006600; font-weight:bold;">&#123;</span> head <span style="color:#ff3333; font-weight:bold;">:ok</span> <span style="color:#006600; font-weight:bold;">&#125;</span>
    <span style="color:#9966CC; font-weight:bold;">end</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
<span style="color:#9966CC; font-weight:bold;">end</span></pre></td></tr></table></div>

<p>A única alteração do código gerado foi a adição da linha &#8220;@url_info.clicks = 0&#8243; no método create, que informa aquele parâmetro que removemos do formulário.</p>
<p>Neste arquivo podemos também ver alguns métodos interessantes do rails, veja na lista abaixo a explicação de alguns deles:</p>
<ul>
<li>UrlInfo.all &#8211; A classe <a href="http://api.rubyonrails.org/classes/ActiveRecord/Base.html">ActiveRecord::Base</a> do rails tem diversos métodos para pesquisa, o all é um alias para find(:all) e aceita os mesmos parâmetros</li>
<li>respond_to &#8211; O bloco respond_to informa ao rails como <a href="http://api.rubyonrails.org/classes/ActionController/MimeResponds/InstanceMethods.html">responder para diferentes tipos mime</a></li>
<li>render &#8211; Este é o método que realmente envia a resposta para o cliente, ele possui diversos parâmetros que permitem o envio de respostas AJAX, XML, HTML e diversas outras de forma normalmente transparante, a documentação pode ser encontrada <a href="http://api.rubyonrails.org/classes/ActionController/Base.html#M000658">aqui.</a></li>
<li>@url_inf.save &#8211; save é o método da classe <a href="http://api.rubyonrails.org/classes/ActiveRecord/Base.html">ActiveRecord::Base</a> que insere ou altera o conteúdo de um registro de uma tabela.</li>
<li>@url_info.update_attributes &#8211; este é o método da classe <a href="http://api.rubyonrails.org/classes/ActiveRecord/Base.html">ActiveRecord::Base</a> que atualiza os atributos de um registro alterados e salva as alterações no banco de dados</li>
<li>params[...] &#8211; params é um hash que permite acesso aos parâmetros enviados pelo usuário</li>
<li>@url_info.destroy &#8211; este é o método utilizado para apagar um registro do banco de dados</li>
<li>format. &#8211; format.<mimetype> dentro de um bloco &#8220;respond_to&#8221; informa ao rails quais tipos mime este método sabe retornar, assim o rails decide qual o mais adequado a solicitação do usuário</li>
<li>UrlInfo.find &#8211; A classe <a href="http://api.rubyonrails.org/classes/ActiveRecord/Base.html">ActiveRecord::Base</a> do rails tem diversos métodos para pesquisa, o método find é a base para a maioria deles</li>
<li>redirect_to &#8211; este método permite enviar ao browser um código de redirecionamento HTTP</li>
</ul>
<p>Acho que por enquanto já esta bom de alterações no cadastro, vamos fazer o encurtador de URLs funcionar.<br />
<!-–nextpage–-><br />
Para isto vamos criar mais um controlador, execute no console o seguinte comando:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
</pre></td><td class="code"><pre class="dos" style="font-family:monospace;">ruby script/generate controller redirector index</pre></td></tr></table></div>

<p>Como o nome diz, este é o controlador que vai fazer os redirecionamentos, depois deste comando executado, o arquivo app/controllers/redirector_controller.rb foi criado, vamos editar este arquivo para que ele fique mais ou menos assim:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
</pre></td><td class="code"><pre class="rails" style="font-family:monospace;"><span style="color:#9966CC; font-weight:bold;">class</span> RedirectorController <span style="color:#006600; font-weight:bold;">&lt;</span> ApplicationController
  <span style="color:#9966CC; font-weight:bold;">def</span> index
	  ui = UrlInfo.<span style="color:#9900CC;">find</span> params<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#ff3333; font-weight:bold;">:id</span><span style="color:#006600; font-weight:bold;">&#93;</span>
	  <span style="color:#5A0A0A; font-weight:bold;">redirect_to</span> ui.<span style="color:#9900CC;">href</span> <span style="color:#9966CC; font-weight:bold;">if</span> ui
  <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
<span style="color:#9966CC; font-weight:bold;">end</span></pre></td></tr></table></div>

<p>Isto já faz o redirecionador funcionar, mas não exatamente da maneira que gostaríamos <img src='http://www.urubatan.com.br/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </p>
<p>Por enquanto para ele funcionar precisamos acessar http://localhost:3000/redirector?id=&#8230; a idéia é que funcione acessando http://localhost:3000/[id]</p>
<p>Quando o id for passado o redirecionamento deve ocorrer automagicamente, quando não for passado devemos ver a lista de links conhecidos com quantos clicks cada um já teve.</p>
<p>Para que isto funcione vamos editar o arquivo config/routes.rb como no exemplo abaixo (vou apagar todos os comentários para facilitar a leitura do arquivo, comentários em Ruby são as linhas começadas por &#8220;#&#8221;).</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
</pre></td><td class="code"><pre class="rails" style="font-family:monospace;"><span style="color:#6666ff; font-weight:bold;">ActionController::Routing::Routes</span>.<span style="color:#9900CC;">draw</span> <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span>map<span style="color:#006600; font-weight:bold;">|</span>
  map.<span style="color:#9900CC;">resources</span> <span style="color:#ff3333; font-weight:bold;">:url_infos</span>
&nbsp;
  map.<span style="color:#9900CC;">connect</span> <span style="color:#996600;">':id'</span>, <span style="color:#ff3333; font-weight:bold;">:controller</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#996600;">'redirector'</span>, <span style="color:#ff3333; font-weight:bold;">:action</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#996600;">'index'</span>
<span style="color:#9966CC; font-weight:bold;">end</span></pre></td></tr></table></div>

<p>A linha map.resources :url_infos foi gerada automaticamente com o scaffold, ela configura todas as rotas para o cadastro de URLs.<br />
Esta linha configura as seguitnes rotas na aplicação:</p>
<table width="100%">
<tr>
<th>Nome</th>
<th>Método HTTP</th>
<th>Caminho</th>
<th>Mapeamento</th>
</tr>
<tr>
<td>url_infos</td>
<td>GET</td>
<td>/url_infos(.:format)</td>
<td>{:action=>&#8221;index&#8221;, :controller=>&#8221;url_infos&#8221;}</td>
</tr>
<tr>
<td>&nbsp;</td>
<td>POST</td>
<td>/url_infos(.:format)</td>
<td>{:action=>&#8221;create&#8221;, :controller=>&#8221;url_infos&#8221;}</td>
</tr>
<tr>
<td>new_url_info</td>
<td>GET</td>
<td>/url_infos/new(.:format)</td>
<td>{:action=>&#8221;new&#8221;, :controller=>&#8221;url_infos&#8221;}</td>
</tr>
<tr>
<td>edit_url_info</td>
<td>GET</td>
<td>/url_infos/:id/edit(.:format)</td>
<td>{:action=>&#8221;edit&#8221;, :controller=>&#8221;url_infos&#8221;}</td>
</tr>
<tr>
<td>url_info</td>
<td>GET</td>
<td>/url_infos/:id(.:format)</td>
<td>{:action=>&#8221;show&#8221;, :controller=>&#8221;url_infos&#8221;}</td>
</tr>
<tr>
<td>&nbsp;</td>
<td>PUT</td>
<td>/url_infos/:id(.:format)</td>
<td>{:action=>&#8221;update&#8221;, :controller=>&#8221;url_infos&#8221;}</td>
</tr>
<tr>
<td>&nbsp;</td>
<td>DELETE</td>
<td>/url_infos/:id(.:format)</td>
<td>{:action=>&#8221;destroy&#8221;, :controller=>&#8221;url_infos&#8221;}</td>
</tr>
</table>
<p>A segunda linha configura a aplicação para quando receber apenas um parâmetro passar isto para o controlador de nome &#8220;redirector&#8221; para a action &#8220;index&#8221;, agora se acessarmos o endereço http://localhost:3000/1 a aplicação vai nos redirecionar para a primeira URL cadastrada, mas ainda não esta legal, precisamos contar os clicks tabém.</p>
<p>Para contar o clicks vamos alterar o redirector controller que editamos antes, o código dele vai ficar assim:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
</pre></td><td class="code"><pre class="rails" style="font-family:monospace;"><span style="color:#9966CC; font-weight:bold;">class</span> RedirectorController <span style="color:#006600; font-weight:bold;">&lt;</span> ApplicationController
  <span style="color:#9966CC; font-weight:bold;">def</span> index
        ui = UrlInfo.<span style="color:#9900CC;">find</span> params<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#ff3333; font-weight:bold;">:id</span><span style="color:#006600; font-weight:bold;">&#93;</span>
        <span style="color:#9966CC; font-weight:bold;">if</span> ui
                ui.<span style="color:#9900CC;">clicks</span> <span style="color:#006600; font-weight:bold;">+</span>= <span style="color:#006666;">1</span>
                ui.<span style="color:#5A0A0A; font-weight:bold;">save</span>
                <span style="color:#5A0A0A; font-weight:bold;">redirect_to</span> ui.<span style="color:#9900CC;">href</span>
        <span style="color:#9966CC; font-weight:bold;">end</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
<span style="color:#9966CC; font-weight:bold;">end</span></pre></td></tr></table></div>

<p>Agora antes de redirecionar a quantidade de clicks é incrementada e a informação é salva no banco de dados.</p>
<p>Agora vamos mudar a página inicial para a listagem de URLs, temos duas formas de fazer isto,  forma chinelona:<br />
Editar o arquivo public/index.html e configurar um meta refresh, o conteúdo fica como abaixo (HTML padrão).</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
</pre></td><td class="code"><pre class="html" style="font-family:monospace;">&lt;!DOCTYPE html PUBLIC &quot;-//W3C//DTD XHTML 1.0 Transitional//EN&quot;
        &quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&quot;&gt;
&lt;html&gt;
  &lt;head&gt;
    &lt;meta http-equiv=&quot;refresh&quot; content=&quot;0;url=url_infos&quot; /&gt;
    &lt;title&gt;Mega URL Shortener Sample&lt;/title&gt;
  &lt;/head&gt;
  &lt;body&gt;
  &lt;a href=&quot;url_infos&quot;&gt;Link List&lt;/a&gt;
  &lt;/body&gt;
&lt;/html&gt;</pre></td></tr></table></div>

<p>Ou apagar o arquivo public/index.html, e editar novamente o arquivo config/routes.rb, verifique abaixo o conteúdo alterado.</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
</pre></td><td class="code"><pre class="rails" style="font-family:monospace;"><span style="color:#6666ff; font-weight:bold;">ActionController::Routing::Routes</span>.<span style="color:#9900CC;">draw</span> <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span>map<span style="color:#006600; font-weight:bold;">|</span>
  map.<span style="color:#9900CC;">resources</span> <span style="color:#ff3333; font-weight:bold;">:url_infos</span>
  map.<span style="color:#9900CC;">root</span> <span style="color:#ff3333; font-weight:bold;">:controller</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#996600;">'url_infos'</span>
  map.<span style="color:#9900CC;">connect</span> <span style="color:#996600;">':id'</span>, <span style="color:#ff3333; font-weight:bold;">:controller</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#996600;">'redirector'</span>, <span style="color:#ff3333; font-weight:bold;">:action</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#996600;">'index'</span>
<span style="color:#9966CC; font-weight:bold;">end</span></pre></td></tr></table></div>

<p>Foi adicionada a linha &#8220;map.root :controller => &#8216;url_infos&#8217;&#8221; que informa qual a ação padrão da aplicação.</p>
<p>E com isto já temos o encurtador de URLs quase pronto, faltam alguns detalhes, primeiro no arquivo app/views/redirector/index.html.erb vamos adicionar uma mensagem dizendo que a URL não esta cadastrada.</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
</pre></td><td class="code"><pre class="html" style="font-family:monospace;">&lt;b&gt;A URL informada não esta cadastrada no sistema&lt;/b&gt;</pre></td></tr></table></div>

<p>Isto vai funcionar por que o controlador &#8220;redirector&#8221; só chama o redirect se a &#8220;UrlInfo&#8221; for encontrada, caso contrário ele executa a ação default, que é renderizar a &#8220;view&#8221; correspondente ao método.</p>
<p>Agora vamos apagar alguns arquivos no diretório app/views/url_infos/, siga a lista:</p>
<ul>
<li>edit.html.erb</li>
<li>new.html.erb</li>
<li>show.html.erb</li>
</ul>
<p>Vamos editar o arquivo index.html.erb no mesmo diretório:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
</pre></td><td class="code"><pre class="html" style="font-family:monospace;">&lt;h1&gt;Shortened URLs&lt;/h1&gt;
&lt;div id=&quot;form&quot;&gt;
&lt;%= render :partial =&gt; 'editor_form' %&gt;
&lt;/div&gt;
&lt;div id=&quot;table&quot;&gt;
&lt;%= render :partial =&gt; 'urls_table' %&gt;
&lt;/div&gt;</pre></td></tr></table></div>

<p>Todo o conteúdo deste arquivo foi movido para dois partials, partials são uma forma de reutilizar código de views no rails, mas neste caso estaremos utilizando partials para implementar um pouco de AJAX.</p>
<p>A idéia é que o formulário do topo da página seja submetido via ajax e que atualize apenas o pedaço da página que for necessário, veja abaixo como ficaram os dois partials:<br />
<b>_editor_form.html.erb</b></p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
</pre></td><td class="code"><pre class="html" style="font-family:monospace;">&lt;% form_remote_for(@url_info) do |f| %&gt;
  &lt;%= f.error_messages %&gt;
  &lt;p&gt;
    &lt;%= f.label :href, 'URL:' %&gt;
    &lt;%= f.text_field :href %&gt;
    &lt;%= f.submit 'Create' %&gt;
  &lt;/p&gt;
&lt;% end %&gt;</pre></td></tr></table></div>

<p>Neste formulário estamos utilizando o helper &#8220;form_for_remote&#8221; que cria um formulário que sera submetido via AJAX, não fazendo refresh da página toda de uma só vez.<br />
<b>_urls_table.html.erb</b></p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
</pre></td><td class="code"><pre class="html" style="font-family:monospace;">&lt;table width=&quot;100%&quot;&gt;
  &lt;tr&gt;
    &lt;th&gt;Original URL&lt;/th&gt;
    &lt;th&gt;Shortened URL&lt;/th&gt;
    &lt;th&gt;Clicks&lt;/th&gt;
  &lt;/tr&gt;
&lt;% @url_infos.each do |url_info| %&gt;
  &lt;tr&gt;
    &lt;td&gt;&lt;%=h url_info.href %&gt;&lt;/td&gt;
    &lt;td&gt;&lt;%=h url_for(:controller =&gt; 'redirector', :id =&gt; url_info.id, :only_path =&gt; false) %&gt;&lt;/td&gt;
    &lt;td&gt;&lt;%=h url_info.clicks %&gt;&lt;/td&gt;
    &lt;td&gt;&lt;%= link_to 'Go To', :controller =&gt; 'redirector', :id =&gt; url_info.id %&gt;&lt;/td&gt;
    &lt;td&gt;&lt;%= link_to 'Destroy', url_info, :confirm =&gt; 'Are you sure?', :method =&gt; :delete %&gt;&lt;/td&gt;
  &lt;/tr&gt;
&lt;% end %&gt;
&lt;/table&gt;</pre></td></tr></table></div>

<p>A tabela não sofreu alterações grandes, apenas foi colocado mais um campo para mostrar qual a URL no sistema correspondente a uma URL cadastrada, e para que isto ficasse dinâmico, o helper &#8220;url_for&#8221; for utilizado, com o parâmetro &#8220;:only_path&#8221; setado para false, desta forma a URL completa seria impressa.</p>
<p>Para que este formulário via <a href="http://sledge.boo-box.com/list/page/QUpBWF8jI19jbG91ZF8jI190YWdnaW5nLXRvb2wtd3BfIyNf-48" class="bbli">AJAX<img src="http://boo-box.com/bbli" alt="[bb]" class="bbic" /></a> funcione, algumas alterações precisaram ser feitas no controlados &#8220;url_infos&#8221;, como pode ser visto abaixo:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
</pre></td><td class="code"><pre class="rails" style="font-family:monospace;"><span style="color:#9966CC; font-weight:bold;">class</span> UrlInfosController <span style="color:#006600; font-weight:bold;">&lt;</span> ApplicationController
  <span style="color:#008000; font-style:italic;"># GET /url_infos</span>
  <span style="color:#008000; font-style:italic;"># GET /url_infos.xml</span>
  <span style="color:#9966CC; font-weight:bold;">def</span> index
    <span style="color:#0066ff; font-weight:bold;">@url_infos</span> = UrlInfo.<span style="color:#9900CC;">all</span>
    <span style="color:#0066ff; font-weight:bold;">@url_info</span> = UrlInfo.<span style="color:#5A0A0A; font-weight:bold;">new</span>
&nbsp;
    <span style="color:#5A0A0A; font-weight:bold;">respond_to</span> <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span>format<span style="color:#006600; font-weight:bold;">|</span>
      <span style="color:#CC0066; font-weight:bold;">format</span>.<span style="color:#9900CC;">html</span> <span style="color:#008000; font-style:italic;"># index.html.erb</span>
      <span style="color:#CC0066; font-weight:bold;">format</span>.<span style="color:#9900CC;">xml</span>  <span style="color:#006600; font-weight:bold;">&#123;</span> <span style="color:#5A0A0A; font-weight:bold;">render</span> <span style="color:#ff3333; font-weight:bold;">:xml</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#0066ff; font-weight:bold;">@url_infos</span> <span style="color:#006600; font-weight:bold;">&#125;</span>
    <span style="color:#9966CC; font-weight:bold;">end</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
  <span style="color:#008000; font-style:italic;"># POST /url_infos</span>
  <span style="color:#008000; font-style:italic;"># POST /url_infos.xml</span>
  <span style="color:#9966CC; font-weight:bold;">def</span> create
    <span style="color:#0066ff; font-weight:bold;">@url_info</span> = UrlInfo.<span style="color:#5A0A0A; font-weight:bold;">new</span><span style="color:#006600; font-weight:bold;">&#40;</span>params<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#ff3333; font-weight:bold;">:url_info</span><span style="color:#006600; font-weight:bold;">&#93;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
    <span style="color:#0066ff; font-weight:bold;">@url_info</span>.<span style="color:#9900CC;">href</span> = params<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#ff3333; font-weight:bold;">:href</span><span style="color:#006600; font-weight:bold;">&#93;</span> <span style="color:#9966CC; font-weight:bold;">if</span> params<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#ff3333; font-weight:bold;">:href</span><span style="color:#006600; font-weight:bold;">&#93;</span>
    <span style="color:#0066ff; font-weight:bold;">@url_info</span>.<span style="color:#9900CC;">clicks</span> = <span style="color:#006666;">0</span>
    <span style="color:#5A0A0A; font-weight:bold;">respond_to</span> <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span>format<span style="color:#006600; font-weight:bold;">|</span>
      <span style="color:#9966CC; font-weight:bold;">if</span> <span style="color:#0066ff; font-weight:bold;">@url_info</span>.<span style="color:#5A0A0A; font-weight:bold;">save</span>
        <span style="color:#CC0066; font-weight:bold;">format</span>.<span style="color:#9900CC;">html</span>  <span style="color:#9966CC; font-weight:bold;">do</span>
          <span style="color:#5A0A0A; font-weight:bold;">flash</span><span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#ff3333; font-weight:bold;">:notice</span><span style="color:#006600; font-weight:bold;">&#93;</span> = <span style="color:#996600;">'UrlInfo was successfully created.'</span>
          <span style="color:#5A0A0A; font-weight:bold;">redirect_to</span> root_url
        <span style="color:#9966CC; font-weight:bold;">end</span>
        <span style="color:#CC0066; font-weight:bold;">format</span>.<span style="color:#9900CC;">xml</span>  <span style="color:#006600; font-weight:bold;">&#123;</span> <span style="color:#5A0A0A; font-weight:bold;">render</span> <span style="color:#ff3333; font-weight:bold;">:xml</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#0066ff; font-weight:bold;">@url_info</span>, <span style="color:#ff3333; font-weight:bold;">:status</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#ff3333; font-weight:bold;">:created</span>, <span style="color:#ff3333; font-weight:bold;">:location</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#0066ff; font-weight:bold;">@url_info</span> <span style="color:#006600; font-weight:bold;">&#125;</span>
	<span style="color:#CC0066; font-weight:bold;">format</span>.<span style="color:#9900CC;">js</span>  <span style="color:#9966CC; font-weight:bold;">do</span>
          <span style="color:#0066ff; font-weight:bold;">@url_infos</span> = UrlInfo.<span style="color:#9900CC;">all</span>
          <span style="color:#0066ff; font-weight:bold;">@url_info</span> = UrlInfo.<span style="color:#5A0A0A; font-weight:bold;">new</span>
          <span style="color:#5A0A0A; font-weight:bold;">render</span> <span style="color:#ff3333; font-weight:bold;">:update</span> <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span>page<span style="color:#006600; font-weight:bold;">|</span>
            page.<span style="color:#5A0A0A; font-weight:bold;">replace_html</span> <span style="color:#996600;">'form'</span>, <span style="color:#ff3333; font-weight:bold;">:partial</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#996600;">'editor_form'</span>
            page.<span style="color:#5A0A0A; font-weight:bold;">replace_html</span> <span style="color:#996600;">'table'</span>, <span style="color:#ff3333; font-weight:bold;">:partial</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#996600;">'urls_table'</span>
            page.<span style="color:#5A0A0A; font-weight:bold;">alert</span> <span style="color:#996600;">'UrlInfo was successfully created.'</span>
          <span style="color:#9966CC; font-weight:bold;">end</span> 
        <span style="color:#9966CC; font-weight:bold;">end</span>
      <span style="color:#9966CC; font-weight:bold;">else</span>
        <span style="color:#CC0066; font-weight:bold;">format</span>.<span style="color:#9900CC;">html</span> <span style="color:#006600; font-weight:bold;">&#123;</span> <span style="color:#5A0A0A; font-weight:bold;">render</span> <span style="color:#ff3333; font-weight:bold;">:action</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#996600;">&quot;index&quot;</span> <span style="color:#006600; font-weight:bold;">&#125;</span>
        <span style="color:#CC0066; font-weight:bold;">format</span>.<span style="color:#9900CC;">xml</span>  <span style="color:#006600; font-weight:bold;">&#123;</span> <span style="color:#5A0A0A; font-weight:bold;">render</span> <span style="color:#ff3333; font-weight:bold;">:xml</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#0066ff; font-weight:bold;">@url_info</span>.<span style="color:#5A0A0A; font-weight:bold;">errors</span>, <span style="color:#ff3333; font-weight:bold;">:status</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#ff3333; font-weight:bold;">:unprocessable_entity</span> <span style="color:#006600; font-weight:bold;">&#125;</span>
        <span style="color:#CC0066; font-weight:bold;">format</span>.<span style="color:#9900CC;">js</span> <span style="color:#9966CC; font-weight:bold;">do</span>
          <span style="color:#5A0A0A; font-weight:bold;">render</span> <span style="color:#ff3333; font-weight:bold;">:update</span> <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span>page<span style="color:#006600; font-weight:bold;">|</span>
            page.<span style="color:#5A0A0A; font-weight:bold;">alert</span> <span style="color:#0066ff; font-weight:bold;">@url_info</span>.<span style="color:#5A0A0A; font-weight:bold;">errors</span>.<span style="color:#9900CC;">full_messages</span>.<span style="color:#9900CC;">join</span> <span style="color:#996600;">'<span style="color:#000099;">\n</span>'</span>
          <span style="color:#9966CC; font-weight:bold;">end</span>
        <span style="color:#9966CC; font-weight:bold;">end</span>
      <span style="color:#9966CC; font-weight:bold;">end</span>
    <span style="color:#9966CC; font-weight:bold;">end</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
  <span style="color:#008000; font-style:italic;"># DELETE /url_infos/1</span>
  <span style="color:#008000; font-style:italic;"># DELETE /url_infos/1.xml</span>
  <span style="color:#9966CC; font-weight:bold;">def</span> <span style="color:#5A0A0A; font-weight:bold;">destroy</span>
    <span style="color:#0066ff; font-weight:bold;">@url_info</span> = UrlInfo.<span style="color:#9900CC;">find</span><span style="color:#006600; font-weight:bold;">&#40;</span>params<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#ff3333; font-weight:bold;">:id</span><span style="color:#006600; font-weight:bold;">&#93;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
    <span style="color:#0066ff; font-weight:bold;">@url_info</span>.<span style="color:#5A0A0A; font-weight:bold;">destroy</span>
&nbsp;
    <span style="color:#5A0A0A; font-weight:bold;">respond_to</span> <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span>format<span style="color:#006600; font-weight:bold;">|</span>
      <span style="color:#CC0066; font-weight:bold;">format</span>.<span style="color:#9900CC;">html</span> <span style="color:#006600; font-weight:bold;">&#123;</span> <span style="color:#5A0A0A; font-weight:bold;">redirect_to</span><span style="color:#006600; font-weight:bold;">&#40;</span>url_infos_url<span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#006600; font-weight:bold;">&#125;</span>
      <span style="color:#CC0066; font-weight:bold;">format</span>.<span style="color:#9900CC;">xml</span>  <span style="color:#006600; font-weight:bold;">&#123;</span> head <span style="color:#ff3333; font-weight:bold;">:ok</span> <span style="color:#006600; font-weight:bold;">&#125;</span>
    <span style="color:#9966CC; font-weight:bold;">end</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
<span style="color:#9966CC; font-weight:bold;">end</span></pre></td></tr></table></div>

<p>Alguns métodos foram removidos, e o metodo create sofreu algumas alterações dentro do bloco &#8220;respond_to&#8221; adicionando suporte a respostas tipo &#8220;javascript&#8221;. E tem mais um detalhe no mesmo método, a segunda linha foi adicionada para quebrar todo o suporte &#8220;REST&#8221; do rails, como este é um encurtador de URLs eu quero que seja possível adicionar uma URL via uma chamada a uma URL do sistema, neste caso vai ser &#8220;/add/<url>&#8221; e para isto na segunda linha do método &#8220;create&#8221; se o parâmetro &#8220;href&#8221; existir este é utilizado como valor da URL sendo criada no sistema, mas para isto funcionar a alteração abaixo é necessária no arquivo config/routes.rb:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
</pre></td><td class="code"><pre class="rails" style="font-family:monospace;"><span style="color:#6666ff; font-weight:bold;">ActionController::Routing::Routes</span>.<span style="color:#9900CC;">draw</span> <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span>map<span style="color:#006600; font-weight:bold;">|</span>
  map.<span style="color:#9900CC;">resources</span> <span style="color:#ff3333; font-weight:bold;">:url_infos</span>
&nbsp;
  map.<span style="color:#9900CC;">root</span> <span style="color:#ff3333; font-weight:bold;">:controller</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#996600;">'url_infos'</span>
  map.<span style="color:#9900CC;">connect</span> <span style="color:#996600;">'/add/:href'</span>, <span style="color:#ff3333; font-weight:bold;">:controller</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#996600;">'url_infos'</span>, <span style="color:#ff3333; font-weight:bold;">:action</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#996600;">'create'</span>, <span style="color:#ff3333; font-weight:bold;">:href</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#006600; font-weight:bold;">/</span>http<span style="color:#006600; font-weight:bold;">&#91;</span>s<span style="color:#006600; font-weight:bold;">&#93;</span><span style="color:#006600; font-weight:bold;">&#123;</span><span style="color:#006666;">0</span>,<span style="color:#006666;">1</span><span style="color:#006600; font-weight:bold;">&#125;</span>:\<span style="color:#006600; font-weight:bold;">/</span>\<span style="color:#006600; font-weight:bold;">/</span>.<span style="color:#006600; font-weight:bold;">*/</span>
  map.<span style="color:#9900CC;">connect</span> <span style="color:#996600;">':id'</span>, <span style="color:#ff3333; font-weight:bold;">:controller</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#996600;">'redirector'</span>, <span style="color:#ff3333; font-weight:bold;">:action</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#996600;">'index'</span>
<span style="color:#9966CC; font-weight:bold;">end</span></pre></td></tr></table></div>

<p>A alteração feita foi a adição da linha &#8220;map.connect &#8216;/add/&#8230;&#8221;, preste atenção na utilização de uma expressão regular na especificação do parâmetro &#8220;href&#8221; no final da linha, isto permite que a URL completa seja utilizada como parâmetro, se isto não for utilizado o parâmetro vai terminar na primeira &#8220;/&#8221; da URL e o roteamento não vai funcionar corretamente.</p>
<p>Agora para que o AJAX funcione vamos alterar o layout gerado quando executamos o primeiro comando &#8220;script/generate scaffold &#8230;&#8221;, naquele momento foi gerado também o arquivo app/views/layouts/url_infos.html.erb.</p>
<p>Como este arquivo de <a href="http://sledge.boo-box.com/list/page/bGF5b3V0XyMjX2JveF8jI190YWdnaW5nLXRvb2wtd3BfIyNf-48" class="bbli">layout<img src="http://boo-box.com/bbli" alt="[bb]" class="bbic" /></a> tem o nome de um controlador, ele é utilizado apenas por este controlador, se o nome do arquivo fosse &#8220;application.html.erb&#8221; ele seria utilizado por todos os controladores da aplicação que não tivesse um layout próprio. </p>
<p>O conteúdo do arquivo é semelhante a qualquer outra view, uma coisa interessante de se reparar no nome do arquivo é que ele contem o &#8220;mime type&#8221; no nome, então se quisermos criar um &#8220;layout&#8221; para respostas XML vale a mesma lógica (application.xml.erb).</p>
<p>Vamos ver o conteúdo deste layout:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
</pre></td><td class="code"><pre class="html" style="font-family:monospace;">&lt;!DOCTYPE html PUBLIC &quot;-//W3C//DTD XHTML 1.0 Transitional//EN&quot;
       &quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&quot;&gt;
&nbsp;
&lt;html xmlns=&quot;http://www.w3.org/1999/xhtml&quot; xml:lang=&quot;en&quot; lang=&quot;en&quot;&gt;
&lt;head&gt;
  &lt;meta http-equiv=&quot;content-type&quot; content=&quot;text/html;charset=UTF-8&quot; /&gt;
  &lt;title&gt;UrlInfos: &lt;%= controller.action_name %&gt;&lt;/title&gt;
  &lt;%= stylesheet_link_tag 'scaffold' %&gt;
  &lt;%= javascript_include_tag :defaults %&gt;
&lt;/head&gt;
&lt;body&gt;
&nbsp;
&lt;p style=&quot;color: green&quot;&gt;&lt;%= flash[:notice] %&gt;&lt;/p&gt;
&nbsp;
&lt;%= yield %&gt;
&nbsp;
&lt;/body&gt;
&lt;/html&gt;</pre></td></tr></table></div>

<p>Foi adicionada a linha &#8220;<%= javascript_include_tag :defaults %>&#8221; que adiciona na página gerada a chamada para o javascript padrão do rails (que utiliza por padrão a biblioteca prototype). </p>
<p>O conteúdo das views é renderizado no lugar em que se encontra &#8220;<%= yield %>&#8221; neste arquivo de layout.</p>
<p>A última alteração que falta é impedir que sejam cadastradas URLs duplicadas ou em branco, para isto vamos voltar ao arquivo do model app/models/utl_info.rb</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
</pre></td><td class="code"><pre class="rails" style="font-family:monospace;"><span style="color:#9966CC; font-weight:bold;">class</span> UrlInfo <span style="color:#006600; font-weight:bold;">&lt;</span> <span style="color:#6666ff; font-weight:bold;">ActiveRecord::Base</span>
	<span style="color:#5A0A0A; font-weight:bold;">validates_uniqueness_of</span> <span style="color:#ff3333; font-weight:bold;">:href</span>
	<span style="color:#5A0A0A; font-weight:bold;">validates_presence_of</span> <span style="color:#ff3333; font-weight:bold;">:href</span>
<span style="color:#9966CC; font-weight:bold;">end</span></pre></td></tr></table></div>

<p>O suporte a <a href="http://api.rubyonrails.org/classes/ActiveRecord/Validations.html">validações</a> do rails é bem flexível, e possui <a href="http://api.rubyonrails.org/classes/ActiveRecord/Validations/ClassMethods.html">helpers para diversas validações</a>, neste caso estamos garantindo que a URL seja única e esteja preenchida.</p>
<p>Bom, acho que era isto, temos um encurtador de URLs bem simples pronto. Esepro que o exemplo tenha sido útil para mostrar alguns dos recursos do Rails fugindo um pouco do exemplo padrão do blog.</p>
<p>Siga os links para a documentação do Rails, e lembre-se de programar sempre com o site da <a href="http://api.rubyonrails.org/">API do rails</a> aberto em um browser.</p>
<p>PS.: o código completo para este exemplo esta <a href="http://github.com/urubatan/url_shortener">disponível no github</a>.</p>
<p>Post de: <a href="http://www.urubatan.com.br">Blog do Urubatan</a><br/>
Quer comprar meu livro <a href="http://livro.urubatan.com.br">Desenvolvimento F&aacute;cil e R&aacute;pido de Aplica&ccedil;&otilde;es web</a> com 30% de desconto? &Eacute; s&oacute; acessar o meu <a href="http://www.urubatan.com.br">blog</a> e pegar o c&oacute;digo :D<br/><br/><a href="http://www.urubatan.com.br/ruby-on-rails-101-encurtador-de-urls-novo-blog/">Ruby on Rails 101 &#8211; Encurtador de URLs = Novo Blog</a></p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/BlogDoUrubatan?a=thYW-bCPGDA:eNVn_h5HNR0:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/BlogDoUrubatan?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/BlogDoUrubatan?a=thYW-bCPGDA:eNVn_h5HNR0:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/BlogDoUrubatan?i=thYW-bCPGDA:eNVn_h5HNR0:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/BlogDoUrubatan?a=thYW-bCPGDA:eNVn_h5HNR0:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/BlogDoUrubatan?i=thYW-bCPGDA:eNVn_h5HNR0:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/BlogDoUrubatan?a=thYW-bCPGDA:eNVn_h5HNR0:HCBZNhuKwNY"><img src="http://feeds.feedburner.com/~ff/BlogDoUrubatan?d=HCBZNhuKwNY" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/BlogDoUrubatan?a=thYW-bCPGDA:eNVn_h5HNR0:Iu4eqwUi9wI"><img src="http://feeds.feedburner.com/~ff/BlogDoUrubatan?d=Iu4eqwUi9wI" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/BlogDoUrubatan?a=thYW-bCPGDA:eNVn_h5HNR0:BxLlmz8_Wzw"><img src="http://feeds.feedburner.com/~ff/BlogDoUrubatan?d=BxLlmz8_Wzw" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/BlogDoUrubatan/~4/thYW-bCPGDA" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.urubatan.com.br/ruby-on-rails-101-encurtador-de-urls-novo-blog/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<coop:keyword>Artigos</coop:keyword><coop:keyword>Ruby</coop:keyword><coop:keyword>rails</coop:keyword><coop:keyword>101</coop:keyword><coop:keyword>tutorial</coop:keyword><coop:keyword>url shortener</coop:keyword><feedburner:origLink>http://www.urubatan.com.br/ruby-on-rails-101-encurtador-de-urls-novo-blog/</feedburner:origLink></item>
		<item>
		<title>Utilizando Rake para o Build de projetos Java!</title>
		<link>http://feedproxy.google.com/~r/BlogDoUrubatan/~3/c7DE0aERmTM/</link>
		<comments>http://www.urubatan.com.br/utilizando-rake-para-o-build-de-projetos-java/#comments</comments>
		<pubDate>Fri, 08 Jan 2010 11:00:49 +0000</pubDate>
		<dc:creator>Urubatan</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[build]]></category>
		<category><![CDATA[projeto]]></category>
		<category><![CDATA[rake]]></category>

		<guid isPermaLink="false">http://www.urubatan.com.br/?p=1776</guid>
		<description><![CDATA[A alguns dias atrás eu li este twitt do Martin Fowler: &#8220;you don’t want a build tool which automatically downloads unresolved dependencies before cleaning out yr build output: http://bit.ly/59Rl85&#8220;, li todo o post e ele fala de forma bastante prolixa de alguns dos motivos que me fazem não gostar do Maven. Não me levem a [...]<p>Post de: <a href="http://www.urubatan.com.br">Blog do Urubatan</a><br/>
Quer comprar meu livro <a href="http://livro.urubatan.com.br">Desenvolvimento F&aacute;cil e R&aacute;pido de Aplica&ccedil;&otilde;es web</a> com 30% de desconto? &Eacute; s&oacute; acessar o meu <a href="http://www.urubatan.com.br">blog</a> e pegar o c&oacute;digo :D<br/><br/><a href="http://www.urubatan.com.br/utilizando-rake-para-o-build-de-projetos-java/">Utilizando Rake para o Build de projetos Java!</a></p>
]]></description>
			<content:encoded><![CDATA[<p>A alguns dias atrás eu li <a href="http://twitter.com/martinfowler/status/7246023577">este twitt</a> do <a href="http://www.martinfowler.com/">Martin Fowler</a>: &#8220;you don’t want a build tool which automatically downloads unresolved dependencies before cleaning out yr build output: <a href="http://bit.ly/59Rl85">http://bit.ly/59Rl85</a>&#8220;, li todo o post e ele fala de forma bastante prolixa de alguns dos motivos que me fazem não gostar do <a href="http://maven.apache.org/">Maven</a>. </p>
<p>Não me levem a mal, eu já tentei utilizar ele algumas vezes, mas eu não consigo gostar de uma ferramenta que acha que sabe mais do meu projeto do que eu mesmo (ou o cliente, ou os desenvolvedores, &#8230;).<br />
Ou pior que isto, uma ferramenta que tem a infeliz mania de tentar fazer um backup da internet antes de cada build só para verificar se tem a última versão das dependências disponível &#8230;</p>
<p>Como é citado no post, não acho que alguma ferramenta vá saber exatamente o que é necessário para qualquer projeto, até por que cada projeto é um projeto, e cada projeto tem suas peculiaridades, e eu simplesmente desisti todas as vezes que precisei configurar alguma destas peculiaridades no maven e voltei para o <a href="http://ant.apache.org/">ANT</a>.</p>
<p>O ANT é uma ferramenta bastante flexível, e pelo que eu tenho visto no mercado, fora alguns teimosos que preferem usar o maven mesmo passando muito mais trabalho do que o necessário, o ANT é o &#8220;defacto standard&#8221; para builds em Java, mas algumas vezes a &#8220;linguagem de script&#8221; do ANT dificulta as coisas quando se precisa realmente de um script para fazer alguma coisa durante o build, então resolvi usar Ruby para escrever os builds, ou seja, utilizar uma linguagem de scripts de verdade.</p>
<p>Ai pensei, como é que vou fazer para compilar meu projeto java utilizando o <a href="http://www.rubyrake.org/">Rake</a>? A linguagem de script é muito fodastica, é Ruby, eu me sinto bem programando em Ruby, mas e como compilar? </p>
<p>Fui perguntar ao <a href="http://www.google.com">oraculo</a> e descobri o <a href="http://buildr.apache.org/">BuildR</a> e o <a href="http://raven.rubyforge.org/">Raven</a> que fora o fato de não utilizarem XML e sim Ruby, conseguem repetir todos os erros do Maven, eles parecem &#8220;ports do Maven para o Rake&#8221; e eu não sei por que alguem iria fazer isto, se você gosta tanto assim do Maven, use ele mesmo &#8230;</p>
<p>Mas do Rake eu gosto, me acostumei com ele trabalhando com o Rails, é muito fácil de automatizar tarefas relacionadas a um projeto utilizando o Rake, e não apenas o &#8220;build&#8221;, mas algumas tarefas que as vezes precisam ser automatizadas, como um merge freqüente com algum sub projeto desenvolvido em outra parte do mundo &#8230;</p>
<p>Isto me criou apenas um problema, como compilar, empacotar, &#8230;</p>
<p>Ou seja, me faziam falta as tasks básicas do ANT que eu utilizo sempre. As outras tarefas são melhor executadas na minha opinião pelo próprio Rake ou até mesmo por um script em Ruby, mas estas tarefas básicas iriam fazer falta, e para resolver isto eu criei uma classe wrapper para os comandos do JDK, que pode ser estendida depois, não é algo 100% rake, mas eu achei que ficou legal assim, se alguem não concordar e tiver idéias para melhorar estou aceitando sugestões <img src='http://www.urubatan.com.br/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </p>
<p>O wraper para os comandos do JDK ficou assim:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
</pre></td><td class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#9966CC; font-weight:bold;">class</span> JavaUtil
  RAW_COMMANDS = <span style="color:#006600; font-weight:bold;">%</span>w<span style="color:#006600; font-weight:bold;">&#123;</span>appletviewer apt extcheck idlj jar jarsigner java javac javadoc javah javap javaw javaws jconsole jdb jhat jinfo jmap jps jrunscript jstack jstat jstatd jvisualvm keytool kinit klist ktab native2ascii orbd pack200 packager policytool rmic rmid rmiregistry schemagen serialver servertool tnameserv unpack200 wsgen wsimport xjc<span style="color:#006600; font-weight:bold;">&#125;</span>
&nbsp;
  <span style="color:#9966CC; font-weight:bold;">def</span> initialize<span style="color:#006600; font-weight:bold;">&#40;</span>jdk_home=<span style="color:#0000FF; font-weight:bold;">nil</span><span style="color:#006600; font-weight:bold;">&#41;</span>
    <span style="color:#0066ff; font-weight:bold;">@commands</span> = <span style="color:#006600; font-weight:bold;">&#123;</span><span style="color:#006600; font-weight:bold;">&#125;</span>
    <span style="color:#0066ff; font-weight:bold;">@jdk_home</span> = jdk_home <span style="color:#006600; font-weight:bold;">||</span> ENV<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#996600;">'java_home'</span><span style="color:#006600; font-weight:bold;">&#93;</span>
    <span style="color:#0066ff; font-weight:bold;">@default_for_command</span> = <span style="color:#006600; font-weight:bold;">&#123;</span><span style="color:#006600; font-weight:bold;">&#125;</span>
    <span style="color:#0066ff; font-weight:bold;">@global_default</span> = <span style="color:#006600; font-weight:bold;">&#123;</span><span style="color:#006600; font-weight:bold;">&#125;</span>
    init_commands
  <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
  <span style="color:#9966CC; font-weight:bold;">def</span> method_missing<span style="color:#006600; font-weight:bold;">&#40;</span>met,<span style="color:#006600; font-weight:bold;">*</span>args<span style="color:#006600; font-weight:bold;">&#41;</span>
    <span style="color:#9966CC; font-weight:bold;">if</span> RAW_COMMANDS.<span style="color:#9966CC; font-weight:bold;">include</span>? met.<span style="color:#9900CC;">to_s</span>
      execute_command met, <span style="color:#006600; font-weight:bold;">*</span>args
    <span style="color:#9966CC; font-weight:bold;">else</span>
      <span style="color:#9966CC; font-weight:bold;">super</span>.<span style="color:#9900CC;">method_missing</span> met, <span style="color:#006600; font-weight:bold;">*</span>args
    <span style="color:#9966CC; font-weight:bold;">end</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
  <span style="color:#9966CC; font-weight:bold;">def</span> respond_to?<span style="color:#006600; font-weight:bold;">&#40;</span>met<span style="color:#006600; font-weight:bold;">&#41;</span>
    RAW_COMMANDS.<span style="color:#9966CC; font-weight:bold;">include</span>?<span style="color:#006600; font-weight:bold;">&#40;</span>met.<span style="color:#9900CC;">to_s</span><span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#006600; font-weight:bold;">||</span> <span style="color:#9966CC; font-weight:bold;">super</span>.<span style="color:#9900CC;">respond_to</span>?<span style="color:#006600; font-weight:bold;">&#40;</span>met<span style="color:#006600; font-weight:bold;">&#41;</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
  <span style="color:#9966CC; font-weight:bold;">def</span> default_parameter<span style="color:#006600; font-weight:bold;">&#40;</span>param,value<span style="color:#006600; font-weight:bold;">&#41;</span>
    <span style="color:#0066ff; font-weight:bold;">@global_default</span><span style="color:#006600; font-weight:bold;">&#91;</span>param<span style="color:#006600; font-weight:bold;">&#93;</span> = value
  <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
  <span style="color:#9966CC; font-weight:bold;">def</span> default_parameter_for<span style="color:#006600; font-weight:bold;">&#40;</span>met,param,value<span style="color:#006600; font-weight:bold;">&#41;</span>
    params = <span style="color:#0066ff; font-weight:bold;">@default_for_command</span><span style="color:#006600; font-weight:bold;">&#91;</span>met<span style="color:#006600; font-weight:bold;">&#93;</span> <span style="color:#006600; font-weight:bold;">||</span> <span style="color:#006600; font-weight:bold;">&#123;</span><span style="color:#006600; font-weight:bold;">&#125;</span>
    params<span style="color:#006600; font-weight:bold;">&#91;</span>param<span style="color:#006600; font-weight:bold;">&#93;</span> = value
    <span style="color:#0066ff; font-weight:bold;">@default_for_command</span><span style="color:#006600; font-weight:bold;">&#91;</span>met<span style="color:#006600; font-weight:bold;">&#93;</span> = params
  <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
  private
    <span style="color:#9966CC; font-weight:bold;">def</span> init_commands
      <span style="color:#0066ff; font-weight:bold;">@jdk_bin</span> = <span style="color:#CC00FF; font-weight:bold;">File</span>.<span style="color:#9900CC;">join</span> <span style="color:#0066ff; font-weight:bold;">@jdk_home</span> , <span style="color:#996600;">&quot;bin&quot;</span>
      RAW_COMMANDS.<span style="color:#9900CC;">each</span> <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span>cmd<span style="color:#006600; font-weight:bold;">|</span>
        <span style="color:#0066ff; font-weight:bold;">@commands</span><span style="color:#006600; font-weight:bold;">&#91;</span>cmd.<span style="color:#9900CC;">to_sym</span><span style="color:#006600; font-weight:bold;">&#93;</span> = <span style="color:#CC00FF; font-weight:bold;">File</span>.<span style="color:#9900CC;">join</span> <span style="color:#0066ff; font-weight:bold;">@jdk_bin</span>, cmd
      <span style="color:#9966CC; font-weight:bold;">end</span>
    <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
    <span style="color:#9966CC; font-weight:bold;">def</span> update_or_concat_with_defaults<span style="color:#006600; font-weight:bold;">&#40;</span>opts,defaults<span style="color:#006600; font-weight:bold;">&#41;</span>
      defaults.<span style="color:#9900CC;">each</span> <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span>key,value<span style="color:#006600; font-weight:bold;">|</span>
        param = opts<span style="color:#006600; font-weight:bold;">&#91;</span>key<span style="color:#006600; font-weight:bold;">&#93;</span>
        <span style="color:#9966CC; font-weight:bold;">if</span> !param
          param = value
        <span style="color:#9966CC; font-weight:bold;">else</span>
          <span style="color:#9966CC; font-weight:bold;">if</span> param.<span style="color:#9900CC;">is_a</span>? <span style="color:#CC0066; font-weight:bold;">Array</span>
            param <span style="color:#006600; font-weight:bold;">&lt;&lt;</span> value
            param.<span style="color:#9900CC;">flatten</span>!
          <span style="color:#9966CC; font-weight:bold;">end</span>
        <span style="color:#9966CC; font-weight:bold;">end</span>
        opts<span style="color:#006600; font-weight:bold;">&#91;</span>key<span style="color:#006600; font-weight:bold;">&#93;</span> = param
      <span style="color:#9966CC; font-weight:bold;">end</span>
    <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
    <span style="color:#9966CC; font-weight:bold;">def</span> execute_command<span style="color:#006600; font-weight:bold;">&#40;</span>cmd, <span style="color:#006600; font-weight:bold;">*</span>args<span style="color:#006600; font-weight:bold;">&#41;</span>
      actual_command = <span style="color:#0066ff; font-weight:bold;">@commands</span><span style="color:#006600; font-weight:bold;">&#91;</span>cmd.<span style="color:#9900CC;">to_sym</span><span style="color:#006600; font-weight:bold;">&#93;</span>
      <span style="color:#9966CC; font-weight:bold;">if</span> args
        opts = <span style="color:#006600; font-weight:bold;">&#123;</span><span style="color:#006600; font-weight:bold;">&#125;</span>
        opts.<span style="color:#9900CC;">update</span> args.<span style="color:#9900CC;">pop</span> <span style="color:#9966CC; font-weight:bold;">if</span> args.<span style="color:#9900CC;">last</span>.<span style="color:#9900CC;">is_a</span>? <span style="color:#CC00FF; font-weight:bold;">Hash</span>
        update_or_concat_with_defaults opts, <span style="color:#0066ff; font-weight:bold;">@global_default</span>
        update_or_concat_with_defaults opts, <span style="color:#0066ff; font-weight:bold;">@default_for_command</span><span style="color:#006600; font-weight:bold;">&#91;</span>cmd.<span style="color:#9900CC;">to_sym</span><span style="color:#006600; font-weight:bold;">&#93;</span> <span style="color:#9966CC; font-weight:bold;">if</span> <span style="color:#0066ff; font-weight:bold;">@default_for_command</span><span style="color:#006600; font-weight:bold;">&#91;</span>cmd.<span style="color:#9900CC;">to_sym</span><span style="color:#006600; font-weight:bold;">&#93;</span>        
        opts.<span style="color:#9900CC;">each</span> <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span>key, value<span style="color:#006600; font-weight:bold;">|</span>
          param = value
          param = param.<span style="color:#9900CC;">join</span> <span style="color:#6666ff; font-weight:bold;">File::PATH_SEPARATOR</span> <span style="color:#9966CC; font-weight:bold;">if</span> param.<span style="color:#9900CC;">is_a</span>? <span style="color:#CC0066; font-weight:bold;">Array</span>
          actual_command <span style="color:#006600; font-weight:bold;">&lt;&lt;</span> <span style="color:#996600;">&quot; -&quot;</span> <span style="color:#006600; font-weight:bold;">&lt;&lt;</span> key.<span style="color:#9900CC;">to_s</span> <span style="color:#006600; font-weight:bold;">&lt;&lt;</span> <span style="color:#996600;">&quot; &quot;</span>  <span style="color:#006600; font-weight:bold;">&lt;&lt;</span> param
        <span style="color:#9966CC; font-weight:bold;">end</span>
        actual_command = <span style="color:#996600;">&quot;#{actual_command} #{args.join ' '} &quot;</span>
      <span style="color:#9966CC; font-weight:bold;">end</span>
      <span style="color:#CC0066; font-weight:bold;">puts</span> actual_command
      res = <span style="color:#006600; font-weight:bold;">%</span>x<span style="color:#006600; font-weight:bold;">&#123;</span><span style="color:#008000; font-style:italic;">#{actual_command}}</span>
      <span style="color:#CC0066; font-weight:bold;">puts</span> res
      <span style="color:#006600; font-weight:bold;">&#91;</span>$?,res<span style="color:#006600; font-weight:bold;">&#93;</span>
    <span style="color:#9966CC; font-weight:bold;">end</span>
<span style="color:#9966CC; font-weight:bold;">end</span></pre></td></tr></table></div>

<p>A minha idéia dos parâmetros default globais tem um pequeno problema, alguns comandos não recebem os mesmos parâmetros, mas é possível setar parâmetros padrão por comando, o que ficou legal, e deixou a compilação mais limpa &#8230;</p>
<p>A classe pode ser utilizada com qualquer JDK, inclusive instâncias diferentes podem utilizar JDKs diferentes para o mesmo build, basta passar o &#8220;JAVA_HOME&#8221; no construtor, por padrão a variável de ambiente é utilizada &#8230;</p>
<p>Mas beleza, como é que eu utilizo esta tranqueira em um Rakefile agora? bom, o meu Rakefile para o projeto de exemplo ficou assim:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
</pre></td><td class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#CC0066; font-weight:bold;">require</span> <span style="color:#996600;">'lib/java_util'</span>
<span style="color:#0066ff; font-weight:bold;">@java_util</span> = JavaUtil.<span style="color:#9900CC;">new</span>
&nbsp;
task <span style="color:#ff3333; font-weight:bold;">:default</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#ff3333; font-weight:bold;">:test</span>
&nbsp;
SRC_FILES = FileList.<span style="color:#9900CC;">new</span> <span style="color:#996600;">'src/**/*.java'</span>
TST_FILES = FileList.<span style="color:#9900CC;">new</span> <span style="color:#996600;">'test/**/*.java'</span>
CLASSPATH = FileList.<span style="color:#9900CC;">new</span> <span style="color:#996600;">&quot;#{File.join(ENV['TOMCAT_DIR'], 'lib').gsub /<span style="color:#000099;">\\</span>/,'/'}/*.jar&quot;</span>
&nbsp;
<span style="color:#0066ff; font-weight:bold;">@java_util</span>.<span style="color:#9900CC;">default_parameter_for</span> <span style="color:#ff3333; font-weight:bold;">:java</span>, <span style="color:#ff3333; font-weight:bold;">:classpath</span>, CLASSPATH.<span style="color:#9900CC;">to_a</span>
<span style="color:#0066ff; font-weight:bold;">@java_util</span>.<span style="color:#9900CC;">default_parameter_for</span> <span style="color:#ff3333; font-weight:bold;">:javac</span>, <span style="color:#ff3333; font-weight:bold;">:classpath</span>, CLASSPATH.<span style="color:#9900CC;">to_a</span>
&nbsp;
directory <span style="color:#996600;">'output/classes'</span>
directory <span style="color:#996600;">'output/tests'</span>
&nbsp;
desc <span style="color:#996600;">&quot;Compile all the java files&quot;</span>
task <span style="color:#ff3333; font-weight:bold;">:compile</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#996600;">'output/classes'</span>,<span style="color:#996600;">'output/tests'</span><span style="color:#006600; font-weight:bold;">&#93;</span>  <span style="color:#9966CC; font-weight:bold;">do</span>
  <span style="color:#0066ff; font-weight:bold;">@java_util</span>.<span style="color:#9900CC;">javac</span> SRC_FILES, <span style="color:#ff3333; font-weight:bold;">:d</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#996600;">'output/classes'</span>
  <span style="color:#0066ff; font-weight:bold;">@java_util</span>.<span style="color:#9900CC;">javac</span> TST_FILES, <span style="color:#ff3333; font-weight:bold;">:d</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#996600;">'output/tests'</span>, <span style="color:#ff3333; font-weight:bold;">:classpath</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#996600;">'output/classes'</span>,<span style="color:#996600;">&quot;#{ENV['JUNIT_DIR']}<span style="color:#000099;">\\</span>junit-4.4.jar&quot;</span><span style="color:#006600; font-weight:bold;">&#93;</span>
<span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
desc <span style="color:#996600;">&quot;Creates the package after compilation&quot;</span>
task <span style="color:#ff3333; font-weight:bold;">:package</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#ff3333; font-weight:bold;">:compile</span> <span style="color:#9966CC; font-weight:bold;">do</span>
  <span style="color:#0066ff; font-weight:bold;">@java_util</span>.<span style="color:#9900CC;">jar</span> <span style="color:#996600;">'-cf output/target.jar -C output/classes .'</span>
  cp <span style="color:#996600;">'output/target.jar'</span>, <span style="color:#996600;">'WebContent/WEB-INF/lib'</span>
  <span style="color:#0066ff; font-weight:bold;">@java_util</span>.<span style="color:#9900CC;">jar</span> <span style="color:#996600;">'-cf output/target.war -C WebContent .'</span>
<span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
desc <span style="color:#996600;">&quot;Runs the tests after packaging&quot;</span>
task <span style="color:#ff3333; font-weight:bold;">:test</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#ff3333; font-weight:bold;">:package</span> <span style="color:#9966CC; font-weight:bold;">do</span>
  test_classes = FileList.<span style="color:#9900CC;">new</span> <span style="color:#996600;">'output/tests/**/*.class'</span>
  test_classes.<span style="color:#CC0066; font-weight:bold;">gsub!</span> <span style="color:#006600; font-weight:bold;">/</span>output\<span style="color:#006600; font-weight:bold;">/</span>tests\<span style="color:#006600; font-weight:bold;">/</span><span style="color:#006600; font-weight:bold;">&#40;</span>.<span style="color:#006600; font-weight:bold;">*</span><span style="color:#006600; font-weight:bold;">&#41;</span>\.<span style="color:#9966CC; font-weight:bold;">class</span><span style="color:#006600; font-weight:bold;">/</span>,<span style="color:#996600;">'<span style="color:#000099;">\1</span>'</span>
  test_classes.<span style="color:#CC0066; font-weight:bold;">gsub!</span> <span style="color:#006600; font-weight:bold;">/</span>\<span style="color:#006600; font-weight:bold;">//</span>, <span style="color:#996600;">'.'</span>
  <span style="color:#0066ff; font-weight:bold;">@java_util</span>.<span style="color:#9900CC;">java</span> <span style="color:#996600;">&quot;org.junit.runner.JUnitCore #{test_classes.join ' '}&quot;</span>, <span style="color:#ff3333; font-weight:bold;">:classpath</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#996600;">'output/tests'</span>,<span style="color:#996600;">'output/target.jar'</span>,<span style="color:#996600;">&quot;#{ENV['JUNIT_DIR']}<span style="color:#000099;">\\</span>junit-4.4.jar&quot;</span><span style="color:#006600; font-weight:bold;">&#93;</span>
<span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
desc <span style="color:#996600;">&quot;Clean up all the mess we created&quot;</span>
task <span style="color:#ff3333; font-weight:bold;">:clean</span> <span style="color:#9966CC; font-weight:bold;">do</span>
  rm_f <span style="color:#996600;">'output'</span>
  rm_t <span style="color:#996600;">'WebContent/WEB-INF/lib/target.jar'</span>
<span style="color:#9966CC; font-weight:bold;">end</span></pre></td></tr></table></div>

<p>O código dos testes não precisava ser tão complexo, eu poderia ter criado um wrapper para ele, a mesma coisa para a criação do jar, poderia até mesmo ter utilizado o &#8220;rubyzip&#8221; para deixar mais bonitinho, mas a idéia por enquanto é ser bem simples.</p>
<p>Estou utilizando este build em um projeto, se engrenar provavelmente a biblioteca vá crescendo, mas acho que por agora já serve para começar a brincar e ver o que vocês acham da idéia.<br />
A classe &#8220;JavaUtil&#8221; precisa ser mais testável, mas isto tornou ela complexa demais para o exemplo deste post, se eu convencer o resto da equipe a continuar usando esta solução vou melhorando ela aos poucos <img src='http://www.urubatan.com.br/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </p>
<p>Acho que vou separar a montagem do comando e a execução do mesmo, ou transformar cada comando em uma classe para facilitar a expansão da biblioteca e tornar mais testável, ou até mesmo as duas coisas.<br />
No momento a classe não é nada testável, mas já esta divertida e o meu bluid diminuiu muitas linhas depois que eu converti ele de ANT para Rake utilizando esta lib <img src='http://www.urubatan.com.br/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </p>
<p>PS.: quem quiser pegar o projeto de testes para brincar, só para olhar ou até mesmo para implementar algumas melhorias, ele esta <a href="http://github.com/urubatan/rake_java_utils">publicado no github</a>. Se implementarem alguma melhoria, não esqueçam de enviar um pull request para que eu possa fazer o merge das alterações <img src='http://www.urubatan.com.br/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </p>
<p>Post de: <a href="http://www.urubatan.com.br">Blog do Urubatan</a><br/>
Quer comprar meu livro <a href="http://livro.urubatan.com.br">Desenvolvimento F&aacute;cil e R&aacute;pido de Aplica&ccedil;&otilde;es web</a> com 30% de desconto? &Eacute; s&oacute; acessar o meu <a href="http://www.urubatan.com.br">blog</a> e pegar o c&oacute;digo :D<br/><br/><a href="http://www.urubatan.com.br/utilizando-rake-para-o-build-de-projetos-java/">Utilizando Rake para o Build de projetos Java!</a></p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/BlogDoUrubatan?a=c7DE0aERmTM:t2-3oDILx54:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/BlogDoUrubatan?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/BlogDoUrubatan?a=c7DE0aERmTM:t2-3oDILx54:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/BlogDoUrubatan?i=c7DE0aERmTM:t2-3oDILx54:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/BlogDoUrubatan?a=c7DE0aERmTM:t2-3oDILx54:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/BlogDoUrubatan?i=c7DE0aERmTM:t2-3oDILx54:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/BlogDoUrubatan?a=c7DE0aERmTM:t2-3oDILx54:HCBZNhuKwNY"><img src="http://feeds.feedburner.com/~ff/BlogDoUrubatan?d=HCBZNhuKwNY" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/BlogDoUrubatan?a=c7DE0aERmTM:t2-3oDILx54:Iu4eqwUi9wI"><img src="http://feeds.feedburner.com/~ff/BlogDoUrubatan?d=Iu4eqwUi9wI" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/BlogDoUrubatan?a=c7DE0aERmTM:t2-3oDILx54:BxLlmz8_Wzw"><img src="http://feeds.feedburner.com/~ff/BlogDoUrubatan?d=BxLlmz8_Wzw" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/BlogDoUrubatan/~4/c7DE0aERmTM" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.urubatan.com.br/utilizando-rake-para-o-build-de-projetos-java/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<coop:keyword>Java</coop:keyword><coop:keyword>Ruby</coop:keyword><coop:keyword>build</coop:keyword><coop:keyword>projeto</coop:keyword><coop:keyword>rake</coop:keyword><feedburner:origLink>http://www.urubatan.com.br/utilizando-rake-para-o-build-de-projetos-java/</feedburner:origLink></item>
		<item>
		<title>Cucumber e BDD – Vantagens para a empresa (Argumentos para o gerente, para o arquiteto, para o presidente da empresa, …)</title>
		<link>http://feedproxy.google.com/~r/BlogDoUrubatan/~3/-Ba4HmvQn9Q/</link>
		<comments>http://www.urubatan.com.br/cucumber-e-bdd-vantagens-para-a-empresa-argumentos-para-o-gerente-para-o-arquiteto-para-o-presidente-da-empresa/#comments</comments>
		<pubDate>Wed, 06 Jan 2010 11:00:23 +0000</pubDate>
		<dc:creator>Urubatan</dc:creator>
				<category><![CDATA[Ruby]]></category>
		<category><![CDATA[bdd]]></category>
		<category><![CDATA[cucumber]]></category>
		<category><![CDATA[lcucumber]]></category>

		<guid isPermaLink="false">http://www.urubatan.com.br/?p=1748</guid>
		<description><![CDATA[Desenvolvimento Guiado pelo Comportamento (BDD &#8211; Behaviour Driven Development) Desenvolvimento guiado pelo comportamento da aplicação é o que todos deveriam fazer sempre, de forma bastante resumida é definir com o cliente como a aplicação deve se comportar, escrever um teste automatizado para verificar este comportamento e depois escrever código suficiente para fazer o comportamento da [...]<p>Post de: <a href="http://www.urubatan.com.br">Blog do Urubatan</a><br/>
Quer comprar meu livro <a href="http://livro.urubatan.com.br">Desenvolvimento F&aacute;cil e R&aacute;pido de Aplica&ccedil;&otilde;es web</a> com 30% de desconto? &Eacute; s&oacute; acessar o meu <a href="http://www.urubatan.com.br">blog</a> e pegar o c&oacute;digo :D<br/><br/><a href="http://www.urubatan.com.br/cucumber-e-bdd-vantagens-para-a-empresa-argumentos-para-o-gerente-para-o-arquiteto-para-o-presidente-da-empresa/">Cucumber e BDD &#8211; Vantagens para a empresa (Argumentos para o gerente, para o arquiteto, para o presidente da empresa, &#8230;)</a></p>
]]></description>
			<content:encoded><![CDATA[<p><center><img src="http://www.urubatan.com.br/wp-content/uploads/2009/12/cuke_logo-300x74.png" alt="" title="cuke_logo" width="300" height="74" class="alignnone size-medium wp-image-1762" /></center></p>
<h2>Desenvolvimento Guiado pelo Comportamento (BDD &#8211; Behaviour Driven Development)</h2>
<p>Desenvolvimento guiado pelo comportamento da aplicação é o que todos deveriam fazer sempre, de forma bastante resumida é definir com o cliente como a aplicação deve se comportar, escrever um teste automatizado para verificar este comportamento e depois escrever código suficiente para fazer o comportamento da aplicação ficar de acordo com o que o cliente deseja.</p>
<p>A diferença básica do <a href="http://behaviour-driven.org/">Behaviour Driven Development</a> (de agora em diante simplesmente BDD) para o desenvolvimento orientado por testes, é que o BDD coloca em foco o valor para o negócio que o software vai adicionar. Parece ser uma diferença puramente conceitual mas não é, por exemplo:<br />
<i>A tela inicial deve listar todos os clientes</i><br />
Não é a mesma coisa que<br />
<i>O método HomeController.index precisa popular a variável @clientes</i></p>
<ol>
<li>O primeiro é inteligivel para um leigo, o segundo é especifico para um sistema e apenas um programador entende</li>
<li>O primeiro é um exemplo de uma  definição de comportamento de uma tela, uma coisa que um cliente poderia dizer.</li>
<li>O segundo é um exemplo de como um programador poderia ler uma linha de código fonte.</li>
</ol>
<p>Claro que não são só estas diferenças, trabalhando mais com BDD percebe-se que ele poupa muito mais trabalho do que o TDD simples (Não que TDD seja simples de se adotar). BDD tem todas as vantagens de TDD e mais algumas, veja as duas listas abaixo:</p>
<p>Test Driven Development:</p>
<ol>
<li>O código gerado tem menor acomplamento e maior coesão.</li>
<li>O código gerado tem uma maior qualidade por ser quase 100% testado.</li>
<li>Refatoramentos podem ser feitos sem medo pois qualquer problema sera detectado pelos testes.</li>
<li>É possível saber claramente quando uma tarefa foi concluida, pois o teste correspondente esta passando.</li>
<li>Testes de regressão automatizados existem sem nenhum esforço adicional.</li>
<li>A maior parte dos bugs é encontrada mais cedo o que torna mais barato corrigi-los.</li>
</ol>
<p>Behavior Driven Development:</p>
<ol>
<li>Todos os anteriores</li>
<li>Aumenta a integração entre o cliente, os testadores e os desenvolvedores pois todos falam a mesma lingua.</li>
<li>Mesmo quando testadores e desenvolvedores são equipes diferentes eles podem trabalhar juntos para definir o design do que vai ser feito, escrever User Stories é uma ótima forma de fazer isto, pode ser feito com a ajuda do usuário ou pelo menos validada com o usuário que vai entender o que esta escrito.</li>
<li>User Stories servem como Test Case, Código do teste automatizado, e Design tudo junto.</li>
<li>As User Stories se tornam testes executáveis, o que quer dizer que o usuário pode escrever o código dos testes de aceitação (OK, isto é bem pouco provável, mas ele pode pelo menos ler)</li>
</ol>
<p>Ou seja, alem de gerar um código com mais qualidade, o BDD poupa trabalho de toda a equipe e o principal, melhora a comunicação, que tanto para quem trabalha com metodologias ágeis quanto para quem não trabalha é extremamente importante e a falta dela é um problema gravíssimo que leva diversos projetos ao fracasso. Na minha opinião, só o fato de melhorar a comunicação já é motivo o suficiente para testar BDD.</p>
<p>Claro que alguns dos benefícios que eu citei dependem do suporte de ferramentas, para ser mais preciso, as User Stories serem o código executável dos testes de aceitação depende de uma ferramenta para ser verdade, e a ferramenta que eu escolhi para isto é o <a href="http://cukes.info/">Cucumber</a>, do qual eu vou começar a falar com mais freqüência aqui no blog.</p>
<p>Eu pessoalmente encaro o BDD como uma evolução do TDD, eu sempre tive dificuldades em escrever testes unitários antes do código da aplicação, claro que para bibliotecas é fácil, mas para a interface com o usuário que consome boa parte do código da aplicação é bem complicado escrever testes estilo XUnit, mas quando as user stories se tornaram o código executável dos testes de aceitação da UI (pelo menos os básicos desconsiderando o layout) um novo mundo se abriu para mim e tudo passou a fazer sentido.</p>
<h2>Cucumber &#8211; Quem disse que pepinos seriam um problema?</h2>
<p><sub>para quem não percebeu este sub-titulo é uma brincadeira com a tradução da palavra cucumber que quer dizer pepino</sub><br/><br />
Cucumber é uma ferramenta que torna possível executar histórias em texto puro, ele é uma ferramenta escrita em Ruby que veio para substituir o RSpec Story Runner, e tem diversas vantagens sobre este. </p>
<p>O Cucumber, utiliza Ruby e expressões regulares para definir o que qualquer expressão quer dizer, mas antes de entrar nestes pormenores vamos entender um pouquinho da estrutura básica que o Cucumber define para as User Stories.</p>
<p>Para que seja possível executar uma User Storie utilizando o Cucumber, ela precisa ter uma estrutura básica.</p>
<ol>
<li>Para o cucumber, todas as User Stories referentes a uma funcionalidade do sistema estarão agrupadas em um arquivo com a extensão <i>.feature</i></li>
<li>No início de cada arquivo existe um resumo da funcionalidade com um formato bem simples: um título, qual o problema a ser resolvido, qual ator trabalha nesta história e qual o resultado desejado.</li>
<li>Logo depois são definidos os cenários, que são as histórias em si, cada arquivo tem pelo menos um cenário.</li>
<li>Cada história, ou cenário é composto por uma descrição ou título, uma ou mais pré condições, uma ou mais ações e uma ou mais verificações.</li>
</ol>
<p>Esta é uma forma de definir a estrutura básica de um arquivo <i>.feature</i> do Cucumber, claro que explicando desta forma estas definições se encaixam em muita coisa, então vamos ser um pouco mais especificos.</p>
<p>O Cucumber define algumas palavras chave para cada uma destas sessões, estas palavras chave podem ser traduzidas para diversas linguas, o primeiro exemplo eu vou colocar em ingês, depois vou mostrar o equivalente em portugues, mais adiante quando entrarmos na parte de configurações do cucumber vamos ver melhor como selecionar a lingua utilizada, e como customizar isto, mas por enquanto fiquemos com as configurações padrão.</p>
<pre>
	Feature: Simple math
		In order to avoid silly mistakes
		As a math idiot
		I want to be told the result of simple math operations

		Scenario: adition
			Given I have entered 50 into the calculator
			And I have entered 70 into the calculator
			When I press add
			Then I should see 120 on the screen

		Scenario: subtraction
			Given I have entered 60 into the calculator
			And I have entered 30 into the calculator
			When I press sub
			Then I should see 30 on the screen
</pre>
<p>Este é o exemplo de uma história bem simples que o cucumber pode interpretar, as palavras chave apresentadas são:</p>
<ul>
<li>Feature</li>
<li>Scenario</li>
<li>Given</li>
<li>And</li>
<li>When</li>
<li>Then</li>
</ul>
<p>Estas mesmas palavras podem ser traduzidas para o portugues como:</p>
<ul>
<li>Funcionalidade</li>
<li>Cenário</li>
<li>Dado</li>
<li>E</li>
<li>Quando</li>
<li>Então</li>
</ul>
<p>Utilizando estas palavras chave, seria possível escrever esta história assim em portugues:</p>
<pre>
	Funcionalidade: Matemática Simples
		Para evitar erros idiotas
		Como um completo ignorante em matemática
		Eu quero que operações simples de matemática sejam resolvidas para mim

		Cenário: adição
			Dado que eu digite 50 na calculadora
			E que eu digite 70 na calculadora
			Quando eu precionar "Adicione"
			Então eu devo ver 120 na tela

		Cenário: subtração
			Dado que eu digite 60 na calculadora
			E que eu digite 30 na calculadora
			Quando eu precionar "Subtraia"
			Então eu devo ver 30 na tela
</pre>
<p>O legal é que esta histórinha poderia ser escrita por um usuário, as únicas regras reais são:</p>
<ol>
<li>Começar as frases com as palavras chave definidas</li>
<li>Tentar utilizar as mesmas frases sempre que possível, isto vai facilitar na tradução do dialeto utilizado para Ruby</li>
</ol>
<p>A estrutura que utilizei na descrição da funcionalidade não esta descrita em palavras chave por que ela não é interpretada pelo cucumber, é apenas uma descrição e o formato pode variar um pouco.</p>
<p>Mas por que utilizar esta ferramenta para testes em vez de qualquer outra?<br />
Por que utilizar o cucumber como ferramenta de testes vai viabilizar uma abordagem BDD no desenvolvimento do seu sistema, e que isto vai te poupar muito dinheiro.</p>
<h2>Seguem agora alguns argumentos (fora os que você pode retirar do texto)</h2>
<ul>
<li><b>Presidente da empresa</b>
<ul>
<li>Esta metodologia de desenvolvimento em conjunto com as ferramentas corretas vão poupar bastante dinheiro no desenvolvimento de sistemas</li>
</ul>
</li>
<li><b>Gerente</b>
<ul>
<li>A integração entre as equipes de desenvolvimento e os clientes vai melhorar muito, isto vai fazer com que os clientes fiquem mais felizes com as entregas, possam acompanhar o progresso do desenvolvimento e entendam se o que esta sendo testado é o que realmente importa para eles melhorando a qualidade do que é entregue</li>
</ul>
</li>
<li><b>Arquiteto</b>
<ul>
<li>Esta metodologia vai melhorar o entendimento da equipe sobre o que deve ser desenvolvido</li>
</ul>
</li>
<li><b>Desenvolvedores e Testadores</b>
<ul>
<li>É legal trabalhar desta forma, e você vai trabalhar menos no final das contas o que é bom e ermite que você exercite a sua preguiça <img src='http://www.urubatan.com.br/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </li>
</ul>
</li>
</ul>
<p>Acho que era isto, falei um pouco de BDD, um monte de Cucumber e acho que consegui mostrar a idéia geral, mas isto vai ficar um pouco mais claro nos próximos posts sobre o Cucumber.<br />
PS.: parabéns pela paciência se você leu até aqui <img src='http://www.urubatan.com.br/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </p>
<p>Post de: <a href="http://www.urubatan.com.br">Blog do Urubatan</a><br/>
Quer comprar meu livro <a href="http://livro.urubatan.com.br">Desenvolvimento F&aacute;cil e R&aacute;pido de Aplica&ccedil;&otilde;es web</a> com 30% de desconto? &Eacute; s&oacute; acessar o meu <a href="http://www.urubatan.com.br">blog</a> e pegar o c&oacute;digo :D<br/><br/><a href="http://www.urubatan.com.br/cucumber-e-bdd-vantagens-para-a-empresa-argumentos-para-o-gerente-para-o-arquiteto-para-o-presidente-da-empresa/">Cucumber e BDD &#8211; Vantagens para a empresa (Argumentos para o gerente, para o arquiteto, para o presidente da empresa, &#8230;)</a></p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/BlogDoUrubatan?a=-Ba4HmvQn9Q:11IvhzymjfA:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/BlogDoUrubatan?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/BlogDoUrubatan?a=-Ba4HmvQn9Q:11IvhzymjfA:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/BlogDoUrubatan?i=-Ba4HmvQn9Q:11IvhzymjfA:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/BlogDoUrubatan?a=-Ba4HmvQn9Q:11IvhzymjfA:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/BlogDoUrubatan?i=-Ba4HmvQn9Q:11IvhzymjfA:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/BlogDoUrubatan?a=-Ba4HmvQn9Q:11IvhzymjfA:HCBZNhuKwNY"><img src="http://feeds.feedburner.com/~ff/BlogDoUrubatan?d=HCBZNhuKwNY" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/BlogDoUrubatan?a=-Ba4HmvQn9Q:11IvhzymjfA:Iu4eqwUi9wI"><img src="http://feeds.feedburner.com/~ff/BlogDoUrubatan?d=Iu4eqwUi9wI" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/BlogDoUrubatan?a=-Ba4HmvQn9Q:11IvhzymjfA:BxLlmz8_Wzw"><img src="http://feeds.feedburner.com/~ff/BlogDoUrubatan?d=BxLlmz8_Wzw" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/BlogDoUrubatan/~4/-Ba4HmvQn9Q" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.urubatan.com.br/cucumber-e-bdd-vantagens-para-a-empresa-argumentos-para-o-gerente-para-o-arquiteto-para-o-presidente-da-empresa/feed/</wfw:commentRss>
		<slash:comments>16</slash:comments>
		<coop:keyword>Ruby</coop:keyword><coop:keyword>bdd</coop:keyword><coop:keyword>cucumber</coop:keyword><coop:keyword>lcucumber</coop:keyword><feedburner:origLink>http://www.urubatan.com.br/cucumber-e-bdd-vantagens-para-a-empresa-argumentos-para-o-gerente-para-o-arquiteto-para-o-presidente-da-empresa/</feedburner:origLink></item>
	</channel>
</rss>
