<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	xmlns:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>Flávio Brasil Blog - novo endereço: fwbrasil.net</title>
	<atom:link href="http://flaviowbrasil.wordpress.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://flaviowbrasil.wordpress.com</link>
	<description>Novo endereço: fwbrasil.net</description>
	<lastBuildDate>Thu, 25 Feb 2010 17:37:46 +0000</lastBuildDate>
	<language>pt-br</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.com/</generator>
<cloud domain='flaviowbrasil.wordpress.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://s2.wp.com/i/buttonw-com.png</url>
		<title>Flávio Brasil Blog - novo endereço: fwbrasil.net</title>
		<link>http://flaviowbrasil.wordpress.com</link>
	</image>
	<atom:link rel="search" type="application/opensearchdescription+xml" href="http://flaviowbrasil.wordpress.com/osd.xml" title="Flávio Brasil Blog - novo endereço: fwbrasil.net" />
	<atom:link rel='hub' href='http://flaviowbrasil.wordpress.com/?pushpress=hub'/>
		<item>
		<title>Novo endereço</title>
		<link>http://flaviowbrasil.wordpress.com/2010/02/25/novo-endereco/</link>
		<comments>http://flaviowbrasil.wordpress.com/2010/02/25/novo-endereco/#comments</comments>
		<pubDate>Thu, 25 Feb 2010 17:36:49 +0000</pubDate>
		<dc:creator>Flávio Brasil</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://flaviowbrasil.wordpress.com/?p=176</guid>
		<description><![CDATA[Este blog foi movido para http://fwbrasil.net.
RSS http://fwbrasil.net/blog/?feed=rss2.<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=flaviowbrasil.wordpress.com&amp;blog=10287940&amp;post=176&amp;subd=flaviowbrasil&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<h1><strong>Este blog foi movido para <a href="http://fwbrasil.net" target="_self">http://fwbrasil.net</a></strong></h1>
<h1><strong><br />
RSS <a href="//fwbrasil.net/blog/?feed=rss2" target="_self">http://fwbrasil.net/blog/?feed=rss2</a></strong></h1>
<p><strong><br />
</strong></p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/flaviowbrasil.wordpress.com/176/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/flaviowbrasil.wordpress.com/176/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/flaviowbrasil.wordpress.com/176/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/flaviowbrasil.wordpress.com/176/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/flaviowbrasil.wordpress.com/176/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/flaviowbrasil.wordpress.com/176/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/flaviowbrasil.wordpress.com/176/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/flaviowbrasil.wordpress.com/176/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/flaviowbrasil.wordpress.com/176/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/flaviowbrasil.wordpress.com/176/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/flaviowbrasil.wordpress.com/176/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/flaviowbrasil.wordpress.com/176/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/flaviowbrasil.wordpress.com/176/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/flaviowbrasil.wordpress.com/176/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=flaviowbrasil.wordpress.com&amp;blog=10287940&amp;post=176&amp;subd=flaviowbrasil&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://flaviowbrasil.wordpress.com/2010/02/25/novo-endereco/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/3a2dbcd6a4b28903a6a39a5a9c00f0bb?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Flávio Brasil</media:title>
		</media:content>
	</item>
		<item>
		<title>Digital, Demasiado Humano?</title>
		<link>http://flaviowbrasil.wordpress.com/2010/02/22/digital-demasiado-humano/</link>
		<comments>http://flaviowbrasil.wordpress.com/2010/02/22/digital-demasiado-humano/#comments</comments>
		<pubDate>Mon, 22 Feb 2010 13:04:30 +0000</pubDate>
		<dc:creator>Flávio Brasil</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Avida]]></category>
		<category><![CDATA[Darwin]]></category>
		<category><![CDATA[digital]]></category>
		<category><![CDATA[evolução]]></category>
		<category><![CDATA[inteligência artificial]]></category>
		<category><![CDATA[Nietzche]]></category>
		<category><![CDATA[vida]]></category>

		<guid isPermaLink="false">http://flaviowbrasil.wordpress.com/?p=159</guid>
		<description><![CDATA[Li no blog Meio Bit um post muito interessante do biólogo Atila Iamarino, intitulado &#8220;Vida Digital e Evolução&#8221;. Ele apresenta um histórico a respeito de softwares que procuram criar &#8220;seres digitais&#8221; para estudar teorias a respeito de evolução. Basicamente, os softwares colocam seres com comportamento (código) aleatório em ambientes simulados com elementos propícios à evolução. Através dos [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=flaviowbrasil.wordpress.com&amp;blog=10287940&amp;post=159&amp;subd=flaviowbrasil&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Li no blog <a href="http://www.meiobit.com" target="_blank">Meio Bit</a> um post muito interessante do biólogo <a href="http://scienceblogs.com.br/rainha/">Atila Iamarino</a>, intitulado <a href="http://www.meiobit.com/meio-bit/ciencia/vida-digital-e-evolucao" target="_blank">&#8220;Vida Digital e Evolução&#8221;</a>. Ele apresenta um histórico a respeito de softwares que procuram criar &#8220;seres digitais&#8221; para estudar teorias a respeito de evolução.</p>
<p style="text-align:justify;">Basicamente, os softwares colocam seres com comportamento (código) aleatório em ambientes simulados com elementos propícios à evolução. Através dos três fatores: reprodução, variação e competição, definidos por Darwin como as condições para evolução da vida, os seres mais evoluídos prevalecem no ambiente. Até mesmo seres como parasitas ou então com capacidades de imunidade a outros seres surgem!</p>
<p style="text-align:justify;">O software citado como mais novo nesta área, o <a href="http://avida.devosoft.org/" target="_blank">Avida</a>, tem uma característica interessante.  Ele direciona a evolução de forma que os seres capazes de realizar operações aritméticas sejam melhor sucedidos.</p>
<p style="text-align:justify;">Imaginando todo o potencial de processamento que possuímos hoje em dia, com o qual podemos forçar a evolução desses seres em ritmo acelerado, fico pensando se este não seria o caminho para termos uma inteligência artificial mais próxima à humana. Me parece que seria possível criar seres com um certo nível do indeterminismo dos seres humanos.</p>
<p style="text-align:justify;">Creio que a criação desta inteligência dependeria fortemente do quanto seríamos capazes de fornecer aleatoriedade para que os seres sofram mutações (variação), e da criação de um ambiente que direcione a reprodução e competição para o sucesso de seres com as características que desejamos. Esse ambiente seria como um laboratório para o ambiente real, que poderia ser a interação com seres humanos, por exemplo.</p>
<p style="text-align:justify;">Em &#8220;Sobre verdade e mentira no sentido extra-moral&#8221;, Nietizche escreveu:</p>
<blockquote style="text-align:justify;"><p>São somente os homens demasiado ingênuos que podem acreditar que a natureza do homem possa ser transformada em uma natureza puramente lógica; mas se houver graus de aproximação desse alvo, o que não haveria de se perder nesse caminho! Mesmo o homem mais racional precisa outra vez, de tempo em tempo, da natureza, isto é, de sua <em>postura ilógica diante de todas as coisas.</em></p></blockquote>
<p style="text-align:justify;"><em><span style="font-style:normal;">Aqui ele destaca a natureza não determinística do homem (postura ilógica)<em><span style="font-style:normal;"> como algo que não pode ser representado somente através de lógica. <em><span style="font-style:normal;"><em><span style="font-style:normal;">Concordo com ele e acredito que dificilmente estes seres digitais poderiam representar a verdadeira natureza do ser humano. Por outro lado, creio que para aplicações específicas, seres criados em ambientes direcionados podem adquirir um certo nível de humanidade. </span></em></span></em></span></em></span></em></p>
<p style="text-align:justify;"><em><span style="font-style:normal;"><em><span style="font-style:normal;"><em><span style="font-style:normal;"><em><span style="font-style:normal;">De qualquer forma, como Nietzche alerta, não devemos nos perder achando que um dia o &#8220;Humano, Demasiado Humano&#8221; pode ou deveria também ser &#8220;Digital, Demasiado Humano&#8221;. Deixemos o que somos, para nós.</span></em></span></em></span></em></span></em></p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/flaviowbrasil.wordpress.com/159/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/flaviowbrasil.wordpress.com/159/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/flaviowbrasil.wordpress.com/159/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/flaviowbrasil.wordpress.com/159/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/flaviowbrasil.wordpress.com/159/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/flaviowbrasil.wordpress.com/159/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/flaviowbrasil.wordpress.com/159/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/flaviowbrasil.wordpress.com/159/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/flaviowbrasil.wordpress.com/159/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/flaviowbrasil.wordpress.com/159/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/flaviowbrasil.wordpress.com/159/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/flaviowbrasil.wordpress.com/159/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/flaviowbrasil.wordpress.com/159/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/flaviowbrasil.wordpress.com/159/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=flaviowbrasil.wordpress.com&amp;blog=10287940&amp;post=159&amp;subd=flaviowbrasil&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://flaviowbrasil.wordpress.com/2010/02/22/digital-demasiado-humano/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/3a2dbcd6a4b28903a6a39a5a9c00f0bb?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Flávio Brasil</media:title>
		</media:content>
	</item>
		<item>
		<title>Merge das VMs JRockit e HotSpot</title>
		<link>http://flaviowbrasil.wordpress.com/2010/02/19/merge-das-vms-jrockit-e-hotspot/</link>
		<comments>http://flaviowbrasil.wordpress.com/2010/02/19/merge-das-vms-jrockit-e-hotspot/#comments</comments>
		<pubDate>Fri, 19 Feb 2010 20:11:46 +0000</pubDate>
		<dc:creator>Flávio Brasil</dc:creator>
				<category><![CDATA[Desenvolvimento java]]></category>
		<category><![CDATA[hotspot]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[jrockit]]></category>
		<category><![CDATA[merge]]></category>
		<category><![CDATA[openjdk]]></category>
		<category><![CDATA[oracle]]></category>
		<category><![CDATA[vm]]></category>

		<guid isPermaLink="false">http://flaviowbrasil.wordpress.com/?p=153</guid>
		<description><![CDATA[Oracle anuncia que irá realizar um merge entre as VMs JRockit e HotSpot.<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=flaviowbrasil.wordpress.com&amp;blog=10287940&amp;post=153&amp;subd=flaviowbrasil&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>A Oracle <a href="http://www.itworldcanada.com/news/oracle-will-merge-java-virtual-machines/140014">anunciou </a>que irá realizar um merge entre as VMs java das empresas BEA e Sun que comprou, respectivamente JRockit e HotSpot.<br />
Parece uma notícia boa porque irá unir o melhor das duas. Entre as boas características, destacam-se o ótimo Garbage Collector da JRockit e a performance, principalmente no modo server, da HotSpot.</p>
<p>Fiquei em dúvida em como ficará o OpenJDK diante desse anúncio. O merge será nesse projeto? Medo&#8230;</p>
<p>O anúncio diz que a nova VM deve sair em um ano e meio ou dois.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/flaviowbrasil.wordpress.com/153/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/flaviowbrasil.wordpress.com/153/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/flaviowbrasil.wordpress.com/153/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/flaviowbrasil.wordpress.com/153/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/flaviowbrasil.wordpress.com/153/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/flaviowbrasil.wordpress.com/153/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/flaviowbrasil.wordpress.com/153/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/flaviowbrasil.wordpress.com/153/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/flaviowbrasil.wordpress.com/153/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/flaviowbrasil.wordpress.com/153/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/flaviowbrasil.wordpress.com/153/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/flaviowbrasil.wordpress.com/153/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/flaviowbrasil.wordpress.com/153/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/flaviowbrasil.wordpress.com/153/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=flaviowbrasil.wordpress.com&amp;blog=10287940&amp;post=153&amp;subd=flaviowbrasil&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://flaviowbrasil.wordpress.com/2010/02/19/merge-das-vms-jrockit-e-hotspot/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/3a2dbcd6a4b28903a6a39a5a9c00f0bb?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Flávio Brasil</media:title>
		</media:content>
	</item>
		<item>
		<title>A mágica do Lombok</title>
		<link>http://flaviowbrasil.wordpress.com/2009/12/14/projeto-lombok/</link>
		<comments>http://flaviowbrasil.wordpress.com/2009/12/14/projeto-lombok/#comments</comments>
		<pubDate>Mon, 14 Dec 2009 12:31:22 +0000</pubDate>
		<dc:creator>Flávio Brasil</dc:creator>
				<category><![CDATA[Desenvolvimento java]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[lombok]]></category>

		<guid isPermaLink="false">http://flaviowbrasil.wordpress.com/?p=115</guid>
		<description><![CDATA[Recentemente conheci o projeto Lombok através do Agnaldo. Fiquei impressionado com a mágica apresentada no screencast e confesso que estava meio cético de que aquilo realmente seria possível. Basicamente, através de anotações o Lombok é capaz de gerar automaticamente código na classe compilada e mantendo o código original limpo. Por exemplo, dada a classe: import [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=flaviowbrasil.wordpress.com&amp;blog=10287940&amp;post=115&amp;subd=flaviowbrasil&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Recentemente conheci o projeto <a href="projectlombok.org" target="_blank">Lombok</a> através do <a href="http://softsimples.com.br/" target="_blank">Agnaldo</a>. Fiquei impressionado com a mágica apresentada no screencast e confesso que estava meio cético de que aquilo realmente seria possível.</p>
<p>Basicamente, através de anotações o Lombok é capaz de gerar automaticamente código na classe compilada e mantendo o código original limpo.<br />
Por exemplo, dada a classe:</p>
<pre class="brush: java; collapse: false;">

import lombok.Data;

@Data
public class Bean {
	private String string;
}
</pre>
<p>Através da annotação @Data, o Lombok gera os métodos:</p>
<p>1. Get e Set para variável de instância string;<br />
2. O método toString;<br />
3. O método equals;<br />
4. O construtor público sem parâmetros.</p>
<p>O seu código original se mantém limpo, sem o overhead de código que diminui a legibilidade.</p>
<p>Baixei os fontes do projeto para entender como a mágica é feita e vi que existem duas abordagens:</p>
<p>1. Através da API de processamento de anotações do Java 6 e de várias dependências de classes do compilador da Sun, ele manipula o código em tempo de compilação;<br />
2. Através do plugin do eclipse distribuído pelo projeto, é utilizado o componente JDT, que é responsável por realizar a compilação incremental do Eclipse, para manipular o código também em tempo de compilação.</p>
<p>No código fonte que baixei não encontrei a integração com o Netbeans, porém creio que deva seguir a mesma abordagem utilizada para o Eclipse.</p>
<p>Este mecanismo para manipular o código abre um leque de possibilidades, principalmente para reduzir o overhead de código necessário pela tipagem estática do java.<br />
Estou pesquisando a possibilidade de utilizar este mecanismo para gerar métodos estáticos nas classes de entidade como &#8220;todos&#8221;, &#8220;findByXAndY&#8221;, etc&#8230;</p>
<div id="_mcePaste" style="overflow:hidden;position:absolute;left:-10000px;top:43px;width:1px;height:1px;">import lombok.Data;<br />
import lombok.NonNull;</p>
<p>@Data<br />
public class Bean {<br />
private String classSpec;<br />
private String methodName;<br />
private String methodDescriptor;<br />
}</p>
</div>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/flaviowbrasil.wordpress.com/115/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/flaviowbrasil.wordpress.com/115/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/flaviowbrasil.wordpress.com/115/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/flaviowbrasil.wordpress.com/115/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/flaviowbrasil.wordpress.com/115/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/flaviowbrasil.wordpress.com/115/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/flaviowbrasil.wordpress.com/115/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/flaviowbrasil.wordpress.com/115/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/flaviowbrasil.wordpress.com/115/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/flaviowbrasil.wordpress.com/115/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/flaviowbrasil.wordpress.com/115/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/flaviowbrasil.wordpress.com/115/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/flaviowbrasil.wordpress.com/115/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/flaviowbrasil.wordpress.com/115/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=flaviowbrasil.wordpress.com&amp;blog=10287940&amp;post=115&amp;subd=flaviowbrasil&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://flaviowbrasil.wordpress.com/2009/12/14/projeto-lombok/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/3a2dbcd6a4b28903a6a39a5a9c00f0bb?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Flávio Brasil</media:title>
		</media:content>
	</item>
		<item>
		<title>Clusures no Java 7?</title>
		<link>http://flaviowbrasil.wordpress.com/2009/11/24/clusures-no-java-7/</link>
		<comments>http://flaviowbrasil.wordpress.com/2009/11/24/clusures-no-java-7/#comments</comments>
		<pubDate>Tue, 24 Nov 2009 15:53:07 +0000</pubDate>
		<dc:creator>Flávio Brasil</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://flaviowbrasil.wordpress.com/?p=108</guid>
		<description><![CDATA[Estão surgindo rumores de que o Java 7 irá incluir closures. Mark Reinhold, engenheiro-chefe da Sun que trabalha no OpenJDK, anunciou na conferência de java Devoxx, na Bélgica, que a Sun pretende implementar closures no Java 7! Os engenheiros chegaram à conclusão que sem closures a implementação do Fork Join framework seria muito complexa e [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=flaviowbrasil.wordpress.com&amp;blog=10287940&amp;post=108&amp;subd=flaviowbrasil&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Estão surgindo rumores de que o Java 7 irá incluir closures. <a href="http://blogs.sun.com/mr/" target="_blank">Mark Reinhold</a>, engenheiro-chefe da Sun que trabalha no OpenJDK, anunciou na conferência de java <a href="http://devoxx.com/" target="_blank">Devoxx</a>, na Bélgica, que a Sun pretende implementar closures no Java 7!</p>
<p>Os engenheiros chegaram à conclusão que sem closures a implementação do <a href="http://gee.cs.oswego.edu/dl/jsr166/dist/jsr166ydocs/">Fork Join framework</a> seria muito complexa e ficaria muito deselegante para o OpenJDK.</p>
<p>Stephen Colebourne postou em seu <a href="http://www.jroller.com/scolebourne/entry/closures_in_jdk_7" target="_blank">blog</a> com mais detalhes como foi esta apresentação.</p>
<p>A sintaxe apresentada foi a seguinte:</p>
<pre class="brush: java;">
  // function expressions
  #(int i, String s) {
    System.println.out(s);
    return i + s.length();
  }

  // function expressions
  #(int i, String s) (i + s.length())

  // function types
  #int(int, String)
</pre>
<p>Esta proposta de closures não é baseada nas propostas anteriormente apresentadas: <a href="http://www.javac.info/closures-v05.html" target="_blank">BGGA</a>, <a href="http://docs.google.com/Doc.aspx?id=k73_1ggr36h" target="_blank">CICE</a> e <a href="http://www.jroller.com/scolebourne/entry/first_class_methods_java_style" target="_blank">FCM</a>.  BGGA é a proposta mais completa e a CICE mais simples, ficando a FCM &#8220;no meio&#8221; das duas.</p>
<p>A sintaxe apresentada é parecida com a FCM, porém a implementação é mais limitada porque não será possível declarar as exeções lançadas pela closure (control-invocation) e não terá retorno não local, não sendo possível a closure dar um &#8220;return&#8221; no contexto do método em que ela está sendo utilizada (non-local return).</p>
<p>Estou torcendo para que realmente a Sun coloque closures no Java 7. Sem dúvida essa é uma grande deficiência e pode dar um novo fôlego para a linguagem.</p>
<p>Detalhe: Parece que o Java 7 está previsto somente para o final de 2010! <img src='http://s0.wp.com/wp-includes/images/smilies/icon_sad.gif' alt=':(' class='wp-smiley' /> </p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/flaviowbrasil.wordpress.com/108/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/flaviowbrasil.wordpress.com/108/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/flaviowbrasil.wordpress.com/108/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/flaviowbrasil.wordpress.com/108/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/flaviowbrasil.wordpress.com/108/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/flaviowbrasil.wordpress.com/108/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/flaviowbrasil.wordpress.com/108/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/flaviowbrasil.wordpress.com/108/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/flaviowbrasil.wordpress.com/108/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/flaviowbrasil.wordpress.com/108/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/flaviowbrasil.wordpress.com/108/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/flaviowbrasil.wordpress.com/108/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/flaviowbrasil.wordpress.com/108/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/flaviowbrasil.wordpress.com/108/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=flaviowbrasil.wordpress.com&amp;blog=10287940&amp;post=108&amp;subd=flaviowbrasil&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://flaviowbrasil.wordpress.com/2009/11/24/clusures-no-java-7/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/3a2dbcd6a4b28903a6a39a5a9c00f0bb?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Flávio Brasil</media:title>
		</media:content>
	</item>
		<item>
		<title>Ponteiros no java</title>
		<link>http://flaviowbrasil.wordpress.com/2009/11/19/ponteiros-no-java/</link>
		<comments>http://flaviowbrasil.wordpress.com/2009/11/19/ponteiros-no-java/#comments</comments>
		<pubDate>Thu, 19 Nov 2009 22:14:54 +0000</pubDate>
		<dc:creator>Flávio Brasil</dc:creator>
				<category><![CDATA[Desenvolvimento java]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[pointer]]></category>
		<category><![CDATA[ponteiro]]></category>
		<category><![CDATA[sun.misc.Unsafe]]></category>

		<guid isPermaLink="false">http://flaviowbrasil.wordpress.com/?p=56</guid>
		<description><![CDATA[Ponteiros em java<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=flaviowbrasil.wordpress.com&amp;blog=10287940&amp;post=56&amp;subd=flaviowbrasil&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Já ouvi pessoas reclamando pelo fato de que o java não possui ponteiro. Vejo nessa reclamação dois problemas:</p>
<p>1. Java possui sim ponteiro, dado que os objetos são passados por referência. O que o java não tem é aritmética de ponteiros e ponteiros para funções;<br />
2. Será que realmente é bom utilizar ponteiro? Me parece que o caso em que realmente é justificável a utilização de ponteiros é na manipulação de grandes volumes de dados em memória, por questões de performance. Fora isso, nos 99% dos casos restantes a utilização de ponteiros normalmente indica uma deficiência de modelagem e é um fator de grande risco, caso o programador não tome os cuidados necessários.</p>
<p>Porém, como mesmo assim alguns não ficam satisfeitos com estas duas afirmações, escrevi este post. Nós já utilizamos ponteiros em java naturalmente, dado que a passagem de parâmetros é por referência. Para ter a funcionalidade de um ponteiro em java (sem aritmética), basta termos uma classe como essa:</p>
<pre class="brush: java; collapse: true; light: false; toolbar: true;">

package ponteiro;

public class PonteiroSimples&lt;T&gt; {

	T obj;

	public PonteiroSimples(T obj) {
		super();
		this.obj = obj;
	}

	public T getObj() {
		return obj;
	}

	public void setObj(T obj) {
		this.obj = obj;
	}

}
</pre>
<p>Um trecho de código em C/C++ que ficaria assim:</p>
<pre class="brush: java;">

Teste *p = &amp;a;
Teste b = *p;
</pre>
<p>ficaria:</p>
<pre class="brush: java;">

Ponteiro&lt;Teste&gt; p = new Ponteiro(a);
Teste b = p.getObj;
</pre>
<p>Porém, com o PonteiroSimples não é possível utilizar aritmética de ponteiros. Para utilizar aritmética, implementei duas abordagens.<br />
A primeira simula aritmética de ponteiros utilizando um Map para mapear endereços fictícios de memória. A segunda mostra que é possível utilizar ponteiros e aritmética de ponteiros na VM da Sun, através do sun.misc.Unsafe que utilizei no post &#8220;Hackeando o java&#8221;. Nas duas abordagens não me preocupei com ponteiros para função e alocação de memória, embora acredite que também seja possível implementar.</p>
<p><strong>Antes de apresentá-las, gostaria de reforçar que estas abordagens são somente provas de conceito! Não utilizem elas!</strong></p>
<p>As duas abordagens possuem duas classes e uma interface em comum:</p>
<p>1. PonteiroTest</p>
<pre class="brush: java; collapse: true; light: false; toolbar: true;">

package ponteiro;

import static org.junit.Assert.*;
import static ponteiro.Ponteiro.*;

import org.junit.*;

public class PonteiroTest {

	public static class Teste {
		String string;

		public Teste(String string) {
			super();
			this.string = string;
		}
	}

	@Test
	public void testPonteiroNormal() throws Exception {
		Teste teste = new Teste(&quot;1&quot;);

		// Teste *ponteiro = &amp;teste;
		Ponteiro&lt;Teste&gt; ponteiro = getPonteiro(teste);

		// Teste objeto = *ponteiro;
		Teste objeto = ponteiro.getObjeto();
		assertEquals(teste, objeto);
	}

	@Test
	public void testPonteiroDePonteiro() throws Exception {
		Teste teste = new Teste(&quot;2&quot;);

		// Teste *aux = &amp;teste;
		// Teste **ponteiro = &amp;aux;
		Ponteiro&lt;Ponteiro&lt;Teste&gt;&gt; ponteiro = getPonteiro(getPonteiro(teste));

		// Teste objeto = **ponteiro;
		Teste objeto = ponteiro.getObjeto().getObjeto();
		assertEquals(teste, objeto);
	}

	@Test
	public void testPonteiroAritmetica() throws Exception {
		Teste[] testeArray = new Teste[3];
		testeArray[0] = new Teste(&quot;0&quot;);
		testeArray[1] = new Teste(&quot;1&quot;);
		testeArray[2] = new Teste(&quot;2&quot;);
		Teste[] testeArray2 = new Teste[3];

		// Teste *ponteiro = testeArray;
		Ponteiro&lt;Teste&gt; ponteiro = getPonteiro(testeArray);
		// testeArray2[0] = *ponteiro;
		testeArray2[0] = ponteiro.getObjeto();

		// ponteiro++;
		ponteiro.adiciona(1);
		// testeArray2[1] = *ponteiro;
		testeArray2[1] = ponteiro.getObjeto();

		// ponteiro++;
		ponteiro.adiciona(1);
		// testeArray2[2] = *ponteiro;
		testeArray2[2] = ponteiro.getObjeto();

		assertArrayEquals(testeArray, testeArray2);
	}

}
</pre>
<p>2. Ponteiro</p>
<pre class="brush: java; collapse: true; light: false; toolbar: true;">

package ponteiro;

public class Ponteiro&lt;T&gt; {

	static {
		String tipo = System.getProperty(&quot;tipoMemoria&quot;, &quot;fake&quot;);
		if(MemoriaReal.TIPO.equalsIgnoreCase(tipo)){
			memoria = new MemoriaReal();
		}
		else if(MemoriaFake.TIPO.equalsIgnoreCase(tipo)) {
			memoria = new MemoriaFake();
		}
		else {
			throw new IllegalStateException(&quot;Parametro tipoMemoria inválido!&quot;);
		}
	}

	private static Memoria memoria;

	private long endereco;

	public static &lt;T&gt; Ponteiro&lt;T&gt; getPonteiro(T obj) {
		return new Ponteiro&lt;T&gt;(memoria.getEndereco(obj));
	}

	public static &lt;T&gt; Ponteiro&lt;T&gt; getPonteiro(T[] obj) {
		return new Ponteiro&lt;T&gt;(memoria.getEndereco(obj));
	}

	public static &lt;T&gt; long getEndereco(T obj) {
		return memoria.getEndereco(obj);
	}

	public static &lt;T&gt; T getObjeto(long endereco) {
		return new Ponteiro&lt;T&gt;(endereco).getObjeto();
	}

	private Ponteiro(long endereco) {
		super();
		this.endereco = endereco;
	}

	@SuppressWarnings(&quot;unchecked&quot;)
	public T getObjeto() {
		return (T) memoria.getObject(endereco);
	}

	public long adiciona(long posicoes) {
		return endereco = memoria.adiciona(endereco, posicoes);
	}
}
</pre>
<p>3. Memoria</p>
<pre class="brush: java; collapse: true; light: false; toolbar: true;">

package ponteiro;

public interface Memoria {

	public long getEndereco(Object obj);
	public Object getObject(long endereco);
	public long adiciona(long endereco, long posicoes);

}
</pre>
<p>O que varia é a escolha de implementação de Memoria, dependendo da abordagem.</p>
<ul>
<li>Ponteiros em java &#8220;puro&#8221;</li>
</ul>
<pre class="brush: java; collapse: true; light: false; toolbar: true;">

package ponteiro;

import java.util.*;

public class MemoriaFake implements Memoria {

	public static final String TIPO = &quot;fake&quot;;
	static Map&lt;Long, Object&gt; map = new WeakHashMap&lt;Long, Object&gt;();
	private static long livre = 0;

	@Override
	public long getEndereco(Object obj) {
		long retorno = 0;
		if (obj != null) {
			// O Java não tem map birecional!?
			Set&lt;Long&gt; keySet = map.keySet();
			for (Long endereco : keySet) {
				if (obj.equals(map.get(endereco))) {
					retorno = endereco;
				}
			}
			if (retorno == 0) {
				if (obj.getClass().isArray()) {
					Object[] array = (Object[]) obj;
					long inicio = livre;
					for (Object object : array) {
						map.put(livre++, object);
					}
					retorno = inicio;
				} else {
					map.put(livre, obj);
					retorno = livre++;
				}
			}
		}
		return retorno;
	}

	@Override
	public Object getObject(long endereco) {
		return map.get(endereco);
	}

	@Override
	public long adiciona(long endereco, long posicoes) {
		return endereco + posicoes;
	}

}
</pre>
<ul>
<li>Ponteiros &#8220;verdadeiros&#8221; na VM da Sun</li>
</ul>
<pre class="brush: java; collapse: true; light: false; toolbar: true;">

package ponteiro;

import java.lang.reflect.*;

import net.sourceforge.sizeof.*;
import sun.misc.*;

public class MemoriaReal implements Memoria {

	public static final String TIPO = &quot;real&quot;;
	private static Unsafe unsafe = getUnsafe();

	private static Unsafe getUnsafe() {
		Unsafe unsafe = null;
		try {
			Field field = Unsafe.class.getDeclaredField(&quot;theUnsafe&quot;);
			field.setAccessible(true);
			unsafe = (Unsafe) field.get(Unsafe.class);
		} catch (Exception e) {
			throw new RuntimeException(e);
		}
		return unsafe;
	}

	private static class Auxiliar {
		Object obj;
	}

	@SuppressWarnings(&quot;deprecation&quot;)
	@Override
	public long getEndereco(Object obj) {
		Auxiliar aux = getAux(obj);
		long fieldOffset = getFieldOffset(aux, &quot;obj&quot;);
		long endereco = unsafe.getLong(aux, fieldOffset);
		if (obj.getClass().isArray()) {
			int arrayBaseOffset = unsafe.arrayBaseOffset(obj.getClass());
			endereco = unsafe.getInt(obj, arrayBaseOffset);
		}
		return endereco;
	}

	private Auxiliar getAux(Object obj) {
		Auxiliar aux = new Auxiliar();
		aux.obj = obj;
		return aux;
	}

	@Override
	public Object getObject(long endereco) {
		Auxiliar aux = getAux(null);
		long fieldOffset = getFieldOffset(aux, &quot;obj&quot;);
		unsafe.putLong(aux, fieldOffset, endereco);
		return aux.obj;
	}

	@SuppressWarnings(&quot;deprecation&quot;)
	private static long getFieldOffset(Object obj, String field) {
		try {
			return unsafe.fieldOffset(obj.getClass().getDeclaredField(field));
		} catch (Exception e) {
			throw new RuntimeException(e);
		}
	}

	@Override
	public long adiciona(long endereco, long posicoes) {
		Object obj = getObject(endereco);
		long size = SizeOf.sizeOf(obj);
		return endereco + size;
	}

}
</pre>
<p>Para facilitar, disponibilizei o projeto do eclipse no google code:<tt></tt></p>
<pre class="brush: plain;">

svn checkout http://ponteiros.googlecode.com/svn/trunk/ ponteiros-read-only
</pre>
<p>Rode o teste jUnit adicionando os parâmetros de VM:</p>
<pre class="brush: plain;">

-javaagent:lib\SizeOf.jar -DtipoMemoria=fake
</pre>
<p>Ou</p>
<pre class="brush: plain;">

-javaagent:lib\SizeOf.jar -DtipoMemoria=real
</pre>
<p><strong>Conclusão</strong></p>
<p>Em 99% dos casos, é uma falácia dizer que é uma deficiência o java não possuir ponteiros. É possível ter as principais funcionalidades de ponteiros no java através de uma classe como o PonteiroSimples, porém creio que utilizar uma abordagem como essa na maioria dos casos indica uma má modelagem do sistema e devemos tomar cuidado para utilizá-la.</p>
<p>Após, demonstrei que é possível utilizar aritmética de ponteiros no java simulando a memória com um Map. É uma implementação bem simples que possui uma série de deficiências, porém prova que é possível ter a funcionalidade de aritmética de ponteiros utilizando código java &#8220;puro&#8221;.</p>
<p>Para finalizar, fiz uma &#8220;viagem&#8221; com o sun.misc.Unsafe que nos dá acesso direto à memória para poder realizar aritmética de ponteiros. Também vejo algumas deficiências nesta abordagem e novamente ressalto que ela foi colocada aqui apenas como prova de conceito. Jamais utilize ela em uma aplicação!</p>
<div id="_mcePaste" style="overflow:hidden;position:absolute;left:-10000px;top:0;width:1px;height:1px;">package ponteiro;import static org.junit.Assert.*;<br />
import static ponteiro.Ponteiro.*;import org.junit.*;public class PonteiroTest {public static class Teste {<br />
String string;public Teste(String string) {<br />
super();<br />
this.string = string;<br />
}<br />
}@Test<br />
public void testPonteiroNormal() throws Exception {<br />
Teste teste = new Teste(&#8220;1&#8243;);// Teste *ponteiro = &amp;teste;<br />
Ponteiro&lt;Teste&gt; ponteiro = getPonteiro(teste);// Teste objeto = *ponteiro;<br />
Teste objeto = ponteiro.getObjeto();<br />
assertEquals(teste, objeto);<br />
}@Test<br />
public void testPonteiroDePonteiro() throws Exception {<br />
Teste teste = new Teste(&#8220;2&#8243;);// Teste *aux = &amp;teste;<br />
// Teste **ponteiro = &amp;aux;<br />
Ponteiro&lt;Ponteiro&lt;Teste&gt;&gt; ponteiro = getPonteiro(getPonteiro(teste));
<p>&nbsp;</p>
<p>// Teste objeto = **ponteiro;<br />
Teste objeto = ponteiro.getObjeto().getObjeto();<br />
assertEquals(teste, objeto);<br />
}</p>
<p>@Test<br />
public void testPonteiroAritmetica() throws Exception {<br />
Teste[] testeArray = new Teste[3];<br />
testeArray[0] = new Teste(&#8220;0&#8243;);<br />
testeArray[1] = new Teste(&#8220;1&#8243;);<br />
testeArray[2] = new Teste(&#8220;2&#8243;);<br />
Teste[] testeArray2 = new Teste[3];</p>
<p>// Teste *ponteiro = testeArray;<br />
Ponteiro&lt;Teste&gt; ponteiro = getPonteiro(testeArray);<br />
// testeArray2[0] = *ponteiro;<br />
testeArray2[0] = ponteiro.getObjeto();</p>
<p>// ponteiro++;<br />
ponteiro.adiciona(1);<br />
// testeArray2[1] = *ponteiro;<br />
testeArray2[1] = ponteiro.getObjeto();</p>
<p>// ponteiro++;<br />
ponteiro.adiciona(1);<br />
// testeArray2[2] = *ponteiro;<br />
testeArray2[2] = ponteiro.getObjeto();</p>
<p>assertArrayEquals(testeArray, testeArray2);<br />
}</p>
<p>}</p>
</div>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/flaviowbrasil.wordpress.com/56/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/flaviowbrasil.wordpress.com/56/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/flaviowbrasil.wordpress.com/56/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/flaviowbrasil.wordpress.com/56/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/flaviowbrasil.wordpress.com/56/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/flaviowbrasil.wordpress.com/56/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/flaviowbrasil.wordpress.com/56/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/flaviowbrasil.wordpress.com/56/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/flaviowbrasil.wordpress.com/56/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/flaviowbrasil.wordpress.com/56/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/flaviowbrasil.wordpress.com/56/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/flaviowbrasil.wordpress.com/56/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/flaviowbrasil.wordpress.com/56/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/flaviowbrasil.wordpress.com/56/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=flaviowbrasil.wordpress.com&amp;blog=10287940&amp;post=56&amp;subd=flaviowbrasil&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://flaviowbrasil.wordpress.com/2009/11/19/ponteiros-no-java/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/3a2dbcd6a4b28903a6a39a5a9c00f0bb?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Flávio Brasil</media:title>
		</media:content>
	</item>
		<item>
		<title>O Ser e o Sistema</title>
		<link>http://flaviowbrasil.wordpress.com/2009/11/16/o-ser-e-o-sistema/</link>
		<comments>http://flaviowbrasil.wordpress.com/2009/11/16/o-ser-e-o-sistema/#comments</comments>
		<pubDate>Mon, 16 Nov 2009 19:52:04 +0000</pubDate>
		<dc:creator>Flávio Brasil</dc:creator>
				<category><![CDATA[Métodos]]></category>
		<category><![CDATA[agile]]></category>
		<category><![CDATA[ágil]]></category>
		<category><![CDATA[Desenvolvimento]]></category>
		<category><![CDATA[filosofia]]></category>
		<category><![CDATA[sartre]]></category>
		<category><![CDATA[scrum]]></category>
		<category><![CDATA[xp]]></category>

		<guid isPermaLink="false">http://flaviowbrasil.wordpress.com/?p=39</guid>
		<description><![CDATA[Uma argumentação filosófia a respeito de desenvolvimento ágil<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=flaviowbrasil.wordpress.com&amp;blog=10287940&amp;post=39&amp;subd=flaviowbrasil&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Esta é uma argumentação filosófica a respeito de desenvolvimento ágil, utilizando-se de algumas argumentações de Jean-Paul Sartre em sua obra &#8220;O Ser e o Nada&#8221;. Por favor, não se precipitem achando que o Sistema substitui o Nada, ou que o Sistema é o Nada ou até mesmo que o Sistema não serve para Nada! Ao longo do post ficará claro a escolha deste título. Por enquanto, vamos a uma pré-argumentação.</p>
<p><strong>A adaptação<br />
</strong></p>
<p>Quando olhamos para as práticas e valores dos métodos ágeis, assim como em qualquer outro contexto onde temos que aplicar um conceito em nosso trabalho diário, existe uma forte tendência no sentido de tentarmos adaptar os conceitos para a nossa realidade. Esse é um comportamento natural e podemos até mesmo dizer que seja desejável.</p>
<p>Porém esta adaptação pode seguir em dois sentidos:  evolução ou desvirtuação.</p>
<p>Vamos a um exemplo prático:</p>
<p>Decidimos passar a realizar o Scrum Diário. A partir do momento que passamos a aplicar esta prática, ela vai tomando a &#8220;cara&#8221; do time, sendo adaptada, por exemplo, para colocar no quadro mais uma coluna que faz sentido no contexto daquele desenvolvimento ou empresa. Isso considero como uma evolução, onde existe uma simbiose entre o conceito e a realidade diária. O motivo e benefícios de se fazer o Scrum Diário se mantém e se adicionam elementos para facilitar a aplicação.</p>
<p>Porém, muitas vezes o Scrum Diário pode se tornar uma reunião demorada, se extendendo, por exemplo, para discutir um assunto crítico. Uma reunião que era apenas para termos um status e durar alguns minutos se torna uma reunião cheia de detalhes e que demora várias horas. Essa é a desvirtuação do conceito original, o motivo e os benefícios de se fazer o Scrum Diário são perdidos</p>
<p>Citei este exemplo por já ter vivenciado este cenário e por acreditar que deva se repetir em várias empresas que começam a aplicar o Scrum Diário.</p>
<p>Como podemos nos prevenir para não desvirtuarmos os conceitos de métodos ágeis no nosso dia-a-dia? A resposta pode ser tão simples como: Releia a definição do conceito e faça exatamente o que está ecrito! Será que esta resposta realmente nos satisfaz? E se a aplicação do conceito não é o melhor para a minha organização?</p>
<p>Creio que a melhor resposta continua sendo: Adapte, porém tome cuidado para não desvirtuar. Para que isso não aconteça, como disse meu amigo Agnaldo em seu <a href="http://wp.softsimples.com.br/?p=115" target="_blank">blog</a>:</p>
<blockquote><p><em>&#8220;Tão importante quanto seguir uma metodologia é conhecer sua filosofia.&#8221;</em></p></blockquote>
<p>Temos que procurar entender os motivos pelos quais sugiram os valores dos métodos ágeis e quais são seus benefícios.</p>
<p>Feita esta pré-argumentação, podemos ir à argumentação principal que procura apresentar conceitos filosóficos como motivos que dão suporte a alguns conceitos utilizados nos métodos ágeis.</p>
<p><strong>O Ser</strong></p>
<p>O livro &#8220;O Ser e o Nada&#8221; possui o subtítulo &#8220;Ensaio de Ontologia Fenomenológica&#8221;. É um livro a respeito do estudo da realidade, que pode ser chamado também de estudo da natureza do ser ou ontologia, através dos fenômenos associados ele, ou seja, suas aparições e efeitos (fenomenologia).</p>
<p>Apesar de correr o risco de ser simplista, vamos tomar um exemplo concreto para a nossa argumentação:</p>
<p>Uma porta</p>
<p>Isso mesmo, uma porta comum que abre e fecha, tem uma maçaneta e pode ser trancada com uma chave.</p>
<p>Na introdução, que possui o título &#8220;Em busca do ser&#8221;, Sartre argumenta que a filosofia moderna avançou consideravelmente ao reduzir o ser à série de aparições que o manifestam. Ou seja, a porta só faz sentido como ser ao analisarmos as suas manifestações. Porém, analisar a manifestação momentânea do ser não é suficiente para determinarmos o que realmente é o ser, uma vez que ele provavelmente irá se manifestar de outra maneira no futuro. Precisamos analisar a razão da sequencia de aparições do ser para realmente chegar à sua natureza. Sartre escreve:</p>
<blockquote><p>&#8220;É preciso que capte o vermelho através da sua impressão de vermelho. O vermelho, ou seja, a razão da série: a corrente elétrica através da eletrólise, etc. Mas se a transcendência do objeto se baseia na necessidade que a apararição tem de sempre se fazer transcender, resulta que um objeto coloca, por princípio como infinita a série de suas aparições. Assim, a aparição, finita, indica-se a si própria em sua finitude, mas, ao mesmo tempo, para ser captada como aparição-do-que-aparece, exige ser ultrapassada até o infinito.&#8221;</p></blockquote>
<p>Sartre chega então a um novo dualismo:  o do finito e infinito. Para este post, podemos parar a análise do livro por aqui, uma vez que chegamos no ponto central desta argumentação:</p>
<p>Não temos como obter a natureza completa do ser, uma vez que seria necessário observar todos os fenomenos que o manifestam até o infinito. Consequentemente, não conseguimos abstrair e modelar o ser por completo.</p>
<p><strong>O Sistema</strong></p>
<p>Podemos dizer que o desenvolvimento de sistemas tem como meta abstrair e modelar o mundo real e os conceitos que envolvem as tarefas dele (ser) em artefatos automatos capazes de manipular informações e coordenar tarefas.</p>
<p>Ignorando neste momento a definição de sistema e como esta palavra/conceito deveria ser melhor apresentado e colocada neste post, vamos inferir o ponto em que chegamos no tópico anterior para nossa realidade de desenvolvimento de sistemas. Podemos dizer que é uma utopia acreditar que é possível modelar a totalidade de um ser, que neste caso podemos ver como os objetos e processos que estamos desenvolvendo. Voltando ao exemplo concreto:</p>
<p>Vamos modelar um sistema para realizar a pintura de portas novas, ainda sem pintura. O objeto principal de nosso sistema é a porta.Observando então a porta e as várias características a respeito de portas que temos em nossa memória, conseguimos ver vários aspectos que podemos modelar a repeito da porta:</p>
<p>- A porta é feita de uma determinada madeira<br />
- Ela possui maçaneta<br />
- É aberta por uma chave<br />
- Pode estar aberta<br />
- Pode estar fixada no batente<br />
- Pode ser resistente ao fogo<br />
- Pode ter cupim<br />
- Pode estar com mofo<br />
- Pode ser nova<br />
- Pode estar quebrada</p>
<p>Creio que é claro para todos que poderíamos listar até o infinito o número de informações e comportamentos a repeito da porta. Porém, não é isso que precisamos! Precisamos apenas modelar as informações e comportamentos necessários para cumprir o escopo do nosso sistema, ou seja, devemos focar a modelagem somente no que é necessário para o desenvolvimento do sistema de pintura de portas novas, ainda sem pintura.</p>
<p>Tentar predizer que o sistema um dia pode precisar de algo que não precisa hoje é uma tendência natural ao erro. Poderíamos já fazer a modelagem pensando que um dia o sistema poderia pintar portas usadas e que bastaria colocar uma etapa para primeiro tirar a tinta atual da porta e então seguir o processo normal. Porém a porta por não ser nova poderia estar lascada e ser necessário que o sistema recurepe esta parte da porta para depois então pinta-la.</p>
<p>Se considerarmos que a manifestação do ser que queremos modelar é o escopo do sistema, ou seja, o comportamento do sistema que o cliente espera naquela entrega, não temos como prever o que será este ser no futuro, dado que ainda só conhecemos a manifestação finita dele: o que o cliente precisa.</p>
<p><strong>Os Conceitos</strong></p>
<p>Toda esta argumentação serve para chegar em um simples ponto, normalmente adotado nos métodos ágeis:</p>
<p>Somente modele o que você precisa!</p>
<p>No XP, isso é suportado pelos seguintes valores e práticas:</p>
<p>- Design incremental<br />
- Simplicidade<br />
- Passos de bebê</p>
<p>Porém, novamente aqui reforço a importância para que não desvirtuarmos estes conceitos. Estes valores não são desculpas para realizar uma modelagem correta de OO, por exemplo. Faça o design correto, mas não modele informações e comportamentos que você acha que um dia o sistema irá necessitar.</p>
<p><strong>O Resumo</strong></p>
<p>Vimos a importância de compreender a filosofia por trás dos conceitos adotados nos métodos ágeis. A partir deste ponto utilizamos a argumentação do Sartre de que não é possível determinar a natureza total do ser sobre o qual iremos modelar o sistema com base em uma série de manifestações finitas, que mapeamos sendo o escopo do que o cliente precisa.  Por este motivo é uma tendência ao erro tentar modelar situações que não estão no escopo da entrega atual.</p>
<p><strong>A Conclusão</strong></p>
<p>[<a href="http://www.lerolero.com/" target="_blank">LL</a>] Os métodos que nos auxiliam a lidar com o novo modelo estrutural aqui preconizado prepara-nos para enfrentar situações atípicas decorrentes do levantamento das variáveis envolvidas. [/<a href="http://www.lerolero.com/" target="_blank">LL</a>]</p>
<p>Obrigado pela revisão e dicas, <a href="http://wp.softsimples.com.br/" target="_blank">Agnaldo</a> e <a href="http://renandemelo.blogspot.com/" target="_blank">Renan</a>!</p>
<div id="_mcePaste" style="overflow:hidden;position:absolute;left:-10000px;top:89px;width:1px;height:1px;">Em busca do ser</div>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/flaviowbrasil.wordpress.com/39/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/flaviowbrasil.wordpress.com/39/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/flaviowbrasil.wordpress.com/39/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/flaviowbrasil.wordpress.com/39/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/flaviowbrasil.wordpress.com/39/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/flaviowbrasil.wordpress.com/39/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/flaviowbrasil.wordpress.com/39/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/flaviowbrasil.wordpress.com/39/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/flaviowbrasil.wordpress.com/39/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/flaviowbrasil.wordpress.com/39/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/flaviowbrasil.wordpress.com/39/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/flaviowbrasil.wordpress.com/39/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/flaviowbrasil.wordpress.com/39/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/flaviowbrasil.wordpress.com/39/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=flaviowbrasil.wordpress.com&amp;blog=10287940&amp;post=39&amp;subd=flaviowbrasil&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://flaviowbrasil.wordpress.com/2009/11/16/o-ser-e-o-sistema/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/3a2dbcd6a4b28903a6a39a5a9c00f0bb?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Flávio Brasil</media:title>
		</media:content>
	</item>
		<item>
		<title>Sizeof em Java</title>
		<link>http://flaviowbrasil.wordpress.com/2009/11/16/sizeof-em-java/</link>
		<comments>http://flaviowbrasil.wordpress.com/2009/11/16/sizeof-em-java/#comments</comments>
		<pubDate>Mon, 16 Nov 2009 17:43:33 +0000</pubDate>
		<dc:creator>Flávio Brasil</dc:creator>
				<category><![CDATA[Desenvolvimento java]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[java.SizeOf]]></category>
		<category><![CDATA[sizeof]]></category>

		<guid isPermaLink="false">http://flaviowbrasil.wordpress.com/?p=65</guid>
		<description><![CDATA[Em java, como saber o tamanho exato de um objeto em memória?<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=flaviowbrasil.wordpress.com&amp;blog=10287940&amp;post=65&amp;subd=flaviowbrasil&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Estou preparando um post a respeito de ponteiros em Java e me deparei com o seguinte problema:</p>
<p>Em java, como saber o tamanho exato de um objeto em memória?</p>
<p>Encontrei <a href="http://www.javaworld.com/javaworld/javaqa/2003-12/02-qa-1226-sizeof.html" target="_blank">este</a> post bastante interessante sobre o assunto que faz uma boa análise e sugere uma solução que ainda possui algumas deficiências.</p>
<p>Pesquisando melhor, encontrei o projeto <a href="http://sizeof.sourceforge.net/" target="_blank">java.SizeOf</a>. Ele utiliza a API de instrumentação do Java e consegue retornar o <a href="http://java.sun.com/j2se/1.5.0/docs/api/java/lang/instrument/Instrumentation.html#getObjectSize%28java.lang.Object%29" target="_blank">tamanho exato</a> do objeto em memória.</p>
<p>É uma boa alternativa, só tem o inconveniente de ter que utilizar um agent.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/flaviowbrasil.wordpress.com/65/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/flaviowbrasil.wordpress.com/65/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/flaviowbrasil.wordpress.com/65/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/flaviowbrasil.wordpress.com/65/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/flaviowbrasil.wordpress.com/65/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/flaviowbrasil.wordpress.com/65/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/flaviowbrasil.wordpress.com/65/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/flaviowbrasil.wordpress.com/65/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/flaviowbrasil.wordpress.com/65/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/flaviowbrasil.wordpress.com/65/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/flaviowbrasil.wordpress.com/65/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/flaviowbrasil.wordpress.com/65/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/flaviowbrasil.wordpress.com/65/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/flaviowbrasil.wordpress.com/65/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=flaviowbrasil.wordpress.com&amp;blog=10287940&amp;post=65&amp;subd=flaviowbrasil&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://flaviowbrasil.wordpress.com/2009/11/16/sizeof-em-java/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/3a2dbcd6a4b28903a6a39a5a9c00f0bb?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Flávio Brasil</media:title>
		</media:content>
	</item>
		<item>
		<title>Integração Spring &#8211; GWT</title>
		<link>http://flaviowbrasil.wordpress.com/2009/11/11/integracao-spring-gwt/</link>
		<comments>http://flaviowbrasil.wordpress.com/2009/11/11/integracao-spring-gwt/#comments</comments>
		<pubDate>Wed, 11 Nov 2009 22:34:30 +0000</pubDate>
		<dc:creator>Flávio Brasil</dc:creator>
				<category><![CDATA[Desenvolvimento java]]></category>
		<category><![CDATA[gwt]]></category>
		<category><![CDATA[integração]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[rpc]]></category>
		<category><![CDATA[service]]></category>
		<category><![CDATA[spring]]></category>

		<guid isPermaLink="false">http://flaviowbrasil.wordpress.com/?p=25</guid>
		<description><![CDATA[Estou desenvolvendo um projeto utilizando Spring e GWT. Pesquisei algumas alternativas para integrar os dois e a melhor solução que encontrei foi a postada neste blog. Porém, ainda achei esta abordagem muito complexa e procurei uma solução mais simples.  Implementei o SpringRemoteServiceServlet, utilizando um código parecido com o que encontrei neste blog para integração entre [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=flaviowbrasil.wordpress.com&amp;blog=10287940&amp;post=25&amp;subd=flaviowbrasil&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Estou desenvolvendo um projeto utilizando Spring e GWT. Pesquisei algumas alternativas para integrar os dois e a melhor solução que encontrei foi a postada <a href="http://blog.digitalascent.com/2007/11/gwt-rpc-with-spring-2x_12.html" target="_blank">neste</a> blog.<br />
Porém, ainda achei esta abordagem muito complexa e procurei uma solução mais simples.  Implementei o SpringRemoteServiceServlet, utilizando um código parecido com o que encontrei <a href="http://stuffthathappens.com/blog/2009/09/14/guice-with-gwt/" target="_blank">neste</a> blog para integração entre o GWT e o Guice.</p>
<pre class="brush: java; collapse: true; light: false; toolbar: true;">

package br.com.fwb.base.server.spring;

import org.springframework.beans.factory.*;
import org.springframework.beans.factory.config.AutowireCapableBeanFactory;
import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.context.support.WebApplicationContextUtils;

import com.google.gwt.user.client.rpc.*;
import com.google.gwt.user.server.rpc.*;

public class SpringRemoteServiceServlet extends RemoteServiceServlet {

	private static final long serialVersionUID = 122383530332380586L;

	@Override
	public String processCall(String payload) throws SerializationException {
		try {
			RPCRequest rpcRequest = RPC.decodeRequest(payload);

			RemoteService service = getServiceInstance(rpcRequest.getMethod()
					.getDeclaringClass());

			return RPC.invokeAndEncodeResponse(service, rpcRequest.getMethod(),
					rpcRequest.getParameters(), rpcRequest
							.getSerializationPolicy());

		} catch (IncompatibleRemoteServiceException ex) {
			return RPC.encodeResponseForFailure(null, ex);
		}
	}

	private RemoteService getServiceInstance(Class&lt;?&gt; declaringClass) {
		WebApplicationContext wac = WebApplicationContextUtils
				.getRequiredWebApplicationContext(getServletContext());
		AutowireCapableBeanFactory beanFactory = wac
				.getAutowireCapableBeanFactory();
		return (RemoteService) BeanFactoryUtils.beanOfType(
				(ListableBeanFactory) beanFactory, declaringClass);
	}

}
</pre>
<p>Registre o seguinte no web.xml:</p>
<pre class="brush: xml; collapse: true; light: false; toolbar: true;">

	&lt;listener&gt;
		&lt;listener-class&gt;
			org.springframework.web.context.ContextLoaderListener
		&lt;/listener-class&gt;
	&lt;/listener&gt;

	&lt;servlet&gt;
		&lt;servlet-name&gt;springRemoteServiceServlet&lt;/servlet-name&gt;
		&lt;servlet-class&gt;br.com.fwb.base.server.spring.SpringRemoteServiceServlet&lt;/servlet-class&gt;
		&lt;load-on-startup&gt;1&lt;/load-on-startup&gt;
	&lt;/servlet&gt;

	&lt;servlet-mapping&gt;
		&lt;servlet-name&gt;springRemoteServiceServlet&lt;/servlet-name&gt;
		&lt;url-pattern&gt;*.rpc&lt;/url-pattern&gt;
	&lt;/servlet-mapping&gt;
</pre>
<p>Anote a interface do servico que será chamado com @RemoteServiceRelativePath apontando para qualquer endereco que termine com .rpc:</p>
<pre class="brush: java; collapse: true; light: false; toolbar: true;">

@RemoteServiceRelativePath(&quot;../GWT.rpc&quot;)
public interface TesteService extends RemoteService {

	void teste(String s);

}
</pre>
<p>Implemente a interface remota do GWT com um bean do Spring:</p>
<pre class="brush: java; collapse: true; light: false; toolbar: true;">

@Service
public class TesteServiceImpl implements TesteService {

	public void teste(String s) {

	}

}
</pre>
<p>Para mais informações sobre como chamar o serviço no servidor a partir de um código GWT client, vide a <a href="http://code.google.com/intl/pt-BR/webtoolkit/doc/1.6/DevGuideServerCommunication.html#DevGuideMakingACall" target="_blank">documentação</a> do GWT.</p>
<p>Quaisquer dúvidas, entrem em contato.</p>
<div id="_mcePaste" style="overflow:hidden;position:absolute;left:-10000px;top:48px;width:1px;height:1px;">package br.com.fwb.base.server.spring;import org.springframework.beans.factory.*;<br />
import org.springframework.beans.factory.config.AutowireCapableBeanFactory;<br />
import org.springframework.web.context.WebApplicationContext;<br />
import org.springframework.web.context.support.WebApplicationContextUtils;import com.google.gwt.user.client.rpc.*;<br />
import com.google.gwt.user.server.rpc.*;public class SpringRemoteServiceServlet extends RemoteServiceServlet {private static final long serialVersionUID = 122383530332380586L;</p>
<p>@Override<br />
public String processCall(String payload) throws SerializationException {<br />
try {<br />
RPCRequest rpcRequest = RPC.decodeRequest(payload);</p>
<p>RemoteService service = getServiceInstance(rpcRequest.getMethod()<br />
.getDeclaringClass());</p>
<p>return RPC.invokeAndEncodeResponse(service, rpcRequest.getMethod(),<br />
rpcRequest.getParameters(), rpcRequest<br />
.getSerializationPolicy());</p>
<p>} catch (IncompatibleRemoteServiceException ex) {<br />
return RPC.encodeResponseForFailure(null, ex);<br />
}<br />
}</p>
<p>private RemoteService getServiceInstance(Class&lt;?&gt; declaringClass) {<br />
WebApplicationContext wac = WebApplicationContextUtils<br />
.getRequiredWebApplicationContext(getServletContext());<br />
AutowireCapableBeanFactory beanFactory = wac<br />
.getAutowireCapableBeanFactory();<br />
return (RemoteService) BeanFactoryUtils.beanOfType(<br />
(ListableBeanFactory) beanFactory, declaringClass);<br />
}</p>
<p>}</p>
</div>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/flaviowbrasil.wordpress.com/25/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/flaviowbrasil.wordpress.com/25/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/flaviowbrasil.wordpress.com/25/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/flaviowbrasil.wordpress.com/25/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/flaviowbrasil.wordpress.com/25/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/flaviowbrasil.wordpress.com/25/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/flaviowbrasil.wordpress.com/25/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/flaviowbrasil.wordpress.com/25/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/flaviowbrasil.wordpress.com/25/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/flaviowbrasil.wordpress.com/25/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/flaviowbrasil.wordpress.com/25/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/flaviowbrasil.wordpress.com/25/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/flaviowbrasil.wordpress.com/25/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/flaviowbrasil.wordpress.com/25/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=flaviowbrasil.wordpress.com&amp;blog=10287940&amp;post=25&amp;subd=flaviowbrasil&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://flaviowbrasil.wordpress.com/2009/11/11/integracao-spring-gwt/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/3a2dbcd6a4b28903a6a39a5a9c00f0bb?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Flávio Brasil</media:title>
		</media:content>
	</item>
		<item>
		<title>Hackeando o Java</title>
		<link>http://flaviowbrasil.wordpress.com/2009/11/06/hackeando-o-java/</link>
		<comments>http://flaviowbrasil.wordpress.com/2009/11/06/hackeando-o-java/#comments</comments>
		<pubDate>Fri, 06 Nov 2009 15:43:31 +0000</pubDate>
		<dc:creator>Flávio Brasil</dc:creator>
				<category><![CDATA[Desenvolvimento java]]></category>
		<category><![CDATA[hack]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[sun.misc.Unsafe]]></category>

		<guid isPermaLink="false">http://flaviowbrasil.wordpress.com/?p=4</guid>
		<description><![CDATA[Apresenta um código malicioso utilizando sun.misc.Unsafe capaz de alterar o comportamento de classes da VM<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=flaviowbrasil.wordpress.com&amp;blog=10287940&amp;post=4&amp;subd=flaviowbrasil&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Estive estudando a respeito da classe sun.misc.Unsafe da VM da Sun. Através dela, é possível manipular diretamente posições de memória e acessar e/ou alterar coisas que não deveriam ser possiveis.<br />
Alterar o comportamento das classes da VM é algo perigoso, porém com o sun.misc.Unsafe é possível, por exemplo, hackear a classe boolean para que Boolean.valueOf() retorne de forma inconsistente!</p>
<p>Segue a prova de conceito:</p>
<pre class="brush: java; collapse: true; light: false; toolbar: true;">

import java.lang.reflect.Field;

import sun.misc.Unsafe;
import sun.reflect.FieldAccessor;
import sun.reflect.ReflectionFactory;

public class HackJava {

	public static void main(String[] args) throws SecurityException,
			NoSuchFieldException {
		setValor(Boolean.class, &quot;TRUE&quot;, new Boolean(false));
		setValor(Boolean.class, &quot;FALSE&quot;, new Boolean(true));
		System.out.println(&quot;Boolean.valueOf(true) deveria ser true, mas é: &quot; + Boolean.valueOf(true));
	}

	public static Unsafe getUnsafe() throws SecurityException,
			NoSuchFieldException {
		return (Unsafe) getValor(Unsafe.class, &quot;theUnsafe&quot;);
	}

	private static Object getValor(Object obj, String campo)
			throws SecurityException, NoSuchFieldException {
		FieldAccessor accessor = getAccessor(obj, campo);
		return accessor.get(obj.getClass());
	}

	@SuppressWarnings(&quot;deprecation&quot;)
	private static void setValor(Object obj, String campo, Object valor)
			throws SecurityException, NoSuchFieldException {
		Field field = getField(obj, campo);
		Unsafe unsafe = getUnsafe();
		Object base = unsafe.staticFieldBase(field);
		int fieldOffset = unsafe.fieldOffset(field);
		unsafe.putObject(base, fieldOffset, valor);
	}

	private static FieldAccessor getAccessor(Object obj, String campo)
			throws SecurityException, NoSuchFieldException {
		Field field = getField(obj, campo);
		FieldAccessor accessor = ReflectionFactory.getReflectionFactory()
				.newFieldAccessor(field, true);
		return accessor;
	}

	private static Field getField(Object obj, String campo)
			throws SecurityException, NoSuchFieldException {
		Class&lt;?&gt; classe = obj.getClass();
		if (obj instanceof Class&lt;?&gt;) {
			classe = (Class&lt;?&gt;) obj;
		}
		return classe.getDeclaredField(campo);
	}

}
</pre>
<p>Este código irá imprimir:</p>
<pre class="brush: plain;">

Boolean.valueOf(true) deveria ser true, mas é: false
</pre>
<p>É possível limitar as permissões através do java.policy para que não seja possível acessar a classe sun.misc.Unsafe, por exemplo.<br />
É de grande importância de escolher corretamente quais são as permissões do código que irá rodar em sua VM.<br />
Caso não esteja corretamente configuradas, existe um risco considerável que algum código malicioso afete todas aplicações rodando na mesma VM.</p>
<div id="_mcePaste" style="overflow:hidden;position:absolute;left:-10000px;top:0;width:1px;height:1px;">import java.lang.reflect.Field;import sun.misc.Unsafe;<br />
import sun.reflect.FieldAccessor;<br />
import sun.reflect.ReflectionFactory;public class HackJava {public static void main(String[] args) throws SecurityException,<br />
NoSuchFieldException {<br />
setValor(Boolean.class, &#8220;TRUE&#8221;, new Boolean(false));<br />
setValor(Boolean.class, &#8220;FALSE&#8221;, new Boolean(true));<br />
System.out.println(&#8220;Deveria ser true, mas é: &#8221; + Boolean.valueOf(true));<br />
}public static Unsafe getUnsafe() throws SecurityException,<br />
NoSuchFieldException {<br />
return (Unsafe) getValor(Unsafe.class, &#8220;theUnsafe&#8221;);<br />
}
<p>&nbsp;</p>
<p>private static Object getValor(Object obj, String campo)<br />
throws SecurityException, NoSuchFieldException {<br />
FieldAccessor accessor = getAccessor(obj, campo);<br />
return accessor.get(obj.getClass());<br />
}</p>
<p>@SuppressWarnings(&#8220;deprecation&#8221;)<br />
private static void setValor(Object obj, String campo, Object valor)<br />
throws SecurityException, NoSuchFieldException {<br />
Field field = getField(obj, campo);<br />
Unsafe unsafe = getUnsafe();<br />
Object base = unsafe.staticFieldBase(field);<br />
int fieldOffset = unsafe.fieldOffset(field);<br />
unsafe.putObject(base, fieldOffset, valor);<br />
}</p>
<p>private static FieldAccessor getAccessor(Object obj, String campo)<br />
throws SecurityException, NoSuchFieldException {<br />
Field field = getField(obj, campo);<br />
FieldAccessor accessor = ReflectionFactory.getReflectionFactory()<br />
.newFieldAccessor(field, true);<br />
return accessor;<br />
}</p>
<p>private static Field getField(Object obj, String campo)<br />
throws SecurityException, NoSuchFieldException {<br />
Class&lt;?&gt; classe = obj.getClass();<br />
if (obj instanceof Class&lt;?&gt;) {<br />
classe = (Class&lt;?&gt;) obj;<br />
}<br />
return classe.getDeclaredField(campo);<br />
}</p>
<p>}</p>
</div>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/flaviowbrasil.wordpress.com/4/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/flaviowbrasil.wordpress.com/4/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/flaviowbrasil.wordpress.com/4/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/flaviowbrasil.wordpress.com/4/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/flaviowbrasil.wordpress.com/4/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/flaviowbrasil.wordpress.com/4/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/flaviowbrasil.wordpress.com/4/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/flaviowbrasil.wordpress.com/4/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/flaviowbrasil.wordpress.com/4/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/flaviowbrasil.wordpress.com/4/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/flaviowbrasil.wordpress.com/4/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/flaviowbrasil.wordpress.com/4/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/flaviowbrasil.wordpress.com/4/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/flaviowbrasil.wordpress.com/4/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=flaviowbrasil.wordpress.com&amp;blog=10287940&amp;post=4&amp;subd=flaviowbrasil&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://flaviowbrasil.wordpress.com/2009/11/06/hackeando-o-java/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/3a2dbcd6a4b28903a6a39a5a9c00f0bb?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Flávio Brasil</media:title>
		</media:content>
	</item>
	</channel>
</rss>
