<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="http://feeds.urubatan.com.br/~d/styles/rss2portuguesefull.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.urubatan.com.br/~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:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:creativeCommons="http://backend.userland.com/creativeCommonsRssModule" 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, Arquiteto, Palestrante, Coordenador do RSJUG, Patinador e Blogger</description>
	<pubDate>Tue, 15 Jul 2008 23:42:16 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.5</generator>
	<language>en</language>
			<geo:lat>-30.036066</geo:lat><geo:long>-51.196015</geo:long><creativeCommons:license>http://creativecommons.org/licenses/by/2.0/</creativeCommons:license><image><link>http://blog.urubatan.com.br</link><url>http://feeds.feedburner.com/~fc/UrubatansWeblog?bg=99CCFF&amp;amp;fg=444444&amp;amp;anim=1</url><title>Rodrigo Urubatan</title></image><xhtml:meta xmlns:xhtml="http://www.w3.org/1999/xhtml" name="robots" content="noindex" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" href="http://www.urubatan.com.br/feed/" type="application/rss+xml" /><feedburner:emailServiceId>259384</feedburner:emailServiceId><feedburner:feedburnerHostname>http://www.feedburner.com</feedburner:feedburnerHostname><feedburner:feedFlare href="http://add.my.yahoo.com/rss?url=http%3A%2F%2Fwww.urubatan.com.br%2Ffeed%2F" src="http://us.i1.yimg.com/us.yimg.com/i/us/my/addtomyyahoo4.gif">Subscribe with My Yahoo!</feedburner:feedFlare><feedburner:feedFlare href="http://www.newsgator.com/ngs/subscriber/subext.aspx?url=http%3A%2F%2Fwww.urubatan.com.br%2Ffeed%2F" src="http://www.newsgator.com/images/ngsub1.gif">Subscribe with NewsGator</feedburner:feedFlare><feedburner:feedFlare href="http://feeds.my.aol.com/add.jsp?url=http%3A%2F%2Fwww.urubatan.com.br%2Ffeed%2F" src="http://o.aolcdn.com/favorites.my.aol.com/webmaster/ffclient/webroot/locale/en-US/images/myAOLButtonSmall.gif">Subscribe with My AOL</feedburner:feedFlare><feedburner:feedFlare href="http://www.rojo.com/add-subscription?resource=http%3A%2F%2Fwww.urubatan.com.br%2Ffeed%2F" src="http://blog.rojo.com/RojoWideRed.gif">Subscribe with Rojo</feedburner:feedFlare><feedburner:feedFlare href="http://www.bloglines.com/sub/http://www.urubatan.com.br/feed/" src="http://www.bloglines.com/images/sub_modern11.gif">Subscribe with Bloglines</feedburner:feedFlare><feedburner:feedFlare href="http://www.netvibes.com/subscribe.php?url=http%3A%2F%2Fwww.urubatan.com.br%2Ffeed%2F" src="http://www.netvibes.com/img/add2netvibes.gif">Subscribe with Netvibes</feedburner:feedFlare><feedburner:feedFlare href="http://fusion.google.com/add?feedurl=http%3A%2F%2Fwww.urubatan.com.br%2Ffeed%2F" src="http://buttons.googlesyndication.com/fusion/add.gif">Subscribe with Google</feedburner:feedFlare><feedburner:feedFlare href="http://www.pageflakes.com/subscribe.aspx?url=http%3A%2F%2Fwww.urubatan.com.br%2Ffeed%2F" src="http://www.pageflakes.com/ImageFile.ashx?instanceId=Static_4&amp;fileName=ATP_blu_91x17.gif">Subscribe with Pageflakes</feedburner:feedFlare><item>
		<title>Testes unitários em C++ para um programador Java!</title>
		<link>http://feeds.urubatan.com.br/~r/UrubatansWeblog/~3/336547297/</link>
		<comments>http://www.urubatan.com.br/testes-unitarios-em-c-para-um-programador-java/#comments</comments>
		<pubDate>Tue, 15 Jul 2008 23:42:16 +0000</pubDate>
		<dc:creator>Urubatan</dc:creator>
		
		<category><![CDATA[Artigos]]></category>

		<category><![CDATA[c++]]></category>

		<category><![CDATA[cppunit]]></category>

		<category><![CDATA[exemplo]]></category>

		<category><![CDATA[tdd]]></category>

		<category><![CDATA[unit test]]></category>

		<guid isPermaLink="false">http://www.urubatan.com.br/?p=1399</guid>
		<description>English version here
