<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2portuguesefull.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">

<channel>
	<title>Fabiano Sobreira</title>
	
	<link>http://blog.sobreira.eti.br</link>
	<description>Um pouco sobre Java e boas práticas de desenvolvimento</description>
	<lastBuildDate>Thu, 01 Jul 2010 00:39:22 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/fabianosobreira" /><feedburner:info uri="fabianosobreira" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><xhtml:meta xmlns:xhtml="http://www.w3.org/1999/xhtml" name="robots" content="noindex" /><feedburner:feedFlare href="http://add.my.yahoo.com/rss?url=http%3A%2F%2Ffeeds.feedburner.com%2Ffabianosobreira" 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%2Ffeeds.feedburner.com%2Ffabianosobreira" 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%2Ffeeds.feedburner.com%2Ffabianosobreira" 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.bloglines.com/sub/http://feeds.feedburner.com/fabianosobreira" 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%2Ffeeds.feedburner.com%2Ffabianosobreira" 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%2Ffeeds.feedburner.com%2Ffabianosobreira" 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%2Ffeeds.feedburner.com%2Ffabianosobreira" src="http://www.pageflakes.com/ImageFile.ashx?instanceId=Static_4&amp;fileName=ATP_blu_91x17.gif">Subscribe with Pageflakes</feedburner:feedFlare><feedburner:feedFlare href="http://www.plusmo.com/add?url=http%3A%2F%2Ffeeds.feedburner.com%2Ffabianosobreira" src="http://plusmo.com/res/graphics/fbplusmo.gif">Subscribe with Plusmo</feedburner:feedFlare><feedburner:feedFlare href="http://www.thefreedictionary.com/_/hp/AddRSS.aspx?http%3A%2F%2Ffeeds.feedburner.com%2Ffabianosobreira" src="http://img.tfd.com/hp/addToTheFreeDictionary.gif">Subscribe with The Free Dictionary</feedburner:feedFlare><feedburner:feedFlare href="http://www.bitty.com/manual/?contenttype=rssfeed&amp;contentvalue=http%3A%2F%2Ffeeds.feedburner.com%2Ffabianosobreira" src="http://www.bitty.com/img/bittychicklet_91x17.gif">Subscribe with Bitty Browser</feedburner:feedFlare><feedburner:feedFlare href="http://www.newsalloy.com/?rss=http%3A%2F%2Ffeeds.feedburner.com%2Ffabianosobreira" src="http://www.newsalloy.com/subrss3.gif">Subscribe with NewsAlloy</feedburner:feedFlare><feedburner:feedFlare href="http://www.live.com/?add=http%3A%2F%2Ffeeds.feedburner.com%2Ffabianosobreira" src="http://tkfiles.storage.msn.com/x1piYkpqHC_35nIp1gLE68-wvzLZO8iXl_JMledmJQXP-XTBOLfmQv4zhj4MhcWEJh_GtoBIiAl1Mjh-ndp9k47If7hTaFno0mxW9_i3p_5qQw">Subscribe with Live.com</feedburner:feedFlare><feedburner:feedFlare href="http://mix.excite.eu/add?feedurl=http%3A%2F%2Ffeeds.feedburner.com%2Ffabianosobreira" src="http://image.excite.co.uk/mix/addtomix.gif">Subscribe with Excite MIX</feedburner:feedFlare><feedburner:feedFlare href="http://download.attensa.com/app/get_attensa.html?feedurl=http%3A%2F%2Ffeeds.feedburner.com%2Ffabianosobreira" src="http://www.attensa.com/blogs/attensa/WindowsLiveWriter/BadgeredintoBadges_10C02/attensa_feed_button5.gif">Subscribe with Attensa for Outlook</feedburner:feedFlare><feedburner:feedFlare href="http://www.webwag.com/wwgthis.php?url=http%3A%2F%2Ffeeds.feedburner.com%2Ffabianosobreira" src="http://www.webwag.com/images/wwgthis.gif">Subscribe with Webwag</feedburner:feedFlare><feedburner:feedFlare href="http://www.podcastready.com/oneclick_bookmark.php?url=http%3A%2F%2Ffeeds.feedburner.com%2Ffabianosobreira" src="http://www.podcastready.com/images/podcastready_button.gif">Subscribe with Podcast Ready</feedburner:feedFlare><feedburner:feedFlare href="http://www.flurry.com/pushRssFeed.do?r=fb&amp;url=http%3A%2F%2Ffeeds.feedburner.com%2Ffabianosobreira" src="http://www.flurry.com/images/flurry_rss_logo2.gif">Subscribe with Flurry</feedburner:feedFlare><feedburner:feedFlare href="http://www.wikio.com/subscribe?url=http%3A%2F%2Ffeeds.feedburner.com%2Ffabianosobreira" src="http://www.wikio.com/shared/img/add2wikio.gif">Subscribe with Wikio</feedburner:feedFlare><feedburner:feedFlare href="http://www.dailyrotation.com/index.php?feed=http%3A%2F%2Ffeeds.feedburner.com%2Ffabianosobreira" src="http://www.dailyrotation.com/rss-dr2.gif">Subscribe with Daily Rotation</feedburner:feedFlare><item>
		<title>Free E-Books!</title>
		<link>http://feedproxy.google.com/~r/fabianosobreira/~3/sP2CVW9AuYw/355</link>
		<comments>http://blog.sobreira.eti.br/archives/355#comments</comments>
		<pubDate>Thu, 22 Apr 2010 00:31:04 +0000</pubDate>
		<dc:creator>Fabiano Sobreira</dc:creator>
				<category><![CDATA[Diversos]]></category>
		<category><![CDATA[dicas]]></category>
		<category><![CDATA[links]]></category>

		<guid isPermaLink="false">http://blog.sobreira.eti.br/?p=355</guid>
		<description><![CDATA[No site E-Books Directory você vai encontrar um diretório de links para e-books gratuitos, desde graphic novels a livros sobre ciência da computação. Tem algumas coisas muito boas lá. Pra ir direto a seção sobre linguagens de programação é só clicar aqui. Os livros estão todos em lingua inglesa.]]></description>
			<content:encoded><![CDATA[
<p>No site <a href="http://www.e-booksdirectory.com">E-Books Directory</a> você vai encontrar um diretório de links para e-books gratuitos, desde graphic novels a livros sobre ciência da computação. Tem algumas coisas muito boas lá. Pra ir direto a seção sobre linguagens de programação é só clicar <a href="http://www.e-booksdirectory.com/programming.php">aqui</a>.</p>
<p>Os livros estão todos em lingua inglesa.</p>

<img src="http://feeds.feedburner.com/~r/fabianosobreira/~4/sP2CVW9AuYw" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.sobreira.eti.br/archives/355/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://blog.sobreira.eti.br/archives/355</feedburner:origLink></item>
		<item>
		<title>Código Ruim</title>
		<link>http://feedproxy.google.com/~r/fabianosobreira/~3/hOlJt7gwIAw/322</link>
		<comments>http://blog.sobreira.eti.br/archives/322#comments</comments>
		<pubDate>Mon, 15 Feb 2010 19:57:37 +0000</pubDate>
		<dc:creator>Fabiano Sobreira</dc:creator>
				<category><![CDATA[Refatoração]]></category>
		<category><![CDATA[BoasPraticas]]></category>

		<guid isPermaLink="false">http://blog.sobreira.eti.br/?p=322</guid>
		<description><![CDATA[Um código bom é como uma prosa bem redigida, exprime com clareza sua intenção e exerce boa influência nas alterações futuras. Passamos a maior parte do tempo de programação lendo e aprendendo códigos dos outros e quanto mais agradável esta experiência, melhores são nossos resultados. Infelizmente a realidade é um pouco diferente&#8230; Na Semana passada [...]]]></description>
			<content:encoded><![CDATA[
<p><a href="http://blog.sobreira.eti.br/wp-content/uploads/2010/02/wtfm.jpg"><img src="http://blog.sobreira.eti.br/wp-content/uploads/2010/02/wtfm-150x150.jpg" alt="" title="WTF Per Minute" width="150" height="150" class="alignright size-thumbnail wp-image-370" /></a>Um código bom é como uma prosa bem redigida, exprime com clareza sua intenção e exerce boa influência nas alterações futuras. Passamos a maior parte do tempo de programação lendo e aprendendo códigos dos outros e quanto mais agradável esta experiência, melhores são nossos resultados.</p>
<p>Infelizmente a realidade é um pouco diferente&#8230;</p>
<p>Na Semana passada um novato da equipe de desenvolvimento Delphi pediu para que eu verificasse um trecho de código no módulo de folha de pagamentos, pois achou engraçado a lógica condicional que fazia a mesma coisa independendente do resultado:</p>
<div class="codecolorer-container delphi dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:100%;height:400px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br /></div></td><td><div class="delphi codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #000000; font-weight: bold;">procedure</span> TForm1<span style="color: #000066;">.</span><span style="color: #006600;">ProcessarLog</span><span style="color: #000066;">&#40;</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">;</span><br />
<span style="color: #000000; font-weight: bold;">begin</span><br />
<span style="color: #000000; font-weight: bold;">if</span> cdsEventos<span style="color: #000066;">.</span><span style="color: #006600;">FieldByName</span><span style="color: #000066;">&#40;</span><span style="color: #ff0000;">'PROCESSADO'</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">.</span><span style="color: #006600;">AsString</span> <span style="color: #000066;">=</span> <span style="color: #ff0000;">'P'</span> <span style="color: #000000; font-weight: bold;">then</span><br />
&nbsp; &nbsp; LogVer<span style="color: #000066;">.</span><span style="color: #006600;">Add</span><span style="color: #000066;">&#40;</span><span style="color: #ff0000;">'|'</span><span style="color: #000066;">+</span>Alinhar<span style="color: #000066;">&#40;</span>DIREITA<span style="color: #000066;">,</span> <span style="color: #0000ff;">11</span><span style="color: #000066;">,</span> <span style="color: #ff0000;">'0'</span><span style="color: #000066;">,</span> cdsEventos<span style="color: #000066;">.</span><span style="color: #006600;">FieldByName</span><span style="color: #000066;">&#40;</span><span style="color: #ff0000;">'FUNCIONARIO'</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">.</span><span style="color: #006600;">AsString</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">+</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #ff0000;">'|'</span><span style="color: #000066;">+</span>Alinhar<span style="color: #000066;">&#40;</span>DIREITA<span style="color: #000066;">,</span> &nbsp;<span style="color: #0000ff;">6</span><span style="color: #000066;">,</span> <span style="color: #ff0000;">'0'</span><span style="color: #000066;">,</span> cdsEventos<span style="color: #000066;">.</span><span style="color: #006600;">FieldByName</span><span style="color: #000066;">&#40;</span><span style="color: #ff0000;">'EVENTO'</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">.</span><span style="color: #006600;">AsString</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">+</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #ff0000;">'|'</span><span style="color: #000066;">+</span>Alinhar<span style="color: #000066;">&#40;</span>DIREITA<span style="color: #000066;">,</span> <span style="color: #0000ff;">10</span><span style="color: #000066;">,</span> <span style="color: #ff0000;">' '</span><span style="color: #000066;">,</span> cdsEventos<span style="color: #000066;">.</span><span style="color: #006600;">FieldByName</span><span style="color: #000066;">&#40;</span><span style="color: #ff0000;">'ANO_MES'</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">.</span><span style="color: #006600;">AsString</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">+</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #ff0000;">'|'</span><span style="color: #000066;">+</span>Alinhar<span style="color: #000066;">&#40;</span>DIREITA<span style="color: #000066;">,</span> <span style="color: #0000ff;">10</span><span style="color: #000066;">,</span> <span style="color: #ff0000;">'0'</span><span style="color: #000066;">,</span> <span style="color: #000066;">FormatFloat</span><span style="color: #000066;">&#40;</span><span style="color: #ff0000;">'#0.00'</span><span style="color: #000066;">,</span>cdsEventos<span style="color: #000066;">.</span><span style="color: #006600;">FieldByName</span><span style="color: #000066;">&#40;</span><span style="color: #ff0000;">'QUANTIDADE'</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">.</span><span style="color: #006600;">AsFloat</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">+</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #ff0000;">'|'</span><span style="color: #000066;">+</span>Alinhar<span style="color: #000066;">&#40;</span>DIREITA<span style="color: #000066;">,</span> <span style="color: #0000ff;">18</span><span style="color: #000066;">,</span> <span style="color: #ff0000;">' '</span><span style="color: #000066;">,</span> <span style="color: #ff0000;">''</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">+</span><span style="color: #ff0000;">'|'</span><span style="color: #000066;">&#41;</span><br />
<span style="color: #000000; font-weight: bold;">else</span><br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">if</span> cdsEventos<span style="color: #000066;">.</span><span style="color: #006600;">FieldByName</span><span style="color: #000066;">&#40;</span><span style="color: #ff0000;">'PROCESSADO'</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">.</span><span style="color: #006600;">AsString</span> <span style="color: #000066;">=</span> <span style="color: #ff0000;">'A'</span> <span style="color: #000000; font-weight: bold;">then</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; LogAlte<span style="color: #000066;">.</span><span style="color: #006600;">Add</span><span style="color: #000066;">&#40;</span><span style="color: #ff0000;">'|'</span><span style="color: #000066;">+</span>Alinhar<span style="color: #000066;">&#40;</span>DIREITA<span style="color: #000066;">,</span> <span style="color: #0000ff;">11</span><span style="color: #000066;">,</span> <span style="color: #ff0000;">'0'</span><span style="color: #000066;">,</span> cdsEventos<span style="color: #000066;">.</span><span style="color: #006600;">FieldByName</span><span style="color: #000066;">&#40;</span><span style="color: #ff0000;">'FUNCIONARIO'</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">.</span><span style="color: #006600;">AsString</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">+</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff0000;">'|'</span><span style="color: #000066;">+</span>Alinhar<span style="color: #000066;">&#40;</span>DIREITA<span style="color: #000066;">,</span> &nbsp;<span style="color: #0000ff;">6</span><span style="color: #000066;">,</span> <span style="color: #ff0000;">'0'</span><span style="color: #000066;">,</span> cdsEventos<span style="color: #000066;">.</span><span style="color: #006600;">FieldByName</span><span style="color: #000066;">&#40;</span><span style="color: #ff0000;">'EVENTO'</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">.</span><span style="color: #006600;">AsString</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">+</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff0000;">'|'</span><span style="color: #000066;">+</span>Alinhar<span style="color: #000066;">&#40;</span>DIREITA<span style="color: #000066;">,</span> <span style="color: #0000ff;">10</span><span style="color: #000066;">,</span> <span style="color: #ff0000;">' '</span><span style="color: #000066;">,</span> cdsEventos<span style="color: #000066;">.</span><span style="color: #006600;">FieldByName</span><span style="color: #000066;">&#40;</span><span style="color: #ff0000;">'ANO_MES'</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">.</span><span style="color: #006600;">AsString</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">+</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff0000;">'|'</span><span style="color: #000066;">+</span>Alinhar<span style="color: #000066;">&#40;</span>DIREITA<span style="color: #000066;">,</span> <span style="color: #0000ff;">10</span><span style="color: #000066;">,</span> <span style="color: #ff0000;">'0'</span><span style="color: #000066;">,</span> <span style="color: #000066;">FormatFloat</span><span style="color: #000066;">&#40;</span><span style="color: #ff0000;">'#0.00'</span><span style="color: #000066;">,</span>cdsEventos<span style="color: #000066;">.</span><span style="color: #006600;">FieldByName</span><span style="color: #000066;">&#40;</span><span style="color: #ff0000;">'QUANTIDADE'</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">.</span><span style="color: #006600;">AsFloat</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">+</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff0000;">'|'</span><span style="color: #000066;">+</span>Alinhar<span style="color: #000066;">&#40;</span>DIREITA<span style="color: #000066;">,</span> <span style="color: #0000ff;">18</span><span style="color: #000066;">,</span> <span style="color: #ff0000;">' '</span><span style="color: #000066;">,</span> <span style="color: #000066;">&#41;</span><span style="color: #000066;">+</span><span style="color: #ff0000;">'|'</span><span style="color: #000066;">&#41;</span><br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">else</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">begin</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; LogCanc<span style="color: #000066;">.</span><span style="color: #006600;">Add</span><span style="color: #000066;">&#40;</span><span style="color: #ff0000;">'|'</span><span style="color: #000066;">+</span>Alinhar<span style="color: #000066;">&#40;</span>DIREITA<span style="color: #000066;">,</span> <span style="color: #0000ff;">11</span><span style="color: #000066;">,</span> <span style="color: #ff0000;">'0'</span><span style="color: #000066;">,</span> cdsEventos<span style="color: #000066;">.</span><span style="color: #006600;">FieldByName</span><span style="color: #000066;">&#40;</span><span style="color: #ff0000;">'FUNCIONARIO'</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">.</span><span style="color: #006600;">AsString</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">+</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff0000;">'|'</span><span style="color: #000066;">+</span>Alinhar<span style="color: #000066;">&#40;</span>DIREITA<span style="color: #000066;">,</span> &nbsp;<span style="color: #0000ff;">6</span><span style="color: #000066;">,</span> <span style="color: #ff0000;">'0'</span><span style="color: #000066;">,</span> cdsEventos<span style="color: #000066;">.</span><span style="color: #006600;">FieldByName</span><span style="color: #000066;">&#40;</span><span style="color: #ff0000;">'EVENTO'</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">.</span><span style="color: #006600;">AsString</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">+</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff0000;">'|'</span><span style="color: #000066;">+</span>Alinhar<span style="color: #000066;">&#40;</span>DIREITA<span style="color: #000066;">,</span> <span style="color: #0000ff;">10</span><span style="color: #000066;">,</span> <span style="color: #ff0000;">' '</span><span style="color: #000066;">,</span> cdsEventos<span style="color: #000066;">.</span><span style="color: #006600;">FieldByName</span><span style="color: #000066;">&#40;</span><span style="color: #ff0000;">'ANO_MES'</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">.</span><span style="color: #006600;">AsString</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">+</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff0000;">'|'</span><span style="color: #000066;">+</span>Alinhar<span style="color: #000066;">&#40;</span>DIREITA<span style="color: #000066;">,</span> <span style="color: #0000ff;">10</span><span style="color: #000066;">,</span> <span style="color: #ff0000;">'0'</span><span style="color: #000066;">,</span> <span style="color: #000066;">FormatFloat</span><span style="color: #000066;">&#40;</span><span style="color: #ff0000;">'#0.00'</span><span style="color: #000066;">,</span>cdsEventos<span style="color: #000066;">.</span><span style="color: #006600;">FieldByName</span><span style="color: #000066;">&#40;</span><span style="color: #ff0000;">'QUANTIDADE'</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">.</span><span style="color: #006600;">AsFloat</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">+</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff0000;">'|'</span><span style="color: #000066;">+</span>Alinhar<span style="color: #000066;">&#40;</span>DIREITA<span style="color: #000066;">,</span> <span style="color: #0000ff;">18</span><span style="color: #000066;">,</span> <span style="color: #ff0000;">' '</span><span style="color: #000066;">,</span> <span style="color: #ff0000;">''</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">+</span><span style="color: #ff0000;">'|'</span><span style="color: #000066;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">end</span><span style="color: #000066;">;</span><br />
<span style="color: #000000; font-weight: bold;">end</span><span style="color: #000066;">;</span></div></td></tr></tbody></table></div>
<p>Ao passar o olho rapidamente enxerguei a mesma coisa que ele, as condicionais não serviam para nada. Prestando um pouco mais de atenção percebemos que de acordo com a o valor do campo &#8216;PROCESSADO&#8217; a informação seria escrita num arquivo de log diferente (LogVer, LogAlte ou LogCanc).</p>
<p>A duplicação do código de escrita no log é tão gritante que oculta tudo mais que está em volta, escondendo sua intenção. Para piorar este trecho de código estava num procedimento que não tinha nada a ver com log de informações e fazia mais uma dúzia de coisas diferentes.</p>
<h2>Refatorando</h2>
<p>Apenas eliminando a duplicação a legibilidade melhorou drasticamente, e pudemos enxergar a intenção do código sem distrações. Com três refatorações simples melhoramos muito aquele trecho de código:</p>
<ul>
<li>Movemos o código duplicado para uma variável que descreve exatamente o que aquele emaranhado de cocatenação de strings significa.</li>
<li>Renomeamos as variáveis que representam nossos objetos de log para algo mais descritivo.</li>
<li>Substituímos as strings mágicas &#8216;P&#8217; e &#8216;A&#8217; por constantes que expressam o significado oculto nestas strings.</li>
</ul>
<p>Eis o resultado:</p>
<div class="codecolorer-container delphi dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:100%;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br /></div></td><td><div class="delphi codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #000000; font-weight: bold;">procedure</span> TForm1<span style="color: #000066;">.</span><span style="color: #006600;">ProcessarLog</span><span style="color: #000066;">&#40;</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">;</span><br />
<span style="color: #000000; font-weight: bold;">begin</span><br />
NovaEntrada <span style="color: #000066;">:</span><span style="color: #000066;">=</span> <span style="color: #ff0000;">'|'</span> <span style="color: #000066;">+</span> Alinhar<span style="color: #000066;">&#40;</span>DIREITA<span style="color: #000066;">,</span> <span style="color: #0000ff;">11</span><span style="color: #000066;">,</span> <span style="color: #ff0000;">'0'</span><span style="color: #000066;">,</span> cdsEventos<span style="color: #000066;">.</span><span style="color: #006600;">FieldByName</span><span style="color: #000066;">&#40;</span><span style="color: #ff0000;">'FUNCIONARIO'</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">.</span><span style="color: #006600;">AsString</span><span style="color: #000066;">&#41;</span> <span style="color: #000066;">+</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #ff0000;">'|'</span> <span style="color: #000066;">+</span> Alinhar<span style="color: #000066;">&#40;</span>DIREITA<span style="color: #000066;">,</span> &nbsp;<span style="color: #0000ff;">6</span><span style="color: #000066;">,</span> <span style="color: #ff0000;">'0'</span><span style="color: #000066;">,</span> cdsEventos<span style="color: #000066;">.</span><span style="color: #006600;">FieldByName</span><span style="color: #000066;">&#40;</span><span style="color: #ff0000;">'EVENTO'</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">.</span><span style="color: #006600;">AsString</span><span style="color: #000066;">&#41;</span> <span style="color: #000066;">+</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #ff0000;">'|'</span> <span style="color: #000066;">+</span> Alinhar<span style="color: #000066;">&#40;</span>DIREITA<span style="color: #000066;">,</span> <span style="color: #0000ff;">10</span><span style="color: #000066;">,</span> <span style="color: #ff0000;">' '</span><span style="color: #000066;">,</span> cdsEventos<span style="color: #000066;">.</span><span style="color: #006600;">FieldByName</span><span style="color: #000066;">&#40;</span><span style="color: #ff0000;">'ANO_MES'</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">.</span><span style="color: #006600;">AsString</span><span style="color: #000066;">&#41;</span> <span style="color: #000066;">+</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #ff0000;">'|'</span> <span style="color: #000066;">+</span> Alinhar<span style="color: #000066;">&#40;</span>DIREITA<span style="color: #000066;">,</span> <span style="color: #0000ff;">10</span><span style="color: #000066;">,</span> <span style="color: #ff0000;">'0'</span><span style="color: #000066;">,</span> <span style="color: #000066;">FormatFloat</span><span style="color: #000066;">&#40;</span><span style="color: #ff0000;">'#0.00'</span><span style="color: #000066;">,</span>cdsEventos<span style="color: #000066;">.</span><span style="color: #006600;">FieldByName</span><span style="color: #000066;">&#40;</span><span style="color: #ff0000;">'QUANTIDADE'</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">.</span><span style="color: #006600;">AsFloat</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">&#41;</span> <span style="color: #000066;">+</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #ff0000;">'|'</span> <span style="color: #000066;">+</span> Alinhar<span style="color: #000066;">&#40;</span>DIREITA<span style="color: #000066;">,</span> <span style="color: #0000ff;">18</span><span style="color: #000066;">,</span> <span style="color: #ff0000;">' '</span><span style="color: #000066;">,</span> <span style="color: #ff0000;">''</span><span style="color: #000066;">&#41;</span> <span style="color: #000066;">+</span> <span style="color: #ff0000;">'|'</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">;</span><br />
<br />
<span style="color: #000000; font-weight: bold;">if</span> cdsEventos<span style="color: #000066;">.</span><span style="color: #006600;">FieldByName</span><span style="color: #000066;">&#40;</span><span style="color: #ff0000;">'Processado'</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">.</span><span style="color: #006600;">AsString</span> <span style="color: #000066;">=</span> PROCESSADO <span style="color: #000000; font-weight: bold;">then</span><br />
&nbsp; &nbsp; LogProcessados<span style="color: #000066;">.</span><span style="color: #006600;">Add</span><span style="color: #000066;">&#40;</span>NovaEntrada<span style="color: #000066;">&#41;</span><br />
<span style="color: #000000; font-weight: bold;">else</span> <span style="color: #000000; font-weight: bold;">if</span> cdsEventos<span style="color: #000066;">.</span><span style="color: #006600;">FieldByName</span><span style="color: #000066;">&#40;</span><span style="color: #ff0000;">'Processado'</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">.</span><span style="color: #006600;">AsString</span> <span style="color: #000066;">=</span> ALTERADO <span style="color: #000000; font-weight: bold;">then</span><br />
&nbsp; &nbsp; LogAlterados<span style="color: #000066;">.</span><span style="color: #006600;">Add</span><span style="color: #000066;">&#40;</span>NovaEntrada<span style="color: #000066;">&#41;</span><br />
<span style="color: #000000; font-weight: bold;">else</span><br />
&nbsp; &nbsp; LogCancelados<span style="color: #000066;">.</span><span style="color: #006600;">Add</span><span style="color: #000066;">&#40;</span>NovaEntrada<span style="color: #000066;">&#41;</span><span style="color: #000066;">;</span><br />
<span style="color: #000000; font-weight: bold;">end</span><span style="color: #000066;">;</span></div></td></tr></tbody></table></div>
<p>A identação do código também foi corrigida.</p>
<p>Com isso ganhamos clareza de intenção e o próximo novato que passar por este código irá entender o que está acontecendo ali sem distrações. Refatorações posteriores melhorarão ainda sua estrutura, pois ainda temos aquela dúzia de coisas misturadas no procedimento.</p>
<h2>Mais melhorias</h2>
<p>O código de formatação da entrada de log deve ser extraído para sua própria função. Com isso temos menos um desvio mental durante a leitura, já que dificilmente estariamos interessados em saber como a linha do log está sendo formatada aqui.</p>
<p>Se um dia a formatação fosse alterada teríamos que descobrir onde este código está e encontrá-lo em &#8216;ProcRegistrosFuncionarios()&#8217;, com proximadamente 200 linhas não seria nada intuitivo.</p>
<p>Extraímos o código de formatação para sua própria função:</p>
<div class="codecolorer-container delphi dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:100%;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br /></div></td><td><div class="delphi codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #000000; font-weight: bold;">procedure</span> TForm1<span style="color: #000066;">.</span><span style="color: #006600;">ProcessarLog</span><span style="color: #000066;">&#40;</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">;</span><br />
<span style="color: #000000; font-weight: bold;">begin</span><br />
<span style="color: #000000; font-weight: bold;">if</span> cdsEventos<span style="color: #000066;">.</span><span style="color: #006600;">FieldByName</span><span style="color: #000066;">&#40;</span><span style="color: #ff0000;">'Processado'</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">.</span><span style="color: #006600;">AsString</span> <span style="color: #000066;">=</span> PROCESSADO <span style="color: #000000; font-weight: bold;">then</span><br />
&nbsp; &nbsp; LogProcessados<span style="color: #000066;">.</span><span style="color: #006600;">Add</span><span style="color: #000066;">&#40;</span>NovaEntradaLogFormatada<span style="color: #000066;">&#40;</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">&#41;</span><br />
<span style="color: #000000; font-weight: bold;">else</span> <span style="color: #000000; font-weight: bold;">if</span> cdsEventos<span style="color: #000066;">.</span><span style="color: #006600;">FieldByName</span><span style="color: #000066;">&#40;</span><span style="color: #ff0000;">'Processado'</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">.</span><span style="color: #006600;">AsString</span> <span style="color: #000066;">=</span> ALTERADO <span style="color: #000000; font-weight: bold;">then</span><br />
&nbsp; &nbsp; LogAlterados<span style="color: #000066;">.</span><span style="color: #006600;">Add</span><span style="color: #000066;">&#40;</span>NovaEntradaLogFormatada<span style="color: #000066;">&#40;</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">&#41;</span><br />
<span style="color: #000000; font-weight: bold;">else</span><br />
&nbsp; &nbsp; LogCancelados<span style="color: #000066;">.</span><span style="color: #006600;">Add</span><span style="color: #000066;">&#40;</span>NovaEntradaLogFormatada<span style="color: #000066;">&#40;</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">;</span><br />
<span style="color: #000000; font-weight: bold;">end</span><span style="color: #000066;">;</span><br />
<br />
<span style="color: #000000; font-weight: bold;">function</span> TForm1<span style="color: #000066;">.</span><span style="color: #006600;">NovaEntradaLogFormatada</span><span style="color: #000066;">&#40;</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">:</span> <span style="color: #000066; font-weight: bold;">String</span><br />
<span style="color: #000000; font-weight: bold;">begin</span><br />
&nbsp; &nbsp; Result <span style="color: #000066;">:</span><span style="color: #000066;">=</span> <span style="color: #ff0000;">'|'</span> <span style="color: #000066;">+</span> Alinhar<span style="color: #000066;">&#40;</span>DIREITA<span style="color: #000066;">,</span> <span style="color: #0000ff;">11</span><span style="color: #000066;">,</span> <span style="color: #ff0000;">'0'</span><span style="color: #000066;">,</span> cdsEventos<span style="color: #000066;">.</span><span style="color: #006600;">FieldByName</span><span style="color: #000066;">&#40;</span><span style="color: #ff0000;">'FUNCIONARIO'</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">.</span><span style="color: #006600;">AsString</span><span style="color: #000066;">&#41;</span> <span style="color: #000066;">+</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff0000;">'|'</span> <span style="color: #000066;">+</span> Alinhar<span style="color: #000066;">&#40;</span>DIREITA<span style="color: #000066;">,</span> &nbsp;<span style="color: #0000ff;">6</span><span style="color: #000066;">,</span> <span style="color: #ff0000;">'0'</span><span style="color: #000066;">,</span> cdsEventos<span style="color: #000066;">.</span><span style="color: #006600;">FieldByName</span><span style="color: #000066;">&#40;</span><span style="color: #ff0000;">'EVENTO'</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">.</span><span style="color: #006600;">AsString</span><span style="color: #000066;">&#41;</span> <span style="color: #000066;">+</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff0000;">'|'</span> <span style="color: #000066;">+</span> Alinhar<span style="color: #000066;">&#40;</span>DIREITA<span style="color: #000066;">,</span> <span style="color: #0000ff;">10</span><span style="color: #000066;">,</span> <span style="color: #ff0000;">' '</span><span style="color: #000066;">,</span> cdsEventos<span style="color: #000066;">.</span><span style="color: #006600;">FieldByName</span><span style="color: #000066;">&#40;</span><span style="color: #ff0000;">'ANO_MES'</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">.</span><span style="color: #006600;">AsString</span><span style="color: #000066;">&#41;</span> <span style="color: #000066;">+</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff0000;">'|'</span> <span style="color: #000066;">+</span> Alinhar<span style="color: #000066;">&#40;</span>DIREITA<span style="color: #000066;">,</span> <span style="color: #0000ff;">10</span><span style="color: #000066;">,</span> <span style="color: #ff0000;">'0'</span><span style="color: #000066;">,</span> <span style="color: #000066;">FormatFloat</span><span style="color: #000066;">&#40;</span><span style="color: #ff0000;">'#0.00'</span><span style="color: #000066;">,</span> cdsEventos<span style="color: #000066;">.</span><span style="color: #006600;">FieldByName</span><span style="color: #000066;">&#40;</span><span style="color: #ff0000;">'QUANTIDADE'</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">.</span><span style="color: #006600;">AsFloat</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">&#41;</span> <span style="color: #000066;">+</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff0000;">'|'</span> <span style="color: #000066;">+</span> Alinhar<span style="color: #000066;">&#40;</span>DIREITA<span style="color: #000066;">,</span> <span style="color: #0000ff;">18</span><span style="color: #000066;">,</span> <span style="color: #ff0000;">' '</span><span style="color: #000066;">,</span> <span style="color: #ff0000;">''</span><span style="color: #000066;">&#41;</span> <span style="color: #000066;">+</span> <span style="color: #ff0000;">'|'</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">;</span><br />
<span style="color: #000000; font-weight: bold;">end</span><span style="color: #000066;">;</span></div></td></tr></tbody></table></div>
<h2>Plantando uma semente</h2>
<p>O código existente influencia a maneira como os novos códigos são escritos. É como plantar uma semente, bom código irá gerar códigos cada vez melhores. Código ruim é como uma erva daninha que irá se multiplicar e acabar com seu sistema.</p>
<p>A refatoração nos deu mais clareza e disponibilizou uma função única para formatação da entrada no log. Imagina se fosse necessário incluir a opção para escrever o log em XML. Com a primeira versão do código provavelmente um programador inexperiente iria aumentar as duplicações e piorar mais o código que já estava ruim, criando uma aberração como:</p>
<div class="codecolorer-container delphi dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:100%;height:400px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br />27<br />28<br />29<br />30<br />31<br />32<br />33<br />34<br />35<br />36<br />37<br />38<br />39<br />40<br />41<br />42<br />43<br />44<br />45<br /></div></td><td><div class="delphi codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #000000; font-weight: bold;">procedure</span> TForm1<span style="color: #000066;">.</span><span style="color: #006600;">ProcessarLog</span><span style="color: #000066;">&#40;</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">;</span><br />
<span style="color: #000000; font-weight: bold;">begin</span><br />
<span style="color: #000000; font-weight: bold;">if</span> FormatoXML <span style="color: #000000; font-weight: bold;">then</span><br />
<span style="color: #000000; font-weight: bold;">begin</span><br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">if</span> CDSGrid<span style="color: #000066;">.</span><span style="color: #006600;">FieldByName</span><span style="color: #000066;">&#40;</span><span style="color: #ff0000;">'PROCESSADO'</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">.</span><span style="color: #006600;">AsString</span> <span style="color: #000066;">=</span> <span style="color: #ff0000;">'P'</span> <span style="color: #000000; font-weight: bold;">then</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; LogVer<span style="color: #000066;">.</span><span style="color: #006600;">Add</span><span style="color: #000066;">&#40;</span><span style="color: #ff0000;">'&lt;funcionario=&quot;'</span><span style="color: #000066;">+</span>Alinhar<span style="color: #000066;">&#40;</span>DIREITA<span style="color: #000066;">,</span> <span style="color: #0000ff;">11</span><span style="color: #000066;">,</span> <span style="color: #ff0000;">'0'</span><span style="color: #000066;">,</span> CDSGrid<span style="color: #000066;">.</span><span style="color: #006600;">FieldByName</span><span style="color: #000066;">&#40;</span><span style="color: #ff0000;">'FUNCIONARIO'</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">.</span><span style="color: #006600;">AsString</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">+</span><span style="color: #ff0000;">'&quot;'</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff0000;">' evento=&quot;'</span><span style="color: #000066;">+</span>Alinhar<span style="color: #000066;">&#40;</span>DIREITA<span style="color: #000066;">,</span> &nbsp;<span style="color: #0000ff;">6</span><span style="color: #000066;">,</span> <span style="color: #ff0000;">'0'</span><span style="color: #000066;">,</span> CDSGrid<span style="color: #000066;">.</span><span style="color: #006600;">FieldByName</span><span style="color: #000066;">&#40;</span><span style="color: #ff0000;">'EVENTO'</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">.</span><span style="color: #006600;">AsString</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">+</span><span style="color: #ff0000;">'&quot;'</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff0000;">' ano_mes=&quot;'</span><span style="color: #000066;">+</span>Alinhar<span style="color: #000066;">&#40;</span>DIREITA<span style="color: #000066;">,</span> <span style="color: #0000ff;">10</span><span style="color: #000066;">,</span> <span style="color: #ff0000;">' '</span><span style="color: #000066;">,</span> CDSGrid<span style="color: #000066;">.</span><span style="color: #006600;">FieldByName</span><span style="color: #000066;">&#40;</span><span style="color: #ff0000;">'ANO_MES'</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">.</span><span style="color: #006600;">AsString</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">+</span><span style="color: #ff0000;">'&quot;'</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff0000;">' quantidade=&quot;'</span><span style="color: #000066;">+</span>Alinhar<span style="color: #000066;">&#40;</span>DIREITA<span style="color: #000066;">,</span> <span style="color: #0000ff;">10</span><span style="color: #000066;">,</span> <span style="color: #ff0000;">'0'</span><span style="color: #000066;">,</span> <span style="color: #000066;">FormatFloat</span><span style="color: #000066;">&#40;</span><span style="color: #ff0000;">'#0.00'</span><span style="color: #000066;">,</span>CDSGrid<span style="color: #000066;">.</span><span style="color: #006600;">FieldByName</span><span style="color: #000066;">&#40;</span><span style="color: #ff0000;">'QUANTIDADE'</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">.</span><span style="color: #006600;">AsFloat</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">+</span><span style="color: #ff0000;">'&quot; /&gt;'</span><span style="color: #000066;">&#41;</span><br />
<span style="color: #000000; font-weight: bold;">else</span> <span style="color: #000000; font-weight: bold;">if</span> CDSGrid<span style="color: #000066;">.</span><span style="color: #006600;">FieldByName</span><span style="color: #000066;">&#40;</span><span style="color: #ff0000;">'PROCESSADO'</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">.</span><span style="color: #006600;">AsString</span> <span style="color: #000066;">=</span> <span style="color: #ff0000;">'A'</span> <span style="color: #000000; font-weight: bold;">then</span><br />
&nbsp; &nbsp; LogAlte<span style="color: #000066;">.</span><span style="color: #006600;">Add</span><span style="color: #000066;">&#40;</span><span style="color: #ff0000;">'&lt;funcionario=&quot;'</span><span style="color: #000066;">+</span>Alinhar<span style="color: #000066;">&#40;</span>DIREITA<span style="color: #000066;">,</span> <span style="color: #0000ff;">11</span><span style="color: #000066;">,</span> <span style="color: #ff0000;">'0'</span><span style="color: #000066;">,</span> CDSGrid<span style="color: #000066;">.</span><span style="color: #006600;">FieldByName</span><span style="color: #000066;">&#40;</span><span style="color: #ff0000;">'FUNCIONARIO'</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">.</span><span style="color: #006600;">AsString</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">+</span><span style="color: #ff0000;">'&quot;'</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff0000;">' evento=&quot;'</span><span style="color: #000066;">+</span>Alinhar<span style="color: #000066;">&#40;</span>DIREITA<span style="color: #000066;">,</span> &nbsp;<span style="color: #0000ff;">6</span><span style="color: #000066;">,</span> <span style="color: #ff0000;">'0'</span><span style="color: #000066;">,</span> CDSGrid<span style="color: #000066;">.</span><span style="color: #006600;">FieldByName</span><span style="color: #000066;">&#40;</span><span style="color: #ff0000;">'EVENTO'</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">.</span><span style="color: #006600;">AsString</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">+</span><span style="color: #ff0000;">'&quot;'</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff0000;">' ano_mes=&quot;'</span><span style="color: #000066;">+</span>Alinhar<span style="color: #000066;">&#40;</span>DIREITA<span style="color: #000066;">,</span> <span style="color: #0000ff;">10</span><span style="color: #000066;">,</span> <span style="color: #ff0000;">' '</span><span style="color: #000066;">,</span> CDSGrid<span style="color: #000066;">.</span><span style="color: #006600;">FieldByName</span><span style="color: #000066;">&#40;</span><span style="color: #ff0000;">'ANO_MES'</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">.</span><span style="color: #006600;">AsString</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">+</span><span style="color: #ff0000;">'&quot;'</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff0000;">' quantidade=&quot;'</span><span style="color: #000066;">+</span>Alinhar<span style="color: #000066;">&#40;</span>DIREITA<span style="color: #000066;">,</span> <span style="color: #0000ff;">10</span><span style="color: #000066;">,</span> <span style="color: #ff0000;">'0'</span><span style="color: #000066;">,</span> <span style="color: #000066;">FormatFloat</span><span style="color: #000066;">&#40;</span><span style="color: #ff0000;">'#0.00'</span><span style="color: #000066;">,</span>CDSGrid<span style="color: #000066;">.</span><span style="color: #006600;">FieldByName</span><span style="color: #000066;">&#40;</span><span style="color: #ff0000;">'QUANTIDADE'</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">.</span><span style="color: #006600;">AsFloat</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">+</span><span style="color: #ff0000;">'&quot; /&gt;'</span><span style="color: #000066;">&#41;</span><br />
<span style="color: #000000; font-weight: bold;">else</span><br />
&nbsp; &nbsp; LogCanc<span style="color: #000066;">.</span><span style="color: #006600;">Add</span><span style="color: #000066;">&#40;</span><span style="color: #ff0000;">'&lt;funcionario=&quot;'</span><span style="color: #000066;">+</span>Alinhar<span style="color: #000066;">&#40;</span>DIREITA<span style="color: #000066;">,</span> <span style="color: #0000ff;">11</span><span style="color: #000066;">,</span> <span style="color: #ff0000;">'0'</span><span style="color: #000066;">,</span> CDSGrid<span style="color: #000066;">.</span><span style="color: #006600;">FieldByName</span><span style="color: #000066;">&#40;</span><span style="color: #ff0000;">'FUNCIONARIO'</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">.</span><span style="color: #006600;">AsString</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">+</span><span style="color: #ff0000;">'&quot;'</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff0000;">' evento=&quot;'</span><span style="color: #000066;">+</span>Alinhar<span style="color: #000066;">&#40;</span>DIREITA<span style="color: #000066;">,</span> &nbsp;<span style="color: #0000ff;">6</span><span style="color: #000066;">,</span> <span style="color: #ff0000;">'0'</span><span style="color: #000066;">,</span> CDSGrid<span style="color: #000066;">.</span><span style="color: #006600;">FieldByName</span><span style="color: #000066;">&#40;</span><span style="color: #ff0000;">'EVENTO'</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">.</span><span style="color: #006600;">AsString</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">+</span><span style="color: #ff0000;">'&quot;'</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff0000;">' ano_mes=&quot;'</span><span style="color: #000066;">+</span>Alinhar<span style="color: #000066;">&#40;</span>DIREITA<span style="color: #000066;">,</span> <span style="color: #0000ff;">10</span><span style="color: #000066;">,</span> <span style="color: #ff0000;">' '</span><span style="color: #000066;">,</span> CDSGrid<span style="color: #000066;">.</span><span style="color: #006600;">FieldByName</span><span style="color: #000066;">&#40;</span><span style="color: #ff0000;">'ANO_MES'</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">.</span><span style="color: #006600;">AsString</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">+</span><span style="color: #ff0000;">'&quot;'</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff0000;">' quantidade=&quot;'</span><span style="color: #000066;">+</span>Alinhar<span style="color: #000066;">&#40;</span>DIREITA<span style="color: #000066;">,</span> <span style="color: #0000ff;">10</span><span style="color: #000066;">,</span> <span style="color: #ff0000;">'0'</span><span style="color: #000066;">,</span> <span style="color: #000066;">FormatFloat</span><span style="color: #000066;">&#40;</span><span style="color: #ff0000;">'#0.00'</span><span style="color: #000066;">,</span>CDSGrid<span style="color: #000066;">.</span><span style="color: #006600;">FieldByName</span><span style="color: #000066;">&#40;</span><span style="color: #ff0000;">'QUANTIDADE'</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">.</span><span style="color: #006600;">AsFloat</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">+</span><span style="color: #ff0000;">'&quot; /&gt;'</span><span style="color: #000066;">&#41;</span><br />
<span style="color: #000000; font-weight: bold;">end</span><br />
<span style="color: #000000; font-weight: bold;">else</span><br />
<span style="color: #000000; font-weight: bold;">begin</span><br />
<span style="color: #000000; font-weight: bold;">if</span> cdsEventos<span style="color: #000066;">.</span><span style="color: #006600;">FieldByName</span><span style="color: #000066;">&#40;</span><span style="color: #ff0000;">'PROCESSADO'</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">.</span><span style="color: #006600;">AsString</span> <span style="color: #000066;">=</span> <span style="color: #ff0000;">'P'</span> <span style="color: #000000; font-weight: bold;">then</span><br />
&nbsp; &nbsp; LogVer<span style="color: #000066;">.</span><span style="color: #006600;">Add</span><span style="color: #000066;">&#40;</span><span style="color: #ff0000;">'|'</span><span style="color: #000066;">+</span>Alinhar<span style="color: #000066;">&#40;</span>DIREITA<span style="color: #000066;">,</span> <span style="color: #0000ff;">11</span><span style="color: #000066;">,</span> <span style="color: #ff0000;">'0'</span><span style="color: #000066;">,</span> cdsEventos<span style="color: #000066;">.</span><span style="color: #006600;">FieldByName</span><span style="color: #000066;">&#40;</span><span style="color: #ff0000;">'FUNCIONARIO'</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">.</span><span style="color: #006600;">AsString</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">+</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #ff0000;">'|'</span><span style="color: #000066;">+</span>Alinhar<span style="color: #000066;">&#40;</span>DIREITA<span style="color: #000066;">,</span> &nbsp;<span style="color: #0000ff;">6</span><span style="color: #000066;">,</span> <span style="color: #ff0000;">'0'</span><span style="color: #000066;">,</span> cdsEventos<span style="color: #000066;">.</span><span style="color: #006600;">FieldByName</span><span style="color: #000066;">&#40;</span><span style="color: #ff0000;">'EVENTO'</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">.</span><span style="color: #006600;">AsString</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">+</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #ff0000;">'|'</span><span style="color: #000066;">+</span>Alinhar<span style="color: #000066;">&#40;</span>DIREITA<span style="color: #000066;">,</span> <span style="color: #0000ff;">10</span><span style="color: #000066;">,</span> <span style="color: #ff0000;">' '</span><span style="color: #000066;">,</span> cdsEventos<span style="color: #000066;">.</span><span style="color: #006600;">FieldByName</span><span style="color: #000066;">&#40;</span><span style="color: #ff0000;">'ANO_MES'</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">.</span><span style="color: #006600;">AsString</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">+</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #ff0000;">'|'</span><span style="color: #000066;">+</span>Alinhar<span style="color: #000066;">&#40;</span>DIREITA<span style="color: #000066;">,</span> <span style="color: #0000ff;">10</span><span style="color: #000066;">,</span> <span style="color: #ff0000;">'0'</span><span style="color: #000066;">,</span> <span style="color: #000066;">FormatFloat</span><span style="color: #000066;">&#40;</span><span style="color: #ff0000;">'#0.00'</span><span style="color: #000066;">,</span>cdsEventos<span style="color: #000066;">.</span><span style="color: #006600;">FieldByName</span><span style="color: #000066;">&#40;</span><span style="color: #ff0000;">'QUANTIDADE'</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">.</span><span style="color: #006600;">AsFloat</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">+</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #ff0000;">'|'</span><span style="color: #000066;">+</span>Alinhar<span style="color: #000066;">&#40;</span>DIREITA<span style="color: #000066;">,</span> <span style="color: #0000ff;">18</span><span style="color: #000066;">,</span> <span style="color: #ff0000;">' '</span><span style="color: #000066;">,</span> <span style="color: #ff0000;">''</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">+</span><span style="color: #ff0000;">'|'</span><span style="color: #000066;">&#41;</span><br />
<span style="color: #000000; font-weight: bold;">else</span><br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">if</span> cdsEventos<span style="color: #000066;">.</span><span style="color: #006600;">FieldByName</span><span style="color: #000066;">&#40;</span><span style="color: #ff0000;">'PROCESSADO'</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">.</span><span style="color: #006600;">AsString</span> <span style="color: #000066;">=</span> <span style="color: #ff0000;">'A'</span> <span style="color: #000000; font-weight: bold;">then</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; LogAlte<span style="color: #000066;">.</span><span style="color: #006600;">Add</span><span style="color: #000066;">&#40;</span><span style="color: #ff0000;">'|'</span><span style="color: #000066;">+</span>Alinhar<span style="color: #000066;">&#40;</span>DIREITA<span style="color: #000066;">,</span> <span style="color: #0000ff;">11</span><span style="color: #000066;">,</span> <span style="color: #ff0000;">'0'</span><span style="color: #000066;">,</span> cdsEventos<span style="color: #000066;">.</span><span style="color: #006600;">FieldByName</span><span style="color: #000066;">&#40;</span><span style="color: #ff0000;">'FUNCIONARIO'</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">.</span><span style="color: #006600;">AsString</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">+</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff0000;">'|'</span><span style="color: #000066;">+</span>Alinhar<span style="color: #000066;">&#40;</span>DIREITA<span style="color: #000066;">,</span> &nbsp;<span style="color: #0000ff;">6</span><span style="color: #000066;">,</span> <span style="color: #ff0000;">'0'</span><span style="color: #000066;">,</span> cdsEventos<span style="color: #000066;">.</span><span style="color: #006600;">FieldByName</span><span style="color: #000066;">&#40;</span><span style="color: #ff0000;">'EVENTO'</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">.</span><span style="color: #006600;">AsString</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">+</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff0000;">'|'</span><span style="color: #000066;">+</span>Alinhar<span style="color: #000066;">&#40;</span>DIREITA<span style="color: #000066;">,</span> <span style="color: #0000ff;">10</span><span style="color: #000066;">,</span> <span style="color: #ff0000;">' '</span><span style="color: #000066;">,</span> cdsEventos<span style="color: #000066;">.</span><span style="color: #006600;">FieldByName</span><span style="color: #000066;">&#40;</span><span style="color: #ff0000;">'ANO_MES'</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">.</span><span style="color: #006600;">AsString</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">+</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff0000;">'|'</span><span style="color: #000066;">+</span>Alinhar<span style="color: #000066;">&#40;</span>DIREITA<span style="color: #000066;">,</span> <span style="color: #0000ff;">10</span><span style="color: #000066;">,</span> <span style="color: #ff0000;">'0'</span><span style="color: #000066;">,</span> <span style="color: #000066;">FormatFloat</span><span style="color: #000066;">&#40;</span><span style="color: #ff0000;">'#0.00'</span><span style="color: #000066;">,</span>cdsEventos<span style="color: #000066;">.</span><span style="color: #006600;">FieldByName</span><span style="color: #000066;">&#40;</span><span style="color: #ff0000;">'QUANTIDADE'</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">.</span><span style="color: #006600;">AsFloat</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">+</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff0000;">'|'</span><span style="color: #000066;">+</span>Alinhar<span style="color: #000066;">&#40;</span>DIREITA<span style="color: #000066;">,</span> <span style="color: #0000ff;">18</span><span style="color: #000066;">,</span> <span style="color: #ff0000;">' '</span><span style="color: #000066;">,</span> <span style="color: #000066;">&#41;</span><span style="color: #000066;">+</span><span style="color: #ff0000;">'|'</span><span style="color: #000066;">&#41;</span><br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">else</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">begin</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; LogCanc<span style="color: #000066;">.</span><span style="color: #006600;">Add</span><span style="color: #000066;">&#40;</span><span style="color: #ff0000;">'|'</span><span style="color: #000066;">+</span>Alinhar<span style="color: #000066;">&#40;</span>DIREITA<span style="color: #000066;">,</span> <span style="color: #0000ff;">11</span><span style="color: #000066;">,</span> <span style="color: #ff0000;">'0'</span><span style="color: #000066;">,</span> cdsEventos<span style="color: #000066;">.</span><span style="color: #006600;">FieldByName</span><span style="color: #000066;">&#40;</span><span style="color: #ff0000;">'FUNCIONARIO'</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">.</span><span style="color: #006600;">AsString</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">+</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff0000;">'|'</span><span style="color: #000066;">+</span>Alinhar<span style="color: #000066;">&#40;</span>DIREITA<span style="color: #000066;">,</span> &nbsp;<span style="color: #0000ff;">6</span><span style="color: #000066;">,</span> <span style="color: #ff0000;">'0'</span><span style="color: #000066;">,</span> cdsEventos<span style="color: #000066;">.</span><span style="color: #006600;">FieldByName</span><span style="color: #000066;">&#40;</span><span style="color: #ff0000;">'EVENTO'</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">.</span><span style="color: #006600;">AsString</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">+</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff0000;">'|'</span><span style="color: #000066;">+</span>Alinhar<span style="color: #000066;">&#40;</span>DIREITA<span style="color: #000066;">,</span> <span style="color: #0000ff;">10</span><span style="color: #000066;">,</span> <span style="color: #ff0000;">' '</span><span style="color: #000066;">,</span> cdsEventos<span style="color: #000066;">.</span><span style="color: #006600;">FieldByName</span><span style="color: #000066;">&#40;</span><span style="color: #ff0000;">'ANO_MES'</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">.</span><span style="color: #006600;">AsString</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">+</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff0000;">'|'</span><span style="color: #000066;">+</span>Alinhar<span style="color: #000066;">&#40;</span>DIREITA<span style="color: #000066;">,</span> <span style="color: #0000ff;">10</span><span style="color: #000066;">,</span> <span style="color: #ff0000;">'0'</span><span style="color: #000066;">,</span> <span style="color: #000066;">FormatFloat</span><span style="color: #000066;">&#40;</span><span style="color: #ff0000;">'#0.00'</span><span style="color: #000066;">,</span>cdsEventos<span style="color: #000066;">.</span><span style="color: #006600;">FieldByName</span><span style="color: #000066;">&#40;</span><span style="color: #ff0000;">'QUANTIDADE'</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">.</span><span style="color: #006600;">AsFloat</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">+</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff0000;">'|'</span><span style="color: #000066;">+</span>Alinhar<span style="color: #000066;">&#40;</span>DIREITA<span style="color: #000066;">,</span> <span style="color: #0000ff;">18</span><span style="color: #000066;">,</span> <span style="color: #ff0000;">' '</span><span style="color: #000066;">,</span> <span style="color: #ff0000;">''</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">+</span><span style="color: #ff0000;">'|'</span><span style="color: #000066;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">end</span><span style="color: #000066;">;</span><br />
<span style="color: #000000; font-weight: bold;">end</span><span style="color: #000066;">;</span><br />
<span style="color: #000000; font-weight: bold;">end</span><span style="color: #000066;">;</span></div></td></tr></tbody></table></div>
<p>Enquanto que com nossa nova versão refatorada, com a metade de linhas o resultado da alteração seria:</p>
<div class="codecolorer-container delphi dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:100%;height:400px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br /></div></td><td><div class="delphi codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #000000; font-weight: bold;">procedure</span> TForm1<span style="color: #000066;">.</span><span style="color: #006600;">ProcessarLog</span><span style="color: #000066;">&#40;</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">;</span><br />
<span style="color: #000000; font-weight: bold;">begin</span><br />
<span style="color: #000000; font-weight: bold;">if</span> cdsEventos<span style="color: #000066;">.</span><span style="color: #006600;">FieldByName</span><span style="color: #000066;">&#40;</span><span style="color: #ff0000;">'Processado'</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">.</span><span style="color: #006600;">AsString</span> <span style="color: #000066;">=</span> PROCESSADO <span style="color: #000000; font-weight: bold;">then</span><br />
&nbsp; &nbsp; LogProcessados<span style="color: #000066;">.</span><span style="color: #006600;">Add</span><span style="color: #000066;">&#40;</span>NovaEntradaLogFormatada<span style="color: #000066;">&#40;</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">&#41;</span><br />
<span style="color: #000000; font-weight: bold;">else</span> <span style="color: #000000; font-weight: bold;">if</span> cdsEventos<span style="color: #000066;">.</span><span style="color: #006600;">FieldByName</span><span style="color: #000066;">&#40;</span><span style="color: #ff0000;">'Processado'</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">.</span><span style="color: #006600;">AsString</span> <span style="color: #000066;">=</span> ALTERADO <span style="color: #000000; font-weight: bold;">then</span><br />
&nbsp; &nbsp; LogAlterados<span style="color: #000066;">.</span><span style="color: #006600;">Add</span><span style="color: #000066;">&#40;</span>NovaEntradaLogFormatada<span style="color: #000066;">&#40;</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">&#41;</span><br />
<span style="color: #000000; font-weight: bold;">else</span><br />
&nbsp; &nbsp; LogCancelados<span style="color: #000066;">.</span><span style="color: #006600;">Add</span><span style="color: #000066;">&#40;</span>NovaEntradaLogFormatada<span style="color: #000066;">&#40;</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">;</span><br />
<span style="color: #000000; font-weight: bold;">end</span><span style="color: #000066;">;</span><br />
<br />
<span style="color: #000000; font-weight: bold;">function</span> TForm1<span style="color: #000066;">.</span><span style="color: #006600;">NovaEntradaLogFormatada</span><span style="color: #000066;">&#40;</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">:</span> <span style="color: #000066; font-weight: bold;">String</span><br />
<span style="color: #000000; font-weight: bold;">begin</span><br />
<span style="color: #000000; font-weight: bold;">if</span> FormatoXML <span style="color: #000000; font-weight: bold;">then</span><br />
&nbsp; &nbsp; Result <span style="color: #000066;">:</span><span style="color: #000066;">=</span> <span style="color: #ff0000;">'&lt;funcionario=&quot;'</span><span style="color: #000066;">+</span>Alinhar<span style="color: #000066;">&#40;</span>DIREITA<span style="color: #000066;">,</span> <span style="color: #0000ff;">11</span><span style="color: #000066;">,</span> <span style="color: #ff0000;">'0'</span><span style="color: #000066;">,</span> CDSGrid<span style="color: #000066;">.</span><span style="color: #006600;">FieldByName</span><span style="color: #000066;">&#40;</span><span style="color: #ff0000;">'FUNCIONARIO'</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">.</span><span style="color: #006600;">AsString</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">+</span><span style="color: #ff0000;">'&quot;'</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff0000;">' evento=&quot;'</span><span style="color: #000066;">+</span>Alinhar<span style="color: #000066;">&#40;</span>DIREITA<span style="color: #000066;">,</span> &nbsp;<span style="color: #0000ff;">6</span><span style="color: #000066;">,</span> <span style="color: #ff0000;">'0'</span><span style="color: #000066;">,</span> CDSGrid<span style="color: #000066;">.</span><span style="color: #006600;">FieldByName</span><span style="color: #000066;">&#40;</span><span style="color: #ff0000;">'EVENTO'</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">.</span><span style="color: #006600;">AsString</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">+</span><span style="color: #ff0000;">'&quot;'</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff0000;">' ano_mes=&quot;'</span><span style="color: #000066;">+</span>Alinhar<span style="color: #000066;">&#40;</span>DIREITA<span style="color: #000066;">,</span> <span style="color: #0000ff;">10</span><span style="color: #000066;">,</span> <span style="color: #ff0000;">' '</span><span style="color: #000066;">,</span> CDSGrid<span style="color: #000066;">.</span><span style="color: #006600;">FieldByName</span><span style="color: #000066;">&#40;</span><span style="color: #ff0000;">'ANO_MES'</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">.</span><span style="color: #006600;">AsString</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">+</span><span style="color: #ff0000;">'&quot;'</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff0000;">' quantidade=&quot;'</span><span style="color: #000066;">+</span>Alinhar<span style="color: #000066;">&#40;</span>DIREITA<span style="color: #000066;">,</span> <span style="color: #0000ff;">10</span><span style="color: #000066;">,</span> <span style="color: #ff0000;">'0'</span><span style="color: #000066;">,</span> <span style="color: #000066;">FormatFloat</span><span style="color: #000066;">&#40;</span><span style="color: #ff0000;">'#0.00'</span><span style="color: #000066;">,</span>CDSGrid<span style="color: #000066;">.</span><span style="color: #006600;">FieldByName</span><span style="color: #000066;">&#40;</span><span style="color: #ff0000;">'QUANTIDADE'</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">.</span><span style="color: #006600;">AsFloat</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">+</span><span style="color: #ff0000;">'&quot; /&gt;'</span><br />
<span style="color: #000000; font-weight: bold;">else</span><br />
&nbsp; &nbsp; Result <span style="color: #000066;">:</span><span style="color: #000066;">=</span> <span style="color: #ff0000;">'|'</span> <span style="color: #000066;">+</span> Alinhar<span style="color: #000066;">&#40;</span>DIREITA<span style="color: #000066;">,</span> <span style="color: #0000ff;">11</span><span style="color: #000066;">,</span> <span style="color: #ff0000;">'0'</span><span style="color: #000066;">,</span> cdsEventos<span style="color: #000066;">.</span><span style="color: #006600;">FieldByName</span><span style="color: #000066;">&#40;</span><span style="color: #ff0000;">'FUNCIONARIO'</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">.</span><span style="color: #006600;">AsString</span><span style="color: #000066;">&#41;</span> <span style="color: #000066;">+</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff0000;">'|'</span> <span style="color: #000066;">+</span> Alinhar<span style="color: #000066;">&#40;</span>DIREITA<span style="color: #000066;">,</span> <span style="color: #0000ff;">6</span><span style="color: #000066;">,</span> <span style="color: #ff0000;">'0'</span><span style="color: #000066;">,</span> cdsEventos<span style="color: #000066;">.</span><span style="color: #006600;">FieldByName</span><span style="color: #000066;">&#40;</span><span style="color: #ff0000;">'EVENTO'</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">.</span><span style="color: #006600;">AsString</span><span style="color: #000066;">&#41;</span> <span style="color: #000066;">+</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff0000;">'|'</span> <span style="color: #000066;">+</span> Alinhar<span style="color: #000066;">&#40;</span>DIREITA<span style="color: #000066;">,</span> <span style="color: #0000ff;">10</span><span style="color: #000066;">,</span> <span style="color: #ff0000;">' '</span><span style="color: #000066;">,</span> cdsEventos<span style="color: #000066;">.</span><span style="color: #006600;">FieldByName</span><span style="color: #000066;">&#40;</span><span style="color: #ff0000;">'ANO_MES'</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">.</span><span style="color: #006600;">AsString</span><span style="color: #000066;">&#41;</span> <span style="color: #000066;">+</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff0000;">'|'</span> <span style="color: #000066;">+</span> Alinhar<span style="color: #000066;">&#40;</span>DIREITA<span style="color: #000066;">,</span> <span style="color: #0000ff;">10</span><span style="color: #000066;">,</span> <span style="color: #ff0000;">'0'</span><span style="color: #000066;">,</span> <span style="color: #000066;">FormatFloat</span><span style="color: #000066;">&#40;</span><span style="color: #ff0000;">'#0.00'</span><span style="color: #000066;">,</span> cdsEventos<span style="color: #000066;">.</span><span style="color: #006600;">FieldByName</span><span style="color: #000066;">&#40;</span><span style="color: #ff0000;">'QUANTIDADE'</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">.</span><span style="color: #006600;">AsFloat</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">&#41;</span> <span style="color: #000066;">+</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff0000;">'|'</span> <span style="color: #000066;">+</span> Alinhar<span style="color: #000066;">&#40;</span>DIREITA<span style="color: #000066;">,</span> <span style="color: #0000ff;">18</span><span style="color: #000066;">,</span> <span style="color: #ff0000;">' '</span><span style="color: #000066;">,</span> <span style="color: #ff0000;">''</span><span style="color: #000066;">&#41;</span> <span style="color: #000066;">+</span> <span style="color: #ff0000;">'|'</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">;</span><br />
<span style="color: #000000; font-weight: bold;">end</span><span style="color: #000066;">;</span></div></td></tr></tbody></table></div>
<p>Ainda não está perfeito, mas podemos ir refatorando cada vez mais, como extrair as responsabilidades de log para outra classe, e de lá aplicar padrões de projeto como o Strategy, aumentando ainda mais a reusabilidade do código. Eu parei por aqui porque precisamos entregar logo a correção efetuada no projeto.</p>
<h2>Conclusão</h2>
<p>Código <del>legado</del> largado é difícil de entender e alterar. Sua manutenção se torna penosa para o programador e consequentemente encarece o software, já que fatores como tempo e qualidade entram em jogo.</p>
<p>Escreva seu código para que seus leitores o entenda sem precisar chamar o colega ao lado e influencie-os a dar bons passos nas alterações futuras. <strong>É sua responsabilidade como programador.</strong></p>
<p>Como disse Martin Fowler em seu livro Refactoring: Improving the Design of Existing Code:</p>
<p><strong>&#8220;Qualquer tolo consegue escrever código que um computador entenda. Somente bons programadores escrevem código que humanos possam entender.&#8221;</strong></p>
<p>Aprenda a expressar a intenção do seu código, não seja um tolo.</p>
<h4>Livros recomendados</h4>
<p><a href="http://books.google.com/books?id=dwSfGQAACAAJ&amp;dq">Clean Code: A Handbook of Agile Software Craftsmanship</a> [Robert C. Martin]<br />
<a href="http://books.google.com/books?id=1MsETFPD3I0C">Refactoring: Improving the Design of Existing Code</a> [Martin Fowler]</p>

<img src="http://feeds.feedburner.com/~r/fabianosobreira/~4/hOlJt7gwIAw" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.sobreira.eti.br/archives/322/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://blog.sobreira.eti.br/archives/322</feedburner:origLink></item>
		<item>
		<title>Desenvolvimento Orientado por Testes</title>
		<link>http://feedproxy.google.com/~r/fabianosobreira/~3/KyVFkfNFmis/301</link>
		<comments>http://blog.sobreira.eti.br/archives/301#comments</comments>
		<pubDate>Wed, 10 Feb 2010 01:10:25 +0000</pubDate>
		<dc:creator>Fabiano Sobreira</dc:creator>
				<category><![CDATA[TDD]]></category>
		<category><![CDATA[BoasPraticas]]></category>

		<guid isPermaLink="false">http://blog.sobreira.eti.br/?p=301</guid>
		<description><![CDATA[Como comentei no meu primeiro artigo aqui no Blog, durante meus estudos para a SCJP conheci muitas coisas bacanas. Foi meu primeiro contato com algumas das metodologias do Agile. Entre elas a que mais procurei praticar, mesmo enquanto criava simples códigos de aprendizagem era o Test Driven Development (TDD). A premissa do TDD é que [...]]]></description>
			<content:encoded><![CDATA[
<p>Como comentei no meu <a href="http://blog.sobreira.eti.br/archives/21">primeiro artigo</a> aqui no Blog, durante meus estudos para a SCJP conheci muitas coisas bacanas. Foi meu primeiro contato com algumas das metodologias do Agile. Entre elas a que mais procurei praticar, mesmo enquanto criava simples códigos de aprendizagem era o Test Driven Development (TDD).</p>
<p>A premissa do TDD é que o desenvolvedor deve escrever o código de testes antes de escrever o código de produção. Minha primeira reação ao ler isso era de achar maluquice: &#8220;como posso testar algo antes mesmo de existir?&#8221;. A resposta para isso encontrei pesquisando mais sobre o assunto e tudo passou a fazer muito sentido depois que entendi seus conceitos. Meu pensamento então passou a ser: &#8220;como um programador pode viver sem isso?&#8221;.</p>
<h2>As três leis básicas</h2>
<p>Para começar você deve seguir três regras básicas:</p>
<ul>
<li>Escreva um teste que falhe.</li>
<li>Não escreva mais de um teste que falhe, sendo que não compilar é falhar.</li>
<li>Escreva o código de produção necessário para passar neste teste.</li>
</ul>
<h2>Um exemplo simples</h2>
<p>Você começa a escrever um código de teste que propositalmente falhe, já que neste ponto não deverá haver nenhum código de produção. No JUnit 4 o caso de teste seria algo simples como:</p>
<div class="codecolorer-container java dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:100%;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br /></div></td><td><div class="java codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">org.junit.Test</span><span style="color: #339933;">;</span><br />
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">static</span> org.<span style="color: #006633;">junit</span>.<span style="color: #000000; font-weight: bold;">Assert</span>.<span style="color: #006633;">assertEquals</span><span style="color: #339933;">;</span><br />
<br />
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> HelloWorldTest <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; @Test<br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> aSimpleHelloTest<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; HelloWorld hello <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> HelloWorld<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; assertEquals<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Hello world!&quot;</span>, hello.<span style="color: #006633;">sayHello</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
<span style="color: #009900;">&#125;</span></div></td></tr></tbody></table></div>
<p>Execute o teste. O mesmo deverá falhar neste ponto.</p>
<p>Em seguida implemente na classe alvo o código de produção de maneira que passe no teste. Por exemplo:</p>
<div class="codecolorer-container java dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:100%;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br /></div></td><td><div class="java codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> HelloWorld <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #003399;">String</span> sayHello<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">return</span> <span style="color: #0000ff;">&quot;Hello world&quot;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
<span style="color: #009900;">&#125;</span></div></td></tr></tbody></table></div>
<p>Execute o teste novamente e faça com que o código passe no teste. Repita o processo.</p>
<p><em>&#8220;No Eclipse você pode facilmente criar uma unidade de testes indo em <strong>New : Other : Junit Test Case</strong>. Certifique-se de utilizar o JUnit 4 para seus testes. Para executá-lo bas ir em <strong>Run : Run As : JUnit Test</strong></em><em>&#8220;</em></p>
<h2>Benefícios</h2>
<p>Gosto de classificar cinco benefícios quando me perguntam sobre TDD.</p>
<h3>1. Entendimento do domínio:</h3>
<p>Escrevendo testes antes do código o desenvolvedor é levado a refletir sobre o que está sendo implementado, o que leva a uma maior clareza sobre o domínio do problema, e até mesmo a levantar fatos que poderiam passar despercebido na especificação de requisitos.</p>
<h3>2. Segurança:</h3>
<p>Os testes são um selo de garantia que tudo está funcionando corretamente. Se for necessário alterar algo no futuro, o desenvolvedor terá certeza que a alteração não quebrou nada.</p>
<h3>3. Ganho de produtividade:</h3>
<p>A codificação de um caso teste é simples e ocupa uma fração insignificante do tempo de desenvolvimento. A unidade de testes se transforma numa documentação sempre atualizada do código. Com isso em mãos o desenvolvedor fará a manutenção do código mais rápidamente.</p>
<h3>4. Melhoria na qualidade:</h3>
<p>Os testes de unidade garantem que o que foi implementado funcione sempre da maneira esperada. Muitos dos bugs que poderiam passar despercebidos em um código sem teste não passarão aqui. O desenvolvedor que reflete sobre o domínio sendo implementado cria códigos menos propensos a bugs.</p>
<h3>5. Melhoria estrutual do código:</h3>
<p>Desenvolver orientado por testes nos força a criar códigos com menor acoplamento, orientado a objetos. Os testes também são essenciais para a refatoração do código. Como eu disse outro dia no <a href="http://twitter.com/fabianosobreira">Twitter</a>: &#8220;Refatorar sem testes é como paraquedismo sem para-quedas!&#8221;</p>
<h4>Links relacionados:</h4>
<p><a href="http://www.junit.org/">http://www.junit.org/</a><br />
<a href="http://en.wikipedia.org/wiki/Test_driven_development">http://en.wikipedia.org/wiki/Test_driven_development</a><br />
<a href="http://en.wikipedia.org/wiki/Agile_software_development">http://en.wikipedia.org/wiki/Agile_software_development</a></p>
<h4>Livros relacionados</h4>
<p><a href="http://books.google.com/books?id=dwSfGQAACAAJ">Clean Code: A Handbook of Agile Software Craftsmanship</a> [Robert C. Martin]<br />
<a href="http://books.google.com/books?id=gFgnde_vwMAC">Test-driven development: by example</a> [Kent Beck]</p>

<img src="http://feeds.feedburner.com/~r/fabianosobreira/~4/KyVFkfNFmis" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.sobreira.eti.br/archives/301/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://blog.sobreira.eti.br/archives/301</feedburner:origLink></item>
		<item>
		<title>Cadê o Meu Gato? Ou, Cadê o Bug?</title>
		<link>http://feedproxy.google.com/~r/fabianosobreira/~3/5u9TfZwS37g/287</link>
		<comments>http://blog.sobreira.eti.br/archives/287#comments</comments>
		<pubDate>Fri, 29 Jan 2010 00:45:55 +0000</pubDate>
		<dc:creator>Fabiano Sobreira</dc:creator>
				<category><![CDATA[Boas Práticas]]></category>
		<category><![CDATA[BoasPraticas]]></category>
		<category><![CDATA[TDD]]></category>

		<guid isPermaLink="false">http://blog.sobreira.eti.br/?p=287</guid>
		<description><![CDATA[Faz tempo estava querendo escrever este post, mas um fato interessante me fez mudar o título e o texto. Nosso novo bichano de estimação na primeira semana desapareceu do apartamento. Minha esposa me ligou desesperada dizendo que ele havia fugido enquanto eu saia pra trabalhar. Esta idéia já estava formada na cabeça dela, e não [...]]]></description>
			<content:encoded><![CDATA[
<p><a href="http://blog.sobreira.eti.br/wp-content/uploads/2010/01/KittyBug.jpg"><img src="http://blog.sobreira.eti.br/wp-content/uploads/2010/01/KittyBug-150x150.jpg" alt="Kitty Bug" title="Kitty Bug" width="150" height="150" class="alignright size-thumbnail wp-image-378" /></a>Faz tempo estava querendo escrever este post, mas um fato interessante me fez mudar o título e o texto.</p>
<p>Nosso novo bichano de estimação na primeira semana desapareceu do apartamento. Minha esposa me ligou desesperada dizendo que ele havia fugido enquanto eu saia pra trabalhar. Esta idéia já estava formada na cabeça dela, e não adiantou eu argumentar que sempre tomo cuidado ao sair e que a gata ainda filhote sempre fica insegura quando a porta é aberta e prefere se esconder a sair.</p>
<p>Depois de procura-la por todo o prédio, casas e lotes vizinhos minha esposa resolveu desistir e colocar cartazes de &#8220;procura-se&#8221; por aí. Eu tinha certeza que ela estava em casa, mas ela teimou que já havia revirado todos os locais e nenhum sinal do bichinho.</p>
<p>Você pode rir, mas ao chegar a noite em casa não demorei mais de cinco minutos para encontrar a danadinha. Fui no local mais óbvio, onde todo gato gosta de entrar quando não estamos olhando, o guarda-roupas.</p>
<h2>Mas o que isso tem a ver com software?</h2>
<p>Este fato me levou a lembrar um erro que cometi poucas semanas antes na implementação de uma classe responsável pela manipulação dos dados de produtos no sistema.</p>
<p>Eu conhecia a classe de cor e só precisava adicionar uma nova propriedade. Basicamente um par de getter/setter. O design da classe é um pouco mais complicado que isso, e não vem ao caso, colocar uma nova propriedade implica sempre em mais algumas <del datetime="2010-01-29T22:59:53+00:00">gambiarras</del> tarefas por uma <del datetime="2010-01-29T22:59:53+00:00">má</del> decisão de design.</p>
<p>Mas eu estava confiante, já conhecia o código e estava mais preocupado em terminar outra tarefa de maior importância. Basicamente usei a clássica combinação rápida que destrói qualquer código: Ctrl+C, Ctrl+V e renomear. Agora era só voltar para a tarefa de maior importância e commitar aquele bug que eu acabara de criar.</p>
<h2>Não existe menos ou mais atenção!</h2>
<p>Ou você está prestando atenção no que está fazendo ou não. Pequenas alterações, por mais insignificantes que sejam precisam de testes. Testar apenas as partes mais complexas de um software é se submeter a perder horas procurando pela vizinhança por algo que está no seu guarda-roupas quando ocorrer um bug.</p>
<p>Leve a sério e pratique <a href="http://en.wikipedia.org/wiki/Test-driven_development">TDD</a> e <a href="http://en.wikipedia.org/wiki/Behavior_Driven_Development">BDD</a> ou você nunca vai ter certeza se seu gato fugiu ou está tirando uma soneca dentro de uma gaveta!</p>

<img src="http://feeds.feedburner.com/~r/fabianosobreira/~4/5u9TfZwS37g" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.sobreira.eti.br/archives/287/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://blog.sobreira.eti.br/archives/287</feedburner:origLink></item>
		<item>
		<title>Alterando a Rota Padrão do Squid com Iptables</title>
		<link>http://feedproxy.google.com/~r/fabianosobreira/~3/wJqkXzW6SxQ/243</link>
		<comments>http://blog.sobreira.eti.br/archives/243#comments</comments>
		<pubDate>Wed, 30 Dec 2009 01:32:27 +0000</pubDate>
		<dc:creator>Fabiano Sobreira</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Roteamento]]></category>
		<category><![CDATA[Iproute]]></category>
		<category><![CDATA[Iptables]]></category>
		<category><![CDATA[Squid]]></category>

		<guid isPermaLink="false">http://blog.sobreira.eti.br/?p=243</guid>
		<description><![CDATA[Hoje resolvi sujar as mãos um pouquinho e resolver um problema pertinente lá na empresa: fazer com que o Squid utilize uma rota alternativa a rota padrão do gateway. Temos dois links de internet conectados ao gateway e queriamos definir as rotas de acordo com o tráfego. O problema era o tráfego gerado pelo próprio [...]]]></description>
			<content:encoded><![CDATA[
<p>Hoje resolvi sujar as mãos um pouquinho e resolver um problema pertinente lá na empresa: fazer com que o <a href="http://squid-cache.org">Squid</a> utilize uma rota alternativa a rota padrão do gateway. Temos dois links de internet conectados ao gateway e queriamos definir as rotas de acordo com o tráfego. O problema era o tráfego gerado pelo próprio gateway, como o Proxy, DNS e Atualização do DNS dinâmico com ddclient.</p>
<p>Vasculhando um pouco pelo google achei uma alternativa interessante, que seria usar o módulo <a href="http://www.linuxtopia.org/Linux_Firewall_iptables/x2682.html#OWNERMATCH">owner</a> do iptables para marcar o tráfego vindo do usuário <em>proxy</em> (usamos <a href="http://debian.org">Debian</a> no gateway) para uma tabela de roteamento alternativa.<br />
<div id="attachment_281" class="wp-caption aligncenter" style="width: 310px"><a href="http://blog.sobreira.eti.br/wp-content/uploads/2009/12/gateway_diagram.png"><img src="http://blog.sobreira.eti.br/wp-content/uploads/2009/12/gateway_diagram-300x203.png" alt="Diagrama do Gateway" title="Diagrama do Gateway" width="300" height="203" class="size-medium wp-image-281" /></a><p class="wp-caption-text">Diagrama do Gateway</p></div></p>
<p>O script requer o pacote <strong>iproute2</strong> instalado, bem como o Squid já configurado.</p>
<h2>A tabela de Roteamento</h2>
<p>Nosso gateway padrão atualmente é 192.168.15.254, na subrede 192.168.15.0/24. Com a função <em>set_route()</em> é criada uma nova tabela de roteamento com identificação numérica armazenada na variável <em>$TABELA</em>.</p>
<div class="codecolorer-container bash dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:100%;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br /></div></td><td><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #7a0874; font-weight: bold;">declare</span> <span style="color: #007800;">LAN</span>=<span style="color: #ff0000;">&quot;192.168.1.0/24&quot;</span><br />
<span style="color: #7a0874; font-weight: bold;">declare</span> <span style="color: #007800;">WAN</span>=<span style="color: #ff0000;">&quot;10.0.0.0/24&quot;</span><br />
<span style="color: #7a0874; font-weight: bold;">declare</span> <span style="color: #007800;">IFLAN</span>=<span style="color: #ff0000;">&quot;eth0&quot;</span><br />
<span style="color: #7a0874; font-weight: bold;">declare</span> <span style="color: #007800;">IFWAN</span>=<span style="color: #ff0000;">&quot;eth2&quot;</span><br />
<span style="color: #7a0874; font-weight: bold;">declare</span> <span style="color: #007800;">GATEWAY</span>=<span style="color: #ff0000;">&quot;10.0.0.254&quot;</span><br />
<span style="color: #7a0874; font-weight: bold;">declare</span> <span style="color: #007800;">TABELA</span>=<span style="color: #ff0000;">&quot;100&quot;</span><br />
<br />
<span style="color: #7a0874; font-weight: bold;">declare</span> <span style="color: #007800;">IPROUTE</span>=<span style="color: #ff0000;">&quot;/sbin/ip route&quot;</span><br />
<br />
<span style="color: #666666; font-style: italic;">#Cria a tabela de roteamento alternativa com o iproute</span><br />
<span style="color: #000000; font-weight: bold;">function</span> set_route<span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #7a0874; font-weight: bold;">&#41;</span> <span style="color: #7a0874; font-weight: bold;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #007800;">$IPROUTE</span> add <span style="color: #007800;">$LAN</span> dev <span style="color: #007800;">$IFLAN</span> table <span style="color: #007800;">$TABELA</span><br />
&nbsp; &nbsp; <span style="color: #007800;">$IPROUTE</span> add <span style="color: #007800;">$WAN</span> dev <span style="color: #007800;">$IFWAN</span> table <span style="color: #007800;">$TABELA</span><br />
&nbsp; &nbsp; <span style="color: #007800;">$IPROUTE</span> add default via <span style="color: #007800;">$GATEWAY</span> dev <span style="color: #007800;">$IFWAN</span> table <span style="color: #007800;">$TABELA</span><br />
&nbsp; &nbsp; <span style="color: #007800;">$IPROUTE</span> flush cache<br />
<span style="color: #7a0874; font-weight: bold;">&#125;</span></div></td></tr></tbody></table></div>
<h2>As Regras de Roteamento</h2>
<p>A função <em>set_rule()</em> primeiro marca os pacotes oriundos do usuário proxy usando os matchers <em>MARK</em> e <em>CONMARK</em>. Em seguida é criada uma regra de roteamento para capturar os pacotes marcados e roteá-los através da nova tabela.</p>
<div class="codecolorer-container bash dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:100%;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br /></div></td><td><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #7a0874; font-weight: bold;">declare</span> <span style="color: #007800;">IPTABLES</span>=<span style="color: #ff0000;">&quot;/sbin/iptables&quot;</span><br />
<span style="color: #7a0874; font-weight: bold;">declare</span> <span style="color: #007800;">IPRULE</span>=<span style="color: #ff0000;">&quot;/sbin/ip rule&quot;</span><br />
<br />
<span style="color: #666666; font-style: italic;">#Cria as regras para o trafego que utilizara a tabela de roteamento alternativa</span><br />
<span style="color: #000000; font-weight: bold;">function</span> set_rule<span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #7a0874; font-weight: bold;">&#41;</span> <span style="color: #7a0874; font-weight: bold;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #007800;">$IPTABLES</span> <span style="color: #660033;">-t</span> mangle <span style="color: #660033;">-A</span> PREROUTING <span style="color: #660033;">-j</span> CONNMARK <span style="color: #660033;">--restore-mark</span>&nbsp; &nbsp; <br />
<br />
&nbsp; &nbsp; <span style="color: #666666; font-style: italic;">#A regra que marca o trafego gerado pelo usuario do proxy</span><br />
&nbsp; &nbsp; <span style="color: #007800;">$IPTABLES</span> <span style="color: #660033;">-t</span> mangle <span style="color: #660033;">-A</span> OUTPUT <span style="color: #660033;">-m</span> owner <span style="color: #660033;">--uid-owner</span> proxy <span style="color: #660033;">-j</span> MARK <span style="color: #660033;">--set-mark</span> <span style="color: #007800;">$TABELA</span><br />
<br />
&nbsp; &nbsp; <span style="color: #007800;">$IPTABLES</span> <span style="color: #660033;">-t</span> mangle <span style="color: #660033;">-A</span> POSTROUTING <span style="color: #660033;">-o</span> <span style="color: #007800;">$IFWAN</span> <span style="color: #660033;">-j</span> MARK <span style="color: #660033;">--set-mark</span> <span style="color: #007800;">$TABELA</span><br />
&nbsp; &nbsp; <span style="color: #007800;">$IPTABLES</span> <span style="color: #660033;">-t</span> mangle <span style="color: #660033;">-A</span> POSTROUTING <span style="color: #660033;">-j</span> CONNMARK <span style="color: #660033;">--save-mark</span><br />
<br />
&nbsp; &nbsp; <span style="color: #666666; font-style: italic;">#A regra que captura os pacotes marcados e os insere na nova tabela</span><br />
&nbsp; &nbsp; <span style="color: #007800;">$IPRULE</span> add fwmark <span style="color: #007800;">$TABELA</span> table <span style="color: #007800;">$TABELA</span><br />
<span style="color: #7a0874; font-weight: bold;">&#125;</span></div></td></tr></tbody></table></div>
<p>Você pode ampliar as regras como, por exemplo, fazer com que todo tráfego pop3 e smtp sejam roteados através da nova tabela.</p>
<div class="codecolorer-container bash dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:100%;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br /></div></td><td><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">&nbsp; &nbsp; <span style="color: #007800;">$IPTABLES</span> <span style="color: #660033;">-t</span> mangle <span style="color: #660033;">-A</span> PREROUTING <span style="color: #660033;">-p</span> TCP <span style="color: #660033;">--dport</span> smtp <span style="color: #660033;">-j</span> MARK <span style="color: #660033;">--set-mark</span> <span style="color: #007800;">$TABELA</span><br />
&nbsp; &nbsp; <span style="color: #007800;">$IPTABLES</span> <span style="color: #660033;">-t</span> mangle <span style="color: #660033;">-A</span> PREROUTING <span style="color: #660033;">-p</span> TCP <span style="color: #660033;">--dport</span> pop3 <span style="color: #660033;">-j</span> MARK <span style="color: #660033;">--set-mark</span> <span style="color: #007800;">$TABELA</span></div></td></tr></tbody></table></div>
<h2>Juntando tudo</h2>
<p>Se você já possui mais de uma tabela de roteamento configurada com o iproute basta adaptar o script conforme a sua necessidade.</p>
<div class="codecolorer-container bash dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:100%;height:400px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br />27<br />28<br />29<br />30<br />31<br />32<br />33<br />34<br />35<br />36<br />37<br />38<br />39<br />40<br />41<br />42<br />43<br />44<br />45<br />46<br />47<br />48<br />49<br />50<br />51<br />52<br />53<br />54<br />55<br />56<br />57<br />58<br />59<br />60<br />61<br />62<br />63<br />64<br />65<br />66<br />67<br />68<br />69<br />70<br />71<br />72<br />73<br />74<br />75<br />76<br />77<br />78<br />79<br />80<br />81<br />82<br />83<br />84<br />85<br />86<br />87<br />88<br />89<br /></div></td><td><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #666666; font-style: italic;">#!/bin/bash</span><br />
<span style="color: #666666; font-style: italic;"># Desctiption: Script de roteamendo avancado</span><br />
<span style="color: #666666; font-style: italic;"># Author: Fabiano Sobreira </span><br />
<br />
<span style="color: #666666; font-style: italic;">#Variaveis</span><br />
<span style="color: #7a0874; font-weight: bold;">declare</span> <span style="color: #007800;">LAN</span>=<span style="color: #ff0000;">&quot;192.168.1.0/24&quot;</span><br />
<span style="color: #7a0874; font-weight: bold;">declare</span> <span style="color: #007800;">WAN</span>=<span style="color: #ff0000;">&quot;10.0.0.0/24&quot;</span><br />
<span style="color: #7a0874; font-weight: bold;">declare</span> <span style="color: #007800;">IFLAN</span>=<span style="color: #ff0000;">&quot;eth0&quot;</span><br />
<span style="color: #7a0874; font-weight: bold;">declare</span> <span style="color: #007800;">IFWAN</span>=<span style="color: #ff0000;">&quot;eth2&quot;</span><br />
<span style="color: #7a0874; font-weight: bold;">declare</span> <span style="color: #007800;">GATEWAY</span>=<span style="color: #ff0000;">&quot;10.0.0.254&quot;</span><br />
<span style="color: #7a0874; font-weight: bold;">declare</span> <span style="color: #007800;">TABELA</span>=<span style="color: #ff0000;">&quot;100&quot;</span><br />
<br />
<span style="color: #7a0874; font-weight: bold;">declare</span> <span style="color: #007800;">IPTABLES</span>=<span style="color: #ff0000;">&quot;/sbin/iptables&quot;</span><br />
<span style="color: #7a0874; font-weight: bold;">declare</span> <span style="color: #007800;">IPROUTE</span>=<span style="color: #ff0000;">&quot;/sbin/ip route&quot;</span><br />
<span style="color: #7a0874; font-weight: bold;">declare</span> <span style="color: #007800;">IPRULE</span>=<span style="color: #ff0000;">&quot;/sbin/ip rule&quot;</span><br />
<br />
<span style="color: #666666; font-style: italic;">#Cria a tabela de roteamento alternativa com o iproute</span><br />
<span style="color: #000000; font-weight: bold;">function</span> set_route<span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #7a0874; font-weight: bold;">&#41;</span> <span style="color: #7a0874; font-weight: bold;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #007800;">$IPROUTE</span> add <span style="color: #007800;">$LAN</span> dev <span style="color: #007800;">$IFLAN</span> table <span style="color: #007800;">$TABELA</span><br />
&nbsp; &nbsp; <span style="color: #007800;">$IPROUTE</span> add <span style="color: #007800;">$WAN</span> dev <span style="color: #007800;">$IFWAN</span> table <span style="color: #007800;">$TABELA</span><br />
&nbsp; &nbsp; <span style="color: #007800;">$IPROUTE</span> add default via <span style="color: #007800;">$GATEWAY</span> dev <span style="color: #007800;">$IFWAN</span> table <span style="color: #007800;">$TABELA</span><br />
&nbsp; &nbsp; <span style="color: #007800;">$IPROUTE</span> flush cache<br />
<span style="color: #7a0874; font-weight: bold;">&#125;</span><br />
<br />
<span style="color: #000000; font-weight: bold;">function</span> unset_route<span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #7a0874; font-weight: bold;">&#41;</span> <span style="color: #7a0874; font-weight: bold;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #007800;">$IPROUTE</span> flush table <span style="color: #007800;">$TABELA</span><br />
<span style="color: #7a0874; font-weight: bold;">&#125;</span><br />
<br />
<span style="color: #666666; font-style: italic;">#Cria as regras para o trafego que utilizara a tabela de roteamento alternativa</span><br />
<span style="color: #000000; font-weight: bold;">function</span> set_rule<span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #7a0874; font-weight: bold;">&#41;</span> <span style="color: #7a0874; font-weight: bold;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #007800;">$IPTABLES</span> <span style="color: #660033;">-t</span> mangle <span style="color: #660033;">-A</span> PREROUTING <span style="color: #660033;">-j</span> CONNMARK <span style="color: #660033;">--restore-mark</span>&nbsp; &nbsp; <br />
<br />
&nbsp; &nbsp; <span style="color: #666666; font-style: italic;">#A regra que marca o trafego gerado pelo usuario do proxy</span><br />
&nbsp; &nbsp; <span style="color: #007800;">$IPTABLES</span> <span style="color: #660033;">-t</span> mangle <span style="color: #660033;">-A</span> OUTPUT <span style="color: #660033;">-m</span> owner <span style="color: #660033;">--uid-owner</span> proxy <span style="color: #660033;">-j</span> MARK <span style="color: #660033;">--set-mark</span> <span style="color: #007800;">$TABELA</span><br />
<br />
&nbsp; &nbsp; <span style="color: #666666; font-style: italic;">#Regras que marcam o trafego smtp e pop3</span><br />
&nbsp; &nbsp; <span style="color: #007800;">$IPTABLES</span> <span style="color: #660033;">-t</span> mangle <span style="color: #660033;">-A</span> PREROUTING <span style="color: #660033;">-p</span> TCP <span style="color: #660033;">--dport</span> smtp <span style="color: #660033;">-j</span> MARK <span style="color: #660033;">--set-mark</span> <span style="color: #007800;">$TABELA</span><br />
&nbsp; &nbsp; <span style="color: #007800;">$IPTABLES</span> <span style="color: #660033;">-t</span> mangle <span style="color: #660033;">-A</span> PREROUTING <span style="color: #660033;">-p</span> TCP <span style="color: #660033;">--dport</span> pop3 <span style="color: #660033;">-j</span> MARK <span style="color: #660033;">--set-mark</span> <span style="color: #007800;">$TABELA</span><br />
<br />
&nbsp; &nbsp; <span style="color: #007800;">$IPTABLES</span> <span style="color: #660033;">-t</span> mangle <span style="color: #660033;">-A</span> POSTROUTING <span style="color: #660033;">-o</span> <span style="color: #007800;">$IFWAN</span> <span style="color: #660033;">-j</span> MARK <span style="color: #660033;">--set-mark</span> <span style="color: #007800;">$TABELA</span><br />
&nbsp; &nbsp; <span style="color: #007800;">$IPTABLES</span> <span style="color: #660033;">-t</span> mangle <span style="color: #660033;">-A</span> POSTROUTING <span style="color: #660033;">-j</span> CONNMARK <span style="color: #660033;">--save-mark</span><br />
<br />
&nbsp; &nbsp; <span style="color: #666666; font-style: italic;">#A regra que captura os pacotes marcados e os insere na nova tabela</span><br />
&nbsp; &nbsp; <span style="color: #007800;">$IPRULE</span> add fwmark <span style="color: #007800;">$TABELA</span> table <span style="color: #007800;">$TABELA</span><br />
<span style="color: #7a0874; font-weight: bold;">&#125;</span><br />
<br />
<span style="color: #000000; font-weight: bold;">function</span> unset_rule<span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #7a0874; font-weight: bold;">&#41;</span> <span style="color: #7a0874; font-weight: bold;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #007800;">$IPTABLES</span> <span style="color: #660033;">-t</span> mangle <span style="color: #660033;">-D</span> PREROUTING <span style="color: #660033;">-j</span> CONNMARK <span style="color: #660033;">--restore-mark</span><br />
&nbsp; &nbsp; <span style="color: #007800;">$IPTABLES</span> <span style="color: #660033;">-t</span> mangle <span style="color: #660033;">-D</span> OUTPUT <span style="color: #660033;">-m</span> owner <span style="color: #660033;">--uid-owner</span> proxy <span style="color: #660033;">-j</span> MARK <span style="color: #660033;">--set-mark</span> <span style="color: #007800;">$TABELA</span><br />
&nbsp; &nbsp; <span style="color: #007800;">$IPTABLES</span> <span style="color: #660033;">-t</span> mangle <span style="color: #660033;">-D</span> PREROUTING <span style="color: #660033;">-p</span> TCP <span style="color: #660033;">--dport</span> smtp <span style="color: #660033;">-j</span> MARK <span style="color: #660033;">--set-mark</span> <span style="color: #007800;">$TABELA</span><br />
&nbsp; &nbsp; <span style="color: #007800;">$IPTABLES</span> <span style="color: #660033;">-t</span> mangle <span style="color: #660033;">-D</span> PREROUTING <span style="color: #660033;">-p</span> TCP <span style="color: #660033;">--dport</span> pop3 <span style="color: #660033;">-j</span> MARK <span style="color: #660033;">--set-mark</span> <span style="color: #007800;">$TABELA</span><br />
&nbsp; &nbsp; <span style="color: #007800;">$IPTABLES</span> <span style="color: #660033;">-t</span> mangle <span style="color: #660033;">-D</span> PREROUTING <span style="color: #660033;">-p</span> TCP <span style="color: #660033;">--dport</span> imap <span style="color: #660033;">-j</span> MARK <span style="color: #660033;">--set-mark</span> <span style="color: #007800;">$TABELA</span><br />
&nbsp; &nbsp; <span style="color: #007800;">$IPTABLES</span> <span style="color: #660033;">-t</span> mangle <span style="color: #660033;">-D</span> POSTROUTING <span style="color: #660033;">-o</span> <span style="color: #007800;">$IFWAN</span> <span style="color: #660033;">-j</span> MARK <span style="color: #660033;">--set-mark</span> <span style="color: #007800;">$TABELA</span><br />
&nbsp; &nbsp; <span style="color: #007800;">$IPTABLES</span> <span style="color: #660033;">-t</span> mangle <span style="color: #660033;">-D</span> POSTROUTING <span style="color: #660033;">-j</span> CONNMARK <span style="color: #660033;">--save-mark</span><br />
&nbsp; &nbsp; <span style="color: #007800;">$IPRULE</span> del fwmark <span style="color: #007800;">$TABELA</span> table <span style="color: #007800;">$TABELA</span><br />
<span style="color: #7a0874; font-weight: bold;">&#125;</span><br />
<br />
<span style="color: #000000; font-weight: bold;">function</span> do_start<span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #7a0874; font-weight: bold;">&#41;</span> <span style="color: #7a0874; font-weight: bold;">&#123;</span><br />
&nbsp; &nbsp; set_route<br />
&nbsp; &nbsp; set_rule<br />
<span style="color: #7a0874; font-weight: bold;">&#125;</span><br />
<br />
<span style="color: #000000; font-weight: bold;">function</span> do_stop<span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #7a0874; font-weight: bold;">&#41;</span> <span style="color: #7a0874; font-weight: bold;">&#123;</span><br />
&nbsp; &nbsp; unset_rule<br />
&nbsp; &nbsp; unset_route<br />
<span style="color: #7a0874; font-weight: bold;">&#125;</span><br />
<br />
<span style="color: #000000; font-weight: bold;">case</span> <span style="color: #007800;">$1</span> <span style="color: #000000; font-weight: bold;">in</span><br />
&nbsp; &nbsp; start<span style="color: #7a0874; font-weight: bold;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #7a0874; font-weight: bold;">printf</span> <span style="color: #ff0000;">&quot;%s<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span> <span style="color: #ff0000;">&quot;Iniciando o roteamento&quot;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; do_start<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #7a0874; font-weight: bold;">exit</span><br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">;;</span><br />
&nbsp; &nbsp; stop<span style="color: #7a0874; font-weight: bold;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #7a0874; font-weight: bold;">printf</span> <span style="color: #ff0000;">&quot;%s<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span> <span style="color: #ff0000;">&quot;Parando o roteamento&quot;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; do_stop<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #7a0874; font-weight: bold;">exit</span><br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">;;</span><br />
&nbsp; &nbsp; restart<span style="color: #7a0874; font-weight: bold;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #7a0874; font-weight: bold;">printf</span> <span style="color: #ff0000;">&quot;%s<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span> <span style="color: #ff0000;">&quot;Reiniciando o roteamento&quot;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; do_stop<br />
&nbsp; &nbsp; &nbsp; &nbsp; do_start<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #7a0874; font-weight: bold;">exit</span><br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">;;</span><br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">*</span><span style="color: #7a0874; font-weight: bold;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #7a0874; font-weight: bold;">printf</span> <span style="color: #ff0000;">&quot;%s<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span> <span style="color: #ff0000;">&quot;Uso: <span style="color: #007800;">${SCRIPT}</span> (start|stop|restart)&quot;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #7a0874; font-weight: bold;">exit</span><br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">;;</span><br />
<span style="color: #000000; font-weight: bold;">esac</span></div></td></tr></tbody></table></div>
<h3>Links Sobre o Assunto</h3>
<p><a href="http://lartc.org/">Linux Advanced Routing &amp; Traffic Control</a><br />
<a href="http://www.linuxtopia.org/Linux_Firewall_iptables/index.html">Linux Packet Filtering and Iptables</a></p>

<img src="http://feeds.feedburner.com/~r/fabianosobreira/~4/wJqkXzW6SxQ" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.sobreira.eti.br/archives/243/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		<feedburner:origLink>http://blog.sobreira.eti.br/archives/243</feedburner:origLink></item>
		<item>
		<title>Regex no Java. Usando Pattern e Matcher</title>
		<link>http://feedproxy.google.com/~r/fabianosobreira/~3/2mkUNk4gDIo/126</link>
		<comments>http://blog.sobreira.eti.br/archives/126#comments</comments>
		<pubDate>Fri, 11 Dec 2009 00:31:12 +0000</pubDate>
		<dc:creator>Fabiano Sobreira</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Regex]]></category>
		<category><![CDATA[Matcher]]></category>
		<category><![CDATA[Pattern]]></category>

		<guid isPermaLink="false">http://blog.sobreira.eti.br/?p=126</guid>
		<description><![CDATA[No artigo anterior demonstrei a utilização dos quantificadores regex para buscar um padrão simples de uma tag HTML. Continuarei com o exemplo demonstrando a utilização das expressões regulares na plataforma Java. Para começar crie uma classe chamada Conexao no pacote ex.regex. Esta classe encapsula um BufferedReader para leitura do stream de conexão com uma URL. [...]]]></description>
			<content:encoded><![CDATA[
<p>No artigo <a href="http://blog.sobreira.eti.br/?p=68">anterior</a> demonstrei a utilização dos quantificadores <em>regex</em> para buscar um padrão simples de uma tag HTML. Continuarei com o exemplo demonstrando a utilização das expressões regulares na plataforma Java.</p>
<p>Para começar crie uma classe chamada Conexao no pacote ex.regex. Esta classe encapsula um <a href="http://java.sun.com/javase/6/docs/api/java/io/BufferedReader.html">BufferedReader</a> para leitura do stream de conexão com uma URL.</p>
<div class="codecolorer-container java dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:100%;height:400px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br />27<br />28<br /></div></td><td><div class="java codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #000000; font-weight: bold;">package</span> <span style="color: #006699;">ex.regex</span><span style="color: #339933;">;</span><br />
<br />
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">java.io.BufferedReader</span><span style="color: #339933;">;</span><br />
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">java.io.IOException</span><span style="color: #339933;">;</span><br />
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">java.io.InputStreamReader</span><span style="color: #339933;">;</span><br />
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">java.net.URL</span><span style="color: #339933;">;</span><br />
<br />
<span style="color: #000000; font-weight: bold;">class</span> Conexao <span style="color: #009900;">&#123;</span><br />
<br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">private</span> <span style="color: #003399;">BufferedReader</span> reader<span style="color: #339933;">;</span><br />
<br />
&nbsp; &nbsp; Conexao<span style="color: #009900;">&#40;</span><span style="color: #003399;">URL</span> url<span style="color: #009900;">&#41;</span> <span style="color: #000000; font-weight: bold;">throws</span> <span style="color: #003399;">IOException</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; reader <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">BufferedReader</span><span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">InputStreamReader</span><span style="color: #009900;">&#40;</span>url.<span style="color: #006633;">openStream</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
<br />
&nbsp; &nbsp; <span style="color: #003399;">String</span> ler<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #000000; font-weight: bold;">throws</span> <span style="color: #003399;">IOException</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">return</span> reader.<span style="color: #006633;">readLine</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
<br />
&nbsp; &nbsp; <span style="color: #000066; font-weight: bold;">void</span> fechar<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #000000; font-weight: bold;">throws</span> <span style="color: #003399;">IOException</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; reader.<span style="color: #006633;">close</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
<br />
&nbsp; &nbsp; @Override<br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">protected</span> <span style="color: #000066; font-weight: bold;">void</span> finalize<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #000000; font-weight: bold;">throws</span> <span style="color: #003399;">Throwable</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; reader.<span style="color: #006633;">close</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
<span style="color: #009900;">&#125;</span></div></td></tr></tbody></table></div>
<p>Esta classe recebe no construtor um objeto <a href="http://java.sun.com/javase/6/docs/api/java/net/URL.html">URL</a> e injeta o <a href="http://java.sun.com/javase/6/docs/api/java/io/InputStreamReader.html">InputStreamReader</a> criado pelo método <em>openStream()</em> deste objeto no <a href="http://java.sun.com/javase/6/docs/api/java/io/BufferedReader.html">BufferedReader</a> para posterior leitura. Os métodos <em>ler()</em> e <em>fechar()</em> são bem sugestivos.</p>
<p>Agora é hora de criar a classe ExemploRegex no pacote ex.regex. Incialmente apenas com três membros privados. O primeiro será uma String constante que reprensenta nosso regex. O segundo um objeto <a href="http://java.sun.com/javase/6/docs/api/java/util/regex/Pattern.html">Pattern</a> e o terceiro um objeto <a href="http://java.sun.com/javase/6/docs/api/java/util/regex/Matcher.html">Matcher</a>. As classes Pattern e Matcher fazem parte do pacote <a href="http://java.sun.com/javase/6/docs/api/java/util/regex/package-summary.html">java.util.regex</a>.</p>
<div class="codecolorer-container java dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:100%;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br /></div></td><td><div class="java codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #000000; font-weight: bold;">package</span> <span style="color: #006699;">ex.regex</span><span style="color: #339933;">;</span><br />
<br />
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">java.io.IOException</span><span style="color: #339933;">;</span><br />
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">java.io.Console</span><span style="color: #339933;">;</span><br />
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">java.net.URL</span><span style="color: #339933;">;</span> &nbsp; <br />
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">java.util.regex.Matcher</span><span style="color: #339933;">;</span><br />
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">java.util.regex.Pattern</span><span style="color: #339933;">;</span><br />
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">ex.regex.Conexao</span><span style="color: #339933;">;</span><br />
<br />
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> ExemploRegex <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000000; font-weight: bold;">final</span> <span style="color: #003399;">String</span> REGEX <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;&lt;img src=['<span style="color: #000099; font-weight: bold;">\&quot;</span>]([^'<span style="color: #000099; font-weight: bold;">\&quot;</span>]+)&quot;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000000; font-weight: bold;">final</span> Pattern pattern <span style="color: #339933;">=</span> Pattern.<span style="color: #006633;">compile</span><span style="color: #009900;">&#40;</span>REGEX<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000000; font-weight: bold;">final</span> Matcher matcher <span style="color: #339933;">=</span> pattern.<span style="color: #006633;">matcher</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #009900;">&#125;</span></div></td></tr></tbody></table></div>
<p><em>&#8220;Em resumo um objeto Pattern é uma expressão regular compilada que pode ser aplicada a qualquer numero de strings, o objeto Matcher é uma instância individual desta expressão regular sendo aplicada a uma string específica.&#8221;(Mastering Regular Expressions, FRIEDL, JEFFREY E. F.)</em></p>
<p>Através do método matcher(), criamos um novo objeto Matcher. Este método é interessante, pois recebe um <a href="http://java.sun.com/javase/6/docs/api/java/lang/CharSequence.html">CharSequence</a> (String, StringBuffer, etc) como parâmetro. O objeto matcher trabalha como o motor de buscas que confronta a sequência de caracteres com nosso Pattern. A classe Matcher oferece uma rica API para buscar e retornar resultados de buscas com regex.</p>
<p>Até agora tudo o que temos é nossa regex de captura de URL de imagens e uma sequência de caracteres vazia. Implementaremos na classe ExemploRegex o método privado <em>processarURL()</em>.</p>
<div class="codecolorer-container java dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:100%;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br /></div></td><td><div class="java codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000066; font-weight: bold;">void</span> processarURL<span style="color: #009900;">&#40;</span><span style="color: #003399;">String</span> url<span style="color: #009900;">&#41;</span> <span style="color: #000000; font-weight: bold;">throws</span> <span style="color: #003399;">IOException</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #003399;">String</span> s<span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; Conexao cn <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Conexao<span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">URL</span><span style="color: #009900;">&#40;</span>url<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">while</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span>s <span style="color: #339933;">=</span> cn.<span style="color: #006633;">ler</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">!=</span> <span style="color: #000066; font-weight: bold;">null</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; matcher.<span style="color: #006633;">reset</span><span style="color: #009900;">&#40;</span>s<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">while</span> <span style="color: #009900;">&#40;</span>matcher.<span style="color: #006633;">find</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #003399;">System</span>.<span style="color: #006633;">out</span>.<span style="color: #006633;">println</span><span style="color: #009900;">&#40;</span>matcher.<span style="color: #006633;">group</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; cn.<span style="color: #006633;">fechar</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&#125;</span></div></td></tr></tbody></table></div>
<p>O método <em>processarURL()</em> cria um objeto Conexao para a URL desejada e percorre linha a linha o Reader.</p>
<p>A chamada do método <em>reset()</em> da classe Matcher descarta todas as informações de estado do nosso Matcher informando um novo CharSequence como parâmetro para reiniciarmos nossa pesquisa. O novo CharSequence é a próxima linha obtida do stream.</p>
<p>O método <em>find()</em> tenta encontrar na sequência um padrão equivalente ao Pattern usado para construir este Matcher. Quando encontrado, o primeiro grupo da expressão é impresso, através da chamada a <em>group()</em>.</p>
<h3>Capturando Grupos</h3>
<p>Em <em>regex</em>, os grupos de captura são definidos por parênteses e numerados sequencialmente da esquerda para direita, sendo que o grupo zero representa o Pattern inteiro.</p>
<p>Grupos podem causar um pouco de sobrecarga nas expressões regulares mais complexas pois criam uma <a href="http://www.regular-expressions.info/brackets.html"><em>backreference</em></a> para a expressão dentro do grupo, o que pode prejudicar o desempenho das buscas. Sempre sinalize os grupos que não deseja capturar da seguinte maneira com (?:).</p>
<p>Por exemplo: num Matcher criado por um Pattern com expressão regular <span style="color: #800000;">&#8220;(?:Guarda)-(roupas|chuva)&#8221;</span>, a chamada do método <em>group(1)</em> retornaria a palavra <em>roupas</em> ou <em>chuva</em>. Grupos marcados com <span style="color: #800000;">(?:)</span> são ignorados (não são armazenados e não criam <em>backreferences</em>).</p>
<p>Voltando a classe ExemploRegex, agora precisamos de um método main que nos permita entrar com uma URL para ser processada.</p>
<div class="codecolorer-container java dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:100%;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br /></div></td><td><div class="java codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">static</span> <span style="color: #000066; font-weight: bold;">void</span> main<span style="color: #009900;">&#40;</span><span style="color: #003399;">String</span><span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span> args<span style="color: #009900;">&#41;</span> <span style="color: #000000; font-weight: bold;">throws</span> <span style="color: #003399;">IOException</span> <span style="color: #009900;">&#123;</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; Console console <span style="color: #339933;">=</span> <span style="color: #003399;">System</span>.<span style="color: #006633;">console</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>console <span style="color: #339933;">==</span> <span style="color: #000066; font-weight: bold;">null</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #003399;">System</span>.<span style="color: #006633;">err</span>.<span style="color: #006633;">println</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;O console não pôde ser encontrado.&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #003399;">System</span>.<span style="color: #006633;">exit</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; ExemploRegex exr <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> ExemploRegex<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #003399;">String</span> url <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;&quot;</span><span style="color: #339933;">;</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">while</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span>url.<span style="color: #006633;">equalsIgnoreCase</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;sair&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; url <span style="color: #339933;">=</span> console.<span style="color: #006633;">readLine</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Entre com a URL do documento (CTRL+C ou 'sair' para terminar): &quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; exr.<span style="color: #006633;">processarURL</span><span style="color: #009900;">&#40;</span>url<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&#125;</span></div></td></tr></tbody></table></div>
<p>Verificamos o console e em seguida iniciamos uma iteração que aguarda a entrada da URL do documento para processar. Execute a classe e experimente entrar com a URL de um site como http://www.gamespot.com/pc e veja o resultado.</p>
<h3>Considerações Finais</h3>
<p>A utilização de expressões regulares combinando as classes Pattern e Matcher do pacote java.util.regex abre um novo leque para o desenvolvedor que precisa encontrar padrões numa sequência de texto com formato não padronizado.</p>
<p>Com elas pode-se encontrar padrões específicos de maneira elegante e simples. Veja quantos operadores condicionais foram necessários para encontrar o que queríamos.</p>
<p>O exemplo apresentado é bem simples e você pode expandí-lo para uso próprio.</p>
<h4>Links recomendados:</h4>
<p><a href="http://aurelio.net/er/">http://aurelio.net/er/</a><br />
<a href="http://www.regular-expressions.info/brackets.html">http://www.regular-expressions.info/brackets.html</a><br />
<a href="http://java.sun.com/javase/6/docs/api/java/util/regex/package-summary.html">http://java.sun.com/javase/6/docs/api/java/util/regex/package-summary.html</a><br />
<a href="http://java.sun.com/docs/books/tutorial/essential/regex/index.html">http://java.sun.com/docs/books/tutorial/essential/regex/index.html</a></p>
<h4>Livros Recomendados</h4>
<p><strong>Mastering Regular Expressions</strong><br />
FRIEDL, JEFFREY E. F.<br />
OREILLY &amp; ASSOC</p>
<p><strong>Real World Regular Expressions With Java 1.4</strong><br />
HABIBI, MEHRAN<br />
APRESS</p>

<img src="http://feeds.feedburner.com/~r/fabianosobreira/~4/2mkUNk4gDIo" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.sobreira.eti.br/archives/126/feed</wfw:commentRss>
		<slash:comments>5</slash:comments>
		<feedburner:origLink>http://blog.sobreira.eti.br/archives/126</feedburner:origLink></item>
		<item>
		<title>Regex: Cuidado Com os Quantificadores Gananciosos!</title>
		<link>http://feedproxy.google.com/~r/fabianosobreira/~3/w-qdB14435w/68</link>
		<comments>http://blog.sobreira.eti.br/archives/68#comments</comments>
		<pubDate>Fri, 27 Nov 2009 00:49:18 +0000</pubDate>
		<dc:creator>Fabiano Sobreira</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Regex]]></category>

		<guid isPermaLink="false">http://blog.sobreira.eti.br/?p=68</guid>
		<description><![CDATA[Para um desenvolvedor ou mesmo um adminstrador de sistemas o uso das expressões regulares é uma excelente ferramenta em diversas situações, como: Localizar sequências de texto condicionalmente; filtrar a saida de logs e comandos do sistema; fazer parsing simplificado em arquivos e sequências de texto. Não pretendo explicar o básico sobre regex aqui, pois existem [...]]]></description>
			<content:encoded><![CDATA[
<p>Para um desenvolvedor ou mesmo um adminstrador de sistemas o uso das expressões regulares é uma excelente ferramenta em diversas situações, como:</p>
<ul>
<li>Localizar sequências de texto condicionalmente;</li>
<li>filtrar a saida de logs e comandos do sistema;</li>
<li>fazer parsing simplificado em arquivos e sequências de texto.</li>
</ul>
<p>Não pretendo explicar o básico sobre <em>regex</em> aqui, pois existem <a href="http://www.regular-expressions.info/">excelentes</a> tutorias sobre o assunto na Internet, basta dar uma pesquisada no Google. Entretanto vou mostrar uma pequena armadilha que os quantificadores nos fazem cair.</p>
<h2>Buscando a URL de uma imagem numa tag HTML.</h2>
<p>Suponhamos que você esteja procurando pelo endereço de uma imagem dentro de uma tag IMG do HTML na seguinte sequência de texto:</p>
<ul>
<li><span style="color: #800000;">&lt;img src=&#8217;http://blog.sobreira.eti.br/image.jpg&#8217; alt=&#8217;Imagem&#8217;/&gt;</span></li>
</ul>
<p>Você poderia utilizar uma <em>regex</em> simples para capturar a URL, como:</p>
<ul>
<li><span style="color: #800000;">&lt;img src=&#8217;.+&#8217;</span></li>
</ul>
<p>Mas se surpreenderia ao ver o resultado:</p>
<ul>
<li><span style="color: #800000;">src=&#8217;http://blog.sobreira.eti.br/image.jpg&#8217; alt=&#8217;Imagem</span></li>
</ul>
<p>A nossa busca retornou uma sequência muito além da nossa url</p>
<h2>O que aconteceu de fato?</h2>
<p>Os quantificadores regex <span style="color: #800000;">?</span>, <span style="color: #800000;">+</span> e <span style="color: #800000;">*</span> sozinhos são chamados de quantificadores gananciosos (<em>greedy</em>), e repetem a sentença antecessora quantas vezes possível. No caso da tag, inicialmente encontramos o literal <span style="color: #800000;">src=&#8217;</span>, em seguida o motor <em>regex</em> é instruído a procurar qualquer caractere nenhuma ou muitas vezes quantas vezes possível <span style="color: #800000;">.*</span>, o que nos leva até o fim da nossa sequência de texto. O resultado até aqui seria:</p>
<ul>
<li><span style="color: #800000;">src=&#8217;http://blog.sobreira.eti.br/image.jpg&#8217; alt=&#8217;Imagem&#8217;&gt;</span></li>
</ul>
<p>Mas ainda falta um token, a aspas de fechamento. A busca seria considerada como falha neste ponto, porém o motor <em>regex</em> a partir de agora volta procurando por nossa aspas de fechamento. No primeiro passo ele encontra o sinal &gt; e o descarta, no segundo ele encontra uma aspas e dá a busca como bem sucedida com o seguinte resultado:</p>
<ul>
<li><span style="color: #800000;">src=&#8217;http://blog.sobreira.eti.br/image.jpg&#8217; alt=&#8217;Imagem</span></li>
</ul>
<p>Um pouco diferente do que imaginamos a princípio.</p>
<h2>Como resolver este problema?</h2>
<p>A resposta para este problema é a utilização dos quantificadores relutantes (<em>lazy</em>). Estes basicamente são a representação do operados ganancioso junto de uma interrogação: <span style="color: #800000;">??</span>, <span style="color: #800000;">?+</span> e <span style="color: #800000;">?*</span>. Diferente dos quantificadores gananciosos, os operadores relutantes repetem a pesquisa o mínimo de vezes possível, no mínimo uma vez. Primeiro encontra o h, em seguida verifica se o próximo caractere é &#8216;. O que falha, pois o caractere seguinte é t. O motor então continua expandindo a busca por &#8216; enquanto a pesquisa falhar.</p>
<p>Então o resultado para:</p>
<ul>
<li><span style="color: #800000;">&lt;img src=&#8217;.+?&#8217;</span></li>
</ul>
<p>é:</p>
<ul>
<li><span style="color: #800000;">&lt;img src=&#8217;http://blog.sobreira.eti.br/image.jpg</span></li>
</ul>
<p>Bem próximo do que desejamos.</p>
<h2>Não exagere no uso dos operadoes relutantes!</h2>
<p>Os operadores relutantes têm baixo desempenho pois ficam indo e voltando (<em>backtracking</em>) a cada iteração. &#8220;Não encontrei aspas, então volto e verifico se o próximo caractere é um símbolo qualquer&#8221;. É como dar um passo pra frente, um passo pra trás e dois passos pra frente. Uma solução simples e comumente utilizada nestes casos é utilizar a negação junto com o quantificado ganancioso. Por exemplo:</p>
<ul>
<li><span style="color: #800000;">&lt;img src=&#8217;[^']+</span></li>
</ul>
<p>Isto permite o motor seguir em frente enquanto o segundo caractere de apas não é encontrado. Quando encontrado a busca termina sem retornos. A operação falha retornando nossa URL completa. Este tipo de busca oferece excelente desempenho. Mais informações <a href="http://blog.stevenlevithan.com/archives/greedy-lazy-performance">aqui</a>.</p>
<h2>Utilizando grupos.</h2>
<p>Para isolar as partes da expressão encontradas por nossa expressão regular, podemos utilizar grupos de captura, identificados pelo delimitador <span style="color: #800000;">()</span>.</p>
<ul>
<li><span style="color: #800000;">&lt;img src=&#8217;([^.*]+)</span></li>
</ul>
<p>A expressão regular anterior isola nossa url num grupo. Em Java os grupos são acessados pelo método <em>group() </em>da classe Matcher (pacote <em>java.util.regex</em>). Os grupos são numerados da esquerda para direita, sendo 0 (zero) a sentença como o todo. Na nossa <em>regex</em> anterior <em>group(1)</em> retornaria a URL integralmente.</p>
<p>No próximo artigo mostrarei como fazer buscas <em>regex</em> em sequência de caracteres (CharSequence) no Java com as classes <strong>Pattern</strong> e <strong>Matcher</strong> do pacote <strong>java.util.regex</strong>. Até lá!</p>
<h4>Operadores utilizados nos exemplos:</h4>
<ul>
<li>Repete o item anterior zero ou muitas vezes (possessivo): <span style="color: #800000;">*</span></li>
<li>Repete o ítem anterior uma ou muitas vezes (possessivo): <span style="color: #800000;">+</span></li>
<li>Marca o ítem anterior como opcional (possessivo): <span style="color: #800000;">?</span></li>
<li>Repete o item anterior zero ou muitas vezes (relutante): <span style="color: #800000;">*?</span></li>
<li>Repete o ítem anterior uma ou muitas vezes (relutante): <span style="color: #800000;">+?</span></li>
<li>Nega os caracteres dentro da classe: <span style="color: #800000;">[^]</span></li>
</ul>
<h4>Referência:</h4>
<p><a href="http://www.regular-expressions.info/">http://www.regular-expressions.info/</a><br />
<a href="http://java.sun.com/javase/6/docs/api/java/util/regex/package-summary.html">http://java.sun.com/javase/6/docs/api/java/util/regex/package-summary.html</a></p>

<img src="http://feeds.feedburner.com/~r/fabianosobreira/~4/w-qdB14435w" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.sobreira.eti.br/archives/68/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://blog.sobreira.eti.br/archives/68</feedburner:origLink></item>
		<item>
		<title>SCJP, Eu passei!</title>
		<link>http://feedproxy.google.com/~r/fabianosobreira/~3/vr5NLuYAmI8/21</link>
		<comments>http://blog.sobreira.eti.br/archives/21#comments</comments>
		<pubDate>Sat, 26 Sep 2009 02:32:07 +0000</pubDate>
		<dc:creator>Fabiano Sobreira</dc:creator>
				<category><![CDATA[Pessoal]]></category>
		<category><![CDATA[Certificacao]]></category>
		<category><![CDATA[Scjp]]></category>

		<guid isPermaLink="false">http://blog.sobreira.eti.br/?p=21</guid>
		<description><![CDATA[Hoje conquistei a minha certificação SCJP6. O Score foi 85%, eu pretendia conseguir no mínimo 90% das questões mas não foi dessa vez. Segue o Score detalhado: Declarations, Initialization and Scoping: 100% Flow Control: 81% API Contents: 71% Concurrency: 100% OO Concepts: 70% Collections  Generics: 100% Fundamentals: 77% Obviamente me preocupei tanto com as temerosas [...]]]></description>
			<content:encoded><![CDATA[
<p>Hoje conquistei a minha certificação SCJP6. O Score foi 85%, eu pretendia conseguir no mínimo 90% das questões mas não foi dessa vez. Segue o Score detalhado:</p>
<ul>
<li>Declarations, Initialization and Scoping: 100%</li>
<li>Flow Control: 81%</li>
<li>API Contents: 71%</li>
<li>Concurrency: 100%</li>
<li>OO Concepts: 70%</li>
<li>Collections  Generics: 100%</li>
<li>Fundamentals: 77%</li>
</ul>
<p>Obviamente me preocupei tanto com as temerosas <em>threads</em> e os mínimos detalhes sobre conjuntos e genéricos, que relaxei nos outros tópicos.</p>
<p>Já vi várias pessoas criticando estas certificações, talvez porque ainda exista a cultura de que o profissional certificado tem mais valor que o não-certificado em algumas empresas. Eu não concordo de maneira alguma com isso. Bons profissionais são bons profissionais. Profissionais certificados, são apenas profissionais certificados. Certificações provam que você foi capaz de aprender um assunto.</p>
<p>Uma certificação de software é uma boa meta de estudo. Eu sempre quis aprender Java e seus fundamentos de forma sólida, e que o resto fosse apenas usar API&#8217;s, independente de IDE&#8217;s. A SCJP me obrigou a não sair do foco, aprender os fundamentos e não cometer erros estúpidos no uso da linguagem. Além disso pude trocar informações com outros profissionais, o que me levou a estudar não só o Java, mas os fundamentos da orientação a objetos, aplicação de padrões de projeto e técnicas de melhoria de código.</p>

<img src="http://feeds.feedburner.com/~r/fabianosobreira/~4/vr5NLuYAmI8" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.sobreira.eti.br/archives/21/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://blog.sobreira.eti.br/archives/21</feedburner:origLink></item>
	</channel>
</rss>