Eu trabalhei com C++ quando iniciei no mundo da programação (entre 1997 e 2000), mas na época eu trabalhava com o Borland C++ Builder e o Microsoft Visual C++, naquela época eu ainda não tinha ouvido falar em testes unitários, depois disto eu trabalhei com Delphi, PHO, ASP, ColdFusion, &amp;#8230;
Desde 2002 eu trabalhei [...]</description>
			<content:encoded><![CDATA[<p><a href="http://www.urubatan.info/2008/07/unit-tests-in-c-for-a-java-gui/" onclick="javascript:urchinTracker ('/outbound/article/www.urubatan.info');">English version here</a><br />
Eu trabalhei com C++ quando iniciei no mundo da programação (entre 1997 e 2000), mas na época eu trabalhava com o Borland C++ Builder e o Microsoft Visual C++, naquela época eu ainda não tinha ouvido falar em testes unitários, depois disto eu trabalhei com Delphi, PHO, ASP, ColdFusion, &#8230;<br />
Desde 2002 eu trabalhei a maior parte do tempo com Java, e aprendi muito neste período, muitas boas práticas, muito sobre orientação a objetos e principalmente, aprendi a amar os testes unitários.<br />
Pouco tempo atrás eu voltei a trabalhar com C++, mas já viciado em testes unitários, e querendo aplica-los ao meu código C++ também, e este post é um exemplo bem curto de como um programador Java pode trabalhar com C++ utilizando testes unitários.</p>
<p>Um projeto C++ começa por um Makefile, eu estou acostumado com o ANT e não gosto da idéia de listar todos os meus arquivos fonte na configuração de build como a maior parte dos exemplos de Makefiles fazem, então eu criei um Makefile simples, mas bastante flexível para o meu projeto.</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>TESTDIRECTORIES := test
DIRECTORIES := src
SOURCES := $(foreach dir,$(DIRECTORIES),$(wildcard $(dir)/*.cpp))
TESTSOURCES := $(foreach dir,$(TESTDIRECTORIES),$(wildcard $(dir)/*.cpp))
OBJECTS := $(patsubst %.cpp,%.obj,$(SOURCES))
TESTOBJECTS := $(patsubst %.cpp,%.obj,$(TESTSOURCES))
TESTOBJECTS += $(filter-out src/main.obj,$(OBJECTS))
TARGET := example
LINK := g++
CC := g++
CFLAGS := -c
LFLAGS :=
&nbsp;
all: $(OBJECTS)
	$(LINK) $(LFLAGS) -o $(TARGET) $(OBJECTS)
&nbsp;
test: $(TESTOBJECTS)
	$(LINK) $(LFLAGS) -lcppunit -o $(TARGET)_unit $(TESTOBJECTS) 
	./$(TARGET)_unit
&nbsp;
%.obj:%.cpp
	$(CC) $(CFLAGS) -o $*.obj $*.cpp</pre></td></tr></table></div>

<p>Com este Makefile, todos os arquivos .cpp que estiverem no diretório src farão parte do executável gerado, mais diretórios podem ser adicionados simplesmente atualizando a variável DIRECTORIES, a mesma coisa acontece com o diretório test e a variável TESTDIRECTORIES para os testes unitários.<br />
O truque aqui é a combinação das funções foreach e wildcard, a função pathsubst é usada para alterar as extensões de .cpp para .obj e a função filter-out é usada para remover o main.cpp dos testes unitários pois este arquivo é apenas o ponto de entrada para o executável principal.<br />
Este Makefile é o mais próximo que eu consegui chegar da funcionalidade do ANT para programação C++, claro que ela pode ser melhorada, considerando que eu não sou um especialista em Makefiles.<br />
Mas o Makefile não é o motivo deste post, estou escrevendo para contar para vocês sobre o <a href="http://cppunit.sourceforge.net/" onclick="javascript:urchinTracker ('/outbound/article/cppunit.sourceforge.net');">CppUnit</a>, uma ótima implementação xUnit para C++.<br />
Eu comecei o projeto escrevendo o &#8220;executador de testes&#8221; do CppUnit:<br />
<b>testRunner.hpp</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
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
</pre></td><td class="code"><pre class="cpp"><span style="color: #339900;">#include &lt;cppunit/CompilerOutputter.h&gt;</span>
<span style="color: #339900;">#include &lt;cppunit/extensions/TestFactoryRegistry.h&gt;</span>
<span style="color: #339900;">#include &lt;cppunit/TestResult.h&gt;</span>
<span style="color: #339900;">#include &lt;cppunit/TestResultCollector.h&gt;</span>
<span style="color: #339900;">#include &lt;cppunit/TestRunner.h&gt;</span>
<span style="color: #339900;">#include &lt;cppunit/BriefTestProgressListener.h&gt;</span>
&nbsp;
<span style="color: #0000ff;">int</span> main <span style="color: #000000;">&#40;</span><span style="color: #0000ff;">int</span> argc, <span style="color: #0000ff;">char</span>* argv<span style="color: #000000;">&#91;</span><span style="color: #000000;">&#93;</span><span style="color: #000000;">&#41;</span>
<span style="color: #000000;">&#123;</span>
    <span style="color: #ff0000;">// informs test-listener about testresults</span>
    CPPUNIT_NS :: <span style="color: #00eeff;">TestResult</span> testresult;
&nbsp;
    <span style="color: #ff0000;">// register listener for collecting the test-results</span>
    CPPUNIT_NS :: <span style="color: #00eeff;">TestResultCollector</span> collectedresults;
    testresult.<span style="color: #00eeff;">addListener</span> <span style="color: #000000;">&#40;</span>&amp;collectedresults<span style="color: #000000;">&#41;</span>;
&nbsp;
    <span style="color: #ff0000;">// register listener for per-test progress output</span>
    CPPUNIT_NS :: <span style="color: #00eeff;">BriefTestProgressListener</span> progress;
    testresult.<span style="color: #00eeff;">addListener</span> <span style="color: #000000;">&#40;</span>&amp;progress<span style="color: #000000;">&#41;</span>;
&nbsp;
    <span style="color: #ff0000;">// insert test-suite at test-runner by registry</span>
    CPPUNIT_NS :: <span style="color: #00eeff;">TestRunner</span> testrunner;
    testrunner.<span style="color: #00eeff;">addTest</span> <span style="color: #000000;">&#40;</span>CPPUNIT_NS :: <span style="color: #00eeff;">TestFactoryRegistry</span> :: <span style="color: #00eeff;">getRegistry</span> <span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>.<span style="color: #00eeff;">makeTest</span> <span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span>;
    testrunner.<span style="color: #00eeff;">run</span> <span style="color: #000000;">&#40;</span>testresult<span style="color: #000000;">&#41;</span>;
&nbsp;
    <span style="color: #ff0000;">// output results in compiler-format</span>
    CPPUNIT_NS :: <span style="color: #00eeff;">CompilerOutputter</span> compileroutputter <span style="color: #000000;">&#40;</span>&amp;collectedresults, std::<span style="color: #0000dd;">cerr</span><span style="color: #000000;">&#41;</span>;
    compileroutputter.<span style="color: #00eeff;">write</span> <span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>;
&nbsp;
    <span style="color: #ff0000;">// return 0 if tests were successful</span>
    <span style="color: #0000ff;">return</span> collectedresults.<span style="color: #00eeff;">wasSuccessful</span> <span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span> ? <span style="color: #0000dd;">0</span> : <span style="color: #0000dd;">1</span>;
<span style="color: #000000;">&#125;</span></pre></td></tr></table></div>

<p>CppUnit é mito flexível, permitindo diversos tipos de saída para os resultados dos testes, mas escreverei sobre isto em outro post, a idéia atrás deste &#8220;executador&#8221; é a utilização do registro de testes do CppUnit, o que torna a vida muito mais fácil.<br />
O registro de testes é bem próximo ao fileset passado a task junit do ant, mas os testes se registram sozinhos.<br />
Depois do &#8220;executador de testes&#8221; pronto, podemos começar a escrever os testes unitários.<br />
Em C++ diferente do Java, são necessários dois arquivos para cada classe, um cabeçalho e uma implementação.<br />
Então, vamos começar com o cabeçalho.<br />
<b>mainTest.hpp</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
17
18
19
20
21
22
23
24
</pre></td><td class="code"><pre class="cpp"><span style="color: #339900;">#ifndef MAINTEST_H</span>
<span style="color: #339900;">#define MAINTEST_H</span>
&nbsp;
<span style="color: #339900;">#include &lt;cppunit/TestFixture.h&gt;</span>
<span style="color: #339900;">#include &lt;cppunit/extensions/HelperMacros.h&gt;</span>
<span style="color: #339900;">#include &quot;../src/HelloWorld.hpp&quot;</span>
&nbsp;
<span style="color: #0000ff;">using</span> <span style="color: #0000ff;">namespace</span> std;
&nbsp;
<span style="color: #0000ff;">class</span> MainTest : <span style="color: #0000ff;">public</span> CPPUNIT_NS :: <span style="color: #00eeff;">TestFixture</span>
<span style="color: #000000;">&#123;</span>
    CPPUNIT_TEST_SUITE <span style="color: #000000;">&#40;</span>MainTest<span style="color: #000000;">&#41;</span>;
    CPPUNIT_TEST <span style="color: #000000;">&#40;</span>testHello<span style="color: #000000;">&#41;</span>;
    CPPUNIT_TEST_SUITE_END <span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>;
&nbsp;
    <span style="color: #0000ff;">public</span>:
        <span style="color: #0000ff;">void</span> setUp <span style="color: #000000;">&#40;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&#41;</span>;
        <span style="color: #0000ff;">void</span> tearDown <span style="color: #000000;">&#40;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&#41;</span>;
        <span style="color: #0000ff;">void</span> testHello <span style="color: #000000;">&#40;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&#41;</span>;
    <span style="color: #0000ff;">private</span>:
        HelloWorld *hello;
<span style="color: #000000;">&#125;</span>;
CPPUNIT_TEST_SUITE_REGISTRATION <span style="color: #000000;">&#40;</span>MainTest<span style="color: #000000;">&#41;</span>;
<span style="color: #339900;">#endif</span></pre></td></tr></table></div>

<p>Neste cabeçalho temos uma declaração de classe simples, extendendo TestFixture do namespace do CppUnit.<br />
C++ não possui reflexão, por isto o CppUnit possui algumas macros para definir o teste, que podem ser vistas no início da declaração da classe, será necessária uma linha com CPPUNIT_TEST para cada método de teste que você declarar.<br />
A linha: CPPUNIT_TEST_SUITE_REGISTRATION (MainTest);<br />
Faz a mágica do auto registro dos testes.<br />
Com isto pronto, você pode começar a implementar a classe de testes como faria em java:<br />
<b>mainTest.cpp</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
</pre></td><td class="code"><pre class="cpp"><span style="color: #339900;">#include &quot;mainTest.hpp&quot;</span>
&nbsp;
<span style="color: #0000ff;">void</span> MainTest::<span style="color: #00eeff;">setUp</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#123;</span> 
	hello = <span style="color: #0000dd;">new</span> HelloWorld<span style="color: #000000;">&#40;</span><span style="color: #666666;">&quot;Test&quot;</span><span style="color: #000000;">&#41;</span>;
<span style="color: #000000;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">void</span> MainTest::<span style="color: #00eeff;">tearDown</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#123;</span>
	<span style="color: #0000dd;">delete</span> hello;
<span style="color: #000000;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">void</span> MainTest::<span style="color: #00eeff;">testHello</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#123;</span>
	string expected<span style="color: #000000;">&#40;</span><span style="color: #666666;">&quot;Hello Test<span style="color: #666666; font-weight: bold;">\n</span>&quot;</span><span style="color: #000000;">&#41;</span>;
	CPPUNIT_ASSERT_EQUAL<span style="color: #000000;">&#40;</span>expected,hello-&gt;sayHello<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span>;
<span style="color: #000000;">&#125;</span></pre></td></tr></table></div>

<p>Como no JUnit existem os métodos setUp e tearDown que são executados antes e depois de cada um dos testes, e o método testHello possui o código do teste (ja que só foi implementado um para este exemplo).<br />
As asserções no CppUnit são feitas utilizando macros.<br />
O CppUnit disponibiliza as seguintes asserções:</p>
<ul>
<li>CPPUNIT_ASSERT(condition)</li>
<li>CPPUNIT_ASSERT_MESSAGE(message,condition)</li>
<li>CPPUNIT_FAIL( message )</li>
<li>CPPUNIT_ASSERT_EQUAL(expected,actual)</li>
<li>CPPUNIT_ASSERT_EQUAL_MESSAGE(message,expected,actual)</li>
<li>CPPUNIT_ASSERT_DOUBLES_EQUAL(expected,actual,delta)</li>
<li>CPPUNIT_ASSERT_THROW( expression, ExceptionType )</li>
</ul>
<p>Muito menos do que no JUnit, mas o suficiente para a grande maioria dos casos.<br />
Depois do teste pronto, agora precisamos escrever o código para que os testes passem.<br />
<b>HelloWord.hpp</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
</pre></td><td class="code"><pre class="cpp"><span style="color: #339900;">#include &lt;stdio.h&gt;</span>
<span style="color: #339900;">#include &lt;iostream&gt;</span>
&nbsp;
<span style="color: #339900;">#ifndef MAIN_HPP</span>
<span style="color: #339900;">#define MAINHPP</span>
<span style="color: #0000ff;">class</span> HelloWorld<span style="color: #000000;">&#123;</span>
<span style="color: #0000ff;">private</span>:
	std::<span style="color: #00eeff;">string</span> name;
<span style="color: #0000ff;">public</span>:
	HelloWorld<span style="color: #000000;">&#40;</span><span style="color: #0000ff;">char</span>* name<span style="color: #000000;">&#41;</span>;
	std::<span style="color: #00eeff;">string</span> sayHello<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>;
<span style="color: #000000;">&#125;</span>;
<span style="color: #339900;">#endif</span></pre></td></tr></table></div>

<p>E a implementação:<br />
<b>HelloWord.cpp</b></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="cpp"><span style="color: #339900;">#include &quot;HelloWorld.hpp&quot;</span>
&nbsp;
HelloWorld::<span style="color: #00eeff;">HelloWorld</span><span style="color: #000000;">&#40;</span><span style="color: #0000ff;">char</span>* name<span style="color: #000000;">&#41;</span><span style="color: #000000;">&#123;</span>
	this-&gt;name = name;
<span style="color: #000000;">&#125;</span>
&nbsp;
std::<span style="color: #00eeff;">string</span> HelloWorld::<span style="color: #00eeff;">sayHello</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#123;</span>
	std::<span style="color: #00eeff;">string</span> result<span style="color: #000000;">&#40;</span><span style="color: #666666;">&quot;Hello &quot;</span><span style="color: #000000;">&#41;</span>;
	result = result + name + <span style="color: #666666;">&quot;<span style="color: #666666; font-weight: bold;">\n</span>&quot;</span>;
	<span style="color: #0000ff;">return</span> result;
<span style="color: #000000;">&#125;</span></pre></td></tr></table></div>

<p>Para executar os testes, basta você executar no console:<br />
make test<br />
Agora que todos os testes foram escritos e estão passando, o último passo é escrever o código para inicializar a aplicação:<br />
<b>main.cpp</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="cpp"><span style="color: #339900;">#include &quot;HelloWorld.hpp&quot;</span>
<span style="color: #0000ff;">int</span> main<span style="color: #000000;">&#40;</span><span style="color: #0000ff;">int</span> argc, <span style="color: #0000ff;">char</span>** argv<span style="color: #000000;">&#41;</span><span style="color: #000000;">&#123;</span>
	<span style="color: #0000ff;">if</span> <span style="color: #000000;">&#40;</span>argc &gt;= <span style="color: #0000dd;">2</span><span style="color: #000000;">&#41;</span> <span style="color: #000000;">&#123;</span>
		HelloWorld* hello = <span style="color: #0000dd;">new</span> HelloWorld<span style="color: #000000;">&#40;</span>argv<span style="color: #000000;">&#91;</span><span style="color: #0000dd;">1</span><span style="color: #000000;">&#93;</span><span style="color: #000000;">&#41;</span>;
		std::<span style="color: #0000dd;">cout</span> &lt;&lt; hello-&gt;sayHello<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>;
		<span style="color: #0000dd;">delete</span> hello;
	<span style="color: #000000;">&#125;</span>
<span style="color: #000000;">&#125;</span></pre></td></tr></table></div>

<p>E você tem a sua primeira aplicação test driven escrita em C++!<br />
PS.: se você esta utilizando o Makefile que escrevi, lembre que o código da aplicação deve ficar no diretório src e o código de testes no diretório test.<br />
PS2.: O exemplo foi testado em um linux com o CppUnit instalado pelo gerenciador de pacotes, se você quiser instalar o cppunit usando o código fonte ou for executar em outra plataforma lembre-se de atualizar o CFLAGS com os caminhos de influde corretos e o LFLAGS com o caminho da biblioteca do cppunit, se você não esta utilizando o g++ como compilador e linker,  lembre-se de atualizar as variáveis CC e LINK.</p>

<p><a href="http://feeds.urubatan.com.br/~a/UrubatansWeblog?a=k2NyCU"><img src="http://feeds.urubatan.com.br/~a/UrubatansWeblog?i=k2NyCU" border="0"></img></a></p><div class="feedflare">
<a href="http://feeds.urubatan.com.br/~f/UrubatansWeblog?a=rXhHCj"><img src="http://feeds.urubatan.com.br/~f/UrubatansWeblog?i=rXhHCj" border="0"></img></a> <a href="http://feeds.urubatan.com.br/~f/UrubatansWeblog?a=KfvQLj"><img src="http://feeds.urubatan.com.br/~f/UrubatansWeblog?i=KfvQLj" border="0"></img></a> <a href="http://feeds.urubatan.com.br/~f/UrubatansWeblog?a=aT8TKj"><img src="http://feeds.urubatan.com.br/~f/UrubatansWeblog?i=aT8TKj" border="0"></img></a> <a href="http://feeds.urubatan.com.br/~f/UrubatansWeblog?a=epLR2J"><img src="http://feeds.urubatan.com.br/~f/UrubatansWeblog?i=epLR2J" border="0"></img></a> <a href="http://feeds.urubatan.com.br/~f/UrubatansWeblog?a=KoZhEJ"><img src="http://feeds.urubatan.com.br/~f/UrubatansWeblog?i=KoZhEJ" border="0"></img></a> <a href="http://feeds.urubatan.com.br/~f/UrubatansWeblog?a=AGhPrJ"><img src="http://feeds.urubatan.com.br/~f/UrubatansWeblog?i=AGhPrJ" border="0"></img></a> <a href="http://feeds.urubatan.com.br/~f/UrubatansWeblog?a=p01gbJ"><img src="http://feeds.urubatan.com.br/~f/UrubatansWeblog?i=p01gbJ" border="0"></img></a> <a href="http://feeds.urubatan.com.br/~f/UrubatansWeblog?a=Id8VYJ"><img src="http://feeds.urubatan.com.br/~f/UrubatansWeblog?i=Id8VYJ" border="0"></img></a>
</div><img src="http://feeds.urubatan.com.br/~r/UrubatansWeblog/~4/336547297" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.urubatan.com.br/testes-unitarios-em-c-para-um-programador-java/feed/</wfw:commentRss>
		<feedburner:awareness>http://api.feedburner.com/awareness/1.0/GetItemData?uri=UrubatansWeblog&amp;itemurl=http%3A%2F%2Fwww.urubatan.com.br%2Ftestes-unitarios-em-c-para-um-programador-java%2F</feedburner:awareness><feedburner:origLink>http://www.urubatan.com.br/testes-unitarios-em-c-para-um-programador-java/</feedburner:origLink></item>
		<item>
		<title>RSpec Stories - Ruby gerado a partir do texto!</title>
		<link>http://feeds.urubatan.com.br/~r/UrubatansWeblog/~3/326005088/</link>
		<comments>http://www.urubatan.com.br/rspec-stories-ruby-gerado-a-partir-do-texto/#comments</comments>
		<pubDate>Thu, 03 Jul 2008 18:34:41 +0000</pubDate>
		<dc:creator>Urubatan</dc:creator>
		
		<category><![CDATA[Ruby]]></category>

		<category><![CDATA[rails]]></category>

		<category><![CDATA[bdd]]></category>

		<category><![CDATA[rspec]]></category>

		<category><![CDATA[util]]></category>

		<guid isPermaLink="false">http://www.urubatan.com.br/?p=1398</guid>
		<description>Não, eu não quero que vocês gerem o código dos testes, isto iria apenas criar testes inúteis!
Mas eu acho muito chato ter certeza de que todos os possíveis passos de um arquivo txt com a user story estão presentes nos passos definidos no arquivo .rb
Claro que isto não esta considerando reutilização de passos através de [...]</description>
			<content:encoded><![CDATA[<p>Não, eu não quero que vocês gerem o código dos testes, isto iria apenas criar testes inúteis!<br />
Mas eu acho muito chato ter certeza de que todos os possíveis passos de um arquivo txt com a user story estão presentes nos passos definidos no arquivo .rb<br />
Claro que isto não esta considerando reutilização de passos através de Mixins ou outras técnicas semelhantes, mas este script me ajudou bastante ja, então resolvi compartilhar ele para quem estiver interessado <img src='http://www.urubatan.com.br/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </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
</pre></td><td class="code"><pre class="ruby">name=ARGV<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#006666;">0</span><span style="color:#006600; font-weight:bold;">&#93;</span>
all = <span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#006600; font-weight:bold;">&#93;</span>
last = <span style="color:#996600;">&quot;&quot;</span>
f = <span style="color:#CC00FF; font-weight:bold;">File</span>.<span style="color:#9900CC;">new</span><span style="color:#006600; font-weight:bold;">&#40;</span>name<span style="color:#006600; font-weight:bold;">&#41;</span>
f.<span style="color:#9900CC;">each_line</span> <span style="color:#9966CC; font-weight:bold;">do</span> |l|
  l.<span style="color:#9900CC;">strip</span>!
  l,command,params = *<span style="color:#006600; font-weight:bold;">&#40;</span>/^<span style="color:#006600; font-weight:bold;">&#40;</span>When|Then|Given|And<span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#006600; font-weight:bold;">&#40;</span>.<span style="color:#9900CC;">*</span><span style="color:#006600; font-weight:bold;">&#41;</span>/.<span style="color:#9900CC;">match</span> l<span style="color:#006600; font-weight:bold;">&#41;</span>
  <span style="color:#9966CC; font-weight:bold;">if</span> l
    command = last <span style="color:#9966CC; font-weight:bold;">if</span> command == <span style="color:#996600;">&quot;And&quot;</span>
    last = command
    params = params.<span style="color:#CC0066; font-weight:bold;">gsub</span> /<span style="color:#996600;">&quot;/, '<span style="color:#000099;">\&quot;</span>'
    all &lt;&lt; &quot;</span><span style="color:#008000; font-style:italic;">#{last} \&quot;#{params}\&quot; do\n    pending\n  end&quot;</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
<span style="color:#9966CC; font-weight:bold;">end</span>
all.<span style="color:#9900CC;">uniq</span>!.<span style="color:#9900CC;">sort</span>!
sym_name = name<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#CC00FF; font-weight:bold;">File</span>.<span style="color:#9900CC;">dirname</span><span style="color:#006600; font-weight:bold;">&#40;</span>name<span style="color:#006600; font-weight:bold;">&#41;</span>.<span style="color:#9900CC;">length</span><span style="color:#006666;">+1</span>..<span style="color:#006666;">-5</span><span style="color:#006600; font-weight:bold;">&#93;</span>
<span style="color:#CC0066; font-weight:bold;">puts</span> %Q<span style="color:#006600; font-weight:bold;">&#123;</span><span style="color:#CC0066; font-weight:bold;">require</span> <span style="color:#996600;">'stories/helper'</span>
steps_for<span style="color:#006600; font-weight:bold;">&#40;</span>:<span style="color:#008000; font-style:italic;">#{sym_name}) do</span>
<span style="color:#006600; font-weight:bold;">&#125;</span>
all.<span style="color:#9900CC;">each</span> <span style="color:#006600; font-weight:bold;">&#123;</span> |l| <span style="color:#CC0066; font-weight:bold;">puts</span> <span style="color:#996600;">&quot;  #{l}&quot;</span><span style="color:#006600; font-weight:bold;">&#125;</span>
<span style="color:#CC0066; font-weight:bold;">puts</span> %Q<span style="color:#006600; font-weight:bold;">&#123;</span><span style="color:#9966CC; font-weight:bold;">end</span> 
&nbsp;
with_steps_for :<span style="color:#008000; font-style:italic;">#{sym_name} do</span>
  run <span style="color:#996600;">&quot;<span style="color:#000099;">\#</span>{dir = File.dirname(__FILE__)}/#{sym_name}.txt&quot;</span>
<span style="color:#9966CC; font-weight:bold;">end</span>
<span style="color:#006600; font-weight:bold;">&#125;</span></pre></td></tr></table></div>

<p>eu salvei este código em um arquivo txt_to_steps.rb, e para utilizar basta executar:<br />
ruby txt_to_steps.rb <nome do arquivo com a user story e os cenários></p>
<p>Um exemplo de user story (utilizando o formato do RSpec) seria este texto:<br />
<block quote></p>
<pre>Story: new user
  As a company employee
  I want to register in the CRM
  So that I can see and manage company contacts

Scenario: user with no access to the system
  Given the username user1
  And the password mypassword
  When the login form is submited
  Then the login form should be shown again

Scenario: user registration
  Given the username user1
  And the password mypassword
  And the email user1@company.com
  When the registration form is submited
  And there is no other user with the same e-mail or email
  Then the registration should be OK
  And the user should be redirected to /

Scenario: repeated user registration
  Given the username user1
  And the password mypassword
  And the email user1@company.com
  When the registration form is submited
  And there is already another user with the same name or email
  Then the registration should fail
  And the registration form should apear again

Scenario: existing user login
  Given the username user1
  And the password mypassword
  When the login form is submited
  Then the user should be redirected to /
</pre>
</blockquote>
<p><center>
<script type="text/javascript"><!--
google_ad_client = "pub-7457173635319254";
google_ad_width = 468;
google_ad_height = 60;
google_ad_format = "468x60_as";
google_ad_type = "text_image";
//2007-08-17: urublogpost
google_ad_channel = "2828915611";
google_color_border = "336699";
google_color_bg = "FFFFFF";
google_color_link = "0000FF";
google_color_text = "000000";
google_color_url = "008000";
google_ui_features = "rc:10";
//-->
</script>
<script type="text/javascript"
  src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script></center><br />
O txt_to_steps pode ser melhorado para tentar identificar alguns padrões, mas como esta agora ja me poupou bastante trabalho <img src='http://www.urubatan.com.br/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /><br />
Sei que não é o código ruby mais limpo que vocês ja leram, mas para algo escrito em 5 minutos até que ficou legal <img src='http://www.urubatan.com.br/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </p>
<p>Se ajudar mais alguem, a única exigência é deixar um comentário aqui dizendo o que poderia ser melhorado no script <img src='http://www.urubatan.com.br/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </p>
<p>PS.: sei que o blog anda meio parado demais, mas é por um bom motivo, acho que daqui a um mes aproximadamente volta tudo ao normal e eu posso contar aqui o motivo deste tempo quase sem posts <img src='http://www.urubatan.com.br/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /></p>

<p><a href="http://feeds.urubatan.com.br/~a/UrubatansWeblog?a=sfpnyy"><img src="http://feeds.urubatan.com.br/~a/UrubatansWeblog?i=sfpnyy" border="0"></img></a></p><div class="feedflare">
<a href="http://feeds.urubatan.com.br/~f/UrubatansWeblog?a=kQGFAj"><img src="http://feeds.urubatan.com.br/~f/UrubatansWeblog?i=kQGFAj" border="0"></img></a> <a href="http://feeds.urubatan.com.br/~f/UrubatansWeblog?a=5Gtorj"><img src="http://feeds.urubatan.com.br/~f/UrubatansWeblog?i=5Gtorj" border="0"></img></a> <a href="http://feeds.urubatan.com.br/~f/UrubatansWeblog?a=oQEWqj"><img src="http://feeds.urubatan.com.br/~f/UrubatansWeblog?i=oQEWqj" border="0"></img></a> <a href="http://feeds.urubatan.com.br/~f/UrubatansWeblog?a=cd37PJ"><img src="http://feeds.urubatan.com.br/~f/UrubatansWeblog?i=cd37PJ" border="0"></img></a> <a href="http://feeds.urubatan.com.br/~f/UrubatansWeblog?a=80OiuJ"><img src="http://feeds.urubatan.com.br/~f/UrubatansWeblog?i=80OiuJ" border="0"></img></a> <a href="http://feeds.urubatan.com.br/~f/UrubatansWeblog?a=FhWC2J"><img src="http://feeds.urubatan.com.br/~f/UrubatansWeblog?i=FhWC2J" border="0"></img></a> <a href="http://feeds.urubatan.com.br/~f/UrubatansWeblog?a=pDepwJ"><img src="http://feeds.urubatan.com.br/~f/UrubatansWeblog?i=pDepwJ" border="0"></img></a> <a href="http://feeds.urubatan.com.br/~f/UrubatansWeblog?a=09nweJ"><img src="http://feeds.urubatan.com.br/~f/UrubatansWeblog?i=09nweJ" border="0"></img></a>
</div><img src="http://feeds.urubatan.com.br/~r/UrubatansWeblog/~4/326005088" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.urubatan.com.br/rspec-stories-ruby-gerado-a-partir-do-texto/feed/</wfw:commentRss>
		<feedburner:awareness>http://api.feedburner.com/awareness/1.0/GetItemData?uri=UrubatansWeblog&amp;itemurl=http%3A%2F%2Fwww.urubatan.com.br%2Frspec-stories-ruby-gerado-a-partir-do-texto%2F</feedburner:awareness><feedburner:origLink>http://www.urubatan.com.br/rspec-stories-ruby-gerado-a-partir-do-texto/</feedburner:origLink></item>
		<item>
		<title>Como implementar paginação para listboxes com muitos elementos com o ZK Framework</title>
		<link>http://feeds.urubatan.com.br/~r/UrubatansWeblog/~3/313232448/</link>
		<comments>http://www.urubatan.com.br/como-implementar-paginacao-para-listboxes-com-muitos-elementos-com-o-zk-framework/#comments</comments>
		<pubDate>Mon, 16 Jun 2008 19:08:10 +0000</pubDate>
		<dc:creator>Urubatan</dc:creator>
		
		<category><![CDATA[Dia a Dia]]></category>

		<category><![CDATA[rails]]></category>

		<guid isPermaLink="false">http://www.urubatan.com.br/?p=1397</guid>
		<description>Segue mais um post sobre o ZK Framework escrito pelo Marcos de Sousa.
Muito bom o post, e o ZK é bem legal tanbém, para saber mais sobre o ZK Framework podem dar uma olhada neste post,também escrito pelo Marcos.

Como implementar paginação para listboxes com muitos elementos 
by Marcos de Sousa (Maputo - Mozambique)
13/06/2008
Versão
Eu testei os [...]</description>
			<content:encoded><![CDATA[<p>Segue mais um post sobre o ZK Framework escrito pelo Marcos de Sousa.<br />
Muito bom o post, e o ZK é bem legal tanbém, para saber mais sobre o <a href="http://www.urubatan.com.br/review-zk-framework-%e2%80%93-o-modo-mais-simples-de-fazer-uma-aplicacao-web-rica/" >ZK Framework podem dar uma olhada neste post</a>,também escrito pelo Marcos.</p>
<hr/>
<h2>Como implementar paginação para listboxes com muitos elementos </h2>
<p><strong>by Marcos de Sousa (Maputo - Mozambique)<br />
13/06/2008</strong></p>
<p><strong class="style1">Versão</strong></p>
<p>Eu testei os códigos fontes com ZK 2.4.0, pelo que pode usar ZK 2.4.0 e versões recentes</p>
<p><span class="style1">A Questão</span></p>
<p>O componente listbox é utilizada para exibir uma série de elementos em uma lista. Os componentes listbox e grid suportam a paginação intrinsecamente. Se você tem uma lista com muitos elementos, por exemplo 1.000.000 elementos, isto vai abrandar a sua aplicação web, ele pode potencialmente utilizar uma grande quantidade de memória no servidor, limitando o número de usuários que podem ser suportados em qualquer tempo. Isto é o que nós não queremos que aconteça. Portanto, vamos corrigi-lo.</p>
<p><span class="style1">A Solução</span></p>
<p>Paginação é a forma mais simples e comum de dividir grandes quantidades de dados em pedaços pequenos. Paginação é uma parte fundamental no desenho duma aplicação web, tanto do ponto de vista de Desenho de Interface como do ponto de vista do servidor (para processar grandes conjuntos de forma eficiente, sem causar atrasos nos serviços recurso). ZK tem um componente básico chamado Paging. O componente paging é usado para separar longo conteúdo em várias páginas. Para resolver o problema temos de especificar um componente paging explicitamente.</p>
<p><span class="style1">A. Criando as Páginas:</span></p>
<p>Eu irei revisitar o código fornecido em <a href="http://en.wikibooks.org/wiki/ZK/How-Tos#ZK_2.x.x_.2B_Spring_2.x.x_.2B_Hibernate_3.x_.2B_JUnit_Test" onclick="javascript:urchinTracker ('/outbound/article/en.wikibooks.org');">http://en.wikibooks.org/wiki/ZK/How-Tos#ZK_2.x.x_.2B_Spring_2.x.x_.2B_Hibernate_3.x_.2B_JUnit_Test</a></p>
<p>Primeiro, vamos ver como utilizar um componente listbox com paginação intrinsecamente:</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="xml"><span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;?xml</span> <span style="color: #000066;">version</span>=<span style="color: #ff0000;">&quot;1.0″ encoding=&quot;</span>UTF<span style="color: #cc66cc;">-8</span>″<span style="font-weight: bold; color: black;">?&gt;</span></span>
<span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;window</span> <span style="color: #000066;">title</span>=<span style="color: #ff0000;">&quot;Listbox with Paging Intrinsically&quot;</span> <span style="color: #000066;">border</span>=<span style="color: #ff0000;">&quot;normal&quot;</span> <span style="color: #000066;">use</span>=<span style="color: #ff0000;">&quot;com.wikibook2.ui.EmployeeUI&quot;</span><span style="font-weight: bold; color: black;">&gt;</span></span>
<span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;listbox</span> <span style="color: #000066;">id</span>=<span style="color: #ff0000;">&quot;lstEmployee&quot;</span> <span style="color: #000066;">width</span>=<span style="color: #ff0000;">&quot;350px&quot;</span> <span style="color: #000066;">checkmark</span>=<span style="color: #ff0000;">&quot;true&quot;</span> <span style="color: #000066;">mold</span>=<span style="color: #ff0000;">&quot;paging&quot;</span> <span style="color: #000066;">pageSize</span>=<span style="color: #ff0000;">&quot;30″&gt;</span>
<span style="color: #009900;">&lt;listhead sizable=&quot;</span>true<span style="color: #ff0000;">&quot;&gt;</span>
<span style="color: #009900;">&lt;listheader label=&quot;</span>ID<span style="color: #ff0000;">&quot; sort=&quot;</span>auto<span style="color: #ff0000;">&quot; /&gt;</span>
<span style="color: #009900;">&lt;listheader label=&quot;</span>Full Name<span style="color: #ff0000;">&quot; sort=&quot;</span>auto<span style="color: #ff0000;">&quot; /&gt;</span>
<span style="color: #009900;">&lt;listheader label=&quot;</span>User Name<span style="color: #ff0000;">&quot; sort=&quot;</span>auto<span style="color: #ff0000;">&quot; /&gt;</span>
<span style="color: #009900;">&lt;/listhead&gt;</span>
<span style="color: #009900;">&lt;/listbox&gt;</span>
<span style="color: #009900;">&lt;/window&gt;</span></span></pre></td></tr></table></div>

<p>Agora, nós queremos usar uma listbox com um componente paging explicitamente:</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="xml"><span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;?xml</span> <span style="color: #000066;">version</span>=<span style="color: #ff0000;">&quot;1.0″ encoding=&quot;</span>UTF<span style="color: #cc66cc;">-8</span>″<span style="font-weight: bold; color: black;">?&gt;</span></span>
&nbsp;
<span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;window</span> <span style="color: #000066;">title</span>=<span style="color: #ff0000;">&quot;Listbox with Paging Explicitly&quot;</span> <span style="color: #000066;">border</span>=<span style="color: #ff0000;">&quot;normal&quot;</span> <span style="color: #000066;">use</span>=<span style="color: #ff0000;">&quot;com.wikibook2.ui.EmployeeUI&quot;</span><span style="font-weight: bold; color: black;">&gt;</span></span>
&nbsp;
<span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;listbox</span> <span style="color: #000066;">id</span>=<span style="color: #ff0000;">&quot;lstEmployee&quot;</span> <span style="color: #000066;">width</span>=<span style="color: #ff0000;">&quot;350px&quot;</span> <span style="color: #000066;">checkmark</span>=<span style="color: #ff0000;">&quot;true&quot;</span><span style="font-weight: bold; color: black;">&gt;</span></span>
<span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;listhead</span> <span style="color: #000066;">sizable</span>=<span style="color: #ff0000;">&quot;true&quot;</span><span style="font-weight: bold; color: black;">&gt;</span></span>
<span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;listheader</span> <span style="color: #000066;">label</span>=<span style="color: #ff0000;">&quot;ID&quot;</span> <span style="color: #000066;">sort</span>=<span style="color: #ff0000;">&quot;auto&quot;</span> <span style="font-weight: bold; color: black;">/&gt;</span></span>
<span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;listheader</span> <span style="color: #000066;">label</span>=<span style="color: #ff0000;">&quot;Full Name&quot;</span> <span style="color: #000066;">sort</span>=<span style="color: #ff0000;">&quot;auto&quot;</span> <span style="font-weight: bold; color: black;">/&gt;</span></span>
<span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;listheader</span> <span style="color: #000066;">label</span>=<span style="color: #ff0000;">&quot;User Name&quot;</span> <span style="color: #000066;">sort</span>=<span style="color: #ff0000;">&quot;auto&quot;</span> <span style="font-weight: bold; color: black;">/&gt;</span></span>
<span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;/listhead<span style="font-weight: bold; color: black;">&gt;</span></span></span>
<span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;/listbox<span style="font-weight: bold; color: black;">&gt;</span></span></span>
<span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;paging</span> <span style="color: #000066;">id</span>=<span style="color: #ff0000;">&quot;pagEmployee&quot;</span> <span style="color: #000066;">pageSize</span>=<span style="color: #ff0000;">&quot;30″ /&gt;</span>
&nbsp;
<span style="color: #009900;">&lt;/window&gt;</span></span></pre></td></tr></table></div>

<p>A única diferença é, em vez de nós especificar &#8220;<span class="style8">mold</span>=<span class="style6">&#8220;paging&#8221;</span>&#8221; nós não especificamos nada, e em adição nós usamos o componente paging explicitamente &#8220;<span class="style3">&lt;paging</span> <span class="style8">id</span>=<span class="style6">&#8220;pagEmployee&#8221;</span> <span class="style8">pageSize</span>=<span class="style6">&#8220;30&#8243;</span><span class="style3">/&gt;</span>&#8220;. É tudo no Desenho de Interface.</p>
<p><span class="style1">B. Código – Desenho de Interface:</span></p>
<p>Vamos dar uma olhadela para a classe <strong>EmployeeUI</strong>:</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
</pre></td><td class="code"><pre class="java"><span style="color: #000000; font-weight: bold;">package</span> com.<span style="color: #006600;">wikibook2</span>.<span style="color: #006600;">ui</span>;
<span style="color: #808080; font-style: italic;">// Imports Omitted</span>
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> EmployeeUI <span style="color: #000000; font-weight: bold;">extends</span> SimpleWindow <span style="color: #000000; font-weight: bold;">implements</span> AfterCompose <span style="color: #66cc66;">&#123;</span>
<span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000000; font-weight: bold;">final</span> <span style="color: #aaaadd; font-weight: bold;">String</span> LST_EMPLOYEE = <span style="color: #ff0000;">&quot;lstEmployee&quot;</span>;
<span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000000; font-weight: bold;">final</span> <span style="color: #aaaadd; font-weight: bold;">String</span> PAG_EMPLOYEE = <span style="color: #ff0000;">&quot;pagEmployee&quot;</span>;
<span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000000; font-weight: bold;">final</span> <span style="color: #aaaadd; font-weight: bold;">String</span> MAN_EMPLOYEE = <span style="color: #ff0000;">&quot;employeeManager&quot;</span>;
<span style="color: #000000; font-weight: bold;">private</span> GenericManager employeeManager;
<span style="color: #000000; font-weight: bold;">public</span> EmployeeUI<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
employeeManager = <span style="color: #66cc66;">&#40;</span>GenericManager<span style="color: #66cc66;">&#41;</span> SpringUtil.<span style="color: #006600;">getBean</span><span style="color: #66cc66;">&#40;</span>MAN_EMPLOYEE<span style="color: #66cc66;">&#41;</span>;
<span style="color: #66cc66;">&#125;</span>
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #993333;">void</span> afterCompose<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
Paging pag = getPaging<span style="color: #66cc66;">&#40;</span>PAG_EMPLOYEE<span style="color: #66cc66;">&#41;</span>;
pag.<span style="color: #006600;">setTotalSize</span><span style="color: #66cc66;">&#40;</span>employeeManager.<span style="color: #006600;">count</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>.<span style="color: #006600;">intValue</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>;
<span style="color: #000000; font-weight: bold;">final</span> <span style="color: #993333;">int</span> PAGE_SIZE = pag.<span style="color: #006600;">getPageSize</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
<span style="color: #808080; font-style: italic;">// Show Listbox with first PAGE_SIZE</span>
redraw<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">0</span>, PAGE_SIZE<span style="color: #66cc66;">&#41;</span>;
pag.<span style="color: #006600;">addEventListener</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;onPaging&quot;</span>, <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #aaaadd; font-weight: bold;">EventListener</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #993333;">void</span> onEvent<span style="color: #66cc66;">&#40;</span><span style="color: #aaaadd; font-weight: bold;">Event</span> event<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
PagingEvent pe = <span style="color: #66cc66;">&#40;</span>PagingEvent<span style="color: #66cc66;">&#41;</span> event;
<span style="color: #993333;">int</span> pgno = pe.<span style="color: #006600;">getActivePage</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
<span style="color: #993333;">int</span> ofs = pgno * PAGE_SIZE;
<span style="color: #808080; font-style: italic;">// Redraw current paging</span>
redraw<span style="color: #66cc66;">&#40;</span>ofs, PAGE_SIZE<span style="color: #66cc66;">&#41;</span>;
<span style="color: #66cc66;">&#125;</span>
<span style="color: #66cc66;">&#125;</span><span style="color: #66cc66;">&#41;</span>;
<span style="color: #66cc66;">&#125;</span>
<span style="color: #000000; font-weight: bold;">private</span> <span style="color: #993333;">void</span> redraw<span style="color: #66cc66;">&#40;</span><span style="color: #993333;">int</span> firstResult, <span style="color: #993333;">int</span> maxResults<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
Listbox lst = getListbox<span style="color: #66cc66;">&#40;</span>LST_EMPLOYEE<span style="color: #66cc66;">&#41;</span>;
lst.<span style="color: #006600;">getItems</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>.<span style="color: #006600;">clear</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
&nbsp;
List&lt;Employee&gt; list = employeeManager.<span style="color: #006600;">getAll</span><span style="color: #66cc66;">&#40;</span>DetachedCriteria.<span style="color: #006600;">forClass</span><span style="color: #66cc66;">&#40;</span>Employee.<span style="color: #000000; font-weight: bold;">class</span><span style="color: #66cc66;">&#41;</span>, firstResult, maxResults<span style="color: #66cc66;">&#41;</span>;
&nbsp;
<span style="color: #b1b100;">for</span> <span style="color: #66cc66;">&#40;</span>Employee employee : list<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
Listitem li = <span style="color: #000000; font-weight: bold;">new</span> Listitem<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
li.<span style="color: #006600;">setValue</span><span style="color: #66cc66;">&#40;</span>employee<span style="color: #66cc66;">&#41;</span>;
li.<span style="color: #006600;">appendChild</span><span style="color: #66cc66;">&#40;</span><span style="color: #000000; font-weight: bold;">new</span> Listcell<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;&quot;</span> + employee.<span style="color: #006600;">getId</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>;
li.<span style="color: #006600;">appendChild</span><span style="color: #66cc66;">&#40;</span><span style="color: #000000; font-weight: bold;">new</span> Listcell<span style="color: #66cc66;">&#40;</span>employee.<span style="color: #006600;">getFullname</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>;
li.<span style="color: #006600;">appendChild</span><span style="color: #66cc66;">&#40;</span><span style="color: #000000; font-weight: bold;">new</span> Listcell<span style="color: #66cc66;">&#40;</span>employee.<span style="color: #006600;">getUsername</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>;
lst.<span style="color: #006600;">appendChild</span><span style="color: #66cc66;">&#40;</span>li<span style="color: #66cc66;">&#41;</span>;
<span style="color: #66cc66;">&#125;</span>
<span style="color: #66cc66;">&#125;</span>
<span style="color: #66cc66;">&#125;</span></pre></td></tr></table></div>

<p>Como você pode ver, a ideia principal é Estratégia Baseada em Consulta, onde resultados são colectados da base de dados quando necessário na medida que o utilizador vai navegando sobre as pequenas páginas e enviados para o cliente. Isto significa que uma nova consulta será executada sempre que o usuário navegar entre as páginas, claro que há uma sobrecarga no desempenho com esta abordagem. No entanto, devido ao menor uso de memória, esta solução é também mais escalável e geralmente, esta é a consideração importante quando se trata de aplicações Web. Com a implementação de AfterCompose, nós executamos algumas inicializações:</p>
<ul>
<li>Definimos o número total de empregados</li>
<li>Desenhamos a listbox com os primeiros empregados na página inicial</li>
<li>Adicionamos o Evento onPaging para o componente paging</li>
</ul>
<p>O evento onPaging, é enviado com uma instância de PagingEvent para o componente paging, depois, nós recuperamos a página activa (apartir de 0) e o índice dos primeiros empregados visíveis pela multiplicação da página activa pelo tamanho duma página.</p>
<p>Uma vez que sabemos qual é a página actual, nós redesenhamos a listbox; primeiro nós limpamos todos empregados e depois consultamos o novo pedaço de página de empregados. Lembre-se que, o AfterCompose é um pouco mais rápido, uma vez que não necessita de criar uma outra thread enquanto o evento onCreate é livre para suspender e retornar a execução.</p>
<p><span class="style1">C. Conclusão:</span></p>
<p>Este pequeno artigo introduziu-lhe o poder do componente paging, como implementar a paginação para listbox com bastante performance quando a listbox tiver muitos elementos.</p>
<p>Você pode encontrar as desvantagens de usar um componente paging externo ao listbox em <a href="http://en.wikibooks.org/wiki/ZK/How-Tos#How_to_implement_paging_for_listboxes_with_many_items" onclick="javascript:urchinTracker ('/outbound/article/en.wikibooks.org');">http://en.wikibooks.org/wiki/ZK/How-Tos#How_to_implement_paging_for_listboxes_with_many_items</a></p>
<p>Espero que tenha gostado deste pequeno artigo e que este artigo o tenha influenciado para iniciar a utilizar a Framework ZK. No meu dia-a-dia a Framework ZK tem sido bastante produtiva no desenvolvimento de aplicações Web tanto para a intranet como para a internet.</p>
<p><span class="style1">Download</span></p>
<p>Pode baixar o projecto <a href="http://downloads.sourceforge.net/zkforge/load-on-demand.zip" onclick="javascript:urchinTracker ('/outbound/article/downloads.sourceforge.net');">aqui</a>.<br />
Depois de fazer download do projecto, leia o &#8220;readme.pdf&#8221; para saber como lidar com o projecto wikibook2.</p>
<p><span class="style1"> Sobre Marcos de Sousa</span></p>
<p>Marcos de Sousa, trabalha na área de desenvolvimento a mais de 5 anos. Trabalha como Desenvolvedor Sénior no <a href="file:///home/urubatan/Desktop/www.bci.co.mz" onclick="javascript:urchinTracker ('/outbound/article/');">Banco Comercial e de Investimentos</a> (BCI Fomento), um dos maiores grupos financeiros em Moçambique. Estudou a Licenciatura em Informática (Universidade Eduardo Mondlane – Curso de Informática (5º ano)).<br />
Junho 13, 2008<br />
Maputo – Moçambique</p>

<p><a href="http://feeds.urubatan.com.br/~a/UrubatansWeblog?a=yRpkJP"><img src="http://feeds.urubatan.com.br/~a/UrubatansWeblog?i=yRpkJP" border="0"></img></a></p><div class="feedflare">
<a href="http://feeds.urubatan.com.br/~f/UrubatansWeblog?a=LRWRpi"><img src="http://feeds.urubatan.com.br/~f/UrubatansWeblog?i=LRWRpi" border="0"></img></a> <a href="http://feeds.urubatan.com.br/~f/UrubatansWeblog?a=P7N9oi"><img src="http://feeds.urubatan.com.br/~f/UrubatansWeblog?i=P7N9oi" border="0"></img></a> <a href="http://feeds.urubatan.com.br/~f/UrubatansWeblog?a=k56Pni"><img src="http://feeds.urubatan.com.br/~f/UrubatansWeblog?i=k56Pni" border="0"></img></a> <a href="http://feeds.urubatan.com.br/~f/UrubatansWeblog?a=E4xaxI"><img src="http://feeds.urubatan.com.br/~f/UrubatansWeblog?i=E4xaxI" border="0"></img></a> <a href="http://feeds.urubatan.com.br/~f/UrubatansWeblog?a=vsATII"><img src="http://feeds.urubatan.com.br/~f/UrubatansWeblog?i=vsATII" border="0"></img></a> <a href="http://feeds.urubatan.com.br/~f/UrubatansWeblog?a=auO3tI"><img src="http://feeds.urubatan.com.br/~f/UrubatansWeblog?i=auO3tI" border="0"></img></a> <a href="http://feeds.urubatan.com.br/~f/UrubatansWeblog?a=W2ssnI"><img src="http://feeds.urubatan.com.br/~f/UrubatansWeblog?i=W2ssnI" border="0"></img></a> <a href="http://feeds.urubatan.com.br/~f/UrubatansWeblog?a=dcAlOI"><img src="http://feeds.urubatan.com.br/~f/UrubatansWeblog?i=dcAlOI" border="0"></img></a>
</div><img src="http://feeds.urubatan.com.br/~r/UrubatansWeblog/~4/313232448" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.urubatan.com.br/como-implementar-paginacao-para-listboxes-com-muitos-elementos-com-o-zk-framework/feed/</wfw:commentRss>
		<feedburner:awareness>http://api.feedburner.com/awareness/1.0/GetItemData?uri=UrubatansWeblog&amp;itemurl=http%3A%2F%2Fwww.urubatan.com.br%2Fcomo-implementar-paginacao-para-listboxes-com-muitos-elementos-com-o-zk-framework%2F</feedburner:awareness><feedburner:origLink>http://www.urubatan.com.br/como-implementar-paginacao-para-listboxes-com-muitos-elementos-com-o-zk-framework/</feedburner:origLink></item>
		<item>
		<title>Programa de afiliados da 37signals</title>
		<link>http://feeds.urubatan.com.br/~r/UrubatansWeblog/~3/310510523/</link>
		<comments>http://www.urubatan.com.br/programa-de-afiliados-da-37signals/#comments</comments>
		<pubDate>Thu, 12 Jun 2008 16:29:36 +0000</pubDate>
		<dc:creator>Urubatan</dc:creator>
		
		<category><![CDATA[Dia a Dia]]></category>

		<guid isPermaLink="false">http://www.urubatan.com.br/?p=1396</guid>
		<description>A 37signals é o ambiente de trabalho dos sonhos de muita gente (logo depois do google  ), eles desenvolveram alguns produtos bem legais que ajudam muita gente, todos tem uma opção de uso gratuito, e valores pagos por recursos adicionais.
Até ai tudo igual a 90% das empresas focadas em Web, mas eles ficaram mais [...]</description>
			<content:encoded><![CDATA[<p>A 37signals é o ambiente de trabalho dos sonhos de muita gente (logo depois do google <img src='http://www.urubatan.com.br/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> ), eles desenvolveram alguns produtos bem legais que ajudam muita gente, todos tem uma opção de uso gratuito, e valores pagos por recursos adicionais.<br />
Até ai tudo igual a 90% das empresas focadas em Web, mas eles ficaram mais famosos ainda depois de publicar o <a href="http://gettingreal.37signals.com/" onclick="javascript:urchinTracker ('/outbound/article/gettingreal.37signals.com');">Getting Real</a> (<a href="http://gettingreal.37signals.com/GR_por.php" onclick="javascript:urchinTracker ('/outbound/article/gettingreal.37signals.com');">Versão em português aqui</a>), um livro sobre como eles desenvolveram os produtos, que acabou virando uma bíblia para muita gente (a metodologia focada em KISS é realmente uma inspiração <img src='http://www.urubatan.com.br/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> ).<br />
Agora eles começaram com um programa de afiliados para que usuários dos produtos deles possam ganhar uns trocados contando para outras pessoas que gostam do que usam <img src='http://www.urubatan.com.br/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /><br />
Então, eu resolvi colocar aqueles links ali ao lado para quem ainda não conhece ainda dar uma olhada.</p>
<p>Eu acho incrível a idéia do <a href="http://www.highriseHQ.com/?referrer=RODRIGOURUBATANFERREIRAJARDIM" onclick="javascript:urchinTracker ('/outbound/article/www.highriseHQ.com');">Highrise</a>, um mini CRM de verdade, nada daquelas ferramentas auto entituladas CRM de enviar SPAM, eles criaram uma ferramenta espetacular para ajudar a lembrar quais assuntos ja foram tratados com cada um dos seus contatos, podendo agrupar contatos (e os respectivos históricos) por empresa e/ou por tags. Isto já me ajudou bastante <img src='http://www.urubatan.com.br/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </p>
<p>No programa de afiliados também entraram o <a href="http://www.basecampHQ.com/?referrer=RODRIGOURUBATANFERREIRAJARDIM" onclick="javascript:urchinTracker ('/outbound/article/www.basecampHQ.com');">Basecamp</a>, uma ferramenta para facilitar a comunicação dentro de projetos e gerenciamento dos mesmos, e o <a href="http://www.backpackIT.com/?referrer=RODRIGOURUBATANFERREIRAJARDIM" onclick="javascript:urchinTracker ('/outbound/article/www.backpackIT.com');">Backpack</a> basicamente um gerenciador de tarefas e calendário de grupos. Mas estes dois eu só testei, nunca cheguei a usar de verdade.</p>
<p>PS.: sim, este post foi apenas para publicar os links para as apps com o meu referer, mas as ferramentas são boas mesmo (pelo menos o highrise que eu acho espetacular, as outras duas eu ouço falar muito bem) <img src='http://www.urubatan.com.br/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /></p>

<p><a href="http://feeds.urubatan.com.br/~a/UrubatansWeblog?a=bvkolI"><img src="http://feeds.urubatan.com.br/~a/UrubatansWeblog?i=bvkolI" border="0"></img></a></p><div class="feedflare">
<a href="http://feeds.urubatan.com.br/~f/UrubatansWeblog?a=ApICUi"><img src="http://feeds.urubatan.com.br/~f/UrubatansWeblog?i=ApICUi" border="0"></img></a> <a href="http://feeds.urubatan.com.br/~f/UrubatansWeblog?a=BfvLci"><img src="http://feeds.urubatan.com.br/~f/UrubatansWeblog?i=BfvLci" border="0"></img></a> <a href="http://feeds.urubatan.com.br/~f/UrubatansWeblog?a=6RR4Ti"><img src="http://feeds.urubatan.com.br/~f/UrubatansWeblog?i=6RR4Ti" border="0"></img></a> <a href="http://feeds.urubatan.com.br/~f/UrubatansWeblog?a=b1LF2I"><img src="http://feeds.urubatan.com.br/~f/UrubatansWeblog?i=b1LF2I" border="0"></img></a> <a href="http://feeds.urubatan.com.br/~f/UrubatansWeblog?a=XMl4CI"><img src="http://feeds.urubatan.com.br/~f/UrubatansWeblog?i=XMl4CI" border="0"></img></a> <a href="http://feeds.urubatan.com.br/~f/UrubatansWeblog?a=zypJnI"><img src="http://feeds.urubatan.com.br/~f/UrubatansWeblog?i=zypJnI" border="0"></img></a> <a href="http://feeds.urubatan.com.br/~f/UrubatansWeblog?a=encrHI"><img src="http://feeds.urubatan.com.br/~f/UrubatansWeblog?i=encrHI" border="0"></img></a> <a href="http://feeds.urubatan.com.br/~f/UrubatansWeblog?a=2Jb2MI"><img src="http://feeds.urubatan.com.br/~f/UrubatansWeblog?i=2Jb2MI" border="0"></img></a>
</div><img src="http://feeds.urubatan.com.br/~r/UrubatansWeblog/~4/310510523" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.urubatan.com.br/programa-de-afiliados-da-37signals/feed/</wfw:commentRss>
		<feedburner:awareness>http://api.feedburner.com/awareness/1.0/GetItemData?uri=UrubatansWeblog&amp;itemurl=http%3A%2F%2Fwww.urubatan.com.br%2Fprograma-de-afiliados-da-37signals%2F</feedburner:awareness><feedburner:origLink>http://www.urubatan.com.br/programa-de-afiliados-da-37signals/</feedburner:origLink></item>
		<item>
		<title>O JavaPlanet reencarnou!</title>
		<link>http://feeds.urubatan.com.br/~r/UrubatansWeblog/~3/308004155/</link>
		<comments>http://www.urubatan.com.br/o-javaplanet-reencarnou/#comments</comments>
		<pubDate>Mon, 09 Jun 2008 13:00:23 +0000</pubDate>
		<dc:creator>Urubatan</dc:creator>
		
		<category><![CDATA[Dia a Dia]]></category>

		<category><![CDATA[Java]]></category>

		<category><![CDATA[agragador]]></category>

		<category><![CDATA[feed]]></category>

		<guid isPermaLink="false">http://www.urubatan.com.br/?p=1395</guid>
		<description>Vocês lembram do site que eu coloquei no ar a algum tempo atrás, o JavaPlanet que era um agregador de feeds de sites sobre java? um pouco antes de aparecer o InfoBlogs &amp;#8230;
Pois é, o site não tinha muitos visitantes, então resolvi não continuar com ele no ar &amp;#8230;
A algum tempo atrás o Franklin do [...]</description>
			<content:encoded><![CDATA[<p>Vocês lembram do site que eu coloquei no ar a algum tempo atrás, o <a href="http://www.portaljava.com/jnuke/bin/aggregator/list" onclick="javascript:urchinTracker ('/outbound/article/www.portaljava.com');">JavaPlanet</a> que era um agregador de feeds de sites sobre java? um pouco antes de aparecer o InfoBlogs &#8230;<br />
Pois é, o site não tinha muitos visitantes, então resolvi não continuar com ele no ar &#8230;<br />
A algum tempo atrás o Franklin do <a href="http://www.portaljava.com/" onclick="javascript:urchinTracker ('/outbound/article/www.portaljava.com');">Portal Java</a> falou comigo e eu doei o pouco código que existia do JavaPlanet para ele incluir na nova versão do <a href="http://www.portaljava.com/" onclick="javascript:urchinTracker ('/outbound/article/www.portaljava.com');">PortalJava</a> toda escrita em Java que iria ao ar em algum tempo.<br />
Pois é, o <a href="http://www.portaljava.com/" onclick="javascript:urchinTracker ('/outbound/article/www.portaljava.com');">Portal Java</a> hoje esta no ar nesta nova versão totalmente escrito em Java utilizando o JavaNuke se não estou enganado, e o <a href="http://www.portaljava.com/jnuke/bin/aggregator/list" onclick="javascript:urchinTracker ('/outbound/article/www.portaljava.com');">JavaPlanet</a> reencarnou no link &#8220;Agregador&#8221; do Portal Java!<br />
Confiram neste endereço, <a href="http://www.portaljava.com/jnuke/bin/aggregator/list" onclick="javascript:urchinTracker ('/outbound/article/www.portaljava.com');">o melhor agregador de Feeds sobre Java do Brasil</a>, ou seja, o JavaPlanet reencarnado dentro do Portal Java <img src='http://www.urubatan.com.br/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /></p>

<p><a href="http://feeds.urubatan.com.br/~a/UrubatansWeblog?a=sIyIYc"><img src="http://feeds.urubatan.com.br/~a/UrubatansWeblog?i=sIyIYc" border="0"></img></a></p><div class="feedflare">
<a href="http://feeds.urubatan.com.br/~f/UrubatansWeblog?a=w6Lfhi"><img src="http://feeds.urubatan.com.br/~f/UrubatansWeblog?i=w6Lfhi" border="0"></img></a> <a href="http://feeds.urubatan.com.br/~f/UrubatansWeblog?a=vXyBMi"><img src="http://feeds.urubatan.com.br/~f/UrubatansWeblog?i=vXyBMi" border="0"></img></a> <a href="http://feeds.urubatan.com.br/~f/UrubatansWeblog?a=Hcrx8i"><img src="http://feeds.urubatan.com.br/~f/UrubatansWeblog?i=Hcrx8i" border="0"></img></a> <a href="http://feeds.urubatan.com.br/~f/UrubatansWeblog?a=GKaOtI"><img src="http://feeds.urubatan.com.br/~f/UrubatansWeblog?i=GKaOtI" border="0"></img></a> <a href="http://feeds.urubatan.com.br/~f/UrubatansWeblog?a=NH43uI"><img src="http://feeds.urubatan.com.br/~f/UrubatansWeblog?i=NH43uI" border="0"></img></a> <a href="http://feeds.urubatan.com.br/~f/UrubatansWeblog?a=iayI8I"><img src="http://feeds.urubatan.com.br/~f/UrubatansWeblog?i=iayI8I" border="0"></img></a> <a href="http://feeds.urubatan.com.br/~f/UrubatansWeblog?a=P4kMyI"><img src="http://feeds.urubatan.com.br/~f/UrubatansWeblog?i=P4kMyI" border="0"></img></a> <a href="http://feeds.urubatan.com.br/~f/UrubatansWeblog?a=ZYAtoI"><img src="http://feeds.urubatan.com.br/~f/UrubatansWeblog?i=ZYAtoI" border="0"></img></a>
</div><img src="http://feeds.urubatan.com.br/~r/UrubatansWeblog/~4/308004155" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.urubatan.com.br/o-javaplanet-reencarnou/feed/</wfw:commentRss>
		<feedburner:awareness>http://api.feedburner.com/awareness/1.0/GetItemData?uri=UrubatansWeblog&amp;itemurl=http%3A%2F%2Fwww.urubatan.com.br%2Fo-javaplanet-reencarnou%2F</feedburner:awareness><feedburner:origLink>http://www.urubatan.com.br/o-javaplanet-reencarnou/</feedburner:origLink></item>
		<item>
		<title>Orientação a objetos é fácil, as pessoas é que complicam</title>
		<link>http://feeds.urubatan.com.br/~r/UrubatansWeblog/~3/307425903/</link>
		<comments>http://www.urubatan.com.br/orientacao-a-objetos-e-facil-as-pessoas-e-que-complicam/#comments</comments>
		<pubDate>Sun, 08 Jun 2008 16:19:36 +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[artigo]]></category>

		<category><![CDATA[oo]]></category>

		<guid isPermaLink="false">http://www.urubatan.com.br/?p=1394</guid>
		<description>A idéia de escrever este post veio desta discussão no GUJ, que começou falando de testes unitários e terminou sobre orientação a objetos.
Então seguem as minhas opiniões.

As linguagens de programação mais modernas, ou pelo menos as mais utilizadas de hoje em dia são Orientadas a Objeto, as famosas linguagens OO, mas mesmo assim, a grande [...]</description>
			<content:encoded><![CDATA[<p>A idéia de escrever este post <a href="http://www.guj.com.br/posts/list/75/92487.java" >veio desta discussão no GUJ, que começou falando de testes unitários e terminou sobre orientação a objetos.</a><br />
Então seguem as minhas opiniões.</p>
<hr/>
As linguagens de programação mais modernas, ou pelo menos as mais utilizadas de hoje em dia são Orientadas a Objeto, as famosas linguagens OO, mas mesmo assim, a grande maior parte dos desenvolvedores parece não conseguir entender direito a tal da Orientação a Objeto.<br />
Resolvi escrever este este post porque do alto do meu ego inflado, acredito conseguir entender corretamente OO e poder ajudar um pouco.<br />
Então, leiam o post até o final, e depois se quiserem tirar dúvidas ou me xingar, é só deixar um comentário &#8230;</p>
<p><strong>O primeiro erro que todos cometem ao iniciar em OO</strong> é achar que Orientação a Objetos é sobre classes, isto não faz nenhum sentido, Orientação a Objetos como o próprio nome diz, é sobre Objetos, então, qualquer coisa que não seja um objeto não é realmente importante quando se fala em Orientação a Objetos.<br />
OK, mas por que todos caem no mesmo engano então? porque a grande maior parte das linguagens de programação orientadas a objeto, utilizam classes como moldes para objetos, e durante o desenvolvimento se cria os moldes, ja que os objetos só existem em tempo de execução nestas linguagens.<br />
Quais linguagens não funcionam assim? Bom, agora me vem a cabeça SmallTalk, IO e Ruby, mas devem ter outras.<br />
SmallTalk porque não existe realmente distinção entre &#8220;tempo de desenvolvimento&#8221; e &#8220;tempo de execução&#8221; em SmallTalk, tudo esta sempre executando.<br />
IO porque não utiliza o conceiro de classes (a não ser que eu tenha entendido a linguagem errado) e sim objetos template.<br />
E Ruby porque as classes em Ruby são objetos também, mas das três é a que mais se aproxima do &#8220;padrão&#8221; que citei antes.</p>
<p><strong>Outro erro bastante comum,</strong> desta vez quando se utiliza alguma tecnologia de mapeamento Objeto/Relacional, é achar que objetos são tabelas, mapeamento Objeto/Relacional serve para salvar o estado de um objeto em um banco de dados relacional, apenas isto, um objeto do tipo Usuario por exemplo, não possui um atributo &#8220;grupo_id&#8221;, mas pode possuir um relacionamento com um objeto do tipo Grupo. Percebam que eu escrevi atributo e não campo, pois tabelas tem campos e linhas, objetos possuem atributos e métodos.</p>
<p>Uma coisa bastante comum, ainda utilizando mapeamento O/R é achar que um objeto possui os mesmos atributos que a tabela correspondente, mas neste caso até os nomes são diferentes, infelizmente nestes casos, um objeto precisa ter um atributo &#8220;id&#8221; que mapeia para a chave primária da tabela, mas um objeto não tem uma chave primária, ele tem apenas atributos.</p>
<p>Então, como solucionar estes problemas?<br />
Bom, no geral, um objeto tem comportamento, e alguns atributos também, mas o importante em um objeto é o que ele faz e como ele faz.<br />
Claro que existem objetos que não tem comportamento, objetos em um sistema são a representação binária de alguma coisa do mundo real, e existem coisas no mundo real que não tem comportamento, tem apenas atributos, como por exemplo mesas e cadeiras, mas exceto se você estiver mapeando um destes objetos no seu sistema, todos os objetos tem um comportamento.<br />
Por exemplo, se você criar um objeto do tipo Usuário, se ele não possuir nenhum comportamento, com certeza o seu sistema esta construído de forma errada, pois pelo menos eu, não conheço nenhum usuário que fique parado como uma estátua o tempo todo, e se este for o caso, com certeza ele não é usuário de sistema nenhum, portanto ele não deveria existir no seu sistema.<br />
A mesma coisa se aplica a um carro, você conhece algum carro que não se move? Que não tenha comportamento algum? A única desculpa para um carro que não tem comportamento algum é um sistema para um museu de carros, onde só importa a carcaça do carro e os atributos dele, principalmente o ano de fabricação.</p>
<p>Outra coisa que todos entendem errado é o padrão MVC (Model, View, Controller).<br />
Na definição do padrão, o controlador esta la apenas como ponto de entrada, ele passa parâmetros para um método de um Model, pega o resultado disto e passa para uma View, se ele estiver fazendo mais do que isto, ele possui parte do código que deveria estar dentro do Model, por tanto, o seu Controller esta errado!</p>
<p>Beleza, mas se eu estou dizendo que todos cometem os mesmos erros, como eu posso dizer que OO é fácil então?<br />
Porque a maioria aprende primeiro a programar de forma estrutural, e depois passa para orientação a objetos, e como as pessoas aprendem coisas novas utilizando como base suas experiências anteriores, utilizam os paradigmas procedurais para tentar programar orientado a objetos, esta é basicamente a raiz do problema.<br />
Para tornar a vida de todos mais fácil, o primeiro contato com programação nos cursos e faculdades deveria ser com SmallTalk e não com portugol ou pascal.<br />
Se você aprender primeiro orientação a objetos, conseguira passar para programação procedural com uma facilidade muito maior do que alguem que aprende primeiro programação procedural tentando aprender orientação a objetos.</p>
<p>O pior é que as linguagens de programação que não são 100% OO contribuem ainda mais para aumentar este problema, vamos pegar o Java como exemplo de uma linguagem não 100% OO.<br />
&#8220;Mas me disseram que java era uma linguagem de programação OO&#8221;<br />
Bom isto também é verdade, eu disse não 100% OO, não disse que não era OO.<br />
Exemplos de coisas que não são OO em Java: tipos primitivos e métodos estáticos<br />
Basicamente eu acho que na linguagem é só isto que não é OO, mas isto ja causa problemas o suficiente confundindo a cabeça de muita gente.<br />
&#8220;Perai, métodos estáticos ficam dentro de classes, como podem não ser OO?&#8221;<br />
Mérodos estáticos são uma forma porca de programação procedural dentro de uma linguagem OO que teve uma linguagem procedural como origem, como por exemplo o Java e o C++.<br />
Métodos estáticos não fazem parte de uma classe, utilizam a classe apenas como namespace, o que é diferente de fazer parte.<br />
Em um método estático, não é possível nem saber a qual classe ele pertence, como é possível tanto em object pascal quanto em Ruby, ja que estas não possuem métodos estáticos e sim métodos de classe.<br />
E os tipos primitivos estes sim, não tem relação nenhuma com orientação a objetos, só estão la porque quando a linguagem foi criada não era possível fazer uma classe ter a mesma performance do que um tipo mapeado diretamente do processador da máquina, eles existem em Java por problemas de performance e não por serem Orientados a Objeto.</p>
<p>Alguns design patterns foram criados apenas para contornar limitações da pataforma (Exemplo prático, com um banco de dados OO decente não seria necessário criar o pattern DTO), da mesma forma algumas das regras sobre a utilização de OO foram criadas apenas porque a maioria das pessoas não entende OO, como a regra que diz favoreça composição em vez de herança.<br />
Este é um engano terrível cometido por muitas pessoas que eu não consigo entender.<br />
Muita gente acha que estender uma classe é uma forma de compartilhar código, por exemplo:<br />
Existe uma entidade no sistema de nome Cliente, e em algum momento é necessário criar um ClienteDependente que vai possuir todos os mesmos atributos de cliente mais um que aponta para o responsável, não faz sentido algum fazer ClienteDependente estender Cliente para compartilhar este código, porque o comportamento deles não é o mesmo, por exemplo, ClienteDependente não paga a conta, mas Cliente sim, neste caso seria melhor refatorar o sistema e criar uma entidade que pudesse realizar compras (Ou criar objetos do tipo Compra se o sistema foi bem modelado), e fazer com que Cliente e ClienteDependente estendessem desta, pois neste caso elas estariam realmente compartilhando o comportamento e não apenas evitando algum código aparentemente repetido.<br />
Estender uma classe é estender o comportamento, ou seja, só faz sentido estender o comportamento se a classe &#8220;filha&#8221; tiver todo o comportamento da classe &#8220;pai&#8221;, ou seja, é um relacionamento o tipo &#8220;é um&#8221;. Mas como quase ninguém consegue entender que estender uma classe estende o comportamento (não me parece uma coisa tão complexa assim para se entender), foi criada esta regra que diz: Não use herança, use composição. <strong>Simplesmente para evitar que pessoas façam porcaria por não entender conceitos que são estupidamente simples, mas que todos tem mania de complicar</strong>. </p>
<p><center>
<script type="text/javascript"><!--
google_ad_client = "pub-7457173635319254";
google_ad_width = 468;
google_ad_height = 60;
google_ad_format = "468x60_as";
google_ad_type = "text_image";
//2007-08-17: urublogpost
google_ad_channel = "2828915611";
google_color_border = "336699";
google_color_bg = "FFFFFF";
google_color_link = "0000FF";
google_color_text = "000000";
google_color_url = "008000";
google_ui_features = "rc:10";
//-->
</script>
<script type="text/javascript"
  src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script></center></p>
<p>Outro erro bastante comum é tentar colocar em uma classe apenas o comportamento de todo o sistema, se for para fazer isto, utilize programação procedural, pois você vai estar utilizando a classe apenas como namespace mesmo, não vai nem lembrar que em tempo de execução estara trabalhando com diversos objetos criados a partir daquela forma.</p>
<p>Orientação a objetos é simples, é um paradigma de desenvolvimento que modela um sistema transformando conceitos do mundo real como objetos que colaboram entre si para atingir um objetivo.<br />
Acho que o nome Objeto pode ajudar a confundir boa parte das pessoas, pois em um sistema OO, Compra pode ser um tipo de Objetos, mas no mundo real, compra não é um objeto. Mas para resolver isto eu simplesmente assumo que qualquer um que queira ser um programador precisa ter capacidade para trabalhar com abstrações, não tenho uma explicação melhor para alguem que não consegue entender que Compra pode ser um tipo de Objeto em um sistema OO, assim como Viajem também pode ser um tipo de Objeto (estou utilizando &#8220;Tipo de Objeto&#8221; em vez de classe porque o que importa em um sistema OO são as instâncias e não as classes) dependendo do problema a ser resolvido.</p>
<p>Acho que são estes os erros mais comuns na orientação a objetos, lendo isto você não concorda comigo? OO é simples, as pessoas é que complicam!<br />
Você lembra de algum outro erro muito comum em OO? deixe um comentário.<br />
Se eu lembrar de mais coisas simples que as pessoas tem mania de complicar eu escrevo outro post.</p>

<p><a href="http://feeds.urubatan.com.br/~a/UrubatansWeblog?a=vIcq4q"><img src="http://feeds.urubatan.com.br/~a/UrubatansWeblog?i=vIcq4q" border="0"></img></a></p><div class="feedflare">
<a href="http://feeds.urubatan.com.br/~f/UrubatansWeblog?a=QExhmi"><img src="http://feeds.urubatan.com.br/~f/UrubatansWeblog?i=QExhmi" border="0"></img></a> <a href="http://feeds.urubatan.com.br/~f/UrubatansWeblog?a=DRey6i"><img src="http://feeds.urubatan.com.br/~f/UrubatansWeblog?i=DRey6i" border="0"></img></a> <a href="http://feeds.urubatan.com.br/~f/UrubatansWeblog?a=PgliOi"><img src="http://feeds.urubatan.com.br/~f/UrubatansWeblog?i=PgliOi" border="0"></img></a> <a href="http://feeds.urubatan.com.br/~f/UrubatansWeblog?a=IakpzI"><img src="http://feeds.urubatan.com.br/~f/UrubatansWeblog?i=IakpzI" border="0"></img></a> <a href="http://feeds.urubatan.com.br/~f/UrubatansWeblog?a=zapy4I"><img src="http://feeds.urubatan.com.br/~f/UrubatansWeblog?i=zapy4I" border="0"></img></a> <a href="http://feeds.urubatan.com.br/~f/UrubatansWeblog?a=xb9uZI"><img src="http://feeds.urubatan.com.br/~f/UrubatansWeblog?i=xb9uZI" border="0"></img></a> <a href="http://feeds.urubatan.com.br/~f/UrubatansWeblog?a=haoa1I"><img src="http://feeds.urubatan.com.br/~f/UrubatansWeblog?i=haoa1I" border="0"></img></a> <a href="http://feeds.urubatan.com.br/~f/UrubatansWeblog?a=GlDv8I"><img src="http://feeds.urubatan.com.br/~f/UrubatansWeblog?i=GlDv8I" border="0"></img></a>
</div><img src="http://feeds.urubatan.com.br/~r/UrubatansWeblog/~4/307425903" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.urubatan.com.br/orientacao-a-objetos-e-facil-as-pessoas-e-que-complicam/feed/</wfw:commentRss>
		<feedburner:awareness>http://api.feedburner.com/awareness/1.0/GetItemData?uri=UrubatansWeblog&amp;itemurl=http%3A%2F%2Fwww.urubatan.com.br%2Forientacao-a-objetos-e-facil-as-pessoas-e-que-complicam%2F</feedburner:awareness><feedburner:origLink>http://www.urubatan.com.br/orientacao-a-objetos-e-facil-as-pessoas-e-que-complicam/</feedburner:origLink></item>
		<item>
		<title>mod_rails revolucionando as hospedagens Rails compartilhadas, inclusive no Brasil</title>
		<link>http://feeds.urubatan.com.br/~r/UrubatansWeblog/~3/291696994/</link>
		<comments>http://www.urubatan.com.br/mod_rails-revolucionando-as-hospedagens-rails-compartilhadas-inclusive-no-brasil/#comments</comments>
		<pubDate>Fri, 16 May 2008 15:14:11 +0000</pubDate>
		<dc:creator>Urubatan</dc:creator>
		
		<category><![CDATA[Ruby]]></category>

		<category><![CDATA[rails]]></category>

		<category><![CDATA[hosting]]></category>

		<guid isPermaLink="false">http://www.urubatan.com.br/?p=1392</guid>
		<description>Já existem alguns provedores internacionais disponibilizando o mod_rails como opção para hosting compartilhado de aplicações Ruby On Rails, como por examplo o HostingRails.com (se tiverem mais para adicionar a lista avisem nos comentários que atualizo o post com a lista de provedores disponíveis) , e hoje, vi a noticia que a Locaweb esta começando a [...]</description>
			<content:encoded><![CDATA[<p>Já existem alguns provedores internacionais disponibilizando o <a href="http://www.modrails.org" onclick="javascript:urchinTracker ('/outbound/article/www.modrails.org');">mod_rails</a> como opção para hosting compartilhado de aplicações Ruby On Rails, como por examplo o <a href="http://www.hostingrails.com" onclick="javascript:urchinTracker ('/outbound/article/www.hostingrails.com');">HostingRails.com</a> (se tiverem mais para adicionar a lista avisem nos comentários que atualizo o post com a lista de provedores disponíveis) , e hoje, vi a noticia que a Locaweb esta começando a disponibilizar hosting compartilhado de aplicações Ruby On Rails utilizando o mod_rails também.<br />
E melhor que isto, como podem ver no quote abaixo, os primeiros a testar o brinquedo, ganham 3 meses de gratis <img src='http://www.urubatan.com.br/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </p>
<blockquote><p>
Trial de Ruby on Rails Powered by mod_rails</p>
<p>Você já deve ter ouvido, até mesmo nesse blog, sobre o poder do Ruby<br />
on Rails e suas vantagens para programadores iniciantes e experientes.<br />
Mas provavelmente você também deve conhecer os problemas de<br />
performance de uma aplicação Ruby rodando com Apache e CGI.</p>
<p>A Locaweb inova mais uma vez disponibilizando uma plataforma mais<br />
robusta para Ruby on Rails usando Passenger, também conhecido como<br />
mod_rails. Com mod_rails você pode publicar sua aplicação RoR de<br />
maneira simples em um ambiente estável e de melhor desempenho.</p>
<p>Verifique você mesmo. Estamos oferecendo um período de Trial de 3<br />
meses aos primeiros interessados em experimentar esse novo ambiente.<br />
Para ter um Plano de Hospedagem Profissional I em plataforma Linux<br />
rodando Ruby on Rails com Passenger basta preencher o formulário<br />
abaixo e aguardar nosso contato.</p>
<p>Fonte: <a href="http://blog.locaweb.com.br/archives/263" >http://blog.locaweb.com.br/archives/263</a>
</p></blockquote>
<p><strong>PS.: se se cadastrarem na Locaweb, informem que o cadastro de cliente foi indicação de &#8220;usiinformatica&#8221;, assim eu ganho bônus <img src='http://www.urubatan.com.br/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </strong></p>

<p><a href="http://feeds.urubatan.com.br/~a/UrubatansWeblog?a=NLvsXI"><img src="http://feeds.urubatan.com.br/~a/UrubatansWeblog?i=NLvsXI" border="0"></img></a></p><div class="feedflare">
<a href="http://feeds.urubatan.com.br/~f/UrubatansWeblog?a=Dv2qTh"><img src="http://feeds.urubatan.com.br/~f/UrubatansWeblog?i=Dv2qTh" border="0"></img></a> <a href="http://feeds.urubatan.com.br/~f/UrubatansWeblog?a=ktwR2h"><img src="http://feeds.urubatan.com.br/~f/UrubatansWeblog?i=ktwR2h" border="0"></img></a> <a href="http://feeds.urubatan.com.br/~f/UrubatansWeblog?a=JuARMh"><img src="http://feeds.urubatan.com.br/~f/UrubatansWeblog?i=JuARMh" border="0"></img></a> <a href="http://feeds.urubatan.com.br/~f/UrubatansWeblog?a=yOZakH"><img src="http://feeds.urubatan.com.br/~f/UrubatansWeblog?i=yOZakH" border="0"></img></a> <a href="http://feeds.urubatan.com.br/~f/UrubatansWeblog?a=qml6eH"><img src="http://feeds.urubatan.com.br/~f/UrubatansWeblog?i=qml6eH" border="0"></img></a> <a href="http://feeds.urubatan.com.br/~f/UrubatansWeblog?a=UD6mFH"><img src="http://feeds.urubatan.com.br/~f/UrubatansWeblog?i=UD6mFH" border="0"></img></a> <a href="http://feeds.urubatan.com.br/~f/UrubatansWeblog?a=sshdNH"><img src="http://feeds.urubatan.com.br/~f/UrubatansWeblog?i=sshdNH" border="0"></img></a> <a href="http://feeds.urubatan.com.br/~f/UrubatansWeblog?a=katZzH"><img src="http://feeds.urubatan.com.br/~f/UrubatansWeblog?i=katZzH" border="0"></img></a>
</div><img src="http://feeds.urubatan.com.br/~r/UrubatansWeblog/~4/291696994" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.urubatan.com.br/mod_rails-revolucionando-as-hospedagens-rails-compartilhadas-inclusive-no-brasil/feed/</wfw:commentRss>
		<feedburner:awareness>http://api.feedburner.com/awareness/1.0/GetItemData?uri=UrubatansWeblog&amp;itemurl=http%3A%2F%2Fwww.urubatan.com.br%2Fmod_rails-revolucionando-as-hospedagens-rails-compartilhadas-inclusive-no-brasil%2F</feedburner:awareness><feedburner:origLink>http://www.urubatan.com.br/mod_rails-revolucionando-as-hospedagens-rails-compartilhadas-inclusive-no-brasil/</feedburner:origLink></item>
		<item>
		<title>Test Infected to the bones - tornando os testes mais divertidos</title>
		<link>http://feeds.urubatan.com.br/~r/UrubatansWeblog/~3/290379332/</link>
		<comments>http://www.urubatan.com.br/test-infected-to-the-bones-tornando-os-testes-mais-divertidos/#comments</comments>
		<pubDate>Wed, 14 May 2008 19:23:36 +0000</pubDate>
		<dc:creator>Urubatan</dc:creator>
		
		<category><![CDATA[Java]]></category>

		<category><![CDATA[Trabalho]]></category>

		<category><![CDATA[infinitest]]></category>

		<category><![CDATA[tdd]]></category>

		<guid isPermaLink="false">http://www.urubatan.com.br/?p=1387</guid>
		<description>Uma das coisas mais difíceis em introduzir a idéia do TDD é fazer com que os outros programadores da equipe realmente utilizem os testes, e para tornar esta árdua tarefa um pouco mais fácil, é necessário muitos discursos, e se possível, tornar isto um pouco mais divertido.
O Ruby, tem o autotest para isto, que sempre [...]</description>
			<content:encoded><![CDATA[<p><center><a href='http://infinitest.googlecode.com/'><img src="http://www.urubatan.com.br/wp-content/uploads/2008/05/infinitesttitle-300x112.jpg" alt="Infinitest" border="0" width="300" height="112" class="aligncenter size-medium wp-image-1389" /></a></center><br />
Uma das coisas mais difíceis em introduzir a idéia do TDD é fazer com que os outros programadores da equipe realmente utilizem os testes, e para tornar esta árdua tarefa um pouco mais fácil, é necessário muitos discursos, e se possível, tornar isto um pouco mais divertido.<br />
O Ruby, tem o autotest para isto, que sempre que uma classe ou um teste é alterado, roda apenas os testes que sofrem alguma influência desta alteração (outro dia eu escrevo sobre o autotest, mas o foco deste post é Java).<br />
Para Java eu não conhecia nenhuma ferramenta parecida, mas acabei de encontrar o <a href="http://infinitest.googlecode.com/" onclick="javascript:urchinTracker ('/outbound/article/infinitest.googlecode.com');">Infinitest</a>, uma ferramenta para Java que faz praticamente a mesma coisa que o AutoTest do Ruby, mas é um pouco menos flexível, pois os indicativos Verde/Vermelho aparecem na tela dele, e não de uma forma customizável como o Autotest, mas nem por isto deixa de ser útil, é só deixar o programa aberto enquanto desenvolve, quando uma classe é alterada, ele executa o teste correspondente, e fica avisando quantos testes estão quebrados e quantos ja passaram, com os clássicos sinais verde e vermelho avisando se o trabalho ja terminou <img src='http://www.urubatan.com.br/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </p>
<p>Ele funciona muito bem integrado com qualquer IDE, no eclipse por exemplo, basta adicionar o infinitest.jar no classpath do projeto a mandar executar a classe: org.infinitest.Infinitest<br />
Uma tela parecida com esta vai ficar aberta enquanto você desenvolve:<br />
<center><a href='http://infinitest.org/'><img src="http://www.urubatan.com.br/wp-content/uploads/2008/05/infinitest.png" alt="" title="infinitest" border="0"  class="aligncenter" /></a></center><br />
É só alterar qualquer classe Java, que os testes afetados por ela vão rodar novamente, ou então alterar um teste, que apenas ele é executado novamente.</p>
<p>Quando algum teste falha, aparece na area branca da tela o nome da classe de testes, o método e a linha da falha, e a barra da parte inferior da janela fica vermelha <img src='http://www.urubatan.com.br/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </p>
<p>O Infinitest funciona com Java + JUnit, ou seja, nada de easyb pelo menos por enquanto <img src='http://www.urubatan.com.br/wp-includes/images/smilies/icon_sad.gif' alt=':(' class='wp-smiley' /> </p>
<p>Acho que vou fazer um plugin pro infinitest pra usar o Snarl também, como <a href="http://www.nomedojogo.com/2008/05/14/the-autotest-notification-gem/" onclick="javascript:urchinTracker ('/outbound/article/www.nomedojogo.com');">este do Autotest do ruby</a> <img src='http://www.urubatan.com.br/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </p>
<p>Bom, acho que era isto, testem o Infinitest, vocês vão achar bem divertido <img src='http://www.urubatan.com.br/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /></p>

<p><a href="http://feeds.urubatan.com.br/~a/UrubatansWeblog?a=gwoKoW"><img src="http://feeds.urubatan.com.br/~a/UrubatansWeblog?i=gwoKoW" border="0"></img></a></p><div class="feedflare">
<a href="http://feeds.urubatan.com.br/~f/UrubatansWeblog?a=8vVg3h"><img src="http://feeds.urubatan.com.br/~f/UrubatansWeblog?i=8vVg3h" border="0"></img></a> <a href="http://feeds.urubatan.com.br/~f/UrubatansWeblog?a=fTvIvh"><img src="http://feeds.urubatan.com.br/~f/UrubatansWeblog?i=fTvIvh" border="0"></img></a> <a href="http://feeds.urubatan.com.br/~f/UrubatansWeblog?a=9m3Y3h"><img src="http://feeds.urubatan.com.br/~f/UrubatansWeblog?i=9m3Y3h" border="0"></img></a> <a href="http://feeds.urubatan.com.br/~f/UrubatansWeblog?a=fBH3oH"><img src="http://feeds.urubatan.com.br/~f/UrubatansWeblog?i=fBH3oH" border="0"></img></a> <a href="http://feeds.urubatan.com.br/~f/UrubatansWeblog?a=g1V4fH"><img src="http://feeds.urubatan.com.br/~f/UrubatansWeblog?i=g1V4fH" border="0"></img></a> <a href="http://feeds.urubatan.com.br/~f/UrubatansWeblog?a=525JlH"><img src="http://feeds.urubatan.com.br/~f/UrubatansWeblog?i=525JlH" border="0"></img></a> <a href="http://feeds.urubatan.com.br/~f/UrubatansWeblog?a=sb0GBH"><img src="http://feeds.urubatan.com.br/~f/UrubatansWeblog?i=sb0GBH" border="0"></img></a> <a href="http://feeds.urubatan.com.br/~f/UrubatansWeblog?a=l3O0nH"><img src="http://feeds.urubatan.com.br/~f/UrubatansWeblog?i=l3O0nH" border="0"></img></a>
</div><img src="http://feeds.urubatan.com.br/~r/UrubatansWeblog/~4/290379332" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.urubatan.com.br/test-infected-to-the-bones-tornando-os-testes-mais-divertidos/feed/</wfw:commentRss>
		<feedburner:awareness>http://api.feedburner.com/awareness/1.0/GetItemData?uri=UrubatansWeblog&amp;itemurl=http%3A%2F%2Fwww.urubatan.com.br%2Ftest-infected-to-the-bones-tornando-os-testes-mais-divertidos%2F</feedburner:awareness><feedburner:origLink>http://www.urubatan.com.br/test-infected-to-the-bones-tornando-os-testes-mais-divertidos/</feedburner:origLink></item>
		<item>
		<title>1o JUGDAY do RSJUG</title>
		<link>http://feeds.urubatan.com.br/~r/UrubatansWeblog/~3/290156084/</link>
		<comments>http://www.urubatan.com.br/1o-jugday-do-rsjug/#comments</comments>
		<pubDate>Wed, 14 May 2008 13:01:42 +0000</pubDate>
		<dc:creator>Urubatan</dc:creator>
		
		<category><![CDATA[Java]]></category>

		<category><![CDATA[evento]]></category>

		<guid isPermaLink="false">http://www.urubatan.com.br/?p=1390</guid>
		<description>O RSJUG estara realizando no final deste mês mais um evento aqui em porto alegre, segue abaixo o anuncio do evento, vale a pena participar se vocês estiverem por perto  
===============================================
Caros, 
O RSJUG promove neste mês de maio um dia inteiro dedicado a tecnologia Java.
Serão 2 salas com atividades em paralelo sendo elas 6 [...]</description>
			<content:encoded><![CDATA[<p>O <a href="http://www.rsjug.org" onclick="javascript:urchinTracker ('/outbound/article/www.rsjug.org');">RSJUG</a> estara realizando no final deste mês mais um evento aqui em porto alegre, segue abaixo o anuncio do evento, vale a pena participar se vocês estiverem por perto <img src='http://www.urubatan.com.br/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </p>
<p>===============================================</p>
<p>Caros, </p>
<p>O <a href="http://www.rsjug.org" onclick="javascript:urchinTracker ('/outbound/article/www.rsjug.org');">RSJUG</a> promove neste mês de maio um dia inteiro dedicado a tecnologia Java.<br />
Serão 2 salas com atividades em paralelo sendo elas 6 palestras 1 tutorial e um painel. </p>
<p>Quando:<br />
31 de maio das 8h as 20h </p>
<p>Onde:<br />
Faculdade de Tecnologia SENAC<br />
Rua Coronel Genuíno 130 - 9° andar - Porto Alegre/RS </p>
<p>Grade do evento:<br />
Grade preliminar pode ser acessada no site: <a href="http://www.rsjug.org" onclick="javascript:urchinTracker ('/outbound/article/www.rsjug.org');">www.rsjug.org</a> </p>
<p>Investimento:<br />
<strong>Até o dia 20/05: </strong></p>
<ul>
<li>R$25,00 para público em geral</li>
<li>R$15,00 para associados SUCESU-RS.</li>
<li>R$20,00 para pacotes de 5 inscrições.</li>
<li>R$15,00 para pacotes de 10 inscrições.</li>
</ul>
<p><strong>Após o dia 20/05:</strong> </p>
<ul>
<li>R$30,00 para público em geral</li>
<li>R$20,00 para associados SUCESU-RS.</li>
<li>R$25,00 para pacotes de 5 inscrições.</li>
<li>R$20,00 para pacotes de 10 inscrições.</li>
</ul>
<p>Certificados serão fornecidos aos participantes ao final do evento.<br />
Estrutura contará com rede Wireless liberada aos participantes.<br />
Um Cyber espaço será montado para facilitar ainda mais a conectividade dos participantes.<br />
<strong><a href="http://www.rsjug.org/eventos" onclick="javascript:urchinTracker ('/outbound/article/www.rsjug.org');">Increva-se já!</a> </strong></p>
<p>Muito obrigado&#8230;. e espero vocês lá!<br />
Igor Montezano<br />
RSJUG Leader</p>

<p><a href="http://feeds.urubatan.com.br/~a/UrubatansWeblog?a=Pf3gIl"><img src="http://feeds.urubatan.com.br/~a/UrubatansWeblog?i=Pf3gIl" border="0"></img></a></p><div class="feedflare">
<a href="http://feeds.urubatan.com.br/~f/UrubatansWeblog?a=1oMIdh"><img src="http://feeds.urubatan.com.br/~f/UrubatansWeblog?i=1oMIdh" border="0"></img></a> <a href="http://feeds.urubatan.com.br/~f/UrubatansWeblog?a=wD5xph"><img src="http://feeds.urubatan.com.br/~f/UrubatansWeblog?i=wD5xph" border="0"></img></a> <a href="http://feeds.urubatan.com.br/~f/UrubatansWeblog?a=O66l0h"><img src="http://feeds.urubatan.com.br/~f/UrubatansWeblog?i=O66l0h" border="0"></img></a> <a href="http://feeds.urubatan.com.br/~f/UrubatansWeblog?a=XgQrcH"><img src="http://feeds.urubatan.com.br/~f/UrubatansWeblog?i=XgQrcH" border="0"></img></a> <a href="http://feeds.urubatan.com.br/~f/UrubatansWeblog?a=VQMfmH"><img src="http://feeds.urubatan.com.br/~f/UrubatansWeblog?i=VQMfmH" border="0"></img></a> <a href="http://feeds.urubatan.com.br/~f/UrubatansWeblog?a=1EuzzH"><img src="http://feeds.urubatan.com.br/~f/UrubatansWeblog?i=1EuzzH" border="0"></img></a> <a href="http://feeds.urubatan.com.br/~f/UrubatansWeblog?a=gpA74H"><img src="http://feeds.urubatan.com.br/~f/UrubatansWeblog?i=gpA74H" border="0"></img></a> <a href="http://feeds.urubatan.com.br/~f/UrubatansWeblog?a=MSedLH"><img src="http://feeds.urubatan.com.br/~f/UrubatansWeblog?i=MSedLH" border="0"></img></a>
</div><img src="http://feeds.urubatan.com.br/~r/UrubatansWeblog/~4/290156084" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.urubatan.com.br/1o-jugday-do-rsjug/feed/</wfw:commentRss>
		<feedburner:awareness>http://api.feedburner.com/awareness/1.0/GetItemData?uri=UrubatansWeblog&amp;itemurl=http%3A%2F%2Fwww.urubatan.com.br%2F1o-jugday-do-rsjug%2F</feedburner:awareness><feedburner:origLink>http://www.urubatan.com.br/1o-jugday-do-rsjug/</feedburner:origLink></item>
		<item>
		<title>*nix history Meme</title>
		<link>http://feeds.urubatan.com.br/~r/UrubatansWeblog/~3/288284768/</link>
		<comments>http://www.urubatan.com.br/nix-history-meme/#comments</comments>
		<pubDate>Sun, 11 May 2008 22:15:07 +0000</pubDate>
		<dc:creator>Urubatan</dc:creator>
		
		<category><![CDATA[Dia a Dia]]></category>

		<category><![CDATA[meme]]></category>

		<category><![CDATA[useless]]></category>

		<guid isPermaLink="false">http://www.urubatan.com.br/?p=1386</guid>
		<description>Tudo bem, pode ser a completa e total falta do que fazer, mas vamos ver se o pessoal resolve entrar na brincadeira 
A idéia é listar os comandos mais usados na maquina, no meu caso (Ubuntu 8.04) usei o comando:

history &amp;#124; awk '{a[$2]++}END{for(i in a){print a[i] " " i}}' &amp;#124; sort -rn &amp;#124; head

que resultou [...]</description>
			<content:encoded><![CDATA[<p>Tudo bem, pode ser a completa e total falta do que fazer, mas vamos ver se o pessoal resolve entrar na brincadeira <img src='http://www.urubatan.com.br/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /><br />
A idéia é listar os comandos mais usados na maquina, no meu caso (Ubuntu 8.04) usei o comando:</p>
<pre>
history | awk '{a[$2]++}END{for(i in a){print a[i] " " i}}' | sort -rn | head
</pre>
<p>que resultou neste output:</p>
<pre>
[19:02][urubatan@urubatan-laptop:~]$ history | awk '{a[$2]++}END{for(i in a){print a[i] " " i}}' | sort -rn | head
83 cd
68 sudo
36 git
31 ls
23 vi
20 dpkg
19 tail
16 rake
13 rm
13 gem
</pre>
<p>O que quer dizer que eu uso bastante o GIT, e o VI, muito muito de diretório, instalo muitas gems, e listo pacotes instalados no meu linux bastante <img src='http://www.urubatan.com.br/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </p>
<p>Então, vocês topam a brincadeira?<br />
A idéia é colocar um link de volta para este post no post que vocês escreverem com a listagem dos comandos, vale qualquer coisa derivada e unix, Linux, Mac, *BSD, OpenSolaris, &#8230;<br />
E no mesmo post, indicar mais X pessoas para o meme.<br />
os meus indicados são: <a href="http://blog.caelum.com.br" >Paulo Silveira</a>, <a href="http://www.arthurgeek.net/" onclick="javascript:urchinTracker ('/outbound/article/www.arthurgeek.net');">ArthurGeek</a>, <a href="http://lixo.org/" onclick="javascript:urchinTracker ('/outbound/article/lixo.org');">Carlos Villela</a>, <a href="http://www.akitaonrails.com" onclick="javascript:urchinTracker ('/outbound/article/www.akitaonrails.com');">Fabio Akita</a> e <a href="http://nomedojogo.com/" onclick="javascript:urchinTracker ('/outbound/article/nomedojogo.com');">Carlos Brando</a>. (Se algum de vocês ainda estiver usando Windows, favor formatar a maquina e instalar um SO decente <img src='http://www.urubatan.com.br/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> )</p>
<p>PS.: se não estiverem afim de participar não tem stress, eu nunca participei de um meme antes, acho que deve ser a completa falta do que fazer em um domingo a noite enquanto espero o chimarrão ficar pronto:D</p>

<p><a href="http://feeds.urubatan.com.br/~a/UrubatansWeblog?a=wmrJRH"><img src="http://feeds.urubatan.com.br/~a/UrubatansWeblog?i=wmrJRH" border="0"></img></a></p><div class="feedflare">
<a href="http://feeds.urubatan.com.br/~f/UrubatansWeblog?a=AE9Nth"><img src="http://feeds.urubatan.com.br/~f/UrubatansWeblog?i=AE9Nth" border="0"></img></a> <a href="http://feeds.urubatan.com.br/~f/UrubatansWeblog?a=J8d1rh"><img src="http://feeds.urubatan.com.br/~f/UrubatansWeblog?i=J8d1rh" border="0"></img></a> <a href="http://feeds.urubatan.com.br/~f/UrubatansWeblog?a=JtJSGh"><img src="http://feeds.urubatan.com.br/~f/UrubatansWeblog?i=JtJSGh" border="0"></img></a> <a href="http://feeds.urubatan.com.br/~f/UrubatansWeblog?a=e3EhPH"><img src="http://feeds.urubatan.com.br/~f/UrubatansWeblog?i=e3EhPH" border="0"></img></a> <a href="http://feeds.urubatan.com.br/~f/UrubatansWeblog?a=ICtRCH"><img src="http://feeds.urubatan.com.br/~f/UrubatansWeblog?i=ICtRCH" border="0"></img></a> <a href="http://feeds.urubatan.com.br/~f/UrubatansWeblog?a=P2DLMH"><img src="http://feeds.urubatan.com.br/~f/UrubatansWeblog?i=P2DLMH" border="0"></img></a> <a href="http://feeds.urubatan.com.br/~f/UrubatansWeblog?a=o8pa3H"><img src="http://feeds.urubatan.com.br/~f/UrubatansWeblog?i=o8pa3H" border="0"></img></a> <a href="http://feeds.urubatan.com.br/~f/UrubatansWeblog?a=m0kaCH"><img src="http://feeds.urubatan.com.br/~f/UrubatansWeblog?i=m0kaCH" border="0"></img></a>
</div><img src="http://feeds.urubatan.com.br/~r/UrubatansWeblog/~4/288284768" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.urubatan.com.br/nix-history-meme/feed/</wfw:commentRss>
		<feedburner:awareness>http://api.feedburner.com/awareness/1.0/GetItemData?uri=UrubatansWeblog&amp;itemurl=http%3A%2F%2Fwww.urubatan.com.br%2Fnix-history-meme%2F</feedburner:awareness><feedburner:origLink>http://www.urubatan.com.br/nix-history-meme/</feedburner:origLink></item>
		<item>
		<title>Autocomplete para rails com jquery muito fácil!</title>
		<link>http://feeds.urubatan.com.br/~r/UrubatansWeblog/~3/282034003/</link>
		<comments>http://www.urubatan.com.br/autocomplete-para-rails-com-jquery-muito-facil/#comments</comments>
		<pubDate>Fri, 02 May 2008 11:00:38 +0000</pubDate>
		<dc:creator>Urubatan</dc:creator>
		
		<category><![CDATA[rails]]></category>

		<category><![CDATA[autocomplete]]></category>

		<category><![CDATA[jquery]]></category>

		<category><![CDATA[Ruby]]></category>

		<guid isPermaLink="false">http://www.urubatan.com.br/?p=1384</guid>
		<description>No último projeto que estou trabalhando, resolvi utilizar jQuery em vez do prototype padrão &amp;#8230;
E eu precisava de um campo de texto com auto completar, e mesmo que estivesse utilizando o prototype, não seria muito fácil utilizar o plugin de autocomplete do rails por que eu precisava deste auto complete em um campo de texto [...]</description>
			<content:encoded><![CDATA[<p>No último projeto que estou trabalhando, resolvi utilizar <a href="http://jquery.com/" onclick="javascript:urchinTracker ('/outbound/article/jquery.com');">jQuery</a> em vez do prototype padrão &#8230;</p>
<p>E eu precisava de um campo de texto com auto completar, e mesmo que estivesse utilizando o prototype, não seria muito fácil utilizar o plugin de autocomplete do rails por que eu precisava deste auto complete em um campo de texto que existe diversas vezes dentro do mesmo form, e novos são adicionados via RJS, isto complicava muito a minha vida por que o ID destes campos adicionados automagicamente é o mesmo &#8230;</p>
<p>Como estava utilizando o <a href="http://jquery.com/" onclick="javascript:urchinTracker ('/outbound/article/jquery.com');">jQuery</a>, atravéz do plugin <a href="http://ennerchi.com/projects/jrails" onclick="javascript:urchinTracker ('/outbound/article/ennerchi.com');">jRails</a> isto se tornou muito fácil, bastou utilizar o plugin <a href="http://plugins.jquery.com/project/suggest" onclick="javascript:urchinTracker ('/outbound/article/plugins.jquery.com');">suggest do proprio jQuery</a> &#8230;</p>
<p>O processo para habilitar este autocomplete é bem simples como vocês podem ver abaixo.<br />
Primeiro, instalando o plugin jRails:<br />
<code><br />
script/plugin install http://ennerchi.googlecode.com/svn/trunk/plugins/jrails<br />
rake jrails:install:javascripts<br />
</code><br />
Com isto podemos começar a brincar com os plugins do jQuery, para utilizar o plugin suggest, basta fazer o download dele, colocar o css na pasta public/stylesheets e o js na pasta public/javascripts da aplicação &#8230;<br />
Ai vamos editar o layout padrão da aplicação, e ter certeza de que ele inclui as seguintes linhas:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
</pre></td><td class="code"><pre class="rails">  &lt;%= <span style="color:#5A0A0A; font-weight:bold;">stylesheet_link_tag</span> <span style="color:#996600;">'jquery.suggest.css'</span> %&gt;
  &lt;%= <span style="color:#5A0A0A; font-weight:bold;">javascript_include_tag</span> <span style="color:#ff3333; font-weight:bold;">:defaults</span> %&gt;
  &lt;%= <span style="color:#5A0A0A; font-weight:bold;">javascript_include_tag</span> <span style="color:#996600;">&quot;jquery.suggest.js&quot;</span> %&gt;</pre></td></tr></table></div>

<p>Depois disto, em qualquer formulário, para ativar o suggest, basta colocar um text_field padrão do rails com o seguinte código (este bloco veio de dentro de um form_for):</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
</pre></td><td class="code"><pre class="rails"> &lt;%= inf.<span style="color:#9900CC;">text_field</span> <span style="color:#ff3333; font-weight:bold;">:name</span>, <span style="color:#ff3333; font-weight:bold;">:onfocus</span> =&gt; <span style="color:#996600;">&quot;$(this).suggest('#{formatted_examples_url(:js)}')&quot;</span>, <span style="color:#ff3333; font-weight:bold;">:index</span> =&gt; <span style="color:#0000FF; font-weight:bold;">nil</span> %&gt;</pre></td></tr></table></div>

<p>assim, o suggest vai ser ativado para este campo quando o usuário entrar no campo, independente de se ja existe outro campo com o mesmo ID (sim, eu sei que não deveriam existir objetos com o mesmo ID, mas neste caso não tenho muito como evitar isto &#8230; )<br />
Agora no controller &#8230;<br />
Tenho o controller examples mapeado como um resource padrão no rails, e editei o método index dele para ficar parecido com isto:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
</pre></td><td class="code"><pre class="rails">  <span style="color:#9966CC; font-weight:bold;">def</span> index
    <span style="color:#0066ff; font-weight:bold;">@examples</span> = Example.<span style="color:#5A0A0A; font-weight:bold;">paginate</span> <span style="color:#ff3333; font-weight:bold;">:page</span> =&gt; params<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#ff3333; font-weight:bold;">:page</span><span style="color:#006600; font-weight:bold;">&#93;</span>, <span style="color:#ff3333; font-weight:bold;">:conditions</span> =&gt; <span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#996600;">&quot;name like ?&quot;</span>,<span style="color:#996600;">&quot;%#{params[:q]}%&quot;</span><span style="color:#006600; font-weight:bold;">&#93;</span>
&nbsp;
    <span style="color:#5A0A0A; font-weight:bold;">respond_to</span> <span style="color:#9966CC; font-weight:bold;">do</span> |format|
      <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> =&gt; <span style="color:#0066ff; font-weight:bold;">@examples</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;">end</span>
  <span style="color:#9966CC; font-weight:bold;">end</span></pre></td></tr></table></div>

<p>basicamente a única alteração do controller padrão foi adicionar a linha format.js e adicionei a condition para filtrar a consulta &#8230;<br />
depois disto criei o arquivo &#8220;index.js.erb&#8221; com o seguinte conteúdo (sim, eu podia fazer um render :inline mas não gosto muito da idéia <img src='http://www.urubatan.com.br/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> )</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
</pre></td><td class="code"><pre class="rails">&lt;%= <span style="color:#0066ff; font-weight:bold;">@examples</span>.<span style="color:#9900CC;">collect</span><span style="color:#006600; font-weight:bold;">&#40;</span>&amp;:name<span style="color:#006600; font-weight:bold;">&#41;</span>.<span style="color:#9900CC;">join</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">&quot;<span style="color:#000099;">\n</span>&quot;</span><span style="color:#006600; font-weight:bold;">&#41;</span> %&gt;</pre></td></tr></table></div>

<p>fazendo com que o resultado desta action quando chamada com a extensão &#8220;js&#8221; fosse apenas uma listagem com um nome por linha &#8230;<br />
<!--adsense--><br />
Tudo pronto, autocomplete funcionando <img src='http://www.urubatan.com.br/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /><br />
Achei mais simples do que o plugin padrão do rails para autocomplete <img src='http://www.urubatan.com.br/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </p>
<p>PS.: cada vez eu acho o jQuery mais legal de trabalhar, to curtindo mais ele do que o prototype.</p>

<p><a href="http://feeds.urubatan.com.br/~a/UrubatansWeblog?a=8vh6r9"><img src="http://feeds.urubatan.com.br/~a/UrubatansWeblog?i=8vh6r9" border="0"></img></a></p><div class="feedflare">
<a href="http://feeds.urubatan.com.br/~f/UrubatansWeblog?a=s3zC6h"><img src="http://feeds.urubatan.com.br/~f/UrubatansWeblog?i=s3zC6h" border="0"></img></a> <a href="http://feeds.urubatan.com.br/~f/UrubatansWeblog?a=6UBkSh"><img src="http://feeds.urubatan.com.br/~f/UrubatansWeblog?i=6UBkSh" border="0"></img></a> <a href="http://feeds.urubatan.com.br/~f/UrubatansWeblog?a=Bn0NMh"><img src="http://feeds.urubatan.com.br/~f/UrubatansWeblog?i=Bn0NMh" border="0"></img></a> <a href="http://feeds.urubatan.com.br/~f/UrubatansWeblog?a=3cZ8KH"><img src="http://feeds.urubatan.com.br/~f/UrubatansWeblog?i=3cZ8KH" border="0"></img></a> <a href="http://feeds.urubatan.com.br/~f/UrubatansWeblog?a=8fkaSH"><img src="http://feeds.urubatan.com.br/~f/UrubatansWeblog?i=8fkaSH" border="0"></img></a> <a href="http://feeds.urubatan.com.br/~f/UrubatansWeblog?a=wuvKkH"><img src="http://feeds.urubatan.com.br/~f/UrubatansWeblog?i=wuvKkH" border="0"></img></a> <a href="http://feeds.urubatan.com.br/~f/UrubatansWeblog?a=she1RH"><img src="http://feeds.urubatan.com.br/~f/UrubatansWeblog?i=she1RH" border="0"></img></a> <a href="http://feeds.urubatan.com.br/~f/UrubatansWeblog?a=SsRo4H"><img src="http://feeds.urubatan.com.br/~f/UrubatansWeblog?i=SsRo4H" border="0"></img></a>
</div><img src="http://feeds.urubatan.com.br/~r/UrubatansWeblog/~4/282034003" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.urubatan.com.br/autocomplete-para-rails-com-jquery-muito-facil/feed/</wfw:commentRss>
		<feedburner:awareness>http://api.feedburner.com/awareness/1.0/GetItemData?uri=UrubatansWeblog&amp;itemurl=http%3A%2F%2Fwww.urubatan.com.br%2Fautocomplete-para-rails-com-jquery-muito-facil%2F</feedburner:awareness><feedburner:origLink>http://www.urubatan.com.br/autocomplete-para-rails-com-jquery-muito-facil/</feedburner:origLink></item>
		<item>
		<title>Layout novo!</title>
		<link>http://feeds.urubatan.com.br/~r/UrubatansWeblog/~3/281785263/</link>
		<comments>http://www.urubatan.com.br/layout-novo/#comments</comments>
		<pubDate>Fri, 02 May 2008 01:16:27 +0000</pubDate>
		<dc:creator>Urubatan</dc:creator>
		
		<category><![CDATA[Dia a Dia]]></category>

		<guid isPermaLink="false">http://www.urubatan.com.br/?p=1385</guid>
		<description>Bom, o layout antigo, aquele parecido com um Mac ja estava todo empoeirado, cheirando a mofo 
então resolvi mudar o layout do blog.
Deem uma olhada e me digam o que acharam deste.
Suas opiniões são importantes!
Valeus!</description>
			<content:encoded><![CDATA[<p>Bom, o layout antigo, aquele parecido com um Mac ja estava todo empoeirado, cheirando a mofo <img src='http://www.urubatan.com.br/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /><br />
então resolvi mudar o layout do blog.<br />
Deem uma olhada e me digam o que acharam deste.</p>
<p>Suas opiniões são importantes!<br />
Valeus!</p>

<p><a href="http://feeds.urubatan.com.br/~a/UrubatansWeblog?a=LGHwdS"><img src="http://feeds.urubatan.com.br/~a/UrubatansWeblog?i=LGHwdS" border="0"></img></a></p><div class="feedflare">
<a href="http://feeds.urubatan.com.br/~f/UrubatansWeblog?a=DWhv2h"><img src="http://feeds.urubatan.com.br/~f/UrubatansWeblog?i=DWhv2h" border="0"></img></a> <a href="http://feeds.urubatan.com.br/~f/UrubatansWeblog?a=wztTfh"><img src="http://feeds.urubatan.com.br/~f/UrubatansWeblog?i=wztTfh" border="0"></img></a> <a href="http://feeds.urubatan.com.br/~f/UrubatansWeblog?a=M1eWQh"><img src="http://feeds.urubatan.com.br/~f/UrubatansWeblog?i=M1eWQh" border="0"></img></a> <a href="http://feeds.urubatan.com.br/~f/UrubatansWeblog?a=FS413H"><img src="http://feeds.urubatan.com.br/~f/UrubatansWeblog?i=FS413H" border="0"></img></a> <a href="http://feeds.urubatan.com.br/~f/UrubatansWeblog?a=ihJhQH"><img src="http://feeds.urubatan.com.br/~f/UrubatansWeblog?i=ihJhQH" border="0"></img></a> <a href="http://feeds.urubatan.com.br/~f/UrubatansWeblog?a=LbIcqH"><img src="http://feeds.urubatan.com.br/~f/UrubatansWeblog?i=LbIcqH" border="0"></img></a> <a href="http://feeds.urubatan.com.br/~f/UrubatansWeblog?a=0Q3FlH"><img src="http://feeds.urubatan.com.br/~f/UrubatansWeblog?i=0Q3FlH" border="0"></img></a> <a href="http://feeds.urubatan.com.br/~f/UrubatansWeblog?a=vF8SEH"><img src="http://feeds.urubatan.com.br/~f/UrubatansWeblog?i=vF8SEH" border="0"></img></a>
</div><img src="http://feeds.urubatan.com.br/~r/UrubatansWeblog/~4/281785263" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.urubatan.com.br/layout-novo/feed/</wfw:commentRss>
		<feedburner:awareness>http://api.feedburner.com/awareness/1.0/GetItemData?uri=UrubatansWeblog&amp;itemurl=http%3A%2F%2Fwww.urubatan.com.br%2Flayout-novo%2F</feedburner:awareness><feedburner:origLink>http://www.urubatan.com.br/layout-novo/</feedburner:origLink></item>
		<item>
		<title>Plugins para rails e grails</title>
		<link>http://feeds.urubatan.com.br/~r/UrubatansWeblog/~3/279461076/</link>
		<comments>http://www.urubatan.com.br/plugins-para-rails-e-grails/#comments</comments>
		<pubDate>Mon, 28 Apr 2008 15:37:04 +0000</pubDate>
		<dc:creator>Urubatan</dc:creator>
		
		<category><![CDATA[Trabalho]]></category>

		<category><![CDATA[rails]]></category>

		<category><![CDATA[bdd]]></category>

		<category><![CDATA[dry]]></category>

		<category><![CDATA[easyb]]></category>

		<category><![CDATA[grails]]></category>

		<category><![CDATA[groovy]]></category>

		<category><![CDATA[Ruby]]></category>

		<category><![CDATA[test]]></category>

		<guid isPermaLink="false">http://www.urubatan.com.br/?p=1383</guid>
		<description>Publiquei eles só no meu blog em ingles, mas acho que vale o link aqui pelo menos &amp;#8230;
Para quem é tão preguiçoso quanto eu, eu criei um plugin para o rails que reutiliza tudo (ou quase) o que você ja definiu na migration para gerar o model, o nome do plugin é mydry.
E para quem [...]</description>
			<content:encoded><![CDATA[<p>Publiquei eles só no meu blog em ingles, mas acho que vale o link aqui pelo menos &#8230;</p>
<p>Para quem é tão preguiçoso quanto eu, eu criei um plugin para o rails que reutiliza tudo (ou quase) o que você ja definiu na migration para gerar o model, o nome do <a href="http://www.urubatan.info/2008/04/lazy-mens-rails-plugin-mydry/" onclick="javascript:urchinTracker ('/outbound/article/www.urubatan.info');">plugin é mydry</a>.</p>
<p>E para quem trabalha com Grails, e estava triste até agora por não poder utilizar BDD de forma fácil, eu criei o <a href="http://www.urubatan.info/2008/04/easyb-test-grails-tests-made-easy-in-a-way-your-boss-can-read/" onclick="javascript:urchinTracker ('/outbound/article/www.urubatan.info');">plugin easyb-test</a> que permite utilizar o easyb para escrever testes para a sua aplicação Grails.</p>
<p>Se quiserem um exemplo de como usar este plugin do easyb, é só olhar o material da <a href="http://www.urubatan.com.br/grails-agilidade-produtividade-e-codigo-bonito-ao-seu-alcance/" >minha palestra do FISL deste ano</a>.</p>

<p><a href="http://feeds.urubatan.com.br/~a/UrubatansWeblog?a=ecLrYn"><img src="http://feeds.urubatan.com.br/~a/UrubatansWeblog?i=ecLrYn" border="0"></img></a></p><div class="feedflare">
<a href="http://feeds.urubatan.com.br/~f/UrubatansWeblog?a=hwmtog"><img src="http://feeds.urubatan.com.br/~f/UrubatansWeblog?i=hwmtog" border="0"></img></a> <a href="http://feeds.urubatan.com.br/~f/UrubatansWeblog?a=9wuM6g"><img src="http://feeds.urubatan.com.br/~f/UrubatansWeblog?i=9wuM6g" border="0"></img></a> <a href="http://feeds.urubatan.com.br/~f/UrubatansWeblog?a=Fd757g"><img src="http://feeds.urubatan.com.br/~f/UrubatansWeblog?i=Fd757g" border="0"></img></a> <a href="http://feeds.urubatan.com.br/~f/UrubatansWeblog?a=NeX5tG"><img src="http://feeds.urubatan.com.br/~f/UrubatansWeblog?i=NeX5tG" border="0"></img></a> <a href="http://feeds.urubatan.com.br/~f/UrubatansWeblog?a=wKEjnG"><img src="http://feeds.urubatan.com.br/~f/UrubatansWeblog?i=wKEjnG" border="0"></img></a> <a href="http://feeds.urubatan.com.br/~f/UrubatansWeblog?a=3g8FqG"><img src="http://feeds.urubatan.com.br/~f/UrubatansWeblog?i=3g8FqG" border="0"></img></a> <a href="http://feeds.urubatan.com.br/~f/UrubatansWeblog?a=UicgyG"><img src="http://feeds.urubatan.com.br/~f/UrubatansWeblog?i=UicgyG" border="0"></img></a> <a href="http://feeds.urubatan.com.br/~f/UrubatansWeblog?a=qrAIEG"><img src="http://feeds.urubatan.com.br/~f/UrubatansWeblog?i=qrAIEG" border="0"></img></a>
</div><img src="http://feeds.urubatan.com.br/~r/UrubatansWeblog/~4/279461076" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.urubatan.com.br/plugins-para-rails-e-grails/feed/</wfw:commentRss>
		<feedburner:awareness>http://api.feedburner.com/awareness/1.0/GetItemData?uri=UrubatansWeblog&amp;itemurl=http%3A%2F%2Fwww.urubatan.com.br%2Fplugins-para-rails-e-grails%2F</feedburner:awareness><feedburner:origLink>http://www.urubatan.com.br/plugins-para-rails-e-grails/</feedburner:origLink></item>
		<item>
		<title>Grails - Agilidade, produtividade e código bonito ao seu alcance</title>
		<link>http://feeds.urubatan.com.br/~r/UrubatansWeblog/~3/275474328/</link>
		<comments>http://www.urubatan.com.br/grails-agilidade-produtividade-e-codigo-bonito-ao-seu-alcance/#comments</comments>
		<pubDate>Tue, 22 Apr 2008 15:29:07 +0000</pubDate>
		<dc:creator>Urubatan</dc:creator>
		
		<category><![CDATA[Java]]></category>

		<category><![CDATA[fisl grails groovy palestra]]></category>

		<guid isPermaLink="false">http://www.urubatan.com.br/?p=1382</guid>
		<description>Bom, este foi o titulo da minha palestra no FISL este ano 
E como eu prometi, este post é para disponibilizar o conteúdo da palestra e o código do exemplo para quem quiser  
Eu não transformei a palestra em um screencast como o Akita, mas em pouco tempo o pessoal do FISL deve liberar [...]</description>
			<content:encoded><![CDATA[<p>Bom, este foi o titulo da minha palestra no FISL este ano <img src='http://www.urubatan.com.br/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /><br />
E como eu prometi, este post é para disponibilizar o conteúdo da palestra e o código do exemplo para quem quiser <img src='http://www.urubatan.com.br/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </p>
<p>Eu não transformei a <a href="http://www.akitaonrails.com/" onclick="javascript:urchinTracker ('/outbound/article/www.akitaonrails.com');">palestra em um screencast como o Akita</a>, mas em pouco tempo o pessoal do FISL deve liberar os videos gravados (quer dizer, as vezes demora bastante, mas eles sempre acabam liberando <img src='http://www.urubatan.com.br/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> )</p>
<p>Então é o seguinte, quem quiser o código fonte, <a href="http://gitorious.org/projects/fisl-2008-grails-presentation/repos/mainline" onclick="javascript:urchinTracker ('/outbound/article/gitorious.org');">disponibilizei ele no Gitorious</a> (Yeap, isto mesmo, usando GIT, quem usa o windows fazer o favor de <a href="http://code.google.com/p/msysgit/" onclick="javascript:urchinTracker ('/outbound/article/code.google.com');">instalar o git</a> ai e <a href="http://www.akitaonrails.com/2008/4/3/micro-tutorial-de-git" onclick="javascript:urchinTracker ('/outbound/article/www.akitaonrails.com');">aprender a usar este excelente sistema de controle de versões</a>, sim, é só linha de comando, sim, vale a pena).<br />
<code><br />
git clone git://gitorious.org/fisl-2008-grails-presentation/mainline.git<br />
</code><br />
ou<br />
<code><br />
git clone http://git.gitorious.org/fisl-2008-grails-presentation/mainline.git<br />
</code></p>
<p>Os slides, diferente do que costumo fazer, não vou colocar aqui para download, vou publicar eles pelo google docs, se não gostarem da esperiência me avisem por favor que coloco um PDF aqui disponível &#8230;</p>
<div style="width:425px;text-align:left" id="__ss_376928"><object style="margin:0px" width="425" height="355"><param name="movie" value="http://static.slideshare.net/swf/ssplayer2.swf?doc=grails-fisl2008-1209397443831213-8"/><param name="allowFullScreen" value="true"/><param name="allowScriptAccess" value="always"/><embed src="http://static.slideshare.net/swf/ssplayer2.swf?doc=grails-fisl2008-1209397443831213-8" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"></embed></object>
<div style="font-size:11px;font-family:tahoma,arial;height:26px;padding-top:2px;"><a href="http://www.slideshare.net/?src=embed" onclick="javascript:urchinTracker ('/outbound/article/www.slideshare.net');"><img src="http://static.slideshare.net/swf/logo_embd.png" style="border:0px none;margin-bottom:-5px" alt="SlideShare"/></a> | <a href="http://www.slideshare.net/guestac698c/grails-fisl2008?src=embed" title="View 'Grails   Fisl2008' on SlideShare" onclick="javascript:urchinTracker ('/outbound/article/www.slideshare.net');">View</a> | <a href="http://www.slideshare.net/upload?src=embed" onclick="javascript:urchinTracker ('/outbound/article/www.slideshare.net');">Upload your own</a></div>
</div>
<p><!--adsense--><br />
&lt;UPDATE&gt;<br />
Coloquei os slides no slideshare pra facilitar a visualização e o download para os interessados.<br />
&lt;/UPDATE&gt;<br />
Acho que era isto, espero que o material seja útil para alguem.</p>

<p><a href="http://feeds.urubatan.com.br/~a/UrubatansWeblog?a=g9z2LV"><img src="http://feeds.urubatan.com.br/~a/UrubatansWeblog?i=g9z2LV" border="0"></img></a></p><div class="feedflare">
<a href="http://feeds.urubatan.com.br/~f/UrubatansWeblog?a=ljVS9j"><img src="http://feeds.urubatan.com.br/~f/UrubatansWeblog?i=ljVS9j" border="0"></img></a> <a href="http://feeds.urubatan.com.br/~f/UrubatansWeblog?a=QRPdBj"><img src="http://feeds.urubatan.com.br/~f/UrubatansWeblog?i=QRPdBj" border="0"></img></a> <a href="http://feeds.urubatan.com.br/~f/UrubatansWeblog?a=R2fiUj"><img src="http://feeds.urubatan.com.br/~f/UrubatansWeblog?i=R2fiUj" border="0"></img></a> <a href="http://feeds.urubatan.com.br/~f/UrubatansWeblog?a=6FMgUJ"><img src="http://feeds.urubatan.com.br/~f/UrubatansWeblog?i=6FMgUJ" border="0"></img></a> <a href="http://feeds.urubatan.com.br/~f/UrubatansWeblog?a=gN0DFJ"><img src="http://feeds.urubatan.com.br/~f/UrubatansWeblog?i=gN0DFJ" border="0"></img></a> <a href="http://feeds.urubatan.com.br/~f/UrubatansWeblog?a=7YVAEJ"><img src="http://feeds.urubatan.com.br/~f/UrubatansWeblog?i=7YVAEJ" border="0"></img></a> <a href="http://feeds.urubatan.com.br/~f/UrubatansWeblog?a=OGtz3J"><img src="http://feeds.urubatan.com.br/~f/UrubatansWeblog?i=OGtz3J" border="0"></img></a> <a href="http://feeds.urubatan.com.br/~f/UrubatansWeblog?a=wmzzGJ"><img src="http://feeds.urubatan.com.br/~f/UrubatansWeblog?i=wmzzGJ" border="0"></img></a>
</div><img src="http://feeds.urubatan.com.br/~r/UrubatansWeblog/~4/275474328" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.urubatan.com.br/grails-agilidade-produtividade-e-codigo-bonito-ao-seu-alcance/feed/</wfw:commentRss>
		<feedburner:awareness>http://api.feedburner.com/awareness/1.0/GetItemData?uri=UrubatansWeblog&amp;itemurl=http%3A%2F%2Fwww.urubatan.com.br%2Fgrails-agilidade-produtividade-e-codigo-bonito-ao-seu-alcance%2F</feedburner:awareness><feedburner:origLink>http://www.urubatan.com.br/grails-agilidade-produtividade-e-codigo-bonito-ao-seu-alcance/</feedburner:origLink></item>
		<item>
		<title>Mais um tutorial do RSJUG - Clusterização e Load Balance de aplicações JEE</title>
		<link>http://feeds.urubatan.com.br/~r/UrubatansWeblog/~3/264092420/</link>
		<comments>http://www.urubatan.com.br/mais-um-tutorial-do-rsjug-clusterizacao-e-load-balance-de-aplicacoes-jee/#comments</comments>
		<pubDate>Fri, 04 Apr 2008 16:57:57 +0000</pubDate>
		<dc:creator>Urubatan</dc:creator>
		
		<category><![CDATA[Dia a Dia]]></category>

		<guid isPermaLink="false">http://www.urubatan.com.br/?p=1381</guid>
		<description>Desta vez o tutorial vai ser sobre Clusterização e Load Balance de aplicações JEE
Segue um quote no anuncio na página do JUG:

Tutorial Clusterização e Load Balance de aplicações JEE

Neste tutorial os participantes aprenderão a clusterizar aplicações JEE em servidores distintos com sessões de usuário replicadas.
Exemplos de falhas e contingências serão apresentados para considerar a estabilidade [...]</description>
			<content:encoded><![CDATA[<p>Desta vez o tutorial vai ser sobre <strong>Clusterização e Load Balance de aplicações JEE</strong><br />
Segue um quote no anuncio na página do JUG:</p>
<hr/>
<h2>Tutorial Clusterização e Load Balance de aplicações JEE</h2>
<p><center><a href="http://www.rsjug.org/eventos" onclick="javascript:urchinTracker ('/outbound/article/www.rsjug.org');"><img style="border: 0pt none ;" src="http://www.rsjug.org/images/tutorial-20080412.jpg"></a></center></p>
<p>Neste tutorial os participantes aprenderão a clusterizar aplicações JEE em servidores distintos com sessões de usuário replicadas.<br />
Exemplos de falhas e contingências serão apresentados para considerar a estabilidade da solução. Na questão de perfomance e acesso implementaremos o load balance de aplicações JEE com apache.<br />
O tutorial será min