<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-3760273245894556929</id><updated>2012-01-25T04:03:37.282-08:00</updated><category term='computação nas nuvens'/><category term='projeto de software'/><category term='versionamento'/><category term='pcsx2'/><category term='diagramas'/><category term='jboss seam'/><category term='lula'/><category term='soa'/><category term='integração'/><category term='maven'/><category term='código fonte'/><category term='full text search'/><category term='jogos'/><category term='exemplo'/><category term='projeto oo'/><category term='chip8'/><category term='javaserver faces'/><category term='git'/><category term='gamecube'/><category term='otimizacao'/><category term='build automatizados'/><category term='richfaces'/><category term='caelum'/><category term='chaos computer club'/><category term='mashup'/><category term='reflexão'/><category term='desenvolvimento orientado a testes'/><category term='brasil'/><category term='scripting'/><category term='travamento'/><category term='jsf'/><category term='ps3'/><category term='java'/><category term='conversacao'/><category term='lock'/><category term='oferta'/><category term='jnesbr'/><category term='nosuchfieldexception'/><category term='restful'/><category term='documentação'/><category term='6502'/><category term='regras de negócio'/><category term='refatoração'/><category term='manifesto ágil'/><category term='crud'/><category term='rest'/><category term='interview'/><category term='annotation'/><category term='emulator'/><category term='homebrew'/><category term='javac'/><category term='agilidade'/><category term='dsl'/><category term='design'/><category term='ambiente produção'/><category term='emulação'/><category term='java2d'/><category term='framework'/><category term='governancia'/><category term='nand'/><category term='hotspot'/><category term='subversion'/><category term='svn'/><category term='google'/><category term='ruby'/><category term='reflection'/><category term='alternativa'/><category term='futurama'/><category term='testes'/><category term='tiny types'/><category term='arquitetura'/><category term='spellchecker'/><category term='lexical'/><category term='hacking'/><category term='expressividade'/><category term='programacao'/><category term='3g'/><category term='interface'/><category term='voce quis dizer'/><category term='dsl interna'/><category term='ios'/><category term='padrões'/><category term='desenvolvimento guiado por testes'/><category term='tdd'/><category term='ambiente homolgação'/><category term='wetsand'/><category term='artigo'/><category term='falha'/><category term='classe anonimas'/><category term='richfaces 4.0'/><category term='south park'/><category term='aplicações web'/><category term='graficos'/><category term='novidades'/><category term='internal dsl'/><category term='gae'/><category term='netbeans'/><category term='seo'/><category term='playstation portable'/><category term='ddd'/><category term='grammars'/><category term='nes'/><category term='seguranca'/><category term='cloud-computing'/><category term='jruby'/><category term='bootmii'/><category term='spring 3'/><category term='interface fluente'/><category term='jtable'/><category term='banner bomb'/><category term='democracia'/><category term='escopo sessao'/><category term='swing'/><category term='futil'/><category term='jpa 2'/><category term='open source'/><category term='jpcsp'/><category term='escalabilidade'/><category term='external dsl'/><category term='spring'/><category term='nintendo'/><category term='link'/><category term='firmware'/><category term='assinatura digital'/><category term='cio'/><category term='performance'/><category term='entrevista'/><category term='busca textual'/><category term='processo'/><category term='future'/><category term='modismos'/><category term='apartidarismo'/><category term='refactoring'/><category term='engine text'/><category term='schip8'/><category term='C#3.0'/><category term='piada'/><category term='jtableannotations'/><category term='brick'/><category term='metodologia agil'/><category term='freelancer'/><category term='chave privada'/><category term='politico'/><category term='jpa'/><category term='autorizacao'/><category term='ambiente desenvolvimento'/><category term='martin fowler'/><category term='ubiquitous language'/><category term='fun'/><category term='reuso'/><category term='release'/><category term='modelagem'/><category term='exploit'/><category term='google app engine'/><category term='url'/><category term='javaserver faces 2'/><category term='jsf 2'/><category term='domain-driven design'/><category term='javascript'/><category term='cache'/><category term='boas praticas'/><category term='collection'/><category term='gnu'/><category term='evento'/><category term='autenticacao'/><category term='desenvolvimento'/><category term='myfaces orchestra'/><category term='concorrencia'/><category term='testes unitarios'/><category term='download'/><category term='itnernal dsl'/><category term='unit test'/><category term='opengl'/><category term='domain-specific language'/><category term='emulador'/><category term='complemento de dois'/><category term='internet'/><category term='script'/><category term='jogl'/><category term='fora'/><category term='caelum day'/><category term='ti'/><category term='test-driven development'/><category term='deploy'/><category term='linux'/><category term='hibernate'/><category term='cvs'/><category term='dsl externa'/><category term='2d'/><category term='tutorial'/><category term='lucene'/><category term='wii'/><category term='games'/><category term='livro'/><category term='fragmental'/><category term='happy'/><category term='jvm'/><category term='fluent interface'/><category term='brazil'/><category term='algoritmo'/><category term='infoq'/><category term='cache distribuido'/><category term='oo'/><category term='gerador código'/><category term='boot2'/><category term='consoles'/><category term='rio de janeiro'/><category term='psp'/><title type='text'>A arte de desenvolver, entender e manter sistemas</title><subtitle type='html'>Software, distribuindo informação.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://archsofty.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3760273245894556929/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://archsofty.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/3760273245894556929/posts/default?start-index=101&amp;max-results=100'/><author><name>Arquiteto De Software</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>102</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-3760273245894556929.post-6964186783067572671</id><published>2011-04-20T14:21:00.000-07:00</published><updated>2011-04-20T14:21:02.047-07:00</updated><title type='text'>Novo blog - www.leandromoreira.com.br</title><content type='html'>&lt;div style="text-align: justify;"&gt;Não estou abandonando este blog (eu espero) mas agora também estou postando em um outro blog o &lt;a href="http://www.leandromoreira.com.br/"&gt;Leandro Moreira&lt;/a&gt; lá pretendo escrever e abordar assuntos de desenvolvimento de sistemas do mesmo modo que aqui só que em inglês. :)&amp;nbsp;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3760273245894556929-6964186783067572671?l=archsofty.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://archsofty.blogspot.com/feeds/6964186783067572671/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3760273245894556929&amp;postID=6964186783067572671' title='3 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3760273245894556929/posts/default/6964186783067572671'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3760273245894556929/posts/default/6964186783067572671'/><link rel='alternate' type='text/html' href='http://archsofty.blogspot.com/2011/04/novo-blog-wwwleandromoreiracombr.html' title='Novo blog - www.leandromoreira.com.br'/><author><name>Leandro</name><uri>http://www.blogger.com/profile/09724892719833243149</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3760273245894556929.post-5954689293592257336</id><published>2011-04-07T19:44:00.000-07:00</published><updated>2011-04-07T19:44:22.442-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='testes unitarios'/><category scheme='http://www.blogger.com/atom/ns#' term='test-driven development'/><category scheme='http://www.blogger.com/atom/ns#' term='tdd'/><category scheme='http://www.blogger.com/atom/ns#' term='testes'/><title type='text'>A experiência do TDD na vida de um desenvolvedor</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://www.softwareagility.gr/userfiles/image/sTEyF.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="200" src="http://www.softwareagility.gr/userfiles/image/sTEyF.jpg" width="163" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;span class="Apple-style-span" style="color: red; font-size: x-large;"&gt;&lt;b&gt;Pré-TDD&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Um &lt;b&gt;pouco &lt;a href="http://www.visitcumbria.com/photos/ostrich-0776.jpg"&gt;cético&lt;/a&gt;&lt;/b&gt; quanto ao processo &lt;b&gt;mas estudando e lendo opiniões que fazem sentido&lt;/b&gt;, logo você "compra" a ideia. No inicio &lt;b&gt;escreve-se os testes depois&lt;/b&gt; que (quase) tudo foi feito e o pior é &lt;b&gt;o vício de escreve-los para que os mesmos funcionem&lt;/b&gt;. Nessa fase &lt;b&gt;não se vê nem o beneficio&lt;/b&gt; real que os testes unitários trazem (nem mesmo &lt;a href="http://improveit.com.br/xp/praticas/tdd/"&gt;a "metodologia" TDD&lt;/a&gt; traz). As &lt;b&gt;perguntas mais&amp;nbsp;freqüentes&lt;/b&gt; nessa era são:&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Devo testar os CRUD's? Devo testar &lt;a href="http://blog.caelum.com.br/nao-aprender-oo-getters-e-setters/"&gt;Getters and Setters simples&lt;/a&gt;?&lt;/div&gt;&lt;b&gt;Sintomas:&lt;/b&gt; perdendo tempo escrevendo testes (pós-testes)&lt;br /&gt;&lt;b&gt;Ferramentas que conhece:&lt;/b&gt; &lt;a href="http://www.junit.org/"&gt;JUnit&lt;/a&gt;&amp;nbsp;&amp;nbsp;:(&lt;br /&gt;Prefere criar um &lt;span class="Apple-style-span" style="background-color: black; color: white;"&gt;public static void main(String[] args)&lt;/span&gt; e usar &lt;b&gt;Alt+Shift+X &amp;nbsp; &amp;nbsp; + &amp;nbsp; &amp;nbsp;J&lt;/b&gt;&amp;nbsp;ao criar uma &lt;span class="Apple-style-span" style="background-color: black; color: white;"&gt;ClasseTest&lt;/span&gt; com um método anotado com &lt;a href="http://kentbeck.github.com/junit/javadoc/latest/org/junit/Test.html"&gt;@Test&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="color: #274e13;"&gt;Pós-TDD&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Você (realmente) &lt;b&gt;sente inseguro&lt;/b&gt; quanto olha pra &lt;b&gt;massa de testes&lt;/b&gt; e vê que novas (ou antigas) funcionalidades &lt;b&gt;não estão sendo testadas&lt;/b&gt;, de alguma forma não ter os testes te causa uma sensação terrível de que está faltando algo. Suas &lt;b&gt;idéias nascem pensando em testes&lt;/b&gt; (indo para &lt;a href="http://pt.wikipedia.org/wiki/Behavior_Driven_Development"&gt;BDD&lt;/a&gt;) você muda mesmo a forma de pensar.&amp;nbsp;Você (realmente) sabe do &lt;b&gt;valor inestimável de se ter testes para rodar antes de um build&lt;/b&gt;. Começa a achar estranho o &lt;b&gt;desaparecimento de bugs esporádicos&lt;/b&gt;. Tem toda &lt;b&gt;certeza que quase todo&lt;/b&gt; pedaço de &lt;b&gt;código pode gerar bug&lt;/b&gt; inesperado.&amp;nbsp;&lt;b&gt;Ferramentas que&lt;/b&gt; já conhece e &lt;b&gt;não vive sem&lt;/b&gt; : &lt;a href="http://mockito.org/"&gt;Mockito&lt;/a&gt;, &lt;a href="http://maven.apache.org/"&gt;Maven&lt;/a&gt;, &lt;a href="http://hudson-ci.org/"&gt;Hudson&lt;/a&gt;... &amp;nbsp;&lt;b&gt;Ferramentas&lt;/b&gt; que começam a despertar seu &lt;b&gt;interesse&lt;/b&gt;: &lt;a href="http://jbehave.org/"&gt;JBehave&lt;/a&gt;, &lt;a href="http://seleniumhq.org/"&gt;Selenium&lt;/a&gt;. Claro que algumas dessas ferramentas não estão ligadas diretamente ao TDD mas sim ao modo de pensar em testes e automação dos mesmos. &lt;a href="http://pt.wikipedia.org/wiki/Teste_de_software"&gt;Testes de software&lt;/a&gt; é algo complexo, extenso e sempre em evolução mas é uma &lt;b&gt;maneira eficiente&lt;/b&gt; de &lt;b&gt;diminuir os erros&lt;/b&gt; na criação ou manutenção de software.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;span class="Apple-style-span" style="color: blue; font-size: x-large;"&gt;&lt;b&gt;Materiais para ajudá-lo na busca pelo TDD&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;Link:&amp;nbsp;&lt;a href="http://improveit.com.br/xp/praticas/tdd/"&gt;http://improveit.com.br/xp/praticas/tdd/&lt;/a&gt;&lt;br /&gt;Livro: &lt;a href="http://www.amazon.com/Test-Driven-Development-Kent-Beck/dp/0321146530"&gt;TDD by example&lt;/a&gt;&amp;nbsp;(&lt;a href="http://www.livrariacultura.com.br/scripts/cultura/resenha/resenha.asp?nitem=5094527&amp;amp;sid=62497119813315517451920139&amp;amp;k5=177204E&amp;amp;uid="&gt;traduzido para pt_BR&lt;/a&gt;)&lt;br /&gt;&lt;br /&gt;só pra lembrar:&amp;nbsp;&lt;span class="Apple-style-span" style="background-color: black;"&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="color: red;"&gt;test fails&lt;/span&gt;, &lt;span class="Apple-style-span" style="color: lime;"&gt;test passes&lt;/span&gt;, &lt;span class="Apple-style-span" style="color: #cfe2f3;"&gt;refactor&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3760273245894556929-5954689293592257336?l=archsofty.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://archsofty.blogspot.com/feeds/5954689293592257336/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3760273245894556929&amp;postID=5954689293592257336' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3760273245894556929/posts/default/5954689293592257336'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3760273245894556929/posts/default/5954689293592257336'/><link rel='alternate' type='text/html' href='http://archsofty.blogspot.com/2011/04/experiencia-do-tdd-na-vida-de-um.html' title='A experiência do TDD na vida de um desenvolvedor'/><author><name>Leandro</name><uri>http://www.blogger.com/profile/09724892719833243149</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3760273245894556929.post-4755479795387357455</id><published>2011-03-16T06:17:00.001-07:00</published><updated>2011-03-17T11:55:45.733-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='richfaces 4.0'/><category scheme='http://www.blogger.com/atom/ns#' term='ddd'/><category scheme='http://www.blogger.com/atom/ns#' term='maven'/><category scheme='http://www.blogger.com/atom/ns#' term='open source'/><category scheme='http://www.blogger.com/atom/ns#' term='crud'/><category scheme='http://www.blogger.com/atom/ns#' term='jsf 2'/><category scheme='http://www.blogger.com/atom/ns#' term='framework'/><category scheme='http://www.blogger.com/atom/ns#' term='spring 3'/><category scheme='http://www.blogger.com/atom/ns#' term='jpa 2'/><category scheme='http://www.blogger.com/atom/ns#' term='wetsand'/><category scheme='http://www.blogger.com/atom/ns#' term='gerador código'/><category scheme='http://www.blogger.com/atom/ns#' term='domain-driven design'/><title type='text'>Novo projeto WetSand</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://code.google.com/p/wetsand/"&gt;&lt;img style="float: left; margin: 0pt 10px 10px 0pt; cursor: pointer; width: 85px; height: 55px;" src="http://code.google.com/p/wetsand/logo?cct=0" alt="" border="0" /&gt;&lt;/a&gt;&lt;span style="font-size:180%;"&gt;O que estive fazendo...&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Estou tentando reduzir meus (re)trabalhos para criação de &lt;a href="http://pt.wikipedia.org/wiki/CRUD"&gt;CRUD&lt;/a&gt;'s. O resultado desse esforço é a ideia de criar um framework pra aumentar a produtividade na criação de CRUDS. O conceito principal é que você tem uma API e pode provê várias implementações para essa API (&lt;a href="http://code.google.com/p/wetsand/source/browse/trunk/wetsand/w0/"&gt;W0)&lt;/a&gt;. Isso tudo não é  nenhuma novidade, apenas minha tentativa de padronizar a criação de CRUDS.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:180%;"&gt;&lt;a href="http://code.google.com/p/wetsand/"&gt;WetSand&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;É o conjunto de projetos para criação de aplicações que vão inevitavelmente ter CRUDs.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://code.google.com/p/wetsand/source/browse/trunk/wetsand/w0/"&gt;&lt;span style="color: rgb(0, 0, 102); font-weight: bold;font-size:130%;" &gt;W0 - A API base&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;A arquitetura básica está toda nesse projeto, que é fortemente baseado nos conceitos de &lt;a href="http://blog.fragmental.com.br/2007/06/22/cuidado-com-domain-driven-design/"&gt;Domain-Driven Design (DDD)&lt;/a&gt;. Infelizmente o conceito de &lt;a href="http://blog.fragmental.com.br/2007/10/15/arquitetos-mcdonalds/"&gt;arquitetura de referência&lt;/a&gt; é empregado aqui, engessar sua aplicação tem vários efeitos colaterais e más implicações mas foi o &lt;span style="font-weight: bold;"&gt;jeito que encontrei &lt;/span&gt;de "criar" uma estrutura, até certo ponto flexível, &lt;span style="font-weight: bold;"&gt;para servir genericamente&lt;/span&gt; para isso. Resumidamente um arquitetura de referência te força a usar a mesma estrutura para matar uma "barrata" e matar uma "baleia" &lt;span style="font-weight: bold;"&gt;por outro lado&lt;/span&gt; há uma &lt;span style="font-weight: bold;"&gt;padronização de interfaces e mensagens entre os componentes&lt;/span&gt;, o que para a criação de CRUD's pode ajudar muito.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 102);font-size:130%;" &gt;W1 - Primeira implementação &lt;a href="http://jcp.org/en/jsr/detail?id=317"&gt;JPA 2.0&lt;/a&gt;, &lt;a href="http://www.springsource.com/developer/spring"&gt;Spring 3.x.x&lt;/a&gt;, &lt;a href="http://javaserverfaces.java.net/"&gt;JSF 2.0&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Para ter mesmo certeza que tal API poderá ser útil, trabalho na primeira implementação dessa API. Essa implementação utiliza JPA 2.0, Spring 3.x.x, JSF 2.0 e &lt;a href="http://www.primefaces.org/downloads.html"&gt;Primefaces 2.2.1&lt;/a&gt; dentre suas dependências. Foram criados os subprojetos:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://code.google.com/p/wetsand/source/browse/trunk/wetsand/w10/"&gt;W10&lt;/a&gt; - A implementação para os Dao's (&lt;a href="http://code.google.com/p/wetsand/source/browse/trunk/wetsand/w0/src/main/java/com/google/code/wetsand/api/dao/CrudDao.java"&gt;CrudDao&lt;/a&gt;) baseada no JPA 2.0 bem como a implementação da API &lt;a href="http://code.google.com/p/wetsand/source/browse/trunk/wetsand/w0/src/main/java/com/google/code/wetsand/api/repository/Query.java"&gt;Query&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;&lt;a href="http://code.google.com/p/wetsand/source/browse/trunk/wetsand/w11/"&gt;W11&lt;/a&gt; - A implementação base para o &lt;a href="http://code.google.com/p/wetsand/source/browse/trunk/wetsand/w0/src/main/java/com/google/code/wetsand/api/repository/CrudRepository.java"&gt;CrudRepository&lt;/a&gt;.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://code.google.com/p/wetsand/source/browse/trunk/wetsand/w12/"&gt;W12&lt;/a&gt; - A implementação base para o &lt;a href="http://code.google.com/p/wetsand/source/browse/trunk/wetsand/w0/src/main/java/com/google/code/wetsand/api/service/CrudService.java"&gt;CrudService&lt;/a&gt;.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://code.google.com/p/wetsand/source/browse/trunk/wetsand/w13/"&gt;W13&lt;/a&gt; - A implementação base para o &lt;a href="http://code.google.com/p/wetsand/source/browse/trunk/wetsand/w0/src/main/java/com/google/code/wetsand/api/controller/ManagedBeanCrudController.java"&gt;ManagedBeanCrudController&lt;/a&gt; que é uma especificação do controlador mais genérico &lt;a href="http://code.google.com/p/wetsand/source/browse/trunk/wetsand/w0/src/main/java/com/google/code/wetsand/api/controller/CrudController.java"&gt;CrudController&lt;/a&gt;.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-size:180%;"&gt;Em que pé anda...&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;O projeto exemplo já está rodando mas ainda considero longe de uso em produção ou algo assim, está na fase de evolução. Logo, toda e qualquer sugestão ou crítica será bem vinda. Penso em &lt;span style="font-weight: bold;"&gt;criar implementações compatíveis para  &lt;a href="http://community.jboss.org/wiki/RichFaces40ReleaseCenter"&gt;Richfaces 4.0&lt;/a&gt;, &lt;/span&gt;&lt;a style="font-weight: bold;" href="http://vraptor.caelum.com.br/"&gt;VRaptor 3&lt;/a&gt;&lt;span style="font-weight: bold;"&gt;, &lt;/span&gt;&lt;a style="font-weight: bold;" href="http://code.google.com/appengine/"&gt;GAE&lt;/a&gt;&lt;span style="font-weight: bold;"&gt; e &lt;/span&gt;&lt;a style="font-weight: bold;" href="http://code.google.com/webtoolkit/"&gt;GWT&lt;/a&gt; para realmente testar se é possível que essa API e suas implementações possam diminuir o retrabalho de CRUDS. Também há um &lt;a href="http://code.google.com/p/wetsand/source/browse/trunk/wetsand/w1generator/"&gt;gerador de CRUD&lt;/a&gt; mas esse é bem específico e a única implementação que tem é para o W1X.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:180%;"&gt;Enfim&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Se o projeto não servir de nada &lt;/span&gt;talvez ele sirva de &lt;span style="font-weight: bold;"&gt;exemplo de como&lt;/span&gt; construir &lt;span style="font-weight: bold;"&gt;telas usando JSF 2.0&lt;/span&gt;, &lt;span style="font-weight: bold;"&gt;components do facelets&lt;/span&gt;, usar o &lt;span style="font-weight: bold;"&gt;primefaces&lt;/span&gt;, utilizar o &lt;span style="font-weight: bold;"&gt;Spring 3.x.x juntamente com JPA 2.0,&lt;/span&gt; bem como &lt;span style="font-weight: bold;"&gt;Maven&lt;/span&gt; e outras boas práticas de "novas" tecnologias. Logo terá uma &lt;span style="font-weight: bold;"&gt;documentação básica&lt;/span&gt; com um &lt;span style="font-weight: bold;"&gt;Quick Start e demonstração de exemplos&lt;/span&gt;.&lt;br /&gt;&lt;/div&gt;&lt;span style="font-size:130%;"&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3760273245894556929-4755479795387357455?l=archsofty.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://archsofty.blogspot.com/feeds/4755479795387357455/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3760273245894556929&amp;postID=4755479795387357455' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3760273245894556929/posts/default/4755479795387357455'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3760273245894556929/posts/default/4755479795387357455'/><link rel='alternate' type='text/html' href='http://archsofty.blogspot.com/2011/03/novo-projeto-wetsand.html' title='Novo projeto WetSand'/><author><name>Leandro</name><uri>http://www.blogger.com/profile/09724892719833243149</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3760273245894556929.post-2330558385304879534</id><published>2011-01-04T03:51:00.000-08:00</published><updated>2011-01-05T16:16:10.256-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ps3'/><category scheme='http://www.blogger.com/atom/ns#' term='firmware'/><category scheme='http://www.blogger.com/atom/ns#' term='wii'/><category scheme='http://www.blogger.com/atom/ns#' term='falha'/><category scheme='http://www.blogger.com/atom/ns#' term='chaos computer club'/><category scheme='http://www.blogger.com/atom/ns#' term='chave privada'/><category scheme='http://www.blogger.com/atom/ns#' term='algoritmo'/><category scheme='http://www.blogger.com/atom/ns#' term='consoles'/><category scheme='http://www.blogger.com/atom/ns#' term='assinatura digital'/><category scheme='http://www.blogger.com/atom/ns#' term='seguranca'/><category scheme='http://www.blogger.com/atom/ns#' term='hacking'/><title type='text'>Segurança, CCC, Assinatura digital, Consoles...</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.ccc.de/images/header.png?1257022543"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 484px; height: 119px;" src="http://www.ccc.de/images/header.png?1257022543" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;O &lt;a href="http://www.ccc.de/"&gt;CCC - Chaos Computer Club&lt;/a&gt; promoveu, esse ano, um &lt;a href="http://events.ccc.de/"&gt;evento&lt;/a&gt; que mostrou muitos fatos interessantes. Em uma das apresentações o grupo  &lt;a href="http://fail0verflow.com/"&gt;fail0verflow&lt;/a&gt;  demonstrou um pouco da história das falhas de segurança nos consoles da nova geração (Wii, Xbox 360, PS3). E foi interessante ver o modelo de segurança do PS3 e como eles desvendaram as chaves privadas do mesmo, eu só conhecia bem superficialmente o &lt;a href="http://wiibrew.org/wiki/Wii_Security"&gt;modelo de segurança do Wii&lt;/a&gt;. Se você interessa por segurança, consoles e hacking é uma ótima apresentação.&lt;br /&gt;&lt;br /&gt;&lt;object width="640" height="385"&gt;&lt;param name="movie" value="http://www.youtube.com/v/hcbaeKA2moE?fs=1&amp;amp;hl=pt_BR"&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;embed src="http://www.youtube.com/v/hcbaeKA2moE?fs=1&amp;amp;hl=pt_BR" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="640" height="385"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;a href="http://www.youtube.com/watch?v=hcbaeKA2moE"&gt;http://www.youtube.com/watch?v=hcbaeKA2moE&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(51, 51, 255);"&gt;[update]&lt;/span&gt;&lt;span style="color: rgb(51, 51, 255);"&gt; &lt;span style="color: rgb(0, 0, 102);"&gt;- Parece que &lt;/span&gt;&lt;/span&gt;&lt;a style="color: rgb(0, 0, 102);" href="http://psx-scene.com/forums/f6/psp-now-also-open-console-developers-74290/"&gt;a chave do PSP estava "dentro" do PS3&lt;/a&gt;&lt;span style="color: rgb(0, 0, 102);"&gt; agora tanto a cena do PSP e PS3 podem, teoricamente, escrever e rodar código dentro das plataformas da sony.&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="color: rgb(0, 0, 102);"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="color: rgb(0, 0, 102);"&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 255); font-weight: bold; "&gt;[update]&lt;/span&gt; - Baixe a &lt;a href="http://events.ccc.de/congress/2010/Fahrplan/attachments/1780_27c3_console_hacking_2010.pdf"&gt;apresentação do evento&lt;/a&gt;. A &lt;a href="http://www.bbc.co.uk/news/technology-12116051"&gt;BBC também noticiou o fato da descoberta do conjunto de chaves&lt;/a&gt; que a Sony usa para o PS3 e PSP.&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3760273245894556929-2330558385304879534?l=archsofty.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://archsofty.blogspot.com/feeds/2330558385304879534/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3760273245894556929&amp;postID=2330558385304879534' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3760273245894556929/posts/default/2330558385304879534'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3760273245894556929/posts/default/2330558385304879534'/><link rel='alternate' type='text/html' href='http://archsofty.blogspot.com/2011/01/seguranca-ccc-assinatura-digital.html' title='Segurança, CCC, Assinatura digital, Consoles...'/><author><name>Leandro</name><uri>http://www.blogger.com/profile/09724892719833243149</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3760273245894556929.post-3325895551121008780</id><published>2010-11-04T05:30:00.000-07:00</published><updated>2010-11-04T07:24:50.328-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='jsf 2'/><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='seo'/><category scheme='http://www.blogger.com/atom/ns#' term='jpa'/><category scheme='http://www.blogger.com/atom/ns#' term='novidades'/><category scheme='http://www.blogger.com/atom/ns#' term='freelancer'/><category scheme='http://www.blogger.com/atom/ns#' term='richfaces'/><category scheme='http://www.blogger.com/atom/ns#' term='google'/><category scheme='http://www.blogger.com/atom/ns#' term='jsf'/><title type='text'>A prática do SEO e os resultados</title><content type='html'>&lt;div style="text-align: justify;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.seobrasilis.com/MyImages/seo-blocks.gif"&gt;&lt;img style="float: left; margin: 0pt 10px 10px 0pt; cursor: pointer; width: 282px; height: 217px;" src="http://www.seobrasilis.com/MyImages/seo-blocks.gif" alt="" border="0" /&gt;&lt;/a&gt;Apesar de ter um trabalho fixo; hora ou outra também executo trabalhos &lt;a href="http://archsofty.blogspot.com/2010/03/freelancer-java-tive-bons-resultados.html"&gt;freelancer java&lt;/a&gt;. E ultimamente as propostas de trabalho tem aumentado consideravelmente. E esse aumento se deve (na maioria absoluta) ao uso de um conjunto de técnicas (e ou estratégias) &lt;a href="http://pt.wikipedia.org/wiki/Otimiza%C3%A7%C3%A3o_para_motores_de_busca"&gt;SEO&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;É impressionante o quanto o google pode lhe dar retorno com um bom posicionamento, e digo isso baseado apenas no lucro que obtive em pequenos trabalhos ou ajuda (consultória) em &lt;span style="font-weight: bold;"&gt;Java, Richfaces, JSF, JPA&lt;/span&gt; enfim...&lt;br /&gt;&lt;br /&gt;Por isso e outros fatores noto que a propaganda paga ao google é um investimento que tem retorno garantido. Só pra esclarecer não tenho nenhum vinculo com google (empregatício porque de uso muito de seus serviços).&lt;br /&gt;&lt;br /&gt;Para se ter uma ideia, se você procurar por &lt;a href="http://www.google.com.br/search?q=freelancer+java"&gt;freelancer java&lt;/a&gt; no google, o blog vem em 5º lugar (claro esse posicionamento vai se atualizar) e com esse "5º lugar" noto que a diferença de divulgação por email, forum e etc é extremamente irrisória se comparada ao jeito google de ser.&lt;br /&gt;&lt;br /&gt;Portanto fica aqui a dica se não conhece vale a pena dar uma estudadinha em SEO e suas consequências.&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3760273245894556929-3325895551121008780?l=archsofty.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://archsofty.blogspot.com/feeds/3325895551121008780/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3760273245894556929&amp;postID=3325895551121008780' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3760273245894556929/posts/default/3325895551121008780'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3760273245894556929/posts/default/3325895551121008780'/><link rel='alternate' type='text/html' href='http://archsofty.blogspot.com/2010/11/pratica-do-seo-e-os-resultados.html' title='A prática do SEO e os resultados'/><author><name>Leandro</name><uri>http://www.blogger.com/profile/09724892719833243149</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3760273245894556929.post-8406073020414208917</id><published>2010-08-10T12:10:00.000-07:00</published><updated>2010-08-17T12:18:32.622-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='projeto oo'/><category scheme='http://www.blogger.com/atom/ns#' term='design'/><category scheme='http://www.blogger.com/atom/ns#' term='jsf'/><category scheme='http://www.blogger.com/atom/ns#' term='modelagem'/><category scheme='http://www.blogger.com/atom/ns#' term='projeto de software'/><category scheme='http://www.blogger.com/atom/ns#' term='refatoração'/><category scheme='http://www.blogger.com/atom/ns#' term='boas praticas'/><category scheme='http://www.blogger.com/atom/ns#' term='caelum'/><category scheme='http://www.blogger.com/atom/ns#' term='padrões'/><category scheme='http://www.blogger.com/atom/ns#' term='arquitetura'/><category scheme='http://www.blogger.com/atom/ns#' term='oo'/><category scheme='http://www.blogger.com/atom/ns#' term='programacao'/><category scheme='http://www.blogger.com/atom/ns#' term='domain-driven design'/><category scheme='http://www.blogger.com/atom/ns#' term='fragmental'/><title type='text'>Decisões de design - Herança X Composição</title><content type='html'>&lt;div style="text-align: justify;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.puzzlingpuzzles.com.au/IMAGES%20UPDATE/MagicCube5x5.jpg"&gt;&lt;img style="float: left; margin: 0pt 10px 10px 0pt; cursor: pointer; width: 163px; height: 160px;" src="http://www.puzzlingpuzzles.com.au/IMAGES%20UPDATE/MagicCube5x5.jpg" alt="" border="0" /&gt;&lt;/a&gt;Mesmo que esse assunto pareça já explorado de todas as formas ainda há certas situações que relutamos (pelos menos eu) em usar a &lt;a href="http://blog.caelum.com.br/2006/10/14/como-nao-aprender-orientacao-a-objetos-heranca/"&gt;herança ao invés da composição&lt;/a&gt;.&lt;br /&gt;Invejando descaradamente o &lt;a href="http://fragmental.tw/category/everyday-tales/"&gt;conto de cada dia&lt;/a&gt; do &lt;a href="http://blog.fragmental.com.br/"&gt;Phillip&lt;/a&gt; &lt;img style="width: 29px; height: 29px;" alt="http://images.americanas.com.br/produtos/item/2508/8/2508843gg.jpg" src="http://images.americanas.com.br/produtos/item/2508/8/2508843gg.jpg" /&gt;. Vou contar de uma experiência que tive. O exemplo clássico é o controlador CRUD (seja seu servelet, managed bean, action form... ) que contém os métodos para uso geral e genérico e alguns ganchos. Vou dar um exemplo bem simples de um Managed Bean CRUD.&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;public class ManagedBeanCRUD [E,ID]{&lt;br /&gt;private E instancia;&lt;br /&gt;public E getInstancia(){return instancia;}&lt;br /&gt;public Void setInstancia(E entidade){this.instancia = entidade;}&lt;br /&gt;&lt;br /&gt;public String salvar(){&lt;br /&gt;preSalvar();&lt;br /&gt;servicoCrud.salvar(getInstancia);&lt;br /&gt;return "navegacaoListar";&lt;br /&gt;}&lt;br /&gt;public void preSalvar(){}&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;E apartir desse MB crio os meus outros CRUDS simples, exemplo telefone:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;public class TelefoneMB extends ManagedBeanCRUD [Telefone, Integer] {&lt;br /&gt;@Override&lt;br /&gt;public void preSalvar(){&lt;br /&gt;System.out.println("Oi esse é gancho ...");&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Ótimo, houve reuso por meio da herança mas logo veio as seguintes perguntas: p&lt;span style="color: rgb(0, 0, 153);"&gt;orque não transformou os métodos &lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 153);"&gt;preXXX&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt; em métodos abstratos?&lt;/span&gt; Porque daí eu teria que obrigar o usuário a implementar sempre mesmo quando não fosse necessário. &lt;span style="color: rgb(0, 0, 102);"&gt;porque não usou composição ao invés da herança?&lt;/span&gt; Porque minha visão (xhtml) já está toda padronizada.&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 102); font-weight: bold;"&gt;[c:campoentrada binding="#{mb.instancia.numero}"/]&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 102); font-weight: bold;"&gt;[c:botao binding="#{mb.salvar}"/]&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Note que o método salvar não existe (ao menos no fonte) na classe TelefoneMB ele é acessado por herança. A primeira tentativa foi substituir a herança por composição por meio de delegação, minha classe TelefoneMB ficaria mais ou menos assim:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;public class TelefoneMB{&lt;br /&gt;private ManagedBeanCRUD[Telefone, Integer] delegate;&lt;br /&gt;public String salvar(){&lt;br /&gt; return delegate.salvar();&lt;br /&gt;}&lt;br /&gt;// + do mesmo&lt;br /&gt;}&lt;/pre&gt;Mas será que não pode ser melhorado?!&lt;br /&gt;&lt;br /&gt;Claro que sim até agora consegui chegar num patamar assim: os métodos ganchos se transformam no padrão &lt;a href="http://www.javabeat.net/tips/129-decorator-design-pattern.html"&gt;decorator&lt;/a&gt; e a herança se torna composição por delegação mas de um modo diferente, fiz o MangedBeanCRUD ser um atributo de leitura :&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;public class TelefoneMB{&lt;br /&gt;private ManagedBeanCRUD[Telefone, Integer] crud;&lt;br /&gt;&lt;br /&gt;public TelefoneMB(){&lt;br /&gt;   crud.addEventoPreSalvar(new Evento(){&lt;br /&gt;            public void executar(){&lt;br /&gt;                System.out.println("antes de salvar...");&lt;br /&gt;            }&lt;br /&gt;   });&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public ManagedBeanCRUD getCrud(){&lt;br /&gt;   return crud;&lt;br /&gt;}&lt;br /&gt;}&lt;/pre&gt;E na view (jsf, xhtml ...) não terei muita mudança será uma navegação a mais na #EL   #{telefonemb.&lt;span style="font-weight: bold;"&gt;crud&lt;/span&gt;.salvar} terei que adicionar o crud antes do padrão CRUD de ser.&lt;br /&gt;&lt;br /&gt;Com isso tenho um managed bean livre de más práticas, melhorei o sistema de eventos e mais um plus não terei problemas futuros com proxies do JDK ou GLIB2! Mais camadas e indireções sempre foi o caminho conforme post sobre &lt;a href="http://fragmental.tw/2010/08/17/thoughts-on-abstractions-part-1-%E2%80%93-abstractions-everywhere/"&gt;abstrações pra todo lado&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Todo comentário sempre é e será bem-vindo!&lt;br /&gt;&lt;br /&gt;ps: &lt;span style="font-style: italic;"&gt;só pra deixar claro não sou contra o uso da herança, há casos que você pode usar &lt;/span&gt;&lt;a style="font-style: italic;" href="http://ambientinformatica.servehttp.com:443/xwiki/bin/view/Blog/Heranca+com+Jpa"&gt;herança para compor suas entidades&lt;/a&gt;&lt;span style="font-style: italic;"&gt; e outros n usos. O único cuidado que deve ter é pensar, pensar, pensar e pensar para &lt;/span&gt;&lt;a style="font-style: italic;" href="http://edgarddavidson.com/?p=30"&gt;decidir se é herança ou não&lt;/a&gt;&lt;span style="font-style: italic;"&gt;.&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3760273245894556929-8406073020414208917?l=archsofty.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://archsofty.blogspot.com/feeds/8406073020414208917/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3760273245894556929&amp;postID=8406073020414208917' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3760273245894556929/posts/default/8406073020414208917'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3760273245894556929/posts/default/8406073020414208917'/><link rel='alternate' type='text/html' href='http://archsofty.blogspot.com/2010/08/decisoes-de-design-heranca-x-composicao.html' title='Decisões de design - Herança X Composição'/><author><name>Leandro</name><uri>http://www.blogger.com/profile/09724892719833243149</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3760273245894556929.post-9172189546773703080</id><published>2010-07-13T05:12:00.000-07:00</published><updated>2010-07-13T09:09:36.204-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='brick'/><category scheme='http://www.blogger.com/atom/ns#' term='jogos'/><category scheme='http://www.blogger.com/atom/ns#' term='banner bomb'/><category scheme='http://www.blogger.com/atom/ns#' term='nand'/><category scheme='http://www.blogger.com/atom/ns#' term='bootmii'/><category scheme='http://www.blogger.com/atom/ns#' term='gamecube'/><category scheme='http://www.blogger.com/atom/ns#' term='exploit'/><category scheme='http://www.blogger.com/atom/ns#' term='boot2'/><category scheme='http://www.blogger.com/atom/ns#' term='homebrew'/><category scheme='http://www.blogger.com/atom/ns#' term='wii'/><category scheme='http://www.blogger.com/atom/ns#' term='ios'/><category scheme='http://www.blogger.com/atom/ns#' term='nintendo'/><category scheme='http://www.blogger.com/atom/ns#' term='hacking'/><title type='text'>Wii Hacking ;D</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://blogdopseudo.files.wordpress.com/2009/09/nintendo_wii.jpg"&gt;&lt;img style="float: left; margin: 0pt 10px 10px 0pt; cursor: pointer; width: 203px; height: 203px;" src="http://blogdopseudo.files.wordpress.com/2009/09/nintendo_wii.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;span style="font-style: italic; color: rgb(255, 0, 0);"&gt;Primeiramente, pra esclarecer...&lt;/span&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size:130%;"&gt;O que esse post não é?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Um tutorial de como fazer hacking, desbloquear, instalar o homebrew channel...&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;O que é?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Uma visão geral (BEM resumida) sobre a arquitetura do wii, os processos de hacking atuais; enfim, se trata mais de um post de curiosidade do que um manual. :P (quem quiser isso pode ir no  &lt;a href="http://wiiplayersforum.com"&gt;wii players forum&lt;/a&gt; ou &lt;a href="http://gbatemp.net/"&gt;gbatemp&lt;/a&gt;, nesses sites você encontra o melhor e mais atualizado conteúdo sobre wii hacking).&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;Wii Hacking&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;É o ato de tentar hackear a máquina &lt;a href="http://www.nintendo.com/wii"&gt;nintendo Wii&lt;/a&gt; :)&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;Mas pra que hackear o Wii?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Pra essa pergunta há N-respostas que vão desde um simples desejo de rodar programas feitos por você ou outras pessoas (&lt;a href="http://wiibrew.org/wiki/Main_Page"&gt;homebrew&lt;/a&gt; - &lt;span style="font-style: italic;"&gt;código&lt;/span&gt; &lt;span style="font-style: italic;"&gt;não assinados&lt;/span&gt;) até rodar jogos (seus backups) pelo &lt;a href="http://code.google.com/p/usbloader-gui/"&gt;hd usb externo&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;Então como é feito o processo de hacking do Wii?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Como quase todo hacking, baseado nas falhas existentes. Pra melhor entender e explorar o assunto é necessário ter a visão básica de como funciona (bem básico) a pilha de software do Wii.&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 102);"&gt;[Quase sempre vísivel ao usu] - System Menus (4.2U , 3.5K).&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;[Quase sempre invísivel ao usu] - IOS sistemas internos (IOS 222,36).&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(153, 153, 255);"&gt;[Quase nunca vísivel ao usu] - BOOT0, BOOT1 e BOOT2.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;Os &lt;a href="http://pt.wikipedia.org/wiki/Exploit"&gt;Exploits&lt;/a&gt;!&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;O mais famoso (e também antigo, obsoleto, só funciona com system menus até o 3.4...) deles é o que é executado por meio do jogo The Legend of Zelda: Twilight Princess, mas tem o "inconveniente" de que você necessita de ter o jogo (você deveria tê-lo mesmo :P). Se você quiser saber mais sobre esse exploit (criado pelo &lt;a href="http://wiibrew.org/wiki/Team_Twiizers"&gt;Team Twiizers&lt;/a&gt;) leia &lt;a href="http://wiibrew.org/wiki/Twilight_Hack"&gt;Twilight Hack&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Hoje em dia as pessoas utilizam com maior frequência o &lt;span style="font-weight: bold;"&gt;&lt;a href="http://wiibrew.org/wiki/Bannerbomb"&gt;Bannerbomb&lt;/a&gt; &lt;/span&gt;que é um processo bem mais seguro, testado e fácil. Você carrega um SDcard &lt;a href="http://bannerbomb.qoid.us/index.new.php"&gt;com arquivo&lt;/a&gt; compatível com seu system menu e o executa pelo ícone do SDcard.&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://wiibrew.org/w/images/1/13/Bg4545_bannerbomb_Load.png"&gt;&lt;img style="float: left; margin: 0pt 10px 10px 0pt; cursor: pointer; width: 238px; height: 133px;" src="http://wiibrew.org/w/images/1/13/Bg4545_bannerbomb_Load.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;br /&gt;A famosa expressão Brick!&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Há, sempre que se fala desse assunto, um risco ao fazer tais operações. A partir do exploit executado você começa o processo de hacking... isso envolve você 'retirar' algumas IOS que podem lhe 'barrar' de algumas operações, substituir algumas IOS por outras cIOS feitas pela comunidade. Sempre que você alterar essas características você corre o risco. Mas hoje o risco mais é de você atualizar o Wii (pela wifi) para uma versão mais nova do system menu (claro que a nintendo sempre corrige esses bugs, ou tenta) e daí você pode sim ter o Wii invalidado pra sempre. (isso não é brincadeira)&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;E o hacking ... como é feito?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Você executa um dos exploits (por sua conta é total risco, sobre a pena do Bricked Wii)  que normalmente lhe dá condições para que o &lt;a href="http://hbc.hackmii.com/"&gt;HomeBrew Channel&lt;/a&gt; seja instalado. Esse será sua porta pra rodar aplicativos feitos por você ou outras pessoas na Internet. Além do homebrew channel é importante também remover alguns IOS e substituir outros por cIOS. Isso é feito pra que você volte a ter 'bugs' conhecidos e também acesso a dispositivos externos como HD USB. Um fato importante e muito bom de se 'hacker' o wii, é que você pode fazer várias operações que garantem uma vida útil maior e também ferramentas pra recuperação de erros. Backup da NAND pode lhe garantir num futuro uma possível 'restauração' do sistema.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;Ferramentas que normalmente são instaladas&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;HomeBrew Channel&lt;/span&gt; - também conhecido como HBC, é o canal (aparece no menu inicial do Wii) que lhe permite executar aplicativos não assinalados.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;BootMii&lt;/span&gt; - Um conjunto de sistemas que você pode instalar no wii pra lhe oferecer mais 'utilidades' ao aparelho.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Priiloader&lt;/span&gt; - Sistema que fica exatamente entre a sequência de boot e o system menu. Hoje em dia ele é instalado como se fosse um IOS. Ele lhe dá acesso à vários hacks interessantes e úteis, por exemplo: remover a atualização automática, apertar A naquela tela chata de inicio... e claro pode ser sua salvação, caso o venha a Brickar, ele  fornece meios pra você recuperar sua NAND (baseado no seu bkp). Mas ele como IOS não garante 100% de unbrickablility. (Perfeito é quando você consegue, em versões mais antigas do Wii, instala-lo as boot2 aí sim você tem um Wii quase unbrickable, já que você detém o poder do boot :) )&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Multiple WAD Manager&lt;/span&gt; - O famoso MMM é um gerenciador de pacotes de instalação para o Wii ele é essencial. É díficil de usar, a principio, pois sua interface (textual, não gráfica) não ajuda muito. Nele que você instala cIOS (custom IOS), remove IOS, instalar canais...&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-weight: bold;"&gt;ps:&lt;/span&gt; mais uma vez, não mude seu wii sem conhecer o que é feito com ele e sem ter a noção dos riscos ao substiuir IOS's por cIOS's. E claro, sempre assuma os riscos por sua conta. &lt;span style="font-style: italic;"&gt;(&lt;span style="font-weight: bold;"&gt;ps2:&lt;/span&gt; eu, depois de me informar, acho seguro e com possibilidades pequenas [mas ainda existem] de você perder seus wii.)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;E lembre-se há homebrews que valem muito a pena.&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://img691.imageshack.us/img691/39/usbloadergxscreenshotja.png"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 529px; height: 395px;" src="http://img691.imageshack.us/img691/39/usbloadergxscreenshotja.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3760273245894556929-9172189546773703080?l=archsofty.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://archsofty.blogspot.com/feeds/9172189546773703080/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3760273245894556929&amp;postID=9172189546773703080' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3760273245894556929/posts/default/9172189546773703080'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3760273245894556929/posts/default/9172189546773703080'/><link rel='alternate' type='text/html' href='http://archsofty.blogspot.com/2010/07/wii-hacking-d.html' title='Wii Hacking ;D'/><author><name>Leandro</name><uri>http://www.blogger.com/profile/09724892719833243149</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3760273245894556929.post-3656283105284383237</id><published>2010-06-29T11:23:00.000-07:00</published><updated>2010-06-29T11:51:00.562-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='hibernate'/><category scheme='http://www.blogger.com/atom/ns#' term='jpa'/><category scheme='http://www.blogger.com/atom/ns#' term='tutorial'/><category scheme='http://www.blogger.com/atom/ns#' term='cache'/><title type='text'>Habilitando Cache level 2 no JPA 1.0 (Hibernate)</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://community.devexpress.com/blogs/aspnet/image_C/Cheetah-fast.jpg"&gt;&lt;img style="float: left; margin: 0pt 10px 10px 0pt; cursor: pointer; width: 151px; height: 112px;" src="http://community.devexpress.com/blogs/aspnet/image_C/Cheetah-fast.jpg" alt="" border="0" /&gt;&lt;/a&gt;Uma das características prometidas para o &lt;a href="http://jcp.org/en/jsr/detail?id=317"&gt;JPA 2.0&lt;/a&gt; e já implementada no hibernate é &lt;a href="http://www.devx.com/dbzone/Article/29685"&gt;Second Level &lt;/a&gt;cache! Pra habilita-lo é bem simples:&lt;br /&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;Basta informar ao Hibernate (seja pelo persistence.xml ou pelo applicationContext.xml) as seguintes propriedades.&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-weight: bold;"&gt;hibernate.cache.provider_class&lt;/span&gt;=org.hibernate.cache.EhCacheProvider &lt;span style="font-style: italic; color: rgb(51, 0, 153);"&gt;{classe padrão pra prover serviços de cache}&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;hibernate.cache.use_query_cache&lt;/span&gt;=true &lt;span style="font-style: italic; color: rgb(0, 0, 102);"&gt;{se deve ou não fazer caches de queries}&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Lembrando que por padrão você deve configurar entidade a entidade as quais devem ou não serem cacheadas (com a anotação &lt;span style="font-weight: bold;"&gt;@Cache&lt;/span&gt; junto a @Entity, você também pode cachear coleções!) e qual a política (de concorrência) que deve ser usada no esquema de cache (&lt;span style="font-weight: bold;"&gt;NONSTRICT_READ_WRITE, NONE, READ_ONLY, WRITE_ONLY, TRANSACTIONAL&lt;/span&gt;). Depois é só observar pelo log de sql :D! &lt;span style="font-weight: bold;"&gt;Have fun!&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3760273245894556929-3656283105284383237?l=archsofty.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://archsofty.blogspot.com/feeds/3656283105284383237/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3760273245894556929&amp;postID=3656283105284383237' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3760273245894556929/posts/default/3656283105284383237'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3760273245894556929/posts/default/3656283105284383237'/><link rel='alternate' type='text/html' href='http://archsofty.blogspot.com/2010/06/habilitando-cache-level-2-no-jpa-10.html' title='Habilitando Cache level 2 no JPA 1.0 (Hibernate)'/><author><name>Leandro</name><uri>http://www.blogger.com/profile/09724892719833243149</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3760273245894556929.post-7321669877523997936</id><published>2010-05-29T18:32:00.000-07:00</published><updated>2010-05-31T04:55:10.100-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='reflection'/><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='hibernate'/><category scheme='http://www.blogger.com/atom/ns#' term='nosuchfieldexception'/><category scheme='http://www.blogger.com/atom/ns#' term='jpa'/><category scheme='http://www.blogger.com/atom/ns#' term='reflexão'/><title type='text'>NoSuchFieldException no Hibernate (JPA)</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://tell.fll.purdue.edu/JapanProj/FLClipart/Adjectives/headache.gif"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 180px; height: 149px;" src="http://tell.fll.purdue.edu/JapanProj/FLClipart/Adjectives/headache.gif" alt="" border="0" /&gt;&lt;/a&gt;&lt;div style="text-align: justify;"&gt;No padrão &lt;a href="http://java.sun.com/developer/technicalArticles/J2EE/jpa/"&gt;JPA&lt;/a&gt; você pode anotar suas entidades pelos métodos (getters) ou pelos atributos, é um ou exclusivo ou vocÊ anota tudo pelos atributos ou pelos getters. O relato que segue é sobre um código que funcionou muito bem por muito tempo mas que na última sexta feira (28/05/2010) me deu muita dor de cabeça.&lt;br /&gt;&lt;br /&gt;Devido a limitação do &lt;a href="http://java.sun.com/javaee/javaserverfaces/"&gt;JSF&lt;/a&gt; (1.X) quanto a população de combos (o usuário do framework é obrigado a passar uma lista/matriz de SelectItem), eu criei um código para que dado uma lista de objetos, o nome do atributo à ser mostrado (descricao) e o nome do atributo com valor (id) retorna uma matriz de SelectItem.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;API&lt;/span&gt; &lt;span style="color: rgb(0, 0, 102); font-weight: bold;"&gt;SelectItem[] converterListaParaCombo(final List objetos,String attMostrar,String attValor)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;O código é simples; faz um loop nos objetos e vai recuperando os valores dos campos por &lt;a href="http://java.sun.com/docs/books/tutorial/reflect/index.html"&gt;reflexão &lt;/a&gt;e criando objetos do tipo SelectItem e os adicionando na lista/matriz.&lt;br /&gt;&lt;br /&gt;Bem, voltando ao relato. Quase sempre eu usei anotar (JPA Annotations) as entidades nos campos, por boa prática comecei anotar pelos getters.&lt;br /&gt;&lt;br /&gt;Quando fui testar percebi que o método &lt;span style="font-weight: bold;"&gt;converterListaParaCombo&lt;/span&gt; estava lançando a exceção  &lt;a href="http://java.sun.com/j2se/1.4.2/docs/api/java/lang/NoSuchFieldException.html"&gt;NoSuchFieldException&lt;/a&gt;. Dessa vez o log não ajudou quase nada, &lt;a href="http://blog.caelum.com.br/2010/05/27/logar-e-preciso-debugar-nao-e-preciso/"&gt;tive que debugar&lt;/a&gt;... para minha surpressa a lista ia sendo populada normalmente até chegar num objeto (da lista) que não tinha o campo descrição :S. A primeira pergunta: Como isso é possível se eu mesmo declarei o campo na entidade?&lt;br /&gt;&lt;br /&gt;Para responder essa pergunta criei mais um teste sobre a lista de objetos que eu passava para o  método. Mandei (imperativamente) um sysout sobre getId e getDescrição... aqui outra surpresa não houve nenhum erro :S. Numa pesquisa mais profunda sobre o assunto descobri que o hibernate tem "seu modo de fazer cache" que pode causar alguma surpresa para os mais desavisados e na verdade ele nem sempre retorna a sua entidade e sim um proxy {eu pensava&lt;br /&gt;que esse proxy era somente para List}. E um desses proxies "não tinha" o campo descricao...&lt;br /&gt;&lt;br /&gt;Para resolver o problema, eu apenas mudei no método a forma de recuperar os valores. Ao invés&lt;br /&gt;de pegá-los pelo atributos agora pelo pelos &lt;a href="http://commons.apache.org/beanutils/"&gt;métodos getters&lt;/a&gt;. :D &lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3760273245894556929-7321669877523997936?l=archsofty.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://archsofty.blogspot.com/feeds/7321669877523997936/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3760273245894556929&amp;postID=7321669877523997936' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3760273245894556929/posts/default/7321669877523997936'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3760273245894556929/posts/default/7321669877523997936'/><link rel='alternate' type='text/html' href='http://archsofty.blogspot.com/2010/05/nosuchfieldexception-no-hibernate-jpa.html' title='NoSuchFieldException no Hibernate (JPA)'/><author><name>Leandro</name><uri>http://www.blogger.com/profile/09724892719833243149</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3760273245894556929.post-8052332958518207855</id><published>2010-05-07T07:48:00.000-07:00</published><updated>2010-05-07T09:57:54.416-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='javaserver faces'/><category scheme='http://www.blogger.com/atom/ns#' term='myfaces orchestra'/><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='escopo sessao'/><category scheme='http://www.blogger.com/atom/ns#' term='tutorial'/><category scheme='http://www.blogger.com/atom/ns#' term='conversacao'/><category scheme='http://www.blogger.com/atom/ns#' term='exemplo'/><category scheme='http://www.blogger.com/atom/ns#' term='alternativa'/><category scheme='http://www.blogger.com/atom/ns#' term='jboss seam'/><category scheme='http://www.blogger.com/atom/ns#' term='jsf'/><title type='text'>Adicionando escopo de conversação ao JavaServer Faces 1.X (JSF 1.2)</title><content type='html'>&lt;div style="text-align: justify;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://thinkingbrew.files.wordpress.com/2009/04/the_session_logo1.jpg"&gt;&lt;img style="float: left; margin: 0pt 10px 10px 0pt; cursor: pointer; width: 175px; height: 205px;" src="http://thinkingbrew.files.wordpress.com/2009/04/the_session_logo1.jpg" alt="" border="0" /&gt;&lt;/a&gt;Que o JSF não é perfeito &lt;a href="http://ptrthomas.wordpress.com/2009/05/15/jsf-sucks/"&gt;todos sabemos&lt;/a&gt; mas se há algo que me incomoda muito são  duas coisas chatas: &lt;span style="font-weight: bold;"&gt;URL amigáveis &lt;/span&gt;(que consegui &lt;a href="http://archsofty.blogspot.com/2010/04/url-amigaveis-com-javaserver-faces-jsf.html"&gt;resolver facilmente com &lt;/a&gt;&lt;a href="http://ocpsoft.com/prettyfaces/v123/"&gt;PrettyFaces&lt;/a&gt;.) e tratar tudo como escopo de sessão (por falta de um escopo entre o requisição e o sessão).&lt;br /&gt;&lt;br /&gt;Para o último problema começei a pesquisar algumas soluções possíveis e cheguei ao framework &lt;a href="http://myfaces.apache.org/orchestra/"&gt;MyFaces Orchestra&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;O &lt;span style="font-weight: bold;"&gt;MyFaces Orchestra&lt;/span&gt; é um framework que pode ser usado em aplicações web para prover as caracteristicas de escopo conversacional. Apesar de ter sido criado para ser um framework de escopo para web presentations ele tem, hoje, só implementações para JSF 1.1, 1.2 e 2.0.&lt;br /&gt;&lt;br /&gt;Para utilizar o framework você precisa, &lt;span style="font-weight: bold;"&gt;obrigatoriamente&lt;/span&gt;, usar o &lt;a href="http://cagataycivici.wordpress.com/2005/12/25/integrating_jsf_and_spring/"&gt;Spring 2.0 (ou maior) como gerenciador de seus managed beans&lt;/a&gt;. E claro ter os modulos do Orchestra (&lt;a href="http://www.apache.org/dyn/closer.cgi/myfaces/binaries/myfaces-orchestra-core12-1.4.zip"&gt;core12&lt;/a&gt; e o &lt;a href="http://www.apache.org/dyn/closer.cgi/myfaces/binaries/myfaces-orchestra-core15-1.0.zip"&gt;core15&lt;/a&gt; são os usados no exemplo) no seu classpath.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;Exemplo&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Fiz um exemplo utilizando Eclipse juntamente com quarteto fantástico : &lt;span style="font-weight: bold;"&gt;richfaces 3.3.3&lt;/span&gt; +  &lt;span style="font-weight: bold;"&gt;Facelets&lt;/span&gt; + &lt;span style="font-weight: bold;"&gt;spring 3.0.1 &lt;/span&gt;+ &lt;span style="font-weight: bold;"&gt;hibernate 3.0.2&lt;/span&gt;&lt;span style="font-weight: bold;"&gt; (JPA)&lt;/span&gt;! e tive que mudar/configurar os seguintes arquivos:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;web.xml&lt;/span&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153);"&gt; &amp;lt;listener&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;  &amp;lt;listener-class&amp;gt;org.apache.myfaces.orchestra.conversation.servlet.ConversationManagerSessionListener&amp;lt;/listener-class&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153);"&gt; &amp;lt;/listener&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;applicationContext.xml&lt;/span&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 102);"&gt;    &amp;lt;import resource="classpath*:/META-INF/spring-orchestra-init.xml" /&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 102);"&gt;       &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 102);"&gt;    &amp;lt;bean class="org.springframework.beans.factory.config.CustomScopeConfigurer"&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 102);"&gt;      &amp;lt;property name="scopes"&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 102);"&gt;        &amp;lt;map&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 102);"&gt;          &amp;lt;entry key="conversation.manual"&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 102);"&gt;            &amp;lt;bean class="org.apache.myfaces.orchestra.conversation.spring.SpringConversationScope"&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 102);"&gt;              &amp;lt;property name="timeout" value="30" /&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 102);"&gt;              &amp;lt;property name="lifetime" value="manual"/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 102);"&gt;            &amp;lt;/bean&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 102);"&gt;          &amp;lt;/entry&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 102);"&gt;          &amp;lt;entry key="conversation.access"&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 102);"&gt;            &amp;lt;bean class="org.apache.myfaces.orchestra.conversation.spring.SpringConversationScope"&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 102);"&gt;              &amp;lt;property name="timeout" value="30" /&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 102);"&gt;              &amp;lt;property name="lifetime" value="access"/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 102);"&gt;            &amp;lt;/bean&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 102);"&gt;          &amp;lt;/entry&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 102);"&gt;        &amp;lt;/map&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 102);"&gt;      &amp;lt;/property&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 102);"&gt;    &amp;lt;/bean&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;br /&gt;Simplesmente após ter feito tais mudanças e ter atendido aos &lt;span style="font-weight: bold;"&gt;requisitos básicos&lt;/span&gt;: declarei meu bean no applicationContext com &lt;span style="font-weight: bold;"&gt;scope="conversation.access"&lt;/span&gt;. No exemplo naveguei de uma página listar.xhtml para outra editar.xhtml mantendo o estado! Fiz testes posteriores também com uso de Ajax (a4j) com multiplos requests para mesma página ou outra tudo passou perfeito!&lt;br /&gt;&lt;br /&gt;Se quiser ver o projeto &lt;a href="http://www.mediafire.com/?nymj1gmoyde"&gt;baixe aqui o projeto (.war com sources)&lt;/a&gt;!&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;Further Reading!&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;O framework também fornece uma solução (essa eu não testei) para os lazy initializations lançados (esse com integração forte ao hibernate). Há também um esquema de &lt;a href="http://myfaces.apache.org/orchestra/myfaces-orchestra-core/component-bindings.html"&gt;binding&lt;/a&gt; muito legal.&lt;br /&gt;&lt;br /&gt;ps: todo o post está levando em consideração as características do Jsf 1.x o Jsf 2.0 resolve alguns desses empecilhos.&lt;br /&gt;ps2: ainda há algo que me incomoda é a quantidade de linhas no faces-config para lhe dar com navegação entre as páginas.&lt;br /&gt;&lt;a href="http://oglobo.globo.com/fotos/2006/11/14/14_MVG_tec_playstation3.jpg"&gt;ps3&lt;/a&gt;: fiz testes básicos nesse projeto aconselho fazer mais testes reais na sua aplicação antes de substituir session por conversation.&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3760273245894556929-8052332958518207855?l=archsofty.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://archsofty.blogspot.com/feeds/8052332958518207855/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3760273245894556929&amp;postID=8052332958518207855' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3760273245894556929/posts/default/8052332958518207855'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3760273245894556929/posts/default/8052332958518207855'/><link rel='alternate' type='text/html' href='http://archsofty.blogspot.com/2010/05/adicionando-escopo-de-conversacao-ao.html' title='Adicionando escopo de conversação ao JavaServer Faces 1.X (JSF 1.2)'/><author><name>Leandro</name><uri>http://www.blogger.com/profile/09724892719833243149</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3760273245894556929.post-6354588639448916857</id><published>2010-04-28T07:25:00.000-07:00</published><updated>2010-04-28T10:10:20.387-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='jsf 2'/><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='hibernate'/><category scheme='http://www.blogger.com/atom/ns#' term='jpa'/><category scheme='http://www.blogger.com/atom/ns#' term='computação nas nuvens'/><category scheme='http://www.blogger.com/atom/ns#' term='spring'/><category scheme='http://www.blogger.com/atom/ns#' term='tutorial'/><category scheme='http://www.blogger.com/atom/ns#' term='cloud-computing'/><category scheme='http://www.blogger.com/atom/ns#' term='google'/><category scheme='http://www.blogger.com/atom/ns#' term='escalabilidade'/><category scheme='http://www.blogger.com/atom/ns#' term='google app engine'/><category scheme='http://www.blogger.com/atom/ns#' term='gae'/><title type='text'>Integrando google app engine (GAE) + Spring 3.0.2 + Hibernate (JPA)</title><content type='html'>&lt;div style="text-align: center;"&gt;&lt;img style="width: 79px; height: 60px;" alt="Google App Engine - GAE" src="http://code.google.com/intl/pt-BR/appengine/images/appengine_lowres.gif" /&gt;&lt;img style="width: 161px; height: 49px;" alt="Spring Framework" src="http://www.springsource.org/sites/all/themes/zen/framework/logo.png" /&gt;&lt;img style="width: 203px; height: 56px;" alt="Hibernate - JPA" src="http://blog.aplikacja.info/wp-content/uploads/2009/09/hibernate_logo_a.png" /&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:180%;" &gt;Introdução &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Usar a infraestrutura do &lt;a href="http://pt.wikipedia.org/wiki/Computa%C3%A7%C3%A3o_em_nuvem"&gt;google para hospedar suas aplicações&lt;/a&gt; pode parecer algo fantástico. Imagine ter todo o poder e segurança fornecido pelo Google diretamente nas suas aplicações. É com essa promessa que o &lt;a href="http://code.google.com/intl/pt-BR/appengine/"&gt;Google App Engine (GAE) &lt;/a&gt;foi lançado. Pode-se criar aplicações Web usando Python ou Java.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-size:180%;"&gt;+&lt;/span&gt;Vantagens:&lt;/span&gt; boa &lt;a href="http://code.google.com/intl/pt-BR/appengine/docs/"&gt;documentação em pt_BR&lt;/a&gt;, aproveitar da escalabilidade do google, desenvolver em Java (no ponto de vista de número de pessoas aptas) e etc.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-size:180%;"&gt;-&lt;/span&gt;Desvantagens:&lt;/span&gt; &lt;a href="http://code.google.com/intl/pt-BR/appengine/docs/java/jrewhitelist.html"&gt;JRE com menos classes&lt;/a&gt;, &lt;a href="http://groups.google.com/group/google-appengine-java/web/will-it-play-in-app-engine?pli=1"&gt;frameworks não funcionando ou funcionando parcialmente&lt;/a&gt;, &lt;a href="http://code.google.com/intl/pt-BR/appengine/docs/java/datastore/usingjpa.html#Unsupported_Features_of_JPA"&gt;restrições ao uso do JPA&lt;/a&gt; e etc.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:180%;" &gt;Configurando plugin no Eclipse&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Para facilitar, muito, a criação, deploy e debug de seus aplicativos aconselho a utilizar o &lt;a href="http://code.google.com/intl/pt-BR/appengine/docs/java/tools/eclipse.html"&gt;Eclipse juntamente com o plugin&lt;/a&gt; fornecido pelo google.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:180%;"&gt;Integrações&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;Spring 3.0.2&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Gosto de usar o controle transacional do Spring (@Transactional) , injeção de dependência e a implementação do open session in view (OpenEntityManagerInView) e para usar tais recursos tive que configurar o &lt;span style="font-weight: bold;"&gt;web.xm&lt;/span&gt;l dessa forma.&lt;br /&gt;&lt;br /&gt;    &amp;lt;listener&amp;gt;&lt;br /&gt;        &amp;lt;listener-class&amp;gt;org.springframework.web.context.ContextLoaderListener&amp;lt;/listener-class&amp;gt;&lt;br /&gt;    &amp;lt;/listener&amp;gt;&lt;br /&gt;    &amp;lt;listener&amp;gt;&lt;br /&gt;        &amp;lt;listener-class&amp;gt;org.springframework.web.context.request.RequestContextListener&amp;lt;/listener-class&amp;gt;&lt;br /&gt;    &amp;lt;/listener&amp;gt;&lt;br /&gt;&lt;br /&gt;    &amp;lt;filter&amp;gt;&lt;br /&gt;        &amp;lt;filter-name&amp;gt;SpringOpenEntityManagerInViewFilter&amp;lt;/filter-name&amp;gt;&lt;br /&gt;        &amp;lt;filter-class&amp;gt;org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter&amp;lt;/filter-class&amp;gt;&lt;br /&gt;    &amp;lt;/filter&amp;gt;&lt;br /&gt;    &amp;lt;filter-mapping&amp;gt;&lt;br /&gt;        &amp;lt;filter-name&amp;gt;SpringOpenEntityManagerInViewFilter&amp;lt;/filter-name&amp;gt;&lt;br /&gt;        &amp;lt;url-pattern&amp;gt;/*&amp;lt;/url-pattern&amp;gt;&lt;br /&gt;    &amp;lt;/filter-mapping&amp;gt;&lt;br /&gt;&lt;br /&gt;Já o arquivo &lt;span style="font-weight: bold;"&gt;applicationContext.xml&lt;/span&gt; ficou assim.&lt;br /&gt;&lt;br /&gt;    &amp;lt;bean class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor" /&amp;gt;&lt;br /&gt;    &amp;lt;bean id="entityManagerFactory"    class="org.springframework.orm.jpa.LocalEntityManagerFactoryBean" lazy-init="true"&amp;gt;&lt;br /&gt;        &amp;lt;property name="persistenceUnitName" value="t3st3" /&amp;gt;&lt;br /&gt;    &amp;lt;/bean&amp;gt;&lt;br /&gt;    &amp;lt;bean name="txManager" class="org.springframework.orm.jpa.JpaTransactionManager"&amp;gt;&lt;br /&gt;        &amp;lt;property name="entityManagerFactory" ref="entityManagerFactory" /&amp;gt;&lt;br /&gt;    &amp;lt;/bean&amp;gt;&lt;br /&gt;    &amp;lt;tx:annotation-driven transaction-manager="txManager" /&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;JavaServer Faces 2 (JSF 2.0)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Costumo repassar o trabalho de cuidar do ciclo de vida dos managedbean para o Spring. A utilização do jsf 2 (implementação myfaces) traz as novidades do jsf 2.0 (que é um grande passo) e saber que é compatível com gae é muito bom. Bem meu &lt;span style="font-weight: bold;"&gt;web.xml &lt;/span&gt;ficou assim.&lt;br /&gt;&lt;br /&gt;   &amp;lt;servlet&amp;gt;&lt;br /&gt;      &amp;lt;servlet-name&amp;gt;Faces Servlet&amp;lt;/servlet-name&amp;gt;&lt;br /&gt;      &amp;lt;servlet-class&amp;gt;javax.faces.webapp.FacesServlet&amp;lt;/servlet-class&amp;gt;&lt;br /&gt;      &amp;lt;load-on-startup&amp;gt;1&amp;lt;/load-on-startup&amp;gt;&lt;br /&gt;   &amp;lt;/servlet&amp;gt;&lt;br /&gt;&lt;br /&gt;   &amp;lt;servlet-mapping&amp;gt;&lt;br /&gt;      &amp;lt;servlet-name&amp;gt;Faces Servlet&amp;lt;/servlet-name&amp;gt;&lt;br /&gt;      &amp;lt;url-pattern&amp;gt;*.jsf&amp;lt;/url-pattern&amp;gt;&lt;br /&gt;   &amp;lt;/servlet-mapping&amp;gt;&lt;br /&gt;   &lt;br /&gt;   &lt;br /&gt;        &amp;lt;!--&lt;br /&gt;           We need to set annotation lifecycyle provider manually as org.apache.myfaces.config.annotation.NoInjectionAnnotationLifecycleProvider.&lt;br /&gt;           Other providers use some classes that are restricted on Google App Engine.    &lt;br /&gt;        --&amp;gt; &lt;br /&gt;        &amp;lt;context-param&amp;gt;&lt;br /&gt;            &amp;lt;param-name&amp;gt;org.apache.myfaces.config.annotation.LifecycleProvider&amp;lt;/param-name&amp;gt;&lt;br /&gt;            &amp;lt;param-value&amp;gt;org.apache.myfaces.config.annotation.NoInjectionAnnotationLifecycleProvider&amp;lt;/param-value&amp;gt;&lt;br /&gt;        &amp;lt;/context-param&amp;gt;&lt;br /&gt;       &lt;br /&gt;        &amp;lt;!--&lt;br /&gt;            Need to set a secret to avoid javax.crypto.BadPaddingException.&lt;br /&gt;            "param-value" must be Base64 encoded.&lt;br /&gt;            More details: http://wiki.apache.org/myfaces/Secure_Your_Application&lt;br /&gt;         --&amp;gt;&lt;br /&gt;        &amp;lt;context-param&amp;gt;&lt;br /&gt;            &amp;lt;param-name&amp;gt;org.apache.myfaces.SECRET&amp;lt;/param-name&amp;gt;&lt;br /&gt;            &amp;lt;param-value&amp;gt;NzY1NDMyMTA=&amp;lt;/param-value&amp;gt;&lt;br /&gt;          &amp;lt;/context-param&amp;gt;  &lt;br /&gt;&lt;br /&gt;e o &lt;span style="font-weight: bold;"&gt;faces-config.xml&lt;/span&gt; assim:&lt;br /&gt;&lt;br /&gt;    &amp;lt;application&amp;gt;&lt;br /&gt;        &amp;lt;variable-resolver&amp;gt;org.springframework.web.jsf.DelegatingVariableResolver&amp;lt;/variable-resolver&amp;gt;&lt;br /&gt;    &amp;lt;/application&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;Hibernate&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;Só usar! Ahh é mesmo tem que se criar um arquivo persistence.xml (META-INF) mínimo.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;Observações gerais:&lt;/span&gt;&lt;br /&gt;Tente usar sempre o objeto &lt;a href="http://code.google.com/intl/pt-BR/appengine/docs/java/javadoc/com/google/appengine/api/datastore/Key.html"&gt;Key&lt;/a&gt; como id, pois objetos filhos devem usar Key ou String codificada, não sendo possível usar long ou int.&lt;br /&gt;Você pode acompanhar o &lt;a href="http://code.google.com/status/appengine"&gt;status do ambiente&lt;/a&gt;,  quais serviços estão online qual a latência de uso e etc.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3760273245894556929-6354588639448916857?l=archsofty.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://archsofty.blogspot.com/feeds/6354588639448916857/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3760273245894556929&amp;postID=6354588639448916857' title='1 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3760273245894556929/posts/default/6354588639448916857'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3760273245894556929/posts/default/6354588639448916857'/><link rel='alternate' type='text/html' href='http://archsofty.blogspot.com/2010/04/integrando-google-app-engine-gae-spring.html' title='Integrando google app engine (GAE) + Spring 3.0.2 + Hibernate (JPA)'/><author><name>Leandro</name><uri>http://www.blogger.com/profile/09724892719833243149</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3760273245894556929.post-8646622616869384682</id><published>2010-04-09T07:03:00.000-07:00</published><updated>2010-04-09T07:04:02.183-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='artigo'/><category scheme='http://www.blogger.com/atom/ns#' term='lucene'/><category scheme='http://www.blogger.com/atom/ns#' term='infoq'/><category scheme='http://www.blogger.com/atom/ns#' term='google'/><title type='text'>Artigo publicado na InfoQ Gringa</title><content type='html'>&lt;div style="text-align: justify;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://cdn2.infoq.com/styles/i/logo.gif"&gt;&lt;img style="float: left; margin: 0pt 10px 10px 0pt; cursor: pointer; width: 140px; height: 44px;" src="http://cdn2.infoq.com/styles/i/logo.gif" alt="" border="0" /&gt;&lt;/a&gt;&lt;span style="font-weight: bold;"&gt;Nota rápida&lt;/span&gt;: o pessoal da InfoQ publicou meu artigo sobre &lt;a href="http://www.infoq.com/articles/lucene-did-you-mean"&gt;Implementing Google's "Did you mean" Feature In Java&lt;/a&gt;. Todo feedback será bem-vindo.&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3760273245894556929-8646622616869384682?l=archsofty.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://archsofty.blogspot.com/feeds/8646622616869384682/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3760273245894556929&amp;postID=8646622616869384682' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3760273245894556929/posts/default/8646622616869384682'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3760273245894556929/posts/default/8646622616869384682'/><link rel='alternate' type='text/html' href='http://archsofty.blogspot.com/2010/04/artigo-publicado-na-infoq-gringa.html' title='Artigo publicado na InfoQ Gringa'/><author><name>Leandro</name><uri>http://www.blogger.com/profile/09724892719833243149</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3760273245894556929.post-4345923147529458007</id><published>2010-04-09T04:19:00.000-07:00</published><updated>2010-04-09T09:16:03.441-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='javaserver faces'/><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='url'/><category scheme='http://www.blogger.com/atom/ns#' term='jsf'/><title type='text'>URL amigáveis com JavaServer Faces (jsf) 1.X</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.mestreseo.com.br/wp-content/uploads/2009/06/url1.jpg"&gt;&lt;img style="float: left; margin: 0pt 10px 10px 0pt; cursor: pointer; width: 169px; height: 169px;" src="http://www.mestreseo.com.br/wp-content/uploads/2009/06/url1.jpg" alt="" border="0" /&gt;&lt;/a&gt;Uma das críticas dos usuários de JSF é : "você não consegue criar urls que podem ser bookmarked (favoritadas)".&lt;br /&gt;&lt;br /&gt;Eu pensei que iria ter uma trabalheira do cão... pensei que não iria dar muito certo com &lt;span style="font-weight: bold;"&gt;Richfaces&lt;/span&gt;, &lt;span style="font-weight: bold;"&gt;Spring&lt;/span&gt; ... enfim todas as &lt;span style="font-weight: bold;"&gt;integrações&lt;/span&gt;... pensei... pensei errado! :)&lt;br /&gt;&lt;br /&gt;Há um framework chamado &lt;a href="http://ocpsoft.com/prettyfaces/v123/"&gt;PrettyFaces&lt;/a&gt; (para jsf 1.1 , 1.x e 2.0)  o qual o uso é extremamente fácil.&lt;br /&gt;&lt;br /&gt;Com apenas dois passos você adiciona url amigáveis ao JSF:&lt;br /&gt;&lt;br /&gt;1º Passo: Registrar o filtro no web.xml&lt;br /&gt;&lt;div style="border-width: 1px; color: white; border-style: solid; background-color: gray;"&gt;&lt;br /&gt;&amp;lt;filter&amp;gt;&lt;br /&gt;&amp;lt;filter-name&amp;gt;Pretty Filter&amp;lt;/filter-name&amp;gt;&lt;br /&gt;&amp;lt;filter-class&amp;gt;com.ocpsoft.pretty.PrettyFilter&amp;lt;/filter-class&amp;gt;&lt;br /&gt;&amp;lt;/filter&amp;gt;&lt;br /&gt;&amp;lt;filter-mapping&amp;gt;&lt;br /&gt;&amp;lt;filter-name&amp;gt;Pretty Filter&amp;lt;/filter-name&amp;gt;&lt;br /&gt;&amp;lt;url-pattern&amp;gt;/*&amp;lt;/url-pattern&amp;gt;&lt;br /&gt;&amp;lt;dispatcher&amp;gt;REQUEST&amp;lt;/dispatcher&amp;gt;&lt;br /&gt;&amp;lt;dispatcher&amp;gt;FORWARD&amp;lt;/dispatcher&amp;gt;&lt;br /&gt;&amp;lt;dispatcher&amp;gt;ERROR&amp;lt;/dispatcher&amp;gt;&lt;br /&gt;&amp;lt;/filter-mapping&amp;gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;2º Passo: criar o arquivo &lt;span style="font-weight: bold;"&gt;pretty-config.xml&lt;/span&gt; dentro de WEB-INF:&lt;br /&gt;&lt;div style="border-width: 1px; color: white; border-style: solid; background-color: gray;"&gt;&lt;br /&gt;&amp;lt;pretty-config&lt;br /&gt;xmlns="http://ocpsoft.com/prettyfaces-xsd"&lt;br /&gt;xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"&lt;br /&gt;xsi:schemaLocation="http://ocpsoft.com/prettyfaces-xsd&lt;br /&gt;http://ocpsoft.com/xml/ns/prettyfaces/pretty-1.0.xsd"&amp;gt;&lt;br /&gt;&amp;lt;url-mapping id="verNoticia"&amp;gt;&lt;br /&gt;&amp;lt;pattern&amp;gt;/noticia/#{myBean.currentStoryId}/&amp;lt;/pattern&amp;gt;&lt;br /&gt;&amp;lt;view-id&amp;gt;/noticia.xhtml&amp;lt;/view-id&amp;gt;&lt;br /&gt;&amp;lt;action&amp;gt;#{myBean.loadComment}&amp;lt;/action&amp;gt;&lt;br /&gt;&amp;lt;/url-mapping&amp;gt;&lt;br /&gt;&amp;lt;/pretty-config&amp;gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Com as configurações acima se você digitasse http://seuhost/seuprojeto/noticia/12345/ você mostraria o bean (de ViewID=/noticia.xhtml) com a notícia de id=12345 :)&lt;br /&gt;&lt;br /&gt;ps: um passo omitido seria o download do jar e o registro do mesmo no classpath da sua aplicação.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3760273245894556929-4345923147529458007?l=archsofty.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://archsofty.blogspot.com/feeds/4345923147529458007/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3760273245894556929&amp;postID=4345923147529458007' title='3 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3760273245894556929/posts/default/4345923147529458007'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3760273245894556929/posts/default/4345923147529458007'/><link rel='alternate' type='text/html' href='http://archsofty.blogspot.com/2010/04/url-amigaveis-com-javaserver-faces-jsf.html' title='URL amigáveis com JavaServer Faces (jsf) 1.X'/><author><name>Leandro</name><uri>http://www.blogger.com/profile/09724892719833243149</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3760273245894556929.post-466481945501658523</id><published>2010-03-29T12:17:00.000-07:00</published><updated>2010-03-29T12:36:33.600-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='desenvolvimento'/><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='freelancer'/><title type='text'>Freelancer Java - Tive bons resultados.</title><content type='html'>&lt;div style="text-align: justify;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.actionscriptdeveloper.co.uk/wp-content/themes/upstart-blogger-minim-01/images/actionscript_freelancer.gif"&gt;&lt;img style="float: left; margin: 0pt 10px 10px 0pt; cursor: pointer; width: 197px; height: 197px;" src="http://www.actionscriptdeveloper.co.uk/wp-content/themes/upstart-blogger-minim-01/images/actionscript_freelancer.gif" alt="" border="0" /&gt;&lt;/a&gt;&lt;h1&gt;Freelancer Java&lt;/h1&gt;De acordo com a Wikipedia: &lt;i&gt;&lt;b&gt;"Freelancer&lt;/b&gt;&lt;/i&gt; é o termo inglês para denominar o &lt;a href="http://pt.wikipedia.org/wiki/Profissional_aut%C3%B4nomo" title="Profissional autônomo"&gt;profissional autônomo&lt;/a&gt;, que se  auto-emprega em diferentes empresas ou, ainda, guia seus trabalhos por  projetos, captando e atendendo seus clientes de forma independente. É  uma tendência muito em voga no mercado de &lt;a href="http://pt.wikipedia.org/wiki/Jornalismo" title="Jornalismo"&gt;jornalismo&lt;/a&gt;,  &lt;a href="http://pt.wikipedia.org/wiki/Design" title="Design"&gt;design&lt;/a&gt;,  &lt;a href="http://pt.wikipedia.org/wiki/Propaganda" title="Propaganda"&gt;propaganda&lt;/a&gt;,  &lt;a href="http://pt.wikipedia.org/wiki/Web" title="Web" class="mw-redirect"&gt;web&lt;/a&gt;, &lt;a href="http://pt.wikipedia.org/wiki/Tecnologia_da_informa%C3%A7%C3%A3o" title="Tecnologia da informação"&gt;tecnologia da informação&lt;/a&gt;, &lt;a href="http://pt.wikipedia.org/wiki/M%C3%BAsica" title="Música"&gt;música&lt;/a&gt;  e muitos outros."&lt;br /&gt;Há  - muito - tempo atrás li um post interessantíssimo denominado o &lt;a href="http://www.fragmental.com.br/wiki/index.php?title=Guia_de_Guerra_Para_Freelancers"&gt;guia de guerra para freelancers&lt;/a&gt;. E eu também tentei me aventurar pelo mundo dos &lt;a href="http://archsofty.blogspot.com/2009/03/ofereco-trabalho-de-freelancer-em-java.html"&gt;serviços de freelancer java&lt;/a&gt;. Até que me posicione bem no google, se você pesquisar &lt;a href="http://www.google.com/search?q=trabalho+freelancer+java"&gt;"trabalho freelancer java"&lt;/a&gt; no google, meu blog aparecerá no fim da primeira página ou no inicio da segunda, claro (quase) todos os créditos aos trabalhos que obtive foram vindos do google. Para minha surpresa tive alguns contatos bem rápidos e um ponto interessante foi que a maioria deles não moravam próximo a mim. Todo trabalho desenvolvido (para os clientes) foi baseado na confiança e a comunicação basicamente foi por emails. Dá pra ganhar uma graninha extra com disciplina e responsabilidade. =D&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3760273245894556929-466481945501658523?l=archsofty.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://archsofty.blogspot.com/feeds/466481945501658523/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3760273245894556929&amp;postID=466481945501658523' title='3 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3760273245894556929/posts/default/466481945501658523'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3760273245894556929/posts/default/466481945501658523'/><link rel='alternate' type='text/html' href='http://archsofty.blogspot.com/2010/03/freelancer-java-tive-bons-resultados.html' title='Freelancer Java - Tive bons resultados.'/><author><name>Leandro</name><uri>http://www.blogger.com/profile/09724892719833243149</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3760273245894556929.post-157670270203738832</id><published>2010-03-09T05:54:00.000-08:00</published><updated>2010-03-09T06:42:22.486-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='deploy'/><category scheme='http://www.blogger.com/atom/ns#' term='refatoração'/><category scheme='http://www.blogger.com/atom/ns#' term='boas praticas'/><category scheme='http://www.blogger.com/atom/ns#' term='tdd'/><category scheme='http://www.blogger.com/atom/ns#' term='ddd'/><category scheme='http://www.blogger.com/atom/ns#' term='refactoring'/><category scheme='http://www.blogger.com/atom/ns#' term='programacao'/><category scheme='http://www.blogger.com/atom/ns#' term='oo'/><category scheme='http://www.blogger.com/atom/ns#' term='desenvolvimento orientado a testes'/><category scheme='http://www.blogger.com/atom/ns#' term='desenvolvimento guiado por testes'/><category scheme='http://www.blogger.com/atom/ns#' term='build automatizados'/><title type='text'>boasPraticas.add deploy, tdd, ddd</title><content type='html'>&lt;div style="text-align: justify;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://nunoveloso.eu/files/imagecache/blog_full/blog/engrenages.jpg"&gt;&lt;img style="float: left; margin: 0pt 10px 10px 0pt; cursor: pointer; width: 183px; height: 222px;" src="http://nunoveloso.eu/files/imagecache/blog_full/blog/engrenages.jpg" alt="" border="0" /&gt;&lt;/a&gt;Recebi a visita de um super amigo das antigas (leia-se VB.NET), eu tinha que entegrar um &lt;a href="http://blog.fragmental.com.br/2007/10/07/sistemas-simples-como-portais-por-exemplo/"&gt;simples gerenciador de conteúdo&lt;/a&gt; e meu amigo me acompanhou e ficou questionando sobre por que eu fazia assim, usava aquilo, não fazia isso... no fim ele disse que precisava de desenvolver com mais qualidade, controle e facilidade. Ele ainda me pediu uma &lt;a href="http://gc.blog.br/2008/03/27/10-livros-recomendados-para-desenvolvedores/"&gt;lista de livros&lt;/a&gt; pra ler e quais praticas eu usava, naquele momento começei a falar tanta coisa, ferramenta, framework, metodo... que ele mesmo disse "escreva uma lista dessas boas práticas"! E aqui estou eu, vou tentar apenas listar os tópicos e os links que acho interessante.&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Não reivente a roda&lt;/span&gt; - quase sempre há uma &lt;a href="http://archsofty.blogspot.com/2009/08/minhascommonslibutils-apachecommons.html"&gt;common&lt;/a&gt; pronta, então quando surgir uma necessidade pesquise antes sobre o assunto. Tive uma péssima experiência com um agendador de tarefas (que eu criei)  em Java, tudo isso porque não conhecia o &lt;a href="http://www.opensymphony.com/quartz/;jsessionid=LDKHONNCOPJC"&gt;Quartz&lt;/a&gt;.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Melhore seu design OO&lt;/span&gt; - por mais que pareça esgotado esse assunto, ainda há pessoas que não compreendaram assuntos básicos, esse tópico (sobre OO) não dá pra ser resolvido com uns poucos links mas se eu pudesse indicar um site seria o do &lt;a href="http://blog.fragmental.com.br/"&gt;Philip Calçado&lt;/a&gt;. PS: outras boas práticas abaixo listadas podem lhe ajudar também num design mais charmoso.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;TDD&lt;/span&gt; - uma ótima prática que pode lhe livrar de dores de cabeças infernais. No inicio pode parecer perda de tempo mas com tempo você vai ver o valor de &lt;a href="http://archsofty.blogspot.com/2009/02/tdd-desenvolvimento-guiado-por-testes.html"&gt;usar Test Driven Development&lt;/a&gt;.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Logging&lt;/span&gt; - não há nada mais chato do que ler grandes arquivos de logging não é mesmo?! Há sim, debugar! :P então: prefira Logar do que Degubar! Pode começar lendo um &lt;a href="http://hotwork.sourceforge.net/hotwork/manual/log4j/log4j-user-guide.html"&gt;tutorial de log4j&lt;/a&gt;.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Deploy&lt;/span&gt; - Automatizar suas construções e criar um &lt;a href="http://blog.caelum.com.br/2010/03/01/o-processo-de-deploy-continuo/"&gt;processo de deploy continuo&lt;/a&gt; :)&lt;br /&gt;&lt;a href="http://blog.caelum.com.br/2008/01/28/os-7-habitos-dos-desenvolvedores-hibernate-e-jpa-altamente-eficazes/"&gt;&lt;span style="font-weight: bold;"&gt;Boas práticas com JPA&lt;/span&gt;&lt;/a&gt; - às vezes passamos raiva só por desconhecimento (profundo) de um certo recurso do framework. Logo digo leia esse ótimo post sobre os &lt;a href="http://blog.caelum.com.br/2008/01/28/os-7-habitos-dos-desenvolvedores-hibernate-e-jpa-altamente-eficazes/"&gt;bons habitos de usar JPA&lt;/a&gt;.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Integração continua&lt;/span&gt; - Leia o post de &lt;a href="http://martinfowler.com/articles/continuousIntegration.html"&gt;Integração continua&lt;/a&gt;  ahhh outra dica &lt;a href="http://gc.blog.br/2009/04/15/louco-por-automatizacao/"&gt;automatize tudo&lt;/a&gt; o possível.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Aprenda outra linguagem&lt;/span&gt; - Sua cabeça pode se tornar &lt;a href="http://java.sun.com/"&gt;viciada numa linguagem&lt;/a&gt; só e isso pode lhe privar de conhecer ou melhor entender como outros organismos funcionam. Além do mais é divertido aprender &lt;a href="http://www.ruby-lang.org/pt/"&gt;Ruby&lt;/a&gt; e ver como as pessoas&lt;a href="http://rubyonrails.org/"&gt; resolvem problemas&lt;/a&gt; de maneiras tão distintas.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Comunidade &lt;/span&gt;- Nem só de código fonte a comunidade open-source se alimenta, usar &lt;a href="http://www.guj.com.br/"&gt;forums para aprender&lt;/a&gt; e ensinar é algo muito valioso.&lt;br /&gt;&lt;a href="http://blog.fragmental.com.br/2008/05/20/trilha-de-livros-desenvolvedor/"&gt;Outros bons livros&lt;/a&gt; :)&lt;br /&gt;&lt;br /&gt;Tudo isso pode parecer plágio de um grande &lt;a href="http://blog.caelum.com.br/"&gt;blog de ótimo desenvolvedores&lt;/a&gt;, mas não é :) Juro!&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3760273245894556929-157670270203738832?l=archsofty.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://archsofty.blogspot.com/feeds/157670270203738832/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3760273245894556929&amp;postID=157670270203738832' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3760273245894556929/posts/default/157670270203738832'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3760273245894556929/posts/default/157670270203738832'/><link rel='alternate' type='text/html' href='http://archsofty.blogspot.com/2010/03/boaspraticasadd-deploy-tdd-ddd.html' title='boasPraticas.add deploy, tdd, ddd'/><author><name>Leandro</name><uri>http://www.blogger.com/profile/09724892719833243149</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3760273245894556929.post-6190699105430593488</id><published>2010-02-23T04:59:00.000-08:00</published><updated>2010-02-23T05:35:10.130-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='tutorial'/><category scheme='http://www.blogger.com/atom/ns#' term='script'/><category scheme='http://www.blogger.com/atom/ns#' term='scripting'/><title type='text'>Como usar JavaScript na plataforma Java</title><content type='html'>&lt;div style="text-align: justify;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://weber.eti.br/wp-content/uploads/2009/09/javascript.jpg"&gt;&lt;img style="float: left; margin: 0pt 10px 10px 0pt; cursor: pointer; width: 241px; height: 194px;" src="http://weber.eti.br/wp-content/uploads/2009/09/javascript.jpg" alt="" border="0" /&gt;&lt;/a&gt;Em minha mente o assunto &lt;a href="http://java.sun.com/javase/6/docs/technotes/guides/scripting/programmer_guide/"&gt;scripting na plataforma Java&lt;/a&gt; já estava bem explorado e difundido. Mas hoje fui supreendido por um amigo com um mini-framework que servia de analisador e parser para simples fórmulas matemáticas como p.ex:&lt;br /&gt;2+2-1*3/3&lt;br /&gt;(2+2)*10&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Usando Java 6 basta esse simples código.&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;      ScriptEngineManager factory = &lt;span style="color: rgb(51, 102, 255);"&gt;new&lt;/span&gt; ScriptEngineManager();&lt;br /&gt;      ScriptEngine engine = factory.getEngineByName("JavaScript");&lt;br /&gt;      &lt;span style="color: rgb(51, 102, 255);"&gt;try&lt;/span&gt; {&lt;br /&gt;          String script = " 10 + 2 * 2 "; //ou sua expressão&lt;br /&gt;          Object result = engine.eval(script);&lt;br /&gt;          System.&lt;span style="color: rgb(51, 204, 0);"&gt;out&lt;/span&gt;.println(result);&lt;br /&gt;      } &lt;span style="color: rgb(51, 102, 255);"&gt;catch&lt;/span&gt; (ScriptException ex) {&lt;br /&gt;          System.out.println("deu erro :P "+ex);&lt;br /&gt;      }&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3760273245894556929-6190699105430593488?l=archsofty.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://archsofty.blogspot.com/feeds/6190699105430593488/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3760273245894556929&amp;postID=6190699105430593488' title='1 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3760273245894556929/posts/default/6190699105430593488'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3760273245894556929/posts/default/6190699105430593488'/><link rel='alternate' type='text/html' href='http://archsofty.blogspot.com/2010/02/como-usar-javascript-na-plataforma-java.html' title='Como usar JavaScript na plataforma Java'/><author><name>Leandro</name><uri>http://www.blogger.com/profile/09724892719833243149</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3760273245894556929.post-2038010714091549155</id><published>2010-02-13T17:30:00.000-08:00</published><updated>2010-02-14T15:35:03.558-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='open source'/><category scheme='http://www.blogger.com/atom/ns#' term='projeto de software'/><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='jtable'/><category scheme='http://www.blogger.com/atom/ns#' term='jtableannotations'/><category scheme='http://www.blogger.com/atom/ns#' term='swing'/><category scheme='http://www.blogger.com/atom/ns#' term='código fonte'/><category scheme='http://www.blogger.com/atom/ns#' term='annotation'/><title type='text'>JTableAnnotations - Um jeito mais simples de criar JTable</title><content type='html'>&lt;div style="text-align: center;"&gt;&lt;span style="font-weight: bold;font-size:180%;" &gt;JTableAnnotations&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Há algum tempo atrás escrevi um mini-framework para &lt;span style="font-weight: bold;"&gt;criação de JTable por anotação.&lt;/span&gt; Talvez esse pedaço de código possa lhe servir, criar JTable sempre é uma tarefa chata e tediosa (e para alguns dificil). O &lt;a href="http://code.google.com/p/jtableannotations/"&gt;JTableAnnotations&lt;/a&gt; &lt;span style="font-weight: bold;"&gt;propõe uma simplificação&lt;/span&gt; no processo de configuração e preenchimento das tabelas.&lt;br /&gt;&lt;br /&gt;Basicamente você precisará anotar suas entidades&lt;br /&gt;&lt;pre&gt;&lt;div  style="border: 1px solid blue;"&gt;&lt;br /&gt;@JTableConfiguration(rowHeight=48)&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;public class&lt;/span&gt; &lt;span style="font-weight: bold;"&gt;Product&lt;/span&gt; {&lt;br /&gt;@JTableColumnConfiguration(order=1,width=55)&lt;br /&gt;&lt;span style="color: rgb(51, 0, 153);"&gt;private&lt;/span&gt; Long &lt;span style="color: rgb(0, 51, 0);"&gt;id&lt;/span&gt;;&lt;br /&gt;@JTableColumnConfiguration(order=2,width=300,editable=true,align=Align.CENTER)&lt;br /&gt;&lt;span style="color: rgb(51, 0, 153);"&gt;private&lt;/span&gt; String &lt;span style="color: rgb(0, 51, 0);"&gt;name&lt;/span&gt;;&lt;br /&gt;@JTableColumnConfiguration(order=3,name=&lt;span style="color: rgb(204, 102, 0);"&gt;"Price"&lt;/span&gt;,decimalFormat=&lt;span style="color: rgb(204, 102, 0);"&gt;"U$ 0.00"&lt;/span&gt;)&lt;br /&gt;&lt;span style="color: rgb(51, 0, 153);"&gt;private&lt;/span&gt; BigDecimal &lt;span style="color: rgb(0, 51, 0);"&gt;value&lt;/span&gt;;&lt;br /&gt;@JTableColumnConfiguration(order=4,name=&lt;span style="color: rgb(204, 102, 0);"&gt;"Costumer Name"&lt;/span&gt;,width=300)&lt;br /&gt;&lt;span style="color: rgb(51, 0, 153);"&gt;private&lt;/span&gt; Customer &lt;span style="color: rgb(0, 51, 0);"&gt;customer&lt;/span&gt;;&lt;br /&gt;@JTableColumnConfiguration(order=0,name=&lt;span style="color: rgb(204, 102, 0);"&gt;"Photo"&lt;/span&gt;,cellRender=IconCellRender.class)&lt;br /&gt;&lt;span style="color: rgb(51, 0, 153);"&gt;private&lt;/span&gt; String &lt;span style="color: rgb(0, 51, 51);"&gt;picturePath&lt;/span&gt;;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;E então o trabalho de configurar e popular fica a cargo da classe &lt;a href="http://code.google.com/p/jtableannotations/source/browse/trunk/JTableAnnotations/src/com/google/code/jtableannotation/Configurator.java"&gt;Configurator&lt;/a&gt;:&lt;br /&gt;&lt;div  style="border: 1px solid blue;"&gt;&lt;br /&gt;Customer master = &lt;span style="color: rgb(0, 0, 102);"&gt;new&lt;/span&gt; Customer();&lt;br /&gt;master.setName(&lt;span style="color: rgb(204, 102, 0);"&gt;"Master"&lt;/span&gt;);&lt;br /&gt;master.setUserName(&lt;span style="color: rgb(204, 102, 0);"&gt;"Admin"&lt;/span&gt;);&lt;br /&gt;list = &lt;span style="color: rgb(0, 0, 102);"&gt;new&lt;/span&gt; ArrayList&lt;product&gt;();&lt;br /&gt;list.add(&lt;br /&gt;createProduct(&lt;br /&gt;master, 0L,&lt;br /&gt;&lt;span style="color: rgb(204, 102, 0);"&gt;"Nintendo Wii"&lt;/span&gt;,&lt;br /&gt;&lt;span style="color: rgb(204, 102, 0);"&gt;"pictures/wii.jpg"&lt;/span&gt;,&lt;br /&gt;&lt;span style="color: rgb(0, 0, 102);"&gt;new&lt;/span&gt; BigDecimal(999.50)));&lt;br /&gt;list.add(&lt;br /&gt;createProduct(&lt;br /&gt;master, 1L,&lt;br /&gt;&lt;span style="color: rgb(204, 102, 0);"&gt;"XBox360"&lt;/span&gt;,&lt;br /&gt;&lt;span style="color: rgb(204, 102, 0);"&gt;"pictures/xbox360.jpg"&lt;/span&gt;,&lt;br /&gt;&lt;span style="color: rgb(0, 0, 102);"&gt;new&lt;/span&gt; BigDecimal(1020.85)));&lt;br /&gt;list.add(&lt;br /&gt;createProduct(&lt;br /&gt;master, 2L,&lt;br /&gt;&lt;span style="color: rgb(204, 102, 0);"&gt;"PS3"&lt;/span&gt;,&lt;br /&gt;&lt;span style="color: rgb(204, 102, 0);"&gt;"pictures/ps3.jpg"&lt;/span&gt;,&lt;br /&gt;&lt;span style="color: rgb(0, 0, 102);"&gt;new&lt;/span&gt; BigDecimal(1000.0)));&lt;br /&gt;list.add(&lt;br /&gt;createProduct(&lt;br /&gt;master, 3L,&lt;br /&gt;&lt;span style="color: rgb(204, 102, 0);"&gt;"PSP"&lt;/span&gt;,&lt;br /&gt;&lt;span style="color: rgb(204, 102, 0);"&gt;"pictures/psp.jpg"&lt;/span&gt;,&lt;br /&gt;&lt;span style="color: rgb(0, 0, 102);"&gt;new&lt;/span&gt; BigDecimal(490.0)));&lt;br /&gt;list.add(&lt;br /&gt;createProduct(&lt;br /&gt;master, 4L,&lt;br /&gt;&lt;span style="color: rgb(204, 102, 0);"&gt;"Nintendo DS"&lt;/span&gt;,&lt;br /&gt;&lt;span style="color: rgb(204, 102, 0);"&gt;"pictures/nds.jpg"&lt;/span&gt;,&lt;br /&gt;&lt;span style="color: rgb(0, 0, 102);"&gt;new&lt;/span&gt; BigDecimal(359.59015)));&lt;br /&gt;new Configurator().configureAndPopulateJTable(&lt;span style="color: rgb(0, 51, 0);"&gt;jTable&lt;/span&gt;, list);&lt;br /&gt;&lt;/product&gt;&lt;/div&gt;&lt;/pre&gt;&lt;div style="text-align: center;"&gt;&lt;span class="lit"  style="font-size:100%;"&gt;&lt;span style="font-weight: bold;"&gt;E voilá!&lt;br /&gt;(odeio essa resolução do blogspot)&lt;br /&gt;[&lt;a href="http://jtableannotations.googlecode.com/files/jtable%20annotation%20sample.JPG"&gt;Clique aqui para ver a figura abaixo&lt;/a&gt;]&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;span class="lit"  style="font-size:100%;"&gt;&lt;p style="text-align: center;"&gt;&lt;span style="font-weight: bold;"&gt; &lt;/span&gt;&lt;img style="width: 653px; height: 215px;" src="http://jtableannotations.googlecode.com/files/jtable%20annotation%20sample.JPG" /&gt;     &lt;/p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;Mais informações na página do projeto &lt;a href="http://code.google.com/p/jtableannotations/"&gt;http://code.google.com/p/jtableannotations/&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3760273245894556929-2038010714091549155?l=archsofty.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://archsofty.blogspot.com/feeds/2038010714091549155/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3760273245894556929&amp;postID=2038010714091549155' title='1 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3760273245894556929/posts/default/2038010714091549155'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3760273245894556929/posts/default/2038010714091549155'/><link rel='alternate' type='text/html' href='http://archsofty.blogspot.com/2010/02/jtableannotations-um-jeito-mais-simples.html' title='JTableAnnotations - Um jeito mais simples de criar JTable'/><author><name>Leandro</name><uri>http://www.blogger.com/profile/09724892719833243149</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3760273245894556929.post-810094143356599944</id><published>2010-01-27T04:22:00.000-08:00</published><updated>2010-01-27T04:37:34.843-08:00</updated><title type='text'>Vagas Agile Funny - OFF</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://freshome.com/wp-content/uploads/2007/05/ikea.jpg"&gt;&lt;img style="float: left; margin: 0pt 10px 10px 0pt; cursor: pointer; width: 450px; height: 366px;" src="http://freshome.com/wp-content/uploads/2007/05/ikea.jpg" alt="" border="0" /&gt;&lt;/a&gt;Com o título &lt;a href="http://www.gojava.org/node/526"&gt;Vagas na Fibonacci Soluções Agéis&lt;/a&gt;  - foi um anuncio feito pelo &lt;a href="http://www.gojava.org/"&gt;GOJava&lt;/a&gt; (legal) veja:&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Requisitos:&lt;/p&gt; &lt;p&gt;Imprescindíveis:&lt;/p&gt; &lt;p&gt;- Gostar muito de programação&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;- Não achar que a carreira ideal é aquela em que você começa como  programador, é "promovido" para analista e um dia se torna gerente de  "sua própria equipe"&lt;/span&gt;&lt;br /&gt;- Preferir trabalhar em uma equipe auto-gerenciável&lt;br /&gt;- Não acreditar que uma única tecnologia é a solução para todos os  problemas, mas sim que existe a ferramenta correta para cada trabalho&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;- Ser bom em google-fu&lt;/span&gt;&lt;/p&gt; &lt;p&gt;Desejáveis&lt;/p&gt; &lt;p&gt;- Experiência/conhecimento em &lt;span style="font-weight: bold;"&gt;Desenvolvimento Orientado a Testes&lt;/span&gt;,  Desenvolvimento para Web, Arquitetura de Software, Desenvolvimento  Orientado a Objetos, Metodologias Ágeis&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;- Saber jogar truco&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;- Ser ala-direita ou centro-avante no futebol (precisamos completar o  time)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt; - Gostar de video-game&lt;/span&gt;&lt;/p&gt; &lt;p&gt;Benefícios:&lt;/p&gt; &lt;p&gt;- Os tradicionais vale-transporte e plano de saúde&lt;br /&gt;- Uma cozinha com lanche disponível o tempo todo e dois horários de  lanche por dia (de manhã e de tarde)&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;- Não ter chefe, porque aqui não é nenhuma tribo.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;- Você nunca vai ter que explicar seu trabalho nem vai ser avaliado com  base em um Diagrama de Gantt&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;Quem derá as empresas tivessem um pouco mais desse espírito.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;PS: não trabalho, não conheço nada nem ninguém da empresa.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3760273245894556929-810094143356599944?l=archsofty.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://archsofty.blogspot.com/feeds/810094143356599944/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3760273245894556929&amp;postID=810094143356599944' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3760273245894556929/posts/default/810094143356599944'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3760273245894556929/posts/default/810094143356599944'/><link rel='alternate' type='text/html' href='http://archsofty.blogspot.com/2010/01/vagas-agile-funny-off.html' title='Vagas Agile Funny - OFF'/><author><name>Leandro</name><uri>http://www.blogger.com/profile/09724892719833243149</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3760273245894556929.post-7045407490451044801</id><published>2009-12-23T03:37:00.000-08:00</published><updated>2009-12-23T03:55:43.453-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='jpcsp'/><category scheme='http://www.blogger.com/atom/ns#' term='emulador'/><category scheme='http://www.blogger.com/atom/ns#' term='release'/><category scheme='http://www.blogger.com/atom/ns#' term='emulação'/><category scheme='http://www.blogger.com/atom/ns#' term='emulator'/><category scheme='http://www.blogger.com/atom/ns#' term='psp'/><title type='text'>Jpcsp - v0.4 lançado - Castelvania Dracula X Chronicles</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://jpcsp.org/images/header2.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 415px; height: 97px;" src="http://jpcsp.org/images/header2.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;h1&gt;JPCSP - O emulador do PSP feito em Java&lt;/h1&gt;&lt;div style="text-align: justify;"&gt;A muito tempo não dou mais nenhuma contribuição no projeto &lt;a href="http://jpcsp.org/"&gt;Jpcsp&lt;/a&gt; mas não deixo de acompanhar o progresso do projeto.  (Pra quem não sabe &lt;a href="http://archsofty.blogspot.com/2008/08/jpcsp-um-emulador-de-psp-feito-em-java.html"&gt;o que é o Jpcsp&lt;/a&gt;!) A última notícia foi mesmo um presente de natal, a versão 0.4 do &lt;span style="font-weight: bold;"&gt;Jpcsp &lt;/span&gt;foi lançada e já está disponível para &lt;a href="http://jpcsp.org/index.php?p=Downloads"&gt;download&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Sinto um pouco de orgulho por ter conseguido participar, efetivamente, e realizar um dos meus sonhos de moleque. (Criar um emulador :) )... agora deixando de conversa fiada segue alguns screenshots!&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;span style="font-weight: bold;"&gt;&lt;h2&gt;Castlevania - Dracula X Chronicles&lt;/h2&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://jpcsp.org/images/thumbs/ULES00841-Shot-3.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 402px; height: 227px;" src="http://jpcsp.org/images/thumbs/ULES00841-Shot-3.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://jpcsp.org/images/thumbs/ULES00841-Shot-7.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 403px; height: 228px;" src="http://jpcsp.org/images/thumbs/ULES00841-Shot-7.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;span&gt;&lt;span style="font-weight: bold;"&gt;&lt;h2&gt;Heatseeker&lt;/h2&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://jpcsp.org/images/thumbs/Hs1.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 409px; height: 295px;" src="http://jpcsp.org/images/thumbs/Hs1.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="font-weight: bold;"&gt;&lt;h2&gt;God of war (In menu)&lt;br /&gt;&lt;/h2&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://jpcsp.org/images/thumbs/god1.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 407px; height: 288px;" src="http://jpcsp.org/images/thumbs/god1.JPG" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;div style="text-align: center;"&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 102);"&gt;Feliz Natal! ho ho ho&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 102);"&gt; - &lt;/span&gt;&lt;span style="color: rgb(0, 0, 102);"&gt;Veja mais &lt;/span&gt;&lt;a style="color: rgb(0, 0, 102);" href="http://jpcsp.org/index.php?p=News"&gt;notícias do Jpcsp&lt;/a&gt;&lt;span style="color: rgb(0, 0, 102);"&gt; ou os meus &lt;a href="http://archsofty.blogspot.com/search/label/jpcsp"&gt;posts antigos sobre Jpcsp&lt;/a&gt;.&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3760273245894556929-7045407490451044801?l=archsofty.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://archsofty.blogspot.com/feeds/7045407490451044801/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3760273245894556929&amp;postID=7045407490451044801' title='8 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3760273245894556929/posts/default/7045407490451044801'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3760273245894556929/posts/default/7045407490451044801'/><link rel='alternate' type='text/html' href='http://archsofty.blogspot.com/2009/12/jpcsp-v04-lancada-castelvania-dracula-x.html' title='Jpcsp - v0.4 lançado - Castelvania Dracula X Chronicles'/><author><name>Leandro</name><uri>http://www.blogger.com/profile/09724892719833243149</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3760273245894556929.post-378729220178035980</id><published>2009-12-03T04:28:00.000-08:00</published><updated>2009-12-03T05:28:00.758-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='aplicações web'/><category scheme='http://www.blogger.com/atom/ns#' term='lucene'/><category scheme='http://www.blogger.com/atom/ns#' term='spellchecker'/><category scheme='http://www.blogger.com/atom/ns#' term='voce quis dizer'/><category scheme='http://www.blogger.com/atom/ns#' term='google'/><title type='text'>Adicione o recurso "você quis dizer" nas suas aplicações Java</title><content type='html'>&lt;div style="text-align: justify;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.mundoseo.com.br/wp-content/uploads/2009/03/search-engines2.png"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 179px; height: 177px;" src="http://www.mundoseo.com.br/wp-content/uploads/2009/03/search-engines2.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;h1&gt;SpellChecker - Uma extensão no Lucene&lt;/h1&gt;Continuando &lt;a href="http://archsofty.blogspot.com/2009/12/tutorial-apache-lucene-300-motor-de.html"&gt;brincando com Lucene&lt;/a&gt;, no novo &lt;span style="font-weight: bold;"&gt;Lucene 3.0.0&lt;/span&gt; encontrei uma pasta &lt;span style="font-weight: bold;"&gt;contrib&lt;/span&gt; na qual há libs diversas. Uma delas é o &lt;a href="http://lucene.apache.org/java/2_2_0/api/org/apache/lucene/search/spell/SpellChecker.html"&gt;SpellChecker&lt;/a&gt; que lhe oferece recursos para que você implemente em suas aplicações java (web ou desktop) recursos como &lt;span style="font-weight: bold;"&gt;"Você quis dizer"&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Recurso Você quis dizer&lt;/h2&gt;Imagine : Você é dono de uma loja virtual na qual é oferecido DVDs para venda. Um fanático pelo ator &lt;a href="http://www.imdb.com/name/nm0000216/"&gt;Arnold Schwarzenegger&lt;/a&gt; entra no sua loja e tem em mente comprar todos os DVDs desse ator (hoje, governador) a primeira ação do usuário é digitar o nome do ator no campo busca. Facilmente ele irá errar a digitação do nome, por exemplo digitando "&lt;span style="font-style: italic;"&gt;&lt;span style="color: rgb(0, 0, 102);"&gt;arnold swuazeneger&lt;/span&gt;&lt;/span&gt;", e isso não deveria ser algo impeditivo para compra dos DVDs. Para esse problema bastaria a solução do tipo "&lt;span style="font-weight: bold;"&gt;Você quis dizer foo&lt;/span&gt;" implementada pelo &lt;a href="http://www.google.com/corporate/"&gt;Google Inc.&lt;/a&gt; no seu motor de busca. Você consegue esse mesmo, ou próximo, efeito em suas buscas utilizando uma das extensões do Lucene, chamada de SpellChecker. O exemplo-código abaixo é simples e demonstra como fazer isso.&lt;br /&gt;&lt;h3&gt;Código&lt;/h3&gt;&lt;br /&gt;&lt;pre&gt;     &lt;span style="color: rgb(0, 0, 102);"&gt;&lt;span style="font-weight: bold;"&gt;Directory&lt;/span&gt; diretorioDicionario = new &lt;span style="font-weight: bold;"&gt;RAMDirectory&lt;/span&gt;();&lt;/span&gt;&lt;br /&gt;    //criação do diretório&lt;br /&gt;&lt;span style="color: rgb(0, 0, 102);"&gt;     &lt;span style="font-weight: bold;"&gt;SpellChecker&lt;/span&gt; sp = new &lt;span style="font-weight: bold;"&gt;SpellChecker&lt;/span&gt;(diretorioDicionario);&lt;/span&gt;&lt;br /&gt;    //instânciação do objeto SpellChecker&lt;br /&gt;&lt;span style="color: rgb(0, 0, 102);"&gt;     sp.indexDictionary(new &lt;span style="font-weight: bold;"&gt;PlainTextDictionary&lt;/span&gt;(new &lt;span style="font-weight: bold;"&gt;File&lt;/span&gt;("dicionario.txt")));&lt;/span&gt;&lt;br /&gt;    //indexação do Dictionary (há duas implementações).&lt;br /&gt;&lt;span style="color: rgb(0, 0, 102);"&gt;     &lt;span style="font-weight: bold;"&gt;String&lt;/span&gt; pesquisa = "arnold swuazeneger";&lt;br /&gt;    /&lt;span style="color: rgb(0, 0, 0);"&gt;/seu termo pesquiado&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 102);"&gt;     &lt;span style="font-weight: bold;"&gt;int&lt;/span&gt; numeroDeSugestoes = 5;&lt;/span&gt;&lt;br /&gt;    //número de sugestões similares&lt;br /&gt;&lt;span style="color: rgb(0, 0, 102);"&gt;     &lt;span style="font-weight: bold;"&gt;String[]&lt;/span&gt; similares = sp.suggestSimilar(pesquisa, numeroDeSugestoes);&lt;/span&gt;&lt;br /&gt;    //as sugestões em si.&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 102);"&gt;     System.&lt;span style="font-weight: bold;"&gt;out&lt;/span&gt;.println("Seu Termo : " + pesquisa);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 102);"&gt;       for (String palavra : similares) {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 102);"&gt;           System.out.println("Você quis dizer: " + palavra);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 102);"&gt;       }&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 102);"&gt;     pesquisa = "bava";&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 102);"&gt;     similares = sp.suggestSimilar(pesquisa, numeroDeSugestoes);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 102);"&gt;     System.&lt;span style="font-weight: bold;"&gt;out&lt;/span&gt;.println("Seu Termo : " + pesquisa);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 102);"&gt;       for (String palavra : similares) {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 102);"&gt;           System.out.println("Você quis dizer: " + palavra);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 102);"&gt;       }&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;h3&gt;Saída&lt;/h3&gt;&lt;hr /&gt;&lt;span style="font-weight: bold;"&gt;Seu Termo : &lt;span style="color: rgb(204, 0, 0);"&gt;arnold swuazeneger&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Você quis dizer: arnold schwarzenegger&lt;/span&gt;&lt;br /&gt;&lt;hr /&gt;&lt;span style="font-weight: bold;"&gt;Seu Termo : &lt;span style="color: rgb(204, 0, 0);"&gt;bava&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Você quis dizer: java&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Você quis dizer: lava&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Você quis dizer: bala&lt;/span&gt;&lt;br /&gt;&lt;hr /&gt;&lt;br /&gt;Arquivo &lt;span style="font-weight: bold;"&gt;dicionario.txt&lt;/span&gt;:&lt;br /&gt;&lt;div style="border: 1px solid black; color: blue; width: 230px;"&gt;arnold schwarzenegger&lt;br /&gt;jean claude van damme&lt;br /&gt;java&lt;br /&gt;lava&lt;br /&gt;bala&lt;/div&gt;&lt;br /&gt;&lt;h2&gt;Conclusão&lt;/h2&gt;Nem sempre é tão difícil quanto parece, sempre há uma roda já pronta para seu problema. Você ainda pode ajustar a acurácia da pesquisa pelo método &lt;a href="http://lucene.apache.org/java/2_2_0/api/org/apache/lucene/search/spell/SpellChecker.html#setAccuracy%28float%29"&gt;setAccuracy&lt;/a&gt; do SpellChecker. Claro que o uso do recurso em produção requer mais e mais atenção quanto ao diretório e o dicionário de busca. Baseado nos códigos acima, facilmente você consegue levar essa características para seus sistemas Java Web ( JSF - JavaServer Faces, Struts, JSP).&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3760273245894556929-378729220178035980?l=archsofty.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://archsofty.blogspot.com/feeds/378729220178035980/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3760273245894556929&amp;postID=378729220178035980' title='1 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3760273245894556929/posts/default/378729220178035980'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3760273245894556929/posts/default/378729220178035980'/><link rel='alternate' type='text/html' href='http://archsofty.blogspot.com/2009/12/adicione-o-recurso-voce-quis-dizer-nas.html' title='Adicione o recurso &quot;você quis dizer&quot; nas suas aplicações Java'/><author><name>Leandro</name><uri>http://www.blogger.com/profile/09724892719833243149</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3760273245894556929.post-3663532938248533625</id><published>2009-12-01T08:42:00.000-08:00</published><updated>2009-12-02T08:16:32.236-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='lucene'/><category scheme='http://www.blogger.com/atom/ns#' term='busca textual'/><category scheme='http://www.blogger.com/atom/ns#' term='full text search'/><category scheme='http://www.blogger.com/atom/ns#' term='tutorial'/><category scheme='http://www.blogger.com/atom/ns#' term='programacao'/><category scheme='http://www.blogger.com/atom/ns#' term='google'/><category scheme='http://www.blogger.com/atom/ns#' term='engine text'/><title type='text'>Tutorial Apache Lucene 3.0.0 - motor de busca textual</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://lucene.apache.org/images/lucene_green_300.gif"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 300px; height: 46px;" src="http://lucene.apache.org/images/lucene_green_300.gif" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;h1&gt;&lt;a href="http://archsofty.blogspot.com/2009/12/tutorial-apache-lucene-300-motor-de.html"&gt;Lucene um motor de busca textual&lt;/a&gt;&lt;br /&gt;&lt;/h1&gt;&lt;div style="text-align: justify;"&gt;No dia 25 de novembro foi lançado a &lt;a href="http://lucene.apache.org/java/docs/index.html#25+November+2009+-+Lucene+Java+3.0.0+available"&gt;nova versão do motor de busca &lt;span style="font-weight: bold;"&gt;Lucene&lt;/span&gt;&lt;/a&gt;, a versão 3.0.0. Lucene é um framework de alta performance para busca textual feito em java. (há versões para &lt;a href="http://ifacethoughts.net/2008/02/07/zend-brings-lucene-to-php/"&gt;php&lt;/a&gt; e &lt;a href="http://incubator.apache.org/lucene.net/"&gt;.net&lt;/a&gt; também)  Uma das características marcantes dele é a integração com &lt;a style="font-weight: bold;" href="http://hadoop.apache.org/"&gt;Hadoop&lt;/a&gt;. (um framework para computação distribuida - que possui, dentre outros, um &lt;a style="font-weight: bold;" href="http://hadoop.apache.org/common/docs/current/mapred_tutorial.html"&gt;MapReduce&lt;/a&gt; e um &lt;a href="http://hadoop.apache.org/common/docs/current/hdfs_design.html"&gt;sistema de arquivos distribuido&lt;/a&gt; &lt;span style="font-weight: bold;"&gt;HDFS&lt;/span&gt;)&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;h1&gt;Porque usar Lucene?&lt;/h1&gt;&lt;div style="text-align: justify;"&gt;Imagine o seguinte cenário: Seu usuário deseja criar um modulo de &lt;span style="font-weight: bold;"&gt;gerenciamento de artigos&lt;/span&gt; e também expó-los na Internet. As informações do artigo são: &lt;span style="font-weight: bold;"&gt;título, autor e o contéudo.&lt;/span&gt; Normalmente cada artigo desse contém cerca de &lt;span style="font-weight: bold;"&gt;1500 palavras&lt;/span&gt; e o usuário poderá &lt;span style="font-weight: bold;"&gt;buscar pelo conteudo&lt;/span&gt; desses artigos. Suponha que há &lt;span style="font-weight: bold;"&gt;1 milhão e meio de artigos &lt;/span&gt;para serem cadastrados, o simples uso de um banco de dados e o operador LIKE '%palavra%' é &lt;a href="http://blogs.msdn.com/varund/archive/2009/11/30/index-usage-by-like-operator-query-tuning.aspx"&gt;inviável&lt;/a&gt;. E aí que entra um bom framework de busca textual, usá-lo passa ser a solução mais tranquila e viável. Além de trazer velocidade, também traz outras características nas buscas que dificilmente fariamos codificando tudo do zero.&lt;br /&gt;&lt;/div&gt;&lt;h1&gt;Domain-Specific Language | Ubiquitous Language&lt;br /&gt;&lt;/h1&gt;&lt;div style="text-align: justify;"&gt;Há vários termos usados na terminologia do framework, os principais são: &lt;span style="font-weight: bold;"&gt;Documento, Campo, Diretório, Indexador, Pesquisador, Analisador e Termo&lt;/span&gt;.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Documento &lt;/span&gt;- é o conjunto de dados que você deseja indexar, por ex. título, conteudo e autor formam o documento artigo, pode ser visto como um objeto no lucene é visto como &lt;a href="http://lucene.apache.org/java/3_0_0/api/core/org/apache/lucene/document/Document.html"&gt;Document&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Campo &lt;/span&gt;- é o dado, identificado, que pode ser analogo a um campo de uma tabela ou uma propriedade de um objeto no lucene é visto como &lt;a href="http://lucene.apache.org/java/3_0_0/api/core/org/apache/lucene/document/Field.html"&gt;Field&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Diretório &lt;/span&gt;- conceito abstrato que denota um local para guardar os índices no lucene é visto como uma interface &lt;a href="http://lucene.apache.org/java/2_2_0/api/org/apache/lucene/store/Directory.html"&gt;Directory&lt;/a&gt;, que possui diversas implementações&lt;a href="http://lucene.apache.org/java/2_2_0/api/org/apache/lucene/store/db/DbDirectory.html" title="class in org.apache.lucene.store.db"&gt; DbDirectory&lt;/a&gt;, &lt;a href="http://lucene.apache.org/java/2_2_0/api/org/apache/lucene/store/FSDirectory.html" title="class in org.apache.lucene.store"&gt;FSDirectory&lt;/a&gt;, &lt;a href="http://lucene.apache.org/java/2_2_0/api/org/apache/lucene/store/je/JEDirectory.html" title="class in org.apache.lucene.store.je"&gt;JEDirectory&lt;/a&gt;, &lt;a href="http://lucene.apache.org/java/2_2_0/api/org/apache/lucene/store/RAMDirectory.html" title="class in org.apache.lucene.store"&gt;RAMDirectory&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Indexador &lt;/span&gt;- é o responsável por indexar os documentos num diretorio no lucene é visto, geralmente, como &lt;a href="http://lucene.apache.org/java/2_4_0/api/org/apache/lucene/index/IndexWriter.html"&gt;IndexWriter&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Pesquisador &lt;/span&gt;- responsável por pesquisar uma &lt;a href="http://lucene.apache.org/java/2_4_0/api/org/apache/lucene/search/Query.html"&gt;Query&lt;/a&gt; no diretorio de índices,  no lucene é visto como &lt;a href="http://lucene.apache.org/java/2_4_0/api/org/apache/lucene/search/Searcher.html"&gt;Searcher&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Analisador &lt;/span&gt;- atua como um filtro e faz uma pré-avaliação do que pode ser indexado ou não, no lucene há &lt;a href="http://lucene.apache.org/java/2_2_0/api/org/apache/lucene/analysis/class-use/Analyzer.html"&gt;uma lista de vários analisadores&lt;/a&gt;. &lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Termo &lt;/span&gt;- pode ser visto como objeto que pode ser usado como parametro da pesquisa, composto pelo nome do campo e o valor a ser pesquisado, no lucene é visto como &lt;a href="http://lucene.apache.org/java/2_2_0/api/org/apache/lucene/index/Term.html"&gt;Term&lt;/a&gt;.&lt;/li&gt;&lt;/ul&gt; &lt;h1&gt;Como isso funciona?&lt;/h1&gt;&lt;div style="text-align: justify;"&gt;A descrição a seguir é um resumo bem simplificado sobre o funcionamento de um motor de busca textual. A primeira fase, geralmente, é a indexação do documento, nessa fase o documento é analizado (por um &lt;a href="http://lucene.apache.org/java/3_0_0/api/contrib-analyzers/org/apache/lucene/analysis/br/BrazilianAnalyzer.html"&gt;Analizer&lt;/a&gt; que também já retira as &lt;a href="http://en.wikipedia.org/wiki/Stop_words"&gt;stopwords&lt;/a&gt;) para posteriomente ser indexado.&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 102);"&gt;&lt;/span&gt;&lt;blockquote&gt;&lt;span style="color: rgb(0, 0, 102);"&gt;Set&lt;string&gt;&lt;/string&gt;&lt;/span&gt;&lt;string&gt;&lt;span style="color: rgb(0, 0, 102);"&gt; stopWords = new HashSet&lt;/span&gt;&lt;string&gt;&lt;span style="color: rgb(0, 0, 102);"&gt;&lt;string&gt;();&lt;/string&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 102);"&gt;stopWords.add("the");&lt;/span&gt;&lt;br /&gt;&lt;/string&gt;&lt;/string&gt;&lt;span style="color: rgb(0, 0, 102);"&gt;stopWords.add("it");&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 102);"&gt;stopWords.add("is");&lt;/span&gt;&lt;br /&gt;&lt;string&gt;&lt;string&gt;&lt;span style="color: rgb(0, 0, 102);"&gt;IndexWriter &lt;span style="font-weight: bold;"&gt;writer&lt;/span&gt; = new IndexWriter(FSDirectory.open(INDEX_DIR),&lt;br /&gt;  new StandardAnalyzer(Version.LUCENE_CURRENT,&lt;br /&gt;                                    stopWords),&lt;br /&gt;  false,&lt;br /&gt;  IndexWriter.MaxFieldLength.LIMITED);&lt;/span&gt;&lt;br /&gt;&lt;/string&gt;&lt;/string&gt;&lt;/blockquote&gt;&lt;string&gt;&lt;string&gt;&lt;br /&gt;&lt;/string&gt;&lt;/string&gt;&lt;/pre&gt;No Lucene você pode criar um índice usando o IndexWriter, a criação desse objeto envolve dizer onde será (ou está) o diretório dos índices, qual analizador você irá utilizar, se irá criar o indice e qual a quantidade máxima de campos.&lt;br /&gt;&lt;br /&gt;O objetivo do indexador é indexar documentos, para tanto é necessário que haja documentos  para serem indexados.&lt;br /&gt;&lt;pre&gt;&lt;span style="color: rgb(0, 0, 102);"&gt;&lt;/span&gt;&lt;/pre&gt;&lt;blockquote&gt;&lt;pre&gt;&lt;span style="color: rgb(0, 0, 102);"&gt;Document &lt;span style="font-weight: bold;"&gt;doc&lt;/span&gt; = new Document();&lt;/span&gt;&lt;span style="color: rgb(0, 0, 102);"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 102);"&gt;doc.add(new Field("nomedocampo", "valores a serem guardados", Field.Store.YES, Field.Index.NOT_ANALYZED));&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 102);"&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 102);"&gt;doc.add(new Field("camp1","valores a serem analisados tokenizados",Field.Store.YES, &lt;/span&gt;&lt;span style="color: rgb(0, 0, 102);"&gt;Field.Index.toIndex(true, true)&lt;/span&gt;&lt;span style="color: rgb(0, 0, 102);"&gt;));&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 102);"&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 102);"&gt;&lt;span style="font-weight: bold;"&gt;writer&lt;/span&gt;.addDocument(&lt;span style="font-weight: bold;"&gt;doc&lt;/span&gt;);&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/blockquote&gt;É o objetivo final de todo processo de busca textual é mesmo a busca em si.&lt;br /&gt;&lt;pre style="color: rgb(0, 0, 102);"&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote&gt;&lt;div style="text-align: justify;"&gt;&lt;pre style="color: rgb(0, 0, 102);"&gt;String valueToBeSearched = "red";&lt;br /&gt;String index = "indexDir"; //dirotorio base do indice&lt;br /&gt;IndexReader reader = IndexReader.open(FSDirectory.open(new File(index)), true); //indexador&lt;br /&gt;Searcher searcher = new IndexSearcher(reader); //pesquisador&lt;br /&gt;QueryParser parser = new QueryParser(Version.LUCENE_CURRENT, field, analyzer); //transoformador do texto em uma query&lt;br /&gt;Query query = parser.parse(valueToBeSearched); //a consulta (query) em si&lt;br /&gt;TopScoreDocCollector collector = TopScoreDocCollector.create(hitsPerPage, false); //os melhores resultados&lt;br /&gt;searcher.search(query, collector);&lt;br /&gt;ScoreDoc[] hits = collector.topDocs().scoreDocs; //o conjunto de melhores documentos para a consulta&lt;br /&gt;&lt;br /&gt;int maximo = hits.length;&lt;br /&gt;Document doc = searcher.doc(hits[index].doc);&lt;br /&gt;String valor = doc.get("nomeDoCampo");&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h1&gt;&lt;/h1&gt;&lt;/blockquote&gt;&lt;h1&gt;Recursos na busca de documentos&lt;/h1&gt;&lt;div style="text-align: justify;"&gt;Quando se faz uma &lt;span style="font-weight: bold;"&gt;pesquisa por documentos&lt;/span&gt; no Lucene podemos utilizar de alguns &lt;span style="font-weight: bold;"&gt;operadores&lt;/span&gt; (+, -, AND, NOT, OR, * e etc.) juntamente com o termo pesquisado ou apenas pesquisar uma frase completa.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 102);"&gt;Exemplo         :&lt;/span&gt; &lt;span style="font-weight: bold;"&gt;termo&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 102);"&gt;Consequência:&lt;/span&gt; &lt;span style="font-style: italic;"&gt;Irá pesquisar a palavra "termo" nos documentos indexados.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 102);"&gt;Exemplo         :&lt;/span&gt; &lt;span style="font-weight: bold;"&gt;termo&lt;/span&gt; OR &lt;span style="font-weight: bold;"&gt;palavra &lt;/span&gt;( == &lt;span style="font-weight: bold;"&gt;termo palavra&lt;/span&gt;)&lt;br /&gt;&lt;span style="color: rgb(0, 0, 102);"&gt;Consequência:&lt;/span&gt; &lt;span style="font-style: italic;"&gt;Irá pesquisar "termo" ou "palavra" nos documentos indexados.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 102);"&gt;Exemplo         :&lt;/span&gt; &lt;span style="font-weight: bold;"&gt;+termo&lt;/span&gt; &lt;span style="font-weight: bold;"&gt;+palavra &lt;/span&gt;( == &lt;span style="font-weight: bold;"&gt;termo &lt;/span&gt;AND&lt;span style="font-weight: bold;"&gt; palavra&lt;/span&gt;)&lt;br /&gt;&lt;span style="color: rgb(0, 0, 102);"&gt;Consequência:&lt;/span&gt; &lt;span style="font-style: italic;"&gt;Irá pesquisar "termo" e "palavra" nos documentos indexados.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 102);"&gt;Exemplo         :&lt;/span&gt; &lt;span style="font-weight: bold;"&gt;campo:termo&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 102);"&gt;Consequência:&lt;/span&gt; &lt;span style="font-style: italic;"&gt;Irá pesquisar "termo" no campo "campo" nos documentos indexados.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 102);"&gt;Exemplo         :&lt;/span&gt; &lt;span style="font-weight: bold;"&gt;+homer +simpsons -house&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 102);"&gt;Consequência:&lt;/span&gt; &lt;span style="font-style: italic;"&gt;Irá pesquisar documentos que contenham homer e simpsons e não tenha house.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 102);"&gt;Exemplo         :&lt;/span&gt; &lt;span style="font-weight: bold;"&gt;"termo exato"&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 102);"&gt;Consequência:&lt;/span&gt; &lt;span style="font-style: italic;"&gt;Irá pesquisar documentos que contenham exatamente "termo exato".&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 102);"&gt;&lt;br /&gt;Exemplo         :&lt;/span&gt; &lt;span style="font-weight: bold;"&gt;java*&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 102);"&gt;Consequência:&lt;/span&gt; &lt;span style="font-style: italic;"&gt;Irá pesquisar documentos que contenham palavras que começem com java (javadb, javanet...).&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 102);"&gt;Exemplo         :&lt;/span&gt; &lt;span style="font-weight: bold;"&gt;java~&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 102);"&gt;Consequência:&lt;/span&gt; &lt;span style="font-style: italic;"&gt;Irá pesquisar documentos que contenham palavras similares a java como por ex. lava, jaba...&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Finalizando tive as seguintes impressões sobre essa nova versão do Lucene.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Prós:&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Maior facilidade para uso do framework, ex: criações de &lt;a href="http://lucene.apache.org/java/3_0_0/api/core/org/apache/lucene/document/Field.html"&gt;Fields&lt;/a&gt; estão bem mais fluentes.&lt;/li&gt;&lt;li&gt;Sensível otimização nos tempos de busca e indexação. &lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Contras:&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Otimas ferramentas como &lt;a href="http://code.google.com/p/luke/"&gt;luke&lt;/a&gt; ainda não tem suporte para a versão 3.0.0. (mas já há uma solicitação aberta para tal mudança.)&lt;/li&gt;&lt;li&gt;Muitas mudanças no core do framework; o que fez livros mais antigos quase perderem seu valor.&lt;/li&gt;&lt;/ul&gt;&lt;h1&gt;Referências&lt;/h1&gt;&lt;ul&gt;&lt;li style="font-weight: bold; font-family: courier new;"&gt;&lt;a href="http://lucene.apache.org/java/docs/"&gt;Lucene Demo - http://lucene.apache.org/java/docs/&lt;/a&gt;&lt;/li&gt;&lt;li  style="font-weight: bold;font-family:courier new;"&gt;&lt;a href="http://infolab.stanford.edu/%7Ebackrub/google.html"&gt;The Anatomy of a Large-Scale Hypertextual Web Search Engine&lt;/a&gt;&lt;/li&gt;&lt;li face="courier new" style="font-weight: bold;"&gt;&lt;a href="http://www.slideshare.net/otisg/lucene-introduction"&gt;Slides de introdução ao uso do lucene&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;li face="courier new" style="font-weight: bold;"&gt;&lt;span style="font-size:130%;"&gt;&lt;a href="http://www.manning.com/hatcher3/"&gt;Lucene in Action, Second Edition&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;a style="font-weight: bold; font-family: courier new;" href="http://pt.wikipedia.org/wiki/P%C3%A1gina_principal"&gt;Wikipédia&lt;/a&gt;&lt;/li&gt;&lt;li style="font-weight: bold;"&gt;&lt;a href="http://www.slideshare.net/eriksencosta/voc-quis-dizer-buscas-poderosas-com-apache-solr-lucene"&gt;Apache Solr, Lucene Slides&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a style="font-weight: bold;" href="http://www.lucenetutorial.com/lucene-in-5-minutes.html"&gt;Tutorial Lucene em 5 Minutos &lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3760273245894556929-3663532938248533625?l=archsofty.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://archsofty.blogspot.com/feeds/3663532938248533625/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3760273245894556929&amp;postID=3663532938248533625' title='34 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3760273245894556929/posts/default/3663532938248533625'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3760273245894556929/posts/default/3663532938248533625'/><link rel='alternate' type='text/html' href='http://archsofty.blogspot.com/2009/12/tutorial-apache-lucene-300-motor-de.html' title='Tutorial Apache Lucene 3.0.0 - motor de busca textual'/><author><name>Leandro</name><uri>http://www.blogger.com/profile/09724892719833243149</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>34</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3760273245894556929.post-5439509765139033976</id><published>2009-11-24T02:24:00.000-08:00</published><updated>2009-11-24T02:39:26.625-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='internal dsl'/><category scheme='http://www.blogger.com/atom/ns#' term='domain-specific language'/><category scheme='http://www.blogger.com/atom/ns#' term='dsl interna'/><category scheme='http://www.blogger.com/atom/ns#' term='dsl'/><title type='text'>Ótimos slides sobre Domain Specific Language (DSL) interna</title><content type='html'>&lt;div style="text-align: justify;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.tiresias.org/images/ff.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 163px; height: 144px;" src="http://www.tiresias.org/images/ff.jpg" alt="" border="0" /&gt;&lt;/a&gt;Esse é apenas um encaminhamento para o ótimo post sobre &lt;a href="http://martinfowler.com/bliki/InternalDslStyle.html"&gt;dsl interna&lt;/a&gt; e tecnicas para construção da mesma.&lt;br /&gt;&lt;a href="http://blog.brianguthrie.com/articles/2009/11/23/slides-for-my-talk-on-construction-techniques-for-internal-dsls"&gt;http://blog.brianguthrie.com/articles/2009/11/23/slides-for-my-talk-on-construction-techniques-for-internal-dsls&lt;/a&gt; para acessar diretamente o link dos &lt;a href="http://brianguthrie.com/talks/construction_techniques_for_domain_specific_languages.pdf"&gt;slides clique aqui&lt;/a&gt;.&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3760273245894556929-5439509765139033976?l=archsofty.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://archsofty.blogspot.com/feeds/5439509765139033976/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3760273245894556929&amp;postID=5439509765139033976' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3760273245894556929/posts/default/5439509765139033976'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3760273245894556929/posts/default/5439509765139033976'/><link rel='alternate' type='text/html' href='http://archsofty.blogspot.com/2009/11/otimos-slides-sobre-domain-specific.html' title='Ótimos slides sobre Domain Specific Language (DSL) interna'/><author><name>Leandro</name><uri>http://www.blogger.com/profile/09724892719833243149</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3760273245894556929.post-7604428459991620465</id><published>2009-10-29T06:31:00.000-07:00</published><updated>2009-10-29T10:48:26.215-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='jpa'/><category scheme='http://www.blogger.com/atom/ns#' term='travamento'/><category scheme='http://www.blogger.com/atom/ns#' term='versionamento'/><category scheme='http://www.blogger.com/atom/ns#' term='lock'/><category scheme='http://www.blogger.com/atom/ns#' term='concorrencia'/><title type='text'>JPA - lock otimista e pessimista, concorrência  e afins</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.softwaresecretweapons.com/jspwiki/attach/2008/04/concurrency.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 152px; height: 155px;" src="http://www.softwaresecretweapons.com/jspwiki/attach/2008/04/concurrency.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;span style="font-size:180%;"&gt;&lt;a href="http://java.sun.com/javaee/technologies/persistence.jsp"&gt;JPA - Java Persistence API&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;&lt;a href="http://jcp.org/en/jsr/detail?id=220"&gt;JPA é especificação&lt;/a&gt; para mapeamento ORM e persistência de dados inspiradíssima no famoso framework Hibernate.&lt;br /&gt;&lt;br /&gt;A especificação JPA (1.0) já é amplamente usada e aceita na comunidade de desenvolvedores Java. Há vários provedores de implementação para o padrão (&lt;a href="https://www.hibernate.org/"&gt; Hibernate&lt;/a&gt; , &lt;a href="http://www.eclipse.org/eclipselink/"&gt;EclipseLink&lt;/a&gt;, &lt;a href="http://www.oracle.com/technology/products/ias/toplink/jpa/index.html"&gt;TopLink&lt;/a&gt; ...)&lt;br /&gt;&lt;br /&gt;Um assunto pouco explorado, quando se trata de tutoriais de jpa, é sobre locks (otimista e pessimista). E é sobre esse assunto que tento escrever um pouco aqui.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:180%;"&gt;Tratamento de concorrência em bancos de dados&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Há basicamente três tipos de tratamento para concorrência em banco de dados:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Otimista&lt;/span&gt; - Quando é criado mecanismos para versionar o dado, no momento em que o banco vai efetivar sua operação sua versão é checada para garantir que você está com um dado que não foi alterado.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Pessimista&lt;/span&gt; - O banco simplesmente trava o dado e só aquele que tem a trava consegue trabalhar com os dados.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a style="font-weight: bold;" href="http://www.weirdmeat.com/uploaded_images/ostrich-743207.jpg"&gt;Ostrich&lt;/a&gt;&lt;span style="font-weight: bold;"&gt; &lt;/span&gt;- Quando não há tratamento nenhum pra concorrência :) , ou seja, a maioria dos casos atuais.&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;span style="font-size:180%;"&gt;O exemplo básico&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Começaremos com os perigos do modo &lt;span style="font-weight: bold;"&gt;Ostrich&lt;/span&gt; de agir. Para exemplificar criaremos uma  simples classe.&lt;br /&gt;&lt;pre style="color: rgb(0, 0, 102);"&gt;@Entity&lt;br /&gt;public class &lt;span style="font-weight: bold;"&gt;Produto&lt;/span&gt; implements &lt;span style="font-weight: bold;"&gt;Serializable&lt;/span&gt; {&lt;br /&gt;private static final &lt;span style="font-weight: bold;"&gt;long&lt;/span&gt; serialVersionUID = 1L;&lt;br /&gt;@Id&lt;br /&gt;@GeneratedValue(strategy = GenerationType.AUTO)&lt;br /&gt;private &lt;span style="font-weight: bold;"&gt;Long&lt;/span&gt; id;&lt;br /&gt;private &lt;span style="font-weight: bold;"&gt;String&lt;/span&gt; nome;&lt;br /&gt;private &lt;span style="font-weight: bold;"&gt;double&lt;/span&gt; quantidade;&lt;br /&gt;//&lt;span style="font-style: italic;"&gt;getters and setters omitidos&lt;/span&gt;&lt;br /&gt;}&lt;/pre&gt;Agora considere dois usuários &lt;span style="font-weight: bold;"&gt;A&lt;/span&gt; e &lt;span style="font-weight: bold;"&gt;B&lt;/span&gt; trabalhando sobre o &lt;span style="font-weight: bold;"&gt;Produto com id = 1( Nintendo Wii) &lt;/span&gt;ambos usuários têm o mesmo produto na tela de edição, o usuário &lt;span style="font-weight: bold;"&gt;A &lt;/span&gt;modifica &lt;span style="font-weight: bold;"&gt;quantidade&lt;/span&gt; e salva antes do usuário B, já o usuário &lt;span style="font-weight: bold;"&gt;B&lt;/span&gt; modifica o &lt;span style="font-weight: bold;"&gt;nome&lt;/span&gt; e salva depois. Note que há incosistência, o usuário A acredita (porque ele editou e salvou) que alterou a quantidade de nintendos wii, porém o usuario B (ainda com a quantidade antiga) mudou o nome e salvou o objeto. O que acontece? Depende do seu provedor de JPA, há casos em que o update só é feito para a coluna modificada mas há casos em que o objeto todo é modificado, o que causa claramente inconsistência. Escrever, escrever e escrever pode não ajudar então veja o código abaixo exemplificando esse cenário.&lt;br /&gt;&lt;pre&gt;&lt;span style="color: rgb(0, 0, 102);"&gt;            &lt;span style="font-weight: bold;"&gt;Produto &lt;/span&gt;nintendoWiiA = em.find(Produto.class,1L);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 102);"&gt;            &lt;span style="font-weight: bold;"&gt;Produto &lt;/span&gt;nintendoWiiB = em.find(Produto.class,1L);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 102);"&gt;            /*Usuário A*/&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 102);"&gt;            em.getTransaction().begin();&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 102);"&gt;            nintendoWiiA.setQuantidade(45.0D);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 102);"&gt;            em.getTransaction().commit();&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 102);"&gt;            /*Usuário B*/&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 102);"&gt;            em.getTransaction().begin();&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 102);"&gt;            nintendoWiiB.setNome("Nintendo WII");&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 102);"&gt;            em.getTransaction().commit();&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 102);"&gt;            System.out.println(em.find(Produto.class,1L));&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;ps: O código é apenas para demonstrar como isso é feito, não é funcional.&lt;br /&gt;&lt;br /&gt;Agora para mudar esse exemplo para o modo &lt;span style="font-weight: bold;"&gt;otimista&lt;/span&gt; de ser basta criarmos uma propriedade no objeto com a anotação &lt;a href="http://java.sun.com/javaee/5/docs/api/javax/persistence/Version.html"&gt;@Version&lt;/a&gt; para denotar que este campo será usado para o fim da implementação otimista. Esse campo deve ser int, long ou timestamp.&lt;br /&gt;&lt;br /&gt;Com a adição do lock otimista quando o usuário B fosse tentar salvar suas modificações ele receberia a execeção &lt;a href="http://java.sun.com/javaee/5/docs/api/javax/persistence/OptimisticLockException.html"&gt;OptimisticLockException&lt;/a&gt;. Isso já garantiria ao menos a notificação ao usuário que alguém estava trabalhando sobre o mesmo dado e ( lembra das canseiras que o IDE nos livra no versionamento de código) apartir dai você poderia mostrar o que foi mudado para o usuário tomar a decisão de salvar ou não suas alterações.&lt;br /&gt;&lt;br /&gt;A parte chocante fica por conta do modo &lt;span style="font-weight: bold;"&gt;pessimista &lt;/span&gt;de ser, a JPA 1.0 não suporta diretamente o modo pessimista de ser (O &lt;a href="http://jcp.org/en/jsr/detail?id=317"&gt;JPA 2.0&lt;/a&gt; prevê esse modo a mais :)&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:180%;"&gt;Então o que fazer?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Imaginem duas contas bancárias: (sempre esse exemplo) &lt;span style="font-weight: bold;"&gt;aMinhaConta&lt;/span&gt; (com saldo de R$ 150,00)  e a &lt;span style="font-weight: bold;"&gt;suaConta&lt;/span&gt; (com saldo de R$ 25.000,00) e você quer me presentear com um Wii mas não tem como mandá-lo pelo correio, logo acha mais conviniente realizar uma transferência para que eu compre. O processo (bem simplificado) se resume a isso:&lt;br /&gt;&lt;br /&gt;#0 &lt;span style="color: rgb(0, 0, 102);"&gt;quantiaASerDoada&lt;/span&gt; = R$ 1390,00;&lt;br /&gt;#1 &lt;span style="font-weight: bold;"&gt;se&lt;/span&gt; &lt;span style="color: rgb(0, 0, 102);"&gt;suaConta&lt;/span&gt;.saldo &gt; &lt;span style="color: rgb(0, 0, 102);"&gt;quantiaASerDoada&lt;/span&gt;&lt;span style="font-weight: bold;"&gt; então&lt;/span&gt;&lt;br /&gt;#2     &lt;span style="color: rgb(0, 0, 102);"&gt;suaConta&lt;/span&gt;.transerePara(minhaConta, quantiaASerDoada);&lt;br /&gt;#3 &lt;span style="font-weight: bold;"&gt;fim se&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Se entre a linha 1 e 2 você fizer um saque de R$ 25.000,00 (isso pode ocorrer) a transferência não deveria ser realizada. Um modo para que isso ocorra é travar (lock) o dado que pode sofrer com essas concorrências. No JPA 1.0 você pode travar um objeto em dois passos (ai reside el peligro).&lt;br /&gt;&lt;br /&gt;#0 Conta suaConta = em.find(Conta.class, 175789);&lt;br /&gt;#1 em.lock(suaConta,LockMode.Write);&lt;br /&gt;&lt;br /&gt;Mais uma vez entre a linha 0 e a 1 pode ocorrer um problema de concorrência. (tanto que a especificação JPA 2.0 já prêve um modo similar ao session do hibernate, o travamento no momento da leitura, em.find(Conta.class, 175789, LockMode.PESSIMISTIC);)&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:180%;"&gt;Solução fácil para o problema acima&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Basta (se estiver usando Hibernate as your JPA provider) :&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 102);"&gt;((Session) ((EntityManagerImpl) em.getDelegate()).getSession())&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;O session já tem um jeito de select for update &lt;span style="font-weight: bold;"&gt;session.get(SuaClasse.class, seuId, tipoDeTravamento)&lt;/span&gt;. ( já perceberam que pra cada problema que você encontra na JPA 1.0 o hibernate quase sempre tem a solução?!)&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:180%;"&gt;Referências&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://en.wikibooks.org/wiki/Java_Persistence/Locking"&gt;http://en.wikibooks.org/wiki/Java_Persistence/Locking&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.javaworld.com/jw-07-2001/jw-0713-optimism.html"&gt;http://www.javaworld.com/jw-07-2001/jw-0713-optimism.html&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3760273245894556929-7604428459991620465?l=archsofty.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://archsofty.blogspot.com/feeds/7604428459991620465/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3760273245894556929&amp;postID=7604428459991620465' title='1 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3760273245894556929/posts/default/7604428459991620465'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3760273245894556929/posts/default/7604428459991620465'/><link rel='alternate' type='text/html' href='http://archsofty.blogspot.com/2009/10/jpa-lock-otimista-e-pessimista.html' title='JPA - lock otimista e pessimista, concorrência  e afins'/><author><name>Leandro</name><uri>http://www.blogger.com/profile/09724892719833243149</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3760273245894556929.post-5388394260441072049</id><published>2009-10-22T06:48:00.000-07:00</published><updated>2009-10-22T10:54:55.600-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='evento'/><category scheme='http://www.blogger.com/atom/ns#' term='caelum day'/><category scheme='http://www.blogger.com/atom/ns#' term='rio de janeiro'/><category scheme='http://www.blogger.com/atom/ns#' term='caelum'/><title type='text'>Organizacao é tudo</title><content type='html'>&lt;div style="text-align: justify;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.caelum.com.br/caelumday/images/h1-logo-trans.png"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 124px; height: 97px;" src="http://www.caelum.com.br/caelumday/images/h1-logo-trans.png" alt="" border="0" /&gt;&lt;/a&gt;Para as pessoas que moram no Rio de Janeiro ou que tenham disponibilidade para verem o evento &lt;a style="font-weight: bold;" href="http://www.caelum.com.br/caelumday/index.html"&gt;Caelum Day | in Rio&lt;/a&gt; já bastaria dizer que o evento será no mínimo bom. Mas dessa notícia o que gostaria de destacar não é só o evento ( se puder ir, vá :) ) e sim a organização do site do evento... algo que deveria ser copiado, isso mesmo &lt;span style="font-weight: bold;"&gt;ctrl+c ctrl+v&lt;/span&gt;! &lt;a href="http://www.caelum.com.br/caelumday/index.html"&gt;Vejam o site do evento Caelum Day&lt;/a&gt;, ele possui as características padrões como : &lt;a href="http://www.caelum.com.br/caelumday/programacao.html"&gt;Programação do Evento&lt;/a&gt; , grandes nomes para palestrar (&lt;a href="http://www.fragmental.com.br/"&gt;Philip Calçado&lt;/a&gt;), &lt;a href="http://www.caelum.com.br/caelumday/inscricao.html"&gt;inscrições&lt;/a&gt; e etc. porém dentro dessas características comuns ele traz informações IMPORTANTÍSSIMAS como dicas de &lt;a href="http://www.caelum.com.br/caelumday/restaurantes.html?height=300&amp;amp;width=300"&gt;restaurantes&lt;/a&gt;, &lt;a href="http://www.caelum.com.br/caelumday/hoteis.html?height=300&amp;amp;width=300"&gt;hotéis&lt;/a&gt; e até mesmo estacionamentos (dicas com valores :) ).  Ahh1 o evento ocorrerá no dia &lt;span style="font-weight: bold;"&gt;7 de Novembro de 2009 das 8h às 18h&lt;/span&gt;. Parabéns pela organização do evento.&lt;br /&gt;&lt;br /&gt;Ahh2 : só pra complementar no final do evento será sorteado um &lt;a href="http://www.nintendo.com/wii"&gt;Nintendo Wii&lt;/a&gt;. :)&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3760273245894556929-5388394260441072049?l=archsofty.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://archsofty.blogspot.com/feeds/5388394260441072049/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3760273245894556929&amp;postID=5388394260441072049' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3760273245894556929/posts/default/5388394260441072049'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3760273245894556929/posts/default/5388394260441072049'/><link rel='alternate' type='text/html' href='http://archsofty.blogspot.com/2009/10/organizacao-e-tudo.html' title='Organizacao é tudo'/><author><name>Leandro</name><uri>http://www.blogger.com/profile/09724892719833243149</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3760273245894556929.post-2070695705471901336</id><published>2009-10-17T17:15:00.000-07:00</published><updated>2009-10-17T17:37:39.210-07:00</updated><title type='text'>Quer pagar quanto?</title><content type='html'>&lt;div style="text-align: justify;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://diegomonteiro.files.wordpress.com/2008/06/ganancia.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 258px; height: 178px;" src="http://diegomonteiro.files.wordpress.com/2008/06/ganancia.jpg" alt="" border="0" /&gt;&lt;/a&gt;O portal de notícias da &lt;a href="http://rederecord.r7.com/"&gt;Record&lt;/a&gt; o &lt;a href="http://r7.com/"&gt;R7&lt;/a&gt; foi lançado a alguns dias atrás... até ai nada de anormal, &lt;a href="http://www.google.com.br/search?q=g1+x+r7&amp;amp;ie=utf-8&amp;amp;oe=utf-8&amp;amp;aq=t&amp;amp;rls=org.mozilla:pt-BR:official&amp;amp;client=firefox-a"&gt;certo&lt;/a&gt;?! Pois bem, fui verificar quanto valia o portal de acordo com o &lt;a href="http://bizinformation.org/"&gt;BizInformation&lt;/a&gt;. Se você ainda não conhece, se trata de um site que baseado em diversos parametros informa quanto seu site vale. Logo a primeira reação foi me assustar com o &lt;a href="http://bizinformation.org/br/www.r7.com"&gt;resultado&lt;/a&gt; para o site &lt;a href="http://www.r7.com"&gt;R7.com&lt;/a&gt; :&lt;br /&gt;&lt;/div&gt;&lt;h1 style="text-align: justify;"&gt;&lt;span&gt;R$2.692,79&lt;/span&gt;&lt;/h1&gt;&lt;div style="text-align: justify;"&gt;Somente isso! Imaginem meu site alternativo &lt;a href="http://the-empyrean.blogspot.com"&gt;the empyrean&lt;/a&gt; foi &lt;a href="http://bizinformation.org/br/www.the-empyrean.blogspot.com"&gt;cotado&lt;/a&gt; ao valor de :&lt;br /&gt;&lt;/div&gt;&lt;h1 style="text-align: justify;"&gt;&lt;span&gt;$3,946.8&lt;/span&gt;&lt;/h1&gt;&lt;div style="text-align: justify;"&gt;Outro detalhe é que para o site the empyrean foi usado (dolar americano) U$ ,ou seja, meu blog vale mais do que o portal R7  :-)  brincadeira....  &lt;br /&gt;&lt;span style="font-weight: bold;"&gt;ps: &lt;/span&gt;&lt;span style="font-style: italic;"&gt;penso que está claro o fato de que, o BizInformation, nesse caso do portal R7, falhou nas suas estátisticas.&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3760273245894556929-2070695705471901336?l=archsofty.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://archsofty.blogspot.com/feeds/2070695705471901336/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3760273245894556929&amp;postID=2070695705471901336' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3760273245894556929/posts/default/2070695705471901336'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3760273245894556929/posts/default/2070695705471901336'/><link rel='alternate' type='text/html' href='http://archsofty.blogspot.com/2009/10/quer-pagar-quanto.html' title='Quer pagar quanto?'/><author><name>Leandro</name><uri>http://www.blogger.com/profile/09724892719833243149</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3760273245894556929.post-3610791552191950490</id><published>2009-10-07T12:24:00.000-07:00</published><updated>2009-10-07T12:40:51.207-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='dsl externa'/><category scheme='http://www.blogger.com/atom/ns#' term='domain-specific language'/><category scheme='http://www.blogger.com/atom/ns#' term='dsl interna'/><category scheme='http://www.blogger.com/atom/ns#' term='dsl'/><title type='text'>Livro DSL In Action</title><content type='html'>&lt;div style="text-align: justify;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.manning.com/ghosh/ghosh_cover150.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 150px; height: 188px;" src="http://www.manning.com/ghosh/ghosh_cover150.jpg" alt="" border="0" /&gt;&lt;/a&gt;A &lt;a href="http://bit-zen.blogspot.com/"&gt;friend of mine&lt;/a&gt; enviou-me um email informando sobre o livro &lt;a href="http://www.manning.com/ghosh/"&gt;DSL In Action&lt;/a&gt; (ainda não pronto) para uma possível pré-leitura. Há até mesmo um &lt;a href="http://www.manning.com/ghosh/Ghosh_MEAP_01.pdf"&gt;capítulo&lt;/a&gt; no site. Pelo capítulo grátis pra degustação, penso que o livro pode ser um grande amigão, gostei da forma com que o autor trata o assunto &lt;a href="http://archsofty.blogspot.com/search/label/domain-specific%20language"&gt;domain-specific language&lt;/a&gt; - dsl - e por isso fica a dica aqui de uma boa leitura. C0m certeza mais um livro a se somar na pilha de &lt;a href="http://martinfowler.com/dslwip/"&gt;livros sobre dsl&lt;/a&gt;.&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3760273245894556929-3610791552191950490?l=archsofty.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://archsofty.blogspot.com/feeds/3610791552191950490/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3760273245894556929&amp;postID=3610791552191950490' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3760273245894556929/posts/default/3610791552191950490'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3760273245894556929/posts/default/3610791552191950490'/><link rel='alternate' type='text/html' href='http://archsofty.blogspot.com/2009/10/livro-dsl-in-action.html' title='Livro DSL In Action'/><author><name>Leandro</name><uri>http://www.blogger.com/profile/09724892719833243149</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3760273245894556929.post-3798466886615640329</id><published>2009-09-25T05:37:00.000-07:00</published><updated>2009-10-01T11:25:12.619-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='collection'/><category scheme='http://www.blogger.com/atom/ns#' term='projeto de software'/><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='projeto oo'/><category scheme='http://www.blogger.com/atom/ns#' term='interface'/><category scheme='http://www.blogger.com/atom/ns#' term='programacao'/><title type='text'>Usar sempre a interface mais genérica possível</title><content type='html'>&lt;div style="text-align: justify;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.learn-java-tutorial.com/Images/collections1.png"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 166px; height: 210px;" src="http://www.learn-java-tutorial.com/Images/collections1.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;span style="font-weight: bold;"&gt;Se você precisa somente &lt;/span&gt;&lt;a style="font-weight: bold;" href="http://java.sun.com/javase/6/docs/api/java/lang/Iterable.html"&gt;iterar&lt;/a&gt;&lt;span style="font-weight: bold;"&gt; sobre uma coleção de um tipo de objeto... &lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic; color: rgb(0, 0, 102);"&gt;Faça &lt;span style="font-weight: bold;"&gt;seuMetodoReceber&lt;/span&gt;(&lt;/span&gt;&lt;a style="font-style: italic; color: rgb(0, 0, 102);" href="http://java.sun.com/javase/6/docs/api/java/util/Collection.html"&gt;Collection&lt;/a&gt;&lt;span style="font-style: italic; color: rgb(0, 0, 102);"&gt;&lt;seuobjeto&gt; colecao); e não uma List ou Set...&lt;/seuobjeto&gt;&lt;/span&gt; (ou ainda uma Iterable)&lt;br /&gt;&lt;hr /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Se você vai trabalhar num nível muito baixo com Stream...&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic; color: rgb(0, 0, 102);"&gt;Faça s&lt;span style="font-weight: bold;"&gt;euMetodoReceber&lt;/span&gt;(&lt;a href="http://java.sun.com/javase/6/docs/api/java/io/InputStream.html"&gt;InputStream&lt;/a&gt; is); e &lt;/span&gt;&lt;span style="color: rgb(0, 0, 102);"&gt;&lt;span style="font-weight: bold;"&gt;não um FileInputStream...&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;hr /&gt;&lt;br /&gt;Essa lista segue sem fim...&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;span style="font-size:180%;"&gt;&lt;a href="http://archsofty.blogspot.com/2009/09/usar-sempre-interface-mais-generica.html"&gt;Porque sempre usar a interface mais genérica possível&lt;/a&gt;?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Você pode simplesmente mudar sua coleção que retornava uma List pra retortar uma &lt;a href="http://java.sun.com/javase/6/docs/api/java/util/TreeSet.html"&gt;TreeSet&lt;/a&gt;.  Mudar o comportamento esperado, mudar o Stream para outro tipo e outras coisas que são comuns, sem sofrer tanto. Se você nunca enfrentou o inferno das manutenções não entenderá completamente a dor.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Se você está pensando em criar uma &lt;a href="http://pt.wikipedia.org/wiki/Biblioteca_%28computa%C3%A7%C3%A3o%29"&gt;biblioteca&lt;/a&gt; então &lt;a href="http://archsofty.blogspot.com/2009/09/usar-sempre-interface-mais-generica.html"&gt;essa consideração&lt;/a&gt; deve ser ter atenção redobrada.&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;span style="font-size:130%;"&gt;Opte sempre pelo mais GENÉRICO possível.&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3760273245894556929-3798466886615640329?l=archsofty.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://archsofty.blogspot.com/feeds/3798466886615640329/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3760273245894556929&amp;postID=3798466886615640329' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3760273245894556929/posts/default/3798466886615640329'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3760273245894556929/posts/default/3798466886615640329'/><link rel='alternate' type='text/html' href='http://archsofty.blogspot.com/2009/09/usar-sempre-interface-mais-generica.html' title='Usar sempre a interface mais genérica possível'/><author><name>Leandro</name><uri>http://www.blogger.com/profile/09724892719833243149</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3760273245894556929.post-4799169367792037131</id><published>2009-09-23T07:26:00.000-07:00</published><updated>2009-09-23T08:00:52.175-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='classe anonimas'/><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='swing'/><category scheme='http://www.blogger.com/atom/ns#' term='netbeans'/><title type='text'>Aprendendo com seu IDE</title><content type='html'>&lt;div style="text-align: justify;"&gt;&lt;div style="text-align: justify;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://projetofert.files.wordpress.com/2009/05/java-duke-guitar_m.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 249px; height: 212px;" src="http://projetofert.files.wordpress.com/2009/05/java-duke-guitar_m.jpg" alt="" border="0" /&gt;&lt;/a&gt;Estou trabalhando em um projeto que utiliza &lt;a href="http://java.sun.com/javase/6/docs/technotes/guides/swing/"&gt;Swing&lt;/a&gt; e o &lt;a href="http://www.netbeans.org/"&gt;Netbeans&lt;/a&gt;. Ate aí nenhuma novidade... mas no decorrer da criação e do uso dos JComponents notei que o netbeans cria algumas coisas bizarras e outras legais... Tudo pra deixar o usuário (eu) feliz com as pedras no sapato da JTable. Bem o interessante não é nada disso... vou ao exemplo que facilitará.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Suponha que você tenha uma classe:&lt;br /&gt;&lt;hr /&gt;&lt;pre&gt;&lt;span style="color: rgb(0, 0, 102);"&gt;public class ClasseA{&lt;/span&gt;&lt;span style="color: rgb(0, 0, 102);"&gt;&lt;br /&gt;  public void fazNada(){&lt;br /&gt;     System.out.println("nada");&lt;br /&gt;&lt;/span&gt;&lt;span&gt;&lt;span style="color: rgb(0, 0, 102);"&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 102);"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 102);"&gt;}&lt;/span&gt;&lt;/pre&gt;&lt;hr /&gt;E uma classe de teste:&lt;br /&gt;&lt;hr /&gt;&lt;pre&gt;&lt;span style="color: rgb(0, 0, 102);"&gt;public class TestClasseA{&lt;br /&gt;&lt;/span&gt; &lt;span style="color: rgb(0, 0, 102);"&gt; public static void main(String[] args){&lt;/span&gt; &lt;span style="color: rgb(0, 0, 102);"&gt;&lt;br /&gt;    ClasseA a =  new ClasseA();&lt;/span&gt; &lt;span style="color: rgb(0, 0, 102);"&gt;&lt;br /&gt;    a.fazNada();&lt;/span&gt; &lt;span style="color: rgb(0, 0, 102);"&gt;&lt;br /&gt; }&lt;/span&gt; &lt;span style="color: rgb(0, 0, 102);"&gt;&lt;br /&gt;}&lt;/span&gt;&lt;/pre&gt;&lt;hr /&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;O resultado será simples um &lt;span style="background: black none repeat scroll 0% 0%; font-weight: bold; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous;color:white;" &gt;nada&lt;/span&gt;&lt;br /&gt;Bem e se eu quisesse alterar o comportamento do método fazNada... normalmente o que as pessoas fazem é (além de seguir um dos Patterns do GOF... esqueci o nome :S ) criar uma outra classe herdando da ClasseA e sobreescrevendo o comportamento para o método fazNada.&lt;br /&gt;&lt;br /&gt;O que notei que o netbeans faz é o seguinte:&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;hr /&gt;&lt;pre&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 102);"&gt;public class TestClasseA{&lt;/span&gt; &lt;span style="color: rgb(0, 0, 102);"&gt;&lt;br /&gt;public static void main(String[] args){&lt;br /&gt;     &lt;/span&gt; &lt;span style="color: rgb(0, 0, 102);"&gt;ClasseA a =  new ClasseA(){&lt;br /&gt;           &lt;/span&gt;&lt;span style="color: rgb(0, 0, 102);"&gt;public void fazNada(){&lt;br /&gt;                   System.out.println("tudo");&lt;br /&gt;           }&lt;/span&gt;&lt;span style="color: rgb(0, 0, 102);"&gt;&lt;br /&gt;      };&lt;/span&gt; &lt;span style="color: rgb(0, 0, 102);"&gt;&lt;br /&gt;      a.fazNada();&lt;/span&gt; &lt;span style="color: rgb(0, 0, 102);"&gt;&lt;br /&gt;}&lt;/span&gt; &lt;span style="color: rgb(0, 0, 102);"&gt;&lt;br /&gt;}&lt;/span&gt;&lt;/pre&gt;&lt;hr /&gt;&lt;div style="text-align: justify;"&gt;Isso mesmo sobreescrevendo-a na própria "instanciação"... a essa técnica, ou jeito, penso que o nome correto é classe anónima... (já vi vários usos para classes anónimas, mas esse foi novo.)&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3760273245894556929-4799169367792037131?l=archsofty.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://archsofty.blogspot.com/feeds/4799169367792037131/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3760273245894556929&amp;postID=4799169367792037131' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3760273245894556929/posts/default/4799169367792037131'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3760273245894556929/posts/default/4799169367792037131'/><link rel='alternate' type='text/html' href='http://archsofty.blogspot.com/2009/09/aprendendo-com-seu-ide.html' title='Aprendendo com seu IDE'/><author><name>Leandro</name><uri>http://www.blogger.com/profile/09724892719833243149</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3760273245894556929.post-6936147621532161745</id><published>2009-09-15T06:57:00.000-07:00</published><updated>2009-09-15T17:58:47.029-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='futil'/><title type='text'>Ajuda fútil com progress bar ou outro componente que registre o progresso</title><content type='html'>&lt;div style="text-align: justify;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.essentialobjects.com/screenshots/progressbar_aspnet.gif"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 258px; height: 193px;" src="http://www.essentialobjects.com/screenshots/progressbar_aspnet.gif" alt="" border="0" /&gt;&lt;/a&gt;Suponha que você tenha um progress bar que vai de UM_VALOR_MIN até UM_VALOR_MAX em unidades inteiras. Agora suponha que você tenha uma LISTA_DE_ARQUIVOS e deseja fazer um processamento(com_cada_um_dos_arquivos). E também quer deixar visível ao usuário esse progresso.&lt;br /&gt;Agora veja o algoritmo mais (f)útil pra isso.&lt;br /&gt;&lt;br /&gt;ps: esse é mais um daqueles posts que você pode se arrepender, tanto de ler quanto de escrever no futuro.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div  style="text-align: justify; color: rgb(0, 0, 102);font-family:courier new;"&gt;&lt;span style="font-size:85%;"&gt;&lt;string&gt;LISTA_DE_ARQUIVOS = listFilesAt("/home/myuser/myfolder/movies/")&lt;br /&gt;UM_VALOR_MAX = 100&lt;br /&gt;TOTAL_DE_ITENS = &lt;/string&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;LISTA_DE_ARQUIVOS &lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;string&gt;.tamanho&lt;br /&gt;QTD_POR_ITEM = UM_VALOR_MAX / TOTAL_DE_ITENS&lt;br /&gt;UM_VALOR_MIN = QTD_POR_ITEM&lt;br /&gt;&lt;br /&gt;for (String item : LISTA_DE_ARQUIVOS) {&lt;br /&gt;   File file = new File(item)&lt;br /&gt;   processar(file)&lt;br /&gt;   marcarProgresso(round( UM_VALOR_MIN+ 0.059))&lt;br /&gt;   UM_VALOR_MIN+= QTD_POR_ITEM&lt;br /&gt;&lt;/string&gt;&lt;/span&gt;&lt;/div&gt;&lt;span style=";font-family:courier new;font-size:85%;"  &gt;&lt;span style="color: rgb(0, 0, 102);"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3760273245894556929-6936147621532161745?l=archsofty.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://archsofty.blogspot.com/feeds/6936147621532161745/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3760273245894556929&amp;postID=6936147621532161745' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3760273245894556929/posts/default/6936147621532161745'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3760273245894556929/posts/default/6936147621532161745'/><link rel='alternate' type='text/html' href='http://archsofty.blogspot.com/2009/09/ajuda-futil-com-progress-bar-ou-outro.html' title='Ajuda fútil com progress bar ou outro componente que registre o progresso'/><author><name>Leandro</name><uri>http://www.blogger.com/profile/09724892719833243149</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3760273245894556929.post-5613201097939923899</id><published>2009-09-03T17:22:00.000-07:00</published><updated>2009-09-04T04:30:12.322-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='performance'/><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='aplicações web'/><category scheme='http://www.blogger.com/atom/ns#' term='cache distribuido'/><category scheme='http://www.blogger.com/atom/ns#' term='cache'/><category scheme='http://www.blogger.com/atom/ns#' term='escalabilidade'/><title type='text'>Cache encurtando viagens</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://upload.wikimedia.org/wikipedia/commons/0/0e/Rubik%27s_cube_variations.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 306px; height: 185px;" src="http://upload.wikimedia.org/wikipedia/commons/0/0e/Rubik%27s_cube_variations.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;span style="font-size:180%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size:180%;"&gt;Cache é importante? &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Me lembro quando comprei meu processador Atlhon XP 2400, na época tinha o maior cache maior da categoria. Tinha um cache L1 para dados e instruções de 64KB (cada) e L2 com 256KB. Hoje um E8400 tem cache L1 de 32KB pra dados e 32KB para instruções e um L2 com 6MB (compartilhado entre os núcleos) indo além disso um Core i7 adiciona mais um nível (LEVEL) o L3. ( ele tem L1 = 32KB pra dados e 32KB pra instruções, L2 = 4 x 256KB e L3 = 8MB compartilhada com todos núcleos). Bem, se os projetistas de hardware já se preocuparam com isso pra que eu vou fazer cache?&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;span style="font-size:180%;"&gt;O que é um Cache?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;O processo de armazenamento temporário de informações recentemente acessadas em um subsistema de memória especial para acesso mais rápido. &lt;span style="font-weight: bold;"&gt;(&lt;a href="http://support.microsoft.com/"&gt;Windows Vista Center Help&lt;/a&gt;) &lt;/span&gt;&lt;br /&gt;É um dispositivo de acesso rápido, interno a um sistema, que serve de intermediário entre um operador de um processo e o dispositivo de armazenamento ao qual esse operador acede. A vantagem principal na utilização de uma cache consiste em evitar o acesso ao dispositivo de armazenamento - que pode ser demorado -, armazenando os dados em meios de acesso mais rápidos. (&lt;a href="http://pt.wikipedia.org/wiki/Cache"&gt;Wikipedia&lt;/a&gt;)&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;span style="font-size:180%;"&gt;Exemplo (ridículo) do uso de Cache (&lt;a href="http://user.uni-frankfurt.de/%7Efmphyadm/TheoComp/java/CD/docs/sun.misc.Cache.html"&gt;sun.misc.Cache&lt;/a&gt;)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;blockquote style="color: rgb(0, 0, 102); font-family: lucida grande;"&gt;        Cache cache = MCache.get(); //singleton, session, &lt;a href="http://java.sun.com/products/jndi/"&gt;jndi&lt;/a&gt;, &lt;a href="http://jakarta.apache.org/jcs/"&gt;cache distributed server&lt;/a&gt;...    &lt;br /&gt;     if (cache.get("homePageNews")==null){&lt;br /&gt;         //busco no banco&lt;br /&gt;         //quando busco no banco&lt;br /&gt;         //atualizo também o cache.&lt;br /&gt;     }else{&lt;br /&gt;         //salvei tempo&lt;br /&gt;         Set&lt;new&gt; news = (Set&lt;new&gt;)cache.get("homePageNews");&lt;br /&gt;     }&lt;/new&gt;&lt;/new&gt;&lt;/blockquote&gt;&lt;span style="font-size:180%;"&gt;Senta que lá vem história, experiência quase-real&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Numa consultoria 0800 à um amigo &lt;a href="http://www.php.net/"&gt;Php-Ense&lt;/a&gt;; ele me retratava que apesar de ser um servidor não tão parrudo o sistema estava apresentando lentidão (demora de 0,5 a 1,8 segundos), as telas estavam demorando muito a serem carregadas... Já cheguei pensando que seria uma batalha(tanto pelo pouco conhecimento em PHP, quanto pela descrição do problema). Se tratava de uma aplicação simples com poucos &lt;a href="http://pt.wikipedia.org/wiki/CRUD"&gt;'&lt;span style="color: rgb(255, 0, 0);"&gt;G&lt;/span&gt;ruds'&lt;/a&gt; (cerca de 30). Na demonstração percebi que algumas telas demoravam mais do que outras para carregar , e uma demorava quase 2 segundos (essa que encomodava-o) que era a gestão de clientes, nela havia três combos: países, estados e cidades. Uma outra era a página inicial que carregava : últimas notícias, o perfil de três clientes (randômicos), três serviços prestados (randômicos), um texto sobre a "empresa" e uma mensagem. Tudo isso era carregado do banco a cada requisição, se 100 pessoas abrissem o browser naquele site seriam enviados 100 equisições ao &lt;a href="http://pt.wikipedia.org/wiki/Banco_de_dados_relacional"&gt;banco&lt;/a&gt; (que provavelmente por se tratar do mesmo dado os teria em cache, ôoo o banco também tem cache, todo mundo têm eu também quero... &lt;a href="http://www.google.com.br/search?q=cache+problems&amp;amp;btnG=Pesquisar&amp;amp;hl=pt-BR&amp;amp;client=firefox-a&amp;amp;rls=org.mozilla%3Apt-BR%3Aofficial&amp;amp;sa=2"&gt;será?&lt;/a&gt; ) mesmo que o banco lhe salve um pouco de processamento, você continua enviando e recebendo dados pela rede e isso é danoso. Sugeri a ele usar um &lt;a href="http://www.php.net/memcache"&gt;framework de Cache&lt;/a&gt; ou criar um simples e sincronizá-lo com a base de N minutos a N minutos. Depois que ele seguiu meus conselhos ele disse ter uma melhora bem melhor do que esperava. Isso, claro, não significa que todos os problemas de performance serão sanados com uso de cache, alias o uso indiscriminado de tal recurso pode também afetar a performance negativamente. Agora imagine que uma aplicação esteja distribuída em vários servidores em clustes um único sistema de Cache não irá ajudar muito, para tanto já existem sistemas de &lt;a href="http://www.danga.com/memcached/"&gt;Cache distribuidos&lt;/a&gt; (acredite que isso é  mais simples do que minha mente temerosa de computação distribuída possa imaginar).&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3760273245894556929-5613201097939923899?l=archsofty.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://archsofty.blogspot.com/feeds/5613201097939923899/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3760273245894556929&amp;postID=5613201097939923899' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3760273245894556929/posts/default/5613201097939923899'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3760273245894556929/posts/default/5613201097939923899'/><link rel='alternate' type='text/html' href='http://archsofty.blogspot.com/2009/09/cache-encurtando-viajens.html' title='Cache encurtando viagens'/><author><name>Leandro</name><uri>http://www.blogger.com/profile/09724892719833243149</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3760273245894556929.post-1068331266071914383</id><published>2009-09-01T06:56:00.000-07:00</published><updated>2009-09-01T07:03:36.483-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='open source'/><category scheme='http://www.blogger.com/atom/ns#' term='gnu'/><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><title type='text'>Lista de bons programas open-source.</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://contraelfascismo.files.wordpress.com/2008/07/gnu-linux.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 262px; height: 210px;" src="http://contraelfascismo.files.wordpress.com/2008/07/gnu-linux.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;span style="font-style: italic;"&gt;Soa como clichê mas vai ai minha lista:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Media Center - &lt;a href="http://www.moovida.com/screenshots/"&gt;http://www.moovida.com/screenshots/&lt;/a&gt;&lt;br /&gt;Playstation 2 - &lt;a href="http://code.google.com/p/pcsx2/"&gt;http://code.google.com/p/pcsx2/&lt;/a&gt;&lt;br /&gt;Wii / Dolphin Emulator - &lt;a href="http://code.google.com/p/dolphin-emu"&gt;http://code.google.com/p/dolphin-emu&lt;/a&gt;/&lt;br /&gt;JDowloader - &lt;a href="http://jdownloader.org/"&gt;http://jdownloader.org/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;ps: só citei os que estou usando e aproveitando (muito) ultimamente.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3760273245894556929-1068331266071914383?l=archsofty.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://archsofty.blogspot.com/feeds/1068331266071914383/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3760273245894556929&amp;postID=1068331266071914383' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3760273245894556929/posts/default/1068331266071914383'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3760273245894556929/posts/default/1068331266071914383'/><link rel='alternate' type='text/html' href='http://archsofty.blogspot.com/2009/09/lista-de-bons-programas-open-source.html' title='Lista de bons programas open-source.'/><author><name>Leandro</name><uri>http://www.blogger.com/profile/09724892719833243149</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3760273245894556929.post-427501448340672379</id><published>2009-08-14T20:11:00.000-07:00</published><updated>2009-09-24T10:13:37.021-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='projeto de software'/><category scheme='http://www.blogger.com/atom/ns#' term='modismos'/><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='reuso'/><category scheme='http://www.blogger.com/atom/ns#' term='projeto oo'/><category scheme='http://www.blogger.com/atom/ns#' term='modelagem'/><title type='text'>Minhas::Commons::Lib::Utils &gt; Apache::Commons</title><content type='html'>&lt;div style="text-align: justify;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://portal.sgul.ac.uk/archive/environment/reuse_reduce_recycle.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 240px; height: 181px;" src="https://portal.sgul.ac.uk/archive/environment/reuse_reduce_recycle.jpg" alt="" border="0" /&gt;&lt;/a&gt;Por mais que existam frameworks como Jpa, Jsf, Ruby On Rails, Lucene, Spring e outros, provavelmente sempre existirá uma característica ou um pedaço de código que nós desenvolvedores iremos criar e guarda-los em um modulo (pacote...) de utils. Há alguns desenvolvedores que mesmo conscientes de que já existem frameworks de ORM, criam seus próprios produtos. Acredite ainda existem.&lt;br /&gt;&lt;br /&gt;Se você é aquele que segue a idéia de não reinventar a roda tente sempre, antes de criar essas "libs", verificar se já há algum código criado pra tal problema.&lt;br /&gt;&lt;br /&gt;Pensando nesses problemas a grande Apache criou vários projetos com um subnome de Commons. (tanto para plataforma Java quanto .NET) E são esses projetos (não todos, só alguns) que vou resumir aqui seus usos, a idéia não é dar um guideline de uso dos projetos mas apenas mostrar que para quase toda "vontade" de criar uma lib, já existe uma pronta. Então a use...&lt;br /&gt;&lt;br /&gt;Tenho um problema de desempenho que acho que resolveria se mantivesse alguns objetos pesados no pool..&lt;br /&gt;&lt;br /&gt;Primeiro tenha certeza de onde está o seu real problema de desempenho, isso você só consegue medindo... dá-lhe profiler. Às vezes não são os poucos objetos pesados, mas a grande quantidade de pequenos repetidos! Bem para esse problema a Apache já criou projeto :) &lt;a href="http://commons.apache.org/pool/guide/index.html"&gt;Apache Commons Pool&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Trabalho numa empresa que desenvolveu um sistema para o TRE-XX e lá nos temos que validar títulos de eleitor, isso eu dúvido que apache tenha...&lt;br /&gt;&lt;br /&gt;Realmente a apache (eu acho que não, vai saber?!...) parece não ter, mas a Caelum desenvolveu (e está evoluindo) um &lt;a href="http://stella.caelum.com.br/"&gt;Framework chamado Stella&lt;/a&gt; (&lt;a href="http://stella.caelum.com.br/core-formatters.html"&gt;http://stella.caelum.com.br/core-formatters.html&lt;/a&gt;), justamente para prover soluções para problemas que nós desenvolvedores Brasileiros enfrentamos diariamente, tais como: validar cpf, boletos de bancos nacionais, formatar cnpj e etc.&lt;br /&gt;&lt;br /&gt;Pô, uso a API padrão do Java (6) no que tange ao assunto de coleções mas não consigo encontrar várias operações que gostaria de fazer com essas coleções... e ai?&lt;br /&gt;&lt;br /&gt;Aqui o conselho seria primeiro dar uma boa olhada nas classes Collections (não a Interface Collection) e a Arrays, elas já provem bastantes características mas se mesmo assim não se der por satisfeito pesquise e irá econtrar uma &lt;a href="http://commons.apache.org/collections/userguide.html"&gt;Collection-Commons&lt;/a&gt; (&lt;a href="http://commons.apache.org/collections/userguide.html"&gt;http://commons.apache.org/collections/userguide.html&lt;/a&gt;) da Apache.&lt;br /&gt;&lt;br /&gt;Tô trabalhando num sistema legado e aqui, por questões de performance, uso o JDBC e tenho que criar, mapear e fazer n coisas de banco, tudo na "mão"...&lt;br /&gt;&lt;br /&gt;Performance ... sempre deve ser medida pra ser confirmada. A Apache (novamente) tem um projeto &lt;a href="http://commons.apache.org/dbutils/examples.html"&gt;DBUtils&lt;/a&gt; (http://commons.apache.org/dbutils/examples.html) que têm várias funcionalidades para manuseio de banco de dados.&lt;br /&gt;&lt;br /&gt;Nem sempre as utils vem para só para resolver problemas, às vezes criamos utils para facilitar nosso código.&lt;br /&gt;&lt;br /&gt;Pensando assim a Apache também criou uma outra Commons (http://commons.apache.org/io/description.html) para IO, o que torna uma tarefa entediante de ler os bytes de um InputStream numa simples tarefa.&lt;br /&gt;&lt;br /&gt;Tarefas como mandar email, realizar operação matemáticas complexas, usar recursos e protocolos das redes de computadores, já estão implementadas, testadas e sendo usadas em produção por várias pessoas.&lt;br /&gt;&lt;br /&gt;Por último, pare e pense: porque será que grandes projetos, tais como Hibernate Core ou Search, Spring e outros, tem dependências de grande parte dos projetos xyz-commons-kwq.zip da apache? será mesmo necessário criar aquela util ou mesmo criar uma exceção para dizer que o argumento passado à um método veio nulo?&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3760273245894556929-427501448340672379?l=archsofty.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://archsofty.blogspot.com/feeds/427501448340672379/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3760273245894556929&amp;postID=427501448340672379' title='1 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3760273245894556929/posts/default/427501448340672379'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3760273245894556929/posts/default/427501448340672379'/><link rel='alternate' type='text/html' href='http://archsofty.blogspot.com/2009/08/minhascommonslibutils-apachecommons.html' title='Minhas::Commons::Lib::Utils &gt; Apache::Commons'/><author><name>Leandro</name><uri>http://www.blogger.com/profile/09724892719833243149</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3760273245894556929.post-6695844217927384734</id><published>2009-08-12T04:36:00.000-07:00</published><updated>2009-08-12T06:48:50.578-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tiny types'/><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='design'/><category scheme='http://www.blogger.com/atom/ns#' term='modelagem'/><title type='text'>Tiny Types não são desperdícios</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://s2.buzzfeed.com/static/imagebuzz/terminal01/2009/4/6/15/the-worlds-tiniest-puppy-27249-1239047576-11.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 202px; height: 164px;" src="http://s2.buzzfeed.com/static/imagebuzz/terminal01/2009/4/6/15/the-worlds-tiniest-puppy-27249-1239047576-11.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;div style="text-align: justify;"&gt;&lt;a href="http://archsofty.blogspot.com/2009/08/tiny-types-nao-sao-desperdicios.html"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_0"&gt;Tiny&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_1"&gt;Types&lt;/span&gt;&lt;/a&gt; são importantes por diversos &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_2"&gt;fatores&lt;/span&gt; dos quais me lembro de: enriquecimento do domínio, &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_3"&gt;forçagem&lt;/span&gt; de &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_4"&gt;tipagem&lt;/span&gt;, clientes das classes perdem o poder de errar no uso &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_5"&gt;incorreto&lt;/span&gt; da ordem dos &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_6"&gt;parâmetros&lt;/span&gt; de algum método.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;O que é um &lt;a href="http://archsofty.blogspot.com/2009/08/tiny-types-nao-sao-desperdicios.html"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_7"&gt;tiny&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_8"&gt;type&lt;/span&gt;&lt;/a&gt;?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Sabe aquelas propriedades que costumamos definir como &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_9"&gt;simplesmente&lt;/span&gt; String (nome, sobrenome, &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_10"&gt;cpf&lt;/span&gt;, &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_11"&gt;cep&lt;/span&gt;) , alguns desses atributos podem acabar se transformando em um tipo próprio.... os &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_12"&gt;tiny&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_13"&gt;types&lt;/span&gt;.&lt;br /&gt;Definição: São &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_14"&gt;objetos&lt;/span&gt; pequeninos (&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_15"&gt;dahhh&lt;/span&gt;) que normalmente são &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_16"&gt;imutáveis&lt;/span&gt; e seguem o &lt;a href="http://martinfowler.com/eaaCatalog/valueObject.html"&gt;padrão &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_17"&gt;VO&lt;/span&gt;&lt;/a&gt; (de &lt;a href="http://martinfowler.com/"&gt;Martin &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_18"&gt;Fowler&lt;/span&gt;&lt;/a&gt;), podem parecer chatos no &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_19"&gt;inícios&lt;/span&gt; para alguns mas se mostram poderosos com o passar do tempo.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;E as vantagens??&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_20"&gt;Enriquecimento&lt;/span&gt; do domínio: &lt;span style="font-weight: bold;"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_21"&gt;new&lt;/span&gt; Pessoa(&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_22"&gt;new&lt;/span&gt; Nome("&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_23"&gt;Luiz&lt;/span&gt;"), &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_24"&gt;new&lt;/span&gt; Sobrenome("&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_25"&gt;Inacio&lt;/span&gt;"))&lt;/span&gt;&lt;br /&gt;Diminuição de erros: tendo uma classe qualquer Pessoa com atributos nome e sobrenome como String poderia nos permitir fazer coisas como: &lt;span style="font-weight: bold;"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_26"&gt;new&lt;/span&gt; Pessoa("&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_27"&gt;Inacio&lt;/span&gt;","&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_28"&gt;Luiz&lt;/span&gt;")&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;E as desvantagens???&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Claramente você terá mais trabalho para definir e até mesmo mapear (seja o @Embebbed do padrão &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_29"&gt;JPA&lt;/span&gt; ou seu &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_30"&gt;mapeador&lt;/span&gt; próprio ou seu &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_31"&gt;framework&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_32"&gt;predileto&lt;/span&gt; para mapeamento &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_33"&gt;ORM&lt;/span&gt;) esses &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_34"&gt;mini&lt;/span&gt;-tipos que serão incorporados a um &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_35"&gt;objeto&lt;/span&gt; maior.&lt;br /&gt;&lt;br /&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_36"&gt;ps&lt;/span&gt;: inspirado (entre outros...) pelo &lt;a href="http://blog.caelum.com.br/2009/07/20/pequenos-objetos-imutaveis-e-tiny-types/"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_37"&gt;post&lt;/span&gt; da &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_38"&gt;caelum&lt;/span&gt;.&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3760273245894556929-6695844217927384734?l=archsofty.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://archsofty.blogspot.com/feeds/6695844217927384734/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3760273245894556929&amp;postID=6695844217927384734' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3760273245894556929/posts/default/6695844217927384734'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3760273245894556929/posts/default/6695844217927384734'/><link rel='alternate' type='text/html' href='http://archsofty.blogspot.com/2009/08/tiny-types-nao-sao-desperdicios.html' title='Tiny Types não são desperdícios'/><author><name>Leandro</name><uri>http://www.blogger.com/profile/09724892719833243149</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3760273245894556929.post-1212584092519838450</id><published>2009-08-11T05:36:00.000-07:00</published><updated>2009-08-11T06:29:34.665-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ruby'/><category scheme='http://www.blogger.com/atom/ns#' term='modismos'/><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='jruby'/><category scheme='http://www.blogger.com/atom/ns#' term='domain-specific language'/><category scheme='http://www.blogger.com/atom/ns#' term='ddd'/><category scheme='http://www.blogger.com/atom/ns#' term='dsl'/><category scheme='http://www.blogger.com/atom/ns#' term='domain-driven design'/><category scheme='http://www.blogger.com/atom/ns#' term='jvm'/><title type='text'>JRuby, Abobrinhas e DDD</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://proudatheists.files.wordpress.com/2009/07/pity-the-fool1.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 152px; height: 166px;" src="http://proudatheists.files.wordpress.com/2009/07/pity-the-fool1.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;div style="text-align: justify;"&gt;&lt;a href="http://pt.wikipedia.org/wiki/Programa%C3%83%C2%A7%C3%83%C2%A3o_funcional"&gt;Programação funcional&lt;/a&gt;, linguagem dinâmica, duck typing, &lt;a href="http://en.wikipedia.org/wiki/Closure_%28computer_science%29"&gt;closures&lt;/a&gt;, fluência, dsl, behavior, &lt;a href="http://www.akitaonrails.com/2008/2/22/tradu-o-tipagem-din-mica-vs-linguagem-din-mica-explicado"&gt;tipagem&lt;/a&gt; inferida... são assuntos recorrentes das rodas dos desenvolvedores mais &lt;span style="font-weight: bold; color: rgb(0, 0, 102);"&gt;cool&lt;/span&gt;. Em uma dessas rodas ouvi a seguinte afirmação sobre o &lt;a href="http://jruby.codehaus.org/"&gt;JRuby&lt;/a&gt;:&lt;br /&gt;&lt;span style="font-style: italic;"&gt;"Eu não gosto do JRuby... gosto do &lt;a href="http://www.ruby-lang.org/"&gt;Ruby puro&lt;/a&gt;, JRuby é apenas os problemas do Java no Ruby"&lt;/span&gt;&lt;br /&gt;Isso foi numa roda de "experientes em Java"... claro que tentei explicar que a frase não fazia muito sentido e que deveriamos pensar em Plataforma... e que JRuby é uma implementação para o interpretador de Ruby e não uma linguagem, que era até mesmo mais rápido do que o MRI (ou CRuby para os mais intimos), dai que eles se renderam e entenderam o que era o JRuby e MRI. Eu ainda curioso, perguntei como tinham chegado aquela conclusão, e para minha surpresa um me disse que foi porque veio com &lt;a href="http://www.netbeans.org"&gt;NetBeans&lt;/a&gt; e por isso não deveria ser coisa boa... (pode? rsrsrsrsr)&lt;br /&gt;&lt;br /&gt;Hoje também li um &lt;a href="http://blog.aspercom.com.br/2009/08/11/repositorios-ddd/"&gt;post (ótimo por sinal) do Rodrigo Yoshima (AsperCom)&lt;/a&gt; no qual ele discorre o já batido (mas nunca esgotado) assunto Repositories... ele escreveu uma frase ("Não é uma opção arquitetural, somente estou transparecendo o domínio.") que me fez lembrar mais uma vez da falta de cautela dos desenvolvedores ao se preocuparem muito mais em tecnologia do que com a realidade. Certa vez estava realizando um projeto (&lt;a href="http://blog.fragmental.com.br/2008/07/25/uh-eme-ele/"&gt;não UML&lt;/a&gt;, na definição das classes mesmo)  no qual dividi uma entidade em dois conceitos mas que tinha somente uma tabela no banco, quase 100% das pessoas me criticaram por estar sendo muito purista, naquele momento não sabia exatamente o que dizer à eles mas lembro que o sentimento era que eu estava apenas transcrevendo o que houvi dos usuários.&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3760273245894556929-1212584092519838450?l=archsofty.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://archsofty.blogspot.com/feeds/1212584092519838450/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3760273245894556929&amp;postID=1212584092519838450' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3760273245894556929/posts/default/1212584092519838450'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3760273245894556929/posts/default/1212584092519838450'/><link rel='alternate' type='text/html' href='http://archsofty.blogspot.com/2009/08/jruby-abobrinhas-e-ddd.html' title='JRuby, Abobrinhas e DDD'/><author><name>Leandro</name><uri>http://www.blogger.com/profile/09724892719833243149</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3760273245894556929.post-2107547474875757714</id><published>2009-07-29T07:06:00.001-07:00</published><updated>2009-07-29T07:36:11.964-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='modismos'/><category scheme='http://www.blogger.com/atom/ns#' term='governancia'/><category scheme='http://www.blogger.com/atom/ns#' term='ti'/><category scheme='http://www.blogger.com/atom/ns#' term='computação nas nuvens'/><category scheme='http://www.blogger.com/atom/ns#' term='cloud-computing'/><category scheme='http://www.blogger.com/atom/ns#' term='cio'/><category scheme='http://www.blogger.com/atom/ns#' term='soa'/><title type='text'>Aprenda o TInés para se dar bem</title><content type='html'>&lt;div style="text-align: justify;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://farm4.static.flickr.com/3281/3081998237_56cd1e0b4d.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 289px; height: 208px;" src="http://farm4.static.flickr.com/3281/3081998237_56cd1e0b4d.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;span style="font-style: italic;"&gt;"Com a &lt;a href="http://pt.wikipedia.org/wiki/Governan%C3%A7a_em_TI"&gt;&lt;span style="font-weight: bold; color: rgb(102, 0, 0);"&gt;governança&lt;/span&gt;&lt;/a&gt; dos &lt;a href="http://pt.wikipedia.org/wiki/Processos_de_neg%C3%B3cio"&gt;&lt;span style="font-weight: bold; color: rgb(255, 102, 0);"&gt;processos de negocios&lt;/span&gt;&lt;/a&gt; facilitada pelo uso de &lt;a href="http://pt.wikipedia.org/wiki/Service-oriented_architecture"&gt;&lt;span style="font-weight: bold; color: rgb(0, 51, 0);"&gt;SOA&lt;/span&gt;&lt;/a&gt;, o &lt;a href="http://pt.wikipedia.org/wiki/Alinhamento_Estrat%C3%A9gico"&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 102);"&gt;alinhamento dos negocios&lt;/span&gt;&lt;/a&gt; com a T.I. se tornou mais ágil. Nossa empresa também está pensando em levar para as &lt;a href="http://pt.wikipedia.org/wiki/Computa%C3%A7%C3%A3o_em_nuvem"&gt;&lt;span style="font-weight: bold; color: rgb(51, 0, 51);"&gt;nuvens&lt;/span&gt;&lt;/a&gt; nossa infra-estrutura de armazenamento."&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Escutei, exatamente, isso numa palestra que um &lt;a href="http://pt.wikipedia.org/wiki/Chief_information_officer"&gt;CIO&lt;/a&gt; apresentava e acredito que ele sabia exatamente o que estava falando. O fato não é se ele sabia ou não o que dizia e sim que todos prestavam com atenção e respeito pelas palavras do homem bem vestido.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Não quero, de jeito algum, diminuir os substantivos (e seus livros, teorias...) mas apenas alertar que usar palavras "corretas" numa entrevista pode te dar vantagens em relação aos outros entrevistados.&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Deixe pra discutir se essas buzzwords são modas ou vieram pra ficar com seus amigos ou no seu blog.&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3760273245894556929-2107547474875757714?l=archsofty.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://archsofty.blogspot.com/feeds/2107547474875757714/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3760273245894556929&amp;postID=2107547474875757714' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3760273245894556929/posts/default/2107547474875757714'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3760273245894556929/posts/default/2107547474875757714'/><link rel='alternate' type='text/html' href='http://archsofty.blogspot.com/2009/07/aprenda-o-tines-para-se-dar-bem.html' title='Aprenda o TInés para se dar bem'/><author><name>Leandro</name><uri>http://www.blogger.com/profile/09724892719833243149</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://farm4.static.flickr.com/3281/3081998237_56cd1e0b4d_t.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3760273245894556929.post-1332295577146161776</id><published>2009-07-17T04:50:00.000-07:00</published><updated>2009-07-17T05:01:51.153-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='livro'/><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='download'/><category scheme='http://www.blogger.com/atom/ns#' term='caelum'/><category scheme='http://www.blogger.com/atom/ns#' term='arquitetura'/><title type='text'>Arquitetura e Design de Software Uma visão sobre a plataforma Java drafts....</title><content type='html'>&lt;div style="text-align: justify;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.arquiteturajava.com.br/images/img_livro.png"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 206px; height: 346px;" src="http://www.arquiteturajava.com.br/images/img_livro.png" alt="" border="0" /&gt;&lt;/a&gt;No mês de maio de 2009, postei aqui sobre um investimento que você iria fazer que era certeza de &lt;a href="http://www.blogger.com/pt.wikipedia.org/wiki/Retorno_sobre_investimento"&gt;ROI&lt;/a&gt;!&lt;br /&gt;( pra quem não se lembra &lt;a href="http://archsofty.blogspot.com/2009/05/investimento-certo-em-novembro-de-2009.html"&gt;clique aqui&lt;/a&gt;)&lt;br /&gt;&lt;br /&gt;O livro (ainda WIP - Work In Progress) &lt;a href="http://www.arquiteturajava.com.br/"&gt;Arquitetura e Design de Software Uma visão sobre a plataforma Java&lt;/a&gt; já mostra um pouco da sua cara, o &lt;a href="http://www.caelum.com.br"&gt;pessoal&lt;/a&gt; liberou alguns PDFs iniciais com um pouco do conteúdo do livro (que mais uma vez sai em Novembro desse ano (2009), se tudo correr bem claro!)!&lt;br /&gt;&lt;br /&gt;Pra quem deseja fazer o &lt;span style="font-weight: bold;"&gt;download&lt;/span&gt; desses rascunhos iniciais do livro &lt;a href="http://www.arquiteturajava.com.br/"&gt;Arquitetura e Design de Software Uma visão sobre a plataforma Java&lt;/a&gt;  &lt;a style="font-weight: bold;" href="http://www.arquiteturajava.com.br/#conteudo"&gt;clique aqui&lt;/a&gt;&lt;span style="font-weight: bold;"&gt;.&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;fonte original:&lt;/span&gt; &lt;a style="font-style: italic;" href="http://blog.caelum.com.br/2009/07/17/livro-arquitetura-e-design-de-software-4-topicos-do-draft-liberados/"&gt;http://blog.caelum.com.br/2009/07/17/livro-arquitetura-e-design-de-software-4-topicos-do-draft-liberados/&lt;br /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3760273245894556929-1332295577146161776?l=archsofty.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://archsofty.blogspot.com/feeds/1332295577146161776/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3760273245894556929&amp;postID=1332295577146161776' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3760273245894556929/posts/default/1332295577146161776'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3760273245894556929/posts/default/1332295577146161776'/><link rel='alternate' type='text/html' href='http://archsofty.blogspot.com/2009/07/arquitetura-e-design-de-software-uma.html' title='Arquitetura e Design de Software Uma visão sobre a plataforma Java drafts....'/><author><name>Leandro</name><uri>http://www.blogger.com/profile/09724892719833243149</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3760273245894556929.post-8726992283779991690</id><published>2009-07-01T07:10:00.000-07:00</published><updated>2009-07-01T07:12:45.346-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='javaserver faces'/><category scheme='http://www.blogger.com/atom/ns#' term='jsf 2'/><category scheme='http://www.blogger.com/atom/ns#' term='javaserver faces 2'/><category scheme='http://www.blogger.com/atom/ns#' term='jsf'/><title type='text'>JSF 2.0 na prática - Navegação implicíta</title><content type='html'>&lt;span style="font-size:180%;"&gt;Novas características do JSF 2.0 na prática - Navegação implicíta&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Depois do primeiro exemplo (&lt;a href="http://archsofty.blogspot.com/2009/07/exemplo-simples-usando-javaserver-faces.html"&gt;primeiro exemplo&lt;/a&gt;), vamos tentar explorar as novas características. A primeira delas, a anotação &lt;span style="color: rgb(0, 0, 102);"&gt;@ManagedBean&lt;/span&gt;, já foi usada no primeiro exemplo.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:180%;"&gt;Navegação padrão...&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Cansado ou triste por ter que escrever navigation-rules pra coisas muito obvias... O padrão JSF 2 trouxe dos já-bem-conhecidos frameworks a idéia de só ter que criar uma regra de navegação na exceção, nos casos comuns prevalece o "bom senso"...&lt;br /&gt;Bem o seu bom senso pode ser diferente do meu que pode ser diferente do Super Mario que por sua vez também pode ser diferente do Senhor Abravanel. Leia sobre essa regra em  &lt;a href="http://blog.gilliard.eti.br/2009/05/implicit-navigation-jsf-2/"&gt;http://blog.gilliard.eti.br/2009/05/implicit-navigation-jsf-2/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:180%;"&gt;De volta ao exemplo&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Para demonstrar como essa característica funciona na prática, adicione o seguinte componente a nossa página index.xhtml.&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 102, 255);"&gt;[br /][h:commandButton value="Navegação implícita!" action="login"/] &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Além disso crie uma página com nome login.xhtml&lt;br /&gt;&lt;span style="color: rgb(51, 102, 255);"&gt;[?xml version="1.0" encoding="ISO-8859-1" ?]&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 102, 255);"&gt;[!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 102, 255);"&gt;      "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"]&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 102, 255);"&gt;[html xmlns="http://www.w3.org/1999/xhtml"&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 102, 255);"&gt;      xmlns:h="http://java.sun.com/jsf/html"&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 102, 255);"&gt;      xmlns:f="http://java.sun.com/jsf/core"]&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 102, 255);"&gt;[head]&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 102, 255);"&gt;    [title]ArchSoftyJSF2[/title]&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 102, 255);"&gt;[/head]&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 102, 255);"&gt;[body]&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 102, 255);"&gt;    [h:form]    &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 102, 255);"&gt;        [h:outputText value="Login!"/]                         &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 102, 255);"&gt;    [/h:form]&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 102, 255);"&gt;[/body]&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 102, 255);"&gt;[/html]&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Pronto agora quando clicar no botão &lt;span style="color: rgb(0, 0, 102); font-weight: bold;"&gt;[Navegação implícita!]&lt;/span&gt; a página que será mostrada será a login.xhtml.&lt;br /&gt;&lt;br /&gt;Ainda sem o faces-config.xml!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3760273245894556929-8726992283779991690?l=archsofty.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://archsofty.blogspot.com/feeds/8726992283779991690/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3760273245894556929&amp;postID=8726992283779991690' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3760273245894556929/posts/default/8726992283779991690'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3760273245894556929/posts/default/8726992283779991690'/><link rel='alternate' type='text/html' href='http://archsofty.blogspot.com/2009/07/jsf-20-na-pratica-navegacao-implicita.html' title='JSF 2.0 na prática - Navegação implicíta'/><author><name>Leandro</name><uri>http://www.blogger.com/profile/09724892719833243149</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3760273245894556929.post-932886459938183288</id><published>2009-07-01T06:03:00.000-07:00</published><updated>2009-07-01T06:38:07.982-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='javaserver faces'/><category scheme='http://www.blogger.com/atom/ns#' term='jsf 2'/><category scheme='http://www.blogger.com/atom/ns#' term='javaserver faces 2'/><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='jsf'/><title type='text'>Exemplo simples usando JavaServer Faces 2.0 (BETA1) JSF 2 + Eclipse Galileo + Tomcat 6x</title><content type='html'>&lt;span style="font-size:180%;"&gt;O que necessito?&lt;/span&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;  &lt;span style="color: rgb(0, 0, 102); font-style: italic;"&gt;1. Tomcat: http://tomcat.apache.org/download-60.cgi (ou algo que "rode" a espec. JSP2.5)&lt;/span&gt;&lt;/li&gt;&lt;li style="color: rgb(0, 0, 102); font-style: italic;"&gt;  2. JSF 2.0 BETA1: https://javaserverfaces.dev.java.net/files/documents/1866/135560/mojarra-2.0.0-Beta1-binary.zip&lt;/li&gt;&lt;li style="color: rgb(0, 0, 102); font-style: italic;"&gt;  3. Eclispe Galileo: http://www.eclipse.org/downloads/ (ou Netbeans 6.7, gnome-editor, vi, notepad...)&lt;/li&gt;&lt;li style="color: rgb(0, 0, 102); font-style: italic;"&gt;  4. JDK 6.0: http://java.sun.com/javase/downloads/index.jsp&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:180%;"&gt;Primeiro passo.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Crie um projeto java web. No caso especifico do Eclipse essa categoria se chama: "Dynamic Web Project", nomei o projeto como desejar, eu usarei o nome "ArchSoftyJSF2"; ainda no Eclipse escolhi como "Target runtime" o Apache Tomcat v6.0 e já cliquei em Finish.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:180%;"&gt;Segundo passo.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Coloque os dois jars - jsf-api.jar e jsf-impl.jar - no classpath da aplicação.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:180%;"&gt;Terceiro passo.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Modifique o arquivo web.xml, adicionando um Servlet.&lt;br /&gt;&lt;span style="color: rgb(51, 102, 255);"&gt;[servlet]&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 102, 255);"&gt;[servlet-name]Faces Servlet[/servlet-name]&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 102, 255);"&gt;[servlet-class]javax.faces.webapp.FacesServlet[/servlet-class]&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 102, 255);"&gt;[/servlet]&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 102, 255);"&gt;[servlet-mapping]&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 102, 255);"&gt;[servlet-name]Faces Servlet[/servlet-name]&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 102, 255);"&gt;[url-pattern]*.jsf[/url-pattern]&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 102, 255);"&gt;[/servlet-mapping]&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:180%;"&gt;Quarto passo.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Crie um arquivo (index.xhtml) com o seguinte conteúdo.&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 102, 255);"&gt;[?xml version="1.0" encoding="ISO-8859-1" ?]&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 102, 255);"&gt;[!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 102, 255);"&gt;"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"]&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 102, 255);"&gt;[html xmlns="http://www.w3.org/1999/xhtml"&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 102, 255);"&gt;xmlns:h="http://java.sun.com/jsf/html"&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 102, 255);"&gt;xmlns:f="http://java.sun.com/jsf/core"]&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 102, 255);"&gt;[head]&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 102, 255);"&gt;[title]ArchSoftyJSF2[/title]&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 102, 255);"&gt;[/head]&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 102, 255);"&gt;[body]&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 102, 255);"&gt;[h:form]&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 102, 255);"&gt;[h:outputText value="Alô, Mundão!"/]&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 102, 255);"&gt;[/h:form]&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 102, 255);"&gt;[/body]&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 102, 255);"&gt;[/html]&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:180%;"&gt;Quinto passo.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Rode e verá sua primeira aplicação usando Jsf 2.0 funcionando. Claro que se trata de um exemplo bem simples, pra deixar mais interessante vamos adicionar um botão e usar o novo modelo de managed bean (digo modelo no sentido de criação por meio de annotations).&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:180%;"&gt;Sexto passo.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Crie uma classe Java:&lt;br /&gt;&lt;br /&gt;package presentation;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 102, 255);"&gt;import javax.faces.bean.ManagedBean;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 102, 255);"&gt;@ManagedBean(name="primeiroBean")&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 102, 255);"&gt;public class PrimeiroBeanMB {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 102, 255);"&gt;private String texto;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 102, 255);"&gt;public String getTexto() {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 102, 255);"&gt;return texto;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 102, 255);"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 102, 255);"&gt;public void setTexto(String texto) {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 102, 255);"&gt;this.texto = texto;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 102, 255);"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 102, 255);"&gt;public void mudeOTexto(){&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 102, 255);"&gt;texto = "Texto modificado!";&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 102, 255);"&gt;System.out.println(texto);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 102, 255);"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 102, 255);"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:180%;"&gt;Sétimo passo.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Altere o index.xhtml mais precisamente mude o interior de ...&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 102, 255);"&gt;[h:form]&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 102, 255);"&gt;[h:outputText value="Alô, Mundão!"/]&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 102, 255);"&gt;[h:commandButton value="Mudar o texto" action="#{primeiroBean.mudeOTexto}"/]&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 102, 255);"&gt;[h:outputText value="#{primeiroBean.texto}"/]&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 102, 255);"&gt;[/h:form]&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Agora é só rodar... Sentiu a ausência do faces-config.xml?&lt;br /&gt;&lt;br /&gt;ps: desculpe a preguiça de apenas mudar &lt;&lt;&gt;&gt; por ]&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3760273245894556929-932886459938183288?l=archsofty.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://archsofty.blogspot.com/feeds/932886459938183288/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3760273245894556929&amp;postID=932886459938183288' title='1 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3760273245894556929/posts/default/932886459938183288'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3760273245894556929/posts/default/932886459938183288'/><link rel='alternate' type='text/html' href='http://archsofty.blogspot.com/2009/07/exemplo-simples-usando-javaserver-faces.html' title='Exemplo simples usando JavaServer Faces 2.0 (BETA1) JSF 2 + Eclipse Galileo + Tomcat 6x'/><author><name>Leandro</name><uri>http://www.blogger.com/profile/09724892719833243149</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3760273245894556929.post-7470208411299487676</id><published>2009-05-28T04:47:00.000-07:00</published><updated>2009-05-28T05:02:35.719-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='livro'/><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='caelum'/><category scheme='http://www.blogger.com/atom/ns#' term='arquitetura'/><category scheme='http://www.blogger.com/atom/ns#' term='domain-driven design'/><title type='text'>Investimento Certo em Novembro de 2009 Arquitetura e Design de Software - Uma visão sobre a plataforma Java</title><content type='html'>&lt;div style="text-align: justify;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://tbn1.google.com/images?q=tbn:xTHdSpyPGJSdYM:/url?source=imgres&amp;amp;ct=tbn&amp;amp;q=http://www.localwin.com/julie/system/files/lu10/biz_financing.jpg&amp;amp;usg=AFQjCNExRWC1pZl4UUVwBN-VzB6Ub8zHzQ"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 130px; height: 87px;" src="http://tbn1.google.com/images?q=tbn:xTHdSpyPGJSdYM:/url?source=imgres&amp;amp;ct=tbn&amp;amp;q=http://www.localwin.com/julie/system/files/lu10/biz_financing.jpg&amp;amp;usg=AFQjCNExRWC1pZl4UUVwBN-VzB6Ub8zHzQ" alt="" border="0" /&gt;&lt;/a&gt;Em novembro de 2009 você tem um grande investimento para fazer, desta vez não se trata de aplicações na Poupança ou mesmo CDB e sim num livro que a editora &lt;a href="http://www.elsevier.com.br/site/Default.aspx"&gt;Elsevier&lt;/a&gt; irá publicar.&lt;br /&gt;&lt;br /&gt;O livro intitulado: &lt;a href="http://www.arquiteturajava.com.br/"&gt;Arquitetura e Design de Software - Uma visão sobre a plataforma Java&lt;/a&gt; (que já possui um site &lt;a href="http://www.arquiteturajava.com.br/"&gt;http://www.arquiteturajava.com.br/&lt;/a&gt;)  foi escrito por "nada mais nada menos" que: Fábio Kung, Guilherme Moreira, Nico Steppat, Paulo Silveira e Sérgio Lopes (&lt;a href="http://www.caelum.com.br"&gt;Caelum&lt;/a&gt; não lhe veio a cabeça?).&lt;br /&gt;&lt;br /&gt;"O &lt;span style="font-weight: bold;"&gt;prefácio de Phillip Calçado&lt;/span&gt; já deixa bem claro que não há uma arquitetura de caixinha, e de que cada caso deve ser estudado a fundo."&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Não é preciso dizer mais nada...&lt;br /&gt;O draft inicial dos conteúdos:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Arquitetura pré-pronta de caixinha? Prefácio de Phillip Calçado&lt;/li&gt;&lt;li&gt;Introdução &lt;/li&gt;&lt;li&gt;Plataforma Java             &lt;ol&gt;&lt;li&gt;Java como plataforma, não como linguagem&lt;/li&gt;&lt;li&gt;Gerenciar memória não é simples&lt;/li&gt;&lt;li&gt;Otimizacao prematura é a raiz de todo mal&lt;/li&gt;&lt;li&gt;Tome cuidado com o ciclo de vida de objetos caros&lt;/li&gt;&lt;li&gt;A comunidade Java - do JCP aos fóruns&lt;/li&gt;&lt;li&gt;A burocracia e o lado ruim das especificações&lt;/li&gt;&lt;li&gt;A linguagem certa para cada tarefa&lt;/li&gt;&lt;/ol&gt;         &lt;/li&gt;&lt;li&gt;Tópicos de Orientação a Objetos             &lt;ol&gt;&lt;li&gt;Evite herança, favoreça composição&lt;/li&gt;&lt;li&gt;Programe voltado a interface, não a implementação&lt;/li&gt;&lt;li&gt;Prefira a imutabilidade&lt;/li&gt;&lt;li&gt;Cuidado com a criação indiscriminada de getters e setters&lt;/li&gt;&lt;li&gt;Modelo anêmico&lt;/li&gt;&lt;li&gt;Domain-Driven Design&lt;/li&gt;&lt;li&gt;O Código e a Linguagem Ubíqua&lt;/li&gt;&lt;/ol&gt;         &lt;/li&gt;&lt;li&gt;Java avançado             &lt;ol&gt;&lt;li&gt;Refletindo seu código&lt;/li&gt;&lt;li&gt;Configurando: anotações e XML&lt;/li&gt;&lt;li&gt;Entendendo o NoSuchMethodError e o ClassLoader hell&lt;/li&gt;&lt;li&gt;Manipulação de bytecode&lt;/li&gt;&lt;/ol&gt;         &lt;/li&gt;&lt;li&gt;Design             &lt;ol&gt;&lt;li&gt;Baixo acoplamento, alta coesão&lt;/li&gt;&lt;li&gt;Inversão de Controle: Cadê a minha chave de fenda?&lt;/li&gt;&lt;li&gt;Fábricas e o mito do baixo acoplamento&lt;/li&gt;&lt;li&gt;O que preciso para ser IoC-based?&lt;/li&gt;&lt;/ol&gt;         &lt;/li&gt;&lt;li&gt;Arquitetura             &lt;ol&gt;&lt;li&gt;Camadas e Camadas: a confusão de tiers e layers&lt;/li&gt;&lt;li&gt;Granularidade correta: Minimize a comunicação entre tiers&lt;/li&gt;&lt;li&gt;Model View Controller&lt;/li&gt;&lt;li&gt;Dois tiers&lt;/li&gt;&lt;li&gt;Tres tiers&lt;/li&gt;&lt;li&gt;N-tiers&lt;/li&gt;&lt;li&gt;Mensageria assíncrona&lt;/li&gt;&lt;/ol&gt;         &lt;/li&gt;&lt;li&gt;Frameworks e especificações Java EE             &lt;ol&gt;&lt;li&gt;Enterprise Java Beans&lt;/li&gt;&lt;li&gt;JavaServer Faces facilita a criação de interfaces?&lt;/li&gt;&lt;li&gt;Considere usar uma ferramente de mapeamento objeto relacional&lt;/li&gt;&lt;li&gt;Logar é melhor que debugar&lt;/li&gt;&lt;li&gt;Evite escrever seu proprio framework&lt;/li&gt;&lt;li&gt;Injeção de dependência&lt;/li&gt;&lt;/ol&gt;         &lt;/li&gt;&lt;li&gt;SOA - Same Old Architecture?             &lt;ol&gt;&lt;li&gt;A burocratização do SOAP vale a pena?&lt;/li&gt;&lt;li&gt;Não escreva XML dentro de XML: não veja XML&lt;/li&gt;&lt;li&gt;Considere um outro protocolo leve&lt;/li&gt;&lt;li&gt;SOA: Same Old Architecture?&lt;/li&gt;&lt;/ol&gt;         &lt;/li&gt;&lt;li&gt;Web 2.0&lt;/li&gt;&lt;li&gt;Segurança&lt;/li&gt;&lt;/ol&gt;Mais sobre o livro &lt;a href="http://www.arquiteturajava.com.br/"&gt;Arquitetura e Design de Software - Uma visão sobre a plataforma Java&lt;/a&gt;  no site &lt;a href="http://www.arquiteturajava.com.br/"&gt;http://www.arquiteturajava.com.br/&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3760273245894556929-7470208411299487676?l=archsofty.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://archsofty.blogspot.com/feeds/7470208411299487676/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3760273245894556929&amp;postID=7470208411299487676' title='3 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3760273245894556929/posts/default/7470208411299487676'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3760273245894556929/posts/default/7470208411299487676'/><link rel='alternate' type='text/html' href='http://archsofty.blogspot.com/2009/05/investimento-certo-em-novembro-de-2009.html' title='Investimento Certo em Novembro de 2009 Arquitetura e Design de Software - Uma visão sobre a plataforma Java'/><author><name>Leandro</name><uri>http://www.blogger.com/profile/09724892719833243149</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3760273245894556929.post-6281958461927464310</id><published>2009-05-11T07:36:00.000-07:00</published><updated>2009-05-11T10:19:38.831-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='jogos'/><category scheme='http://www.blogger.com/atom/ns#' term='games'/><category scheme='http://www.blogger.com/atom/ns#' term='jogl'/><title type='text'>Tutorial Jogl - Desenhando em Java com Jogl 2D</title><content type='html'>Depois te fazer sua primeira tela usando o Jogl agora iremos para parte final desse tutorial.&lt;br /&gt;&lt;br /&gt;Para desenharmos no Jogl iremos usar seus eventos. Há uma interface (GLEventListener) que devemos implementar se quisermos desenhar. Uma implementação nula (ou mock) pode ser vista abaixo:&lt;br /&gt;&lt;blockquote&gt;import javax.media.opengl.GLAutoDrawable;&lt;br /&gt;import javax.media.opengl.GLEventListener;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;public class OuvinteJogl implements GLEventListener {&lt;br /&gt;public void init(GLAutoDrawable arg0) {&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public void display(GLAutoDrawable arg0) {&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public void reshape(GLAutoDrawable arg0, int arg1, int arg2, int arg3, int arg4) {&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public void displayChanged(GLAutoDrawable arg0, boolean arg1, boolean arg2) {&lt;br /&gt;}&lt;br /&gt;}&lt;/blockquote&gt;Se concentre em dois métodos, o init e o display ambos recebem um GLAutoDrawable. Esse GLAutoDrawable será o nosso GLCanvas, assim as mudanças que faremos em GLAutoDrawable irão refletir diretamente no nosso GLCanvas.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;Método init&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Começemos então pelo método init que irá inicializar nosso desenho.&lt;br /&gt;public void init(GLAutoDrawable drawable) {&lt;br /&gt;    int width = 512, height = 256;&lt;br /&gt;    GL gl = drawable.getGL();&lt;br /&gt;    GLU glu = new GLU();&lt;br /&gt;    gl.glClearColor(.0f, .0f, .0f, 1.0f);&lt;br /&gt;    gl.glViewport(0, 0, width, height);&lt;br /&gt;    gl.glMatrixMode(GL.GL_PROJECTION);&lt;br /&gt;    gl.glLoadIdentity();&lt;br /&gt;    glu.gluOrtho2D(0.0, width, 0.0, height);&lt;br /&gt;}&lt;br /&gt;Aqui basicamente defini uma resolução (largura x altura). A segunda linha do méotodo é importantissíma veja como extrai o objeto GL (que na verdade é a API da OpenGl) e nele que iremos trabalhar diretamente com "a linguagem opengl". Esse GLU é uma biblioteca que nos ajuda nas tarefas rotineiras do opengl.&lt;br /&gt;&lt;br /&gt;Depois de ter o contexto da opengl (gl) o código foi basicamente de inicialazação de um plano 2D (sem profundidade) na resolução dada.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;Método display&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Agora sim, nesse método que iremos criar o código para desenharmos a tv desintonizada usando o jogl.&lt;br /&gt;    public void display(GLAutoDrawable drawable) {&lt;br /&gt;    GL gl = drawable.getGL();&lt;br /&gt;    gl.glClear(GL.GL_COLOR_BUFFER_BIT);&lt;br /&gt;&lt;br /&gt;    gl.glBegin(GL.GL_POINTS);&lt;br /&gt;    for (int x = 0; x &lt; y =" 0;"&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Simples. Aqui da mesma forma o primeiro passo é adiquirir o contexto da OpenGL (representado pelo objeto GL no java), limpar as cores  gl.glClear(GL.GL_COLOR_BUFFER_BIT)  e começar a desenhar pontos na tela. A logica é simples percorre-se dois for's uma para x e outro para y, a cada ponto uma cor é setada usando o método random da biblioteca Math (padrão do Java).&lt;br /&gt;&lt;br /&gt;Agora pra juntar isso ao nosso JFrame anterior... ?&lt;br /&gt;Simples basta ligar o nosso Listener ao Canvas.&lt;br /&gt;&lt;blockquote&gt;        super("OpenGl 2D - Java 2D com opengl Jogl");&lt;br /&gt;    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);&lt;br /&gt;    setSize(514, 258);&lt;br /&gt;    GLCanvas canvas = new GLCanvas();&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;        canvas.addGLEventListener(new OuvinteJogl());&lt;/span&gt;&lt;br /&gt;    add(canvas);&lt;/blockquote&gt;&lt;br /&gt;&lt;/div&gt;Simples, não?&lt;br /&gt;Execute e veja o resultado!&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.uploadimagens.com/upload/2b62d658ab3055d5850ad3e2b2441083.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 514px; height: 258px;" src="http://www.uploadimagens.com/upload/2b62d658ab3055d5850ad3e2b2441083.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Mas perai... alguém me enganou! Isso não é animado...&lt;br /&gt;É ai que entra o 3º Componente o FPSAnimator.&lt;br /&gt;Ainda no construtor... escreva após a última linha de código existente nele.&lt;br /&gt;&lt;blockquote&gt;FPSAnimator animator = new FPSAnimator(canvas, 50);&lt;br /&gt;animator.start();&lt;/blockquote&gt;Agora execute e veja. (aquel 50 é o número de fps) Pronto igualzinho aquele tempo que a TV te dava canseira com o Super Nintendo e o Video Cassete.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://picasion.com/pic9/f7f5b1171a89b7d48546cfe46dd4e986.gif"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 450px; height: 226px;" src="http://picasion.com/pic9/f7f5b1171a89b7d48546cfe46dd4e986.gif" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;Links:&lt;br /&gt;&lt;/div&gt; &lt;ol style="text-align: center;"&gt;&lt;li&gt;&lt;a href="http://archsofty.blogspot.com/2009/05/jogl-java-bindings-for-opengl-api-with.html"&gt;http://archsofty.blogspot.com/2009/05/jogl-java-bindings-for-opengl-api-with.html&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://archsofty.blogspot.com/2009/05/tutorial-jogl-configuracao-do-ambiente.html"&gt;http://archsofty.blogspot.com/2009/05/tutorial-jogl-configuracao-do-ambiente.html&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://archsofty.blogspot.com/2009/05/tutorial-jogl-desenhando-em-java-com.html"&gt;http://archsofty.blogspot.com/2009/05/tutorial-jogl-desenhando-em-java-com.html&lt;/a&gt;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;span style="font-size:180%;"&gt;Código Final Completo.&lt;/span&gt;&lt;br /&gt;import com.sun.opengl.util.FPSAnimator;&lt;br /&gt;import javax.media.opengl.GLCanvas;&lt;br /&gt;import javax.swing.JFrame;&lt;br /&gt;&lt;br /&gt;public class FrameJogl extends JFrame {&lt;br /&gt;&lt;br /&gt; public static void main(String[] args) {&lt;br /&gt;     new FrameJogl().setVisible(true);&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; public FrameJogl() {&lt;br /&gt;     super("OpenGl 2D - Java 2D com opengl Jogl");&lt;br /&gt;     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);&lt;br /&gt;     setSize(514, 258);&lt;br /&gt;     GLCanvas canvas = new GLCanvas();&lt;br /&gt;     canvas.addGLEventListener(new OuvinteJogl());&lt;br /&gt;     add(canvas);&lt;br /&gt;     FPSAnimator animator = new FPSAnimator(canvas, 50);&lt;br /&gt;     animator.start();&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;import javax.media.opengl.GL;&lt;br /&gt;import javax.media.opengl.GLAutoDrawable;&lt;br /&gt;import javax.media.opengl.GLEventListener;&lt;br /&gt;import javax.media.opengl.glu.GLU;&lt;br /&gt;&lt;br /&gt;public class OuvinteJogl implements GLEventListener {&lt;br /&gt;&lt;br /&gt; public void init(GLAutoDrawable drawable) {&lt;br /&gt;     int width = 512, height = 256;&lt;br /&gt;     GL gl = drawable.getGL();&lt;br /&gt;     GLU glu = new GLU();&lt;br /&gt;     gl.glClearColor(.0f, .0f, .0f, 1.0f);&lt;br /&gt;     gl.glViewport(0, 0, width, height);&lt;br /&gt;     gl.glMatrixMode(GL.GL_PROJECTION);&lt;br /&gt;     gl.glLoadIdentity();&lt;br /&gt;     glu.gluOrtho2D(0.0, width, 0.0, height);&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; public void display(GLAutoDrawable drawable) {&lt;br /&gt;     GL gl = drawable.getGL();&lt;br /&gt;     gl.glClear(GL.GL_COLOR_BUFFER_BIT);&lt;br /&gt;&lt;br /&gt;     gl.glBegin(GL.GL_POINTS);&lt;br /&gt;     for (int x = 0; x &lt; 512; x++) {&lt;br /&gt;         for (int y = 0; y &lt; 256; y++) {&lt;br /&gt;             gl.glColor3f((float)Math.random(), (float)Math.random(), (float)Math.random());&lt;br /&gt;             gl.glVertex2i(x, y);&lt;br /&gt;         }&lt;br /&gt;     }&lt;br /&gt;     gl.glEnd();&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; public void reshape(GLAutoDrawable drawable, int arg1, int arg2, int arg3, int arg4) {&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; public void displayChanged(GLAutoDrawable drawable, boolean arg1, boolean arg2) {&lt;br /&gt; }&lt;br /&gt;}&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3760273245894556929-6281958461927464310?l=archsofty.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://archsofty.blogspot.com/feeds/6281958461927464310/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3760273245894556929&amp;postID=6281958461927464310' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3760273245894556929/posts/default/6281958461927464310'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3760273245894556929/posts/default/6281958461927464310'/><link rel='alternate' type='text/html' href='http://archsofty.blogspot.com/2009/05/tutorial-jogl-desenhando-em-java-com.html' title='Tutorial Jogl - Desenhando em Java com Jogl 2D'/><author><name>Leandro</name><uri>http://www.blogger.com/profile/09724892719833243149</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3760273245894556929.post-7282053678924236613</id><published>2009-05-11T07:04:00.000-07:00</published><updated>2009-05-11T10:19:13.352-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='jogos'/><category scheme='http://www.blogger.com/atom/ns#' term='games'/><category scheme='http://www.blogger.com/atom/ns#' term='java2d'/><category scheme='http://www.blogger.com/atom/ns#' term='jogl'/><category scheme='http://www.blogger.com/atom/ns#' term='desenvolvimento orientado a testes'/><title type='text'>Tutorial JOGL - Configuração do ambiente</title><content type='html'>&lt;span style="font-size:130%;"&gt;Primeira Parte - Configurando Jogl no Netbeans&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;O primeiro passo é ir ao site do &lt;a href="https://jogl.dev.java.net/servlets/ProjectDocumentList?folderID=9260&amp;amp;expandFolder=9260&amp;amp;folderID=0"&gt;jogl&lt;/a&gt; e baixar a versão correspondente ao seu sistema operacional. No meu exemplo estou usando o Windows portando baixei desse link &lt;a href="http://download.java.net/media/jogl/builds/archive/jsr-231-1.1.1/jogl-1.1.1-windows-i586.zip"&gt;http://download.java.net/media/jogl/builds/archive/jsr-231-1.1.1/jogl-1.1.1-windows-i586.zip&lt;/a&gt; . Dentro do arquivo comprimido haverá uma pasta lib vário arquivos:&lt;br /&gt;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;gluegen-rt.dll&lt;/li&gt;&lt;li style="font-weight: bold; color: rgb(51, 51, 153);"&gt;gluegen-rt.jar&lt;/li&gt;&lt;li&gt;jogl.dll&lt;/li&gt;&lt;li style="font-weight: bold; color: rgb(51, 51, 153);"&gt;jogl.jar&lt;/li&gt;&lt;li&gt;jogl_awt.dll&lt;/li&gt;&lt;li&gt;jogl_cg.dll&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-style: italic;"&gt;Note que se você estiver usando linux ao invés de *.dll terá os arquivos *.so.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Como em qualquer outro desenvolvimento uma IDE poderá te ajudar e muito, escolha a sua preferida. Estou usando o NetBeans 6.5. (Que não necessariamente é minha IDE preferida ;) )&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;Conceitos sobre Jogl&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Quando você está criando uma aplicação que irá lançar mão de recursos providos pelo OpenGL há básicamente três componentes que poderão facilitar e muito sua vida. São eles:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;GLCanvas&lt;/span&gt; (ou GLPanel) - Um componente (que extend de Component do AWT).&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;GLEventListener&lt;/span&gt; - O modelo de listener para os eventos comuns do opengl.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;FPSAnimator&lt;/span&gt; - Uma classe que irá lhe ajudar a efetivamente fazer seus desenhos (ou jogos) animarem.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;Criando um projeto...&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Crie um projeto e adicione à ele as bibliotecas (gluegen-rt.jar e jogl.jar), copie também para pasta raiz do projeto todas as *.dll que estavam na pasta lib (do arquivo baixado anteriormente).&lt;br /&gt;&lt;br /&gt;Para simplicar bastante as coisas (assim deixando de mais fácil entendimento para todos) iremos criar um JFrame e mostraremos nesse JFrame nossa animação.&lt;br /&gt;&lt;br /&gt;O código pode ser visto abaixo:&lt;br /&gt;&lt;blockquote&gt;          import javax.swing.JFrame;&lt;br /&gt;&lt;blockquote&gt;public class FrameJogl extends JFrame {&lt;br /&gt;&lt;br /&gt; public static void main(String[] args) {&lt;br /&gt;     new FrameJogl().setVisible(true);&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; public FrameJogl() {&lt;br /&gt;     super("OpenGl 2D - Java 2D com opengl Jogl");&lt;br /&gt;     setSize(514, 258);&lt;br /&gt; }&lt;br /&gt;}&lt;/blockquote&gt;&lt;/blockquote&gt;Simples ao extremo. Apenas cria um JFrame atribuindo o tamanho de 514 pixels de comprimento por 258 pixels de altura.&lt;br /&gt;&lt;br /&gt;O próximo passo é escrever o componente que irá mostrar a tela opengl dentro desse JFrame. Para tal tarefa apenas escrevemos:&lt;br /&gt;&lt;blockquote&gt;        GLCanvas canvas = new GLCanvas();&lt;br /&gt;      add(canvas);&lt;/blockquote&gt;&lt;br /&gt;Isso, claro, no construtor abaixo de setSize. Agora se executarmos a aplicação teremos algo semelhando a isso abaixo.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.uploadimagens.com/upload/d99e79bf52cd7945b9a0841de7e0615d.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 514px; height: 258px;" src="http://www.uploadimagens.com/upload/d99e79bf52cd7945b9a0841de7e0615d.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Sua máquina irá mostrar algo diferente, como não definimos nada o "opengl" mostra dados randômicos da sua memoria RAM. O importante neste ponto é a simplicidade do código, com pouco código já se pode ver algo produzido pelo Jogl.&lt;br /&gt;&lt;br /&gt;O meu código final para o JFrame ficou assim:&lt;br /&gt;&lt;blockquote&gt;import javax.media.opengl.GLCanvas;&lt;br /&gt;import javax.swing.JFrame;&lt;br /&gt;&lt;br /&gt;public class FrameJogl extends JFrame {&lt;br /&gt;&lt;br /&gt;   public static void main(String[] args) {&lt;br /&gt;       new FrameJogl().setVisible(true);&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   public FrameJogl() {&lt;br /&gt;       super("OpenGl 2D - Java 2D com opengl Jogl");&lt;br /&gt;       setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);&lt;br /&gt;       setSize(514, 258);&lt;br /&gt;       GLCanvas canvas = new GLCanvas();&lt;br /&gt;       add(canvas);&lt;br /&gt;   }&lt;br /&gt;}&lt;/blockquote&gt;&lt;span style="font-style: italic;"&gt;Note que também adicionei um comportamente padrão para quando o usuário clicar no botão X da Janela.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;div style="text-align: center;"&gt;Links:&lt;br /&gt;&lt;/div&gt; &lt;ol style="text-align: center;"&gt;&lt;li&gt;&lt;a href="http://archsofty.blogspot.com/2009/05/jogl-java-bindings-for-opengl-api-with.html"&gt;http://archsofty.blogspot.com/2009/05/jogl-java-bindings-for-opengl-api-with.html&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://archsofty.blogspot.com/2009/05/tutorial-jogl-configuracao-do-ambiente.html"&gt;http://archsofty.blogspot.com/2009/05/tutorial-jogl-configuracao-do-ambiente.html&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://archsofty.blogspot.com/2009/05/tutorial-jogl-desenhando-em-java-com.html"&gt;http://archsofty.blogspot.com/2009/05/tutorial-jogl-desenhando-em-java-com.html&lt;/a&gt;&lt;/li&gt;&lt;/ol&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3760273245894556929-7282053678924236613?l=archsofty.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://archsofty.blogspot.com/feeds/7282053678924236613/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3760273245894556929&amp;postID=7282053678924236613' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3760273245894556929/posts/default/7282053678924236613'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3760273245894556929/posts/default/7282053678924236613'/><link rel='alternate' type='text/html' href='http://archsofty.blogspot.com/2009/05/tutorial-jogl-configuracao-do-ambiente.html' title='Tutorial JOGL - Configuração do ambiente'/><author><name>Leandro</name><uri>http://www.blogger.com/profile/09724892719833243149</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3760273245894556929.post-3831240625396346246</id><published>2009-05-11T06:50:00.000-07:00</published><updated>2009-05-11T10:18:53.673-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='jogos'/><category scheme='http://www.blogger.com/atom/ns#' term='games'/><category scheme='http://www.blogger.com/atom/ns#' term='java2d'/><category scheme='http://www.blogger.com/atom/ns#' term='jogl'/><category scheme='http://www.blogger.com/atom/ns#' term='2d'/><category scheme='http://www.blogger.com/atom/ns#' term='graficos'/><title type='text'>Jogl - Java bindings for OpenGL API with OpenGL 1.5 specification</title><content type='html'>&lt;div style="text-align: justify;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.bestlinux.com.br/images/stories/Imagens_Noticias/opengl.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 285px; height: 147px;" src="http://www.bestlinux.com.br/images/stories/Imagens_Noticias/opengl.jpg" alt="" border="0" /&gt;&lt;/a&gt;Pretendo nos próximos posts explicar sobre como utilizar a API OpenGL no Java. Especificamente o "framework" Jogl.&lt;br /&gt;Essas primeiras partes abordaram o básico ( não pretendo aprofundar muito nos conceitos, mostrar só a prática mesmo ) e o produto final desse tutorial - se assim posso chamar - será um programa que irá desenhar, em uma tela, pixels com cores randômicas... similar ao efeito de uma tv desintonizada.&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;br /&gt;Links:&lt;br /&gt;&lt;/div&gt; &lt;ol style="text-align: center;"&gt;&lt;li&gt;&lt;a href="http://archsofty.blogspot.com/2009/05/jogl-java-bindings-for-opengl-api-with.html"&gt;http://archsofty.blogspot.com/2009/05/jogl-java-bindings-for-opengl-api-with.html&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://archsofty.blogspot.com/2009/05/tutorial-jogl-configuracao-do-ambiente.html"&gt;http://archsofty.blogspot.com/2009/05/tutorial-jogl-configuracao-do-ambiente.html&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://archsofty.blogspot.com/2009/05/tutorial-jogl-desenhando-em-java-com.html"&gt;http://archsofty.blogspot.com/2009/05/tutorial-jogl-desenhando-em-java-com.html&lt;/a&gt;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3760273245894556929-3831240625396346246?l=archsofty.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://archsofty.blogspot.com/feeds/3831240625396346246/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3760273245894556929&amp;postID=3831240625396346246' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3760273245894556929/posts/default/3831240625396346246'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3760273245894556929/posts/default/3831240625396346246'/><link rel='alternate' type='text/html' href='http://archsofty.blogspot.com/2009/05/jogl-java-bindings-for-opengl-api-with.html' title='Jogl - Java bindings for OpenGL API with OpenGL 1.5 specification'/><author><name>Leandro</name><uri>http://www.blogger.com/profile/09724892719833243149</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3760273245894556929.post-4833095893051240594</id><published>2009-04-22T07:13:00.000-07:00</published><updated>2009-04-22T07:30:35.209-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='dsl externa'/><category scheme='http://www.blogger.com/atom/ns#' term='internal dsl'/><category scheme='http://www.blogger.com/atom/ns#' term='domain-specific language'/><category scheme='http://www.blogger.com/atom/ns#' term='external dsl'/><category scheme='http://www.blogger.com/atom/ns#' term='interface fluente'/><category scheme='http://www.blogger.com/atom/ns#' term='dsl interna'/><category scheme='http://www.blogger.com/atom/ns#' term='fluent interface'/><category scheme='http://www.blogger.com/atom/ns#' term='dsl'/><title type='text'>DSL Interna ou DSL Externa dão brigas feias</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.lakefolks.org/cnt/Screen-Shot-13ag.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 321px; height: 316px;" src="http://www.lakefolks.org/cnt/Screen-Shot-13ag.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;O assunto interessantissímo &lt;a href="http://archsofty.blogspot.com/2008/10/dsl-interna-e-externa-perguntas-e.html"&gt;DSL (domain-specific language)&lt;/a&gt; é contraverso (assim como a maioria das tecnicas/metodologias/tecnologias novas) e chega a dar briga!&lt;br /&gt;&lt;br /&gt;Acompanho direto foruns e artigos sobre o assunto, para alguns ela é dividida em dois ramos dsl interna e externa, pra outros essa divisão é sem sentido. A discussão já começa na definição do conceito ou conjunto de conceitos por trás do assunto.&lt;br /&gt;&lt;br /&gt;Leia a opinião de Martin Fowler sobre DSL's (interna e/ou externa): &lt;a href="http://archsofty.blogspot.com/2008/10/dsl-interna-e-externa-perguntas-e.html"&gt;DSL (domain-specific language)&lt;/a&gt;&lt;br /&gt;Leia também a opinião de Phillip Calçado: &lt;a href="http://fragmental.tw/research-on-dsls/domain-specific-languages-dsls/internal-dsls/"&gt;Domain-Specific Language Interna&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;E por último não deixe de conferir este artigo no infoq: &lt;a href="http://www.infoq.com/articles/External-DSL-Vaughn-Vernon"&gt;http://www.infoq.com/articles/External-DSL-Vaughn-Vernon&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3760273245894556929-4833095893051240594?l=archsofty.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://archsofty.blogspot.com/feeds/4833095893051240594/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3760273245894556929&amp;postID=4833095893051240594' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3760273245894556929/posts/default/4833095893051240594'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3760273245894556929/posts/default/4833095893051240594'/><link rel='alternate' type='text/html' href='http://archsofty.blogspot.com/2009/04/dsl-interna-ou-dsl-externa-dao-brigas.html' title='DSL Interna ou DSL Externa dão brigas feias'/><author><name>Leandro</name><uri>http://www.blogger.com/profile/09724892719833243149</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3760273245894556929.post-3135650872108167530</id><published>2009-04-17T05:27:00.000-07:00</published><updated>2009-04-17T05:35:39.035-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='lula'/><category scheme='http://www.blogger.com/atom/ns#' term='brazil'/><category scheme='http://www.blogger.com/atom/ns#' term='brasil'/><category scheme='http://www.blogger.com/atom/ns#' term='south park'/><title type='text'>Lula on South Park</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://img.blogs.abril.com.br/1/series-tv/imagens/lula-south-park.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 338px; height: 225px;" src="http://img.blogs.abril.com.br/1/series-tv/imagens/lula-south-park.jpg" alt="" border="0" /&gt;&lt;/a&gt;Este post vai fugir bastante (no fundo acho que não) do usual aqui. Ontem assisti o novo episódio (transmitido na quarta) de south park, nele os grandes líderes do mundo aparecem and Guess Who.... Mister Lula também aparece. Não sou daqueles a favor do Lula muito ao contrário sou sempre um vigia do atual governo. Mas achei muito bom a aparição dele "entre os líderes mundiais" bem como o episódio. Esta temporada de south park está de mais, o melhor episódio IMHO foi Gay Fish. (hilário)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_x460v8Bh5gg/Sd3kdOrhc_I/AAAAAAAAAik/19dpOGK117c/s400/Kanye+Gay+Fish.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 134px; height: 100px;" src="http://1.bp.blogspot.com/_x460v8Bh5gg/Sd3kdOrhc_I/AAAAAAAAAik/19dpOGK117c/s400/Kanye+Gay+Fish.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3760273245894556929-3135650872108167530?l=archsofty.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://archsofty.blogspot.com/feeds/3135650872108167530/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3760273245894556929&amp;postID=3135650872108167530' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3760273245894556929/posts/default/3135650872108167530'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3760273245894556929/posts/default/3135650872108167530'/><link rel='alternate' type='text/html' href='http://archsofty.blogspot.com/2009/04/lula-on-south-park.html' title='Lula on South Park'/><author><name>Leandro</name><uri>http://www.blogger.com/profile/09724892719833243149</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_x460v8Bh5gg/Sd3kdOrhc_I/AAAAAAAAAik/19dpOGK117c/s72-c/Kanye+Gay+Fish.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3760273245894556929.post-4947027548218401123</id><published>2009-03-18T12:51:00.000-07:00</published><updated>2009-03-18T13:36:03.188-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='modismos'/><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='spring'/><category scheme='http://www.blogger.com/atom/ns#' term='programacao'/><title type='text'>Spring, spring meu existe alguém que te usa mais do que eu</title><content type='html'>&lt;div style="text-align: justify;"&gt;Sem dúvida um dos frameworks mais agitados e falados (e usados também) ultimamente é o senhor &lt;a href="http://en.wikipedia.org/wiki/Spring_Framework"&gt;Spring Framework&lt;/a&gt;. Eu há muito tempo (muito mesmo) já gostei da idéia, &lt;span style="font-weight: bold;"&gt;mas porém contudo todavia&lt;/span&gt; tenho hoje uma visão crítica de que não é &lt;span style="font-weight: bold;"&gt;TODO&lt;/span&gt; projeto que se deve usar (ou ao menos em todos os componentes)  o mesmo. Essa opinião foi formada devido a um projeto que estive trabalhando nesses últimos meses. Resumidamente o projeto tinha mais ou menos a arquitetura abaixo. (apenas estava servindo como reparador não foi eu que criei)&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.uploadimagens.com/upload/afb43da01b238ac170306935acf3fe9c.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 449px; height: 230px;" src="http://www.uploadimagens.com/upload/afb43da01b238ac170306935acf3fe9c.jpg" alt="" border="0" /&gt;&lt;/a&gt;As dependencias das actions são todas gerenciadas pelo "container" (Spring), logo nas actions só se tem declaração de interfaces (no exemplo qualquer classe sem Imp era uma interface) e o Spring faz a injenção com as classes que as implementa (Classe&lt;span style="font-weight: bold;"&gt;Imp&lt;/span&gt;.java) e isso sucessivamente, ou seja, as dependencias das classes de "negocios" também...&lt;br /&gt;&lt;br /&gt;Em si isso é comum, o fato não é o jeito que as coisas foram feitas e sim o motivo, nesse projeto pode se reduzir BASTANTE o uso do Spring mas ao contrário as pessoas apenas querem usar desefreadamente os frameworks em voga.&lt;br /&gt;&lt;br /&gt;Eu acredito que o uso de qualquer framework exige um senso apurado assim como uma visão crítica, há projetos em que o uso de JPA pode degradar a performance final e assim como vários outros exemplos de que nem sempre é necessário estar na "moda".&lt;br /&gt;&lt;br /&gt;Usar por usar (sem saber o pôrque) não vale a pena! Veja e tente entender os beneficios de se usar esse ou aquele framework ou mesmo alguma metodologia!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3760273245894556929-4947027548218401123?l=archsofty.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://archsofty.blogspot.com/feeds/4947027548218401123/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3760273245894556929&amp;postID=4947027548218401123' title='1 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3760273245894556929/posts/default/4947027548218401123'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3760273245894556929/posts/default/4947027548218401123'/><link rel='alternate' type='text/html' href='http://archsofty.blogspot.com/2009/03/spring-spring-meu-existe-alguem-que-te.html' title='Spring, spring meu existe alguém que te usa mais do que eu'/><author><name>Leandro</name><uri>http://www.blogger.com/profile/09724892719833243149</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3760273245894556929.post-4236392730522271927</id><published>2009-03-17T04:30:00.000-07:00</published><updated>2009-03-17T04:54:57.509-07:00</updated><title type='text'>Bons e Novos Jogos!</title><content type='html'>Influenciado fortemente pelo &lt;a href="http://the-empyrean.blogspot.com/2009/03/good-time-games-came-back.html"&gt;post no meu outro blog em inglês&lt;/a&gt; trago hoje (para uns) novidade na cena da criação de jogos!&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Ultimamente estou observando de muito perto a criação de alguns jogos independentes. Especificamente três jogos me tomaram totalmente a atenção; são eles: &lt;span style="font-weight: bold;"&gt;Braid, Aquaria e Crayon Physics&lt;/span&gt;. Se você é daqueles que ainda se lembra da caixa do super nintendo ou do mega drive, dê uma chance a esses jogos.&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;img style="width: 315px; height: 196px;" alt="http://www.geocities.com/compcloset/NintendoSNESBox.jpg" src="http://www.geocities.com/compcloset/NintendoSNESBox.jpg" /&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;span style="font-weight: bold;"&gt;Braid (a versão pra PC sairá dia 31 de Março de 2009)&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://savetherobot.files.wordpress.com/2008/04/braid01.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 406px; height: 291px;" src="http://savetherobot.files.wordpress.com/2008/04/braid01.jpg" alt="" border="0" /&gt;&lt;/a&gt;Um jogo no estilo Super Mario (alias até é meio que uma homenagem) e com uma história depressiva e imperdivel.&lt;br /&gt;Official site: &lt;a href="http://braid-game.com/"&gt;&lt;cite&gt;&lt;b&gt;braid&lt;/b&gt;-game.com/&lt;/cite&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;span style="font-weight: bold;"&gt;Aquaria (já disponivel)&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;img style="width: 425px; height: 318px;" alt="http://www.g4g.it/g4g/wp-content/uploads/2007/12/aquaria_demo_01.jpg" src="http://www.g4g.it/g4g/wp-content/uploads/2007/12/aquaria_demo_01.jpg" /&gt;&lt;br /&gt;Um épico dos RPGs 2D... se você gosta do estilo, irá amar joga-lo, vai sentir nostalgia e com certeza se lembrará de jogos como... Castlevania!&lt;br /&gt;Official Site: &lt;a href="http://www.bit-blot.com/aquaria/"&gt;http://www.bit-blot.com/aquaria/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;C&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;rayon physics  (já disponivel)&lt;/span&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.fun-motion.com/images/crayon-physics-1.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 331px; height: 247px;" src="http://www.fun-motion.com/images/crayon-physics-1.jpg" alt="" border="0" /&gt;&lt;/a&gt;Esse jogo não encontrei meios ou palavras pra descreve-lo, é incrivel a única coisa que posso dizer é: Entre no site e assista o vídeo de demonstração.... veja vale MUITO a pena!&lt;br /&gt;Official Site: &lt;a href="http://www.crayonphysics.com/"&gt;&lt;cite&gt;www.&lt;b&gt;crayonphysics&lt;/b&gt;.com/&lt;/cite&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3760273245894556929-4236392730522271927?l=archsofty.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://archsofty.blogspot.com/feeds/4236392730522271927/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3760273245894556929&amp;postID=4236392730522271927' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3760273245894556929/posts/default/4236392730522271927'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3760273245894556929/posts/default/4236392730522271927'/><link rel='alternate' type='text/html' href='http://archsofty.blogspot.com/2009/03/bons-e-novos-jogos.html' title='Bons e Novos Jogos!'/><author><name>Leandro</name><uri>http://www.blogger.com/profile/09724892719833243149</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3760273245894556929.post-4201531164383181031</id><published>2009-03-16T05:06:00.000-07:00</published><updated>2010-10-23T05:27:07.394-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='jpa'/><category scheme='http://www.blogger.com/atom/ns#' term='freelancer'/><category scheme='http://www.blogger.com/atom/ns#' term='spring'/><category scheme='http://www.blogger.com/atom/ns#' term='richfaces'/><category scheme='http://www.blogger.com/atom/ns#' term='infoq'/><category scheme='http://www.blogger.com/atom/ns#' term='jsf'/><category scheme='http://www.blogger.com/atom/ns#' term='oferta'/><title type='text'>Ofereço trabalho de FreeLancer em Java</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://firstrung.co.uk/dbimgs/job%20search%281%29.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 190px; height: 283px;" src="http://firstrung.co.uk/dbimgs/job%20search%281%29.jpg" alt="" border="0" /&gt;&lt;/a&gt;Olá à todos,&lt;p style="text-align: justify;"&gt;Estou interessado a trabalhar em projetos Freelance (pagos), se tiver algum ou conhecer pessoas que necessitem favor me contactar pelo email: &lt;span style="color: rgb(0, 0, 102); font-weight: bold;"&gt;leandro.ribeiro.moreira at Gmail&lt;/span&gt; ou ainda comentando neste post.&lt;br /&gt;&lt;/p&gt;&lt;div&gt; &lt;/div&gt;&lt;p style="text-align: justify;"&gt;Tenho experiências com desenvolvimento de aplicações Java a mais de 3 anos (com &lt;span style="font-weight: bold;"&gt;artigo publicado&lt;/span&gt; na revista &lt;a href="http://www.mundoj.com.br/default.jsp"&gt;MundoJ&lt;/a&gt;, &lt;span style="font-weight: bold;"&gt;artigo públicado&lt;/span&gt; na &lt;a href="http://www.infoq.com/articles/lucene-did-you-mean"&gt;&lt;span style="font-weight: bold;"&gt;infoQ gringa&lt;/span&gt;&lt;/a&gt;  e algumas &lt;span style="font-weight: bold;"&gt;participações em projetos open-source&lt;/span&gt;) , meu foco se baseia principalmente em aplicações Web (&lt;a href="http://www.oracle.com/technetwork/java/javaee/javaserverfaces-139869.html"&gt;Jsf&lt;/a&gt; [myfaces, icefaces e &lt;a href="http://jboss.org/richfaces"&gt;richfaces&lt;/a&gt;], &lt;a href="http://pt.wikipedia.org/wiki/Java_Persistence_API"&gt;Jpa&lt;/a&gt;, &lt;span style=";font-family:Times New Roman;font-size:100%;"  &gt;Ejb3, DWR, Jasper,  &lt;a href="http://www.springsource.org/"&gt;Spring-Framework&lt;/a&gt;&lt;/span&gt; ...) . Integração de aplicações, DSL, SOA, &lt;a href="http://www.agiledata.org/essays/tdd.html"&gt;TDD&lt;/a&gt;, &lt;a href="http://www.slideshare.net/rponte/entendendo-domaindriven-design"&gt;DDD&lt;/a&gt; são algumas das áreas de conhecimento que atuo. Se estiver interessado posso enviar meu curriculo à você.&lt;br /&gt;&lt;/p&gt;No mais obrigado :) Have a nice day!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3760273245894556929-4201531164383181031?l=archsofty.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://archsofty.blogspot.com/feeds/4201531164383181031/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3760273245894556929&amp;postID=4201531164383181031' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3760273245894556929/posts/default/4201531164383181031'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3760273245894556929/posts/default/4201531164383181031'/><link rel='alternate' type='text/html' href='http://archsofty.blogspot.com/2009/03/ofereco-trabalho-de-freelancer-em-java.html' title='Ofereço trabalho de FreeLancer em Java'/><author><name>Leandro</name><uri>http://www.blogger.com/profile/09724892719833243149</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3760273245894556929.post-8417155195335572187</id><published>2009-03-11T12:29:00.000-07:00</published><updated>2009-03-11T12:59:06.477-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='nes'/><category scheme='http://www.blogger.com/atom/ns#' term='jnesbr'/><category scheme='http://www.blogger.com/atom/ns#' term='emulador'/><category scheme='http://www.blogger.com/atom/ns#' term='projeto oo'/><category scheme='http://www.blogger.com/atom/ns#' term='emulação'/><category scheme='http://www.blogger.com/atom/ns#' term='emulator'/><category scheme='http://www.blogger.com/atom/ns#' term='oo'/><category scheme='http://www.blogger.com/atom/ns#' term='6502'/><title type='text'>Abordagens e Abordagens</title><content type='html'>&lt;div style="text-align: justify;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://leadinganswers.typepad.com/photos/uncategorized/2007/11/20/agile_estimates.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 259px; height: 204px;" src="http://leadinganswers.typepad.com/photos/uncategorized/2007/11/20/agile_estimates.jpg" alt="" border="0" /&gt;&lt;/a&gt;Motivado &lt;a href="http://forums.thedailywtf.com/forums/p/11143/193235.aspx"&gt;por uma discussão calorosa sobre meu projeto e o extremismo do OO (no forum WTF daily)&lt;/a&gt; o projeto recebeu mais de 500 visitas num só dia, a principal crítica era sobre a quantidade de classes (uma por cada opCode) desnecessárias... o que fez com que os gringos classificassem o projeto como WTF do OO (claro que dentro da discussão haviam aqueles que não achavam que o projeto deveria ganhar esse título também).&lt;br /&gt;&lt;br /&gt;Resumidamente o processador do nintendo 8bits é um 6502 modificado, a sua arquitetura conta com 11 meios de se obter os operadores (basicamente em baixo nível você tem uma instrução e os operadores pra mesma), com isso a mesma operação pode ser feita de várias formas...&lt;br /&gt;&lt;br /&gt;Exemplo: Para a instrução STA (carregue o registrador Accumulator) existem várias STA's: STA $10, STA ($10),Y , STA $1002 ...  (sta direta, sta indexeda por y, sta indireta....)&lt;br /&gt;&lt;br /&gt;Logo criou-se a situação de que eu tomei a decisão de uma interface Instrução e criei várias classes abstratas InstrucaoAbsoluta, InstrucaoRelativa, InstrucaoIndexadaY ... e várias subclasses concretas LDAAbsoluta, LDARelativa... (sendo que o trabalho de se obter o operador ficaria a cargo da classe pai).&lt;br /&gt;&lt;br /&gt;Com isso tenho REALMENTE MUITAS CLASSES isso foi uma das reclamações. Hoje penso que poderia (e ainda posso mas ando focado no debugger) fazer algo mais ou menos assim.&lt;br /&gt;lda(immediate());&lt;br /&gt;lda(absolute());&lt;br /&gt;sta(immediate());&lt;br /&gt;sta(absolute());&lt;br /&gt;Só isso reduziria e muito o número de classes apenas com a composição correta delas.&lt;br /&gt;&lt;br /&gt;A outra indagação é sobre o meio que usei para se interpretar cada opcode. Normalmente um interpretador agi mais ou menos assim:&lt;br /&gt;&lt;br /&gt;switch(coisaASerInterpretada){&lt;br /&gt;case 0xFA: fazA();&lt;br /&gt;case 0xFB: fazB();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;E minha abordagem foi diferente, coloquei todas as "funções" num hashmap generic e apenas executava.&lt;br /&gt;&lt;br /&gt;O preenchimento:&lt;br /&gt;hash.add(0xFA,new FazA());&lt;br /&gt;hash.add(0xFB,new FazB());&lt;br /&gt;Quando fosse usar:&lt;br /&gt;hash.get(coisaASerInterpretada).execute();&lt;br /&gt;&lt;br /&gt;Eles não discordaram do jeito que fiz as coisas; mas de ter usado HashMap ao invés de um simples array. Acredito que realmente seja verdade, é desperdício usar um HashMap ao invés de um array comum mas nesse caso prefiro correr "esse risco bobo calculado" a ter que declarar uma array maior do que o necessário já que o índice do vetor seria a identificação da operação e aproveitar das facilidades do hashmap (melhor ainda pra buscas...).&lt;br /&gt;&lt;br /&gt;Não posso deixar de rir um pouco com as opiniões xiitas mas também não concordo que isso poderia fazer um projeto ser classificado como um WTF (what the f%ck)&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3760273245894556929-8417155195335572187?l=archsofty.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://archsofty.blogspot.com/feeds/8417155195335572187/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3760273245894556929&amp;postID=8417155195335572187' title='2 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3760273245894556929/posts/default/8417155195335572187'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3760273245894556929/posts/default/8417155195335572187'/><link rel='alternate' type='text/html' href='http://archsofty.blogspot.com/2009/03/abordagens-e-abordagens.html' title='Abordagens e Abordagens'/><author><name>Leandro</name><uri>http://www.blogger.com/profile/09724892719833243149</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3760273245894556929.post-4593639629479015218</id><published>2009-03-11T06:37:00.000-07:00</published><updated>2009-03-11T07:24:59.220-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='nes'/><category scheme='http://www.blogger.com/atom/ns#' term='jnesbr'/><category scheme='http://www.blogger.com/atom/ns#' term='emulador'/><category scheme='http://www.blogger.com/atom/ns#' term='6502'/><title type='text'>Meu novo projeto JNesBR</title><content type='html'>&lt;div style="text-align: justify;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.rodrigoghedin.com.br/wp-content/uploads/2008/08/nes-console.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 260px; height: 189px;" src="http://www.rodrigoghedin.com.br/wp-content/uploads/2008/08/nes-console.jpg" alt="" border="0" /&gt;&lt;/a&gt;O meu atual hobbie preferido é criar emuladores (máquinas virtuais, simuladores, emuladores + simuladores), agora estou "desenhando" um emulador da máquina Nintendo 8Bits (NES ou FAMICOM). As minhas motivações para o hobbie são (entre outras):&lt;br /&gt;&lt;/div&gt;&lt;ul style="text-align: justify;"&gt;&lt;li&gt;Amar videogames/computadores e entender como realmente eles funcionam [bit a bit mesmo no mais baixo nivel].&lt;/li&gt;&lt;li&gt;Criar um sistema onde eu posso realmente empregar oo em vários sentidos, dar soluções flexiveis para os problemas mais desconhecidos.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Criar um sistema bom de debugger. (isso é muito legal, ver seus breakpoints nos assemblers, criar interfaces e objetos que lhe possibilitem caminhar no código, ver valores, enfim foge muito dos CRUD's de cada dia [amém graças a Deus])&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div style="text-align: justify;"&gt;É interessante ressaltar que a quantidade de conhecimento que você obtem ao escrever um emulador é gigante, você passa desde conceitos de memoria (páginação, troca) a controladores de vídeo (compactação, paleta de cores, conceitos sobre computação gráfica 2d e 3d...).&lt;br /&gt;Espero postar mais sobre essas experiências e também alguns screenshots.&lt;br /&gt;A página do projeto é &lt;a href="http://code.google.com/p/jnesbr/"&gt;http://code.google.com/p/jnesbr/&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3760273245894556929-4593639629479015218?l=archsofty.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://archsofty.blogspot.com/feeds/4593639629479015218/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3760273245894556929&amp;postID=4593639629479015218' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3760273245894556929/posts/default/4593639629479015218'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3760273245894556929/posts/default/4593639629479015218'/><link rel='alternate' type='text/html' href='http://archsofty.blogspot.com/2009/03/meu-novo-projeto-jnesbr.html' title='Meu novo projeto JNesBR'/><author><name>Leandro</name><uri>http://www.blogger.com/profile/09724892719833243149</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3760273245894556929.post-8526222140269764487</id><published>2009-03-06T05:21:00.001-08:00</published><updated>2009-03-06T05:22:33.226-08:00</updated><title type='text'>Aumente pessoas e seu projeto terá os objetivos atingidos mais rapidamente....</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://moriael.files.wordpress.com/2007/12/diversity.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 437px; height: 291px;" src="http://moriael.files.wordpress.com/2007/12/diversity.jpg" alt="" border="0" /&gt;&lt;/a&gt;Desde que fiz faculdade, e já faz dois anos, TODA a bibliografia SEMPRE dizia: ter muitas pessoas num projeto não garante que ele vá terminar mais rápido.&lt;br /&gt;E AINDA HOJE TEM pessoas da alta gerência que resolvem dar gás ao projeto inserido mais 20 colaboradores (não estou afirmando que às vezes é necessário mais pessoas). E depois a cobrança é mais idiota : "Um projeto com 15 pessoas teria que terminar mais rápido"... ah vai ler qualquer texto sobre gerência de projetos...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3760273245894556929-8526222140269764487?l=archsofty.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://archsofty.blogspot.com/feeds/8526222140269764487/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3760273245894556929&amp;postID=8526222140269764487' title='2 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3760273245894556929/posts/default/8526222140269764487'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3760273245894556929/posts/default/8526222140269764487'/><link rel='alternate' type='text/html' href='http://archsofty.blogspot.com/2009/03/aumente-pessoas-e-seu-projeto-tera-os.html' title='Aumente pessoas e seu projeto terá os objetivos atingidos mais rapidamente....'/><author><name>Leandro</name><uri>http://www.blogger.com/profile/09724892719833243149</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3760273245894556929.post-6388277987934028028</id><published>2009-03-02T11:54:00.000-08:00</published><updated>2009-03-02T12:04:05.086-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='modismos'/><category scheme='http://www.blogger.com/atom/ns#' term='git'/><category scheme='http://www.blogger.com/atom/ns#' term='versionamento'/><category scheme='http://www.blogger.com/atom/ns#' term='cvs'/><category scheme='http://www.blogger.com/atom/ns#' term='svn'/><category scheme='http://www.blogger.com/atom/ns#' term='modelagem'/><title type='text'>GIT,  SVN, CVS, SourceSafe etc. Podem tirar suas fóbias de comentar código</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.dtsc.ca.gov/HazardousWaste/EWaste/images/files.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 258px; height: 258px;" src="http://www.dtsc.ca.gov/HazardousWaste/EWaste/images/files.jpg" alt="" border="0" /&gt;&lt;/a&gt;Sabe aquele código comentado em produção que ninguém mexe e ainda dizem de modo obscuro... "Isso aí é coisa legada melhor deixar, vai que um dia tenhamos que descomentar..."&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Eu (sempre) prefiro tirar todo lixo do código (isso claro que inclui códigos comentados), mas para aqueles que ainda sentem calafrios ao excluir código comentado segue uma velha dica, qualquer (que conheço) sistema de versionamento oferece ÓTIMOS  e eficientes meios para que você possa "voltar" aquele comentário obscuro ...&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3760273245894556929-6388277987934028028?l=archsofty.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://archsofty.blogspot.com/feeds/6388277987934028028/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3760273245894556929&amp;postID=6388277987934028028' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3760273245894556929/posts/default/6388277987934028028'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3760273245894556929/posts/default/6388277987934028028'/><link rel='alternate' type='text/html' href='http://archsofty.blogspot.com/2009/03/git-svn-cvs-sourcesafe-etc-podem-tirar.html' title='GIT,  SVN, CVS, SourceSafe etc. Podem tirar suas fóbias de comentar código'/><author><name>Leandro</name><uri>http://www.blogger.com/profile/09724892719833243149</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3760273245894556929.post-1585969662753796956</id><published>2009-02-18T04:42:00.000-08:00</published><updated>2009-02-18T05:59:01.316-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='projeto de software'/><category scheme='http://www.blogger.com/atom/ns#' term='modismos'/><category scheme='http://www.blogger.com/atom/ns#' term='processo'/><category scheme='http://www.blogger.com/atom/ns#' term='documentação'/><category scheme='http://www.blogger.com/atom/ns#' term='piada'/><category scheme='http://www.blogger.com/atom/ns#' term='modelagem'/><title type='text'>UseCASE Generator - Viva a documentação</title><content type='html'>&lt;div style="text-align: justify;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.thelegalguardian.com/images/documentation.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 348px; height: 231px;" src="http://www.thelegalguardian.com/images/documentation.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Se você está atualmente empregado em uma empresa que adota documentações parecidas com isso abaixo:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;---------------------------------------&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Identificação:&lt;/span&gt; 1&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Envolvidos:&lt;/span&gt; Mariana, Pedro e Luís&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Caso de Uso:&lt;/span&gt; Manter Empregado&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Ações:&lt;/span&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Clicar em novo Empregado.&lt;/li&gt;&lt;li&gt;Inserir dados (nome, cpf,  nascimento, salário, departamento) do Empregado.&lt;/li&gt;&lt;li&gt;Clicar em salvar.&lt;/li&gt;&lt;/ol&gt;&lt;span style="font-weight: bold;"&gt;Exeções:&lt;/span&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Empregado não encontrado.&lt;/li&gt;&lt;li&gt;Não foi possível salvar.&lt;/li&gt;&lt;/ol&gt;---------------------------------------&lt;br /&gt;&lt;br /&gt;ou&lt;br /&gt;&lt;br /&gt;---------------------------------------&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Identificação:&lt;/span&gt; 2&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Envolvidos:&lt;/span&gt; Mariana, Pedro e Luís&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Caso de Uso:&lt;/span&gt; Manter Departamento&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Ações:&lt;/span&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Clicar em novo Departamento.&lt;/li&gt;&lt;li&gt;Inserir dados (nome, sala) do Departamento.&lt;/li&gt;&lt;li&gt;Clicar em salvar.&lt;/li&gt;&lt;/ol&gt; &lt;span style="font-weight: bold;"&gt;Exeções:&lt;/span&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Departamento não encontrado.&lt;/li&gt;&lt;li&gt;Não foi possível salvar.&lt;/li&gt;&lt;/ol&gt; ---------------------------------------&lt;br /&gt;&lt;br /&gt;Logo você precisa do &lt;span style="font-weight: bold;"&gt;UseCASE Generator Java V. 1.0 OpenSouce&lt;/span&gt;. (apesar de ser opensource o código não está disponível :P faça o seu)&lt;br /&gt;&lt;br /&gt;Veja a API riquíssima.&lt;br /&gt;&lt;span style="color: rgb(0, 0, 102);"&gt;&lt;span style="font-weight: bold;"&gt;public &lt;/span&gt;String createUseCase(int id, String[] stakeHolders, String entity, String[] properties);&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Exemplo de uso:&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 102);"&gt;String minhaSalvacao = useCASEGenerator.createUseCase(1, &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 102);"&gt;new String{"Mariana","Pedro","Luís"},&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 102);"&gt;"Empregado",&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 102);"&gt;new String{"nome", "cpf",  "nascimento", "salário", "departamento"});&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 102);"&gt;System.out.println(minhaSalvacao);&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Notou como é simples...&lt;br /&gt;&lt;span style="color: rgb(0, 51, 0);font-size:130%;" &gt;&lt;span style="font-weight: bold;"&gt;Pense rápido:&lt;/span&gt;&lt;/span&gt; se você consegue generalizar criar "case use generator" logo você não precisa documentar, apenas escreva um programa (&lt;span style="font-style: italic;"&gt;já que sua empresa exige isso&lt;/span&gt;) que faça isso pra você.&lt;br /&gt;&lt;br /&gt;PS: Essa ideia do UseCASE Generator é de um amigão (Marlos) e já está patenteada, portanto crie seus próprios UseCASE Generator e viva a documentação.&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3760273245894556929-1585969662753796956?l=archsofty.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://archsofty.blogspot.com/feeds/1585969662753796956/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3760273245894556929&amp;postID=1585969662753796956' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3760273245894556929/posts/default/1585969662753796956'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3760273245894556929/posts/default/1585969662753796956'/><link rel='alternate' type='text/html' href='http://archsofty.blogspot.com/2009/02/usecase-generator-viva-documentacao.html' title='UseCASE Generator - Viva a documentação'/><author><name>Leandro</name><uri>http://www.blogger.com/profile/09724892719833243149</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3760273245894556929.post-138133102344675000</id><published>2009-02-18T03:58:00.000-08:00</published><updated>2009-02-18T05:40:13.358-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='testes unitarios'/><category scheme='http://www.blogger.com/atom/ns#' term='test-driven development'/><category scheme='http://www.blogger.com/atom/ns#' term='tdd'/><category scheme='http://www.blogger.com/atom/ns#' term='unit test'/><category scheme='http://www.blogger.com/atom/ns#' term='testes'/><category scheme='http://www.blogger.com/atom/ns#' term='desenvolvimento orientado a testes'/><category scheme='http://www.blogger.com/atom/ns#' term='desenvolvimento guiado por testes'/><title type='text'>TDD - Desenvolvimento Guiado por Testes</title><content type='html'>&lt;div style="text-align: justify;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://blog.briandicroce.com/wp-content/uploads/2008/03/image50.png"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 310px; height: 192px;" src="http://blog.briandicroce.com/wp-content/uploads/2008/03/image50.png" alt="" border="0" /&gt;&lt;/a&gt;Sei que esse assunto já foi e é explorado em n locais de n diferentes formas, mesmo assim vejo gente "confundindo tudo" e perguntas do tipo:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Posso usar DDD com &lt;a href="http://en.wikipedia.org/wiki/Test-driven_development"&gt;TDD&lt;/a&gt;? (&lt;span style="font-style: italic; color: rgb(0, 0, 153);"&gt;sim&lt;/span&gt;)&lt;/li&gt;&lt;li&gt;TDD pode ser usado em processos não-ageis? (&lt;span style="font-style: italic; color: rgb(0, 0, 102);"&gt;sim&lt;/span&gt;)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;TDD não é perda de tempo? (&lt;span style="font-style: italic; color: rgb(0, 0, 102);"&gt;eu acho que não&lt;/span&gt;)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Faço testes no meu processo, estou usando TDD? (&lt;span style="font-style: italic; color: rgb(0, 0, 102);"&gt;depende&lt;/span&gt;)&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;A &lt;a href="http://en.wikipedia.org/wiki/Portal:Software_Testing"&gt;teoria de testes no desenvolvimento de sistemas&lt;/a&gt; é extensa, neste pequeno post não será possivel explicar cada conceito por tras dela ao contrário disso irei tentar explicar apenas o &lt;span style="color: rgb(0, 0, 102); font-weight: bold;"&gt;Ciclo&lt;/span&gt;&lt;span style="color: rgb(0, 0, 102);"&gt; &lt;/span&gt;(descaradamente inspirada no exemplo do &lt;a href="http://en.wikipedia.org/wiki/Test-Driven_Development_by_Example"&gt;livro&lt;/a&gt;).&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 102);font-size:180%;" &gt;Ciclo&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;1º Adicione um teste&lt;/span&gt;&lt;br /&gt;Antes mesmo de criar o código real que irá ser testado.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;2º Rode os testes e veja se os novos falham&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;Primeiro faça o teste falhar, geralmente escrevemos código falso. &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;ex: assertEquals("esperado",objeto.getRetornaNull());&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;3º Escreva um pouco de código&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;Escreva um pouco de código para fazer o teste funcionar.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;4º Rode os testes automatizados e os veja funcionando&lt;/span&gt;&lt;br /&gt;Agrege-os a sua base de testes automatizados (que pode ou deve ser rodado sempre num processo de build automatizado também).&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;5º Refatore o código&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;Agora você pode ter o tempo pra dar uma melhorada no design atual, refatoração é a ordem.&lt;br /&gt;ps: refatore tanto o &lt;span style="font-weight: bold;"&gt;código da aplicação quanto os testes&lt;/span&gt;.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;6º Volte para o passo 1&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;Apenas a repetição do processo. (claro que em uma nova estoria/caso de uso/whatever)&lt;br /&gt;&lt;br /&gt;Pra finalizar minha opinião: &lt;span style="font-weight: bold;"&gt;testes são tão importantes quanto o código final&lt;/span&gt; . (é algo que atesta sua qualidade executavel.) ahh e leia um bom livro sobre TDD acredito que irá achar a leitura agradavel.&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3760273245894556929-138133102344675000?l=archsofty.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://archsofty.blogspot.com/feeds/138133102344675000/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3760273245894556929&amp;postID=138133102344675000' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3760273245894556929/posts/default/138133102344675000'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3760273245894556929/posts/default/138133102344675000'/><link rel='alternate' type='text/html' href='http://archsofty.blogspot.com/2009/02/tdd-desenvolvimento-guiado-por-testes.html' title='TDD - Desenvolvimento Guiado por Testes'/><author><name>Leandro</name><uri>http://www.blogger.com/profile/09724892719833243149</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3760273245894556929.post-5198855533158025246</id><published>2009-01-27T08:10:00.000-08:00</published><updated>2009-01-27T09:14:21.026-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='projeto de software'/><category scheme='http://www.blogger.com/atom/ns#' term='oo'/><category scheme='http://www.blogger.com/atom/ns#' term='regras de negócio'/><title type='text'>Regras de negócio OO vs Condicionais</title><content type='html'>O que é uma regra de negócio ?&lt;br /&gt;São todas as regras existentes num &lt;a href="http://pt.wikipedia.org/wiki/Sistema_de_informa%C3%A7%C3%A3o" title="Sistema de informação"&gt;sistema de informação&lt;/a&gt;, que ditam seu comportamento, suas restrições e validações. ( &lt;a href="http://pt.wikipedia.org/wiki/Regras_de_neg%C3%B3cio"&gt;Wikipédia&lt;/a&gt; )&lt;br /&gt;&lt;br /&gt;Imaginemos um sistema de cadastro de usuários (com regras bem pobres, mas que já são o bastante pra exemplificar a construção de regras no software) um conjunto válido de regras poderia ser:&lt;br /&gt;&lt;br /&gt;1 - Só se pode cadastrar usuário que tem o nome de usuário com mais de 6 letras.&lt;br /&gt;2 - As senhas deverão ter no mínimo 6 letras e no máximo 8 letras.&lt;br /&gt;3 - Só será possível logar no sistema aqueles usuários que informarem a data de nascimento deles.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(102, 102, 204);font-size:180%;" &gt;Condicionais&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Numa abordagem condicional poderiamos ter.&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;&lt;blockquote&gt;&lt;span style="color: rgb(51, 0, 153);"&gt;if (! facade.cadastrar(usuario)){&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 0, 153);"&gt;    showMessage("Erro ao cadastrar");&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 0, 153);"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 0, 153);"&gt;public boolean cadastrar(Usuario usr){&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 0, 153);"&gt;        if (usr.nomeUsuario.length()&lt;=6){&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 0, 153);"&gt; return false;          &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 0, 153);"&gt;}         &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 0, 153);"&gt;if (usr.senha.length()&lt;6&gt;8){&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 0, 153);"&gt;               return false;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 0, 153);"&gt;         }&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 0, 153);"&gt;         return true;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 0, 153);"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;/div&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(102, 102, 204);font-size:180%;" &gt;Mais oo&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;As regras estariam (ou deveriam) no próprio objeto e ele deveria reger todas as chamadas à ele.&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: justify; color: rgb(51, 0, 153);"&gt;&lt;blockquote&gt;public void setNomeUsuario(String user){&lt;br /&gt;    if (user.length() &lt;=6) throw new NomeUsuarioInvalidoException("O nome deve conter no mínimo 7 letras.");&lt;br /&gt;}&lt;/blockquote&gt;&lt;/div&gt;O simples fato de dar comportamente a quem interessa tal comportamente (GRASP) já é um avanço nos projetos de software. A maioria dos desenvolvedores ficam encantados com Spring ou mesmo discutindo qual melhor uso dos Daos ou Repositorios mas quase todos se esquecem que um bom projeto é o simples fato de entender e modelar os problemas da maneira mais adequada ao seu contexto. (seja oo, xx , ss ou yy)&lt;br /&gt;&lt;br /&gt;* Tente sempre que possível codificar suas regras de negócio nos objetos (entidades).&lt;br /&gt;* Não dito que usar if's é errado mas que pode ser um "cheiro" de que algo está errado ou caminhando pra rumo errado.&lt;br /&gt;* O título ficou meio idiota no fim programas são sempre "condições" todavia não uma enxurada de condições encuraladas.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3760273245894556929-5198855533158025246?l=archsofty.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://archsofty.blogspot.com/feeds/5198855533158025246/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3760273245894556929&amp;postID=5198855533158025246' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3760273245894556929/posts/default/5198855533158025246'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3760273245894556929/posts/default/5198855533158025246'/><link rel='alternate' type='text/html' href='http://archsofty.blogspot.com/2009/01/regras-de-negocio-oo-vs-condicionais.html' title='Regras de negócio OO vs Condicionais'/><author><name>Leandro</name><uri>http://www.blogger.com/profile/09724892719833243149</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3760273245894556929.post-6778018723994241355</id><published>2009-01-18T01:32:00.000-08:00</published><updated>2009-01-27T08:10:10.956-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='java2d'/><category scheme='http://www.blogger.com/atom/ns#' term='chip8'/><category scheme='http://www.blogger.com/atom/ns#' term='emulador'/><category scheme='http://www.blogger.com/atom/ns#' term='código fonte'/><category scheme='http://www.blogger.com/atom/ns#' term='emulação'/><category scheme='http://www.blogger.com/atom/ns#' term='emulator'/><category scheme='http://www.blogger.com/atom/ns#' term='schip8'/><category scheme='http://www.blogger.com/atom/ns#' term='complemento de dois'/><title type='text'>JChip8BR</title><content type='html'>&lt;span style="font-size:180%;"&gt;Chip8 e SChip8 escritos em Java&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Chip8 é o projeto padrão para aqueles que desejam se iniciar no desenvolvimento de um emulator (ou máquina virtual, ou misto de simulador com emulação ou etc.) Este projeto é outro exemplo de como implementar essa "máquina". A linguagem que escolhi foi Java e pra renderizar usei o Java2D mesmo. Um simples (mas usual) debugador está também no JChip8BR e uma ferramenta (essa acho que pode ajudar) de "disassemblar" com o assembler em duas notações  a do David Winter e do Michael Toren.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:180%;"&gt;Screenshots&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.uploadimagens.com/upload/6f20751bfa1fc6f57a2c203ad49ae4f3.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 494px; height: 244px;" src="http://www.uploadimagens.com/upload/6f20751bfa1fc6f57a2c203ad49ae4f3.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-size:180%;"&gt;Página do projeto&lt;/span&gt;&lt;br /&gt;&lt;a href="http://code.google.com/p/jchip8br/"&gt;JChip8BR&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3760273245894556929-6778018723994241355?l=archsofty.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://archsofty.blogspot.com/feeds/6778018723994241355/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3760273245894556929&amp;postID=6778018723994241355' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3760273245894556929/posts/default/6778018723994241355'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3760273245894556929/posts/default/6778018723994241355'/><link rel='alternate' type='text/html' href='http://archsofty.blogspot.com/2009/01/jchip8br.html' title='JChip8BR'/><author><name>Leandro</name><uri>http://www.blogger.com/profile/09724892719833243149</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3760273245894556929.post-7363428840033942862</id><published>2009-01-16T07:31:00.000-08:00</published><updated>2009-01-16T07:56:24.622-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='otimizacao'/><category scheme='http://www.blogger.com/atom/ns#' term='programacao'/><category scheme='http://www.blogger.com/atom/ns#' term='complemento de dois'/><title type='text'>Java e os tipos sem sinais (unsigned types)</title><content type='html'>&lt;div style="text-align: justify;"&gt;&lt;span style="font-style: italic;"&gt;"A grande maioria dos desenvolvedores Java (bem como outras linguagens tipadas) quando necessitam representar algum número inteiro provavelmente usam int. Antigamente as pessoas tinham maiores preocupações com a quantidade de memória disponível, hoje nem tanto. Contudo há uma nova gama de aplicações pra celular surgindo e nesses casos otimização é uma obrigação."&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;(alguém me disse isso em algum momento...)&lt;br /&gt;&lt;br /&gt;Se fossemos criar um atributo pra representar o número de cadeiras numa sala (tendo em vista que está sala não suporta mais de 240 cadeiras) poderíamos usar int, short ou byte. (claro que aqui caberiam outros tipos como char, String, double... )&lt;br /&gt;&lt;br /&gt;Usar int ou short seria desperdício de memória!&lt;br /&gt;Logo podemos utilizar byte?!&lt;br /&gt;&lt;br /&gt;Nem tão rápido, 1 byte pode caber "256" números diferentes...&lt;br /&gt;Em Java o byte tem 256 "posições" mas essas são preenchidas com os seguinte números -127 a 127.&lt;br /&gt;&lt;br /&gt;Ou seja se você somar:&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153); font-weight: bold;"&gt;        byte x = 127;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153); font-weight: bold;"&gt;        byte y = (byte)(x + 1);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153); font-weight: bold;"&gt;        System.out.println("x="+x);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153); font-weight: bold;"&gt;        System.out.println("y="+y);&lt;/span&gt;&lt;br /&gt;você terá, ao invés de 128, &lt;span style="color: rgb(255, 102, 0); font-weight: bold; font-style: italic;"&gt;y = -127&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;O Wraparound do tipo byte&lt;/span&gt;&lt;br /&gt;Com sinal:&lt;br /&gt;-127 .. -100 .. 0 .. 1 .. 127  (127 + 1 == -127)&lt;br /&gt;&lt;br /&gt;Sem sinal:&lt;br /&gt;0 .. 100 .. 200 .. 255  ( 255 + 1  == 0)&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;Como extrair o byte sem sinal de um byte em Java? (tem como retornar o valor sem sinal?)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Simplesmente :  &lt;br /&gt;public static short readUnsignedByte(byte value){&lt;br /&gt;       return (short) (value &amp;amp; 0xff);&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;Se você passar -127 o método vai devolver o 128 e assim por diante. (claro que o retorno é short e não byte.)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3760273245894556929-7363428840033942862?l=archsofty.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://archsofty.blogspot.com/feeds/7363428840033942862/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3760273245894556929&amp;postID=7363428840033942862' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3760273245894556929/posts/default/7363428840033942862'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3760273245894556929/posts/default/7363428840033942862'/><link rel='alternate' type='text/html' href='http://archsofty.blogspot.com/2009/01/java-e-os-tipos-sem-sinais-unsigned.html' title='Java e os tipos sem sinais (unsigned types)'/><author><name>Leandro</name><uri>http://www.blogger.com/profile/09724892719833243149</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3760273245894556929.post-1351893232426792445</id><published>2009-01-15T15:18:00.000-08:00</published><updated>2009-01-15T15:28:25.535-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='internet'/><category scheme='http://www.blogger.com/atom/ns#' term='3g'/><title type='text'>Os altos e baixos da qualidade na conexão 3G!  - parte 2</title><content type='html'>&lt;a href="http://archsofty.blogspot.com/2008/11/os-altos-e-baixos-da-qualidade-na.html"&gt;Os altos e baixos da qualidade na conexão 3G!&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;O post do link acima... foi escrito há um tempo atrás...&lt;br /&gt;Depois disso tive experiências com outras operadoras e outros modelos de modems.&lt;br /&gt;Estou assustado com a melhoria de qualidade quando, usando a mesma brt, troquei de modem (um modelo mais novo). Claro que também pode ter sido que o sinal 3G na minha região tenha melhorado e não o modem.&lt;br /&gt;&lt;br /&gt;Esse novo modelo de modem, que está na forma de um pendrive da cor branca, parece aceitar mais um protocolo de comunicação (além de demonstrar uma clara melhoria na "escolha automática" dos mesmos).&lt;br /&gt;&lt;br /&gt;Como não tenho o velho modem (o da cor preta com formato retangular) pra testar não posso apenas lhe dar um conselho (tipo, troque de modem), mas se for possível à você realize um teste com esse "novo modelo" da zte.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3760273245894556929-1351893232426792445?l=archsofty.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://archsofty.blogspot.com/feeds/1351893232426792445/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3760273245894556929&amp;postID=1351893232426792445' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3760273245894556929/posts/default/1351893232426792445'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3760273245894556929/posts/default/1351893232426792445'/><link rel='alternate' type='text/html' href='http://archsofty.blogspot.com/2009/01/os-altos-e-baixos-da-qualidade-na.html' title='Os altos e baixos da qualidade na conexão 3G!  - parte 2'/><author><name>Leandro</name><uri>http://www.blogger.com/profile/09724892719833243149</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3760273245894556929.post-1471008334036365491</id><published>2008-12-17T12:34:00.001-08:00</published><updated>2009-01-18T01:50:12.594-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='modismos'/><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='domain-specific language'/><category scheme='http://www.blogger.com/atom/ns#' term='dsl interna'/><category scheme='http://www.blogger.com/atom/ns#' term='dsl'/><category scheme='http://www.blogger.com/atom/ns#' term='modelagem'/><title type='text'>Brincando com constantes</title><content type='html'>Tudo começa com um simples programa que imprime o nome e o sobrenome.&lt;br /&gt;&lt;br /&gt;package exemplo.entidade;&lt;br /&gt;&lt;br /&gt;public class Testadora {&lt;br /&gt;&lt;br /&gt;    public static void main(String[] args) {       &lt;br /&gt;        mostrarNome();&lt;br /&gt;        mostrarSobrenome();&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    private static void mostrarSobrenome() {&lt;br /&gt;        System.out.print("Sobrenome ");&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    private static void mostrarNome() {&lt;br /&gt;        System.out.print("Nome ");&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Alguém resolve fatorá-lo, resolve deixar tudo em um único local.&lt;br /&gt;&lt;br /&gt;package exemplo.entidade;&lt;br /&gt;&lt;br /&gt;public class Testadora {&lt;br /&gt;    public static final int NOME = 10;&lt;br /&gt;    public static final int SOBRENOME = 20;&lt;br /&gt;&lt;br /&gt;    public static void main(String[] args) {&lt;br /&gt;        mostrarNome();&lt;br /&gt;        mostrarSobrenome();&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    private static void mostrarSobrenome() {&lt;br /&gt;        mostrar(SOBRENOME);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    private static void mostrarNome() {&lt;br /&gt;        mostrar(NOME);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    private static void mostrar(int tipo) {&lt;br /&gt;            if (tipo==NOME){&lt;br /&gt;                System.out.print("Nome ");&lt;br /&gt;            }else if(tipo==SOBRENOME){&lt;br /&gt;                System.out.print("Sobrenome ");&lt;br /&gt;            }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;A principio parece estar agregando mais complexidade a algo que deveria simplesmente fazer algo trivial. Um terceiro resolve retirar os "mediadores".&lt;br /&gt;&lt;br /&gt;package exemplo.entidade;&lt;br /&gt;&lt;br /&gt;public class Testadora {&lt;br /&gt;    public static final int NOME = 10;&lt;br /&gt;    public static final int SOBRENOME = 20;&lt;br /&gt;&lt;br /&gt;    public static void main(String[] args) {&lt;br /&gt;        mostrar(NOME);&lt;br /&gt;        mostrar(SOBRENOME);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    private static void mostrar(int tipo) {&lt;br /&gt;            if (tipo==NOME){&lt;br /&gt;                System.out.print("Nome ");&lt;br /&gt;            }else if(tipo==SOBRENOME){&lt;br /&gt;                System.out.print("Sobrenome ");&lt;br /&gt;            }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;Um quarto metido a espertinho realiza uma mudança que deixa o código bem mais simpático.&lt;br /&gt;&lt;br /&gt;package exemplo.entidade;&lt;br /&gt;&lt;br /&gt;public class Testadora {&lt;br /&gt;    public static final int NOME = 10;&lt;br /&gt;    public static final int SOBRENOME = 20;&lt;br /&gt;&lt;br /&gt;    public static void main(String[] args) {&lt;br /&gt;        mostrar(NOME+SOBRENOME);       &lt;br /&gt;        mostrar(NOME);       &lt;br /&gt;        mostrar(SOBRENOME);       &lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    private static void mostrar(int tipo) {&lt;br /&gt;            if (tipo==NOME){&lt;br /&gt;                System.out.print("Nome ");&lt;br /&gt;            }else if(tipo==SOBRENOME){&lt;br /&gt;                System.out.print("Sobrenome ");&lt;br /&gt;            }if (tipo==NOME+SOBRENOME){&lt;br /&gt;                System.out.print("Nome Sobrenome ");&lt;br /&gt;            }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;Fica simples e objetivo o propósito mostrar o nome e o sobrenome. :)&lt;br /&gt;&lt;br /&gt;ps: favor notar que o post não discute o fato de usar ou não polimorfismo, apenas mostra um modo elegante de se aproveitar o uso de constantes.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3760273245894556929-1471008334036365491?l=archsofty.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://archsofty.blogspot.com/feeds/1471008334036365491/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3760273245894556929&amp;postID=1471008334036365491' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3760273245894556929/posts/default/1471008334036365491'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3760273245894556929/posts/default/1471008334036365491'/><link rel='alternate' type='text/html' href='http://archsofty.blogspot.com/2008/12/brincando-com-constantes.html' title='Brincando com constantes'/><author><name>Leandro</name><uri>http://www.blogger.com/profile/09724892719833243149</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3760273245894556929.post-2511428458660052417</id><published>2008-11-29T04:38:00.000-08:00</published><updated>2009-01-18T01:57:15.649-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='internet'/><category scheme='http://www.blogger.com/atom/ns#' term='3g'/><title type='text'>Os altos e baixos da qualidade na conexão 3G!</title><content type='html'>Atualmente uso o link da BrT 3G para acessar a Internet. Notei que sempre houve altos e baixos, um dia a conexão está ótima outro está péssima, procurei na Internet e não encontrei nada que me ajudasse, liguei pra BrT e tive a seguinte resposta o "Windows Vista não está listado na blá blá blá blá.. por isso a rede pode apresentar altos e baixos" e a última coisa foi tentar mudar alguns parametros de configuração pra ver se alterava algo na qualidade.&lt;br /&gt;&lt;br /&gt;Basicamente só mudei o modo preferencial da rede, pra acessar esse menu tenha certeza que ainda não está conectado na rede, clique em 1,2,3 e 4 note que o 3 (os números são referências pra figura abaixo) permite alterar o modo que a rede é escolhida.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_2W5qHpT9JNQ/STE5GDZrAxI/AAAAAAAAACw/eb0pSH_ixUQ/s1600-h/interface+modem+3g+brasil+telecom+brt+hsdpa+zte.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 322px;" src="http://3.bp.blogspot.com/_2W5qHpT9JNQ/STE5GDZrAxI/AAAAAAAAACw/eb0pSH_ixUQ/s400/interface+modem+3g+brasil+telecom+brt+hsdpa+zte.JPG" alt="" id="BLOGGER_PHOTO_ID_5274059414782542610" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Veja as estatísticas de quando configurei o modem pra &lt;span style="font-weight: bold;"&gt;"Preferir 3G"&lt;/span&gt; (neste modo há uma oscilação entre os vários protocolos : &lt;span style="font-weight: bold;"&gt;HSDPA&lt;/span&gt;, &lt;span style="font-weight: bold;"&gt;UMTS &lt;/span&gt;e &lt;span style="font-weight: bold;"&gt;EDGE &lt;/span&gt;&lt;span style="font-style: italic;"&gt;[ao menos os que percebi]&lt;/span&gt;)&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;* Quando digo estatísticas me refiro a saída do comando &lt;span style="font-weight: bold; color: rgb(51, 0, 153);"&gt;ping www.google.com.br -n 25&lt;/span&gt; que executei em ambiente Windows.&lt;/span&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;&lt;/div&gt;&lt;blockquote&gt;&lt;div style="text-align: justify;"&gt;Estatísticas do Ping para 209.85.193.99:&lt;br /&gt;  Pacotes: Enviados = 25, Recebidos = 18, Perdidos = 7 (&lt;span style="font-weight: bold; color: rgb(255, 0, 0);"&gt;28% de perda&lt;/span&gt;),&lt;br /&gt;Aproximar um número redondo de vezes em milissegundos:&lt;br /&gt;  Mínimo = 714ms, Máximo = 4140ms, &lt;span style="font-weight: bold; color: rgb(255, 0, 0);"&gt;Média = 2017ms&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;blockquote&gt;Estatísticas do Ping para 209.85.193.104:&lt;br /&gt;  Pacotes: Enviados = 25, Recebidos = 19, Perdidos = 6 (&lt;span style="color: rgb(255, 0, 0); font-weight: bold;"&gt;24% de perda&lt;/span&gt;),&lt;br /&gt;Aproximar um número redondo de vezes em milissegundos:&lt;br /&gt;  Mínimo = 578ms, Máximo = 3849ms, &lt;span style="color: rgb(255, 0, 0); font-weight: bold;"&gt;Média = 2697ms&lt;/span&gt;&lt;/blockquote&gt;&lt;div style="text-align: justify;"&gt;&lt;blockquote&gt;Estatísticas do Ping para 209.85.193.99:&lt;br /&gt;  Pacotes: Enviados = 25, Recebidos = 24, Perdidos = 1 (&lt;span style="color: rgb(255, 0, 0); font-weight: bold;"&gt;4% de perda&lt;/span&gt;),&lt;br /&gt;Aproximar um número redondo de vezes em milissegundos:&lt;br /&gt;  Mínimo = 211ms, Máximo = 4195ms, &lt;span style="font-weight: bold; color: rgb(255, 0, 0);"&gt;Média = 2318ms&lt;/span&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;/div&gt;&lt;blockquote&gt;&lt;div style="text-align: justify;"&gt;Estatísticas do Ping para 209.85.193.99:&lt;br /&gt;  Pacotes: Enviados = 25, Recebidos = 25, Perdidos = 0 (&lt;span style="font-weight: bold; color: rgb(255, 0, 0);"&gt;0% de perda&lt;/span&gt;),&lt;br /&gt;Aproximar um número redondo de vezes em milissegundos:&lt;br /&gt;  Mínimo = 920ms, Máximo = 3914ms, &lt;span style="color: rgb(255, 0, 0); font-weight: bold;"&gt;Média = 1890ms&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;br /&gt;Estatísticas do Ping para 209.85.193.104:&lt;br /&gt;  Pacotes: Enviados = 25, Recebidos = 12, Perdidos = 13 (&lt;span style="font-weight: bold; color: rgb(255, 0, 0);"&gt;52% de perda&lt;/span&gt;),&lt;br /&gt;Aproximar um número redondo de vezes em milissegundos:&lt;br /&gt;  Mínimo = 1366ms, Máximo = 4155ms, &lt;span style="font-weight: bold; color: rgb(255, 0, 0);"&gt;Média = 2586ms&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/blockquote&gt;&lt;div style="text-align: justify;"&gt;&lt;/div&gt;&lt;blockquote&gt;&lt;div style="text-align: justify;"&gt;Estatísticas do Ping para 209.85.193.99:&lt;br /&gt;  Pacotes: Enviados = 25, Recebidos = 25, Perdidos = 0 (&lt;span style="font-weight: bold; color: rgb(255, 0, 0);"&gt;0% de perda&lt;/span&gt;),&lt;br /&gt;Aproximar um número redondo de vezes em milissegundos:&lt;br /&gt;  Mínimo = 132ms, Máximo = 3696ms, &lt;span style="font-weight: bold; color: rgb(255, 0, 0);"&gt;Média = 1206ms&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;/blockquote&gt;Usando o modo "Preferir 3G" quando a rede usou o protocolo &lt;span style="font-weight: bold;"&gt;HSDPA &lt;/span&gt;a qualidade da conexão ficou boa.&lt;br /&gt;&lt;blockquote&gt;Estatísticas do Ping para 209.85.193.99:&lt;br /&gt;  Pacotes: Enviados = 25, Recebidos = 25, Perdidos = 0 (&lt;span style="font-weight: bold; color: rgb(255, 0, 0);"&gt;0% de perda&lt;/span&gt;),&lt;br /&gt;Aproximar um número redondo de vezes em milissegundos:&lt;br /&gt;  Mínimo = 129ms, Máximo = 156ms, &lt;span style="font-weight: bold; color: rgb(255, 0, 0);"&gt;Média = 139ms&lt;/span&gt;&lt;/blockquote&gt;Depois que mudei o modo para "Apenas 3G" veja as novas estatísticas.&lt;br /&gt;&lt;blockquote&gt;Estatísticas do Ping para 209.85.193.104:&lt;br /&gt;  Pacotes: Enviados = 20, Recebidos = 19, Perdidos = 1 (&lt;span style="color: rgb(255, 0, 0); font-weight: bold;"&gt;5% de perda&lt;/span&gt;),&lt;br /&gt;Aproximar um número redondo de vezes em milissegundos:&lt;br /&gt;  Mínimo = 109ms, Máximo = 332ms, &lt;span style="font-weight: bold; color: rgb(255, 0, 0);"&gt;Média = 137ms&lt;/span&gt;&lt;/blockquote&gt;&lt;blockquote&gt;Estatísticas do Ping para 209.85.193.104:&lt;br /&gt;  Pacotes: Enviados = 20, Recebidos = 20, Perdidos = 0 (&lt;span style="color: rgb(255, 0, 0); font-weight: bold;"&gt;0% de perda&lt;/span&gt;),&lt;br /&gt;Aproximar um número redondo de vezes em milissegundos:&lt;br /&gt;  Mínimo = 121ms, Máximo = 218ms, &lt;span style="font-weight: bold; color: rgb(255, 0, 0);"&gt;Média = 142ms&lt;/span&gt;&lt;/blockquote&gt;Claramente houve uma melhoria consideravel. Mesmo configurando para "Somente 3G" ainda existe a oscilação entre os protocolos HSDPA e UMTS, sempre que se usa o UMTS a qualidade da conexão é reduzida.&lt;br /&gt;&lt;br /&gt;Conversando com alguns técnicos da BrT eles me informaram que em alguns locais o sinal 3G pode ser bem fraco ou inexistente, nesses casos é bom deixar "Preferir 3G". Eu sempre uso o "Somente 3G", até porque eu paguei foi por isso. Minha conexão ficou bem melhor após essas "mudanças", claro que as oscilações continuam mas agora são bem menores.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3760273245894556929-2511428458660052417?l=archsofty.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://archsofty.blogspot.com/feeds/2511428458660052417/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3760273245894556929&amp;postID=2511428458660052417' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3760273245894556929/posts/default/2511428458660052417'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3760273245894556929/posts/default/2511428458660052417'/><link rel='alternate' type='text/html' href='http://archsofty.blogspot.com/2008/11/os-altos-e-baixos-da-qualidade-na.html' title='Os altos e baixos da qualidade na conexão 3G!'/><author><name>Leandro</name><uri>http://www.blogger.com/profile/09724892719833243149</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_2W5qHpT9JNQ/STE5GDZrAxI/AAAAAAAAACw/eb0pSH_ixUQ/s72-c/interface+modem+3g+brasil+telecom+brt+hsdpa+zte.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3760273245894556929.post-1169193923449463315</id><published>2008-11-12T14:55:00.000-08:00</published><updated>2008-11-12T15:10:11.136-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='projeto de software'/><category scheme='http://www.blogger.com/atom/ns#' term='jpcsp'/><category scheme='http://www.blogger.com/atom/ns#' term='emulador'/><category scheme='http://www.blogger.com/atom/ns#' term='jogl'/><category scheme='http://www.blogger.com/atom/ns#' term='emulator'/><category scheme='http://www.blogger.com/atom/ns#' term='psp'/><category scheme='http://www.blogger.com/atom/ns#' term='playstation portable'/><title type='text'>Jpcsp - Estado (status) atual e alguns screenshots do emulador de psp feito em java</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_2W5qHpT9JNQ/SRtgY4iQovI/AAAAAAAAACo/yJlmp9zUgQg/s1600-h/jpcsp+untold+legends.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 293px;" src="http://1.bp.blogspot.com/_2W5qHpT9JNQ/SRtgY4iQovI/AAAAAAAAACo/yJlmp9zUgQg/s400/jpcsp+untold+legends.JPG" alt="" id="BLOGGER_PHOTO_ID_5267910169749136114" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_2W5qHpT9JNQ/SRtgY3VxZeI/AAAAAAAAACg/DBiwit3tvaM/s1600-h/jpcsp+harvest+moon+boy+girl.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 293px;" src="http://2.bp.blogspot.com/_2W5qHpT9JNQ/SRtgY3VxZeI/AAAAAAAAACg/DBiwit3tvaM/s400/jpcsp+harvest+moon+boy+girl.JPG" alt="" id="BLOGGER_PHOTO_ID_5267910169428321762" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_2W5qHpT9JNQ/SRtfnTC6S7I/AAAAAAAAACY/135CGMqD3h4/s1600-h/jpcsp+tales+of+eternia.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 289px;" src="http://1.bp.blogspot.com/_2W5qHpT9JNQ/SRtfnTC6S7I/AAAAAAAAACY/135CGMqD3h4/s400/jpcsp+tales+of+eternia.jpg" alt="" id="BLOGGER_PHOTO_ID_5267909317871946674" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_2W5qHpT9JNQ/SRtfnTC6S7I/AAAAAAAAACY/135CGMqD3h4/s1600-h/jpcsp+tales+of+eternia.jpg"&gt;&lt;/a&gt;Para o jogo Tales of Eternia (ToE) o problema de antes (a grid que aparecia na renderização) desapareceu. Novos desenvolvedores que têm ótimas habilidades com opengl somaram mais ao grupo !&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Nesse momento estamos trabalhando em algumas otimizações, cacheamento de texturas, melhorando código em partes que são extremamente executadas... e claro sempre "evoluindo", o jpcsp oferece um ótimo debugger além de um sistema de logging que AJUDA muito.&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3760273245894556929-1169193923449463315?l=archsofty.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://archsofty.blogspot.com/feeds/1169193923449463315/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3760273245894556929&amp;postID=1169193923449463315' title='1 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3760273245894556929/posts/default/1169193923449463315'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3760273245894556929/posts/default/1169193923449463315'/><link rel='alternate' type='text/html' href='http://archsofty.blogspot.com/2008/11/jpcsp-estado-status-atual-e-alguns.html' title='Jpcsp - Estado (status) atual e alguns screenshots do emulador de psp feito em java'/><author><name>Leandro</name><uri>http://www.blogger.com/profile/09724892719833243149</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_2W5qHpT9JNQ/SRtgY4iQovI/AAAAAAAAACo/yJlmp9zUgQg/s72-c/jpcsp+untold+legends.JPG' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3760273245894556929.post-1590864743594567030</id><published>2008-11-03T04:59:00.001-08:00</published><updated>2008-11-03T18:57:58.446-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='javaserver faces'/><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='autorizacao'/><category scheme='http://www.blogger.com/atom/ns#' term='autenticacao'/><category scheme='http://www.blogger.com/atom/ns#' term='jsf'/><title type='text'>Login - autenticação e autorização usando JavaServer Faces (jsf)</title><content type='html'>&lt;div&gt;Este post trará (ou tentará trazer) informações básicas para o desenvolvimento de um sistema de login para aplicações web javaserver faces (jsf) . Com estas informações creio que será possível pra você implementar seu sistema de Login.&lt;/div&gt; &lt;div&gt; &lt;/div&gt; &lt;div&gt;Basicamente...&lt;br /&gt;&lt;br /&gt;&lt;/div&gt; &lt;div&gt; &lt;/div&gt; &lt;div&gt;O &lt;strong&gt;Usuario&lt;/strong&gt; tem um nomeDeUsuario uma senha e um ou mais Perfis.&lt;/div&gt; &lt;div&gt;Cada &lt;strong&gt;Perfil&lt;/strong&gt; está vinculado a uma ou mais páginas. (ou recursos ou qualquer nomenclatura que você quiser usar)&lt;/div&gt; &lt;div&gt;Uma &lt;strong&gt;Página&lt;/strong&gt; é um objeto simples que tem uma descrição.&lt;/div&gt; &lt;div&gt; &lt;/div&gt; &lt;div&gt;Na tentativa de resumir a estrutura seria algo semelhante a essa pseudo-modelagem...&lt;/div&gt; &lt;div&gt; &lt;/div&gt; &lt;div&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;&lt;/span&gt;&lt;/div&gt;&lt;blockquote&gt;&lt;div&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;Pagina &lt;strong&gt;paginaAdmin&lt;/strong&gt; = new Pagina("/admin.jsf");&lt;/span&gt;&lt;/div&gt; &lt;div&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;Pagina &lt;strong&gt;paginaNormal&lt;/strong&gt;= new Pagina("/principal.jsf");&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt; &lt;div&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;&lt;/span&gt; &lt;/div&gt; &lt;div&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;Perfil &lt;strong&gt;admin&lt;/strong&gt; = new Perfil();&lt;/span&gt;&lt;/div&gt; &lt;div&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;&lt;strong&gt;admin&lt;/strong&gt;.temAcesso(&lt;strong&gt;paginaAdmin&lt;/strong&gt;).temAcesso(&lt;strong&gt;paginaNormal&lt;/strong&gt;);&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt; &lt;div&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;&lt;/span&gt; &lt;/div&gt; &lt;div&gt; &lt;div&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;Perfil &lt;strong&gt;normal&lt;/strong&gt; = new Perfil();&lt;/span&gt;&lt;/div&gt; &lt;div&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;&lt;strong&gt;normal&lt;/strong&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;&lt;strong&gt;&lt;/strong&gt;.temAcesso(&lt;strong&gt;paginaNormal&lt;/strong&gt;);&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt; &lt;div&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;&lt;/span&gt; &lt;/div&gt; &lt;div&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;Usuario&lt;strong&gt; homerSimpsons&lt;/strong&gt; = new Usuario("homer99","senha");&lt;/span&gt;&lt;/div&gt; &lt;div&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;&lt;strong&gt;homerSimpsons&lt;/strong&gt;.temPerfilDe(admin);&lt;/span&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;div&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;&lt;/span&gt;&lt;/div&gt; &lt;div&gt; &lt;/div&gt; &lt;div&gt;Crie um PhaseListener como abaixo.&lt;br /&gt;&lt;/div&gt; &lt;div&gt; &lt;/div&gt; &lt;div&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;&lt;/span&gt;&lt;blockquote&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;package &lt;a href="http://meu.pacote.br/"&gt;meu.pacote.br&lt;/a&gt;; &lt;/span&gt; &lt;p&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;import javax.faces.application.NavigationHandler;&lt;br /&gt;import javax.faces.context.FacesContext;&lt;br /&gt;import javax.faces.event.PhaseEvent;&lt;br /&gt;import javax.faces.event.PhaseId;&lt;br /&gt;import javax.faces.event.PhaseListener;&lt;br /&gt;import javax.servlet.http.HttpSession;&lt;br /&gt;&lt;br /&gt;public class AuthorizationListener implements PhaseListener {&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;    public void afterPhase(PhaseEvent event) {&lt;br /&gt;       FacesContext facesContext = event.getFacesContext();&lt;br /&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;//adiquirindo o FacesContext.&lt;/span&gt;&lt;br /&gt;       String currentPage = facesContext.getViewRoot().getViewId();&lt;br /&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;//armazenando a página que fez a requisição. (a string da pág. atual ex: "/pag.jsf")&lt;/span&gt;&lt;br /&gt;       boolean isLoginPage = (currentPage.lastIndexOf("login.xhtml") &amp;gt; -1);&lt;br /&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;//fazendo a verificação mais básica de todas... se é a página de login.&lt;/span&gt;&lt;br /&gt;       HttpSession session = (HttpSession) facesContext.getExternalContext().getSession(true);&lt;br /&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;//adquirindo a sessão (essa mesma onde você deverá guardar seu usuário no nível de sessão com descritor currentUser).&lt;/span&gt;&lt;br /&gt;       Usuario user = (Usuario) session.getAttribute("currentUser");&lt;br /&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;//apenas recuperando o valor da sessão.&lt;/span&gt;&lt;br /&gt;       if (!isLoginPage &amp;amp;&amp;amp; user == null) {&lt;br /&gt;           NavigationHandler nh = facesContext.getApplication().getNavigationHandler();&lt;br /&gt;           nh.handleNavigation(facesContext, null, "loginPage");&lt;br /&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;//bem, se não está logado redireciona pra lógica que (navigatio rule) atende a loginPage&lt;/span&gt;&lt;br /&gt;       } else {&lt;br /&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;//verificar se o usuario atual tem acesso a página atual.&lt;/span&gt;&lt;br /&gt;         boolean temAcesso = user.temAcesso(new Pagina(currentPage));&lt;br /&gt;         if (!temAcesso){&lt;br /&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;//aqui a logica de não ter acesso... redicione novamente? faça algo... ???&lt;/span&gt;   &lt;br /&gt;         }&lt;br /&gt;       }&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;//caso contrário o jsf passa tranquilamente por aqui!!!&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;    }&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;    public void beforePhase(PhaseEvent event) {&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;//poderia ter sido escrito nesse evento antes da "fase" (lembra do básico do jsf, o ciclo de vida e as fases...&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;    }&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;    public PhaseId getPhaseId() {&lt;br /&gt;       return PhaseId.RESTORE_VIEW;&lt;br /&gt;   }&lt;br /&gt;}&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;&lt;/span&gt;&lt;/p&gt;&lt;/div&gt; &lt;div&gt;E uma lógica pra logar o usuário na sessão...&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;&lt;/span&gt;&lt;blockquote&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;FacesContext.getCurrentInstance().getExternalContext().getSessionMap().put("&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;currentUser&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;", user);&lt;/span&gt;&lt;/blockquote&gt;E registre essa classe no arquivo faces-config.xml. Claro, registre também um navigation que atenda a qualquer chamada para loginPage.&lt;/div&gt; &lt;p&gt;    &amp;lt;lifecycle&amp;gt;&lt;br /&gt;       &amp;lt;phase-listener&amp;gt;&lt;br /&gt;           org.gpro.filter.AuthorizationListener&lt;br /&gt;       &amp;lt;/phase-listener&amp;gt;&lt;br /&gt;   &amp;lt;/lifecycle&amp;gt;&lt;br /&gt; &lt;br /&gt;   &amp;lt;navigation-rule&amp;gt;&lt;br /&gt;       &amp;lt;from-view-id&amp;gt;/*&amp;lt;/from-view-id&amp;gt;&lt;br /&gt;       &amp;lt;navigation-case&amp;gt;&lt;br /&gt;           &amp;lt;from-outcome&amp;gt;loginPage&amp;lt;/from-outcome&amp;gt;&lt;br /&gt;           &amp;lt;to-view-id&amp;gt;/login.xhtml&amp;lt;/to-view-id&amp;gt;&lt;br /&gt;           &amp;lt;redirect/&amp;gt;&lt;br /&gt;       &amp;lt;/navigation-case&amp;gt;&lt;br /&gt;   &amp;lt;/navigation-rule&amp;gt;&lt;/p&gt; &lt;div&gt; &lt;/div&gt; &lt;div&gt;Claro que o código pode e deve ser modificado para questões de flexibilidade, legibilidade e até mesmo performance. O propósito inicial era mostrar como desenvolver um sistema de login com jsf. O código mostrado foi feito apenas pra exemplificar qualquer erro ou dúvida postem aqui.&lt;br /&gt;&lt;/div&gt; &lt;div&gt;Mais informações em:&lt;/div&gt; &lt;div&gt; &lt;div&gt;&lt;a href="http://java.sun.com/javaee/javaserverfaces/1.1_01/docs/api/javax/faces/event/PhaseListener.html"&gt;http://java.sun.com/javaee/javaserverfaces/1.1_01/docs/api/javax/faces/event/PhaseListener.html&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3760273245894556929-1590864743594567030?l=archsofty.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://archsofty.blogspot.com/feeds/1590864743594567030/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3760273245894556929&amp;postID=1590864743594567030' title='14 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3760273245894556929/posts/default/1590864743594567030'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3760273245894556929/posts/default/1590864743594567030'/><link rel='alternate' type='text/html' href='http://archsofty.blogspot.com/2008/11/login-autenticao-e-autorizao-usando.html' title='Login - autenticação e autorização usando JavaServer Faces (jsf)'/><author><name>Leandro</name><uri>http://www.blogger.com/profile/09724892719833243149</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>14</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3760273245894556929.post-746792866273637982</id><published>2008-11-01T15:33:00.000-07:00</published><updated>2008-11-01T15:39:50.445-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='jpcsp'/><category scheme='http://www.blogger.com/atom/ns#' term='emulador'/><category scheme='http://www.blogger.com/atom/ns#' term='jogl'/><category scheme='http://www.blogger.com/atom/ns#' term='otimizacao'/><category scheme='http://www.blogger.com/atom/ns#' term='emulator'/><category scheme='http://www.blogger.com/atom/ns#' term='opengl'/><title type='text'>Jpcsp - já mostra tela de jogo comercial</title><content type='html'>Depois de algum (MUITOOOOOOOO) trabalho veja a primeira screen de um jogo comercial rodando no jpcsp.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://jpcsp.org/images/thumbs/taleofeternia1.JPG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 597px; height: 374px;" src="http://jpcsp.org/images/thumbs/taleofeternia1.JPG" border="0" alt="" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3760273245894556929-746792866273637982?l=archsofty.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://archsofty.blogspot.com/feeds/746792866273637982/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3760273245894556929&amp;postID=746792866273637982' title='3 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3760273245894556929/posts/default/746792866273637982'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3760273245894556929/posts/default/746792866273637982'/><link rel='alternate' type='text/html' href='http://archsofty.blogspot.com/2008/11/jpcsp-j-mostra-tela-de-jogo-comercial.html' title='Jpcsp - já mostra tela de jogo comercial'/><author><name>Leandro</name><uri>http://www.blogger.com/profile/09724892719833243149</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3760273245894556929.post-5824137062292033366</id><published>2008-10-28T20:14:00.000-07:00</published><updated>2008-10-28T20:32:09.525-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='democracia'/><category scheme='http://www.blogger.com/atom/ns#' term='fora'/><category scheme='http://www.blogger.com/atom/ns#' term='politico'/><category scheme='http://www.blogger.com/atom/ns#' term='apartidarismo'/><title type='text'>Apartidarismo</title><content type='html'>Brasil um país democrático! Bonita frase, não?!&lt;br /&gt;&lt;br /&gt;Nesse último pleito tive chance de observar, com mais atenção, os vários &lt;span style="font-weight:bold;"&gt;arquétipos de eleitores&lt;/span&gt;. Infelizmente percebi que ainda existem pessoas que não usam a razão pra votar.&lt;br /&gt;&lt;br /&gt;É simples. Existem pessoas que &lt;span style="font-weight:bold;"&gt;votam&lt;/span&gt; em determinado candidato &lt;span style="font-weight:bold;"&gt;em detrimento do seu partido&lt;/span&gt;, alguns mais excitados chegam à loucura de afirmar: "Sou XYZ em qualquer pleito". Na frase anterior troque XYZ por DEM ou PP ou PSDB ou PMDB ou PMN ou PSOL ou PT ou PTB ou qualquer outro partido que você conheça. &lt;br /&gt;&lt;br /&gt;Por favor, eleitor seja “apartidário”... Isso não é um jogo de futebol no qual você torce por um time, pense que além da sigla existe um ser, então numa mesma bandeira há candidatos bons e ruins. Se você achar que todas as opções atuais não atendem a seus critérios, vote em branco.&lt;br /&gt;&lt;br /&gt;Crítico mesmo é ser candidato, eles devem apoiar quem seu partido apóia... (mesmo que no fundo achem um outro mais adequado) mas você não é candidato: Não apóie siglas, não vote por elas!&lt;br /&gt;&lt;br /&gt;Nessa transa partidária deixo um último (incisivo e repetitivo) recado: Um partido não é um time de futebol. &lt;br /&gt;&lt;br /&gt;Não vote:&lt;br /&gt;Somente por que o candidato XisIpslon está ganhando nas pesquisas.&lt;br /&gt;Por que o XisIpslon é do partido XY.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;Frase que odeio ouvir:&lt;br /&gt;"nunca mais voto no PT" (substitua PT por qualquer outro partido)&lt;br /&gt;"em todas as eleições sou PMDB até a morte" (substitua PMDB por qualquer outro partido)&lt;/span&gt;&lt;br /&gt;(ATENÇÃO apartidarismo não é antipartidarismo)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3760273245894556929-5824137062292033366?l=archsofty.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://archsofty.blogspot.com/feeds/5824137062292033366/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3760273245894556929&amp;postID=5824137062292033366' title='3 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3760273245894556929/posts/default/5824137062292033366'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3760273245894556929/posts/default/5824137062292033366'/><link rel='alternate' type='text/html' href='http://archsofty.blogspot.com/2008/10/apartidarismo.html' title='Apartidarismo'/><author><name>Leandro</name><uri>http://www.blogger.com/profile/09724892719833243149</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3760273245894556929.post-8256399845602587133</id><published>2008-10-03T20:52:00.000-07:00</published><updated>2008-10-03T20:59:13.270-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='dsl externa'/><category scheme='http://www.blogger.com/atom/ns#' term='internal dsl'/><category scheme='http://www.blogger.com/atom/ns#' term='external dsl'/><category scheme='http://www.blogger.com/atom/ns#' term='interface fluente'/><category scheme='http://www.blogger.com/atom/ns#' term='dsl interna'/><category scheme='http://www.blogger.com/atom/ns#' term='fluent interface'/><category scheme='http://www.blogger.com/atom/ns#' term='dsl'/><category scheme='http://www.blogger.com/atom/ns#' term='expressividade'/><title type='text'>Dsl interna e externa: perguntas e respostas por Martin Fowler</title><content type='html'>&lt;blockquote&gt;Segue abaixo a traduadaptação [datada em 01/10/2008] (meio capenga) do artigo de Martin Fowler &lt;a href="http://www.martinfowler.com/bliki/DslQandA.html"&gt;aqui você vê o original.&lt;/a&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Fui convidado a criar uma discussão de DSL para não-técnicos. Talvez eu tenha lido muito Stephen O'Grady, mas senti um desejo irresistível de fazê-lo do jeito Q e A (Perguntas e Respostas). Então vamos lá.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;O que é uma Domain Specific Language? (ou linguagem de domínio especifico, ou ainda DSL)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Uma Domain Specific Language (DSL) é uma linguagem de programação de expressividade limitada, focada num domínio particular. A maioria das linguagens que você conhece são linguagens de propósito geral (General Purpose Languages), que podem lhe dar com a maioria das coisas que você encontra durante um projeto de sistema. Cada DSL pode agir somente em um aspecto especifico do sistema.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Então você não poderia escrever todo projeto em uma DSL?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Não. A maioria dos projetos irão usar uma linguagem de propósito geral e muitas DSL's.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Essa idéia é nova?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Não totalmente. DSL's tem sido usadas extensamente nos círculos de usuários do Unix desde os primórdios desse sistema. A comunidade Lisp discute a criação de DSL's em Lisp e então usa a DSL para implementar a lógica. A maioria dos projetos de TI usam muitas DSL's – você já deve ter ouvido de coisas como CSS, SQL, expressão regular e etc.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Então porque este assunto está fazendo tanto barulho só agora?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Provavelmente é por causa do Ruby and Rails. Ruby é uma linguagem com muitas características que tornam fácil o desenvolvimento de DSL's e as pessoas que estão envolvidas na comunidade Ruby têm se sentido mais a vontades com essa abordagem, então eles levam vantagem dessas características. Em particular o Rails usa muitas DSL's que o deixam mais fácil de usar. Isto, por sua vez, tem incentivado mais pessoas a seguir essas idéias.&lt;br /&gt;&lt;br /&gt;Outra razão é que muitos sistemas feitos em Java ou C# precisam ter muito de seu comportamento definido de forma mais dinâmica. Isto conduziu a arquivos XML complexos que são difíceis de compreender que, por sua vez, levou as pessoas a explorar DSL's novamente.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Então DSL's podem ser usadas com outras linguagens além do Ruby?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Sim, como eu já disse, as DSL's já estavam por ai há muito tempo, mais do que o Ruby. Ruby tem uma sintaxe não obstrutiva e também características de meta-programação que a torna mais fácil para criar elegantes DSL's internas, mais do que outras linguagens como C# e Java. Mas existe DSL's internas uteis feitas em Java e C#&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Qual a diferença entre DSL interna e DSL externa?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Uma DSL interna é apenas um idioma particular de escrever código na linguagem hospedeira. Então uma DSL interna feita em Ruby é um código Ruby, escrito num estilo particular que deixa a linguagem mais próxima da linguagem hospede. Tais como elas podem ser chamadas de Interface Fluente ou DSL embutida. Uma DSL externa é uma linguagem completamente separada que é "traduzida" para que a linguagem hospedeira possa entender.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Por que as pessoas estão interessadas nas DSL's?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Eu vejo que as DSL's possuem dois principais benefícios. O benefício mais comum é fazer que certos tipos de códigos fiquem mais fáceis de compreender, que se tornem mais fáceis de modificar, assim melhorando a produtividade do programador. Isto é válido para todos interessados e relativamente fácil de atingir. O benefício mais interessante, todavia, é que uma DSL bem projetada pode ser entendível por pessoas do negocio, permitindo-lhes compreender diretamente o código que implementa suas regras de negócios.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Então este é o gancho – pessoas do negócio escrevendo suas próprias regras?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Em geral eu não penso assim. É muito trabalhoso criar um ambiente que permita as pessoas do negocio escrever suas próprias regras. Você tem que fazer boas ferramentas de edição, depuração, testes e etc. Você tem a maioria dos benefícios das DSL's apenas permitindo que pessoas do negocio sejam capazes de ler as regras. Então eles podem revê-las para aperfeiçoa-las, falar sobre elas com os desenvolvedores e propor mudanças corretas da implementação. Ter DSL's legíveis ao contexto negócios é de longe menos esforço do que ter DSL's escrevíveis pelas pessoas do negócios, mas os ganhos ainda são bons. Existem momentos onde vale a pena o esforço para fazer DSL's escrevíveis por pessoas do negocio, mas esse é um objetivo mais avançado.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Você precisa de ferramentas especiais (leia-se caras)?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Normalmente, não. DSL's internas são apenas facilidades da linguagem de programação que você está usando. DSL's externas requerem que você use algumas ferramentas especiais – mas essas são open source e muito maduras. O maior problema com essas ferramentas é que a maioria dos desenvolvedores não estão acostumados com elas e acreditam que elas são complicadas de usar mais do que elas realmente são (um problema exacerbado pela pobre documentação).&lt;br /&gt;&lt;br /&gt;Todavia há exceções no horizonte. Existe uma classe de ferramentas que eu chamo LanguageWorkbench. Essas ferramentas permitem você definir DSL's mais facilmente e também provem sofisticados editores para elas. Ferramentas assim tornam mais viáveis a construção de DSL para os negócios.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Então isto é a repetição do sonho do desenvolvimento de software sem programação (ou programadores)?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Esta foi a intenção do COBOL e não penso que há alguma razão para que as DSL's tenham sucesso onde o COBOL (e tantas outras falharam). Eu penso que é importante que DSL's permitam pessoas do negocio e desenvolvedores colaborarem mais eficientemente porque eles podem falar sobre um conjunto de regras que também são códigos executáveis.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Quando eu deveria considerar a hipótese de criar uma DSL?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Quando você está trabalhando num aspecto do sistema com ricas regras de negócios ou work-flows. Uma DSL bem escrita deveria permitir que os clientes entendessem as regras pelas quais o sistema funciona.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Isto não vai levar a uma cacofonia de linguagens que as pessoas acharam mais difíceis de aprender?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Nós já temos uma cacofonia de frameworks que os programadores tem que aprender. Isto é uma inevitável conseqüência de sistemas reusáveis, é o único jeito que temos de lhe dar com todas essas coisas que os sistemas tem que fazer hoje em dia. Na essência uma DSL não é nada mais do que uma fachada chique sobre um framework. Como resultado elas contribuem um pouquinho com a complexidade que já havia. Na verdade uma boa DSL deveria fazer as coisas melhores tornando esses frameworks mais fáceis de usar.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Mas as pessoas não vão criar muitas DSL's de baixa qualidade?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Claro, assim como pessoas criam frameworks de baixa qualidade. Mas, novamente, eu gostaria de argumentar que DSL's de baixa qualidade não causam mais danos se comparados aos que os frameworks mal projetados causam&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3760273245894556929-8256399845602587133?l=archsofty.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://archsofty.blogspot.com/feeds/8256399845602587133/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3760273245894556929&amp;postID=8256399845602587133' title='1 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3760273245894556929/posts/default/8256399845602587133'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3760273245894556929/posts/default/8256399845602587133'/><link rel='alternate' type='text/html' href='http://archsofty.blogspot.com/2008/10/dsl-interna-e-externa-perguntas-e.html' title='Dsl interna e externa: perguntas e respostas por Martin Fowler'/><author><name>Leandro</name><uri>http://www.blogger.com/profile/09724892719833243149</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3760273245894556929.post-3662769185987275091</id><published>2008-09-30T10:34:00.001-07:00</published><updated>2008-10-03T21:08:37.336-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='projeto de software'/><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='projeto oo'/><category scheme='http://www.blogger.com/atom/ns#' term='padrões'/><category scheme='http://www.blogger.com/atom/ns#' term='agilidade'/><category scheme='http://www.blogger.com/atom/ns#' term='modelagem'/><title type='text'>Bons modos pra desenvolvedores</title><content type='html'>&lt;div dir="ltr"&gt;&lt;div&gt;ótimo texto que &amp;quot;enumera&amp;quot; várias ideias ótimas, LEITURA OBRIGATÓRIA!&lt;/div&gt; &lt;div&gt;&lt;a href="http://www.infoq.com/articles/API-Design-Joshua-Bloch"&gt;http://www.infoq.com/articles/API-Design-Joshua-Bloch&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3760273245894556929-3662769185987275091?l=archsofty.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://archsofty.blogspot.com/feeds/3662769185987275091/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3760273245894556929&amp;postID=3662769185987275091' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3760273245894556929/posts/default/3662769185987275091'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3760273245894556929/posts/default/3662769185987275091'/><link rel='alternate' type='text/html' href='http://archsofty.blogspot.com/2008/09/bons-modos-pra-desenvolvedores.html' title='Bons modos pra desenvolvedores'/><author><name>Leandro</name><uri>http://www.blogger.com/profile/09724892719833243149</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3760273245894556929.post-7492425486050954440</id><published>2008-09-25T07:20:00.001-07:00</published><updated>2008-10-10T17:34:58.128-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='dsl externa'/><category scheme='http://www.blogger.com/atom/ns#' term='internal dsl'/><category scheme='http://www.blogger.com/atom/ns#' term='domain-specific language'/><category scheme='http://www.blogger.com/atom/ns#' term='link'/><category scheme='http://www.blogger.com/atom/ns#' term='interface fluente'/><category scheme='http://www.blogger.com/atom/ns#' term='dsl interna'/><category scheme='http://www.blogger.com/atom/ns#' term='dsl'/><title type='text'>DSL o que é? qual a diferença entre dsl interna e dsl externa? quando deveria criar uma dsl? ... etc.</title><content type='html'>&lt;div dir="ltr"&gt;Para maiores esclarecimentos sobre o assunto DSL, de acordo com a opinião do Martin Fowler.&lt;br&gt;&lt;a href="http://www.martinfowler.com/bliki/DslQandA.html"&gt;http://www.martinfowler.com/bliki/DslQandA.html&lt;/a&gt; e uma versão traduzida aqui &lt;br /&gt;&lt;a href="http://archsofty.blogspot.com/2008/10/dsl-interna-e-externa-perguntas-e.html"&gt;http://archsofty.blogspot.com/2008/10/dsl-interna-e-externa-perguntas-e.html&lt;/a&gt;.&lt;br /&gt;&lt;br&gt;&lt;b&gt;Perguntas como:&amp;nbsp; &lt;/b&gt;&lt;br&gt;O que é uma Domain Specific Language? (ou DSL)&amp;nbsp; &lt;br&gt;Dsl podem ser usadas e criadas por outras linguagens sem ser Ruby?&lt;br&gt;Qual a diferença entre DSL interna e DSL externa?&lt;br&gt;Porque as pessoas estão interessadas no assunto DSL?&lt;br&gt; É necessário alguma ferramenta especial ou cara pra desenvolver DSL?&lt;br&gt;Quando deveria criar uma DSL?&lt;br&gt;&lt;br&gt;São respondidas no link acima.&lt;br&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3760273245894556929-7492425486050954440?l=archsofty.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://archsofty.blogspot.com/feeds/7492425486050954440/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3760273245894556929&amp;postID=7492425486050954440' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3760273245894556929/posts/default/7492425486050954440'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3760273245894556929/posts/default/7492425486050954440'/><link rel='alternate' type='text/html' href='http://archsofty.blogspot.com/2008/09/dsl-o-que-qual-diferena-entre-dsl.html' title='DSL o que é? qual a diferença entre dsl interna e dsl externa? quando deveria criar uma dsl? ... etc.'/><author><name>Leandro</name><uri>http://www.blogger.com/profile/09724892719833243149</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3760273245894556929.post-3193766361599308513</id><published>2008-09-24T07:53:00.001-07:00</published><updated>2008-09-24T18:18:33.254-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='modismos'/><category scheme='http://www.blogger.com/atom/ns#' term='manifesto ágil'/><category scheme='http://www.blogger.com/atom/ns#' term='metodologia agil'/><category scheme='http://www.blogger.com/atom/ns#' term='agilidade'/><title type='text'>Não existe uma resposta definitiva, há caminhos pra solução...</title><content type='html'>&lt;div dir="ltr"&gt;Quando visitamos foruns pela Internet (sobre desenvolvimento) notamos que as pessoas estão mais preocupas em saber o que fazer? qual padrão usar? qual sigla colocar na documentação do projeto? como ser ágil com post-it? e pouquíssimas procurando o pôrque de fazer isso tudo...&lt;br&gt;  O modismo não pará por aí, quando surge uma nova &amp;quot;buzzword&amp;quot; o pessoal já cria n consultorias, treinamentos online... exploram de todas as formas pra tentar faturar uns dollars.&lt;br&gt;Por isso, desde o inicio dos tempos, cautela nunca é pouco. (mas por favor também não seja um Adrian Monk)&lt;br&gt; &lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3760273245894556929-3193766361599308513?l=archsofty.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://archsofty.blogspot.com/feeds/3193766361599308513/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3760273245894556929&amp;postID=3193766361599308513' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3760273245894556929/posts/default/3193766361599308513'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3760273245894556929/posts/default/3193766361599308513'/><link rel='alternate' type='text/html' href='http://archsofty.blogspot.com/2008/09/no-existe-uma-resposta-definitiva-h.html' title='Não existe uma resposta definitiva, há caminhos pra solução...'/><author><name>Leandro</name><uri>http://www.blogger.com/profile/09724892719833243149</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3760273245894556929.post-4928002982140783087</id><published>2008-09-24T05:48:00.001-07:00</published><updated>2008-09-24T18:17:15.876-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='programacao'/><title type='text'>Configurar proxy pelo código no Java</title><content type='html'>&lt;div dir="ltr"&gt;Pra quem já passou algum tempo tentando se conectar a algum sítio na Internet passando a conexão pelo proxy... aqui vai uma diquinha (besta, a proposito) &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Properties systemSettings = System.getProperties();&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; systemSettings.put(&amp;quot;http.proxyHost&amp;quot;, &amp;quot;&lt;a href="http://10.10.10.10"&gt;10.10.10.10&lt;/a&gt;&amp;quot;);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; systemSettings.put(&amp;quot;http.proxyPort&amp;quot;, &amp;quot;8784&amp;quot;);&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Authenticator.setDefault(new Authenticator() {&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; protected PasswordAuthentication getPasswordAuthentication() {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return new PasswordAuthentication(&amp;quot;dominio\\usuario&amp;quot;, &amp;quot;senha&amp;quot;.toCharArray());&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; });&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; URL u = new URL(&amp;quot;&lt;a href="http://www.foo.com.br"&gt;http://www.foo.com.br&lt;/a&gt;&amp;quot;);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; HttpURLConnection con = (HttpURLConnection) u.openConnection();&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; con.connect();&lt;br&gt; Simples assim.&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br&gt; &lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3760273245894556929-4928002982140783087?l=archsofty.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://archsofty.blogspot.com/feeds/4928002982140783087/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3760273245894556929&amp;postID=4928002982140783087' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3760273245894556929/posts/default/4928002982140783087'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3760273245894556929/posts/default/4928002982140783087'/><link rel='alternate' type='text/html' href='http://archsofty.blogspot.com/2008/09/configurar-proxy-pelo-cdigo-no-java.html' title='Configurar proxy pelo código no Java'/><author><name>Leandro</name><uri>http://www.blogger.com/profile/09724892719833243149</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3760273245894556929.post-8747527507424800920</id><published>2008-09-23T18:49:00.000-07:00</published><updated>2008-09-24T18:15:47.877-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='jpcsp'/><category scheme='http://www.blogger.com/atom/ns#' term='emulador'/><category scheme='http://www.blogger.com/atom/ns#' term='jogl'/><category scheme='http://www.blogger.com/atom/ns#' term='emulator'/><category scheme='http://www.blogger.com/atom/ns#' term='programacao'/><category scheme='http://www.blogger.com/atom/ns#' term='opengl'/><category scheme='http://www.blogger.com/atom/ns#' term='integração'/><category scheme='http://www.blogger.com/atom/ns#' term='psp'/><category scheme='http://www.blogger.com/atom/ns#' term='jvm'/><title type='text'>Screenshots e atual status do emulador de psp feito em java o Jpcsp</title><content type='html'>O desenvolvimento já está em estágio onde gráficos 3D são "plotados" na tela. Vários demos e os exemplos do nehe tutorial (sobre OpenGL) já funcionam. &lt;br /&gt;&lt;br /&gt;"As imagens falam melhor"&lt;br /&gt;A versão atual (0.08) conta com um time de desenvolvedores com grande fama no mundo da emulação. (&lt;span style="font-weight:bold;"&gt;claro que excluindo-me&lt;/span&gt;)&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_2W5qHpT9JNQ/SNmdlY7LwiI/AAAAAAAAABY/IBx8ES5psKk/s1600-h/1.JPG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://4.bp.blogspot.com/_2W5qHpT9JNQ/SNmdlY7LwiI/AAAAAAAAABY/IBx8ES5psKk/s400/1.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5249400106348429858" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Com um recompilador (ainda em testes)&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_2W5qHpT9JNQ/SNmdl8vidlI/AAAAAAAAABg/PP7X8v6Ylko/s1600-h/2.JPG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://1.bp.blogspot.com/_2W5qHpT9JNQ/SNmdl8vidlI/AAAAAAAAABg/PP7X8v6Ylko/s400/2.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5249400115963262546" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;A entrada (o controle) já está emulada também.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_2W5qHpT9JNQ/SNmdl514FXI/AAAAAAAAABo/RJVS3MJoV1s/s1600-h/3.JPG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://3.bp.blogspot.com/_2W5qHpT9JNQ/SNmdl514FXI/AAAAAAAAABo/RJVS3MJoV1s/s400/3.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5249400115184538994" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Que ironia, o emulador de NES (8 Bits) rodando no emulador de PSP sobre uma máquina Virtual (JVM), haja indereção...&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_2W5qHpT9JNQ/SNmdmYPL0TI/AAAAAAAAABw/ZmfIc5JABb4/s1600-h/4.JPG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://4.bp.blogspot.com/_2W5qHpT9JNQ/SNmdmYPL0TI/AAAAAAAAABw/ZmfIc5JABb4/s400/4.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5249400123343753522" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;O Famoso Solitaire&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_2W5qHpT9JNQ/SNmdmoN4HAI/AAAAAAAAAB4/x54uLJK7bqk/s1600-h/5.JPG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://2.bp.blogspot.com/_2W5qHpT9JNQ/SNmdmoN4HAI/AAAAAAAAAB4/x54uLJK7bqk/s400/5.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5249400127633234946" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Aqui em um ambiente 3D já está suportando efeito de reflexo&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_2W5qHpT9JNQ/SNmfCnfDQAI/AAAAAAAAACA/Ex-WtkposoA/s1600-h/6.JPG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://1.bp.blogspot.com/_2W5qHpT9JNQ/SNmfCnfDQAI/AAAAAAAAACA/Ex-WtkposoA/s400/6.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5249401707984797698" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Mais do núcleo 3D&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_2W5qHpT9JNQ/SNmfC8uKk9I/AAAAAAAAACI/r5pOYwvt1w0/s1600-h/7.JPG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://1.bp.blogspot.com/_2W5qHpT9JNQ/SNmfC8uKk9I/AAAAAAAAACI/r5pOYwvt1w0/s400/7.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5249401713685337042" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;E pra terminar, para aqueles que amam um bom debugger;&lt;br /&gt;Como diz o Taz: Olha isso!&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_2W5qHpT9JNQ/SNmfDJ8R6eI/AAAAAAAAACQ/tBkYcsWFwbA/s1600-h/8.JPG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://1.bp.blogspot.com/_2W5qHpT9JNQ/SNmfDJ8R6eI/AAAAAAAAACQ/tBkYcsWFwbA/s400/8.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5249401717234199010" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;ps: O número de FPS está baixo pois estou usando uma máquina single core e com uma placa de vídeo ruim. Em máquinas melhores os quadros sobem de 10FPS a 15FPS.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3760273245894556929-8747527507424800920?l=archsofty.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://archsofty.blogspot.com/feeds/8747527507424800920/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3760273245894556929&amp;postID=8747527507424800920' title='4 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3760273245894556929/posts/default/8747527507424800920'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3760273245894556929/posts/default/8747527507424800920'/><link rel='alternate' type='text/html' href='http://archsofty.blogspot.com/2008/09/screenshots-e-atual-status-do-emulador.html' title='Screenshots e atual status do emulador de psp feito em java o Jpcsp'/><author><name>Leandro</name><uri>http://www.blogger.com/profile/09724892719833243149</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_2W5qHpT9JNQ/SNmdlY7LwiI/AAAAAAAAABY/IBx8ES5psKk/s72-c/1.JPG' height='72' width='72'/><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3760273245894556929.post-672548331239795919</id><published>2008-09-14T19:16:00.000-07:00</published><updated>2008-09-14T19:29:43.714-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='happy'/><category scheme='http://www.blogger.com/atom/ns#' term='fun'/><category scheme='http://www.blogger.com/atom/ns#' term='futurama'/><category scheme='http://www.blogger.com/atom/ns#' term='future'/><title type='text'>Futurama inspires me (000001)</title><content type='html'>"Which is the default port to make love?"&lt;br /&gt;"In the future the O.S. will run inside us, and then we don’t deserve Linux or Windows but ChorusOS."&lt;br /&gt;"What excites me isn’t the beautiful but the sensuality... and that's was the reason what I’ve choose the robot Sen5U@l1ty"&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3760273245894556929-672548331239795919?l=archsofty.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://archsofty.blogspot.com/feeds/672548331239795919/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3760273245894556929&amp;postID=672548331239795919' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3760273245894556929/posts/default/672548331239795919'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3760273245894556929/posts/default/672548331239795919'/><link rel='alternate' type='text/html' href='http://archsofty.blogspot.com/2008/09/futurama-inspires-me-000001.html' title='Futurama inspires me (000001)'/><author><name>Leandro</name><uri>http://www.blogger.com/profile/09724892719833243149</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3760273245894556929.post-920817664752726612</id><published>2008-08-30T08:28:00.000-07:00</published><updated>2008-08-31T08:36:03.722-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='hotspot'/><category scheme='http://www.blogger.com/atom/ns#' term='otimizacao'/><category scheme='http://www.blogger.com/atom/ns#' term='javac'/><category scheme='http://www.blogger.com/atom/ns#' term='jvm'/><title type='text'>Inteligência e otimização direto no compilador Java javac</title><content type='html'>Java há muito tempo não é vista como uma plataforma computacional lenta. Parte da "nova rapidez" foi conseguida através da evolução do interpretador e do compilador java.&lt;br /&gt;Os esforços e as características contidas no núcleo do interpretador e do compilador (java.exe e javac.exe), a cada nova versão, na maioria das vezes não é visto pelo desenvolvedor.&lt;br /&gt;&lt;br /&gt;Vou apresentar um exemplo interessante (ao menos eu achei :D ):&lt;br /&gt;A seguinte classe implementa a idéia da execução de um código de máquina...&lt;br /&gt;&lt;blockquote&gt;public class Cpu6502{&lt;br /&gt;private final static boolean isDebug = true;&lt;br /&gt;&lt;br /&gt;public void execute(){&lt;br /&gt;while(true){&lt;br /&gt;int opcode = memoria[PC++];&lt;br /&gt;switch (opcode){&lt;br /&gt;case NOP:&lt;br /&gt;log("nop executado");&lt;br /&gt;break;&lt;br /&gt;case ANDI:&lt;br /&gt;log("and immediate executado");&lt;br /&gt;...&lt;br /&gt;case default:&lt;br /&gt;log("opcode não suportado " + opcode);&lt;br /&gt;break;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;System.out.println("Fim");&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;private void log(String msg){&lt;br /&gt;   if (isDebug) System.out.println("6502 Debug &gt; " + msg);&lt;br /&gt;}&lt;br /&gt;}&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Até agora nada de novo, é necessário saber quais opcodes ainda não estão implementados ... mas e quando quisermos "tirar o pesso da saída padrão"? Basicamente é só mudar o valor do campo isDebug pra false. Ainda nenhuma novidade!!!&lt;br /&gt;&lt;br /&gt;Realmente não há nenhuma novidade visível, veja o que o compilador javac faz quando compilamos a classe com o campo isDebug = false: (pra decompilar usei o Jode)&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;public class Cpu6502{&lt;br /&gt;private final static boolean isDebug = false;&lt;br /&gt;&lt;br /&gt;public void execute(){&lt;br /&gt;while(true){&lt;br /&gt;int opcode = memoria[PC++];&lt;br /&gt;switch (opcode){&lt;br /&gt;case NOP:&lt;br /&gt;log("nop executado");&lt;br /&gt;break;&lt;br /&gt;case ANDI:&lt;br /&gt;log("and immediate executado");&lt;br /&gt;...&lt;br /&gt;case default:&lt;br /&gt;log("opcode não suportado " + opcode);&lt;br /&gt;break;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;System.out.println("Fim");&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;private void log(String msg){&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;}&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;O compilador viu que esse código nunca seria executado, dado as características do campo isDebug=false(final), então o compilador retira esse bloco... Esperto esse javac não!?&lt;br /&gt;Só pra finalizar, acredito que o java.exe vê que o bloco não faz nada e simplesmente ignora-o. Esses são aqueles tipos de maravilhas invisíveis ao olho do desenvolvedor.&lt;br /&gt;&lt;br /&gt;ps: Isso pra não citar o HotSpot... simplesmente fantástico!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3760273245894556929-920817664752726612?l=archsofty.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://archsofty.blogspot.com/feeds/920817664752726612/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3760273245894556929&amp;postID=920817664752726612' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3760273245894556929/posts/default/920817664752726612'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3760273245894556929/posts/default/920817664752726612'/><link rel='alternate' type='text/html' href='http://archsofty.blogspot.com/2008/08/inteligncia-e-otimizao-direto-no.html' title='Inteligência e otimização direto no compilador Java javac'/><author><name>Leandro</name><uri>http://www.blogger.com/profile/09724892719833243149</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3760273245894556929.post-6194465053928026024</id><published>2008-08-19T18:35:00.000-07:00</published><updated>2008-08-19T18:38:21.398-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='projeto de software'/><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='jpcsp'/><category scheme='http://www.blogger.com/atom/ns#' term='emulador'/><category scheme='http://www.blogger.com/atom/ns#' term='jogl'/><category scheme='http://www.blogger.com/atom/ns#' term='emulator'/><category scheme='http://www.blogger.com/atom/ns#' term='opengl'/><category scheme='http://www.blogger.com/atom/ns#' term='psp'/><category scheme='http://www.blogger.com/atom/ns#' term='playstation portable'/><title type='text'>Jpcsp - um emulador de psp feito em java</title><content type='html'>Depois de muito tempo sem postar nada, volto com uma notícia (in)útil: apos tanto admirar e estudar o mundo da emulação, resolvi participar ativamente de um projeto (opensource claro :) ) desses.&lt;br /&gt;&lt;br /&gt;Nesse projeto estamos tentando emular um psp (uma máquina portatil da sony muito interessante, com hardware bem similar ao Playstation 2) usando Java como linguagem e OpenGl (JOGL) como nosso motor renderizador. A escolha dessas tecnologias visa um emulador multiplataforma e também um desafio.&lt;br /&gt;&lt;br /&gt;O Psp é uma máquina que possui um processaor (RISC) MIPS baseado no R4000 (32-bits), também possui um GPU com 2MB de VRAM: O CPU roda a 222MHz (apesar de ir até 333MHz, por questões de economia de consumo a sony "clocou-o" de 0 a 222Mhz inicialmente, todavia em novas versões do firmware é possível rodar jogos a 333Mhz) e a GPU roda a 166Mhz. Tem 32MB de Ram, algumas versões novas do psp já vem com 64MB, enfim é se trata de um aparelho muito interessante.&lt;br /&gt;&lt;br /&gt;O projeto atualmente está rodando algumas demos e o time de desenvolvedores estão integrando código (commit) praticamente todos os dias, a velocidade de desenvolvimento está ótima. Pra quem deseja conhecer mais sobre o projeto há os links abaixo.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Links.&lt;br /&gt;Site Oficial: http://www.jpcsp.org/&lt;br /&gt;Forum oficial: http://jpcsp.org/forum/&lt;br /&gt;Repositório: http://code.google.com/p/jpcsp/source/list&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3760273245894556929-6194465053928026024?l=archsofty.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://archsofty.blogspot.com/feeds/6194465053928026024/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3760273245894556929&amp;postID=6194465053928026024' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3760273245894556929/posts/default/6194465053928026024'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3760273245894556929/posts/default/6194465053928026024'/><link rel='alternate' type='text/html' href='http://archsofty.blogspot.com/2008/08/jpcsp-um-emulador-de-psp-feito-em-java.html' title='Jpcsp - um emulador de psp feito em java'/><author><name>Leandro</name><uri>http://www.blogger.com/profile/09724892719833243149</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3760273245894556929.post-6822337455477034124</id><published>2008-07-17T04:53:00.000-07:00</published><updated>2008-07-28T09:55:55.152-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='internal dsl'/><category scheme='http://www.blogger.com/atom/ns#' term='dsl interna'/><category scheme='http://www.blogger.com/atom/ns#' term='programacao'/><category scheme='http://www.blogger.com/atom/ns#' term='oo'/><category scheme='http://www.blogger.com/atom/ns#' term='fluent interface'/><category scheme='http://www.blogger.com/atom/ns#' term='arquitetura'/><category scheme='http://www.blogger.com/atom/ns#' term='dsl'/><category scheme='http://www.blogger.com/atom/ns#' term='modelagem'/><category scheme='http://www.blogger.com/atom/ns#' term='expressividade'/><title type='text'>Artigo sobre dsl interna publicado na mundo java</title><content type='html'>Nesta última edição (30) da revista Mundo Java foi publicado um artigo que escrevi sobre dsl interna em java. O mesmo foi publicado na sessão Mundo OO.&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Toda crítica é bem-vinda!&lt;/span&gt; :)&lt;br /&gt;&lt;br /&gt;Pra quem for comprar a capa é &lt;a href="http://www.mundojava.com.br/NovoSite/destaque.shtml"&gt;essa.&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;span style="font-weight:bold;"&gt;Mundo OO:&lt;/span&gt; Implementando uma dsl Interna&lt;br /&gt;&lt;span style="font-style:italic;"&gt;Projetando e codificando uma domain-specific language interna usando a linguagem Java.&lt;/span&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3760273245894556929-6822337455477034124?l=archsofty.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://archsofty.blogspot.com/feeds/6822337455477034124/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3760273245894556929&amp;postID=6822337455477034124' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3760273245894556929/posts/default/6822337455477034124'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3760273245894556929/posts/default/6822337455477034124'/><link rel='alternate' type='text/html' href='http://archsofty.blogspot.com/2008/07/artigo-sobre-dsl-interna-publicado-na.html' title='Artigo sobre dsl interna publicado na mundo java'/><author><name>Leandro</name><uri>http://www.blogger.com/profile/09724892719833243149</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3760273245894556929.post-8865251827505619338</id><published>2008-07-16T05:58:00.000-07:00</published><updated>2008-07-17T05:01:36.027-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='projeto de software'/><category scheme='http://www.blogger.com/atom/ns#' term='wii'/><category scheme='http://www.blogger.com/atom/ns#' term='versionamento'/><category scheme='http://www.blogger.com/atom/ns#' term='emulador'/><category scheme='http://www.blogger.com/atom/ns#' term='gamecube'/><category scheme='http://www.blogger.com/atom/ns#' term='emulator'/><category scheme='http://www.blogger.com/atom/ns#' term='programacao'/><category scheme='http://www.blogger.com/atom/ns#' term='svn'/><title type='text'>o primeiro emulador do console nintendo wii já da alguns passos</title><content type='html'>O primeiro rascunho de emulador dos consoles da 7º geração de video-games já está sendo desenvolvido. Melhor notícia que essa talvez seja que, tanto a 6º quanto 7º geração da Nintendo estarão em um único emulador, ou seja, dentro de alguns anos você poderá jogar jogos do Game Cube e Wii no mesmo emulador.&lt;br /&gt;&lt;br /&gt;Tanto Game Cube quanto o Wii tem arquitetura PowerPC (IBM), além de outras similaridades &lt;span style="font-style:italic;"&gt;(como GPU da ATI...)&lt;/span&gt;, o que contribuiu para que a equipe que já desenvolvia o emulador do Game Cube começasse um projeto para o Wii.&lt;br /&gt;&lt;br /&gt;Pra rodar, satisfatoriamente, esse emulador é necessário ter uma máquina de gamer. O emulador oferece dois modos pra emulação do processador, interpretação dos opcodes (lenta) ou recompilação dinâmica (bem mais rápida), a DynaRec requer processadores com aquele conjunto de instruções SSE2 &lt;span style="font-style:italic;"&gt;(note que no repositório já se fala do uso até mesmo do récem SSE4 [ Core2Duo e8400 possui, não conheço nenhum AMD que tenha :(  ])&lt;/span&gt;, claro que uma GPU ("placa de vídeo") de ótima performance também é necessária. Se tentar rodar o emulador em uma máquina média terá algumas decepções.&lt;br /&gt;&lt;br /&gt;A pergunta que fica provavelmente é como emular ou adaptar o Wii Remote ( e seus Acelerómetros) para PC?! &lt;br /&gt;Bem acredito que isso será contornado, problema maior será o próprio console mas é muito cedo pra qualquer afirmação, apenas dúvidas nesse momento são certas.&lt;br /&gt;&lt;br /&gt;Veja algumas screens &lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Game Cube - Super Mario Sunshine&lt;/span&gt;(17-36 FPS)&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://pegaimagenes.com/out.php/i15459_mario2.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px;" src="http://pegaimagenes.com/out.php/i15459_mario2.jpg" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Game Cube - Zelda Wind Waker&lt;/span&gt; &lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://pegaimagenes.com/out.php/i15471_1.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px;" src="http://pegaimagenes.com/out.php/i15471_1.jpg" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Wii - Sega Superstars Tennis&lt;/span&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://falcon4ever.pcsx2.net/dolphin/wii_sega_superstar_tennis/DolphinWx%202008-07-13%2022-23-52-71.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px;" src="http://falcon4ever.pcsx2.net/dolphin/wii_sega_superstar_tennis/DolphinWx%202008-07-13%2022-23-52-71.jpg" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Links:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;Repositório&lt;/span&gt;&lt;br /&gt;&lt;a href="http://code.google.com/p/dolphin-emu/"&gt;svn&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;Mais Screenshots (inclusive de algums jogos do wii)&lt;/span&gt;&lt;br /&gt;&lt;a href="http://forums.ngemu.com/dolphin-discussion/107877-dolphin-svn-shots.html"&gt;Aqui&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;Feedback, dê suas sugestões técnicas&lt;/span&gt;&lt;br /&gt;&lt;a href="http://code.google.com/p/dolphin-emu/issues/list"&gt;Issue List&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;ATENÇÃO: você só pode jogar legalmente uma rom (iso ou dump do seu jogo) se possuir a original.&lt;/span&gt; &lt;br /&gt;&lt;span style="font-weight:bold;"&gt;ATENÇÃO: o emulador está em desenvolvimento, mostrará melhores taxas de FPS e correções de bug com passar do tempo, não é tão estavel quando um do super nintendo.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;ATENÇÃO: quase todas as marcas, produtos e idéias são de propriedade da &lt;a href="http://www.Nintendo.com"&gt;Nintendo.&lt;/a&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3760273245894556929-8865251827505619338?l=archsofty.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://archsofty.blogspot.com/feeds/8865251827505619338/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3760273245894556929&amp;postID=8865251827505619338' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3760273245894556929/posts/default/8865251827505619338'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3760273245894556929/posts/default/8865251827505619338'/><link rel='alternate' type='text/html' href='http://archsofty.blogspot.com/2008/07/o-primeiro-emulador-do-console-nintendo.html' title='o primeiro emulador do console nintendo wii já da alguns passos'/><author><name>Leandro</name><uri>http://www.blogger.com/profile/09724892719833243149</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3760273245894556929.post-3153988042241545328</id><published>2008-07-15T05:40:00.000-07:00</published><updated>2008-07-15T06:41:37.907-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='modismos'/><title type='text'>Siglas 3 letras - MDA MDD DDD DSL TDD xxx ??? yyy</title><content type='html'>&lt;span style="font-weight:bold;"&gt;Maior vocabulário ou vocabulário mais pobre?!&lt;/span&gt;&lt;br /&gt;Tente "advinhar" quantas siglas você conhece (só no que tange o desenvolvimento de software) com três letras... chute um número! Tenho certeza que errou.&lt;br /&gt;Siglas são mais fáceis de serem usadas pra criar um vocabulário, claro que o excesso delas também pode gerar um vocabulário pobre.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Conhecemos bem mais siglas do que imaginamos...&lt;/span&gt;&lt;br /&gt;Pense bem qual a quantidade (&lt;span style="font-weight:bold;"&gt;real&lt;/span&gt;) de siglas com três letras você conhece: &lt;span style="font-style:italic;"&gt;jcp, jsp, asp, php, orm, jpa, jsf, dsl, cvs, svn, ejb, sql, ddd, soa, aop, tdd, .net, uml, oop, cpu...&lt;/span&gt; enfim, isso sim é um vocabulário próprio, que pode ajudar a comunicação ou criar modismos ou vender consultorias e por ai vai..&lt;br /&gt;ps: isso sem contar todas as extensões de arquivos que acostumamos a usar no dia-a-dia (doc, txt, exe...)&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Take care&lt;/span&gt;&lt;br /&gt;O cuidado fica para o uso correto das siglas. Por favor, tente usar só siglas que  realmente você conhece. Evitar modismos é necessário, ser até mesmo chato com uma nova sigla (ou tecnolgia, framework, metodologia, processo...) que surge, não aceitando-a facilmente. &lt;br /&gt;Uma das maiores bagunças, atuais, pra mim é a correta definição e uso do desenvolvimento guiado &lt;span style="font-style:italic;"&gt;(orientado|voltado)&lt;/span&gt; aos modelos. Tem gente que acha que isso e ferramenta case é tudo igual outros dizem que a idéia original (e problemas) persistem... &lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Boas referências! (boas nada, ótimas mesmo)&lt;/span&gt;&lt;br /&gt;Um ótimo artigo pra ler...uma visão "crítica" sobre os atuais modismos e usos [in]adequados para desenvolvimento orientado por modelos &lt;a href="http://martinfowler.com/bliki/ModelDrivenSoftwareDevelopment.html"&gt;Model Driven Software Developement&lt;/a&gt;&lt;br /&gt;Outro artigo crítico e bom é o artigo &lt;a href="http://blog.fragmental.com.br/2007/06/07/3-letrinhas/"&gt;Empresa Três Letrinhas&lt;/a&gt; do &lt;a href="http://www.fragmental.com.br"&gt;Phillip Calçado (P. Shoes)&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3760273245894556929-3153988042241545328?l=archsofty.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://archsofty.blogspot.com/feeds/3153988042241545328/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3760273245894556929&amp;postID=3153988042241545328' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3760273245894556929/posts/default/3153988042241545328'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3760273245894556929/posts/default/3153988042241545328'/><link rel='alternate' type='text/html' href='http://archsofty.blogspot.com/2008/07/siglas-3-letras-mda-mdd-ddd-dsl-tdd-xxx.html' title='Siglas 3 letras - MDA MDD DDD DSL TDD xxx ??? yyy'/><author><name>Leandro</name><uri>http://www.blogger.com/profile/09724892719833243149</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3760273245894556929.post-7786260195227434029</id><published>2008-06-24T05:02:00.000-07:00</published><updated>2008-06-24T05:06:02.072-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='versionamento'/><category scheme='http://www.blogger.com/atom/ns#' term='subversion'/><category scheme='http://www.blogger.com/atom/ns#' term='svn'/><title type='text'>Subversion 1.5 já liberado  ( svn 1.5 )</title><content type='html'>Tanto clientes como servidores deverão ser atualizados, porém pode-se atualizar o servidor ... depois o cliente.... &lt;br /&gt;Funciona com repositorios antigos, alias você DEVE executar o upgrade command, para que os repositórios antigos entrem no novo formato.&lt;br /&gt;Para quem deseja conhecer as "melhorias" veja...&lt;br /&gt;&lt;a href="http://subversion.tigris.org/svn_1.5_releasenotes.html"&gt;Notas do lançamento.&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3760273245894556929-7786260195227434029?l=archsofty.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://archsofty.blogspot.com/feeds/7786260195227434029/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3760273245894556929&amp;postID=7786260195227434029' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3760273245894556929/posts/default/7786260195227434029'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3760273245894556929/posts/default/7786260195227434029'/><link rel='alternate' type='text/html' href='http://archsofty.blogspot.com/2008/06/subversion-15-j-liberado-svn-15.html' title='Subversion 1.5 já liberado  ( svn 1.5 )'/><author><name>Leandro</name><uri>http://www.blogger.com/profile/09724892719833243149</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3760273245894556929.post-4348808317507162715</id><published>2008-05-29T05:57:00.000-07:00</published><updated>2008-05-29T06:10:41.101-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='projeto de software'/><category scheme='http://www.blogger.com/atom/ns#' term='modismos'/><category scheme='http://www.blogger.com/atom/ns#' term='diagramas'/><category scheme='http://www.blogger.com/atom/ns#' term='domain-specific language'/><category scheme='http://www.blogger.com/atom/ns#' term='projeto oo'/><category scheme='http://www.blogger.com/atom/ns#' term='metodologia agil'/><category scheme='http://www.blogger.com/atom/ns#' term='padrões'/><category scheme='http://www.blogger.com/atom/ns#' term='arquitetura'/><category scheme='http://www.blogger.com/atom/ns#' term='mashup'/><category scheme='http://www.blogger.com/atom/ns#' term='domain-driven design'/><category scheme='http://www.blogger.com/atom/ns#' term='modelagem'/><title type='text'>As atribuições de um arquiteto de software</title><content type='html'>Na última edição da revista &lt;a href="http://msdn.microsoft.com/en-us/arcjournal/default.aspx"&gt;The Architecture Journal&lt;/a&gt; ,de número 15, foi tratado quais são as atribuições de um arquiteto de software, o pôrque de um arquiteto, quais habilidades são requiridas e etc. A edição ainda traz, como de costume, o perfil de um arquiteto para ser analisado.&lt;br /&gt;Gostei da edição porque simplesmente há vários pontos de vista sobre "essa" profissão, há esclarecimentos sobre o que faz, qual a necessidade de conhecimento técnico. Enfim são várias opiniões sobre o mesmo assunto com diferentes pontos de vista.&lt;br /&gt;&lt;br /&gt;Resumo.&lt;br /&gt;&lt;br /&gt;    * Foreword&lt;br /&gt;    * We Don’t Need No Architects&lt;br /&gt;    * Becoming an Architect in a System Integrator&lt;br /&gt;    * Architecture Journal Profile: Paul Preiss&lt;br /&gt;    * The Open Group’s Architect Certification Programs&lt;br /&gt;    * The Need for an Architectural Body of Knowledge&lt;br /&gt;    * A Study of Architect Roles by IASA Sweden&lt;br /&gt;    * The Softer Side of the Architect&lt;br /&gt;    * An A-Z Guide to Being an Architect &lt;br /&gt;&lt;br /&gt;Para essa edição (15 - The Role of an Architect)&lt;br /&gt;Acesse o site &lt;a href="http://msdn.microsoft.com/en-us/arcjournal/cc505966.aspx"&gt;aqui&lt;/a&gt;. &lt;span style="font-style:italic;"&gt;(já adianto que não é sobre como usar tecnologias (nem .net nem java))&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3760273245894556929-4348808317507162715?l=archsofty.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://archsofty.blogspot.com/feeds/4348808317507162715/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3760273245894556929&amp;postID=4348808317507162715' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3760273245894556929/posts/default/4348808317507162715'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3760273245894556929/posts/default/4348808317507162715'/><link rel='alternate' type='text/html' href='http://archsofty.blogspot.com/2008/05/as-atribuies-de-um-arquiteto-de.html' title='As atribuições de um arquiteto de software'/><author><name>Leandro</name><uri>http://www.blogger.com/profile/09724892719833243149</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3760273245894556929.post-4715550371301469750</id><published>2008-05-21T07:08:00.000-07:00</published><updated>2008-05-21T07:22:48.252-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='projeto oo'/><category scheme='http://www.blogger.com/atom/ns#' term='link'/><category scheme='http://www.blogger.com/atom/ns#' term='programacao'/><category scheme='http://www.blogger.com/atom/ns#' term='oo'/><category scheme='http://www.blogger.com/atom/ns#' term='expressividade'/><title type='text'>Mais do mesmo</title><content type='html'>Depois de ler + um ótimo &lt;a href="http://blog.fragmental.com.br/2008/05/18/objetos-nao-sao-atributos-funcoes/"&gt;post  .&lt;/a&gt;&lt;br /&gt;Darei mais alguns exemplos que já vivenciei:&lt;br /&gt;lógica para somar pontos a clientes...&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;cliente.setPontos(cliente.getPontos()+1);&lt;/span&gt;&lt;br /&gt;(&lt;span style="font-style:italic;"&gt;e isso se espalhava por todo código...&lt;/span&gt;)&lt;br /&gt;Se alguma data do ano (especial, comemorativa, aniversário da loja...) quisesem oferecer uma promoção de a cada compra o cliente aumentaria os pontos em 10 seria MUITO  chato... &lt;br /&gt;&lt;br /&gt;Mais simples&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;cliente.adicionarPontos();&lt;/span&gt;&lt;br /&gt;Se houvesse alguma mudança bastaria fazê-la no método.&lt;br /&gt;&lt;br /&gt;Ou ainda quantas vezes vi algo semelhante... &lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;if (funcionario.getSalario() &gt; 1000.0d){&lt;br /&gt; funcionario.setAjuste(0.03d);&lt;br /&gt;//além do fato do pessímo uso dos double, float para $&lt;br /&gt;}&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Um comportamento que deveria ser interno ao "objeto" funcionário sendo tratado em outro local, talvez melhor seria algo como... (o próprio método do funcionário conter essa "lógica")&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;public double getAjust(){&lt;br /&gt;  if (getSalario()&gt;1000.d){&lt;br /&gt;     setAjuste(0.03d);&lt;br /&gt;  }&lt;br /&gt;}&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;ps: acredito que tudo visa um final menos complexo.(final = manutenção) Centralizar os comportamentos nos objetos...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3760273245894556929-4715550371301469750?l=archsofty.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://archsofty.blogspot.com/feeds/4715550371301469750/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3760273245894556929&amp;postID=4715550371301469750' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3760273245894556929/posts/default/4715550371301469750'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3760273245894556929/posts/default/4715550371301469750'/><link rel='alternate' type='text/html' href='http://archsofty.blogspot.com/2008/05/mais-do-mesmo.html' title='Mais do mesmo'/><author><name>Leandro</name><uri>http://www.blogger.com/profile/09724892719833243149</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3760273245894556929.post-6467952144588539728</id><published>2008-04-30T06:27:00.000-07:00</published><updated>2008-04-30T06:51:08.646-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='jpa'/><category scheme='http://www.blogger.com/atom/ns#' term='ambiente produção'/><title type='text'>JPA em ambiente de produção (I)</title><content type='html'>Algo interessante a se notar é que algumas configurações podem ajudar a reduzir o impacto do uso de um framework  ORM/persistência... &lt;br /&gt;Por exemplo, "algumas" implementações do JPA oferecem a possibilidade de que o próprio framework crie, atualize e delete o esquema de tabelas, todavia esse tipo de recurso pode ser não desejável em ambientes de produção.&lt;br /&gt;&lt;br /&gt;Veja o exemplo da &lt;span style="font-weight:bold;"&gt;implementação hibernate&lt;/span&gt;:&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;propriedade&lt;/span&gt; hibernate.hbm2ddl.auto&lt;br /&gt;"Automatically validate or export schema DDL to the database &lt;span style="font-weight:bold;"&gt;when the SessionFactory is created&lt;/span&gt;. With create-drop, the database schema will be dropped when the SessionFactory is closed explicitly."&lt;br /&gt;&lt;br /&gt;Ou seja, toda primeira vez que criarmos uma "session factory" [no caso EntityManagerFactory do JPA] o framwork vai tentar criar, validar ou etc. mesmo que o banco com as tabelas já existam. Pra quem dúvida basta observar o console, irá notar que o jpa tentar criar com ddl todo o esquema.&lt;br /&gt;&lt;br /&gt;Outro caso é a &lt;span style="font-weight:bold;"&gt;implementação toplink&lt;/span&gt;:&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;propriedade&lt;/span&gt; toplink.ddl-generation ...&lt;br /&gt;&lt;br /&gt;Enfim é interessante &lt;span style="font-weight:bold;"&gt;desligar&lt;/span&gt; essas opções em produção, aproveitar para deixar livre para outras coisas como logger...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3760273245894556929-6467952144588539728?l=archsofty.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://archsofty.blogspot.com/feeds/6467952144588539728/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3760273245894556929&amp;postID=6467952144588539728' title='2 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3760273245894556929/posts/default/6467952144588539728'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3760273245894556929/posts/default/6467952144588539728'/><link rel='alternate' type='text/html' href='http://archsofty.blogspot.com/2008/04/jpa-em-ambiente-de-produo-i.html' title='JPA em ambiente de produção (I)'/><author><name>Leandro</name><uri>http://www.blogger.com/profile/09724892719833243149</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3760273245894556929.post-5849890752506382831</id><published>2008-04-29T05:54:00.000-07:00</published><updated>2008-04-29T06:53:23.913-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='testes unitarios'/><category scheme='http://www.blogger.com/atom/ns#' term='test-driven development'/><category scheme='http://www.blogger.com/atom/ns#' term='tdd'/><category scheme='http://www.blogger.com/atom/ns#' term='unit test'/><category scheme='http://www.blogger.com/atom/ns#' term='testes'/><title type='text'>Testes unitários são criados para serem usados</title><content type='html'>É incrível ver pessoas escrevendo testes unitários apenas pra dizer que testam, não os usam realmente.&lt;br /&gt;Um dos reais benefícios dos testes está em como um bom conjunto de testes pode ajudar em manutenções futuras do software, é necessário guardar esse conjunto de testes.A cada manutenção no software você pode rodar &lt;span style="font-weight:bold;"&gt;TODOS&lt;/span&gt; os testes (não só os novos que você fez... pra essa nova característica) e notar se houve alguma mudança em outras partes do código, não pense que sempre uma pequena mudança não irá afetar outras.&lt;br /&gt;Alias não pense ou ache, &lt;span style="font-weight:bold;"&gt;teste!&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Testes podem ajudar mais do que parece.&lt;br /&gt;&lt;span style="font-style:italic;"&gt;Faça, use, guarde e reuse seus testes.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3760273245894556929-5849890752506382831?l=archsofty.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://archsofty.blogspot.com/feeds/5849890752506382831/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3760273245894556929&amp;postID=5849890752506382831' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3760273245894556929/posts/default/5849890752506382831'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3760273245894556929/posts/default/5849890752506382831'/><link rel='alternate' type='text/html' href='http://archsofty.blogspot.com/2008/04/testes-unitrios-so-criados-para-serem.html' title='Testes unitários são criados para serem usados'/><author><name>Leandro</name><uri>http://www.blogger.com/profile/09724892719833243149</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3760273245894556929.post-502839331157591157</id><published>2008-04-25T23:08:00.000-07:00</published><updated>2008-04-25T23:32:27.823-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='dsl externa'/><category scheme='http://www.blogger.com/atom/ns#' term='domain-specific language'/><category scheme='http://www.blogger.com/atom/ns#' term='lexical'/><category scheme='http://www.blogger.com/atom/ns#' term='external dsl'/><category scheme='http://www.blogger.com/atom/ns#' term='ubiquitous language'/><category scheme='http://www.blogger.com/atom/ns#' term='ddd'/><category scheme='http://www.blogger.com/atom/ns#' term='grammars'/><category scheme='http://www.blogger.com/atom/ns#' term='dsl'/><category scheme='http://www.blogger.com/atom/ns#' term='domain-driven design'/><title type='text'>dsl externa - como uma especificação pode te ajudar a compreender-las</title><content type='html'>Procurando ajuda sobre uma especificidade do java, encontrei a seguinte referência: &lt;a href="http://java.sun.com/docs/books/jls/third_edition/html/j3TOC.html"&gt;&lt;span style="font-weight:bold;"&gt;The Java Language Specification, Third Edition&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Neste "livro", sobre a especificação do java, há dois capítulos interessantíssimos para quem está interessado em dsl. Os capítulos são:&lt;br /&gt;&lt;a href="http://java.sun.com/docs/books/jls/third_edition/html/grammars.html"&gt;Grammars&lt;/a&gt;&lt;br /&gt;&lt;a href="http://java.sun.com/docs/books/jls/third_edition/html/lexical.html"&gt;Lexical&lt;/a&gt;&lt;br /&gt;Para se desenvolver uma mini linguagem de um domínio especifico (dsl) é importante conhecer conceitos sobre como criar-la e como as coisas funcionam. (não é necessário nem citar que conhecer o domínio em questão é IMPRESCINDÍVEL ou mesmo criar uma "linguagem" comum entre desenvolvedores e experts do domínio &lt;span style="font-weight:bold;"&gt;[ubiquitous language]&lt;/span&gt;)&lt;br /&gt;Nestes capítulos há bons textos que explicam sobre o desenvolvimento de uma sintaxe, palavras chaves, totens e outros aspectos interessantes. Com toda certeza os capitulos não irão cobrir todo o assunto, falta vários outros aspectos como "compilação"... mas acredito que os mesmos possam ajudar.&lt;br /&gt;&lt;br /&gt;PS: perdão pelo título (nada criativo).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3760273245894556929-502839331157591157?l=archsofty.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://archsofty.blogspot.com/feeds/502839331157591157/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3760273245894556929&amp;postID=502839331157591157' title='1 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3760273245894556929/posts/default/502839331157591157'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3760273245894556929/posts/default/502839331157591157'/><link rel='alternate' type='text/html' href='http://archsofty.blogspot.com/2008/04/dsl-externa-como-uma-especificao-pode.html' title='dsl externa - como uma especificação pode te ajudar a compreender-las'/><author><name>Leandro</name><uri>http://www.blogger.com/profile/09724892719833243149</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3760273245894556929.post-9068820804727919182</id><published>2008-04-01T06:36:00.000-07:00</published><updated>2008-04-01T07:06:04.454-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='projeto de software'/><category scheme='http://www.blogger.com/atom/ns#' term='modismos'/><category scheme='http://www.blogger.com/atom/ns#' term='domain-specific language'/><category scheme='http://www.blogger.com/atom/ns#' term='ddd'/><category scheme='http://www.blogger.com/atom/ns#' term='exemplo'/><category scheme='http://www.blogger.com/atom/ns#' term='dsl'/><category scheme='http://www.blogger.com/atom/ns#' term='domain-driven design'/><category scheme='http://www.blogger.com/atom/ns#' term='modelagem'/><title type='text'>Sistemas são todos iguais... (até onde vai o reuso)</title><content type='html'>Fale-se sempre de domínio (especifico) para cada sistema... Também é bem dito que do domínio se aproveita pouco ou nada, aproveitamos mais de camadas de infraestrutura.&lt;br /&gt;&lt;br /&gt;Mesmo assim "há grupos de pessoas" que insistem em vender um portal (sistema) que serve pra toda situação, ou seja, o portal da Globo.com pode ser também o portal da Gamespot.com, mesmo que portais (ou qualquer "coisa") tenham conceitos similares, um mesmo conceito de notícia para um portal pode ser totalmente diferente de outro, talvez pode até marcar o sucesso de um portal a visão desse "conceito" voltado aquele domínio especifico.&lt;br /&gt;&lt;br /&gt;As empresas que compram esses portais "gerais" sempre recaem em se adaptar para usufruir do bem adquirido. Mais ou menos assim, "o cliente deve moldar seu negócio para que o mesmo caiba no sistema."&lt;br /&gt;&lt;br /&gt;Comprei uma placa de vídeo de uma empresa (xfxforce.com), a placa de vídeo não oferece o controle de velocidade da ventoinha (fazendo um barulho ensurdecedor), logo pensei: "- Entrarei no site e vou mandar um email enfim tentar um contato para saber o que posso fazer."&lt;br /&gt;&lt;br /&gt;Tive uma ótima surpresa, a empresa XFX oferece um sistema de suporte que agiliza e muito o processo de suporte dessa empresa (domínio especifico) funciona mais ou menos assim:&lt;br /&gt;&lt;br /&gt;Todo produto que compra deles tem um número serial.&lt;br /&gt;Logo você se cadastra no site e cadastra seu produto. &lt;br /&gt;(não preciso descrever o que comprei apenas coloco o serial)&lt;br /&gt;Bem depois de registrado o produto posso abrir um ticket para suporte.&lt;br /&gt;Esse tal ticket funciona como um bilhete no qual você escreve sua dúvida/reclamação/sugestão para um técnico da XFX.&lt;br /&gt;Assim o ticket fica em estado de "Com o técnico".&lt;br /&gt;Tão logo o técnico responder ao ticket, o sistema envia um email avisando...&lt;br /&gt;O ticket fica em estado "Com cliente"... e assim vai até resolver o problema.&lt;br /&gt;&lt;br /&gt;Obviamente há mais recursos, mas o ponto aqui é este sistema funciona muito bem para o negocio da XFX (domínio especifico). Talvez se uma outra empresa quisesse criar um sistema para suporte online poderia com certeza aproveitar as idéias do sistema da XFX todavia não teria muito sucesso se usasse o mesmo sistema completamente.&lt;br /&gt;&lt;br /&gt;As vezes o reaproveitamento das idéias juntamente com o entendimento do domínio especifico podem transformar um sistema (mcdonald) em algo com muita qualidade voltado realmente a resolver "aquele problema" não "o problema" de todos [lembra um pouco de arquitetura de referência] , que merece até mesmo citações como essa...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3760273245894556929-9068820804727919182?l=archsofty.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://archsofty.blogspot.com/feeds/9068820804727919182/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3760273245894556929&amp;postID=9068820804727919182' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3760273245894556929/posts/default/9068820804727919182'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3760273245894556929/posts/default/9068820804727919182'/><link rel='alternate' type='text/html' href='http://archsofty.blogspot.com/2008/04/sistemas-so-todos-iguais-at-onde-vai-o.html' title='Sistemas são todos iguais... (até onde vai o reuso)'/><author><name>Leandro</name><uri>http://www.blogger.com/profile/09724892719833243149</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3760273245894556929.post-4869915812438966180</id><published>2008-02-27T04:37:00.000-08:00</published><updated>2008-02-27T09:34:37.164-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='link'/><category scheme='http://www.blogger.com/atom/ns#' term='ddd'/><category scheme='http://www.blogger.com/atom/ns#' term='oo'/><category scheme='http://www.blogger.com/atom/ns#' term='domain-driven design'/><title type='text'>Nomes são importantes</title><content type='html'>Lendo o post do Fabio Kung &lt;a href="http://www.fabiokung.com/2007/11/12/comments-to-gavin-king-about-ddd-and-repositories/"&gt;[aqui]&lt;/a&gt; achei muito interessante a maneira como ele conseguiu mostrar onde os repositórios (do modo DDD de se desenvolver sistemas) se encaixam e porque usá-los.&lt;br /&gt;As vezes explicar o porquê de se usar um repositório se parece com a explicação (a algum iniciado na tecnologia oo) do porquê de tanta indireção nos sistemas "oo".&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3760273245894556929-4869915812438966180?l=archsofty.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://archsofty.blogspot.com/feeds/4869915812438966180/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3760273245894556929&amp;postID=4869915812438966180' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3760273245894556929/posts/default/4869915812438966180'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3760273245894556929/posts/default/4869915812438966180'/><link rel='alternate' type='text/html' href='http://archsofty.blogspot.com/2008/02/nomes-so-importantes.html' title='Nomes são importantes'/><author><name>Leandro</name><uri>http://www.blogger.com/profile/09724892719833243149</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3760273245894556929.post-1115743316990870651</id><published>2008-02-20T06:57:00.000-08:00</published><updated>2008-02-20T07:04:19.274-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='integração'/><category scheme='http://www.blogger.com/atom/ns#' term='mashup'/><title type='text'>O primeiro mashup agente nunca esquece...</title><content type='html'>&lt;blockquote&gt;Um mashup é um website ou uma aplicação web que usa conteúdo de mais de uma fonte para criar um novo serviço completo.&lt;/blockquote&gt;&lt;br /&gt;Definição da wikipédia.&lt;br /&gt;&lt;br /&gt;Há alguns anos estava trabalhando num sistema web um "quase-portal", no projeto foi me pedido para que oferecesse um "atalho" para o email corporativo (na época hospedado numa empresa terceirizada). Foi ali que compus meu primeiro mashup tive que me virar para aproveitar o serviço (já pago) d'outro site no "quase-portal", foi algo simples naquele momento tenho certeza que nem tinha idéia do que havia feito.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3760273245894556929-1115743316990870651?l=archsofty.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://archsofty.blogspot.com/feeds/1115743316990870651/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3760273245894556929&amp;postID=1115743316990870651' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3760273245894556929/posts/default/1115743316990870651'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3760273245894556929/posts/default/1115743316990870651'/><link rel='alternate' type='text/html' href='http://archsofty.blogspot.com/2008/02/o-primeiro-mashup-agente-nunca-esquece.html' title='O primeiro mashup agente nunca esquece...'/><author><name>Leandro</name><uri>http://www.blogger.com/profile/09724892719833243149</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3760273245894556929.post-621230403673734336</id><published>2008-02-19T10:01:00.000-08:00</published><updated>2008-02-20T08:36:07.776-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='projeto de software'/><category scheme='http://www.blogger.com/atom/ns#' term='entrevista'/><category scheme='http://www.blogger.com/atom/ns#' term='emulador'/><category scheme='http://www.blogger.com/atom/ns#' term='metodologia agil'/><category scheme='http://www.blogger.com/atom/ns#' term='interview'/><category scheme='http://www.blogger.com/atom/ns#' term='emulator'/><category scheme='http://www.blogger.com/atom/ns#' term='integração'/><category scheme='http://www.blogger.com/atom/ns#' term='pcsx2'/><title type='text'>Entrevista com Refraction, codificador do projeto PCSX2 - um emulador do Playstation 2.</title><content type='html'>Se há um grande projeto do qual posso afirmar que complexidade é o ponto alto, é o PCSX2, um emulador da famosa máquina Playstation 2.&lt;br /&gt;Esse projeto conta com um time de desenvolvedores que entre outras várias coisas constroem software de maneira ágil.&lt;br /&gt;Fiz a entrevista com Alex (conhecido como Refraction) e tive várias boas surpresas, por exemplo, eles usam visual studio 2005, tratam o projeto como um hobby não um trabalho... enfim melhor ler pra entender.&lt;br /&gt;&lt;br /&gt;Entrevista traduzida:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Leandro:&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;Primeiro qual o seu nome, onde você mora, alias conte-nos um pouco da sua história no desenvolvimento de software? &lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Alex:&lt;/span&gt; Meu nome é Alex, moro em Plymouth, Inglatera, desenvolvimento de software pra mim sempre foi um hobby, comecei com Visual Basic no ano de 2000, logo entre 2002 e 2003 eu fiz meu primeiro emulador (bom e velho *chip8!) usando a linguagem C, cuja tinha mexido um pouquinho pouco tempo antes, eu então passei para a bagunça que é a emulação do GameBoy, isso foi um gancho para trabalhar no time do PCSX2, comecei ajudando bem pouco, então Saqib (formalmente conhecido asadr) perguntou-me se queria juntar-se ao time, ai eu fui pra lá.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Leandro:&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;Como nasceu o time do PCSX2?&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Alex:&lt;/span&gt; PCSX2 foi criado pelos desenvolvedores do PCSX, Linuzappz e Shadow.  Eles tinham terminado com muita acurácia a emulação do PS1 e descobriram o que o próximo passo lógico era dar gás a emulação do PS2, então o PCSX2 nasceu.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Leandro:&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;O time de desenvolvimento é bem integrado?&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Alex:&lt;/span&gt; Não tanto, o que você quis dizer com integrado, perto um do outro? na amizade sim, mas não tão perto perto perto. Embora nos continuemos bem.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Leandro:&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;Que ferramentas vocês utilizam neste projeto? &lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Alex:&lt;/span&gt; Usamos sourceforge SVN e Visual Studio 2005.  Alguns plugins, uso da **SDL, DirectX e OpenGL pra fazer o que for necessário para obter sucesso.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Leandro:&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;O  time de desenvolvedores segue algum padrão que vocês estabeleceram?&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Alex:&lt;/span&gt; Nós não seguimos padrão nenhum, até porque isto é um hobby não um trabalho :)&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Leandro:&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;Há algum desenvolvedor responsável por coordenar as ações/atividades do projeto?&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Alex:&lt;/span&gt; Não ia durar muito coordenando, às vezes dizemos "larga de ser preguiçoso e faça algum código" mas isto quase não é feito :p&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Leandro:&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;Vocês tem metas atribuídas por alguém ou apenas o desejo de construir bom software?&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Alex:&lt;/span&gt; Definitivamente o desejo de construir bom software. Ultimamente o objetivo é ter uma boa emulação do PS2, mas isso é o jeito que as coisas vão.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Leandro:&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;Qual é o melhor e o pior aprendizado que você pode ter no projeto?&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Alex:&lt;/span&gt; Você quer dizer no projeto? Hmm, eu suponho que seria o ***timming do PS2, isto é dor além palavras. &lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Leandro:&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;Você conhece algum dos membros pessoalmente?&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Alex:&lt;/span&gt; Eu conheço dois dos meus testadores beta, CKemu e General Plot, eu conheci ambos.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Leandro:&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;Que tipo de mecanismos vocês usam para se comunicarem?&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Alex:&lt;/span&gt; Normalmente MSN e IRC, embora IRC tende ser menos sério.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Leandro:&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;Qual recado você pode deixar para os usuários ansiosos?&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Alex:&lt;/span&gt; Hmmm, no momento as coisas estão paradas, tudo que posso dizer é que em breve os usuários não precisarão ficar tristes por não possuírem o console, esperançosamente iremos ter uma alternativa grátis pra vocês, mas eu não tenho a data exata deste momento:)&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Leandro:&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;O cara Brasileiro no projeto (GoldenFinger) está ativo?&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Alex:&lt;/span&gt; Não atualmente, ele até falou de uma volta, ele está inativo por anos, acredito que ele está ocupado no momento :)&lt;br /&gt;&lt;br /&gt;Thanks&lt;br /&gt;Refraction&lt;br /&gt;&lt;br /&gt;*chip8 = uma máquina bem simples, que tem como forma de interação um teclado numérico, bem conhecida porque quem começa a desenvolver emuladores.&lt;br /&gt;**SDL = Uma API cross-platform para escrever jogos ou tratar multimídia.&lt;br /&gt;*** Timming = é clock interno (que também deve ser emulado) da máquina PS2.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Impressões:&lt;/span&gt;&lt;br /&gt;Incrível como um software tão complexo pode ser construído por pessoas que estão geograficamente distantes. Só como ressalva o PCSX2 em processadores dual core (seja X2 (AMD), ou duo (Intel)) já está rodando em média de 20 a 50 fps.&lt;br /&gt;&lt;br /&gt;Links interessantes:&lt;br /&gt;&lt;a href="http://www.pcsx2.net/"&gt;Página oficial&lt;/a&gt;&lt;br /&gt;&lt;a href="http://sourceforge.net/projects/pcsx2/"&gt;Código fonte&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.pcsx2.net/blog.php"&gt;Blog oficial&lt;/a&gt;&lt;br /&gt;&lt;a href="http://forums.ngemu.com/pcsx2-official-forum/"&gt;Forum oficial&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.pcsx2.net/downloads.php"&gt;Página de downloads&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.pcsx2.net/downloads.php?p=publicbeta"&gt;Beta releases&lt;/a&gt;&lt;br /&gt;&lt;a href="http://pcsx2.svn.sourceforge.net/viewvc/pcsx2/pcsx2/"&gt;SVN Browser&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;A entrevista original:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Leandro:&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;First what is you name, where you live actualy, btw tell us a bit of your history on computer software? &lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Alex:&lt;/span&gt; my name is Alex, i live in Plymouth, England, software development for me has always been a hobby, i started with VB back in 2000 and meddled in little bits here and there, then in 2002-2003 time i made my first emulator (good old chip8!) in C, which id picked up merely a few months before hand, i then went on to mess with Gameboy emulation then got hooked on the PCSX2 Team's work, i began helping out on bits, then Saqib (formally known as asadr) asked me to join the team, it went from there.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Leandro:&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;How was born the PCSX2 team?&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Alex:&lt;/span&gt; PCSX2 was created by the developers of PCSX, Linuzappz and Shadow.  They had pretty much finished accurate PS1 emulation and figured the logical next step to fuel their coding needs would be to move on to PS2 emulation, so PCSX2 was born.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Leandro:&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;The development team is quite integreted?&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Alex:&lt;/span&gt; Not quite sure what you mean here, do you mean "close"? in a friend sort of way yes, but not close close.  We get along fine though.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Leandro:&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;Which tools you use on this project? &lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Alex:&lt;/span&gt; We use sourceforge SVN and Visual Studio 2005.  some plugins use SDL, DirectX and OpenGL to do what they need to succeed.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Leandro:&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;All the team follow some pattern that you stabelished?&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Alex:&lt;/span&gt; We dont really follow any pattern, after all it is a hobby, not a job :)&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Leandro:&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;Some of the developers are responsible for coordinating the actions / activities of the project? &lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Alex:&lt;/span&gt; Not much coordinating goes on, sometimes we go "stop being lazy and do some coding" but thats as far as it goes :p&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Leandro:&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;You have targets set by someone or just the desire to build the good software?&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Alex:&lt;/span&gt; definately the desire to build good software. Ultimately the goal is to have good PS2 emulation, but thats a way off yet.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Leandro:&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;What is the best and the worst learning you could retrive from the project?&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Alex:&lt;/span&gt; Do you mean part of the project? hmm, i suppose it would be the timing of the PS2 system, its a pain beyond words.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Leandro:&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;Do you know some member personality?&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Alex:&lt;/span&gt; I know 2 of my beta testers personally, CKemu and General Plot, i have met them both.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Leandro:&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;What kind of mechanism you use to comunicate between members?&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Alex:&lt;/span&gt; usually MSN and IRC, although IRC tends to be less serious.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Leandro:&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;What scrap you can tell for anxious users?&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Alex:&lt;/span&gt; Hmmm, at the moment things are a little dry, all i can say is hopefully soon users wont need to worry about not owning the console, hopefully we will have a free alternative for you, but i have no dates of completion :)&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Leandro:&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;The Brazilian guy on project (GoldenFinger) is active?&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Alex:&lt;/span&gt; Not currently, hes talked about comming back as he was inactive for a few years, but i think hes a bit busy at the moment :)&lt;br /&gt;&lt;br /&gt;Thanks&lt;br /&gt;Refraction&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3760273245894556929-621230403673734336?l=archsofty.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://archsofty.blogspot.com/feeds/621230403673734336/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3760273245894556929&amp;postID=621230403673734336' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3760273245894556929/posts/default/621230403673734336'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3760273245894556929/posts/default/621230403673734336'/><link rel='alternate' type='text/html' href='http://archsofty.blogspot.com/2008/02/entrevista-com-refraction-codificador.html' title='Entrevista com Refraction, codificador do projeto PCSX2 - um emulador do Playstation 2.'/><author><name>Leandro</name><uri>http://www.blogger.com/profile/09724892719833243149</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3760273245894556929.post-2092856861745111866</id><published>2008-02-14T05:24:00.000-08:00</published><updated>2008-02-14T05:27:56.338-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='projeto de software'/><category scheme='http://www.blogger.com/atom/ns#' term='ambiente desenvolvimento'/><category scheme='http://www.blogger.com/atom/ns#' term='ambiente homolgação'/><category scheme='http://www.blogger.com/atom/ns#' term='versionamento'/><category scheme='http://www.blogger.com/atom/ns#' term='padrões'/><category scheme='http://www.blogger.com/atom/ns#' term='ambiente produção'/><title type='text'>Práticas comuns em construção de sistemas</title><content type='html'>&lt;span style="font-weight:bold;"&gt;Introdução&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;   Há uma prática difundida em projetos de software no mundo todo, o uso de diversos ambientes para a construção de sistemas. Em resumo funciona assim, o sistema é construído num *Ambiente de Desenvolvimento*, passa para um *Ambiente de Homologação* e finalmente vai pra *Produção*.&lt;br /&gt;   Um ambiente pode ser entendido como um local físico no computador (uma pasta ou computador) mais um conjunto de softwares auxiliares para execução do produto(software). Nesse ambiente é que fica os aplicativos necessários para que aplicação seja executada. Por exemplo: um projeto web feito em asp, normalmente utiliza os seguinte aplicativos: o servidor web IIS, um SGBD qualquer e os arquivos .asp; num projeto web para Java necessita de um container web, um SGBD, a JVM e os códigos(.class, .jsp). O importante é notar que estes aplicativos devem estar em todos ambientes e com as mesmas versões, para que o desenvolvimento seja eficaz, executável e testável em todos ambientes. A replicação de estrutura entre os ambientes.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;  &lt;span style="font-weight:bold;"&gt; Ambiente de Desenvolvimento&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;   Quando se desenvolve (código mesmo) ou dá manutenção nas aplicações de uma empresa usa-se o ambiente de desenvolvimento. Nesse ambiente é que fica o código em desenvolvimento que pode ser testado também, ou seja, gerá código executável (não exe, mas no sentido de código funcional).&lt;br /&gt;   Existem vários elementos que fazem parte desse ambiente um deles é o...&lt;br /&gt;&lt;br /&gt;Source Code Control: São ferramentas que agilizam o processo de unificar o local onde os códigos ficam, os mais conhecidos são: CVS, SVN e Source Control (MS).&lt;br /&gt;&lt;br /&gt;   E neste ambiente que os *diversos desenvolvedores constroem o código* e "comitam" ( o ato de jogar o código no servidor de código ) e testam. Obviamente a ferramenta mais utilizada neste local é um IDE (VS2008, Eclipse, Netbeans, DephiSuite ...) e o sistema de versionamento de códigos.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;   &lt;span style="font-weight:bold;"&gt;Ambiente de Homologação&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;   O sistema vem pra esse ambiente quando já o mesmo já foi produzido e testado no ambiente de desenvolvimento. Esse ambiente pode ser entendido como *ambiente de testes finais*, antes de ir para o usuário gestor do sistema.&lt;br /&gt;   É comum neste ambiente *encontrar falhas*, criar um lista com check-list sobre os erros encontrados e repassar-los aos desenvolvedores, para *fix* (outro termo usado para designar o conserto de alguma falha).&lt;br /&gt;   O importante é notar que neste ambiente é *ótimo se os testadores forem externos ao desenvolvimento*, ou seja, outra equipe mesmo irá homologar (o ato de certificar que o software está bom para ir para prateleira) o software, usar a mesma pessoa que desenvolve para homologar pode induzir a falhas terríveis.&lt;br /&gt;   Algumas empresas de código fechado, neste ambiente não há como ver o código fonte.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;   &lt;span style="font-weight:bold;"&gt;Produção&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;   Aqui o produto já está na mão do usuário final, já está em uso oficial, importante notar aqui se todos os comentários de DEBUG foram limpados do código, se todos os dados fictícios de testes foram removidos, se as senhas para acesso ao SGBD foram trocadas, enfim *aqui é sistema final*.   &lt;br /&gt;&lt;br /&gt;   &lt;span style="font-weight:bold;"&gt;Versões e nomenclaturas&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;   Quando estamos a procura de um software nos preocupamos com várias coisas como qualidade, quem produziu se o mesmo é grátis, de código fonte, pago...&lt;br /&gt;   Muitas vezes nos deparamos com produtos com alguns sufixos como M, B, RV, RC...&lt;br /&gt;   Para o entendimento dessas diversas siglas utilizaremos um exemplo simples um sistema de gestão de RH, conhecido como OpenRh.&lt;br /&gt;&lt;br /&gt;Se tiver:&lt;br /&gt;*OpenRh.1.0.0.1A * - Significa que o software ainda é Alfa. (testes internos com os testadores da empresa)&lt;br /&gt;*OpenRh.1.0.0.1B*  - Significa que o software ainda é Beta. (testes externos com os usuários finais)&lt;br /&gt;*OpenRh.1.0.0.1RC*  - Significa que o software é o Release Candidate. (Provável versão final, uma após a B)&lt;br /&gt;*OpenRh.1.0.0.1*  - Significa que o software é o final. (Também conhecido como de produção ou ainda stable)&lt;br /&gt;ps: as vezes utiliza-se algumas nomenclaturas como .final ou .stable para definir que o software já está pronto para o mercado.&lt;br /&gt;&lt;br /&gt;Para entusiastas ainda há a possibilidade de adquirir software enquanto estão em ambiente de desenvolvimento.&lt;br /&gt;*OpenRh 2.0.0M1* - Significa que o software que teve alguma mudança significativa e assim foi feito um Marco esse marco normalmente é numerado logo pode se ter M1 M2 M3... (Milestone)&lt;br /&gt;*OpenRh 2.0.0R301* - Significa que o software está na revisão 301 no repositório de códigos, aqui a cada commit o usuário (mais fanático) pode testar software feito no dia.&lt;br /&gt;Obviamente esses nomes podem sofrer algumas alterações mas o sentido continua o mesmo.&lt;br /&gt;Ps: Também há o .src que é exatamente o código fonte do projeto em questão.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;   &lt;span style="font-weight:bold;"&gt;Conclusão&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;   A principio parece mais burocracia ao desenvolvimento de sistema, todavia as grandes empresas tem notado em experiências sólidas que o uso de diversos ambientes reduzem e muito a quantidade de erros que os sistemas poderiam ter ao serem lançados.&lt;br /&gt;   Questões gerenciais ficam bem facilitas com o uso de diversos ambientes. O uso de um repositório de código hoje é essencial, necessário. Seguir boas práticas que grandes empresas seguem pode tornar seus problemas mais gerenciáveis, estar preparado para mudança é o rumo da T.I. &lt;br /&gt;&lt;br /&gt;Texto: Autor desconhecido.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3760273245894556929-2092856861745111866?l=archsofty.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://archsofty.blogspot.com/feeds/2092856861745111866/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3760273245894556929&amp;postID=2092856861745111866' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3760273245894556929/posts/default/2092856861745111866'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3760273245894556929/posts/default/2092856861745111866'/><link rel='alternate' type='text/html' href='http://archsofty.blogspot.com/2008/02/prticas-comuns-em-construo-de-sistemas.html' title='Práticas comuns em construção de sistemas'/><author><name>Leandro</name><uri>http://www.blogger.com/profile/09724892719833243149</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3760273245894556929.post-5977401061182925817</id><published>2008-02-13T07:12:00.000-08:00</published><updated>2008-02-19T20:03:55.301-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='itnernal dsl'/><category scheme='http://www.blogger.com/atom/ns#' term='martin fowler'/><category scheme='http://www.blogger.com/atom/ns#' term='external dsl'/><category scheme='http://www.blogger.com/atom/ns#' term='interface fluente'/><category scheme='http://www.blogger.com/atom/ns#' term='dsl interna'/><category scheme='http://www.blogger.com/atom/ns#' term='fluent interface'/><category scheme='http://www.blogger.com/atom/ns#' term='dsl'/><title type='text'>Bom link para ler...</title><content type='html'>Muito tempo sem postar nada. Venho com apenas um link parar o &lt;a href="http://martinfowler.com/dslwip/"&gt;novo Livro de Martin Fowler - DSL (WIP)&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3760273245894556929-5977401061182925817?l=archsofty.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://archsofty.blogspot.com/feeds/5977401061182925817/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3760273245894556929&amp;postID=5977401061182925817' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3760273245894556929/posts/default/5977401061182925817'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3760273245894556929/posts/default/5977401061182925817'/><link rel='alternate' type='text/html' href='http://archsofty.blogspot.com/2008/02/bom-link-para-ler.html' title='Bom link para ler...'/><author><name>Leandro</name><uri>http://www.blogger.com/profile/09724892719833243149</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3760273245894556929.post-8780042766912014464</id><published>2008-01-14T06:11:00.000-08:00</published><updated>2008-01-15T03:37:50.461-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='restful'/><category scheme='http://www.blogger.com/atom/ns#' term='modismos'/><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='rest'/><category scheme='http://www.blogger.com/atom/ns#' term='exemplo'/><category scheme='http://www.blogger.com/atom/ns#' term='programacao'/><category scheme='http://www.blogger.com/atom/ns#' term='arquitetura'/><title type='text'>REST - Breves esclarecimentos sobre o estilo arquitetural</title><content type='html'>&lt;span style="font-weight:bold;"&gt;Primeiro esclarecimento:&lt;/span&gt;&lt;br /&gt;REST é um estilo arquitetural (simples assim), que pode ser aproveitado para o desenvolvimento de aplicações que utilizem uma rede de comunicação, o termo foi "inventado" por Roy Fielding na dissertação de Ph.D dele.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Segundo esclarecimento:&lt;/span&gt;&lt;br /&gt;REST não é um padrão, especificação, ou seja, você não irá ver a Sun, Microsoft ou IBM vendendo um Toolkit para REST. Simplesmente REST é um estilo arquitetural, você pode compreender-lo e desenvolver seus serviços para web (aplicações, web services ...) nesse estilo.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Um exemplo&lt;/span&gt; do uso deste estilo arquitetural (REST)&lt;br /&gt;&lt;br /&gt;A Web...&lt;br /&gt;Você deseja um serviço, por exemplo um dicionário online.&lt;br /&gt;Você procura esse dicionário (normalmente usando outro serviço de busca da Web).&lt;br /&gt;Como resposta você obtém uma URL que identifica unicamente aquele recurso (serviço). [ www.dicionariorest.com.br].&lt;br /&gt;Pronto agora você consegue tal serviço.&lt;br /&gt;&lt;br /&gt;Um ótimo jeito é dar &lt;span style="font-weight:bold;"&gt;outro exemplo&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Uma empresa Xyz deseja oferecer serviços na web que habilitam seus clientes a:&lt;br /&gt;&lt;br /&gt; 1 - Obter uma lista de produtos.&lt;br /&gt; 2 - Obter informação detalhada sobre um produto.&lt;br /&gt; 3 - Comprar usando a Internet.&lt;br /&gt;&lt;br /&gt;Como seria o jeito REST de se resolver isto.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp3.blogger.com/_2W5qHpT9JNQ/R4tvAyqHjpI/AAAAAAAAABE/t0x5MRrO904/s1600-h/exemplo1.JPG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://bp3.blogger.com/_2W5qHpT9JNQ/R4tvAyqHjpI/AAAAAAAAABE/t0x5MRrO904/s400/exemplo1.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5155336257844776594" /&gt;&lt;/a&gt;&lt;br /&gt;O serviço está disponível pela URL (única), no exemplo o cliente do serviço deve usar a URL para ter acesso ao serviço.&lt;br /&gt;   www.lojadementira.com.br/produtos&lt;br /&gt;O retorno óbvio é uma lista de produtos (HTML) todavia poderia ser especificado qual o tipo de recurso queriamos, por exemplo. &lt;br /&gt;   www.lojadementira.com.br/produtos&amp;tipo=xml&lt;br /&gt;Supondo que o serviço retornasse o seguinte xml:&lt;br /&gt;&lt;br /&gt;[?xml version="1.0"?]&lt;br /&gt; [lista]&lt;br /&gt;  [produto id=www.lojadementira.com.br/produtos/001][/produto]&lt;br /&gt;  [produto id=www.lojadementira.com.br/produtos/002][/produto]&lt;br /&gt;  [produto id=www.lojadementira.com.br/produtos/003][/produto]&lt;br /&gt;  [produto id=www.lojadementira.com.br/produtos/004][/produto]&lt;br /&gt;  [produto id=www.lojadementira.com.br/produtos/005][/produto]&lt;br /&gt;  [produto id=www.lojadementira.com.br/produtos/006][/produto]&lt;br /&gt; [/lista]&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Não reparem na sintaxe (provavelmente) errada do xml acima. Notem a característica chave do REST: A lista própria já traz como acessar o serviço de detalhes do produto. O cliente se transfere de um estado para o próximo examinando e escolhendo entre as alternativas.&lt;br /&gt;&lt;br /&gt;Ótimo agora com a lista, o cliente escolhe o produto [www.lojadementira.com.br/produtos/005] e como retorno obtém um novo xml.&lt;br /&gt;&lt;br /&gt;[?xml version="1.0"?]&lt;br /&gt; [produto id=1]&lt;br /&gt;  [name] tutorial sobre REST [/name]&lt;br /&gt;  [price]18.8[/price]&lt;br /&gt;  ...&lt;br /&gt; [/produto]&lt;br /&gt;&lt;br /&gt;(ps: claro que www.lojadementira.com.br/produtos/005 não é se trata do endereço físico da página html www.lojadementira.com.br/produtos/005.html, é somente um modo de acessar unicamente aquele recurso, todavia essa descrição detalhada do produto pode (e deveria) ser dinâmica.)&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;Algumas características do REST (baseada em redes)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;* Geralmente usam-se interfaces unificadas.&lt;br /&gt; GET, POST, PUT e DELETE par prover serviços.&lt;br /&gt;* Stateless: Toda requisição precisa conter toda informação necessária para atender a requisição.&lt;br /&gt;* Tudo é um recurso e tudo é adiquirido/executado pela URL.&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Principios do REST&lt;/span&gt;&lt;br /&gt;&lt;blockquote&gt;* Dê a tudo (os recursos) um ID (URI)&lt;br /&gt;* Link tudo &lt;br /&gt;Por exemplo um pedido:&lt;br /&gt; [order self='http://example.com/customers/1234' ] &lt;br /&gt;   [amount]23[/amount] &lt;br /&gt;   [product ref='http://example.com/products/4554' /] &lt;br /&gt;   [customer ref='http://example.com/customers/1234' /] &lt;br /&gt; [/order] &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Nesse pedido posso facilmente encontrar os recursos relacionados a ele, como cliente e produto.&lt;br /&gt;&lt;br /&gt;* Use métodos padrões&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Se tudo é um recurso com identidade...&lt;br /&gt;&lt;br /&gt; class Resource {&lt;br /&gt;     Resource(URI u);&lt;br /&gt;     Response get();&lt;br /&gt;     Response post(Request r);&lt;br /&gt;     Response put(Request r);&lt;br /&gt;     Response delete();&lt;br /&gt; } &lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Exemplo número 9.001&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Supondo as seguintes classes de serviço:&lt;br /&gt;&lt;br /&gt;public class ServicoGerenciamentoDeProduto{&lt;br /&gt;+getDetalhesDoProtudo()&lt;br /&gt;+atualizarProduto()&lt;br /&gt;+inserirProduto()&lt;br /&gt;...&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public class ServicoGerenciamentoDeCliente{&lt;br /&gt;+getTelefoneComercial()&lt;br /&gt;+atualizarCliente()&lt;br /&gt;+inserirCliente()&lt;br /&gt;...&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;Num modo REST de resolução poderia ser criado algo semelhando a isso.&lt;br /&gt;&lt;br /&gt;interface Resource{&lt;br /&gt;+GET&lt;br /&gt;+PUT&lt;br /&gt;+POST&lt;br /&gt;+DELETE&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;E fazer as classes de serviço implementarem essa interface (um dos princípios sobre a padronização). Essa implementação é por recurso, normalmente um serviço expõem mais de um recurso.&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Desculpem pela quantidade de exemplos&lt;/span&gt; mas o assunto é muito "abstrato" ou no mínimo díficil de se explicar, acredito que com exemplos ficará mais claro.&lt;br /&gt;&lt;br /&gt;Conclusão.&lt;br /&gt;&lt;br /&gt;Francamente gostaria de ter deixado mais claro o que é REST e como aplicar, mas estou achando que não consegui, assuntos sobre estilos arquiteturais são complexos de ser entendidos e explicados. Talvez uma leitura nos links abaixo facilite o entendimento. Enfim usar REST é apenas utilizar melhor o jeito HTTP de ser.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Fontes e bons links:&lt;br /&gt;http://www.xfront.com/&lt;br /&gt;http://www.fragmental.com.br/&lt;br /&gt;http://rest.blueoxen.net/cgi-bin/wiki.pl?BenjaminsRESTTutorial&lt;br /&gt;http://forum.rubyonbr.org/forums/1/topics/2212#posts-12150&lt;br /&gt;http://java.sun.com/developer/technicalArticles/WebServices/restful/&lt;br /&gt;A Brief Introduction to REST by Stefan Tilkov&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Ps: não se trata de um tutorial ou faq sobre o assunto. Possivelmente há erros no texto, qualquer correção ou adição de informação será bem-vinda.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3760273245894556929-8780042766912014464?l=archsofty.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://archsofty.blogspot.com/feeds/8780042766912014464/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3760273245894556929&amp;postID=8780042766912014464' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3760273245894556929/posts/default/8780042766912014464'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3760273245894556929/posts/default/8780042766912014464'/><link rel='alternate' type='text/html' href='http://archsofty.blogspot.com/2008/01/rest-breves-esclarecimentos-sobre-o.html' title='REST - Breves esclarecimentos sobre o estilo arquitetural'/><author><name>Leandro</name><uri>http://www.blogger.com/profile/09724892719833243149</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp3.blogger.com/_2W5qHpT9JNQ/R4tvAyqHjpI/AAAAAAAAABE/t0x5MRrO904/s72-c/exemplo1.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3760273245894556929.post-3128519025191279046</id><published>2008-01-11T09:16:00.000-08:00</published><updated>2008-01-11T09:39:12.536-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ruby'/><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='programacao'/><category scheme='http://www.blogger.com/atom/ns#' term='oo'/><title type='text'>Um (mal) programador Java aprendendo Ruby - Parte 1</title><content type='html'>Algumas características interessantes do Ruby fazem algumas tarefas mais rápidas. Em um programa oo para saber se um objeto é uma instância de uma determinada classe.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Em Java:&lt;/span&gt;&lt;br /&gt;objeto instanceof Classe &lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Em Ruby:&lt;/span&gt;&lt;br /&gt;objeto.is_a? Classe&lt;br /&gt;&lt;br /&gt;Quando desejo usar herança:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Em Java:&lt;/span&gt;&lt;br /&gt;public class Filho extends Pai&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Em Ruby:&lt;/span&gt;&lt;br /&gt;class Filho &lt; Pai&lt;br /&gt;&lt;br /&gt;Quando desejo criar um método que retorne a soma entre dois números:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Em Java:&lt;/span&gt;&lt;br /&gt;public int soma(int v1, int v2){&lt;br /&gt; return v1 + v2&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Em Ruby:&lt;/span&gt;&lt;br /&gt;def soma(v1,v2)&lt;br /&gt;  v1+v2&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;"Lançando exceções".&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Em Java:&lt;/span&gt;&lt;br /&gt;if (saldo &lt; saque) throw new Exception("Sem fundos!")&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Em Ruby:&lt;/span&gt;&lt;br /&gt;raise Exception.new("Sem fundos!") unless saldo &gt; saque&lt;br /&gt;&lt;br /&gt;Algo que percebo é que as vezes para implementar características em Ruby, gasto menos linhas de código para o mesmo propósito quando usava Java (bem como o código se transforma em algo mais expressivo também). A principio esta característica de escrever menos assusta e logo vêm milhares de perguntas a cabeça como: quando e como retorno o valor... essa tipagem dinâmica, sei não viu... . Bem sobre algumas características (como o retorno do método) o Ruby utiliza algumas convenções:&lt;br /&gt;&lt;br /&gt;Ao invés de digitar ; (em Java, C, C++, C#) para quebra de linha apenas usa o Enter para tal.&lt;br /&gt;&lt;br /&gt;Ao invés de usar a palavra-chave return [mesmo que você possa utilizar-la] o Ruby entende que seu último comando será o retorno do método, todavia se quiser usar o return poderá também.&lt;br /&gt;&lt;br /&gt;Quanto a tipagem dinâmica não sei muito sobre... quando souber posto aqui.&lt;br /&gt;&lt;br /&gt;ps: Este post não é de forma alguma um "flamewar" para provar que uma linguagem é melhor do que outra...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3760273245894556929-3128519025191279046?l=archsofty.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://archsofty.blogspot.com/feeds/3128519025191279046/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3760273245894556929&amp;postID=3128519025191279046' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3760273245894556929/posts/default/3128519025191279046'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3760273245894556929/posts/default/3128519025191279046'/><link rel='alternate' type='text/html' href='http://archsofty.blogspot.com/2008/01/um-mal-programador-java-aprendendo-ruby.html' title='Um (mal) programador Java aprendendo Ruby - Parte 1'/><author><name>Leandro</name><uri>http://www.blogger.com/profile/09724892719833243149</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3760273245894556929.post-9216658854542461362</id><published>2008-01-09T09:04:00.000-08:00</published><updated>2008-02-23T11:33:28.569-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ruby'/><category scheme='http://www.blogger.com/atom/ns#' term='internal dsl'/><category scheme='http://www.blogger.com/atom/ns#' term='interface fluente'/><category scheme='http://www.blogger.com/atom/ns#' term='dsl interna'/><category scheme='http://www.blogger.com/atom/ns#' term='oo'/><category scheme='http://www.blogger.com/atom/ns#' term='fluent interface'/><title type='text'>Ruby: usando classe aberta (open classe)</title><content type='html'>Extender (não no sentido "carregado" da herança) uma classe já existente.... Interessante recurso, lembro de algo similar no mundo .net os extension methods.&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;#uma classe já existente.&lt;br /&gt;class Integer&lt;br /&gt;&lt;br /&gt;#adicionando métodos a mesma.&lt;br /&gt;  def am(*args)&lt;br /&gt;    self == 12 ? 0 : self&lt;br /&gt;  end&lt;br /&gt;  &lt;br /&gt;  def pm(*args)&lt;br /&gt;    self == 12 ? 12 : self +12&lt;br /&gt;  end&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;#veja que interessante o uso.&lt;br /&gt;i = 4.pm &lt;br /&gt;puts "4Pm = " &lt;&lt; i.to_s #deve aparecer 4Pm = 16&lt;br /&gt;i = 4.am&lt;br /&gt;puts "4Am = " &lt;&lt; i.to_s #deve aparecer 4Am = 4&lt;br /&gt;&lt;br /&gt;#outro exemplo...&lt;br /&gt;class String&lt;br /&gt;  def em_maisculo&lt;br /&gt;    self.upcase&lt;br /&gt;  end&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;puts  "galaxy".em_maisculo&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Esse recurso pode facilitar a escrita de interfaces fluente... imagine.&lt;br /&gt;&lt;blockquote&gt;compromisso.adicionar("ler algo sobre ddd").comecando_as(2.Pm).ate_as(4.Pm).hoje()&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;* Exemplos inspirados numa apresentação de um trabalhador da throughworks.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3760273245894556929-9216658854542461362?l=archsofty.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://archsofty.blogspot.com/feeds/9216658854542461362/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3760273245894556929&amp;postID=9216658854542461362' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3760273245894556929/posts/default/9216658854542461362'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3760273245894556929/posts/default/9216658854542461362'/><link rel='alternate' type='text/html' href='http://archsofty.blogspot.com/2008/01/classe-aberta-open-classe.html' title='Ruby: usando classe aberta (open classe)'/><author><name>Leandro</name><uri>http://www.blogger.com/profile/09724892719833243149</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3760273245894556929.post-5444151097153034091</id><published>2008-01-09T05:31:00.000-08:00</published><updated>2008-02-23T11:33:28.570-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='internal dsl'/><category scheme='http://www.blogger.com/atom/ns#' term='interface fluente'/><category scheme='http://www.blogger.com/atom/ns#' term='exemplo'/><category scheme='http://www.blogger.com/atom/ns#' term='dsl interna'/><category scheme='http://www.blogger.com/atom/ns#' term='fluent interface'/><title type='text'>"Interface fluente" no JavaScript</title><content type='html'>Isso mesmo "já embutida":&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Ao invés de fazer isso.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;elemento = document.getElementById("attachments-box");&lt;br /&gt;elemento.removeAttribute("width");&lt;br /&gt;&lt;br /&gt;elemento1 = document.getElementById("format_auto");&lt;br /&gt;elemento1.setAttribute("checked", "true");&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Você pode fazer diretamente:&lt;/span&gt;&lt;br /&gt;    document.getElementById("attachments-box").removeAttribute("width");&lt;br /&gt;    document.getElementById("format_auto").setAttribute("checked", "true");&lt;br /&gt;&lt;br /&gt;E só pra não perder o costume mais um link de um belo exemplo de uma interface fluente:  &lt;a href="http://gc.blog.br/2007/09/25/refatorando-para-fluent-interface/"&gt;http://gc.blog.br/2007/09/25/refatorando-para-fluent-interface/&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3760273245894556929-5444151097153034091?l=archsofty.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://archsofty.blogspot.com/feeds/5444151097153034091/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3760273245894556929&amp;postID=5444151097153034091' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3760273245894556929/posts/default/5444151097153034091'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3760273245894556929/posts/default/5444151097153034091'/><link rel='alternate' type='text/html' href='http://archsofty.blogspot.com/2008/01/interface-fluente-no-javascript.html' title='&quot;Interface fluente&quot; no JavaScript'/><author><name>Leandro</name><uri>http://www.blogger.com/profile/09724892719833243149</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3760273245894556929.post-5882362550059203531</id><published>2008-01-04T08:55:00.000-08:00</published><updated>2008-02-23T11:33:28.571-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ruby'/><category scheme='http://www.blogger.com/atom/ns#' term='modismos'/><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='internal dsl'/><category scheme='http://www.blogger.com/atom/ns#' term='interface fluente'/><category scheme='http://www.blogger.com/atom/ns#' term='dsl interna'/><category scheme='http://www.blogger.com/atom/ns#' term='oo'/><category scheme='http://www.blogger.com/atom/ns#' term='fluent interface'/><category scheme='http://www.blogger.com/atom/ns#' term='C#3.0'/><category scheme='http://www.blogger.com/atom/ns#' term='expressividade'/><title type='text'>Expressividade na linguagem</title><content type='html'>Atualmente existem muitas linguagens de programação no mercado, algumas que fazem parte do "legado" {cobol,natura...} e outras estão em "voga" {java,ruby,c#...}. Fala-se muito em expressividade na escrita de código. A linguagem pode ajudar e muito a criação de código mais expressivo. Como exemplo inicial, duas linguagens, Java já conhecida e admirada e Ruby nova e promissora.&lt;br /&gt;Para se obter o ultimo elemento de uma lista...&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Em Java.&lt;/span&gt;&lt;br /&gt;aList.get(aList.size -1)&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Em Ruby.&lt;/span&gt;&lt;br /&gt;anArray.last&lt;br /&gt;&lt;br /&gt;É notório que o código parece ser melhor expresso com Ruby.&lt;br /&gt;Agora considere os códigos abaixo:&lt;br /&gt;&lt;br /&gt;    //C# 2.0&lt;br /&gt;    date d = Helper.At(Helper.FromToday(Helper.Days(2)), Helper.Pm(4));&lt;br /&gt;    //C# 3.0&lt;br /&gt;    date d = 2.Days().FromToday().At(4.Pm);&lt;br /&gt;Veja o quanto a versão 3.0 do sharp é mais fácil de ser "lida".&lt;br /&gt;&lt;br /&gt;Outro exemplo:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Em Java:&lt;/span&gt;&lt;br /&gt;  public List pessoasFisicas(List pessoas) {&lt;br /&gt;    List resultado = new ArrayList();&lt;br /&gt;    for (Pessoa pessoa : pessoas)&lt;br /&gt;      if (pessoa.isFisica()) result.Add(pessoa);&lt;br /&gt;    return result;&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Em Ruby:&lt;/span&gt;&lt;br /&gt;def pessoasFisicas(pessoas)&lt;br /&gt;  return pessoas.select {|e| e.isFisica}&lt;br /&gt;end&lt;br /&gt;  &lt;br /&gt;Sem comentário para essa última demonstração.&lt;br /&gt;"Ser expressivo" pode facilitar futuras manutenções, extensões e integrações no código.&lt;br /&gt;&lt;br /&gt;Os exemplos foram roubados discaradamente de&lt;br /&gt;* &lt;a href="http://martinfowler.com/bliki/HumaneInterface.html"&gt;HumaneInterface - Martin Fowler&lt;/a&gt;&lt;br /&gt;* &lt;a href="http://www.infoq.com/news/2007/11/Extension-Methods-DSL"&gt;Artigo no InfoQ&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;ps: os códigos podem estar errados.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3760273245894556929-5882362550059203531?l=archsofty.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://archsofty.blogspot.com/feeds/5882362550059203531/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3760273245894556929&amp;postID=5882362550059203531' title='2 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3760273245894556929/posts/default/5882362550059203531'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3760273245894556929/posts/default/5882362550059203531'/><link rel='alternate' type='text/html' href='http://archsofty.blogspot.com/2008/01/expressividade-na-linguagem.html' title='Expressividade na linguagem'/><author><name>Leandro</name><uri>http://www.blogger.com/profile/09724892719833243149</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3760273245894556929.post-6166895180441901364</id><published>2008-01-03T10:42:00.000-08:00</published><updated>2008-02-23T11:33:28.572-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='internal dsl'/><category scheme='http://www.blogger.com/atom/ns#' term='interface fluente'/><category scheme='http://www.blogger.com/atom/ns#' term='dsl interna'/><category scheme='http://www.blogger.com/atom/ns#' term='oo'/><category scheme='http://www.blogger.com/atom/ns#' term='fluent interface'/><category scheme='http://www.blogger.com/atom/ns#' term='dsl'/><title type='text'>Ótimo post sobre Interface Fluente.</title><content type='html'>No site abaixo verá um exemplo bastante interessante, principalmente para quem trata requisições (no modelo "JSP/Servelt") em páginas.&lt;br /&gt;&lt;a href="http://fragmental.tw/2007/10/18/notes-on-language-adaption/"&gt;http://fragmental.tw/2007/10/18/notes-on-language-adaption/&lt;/a&gt;&lt;br /&gt;Enjoy it.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3760273245894556929-6166895180441901364?l=archsofty.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://archsofty.blogspot.com/feeds/6166895180441901364/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3760273245894556929&amp;postID=6166895180441901364' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3760273245894556929/posts/default/6166895180441901364'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3760273245894556929/posts/default/6166895180441901364'/><link rel='alternate' type='text/html' href='http://archsofty.blogspot.com/2008/01/timo-post-sobre-interface-fluente.html' title='Ótimo post sobre Interface Fluente.'/><author><name>Leandro</name><uri>http://www.blogger.com/profile/09724892719833243149</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3760273245894556929.post-2154293670601139790</id><published>2007-11-30T19:42:00.000-08:00</published><updated>2008-02-27T04:37:20.082-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='internal dsl'/><category scheme='http://www.blogger.com/atom/ns#' term='projeto oo'/><category scheme='http://www.blogger.com/atom/ns#' term='interface fluente'/><category scheme='http://www.blogger.com/atom/ns#' term='dsl interna'/><category scheme='http://www.blogger.com/atom/ns#' term='oo'/><category scheme='http://www.blogger.com/atom/ns#' term='fluent interface'/><title type='text'>Fluent Interface ...</title><content type='html'>Primeiro a definição depois os exemplos.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;*DSL ==&gt; *&lt;/span&gt;é uma linguagem (mini liguagem) projetada para um tipo especifico de tarefa, isto é justamente o contrário de linguagens para proposito geral como Java, C ou C#.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;*Fluent Interface (Interface Fluente)*&lt;/span&gt; ==&gt; objeto que é capaz de deixar as suas responsabilidades mais expressivas a linguagem. (:S confuso, mas o exemplo ajudará)&lt;br /&gt;&lt;br /&gt;Para se aprender algo nada melhor do que exemplos./ (aprender com exemplos não dá sono de acordo com Fowler, eu acho que ele está certo)/&lt;br /&gt;Irei apresentar aqui dois exemplos: um simples e outro mais interessante.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;*Exemplo Simples*&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Supondo que tenho um objeto que representa o conceito Carro.&lt;br /&gt;&lt;br /&gt;public class Carro{&lt;br /&gt;  private String nome;&lt;br /&gt;  private String marca;&lt;br /&gt;  private int portas;&lt;br /&gt;  public Carro(){&lt;br /&gt;  }&lt;br /&gt;  // métodos de acesso as propriedades encapsulados...&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;Quando fossemos "usar" esse objeto fariamos...&lt;br /&gt;&lt;br /&gt;//***&lt;br /&gt;Carro fusca = new Carro();&lt;br /&gt;fusca.setNome("fusca");&lt;br /&gt;fusca.setMarca("VW");&lt;br /&gt;fusca.setPortas(2);&lt;br /&gt;//***&lt;br /&gt;&lt;br /&gt;Tentando aplicar o conceito de Interface Fluente, definiriamos uma Interface&lt;br /&gt;&lt;br /&gt;public interface ICarro{&lt;br /&gt;ICarro setNome(String nome);&lt;br /&gt;ICarro setMarca(String nome);&lt;br /&gt;ICarro setPortas(int nome);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;//classe que implementa essa interface.&lt;br /&gt;public class Carro implements /ICarro/{&lt;br /&gt;private String nome;&lt;br /&gt;private String marca;&lt;br /&gt;private int portas;&lt;br /&gt;public Carro(){&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public ICarro setNome(String nome){&lt;br /&gt;this.nome = nome;&lt;br /&gt;return this;&lt;br /&gt;}&lt;br /&gt;public ICarro setMarca(String nome){&lt;br /&gt;this.nome = nome;&lt;br /&gt;return this;&lt;br /&gt;}&lt;br /&gt;public ICarro setPortas(int numero){&lt;br /&gt;this.portas = numero;&lt;br /&gt;return this;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;*Agora nosso mesmo exemplo.( O simples ainda )*&lt;br /&gt;&lt;br /&gt;//** ANTIGO&lt;br /&gt;Carro fusca = new Carro();&lt;br /&gt;fusca.setNome("fusca");&lt;br /&gt;fusca.setMarca("VW");&lt;br /&gt;fusca.setPortas(2);&lt;br /&gt;//**&lt;br /&gt;&lt;br /&gt;//** COM O CONCEITO DE INTERFACE FLUENTE&lt;br /&gt;Carro fusca = new Carro();&lt;br /&gt;fusca.setNome("fusca")&lt;br /&gt;      .setMarca("VW")&lt;br /&gt;      .setPortas(2);&lt;br /&gt;//Note como cada método de set retorna o objeto aplicando outro método,&lt;br /&gt;dando mais expressividade&lt;br /&gt;//a linguagem.&lt;br /&gt;//**&lt;br /&gt;&lt;br /&gt;Isso parece meio bobo, mas para um *exemplo inicial* é até "bonzinho".&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;*Exemplo Interessante&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;*Outro possível exemplo, um criador de sql. Em tempos que o padrã JPA está se consolidando, se trata de exemplo não muito usual (sem bem que se pode usar-lo para criar as JPQL)... mas ao exemplo.&lt;br /&gt;Se quiser "conversar" com o SGBD expresse em SQL. Uma consulta SQL é&lt;br /&gt;similar ao exemplo abaixo:*&lt;br /&gt;&lt;br /&gt;SELECT* campo1,campo2, campo4 (ou * para todos)&lt;br /&gt;*FROM* tabela1&lt;br /&gt;*[INNER | OUTER ...] JOIN* tabela2 *ON*&lt;br /&gt;*WHERE* condicao1&lt;br /&gt;*AND *condicao2&lt;br /&gt;*OR* condicao2&lt;br /&gt;*ORDER BY* campo1, campo2 ....&lt;br /&gt;&lt;br /&gt;O exemplo acima não mostra todas as potencialidades da linguagem SQL mas serve para o propósito do exemplo.&lt;br /&gt;&lt;br /&gt;1º A criação da Interface&lt;br /&gt;&lt;br /&gt;public interface IConsultaSql{&lt;br /&gt;IConsultaSql select(String campos);&lt;br /&gt;IConsultaSql from(String tabela);&lt;br /&gt;IConsultaSql innerJoin(String tablea);&lt;br /&gt;IConsultaSql outterJoin(String tablea);&lt;br /&gt;IConsultaSql on(String condicao);&lt;br /&gt;IConsultaSql where(String condicao);&lt;br /&gt;IConsultaSql and(String condicao);&lt;br /&gt;IConsultaSql or(String condicao);&lt;br /&gt;IConsultaSql orderBy(String campos);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;Logo após a criação da classe que implementa a interface.&lt;br /&gt;&lt;br /&gt;public class ConsultaSql implements /IConsultaSql/{&lt;br /&gt;private StringBuilder construtor = new StringBuilder();&lt;br /&gt;//note que o próprio StringBuilder aplica conceitos de interface fluente.&lt;br /&gt;public ConsultaSql(){&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public IConsultaSql select(String campos){&lt;br /&gt;construtor.append("SELECT ")&lt;br /&gt;             .append(campos);&lt;br /&gt;  return this;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public IConsultaSql from(String tabela){&lt;br /&gt;construtor.append(" FROM ")&lt;br /&gt;             .append(tabela);&lt;br /&gt;  return this;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public IConsultaSql innerJoin(String tabela){&lt;br /&gt;construtor.append(" INNER JOIN ")&lt;br /&gt;             .append(tabela);&lt;br /&gt;  return this;&lt;br /&gt;}&lt;br /&gt;public IConsultaSql outterJoin(String tabela){&lt;br /&gt;construtor.append(" OUTTER JOIN ")&lt;br /&gt;             .append(tabela);&lt;br /&gt;  return this;&lt;br /&gt;}&lt;br /&gt;public IConsultaSql on(String condicao){&lt;br /&gt;construtor.append(" ON ")&lt;br /&gt;             .append(condicao);&lt;br /&gt;  return this;&lt;br /&gt;}&lt;br /&gt;public IConsultaSql where(String condicao){&lt;br /&gt;construtor.append(" WHERE ")&lt;br /&gt;             .append(condicao);&lt;br /&gt;  return this;&lt;br /&gt;}&lt;br /&gt;public IConsultaSql and(String condicao){&lt;br /&gt;construtor.append(" AND ")&lt;br /&gt;             .append(condicao);&lt;br /&gt;  return this;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public IConsultaSql or(String condicao){&lt;br /&gt;construtor.append(" AND ")&lt;br /&gt;             .append(condicao);&lt;br /&gt;  return this;&lt;br /&gt;}&lt;br /&gt;public IConsultaSql orderBy(String campos){&lt;br /&gt;construtor.append(" ORDER BY ")&lt;br /&gt;             .append(condicao);&lt;br /&gt;  return this;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public String getSql(){&lt;br /&gt;String  retorno = construtor.toString();&lt;br /&gt;return retorno;&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;*Veja o uso.*&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153); font-weight: bold;"&gt;ConsultaSql con = new ConsultaSql();&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153); font-weight: bold;"&gt;con.select("nome,telefone")&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153); font-weight: bold;"&gt;.from("pessoa_fissica pf").innerJoin("contatos ct").on("pf.id=ct.pf_id")&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153); font-weight: bold;"&gt;.where("pf.nome like %?%")&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153); font-weight: bold;"&gt;.and("pf.idade&gt;18").orderBy("nome,idade");&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;*Bem mais expressivo... mais flexível*&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Senão engano o Hibernate está implementando [ou tem implementado] algo assim para criar os&lt;br /&gt;objetos Criteria.&lt;br /&gt;&lt;br /&gt;public String getSql() throws SqlIncorretoException{&lt;br /&gt;String  retorno = construtor.toString();&lt;br /&gt;Sql.valida(retorno);&lt;br /&gt;return retorno;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Uma nova característica do java 5, o varargs também pode ajudar a aplicar "esses novos conceitos" de interface fluente.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;*TRADICIONALMENTE*&lt;/span&gt;&lt;br /&gt;Produto bola;&lt;br /&gt;Produto cafe;&lt;br /&gt;Produto monitor;&lt;br /&gt;Compra compra = new Compra(cliente);&lt;br /&gt;compra.adicionarItem(bola);&lt;br /&gt;compra.adicionarItem(cafe);&lt;br /&gt;compra.adicionarItem(monitor);&lt;br /&gt;&lt;br /&gt;*COM USO DE VARARGS&lt;br /&gt;*&lt;br /&gt;Produto bola;&lt;br /&gt;Produto cafe;&lt;br /&gt;Produto monitor;&lt;br /&gt;Compra compra = new Compra(cliente);&lt;br /&gt;compra.adicionarItem(bola,cafe,monitor);&lt;br /&gt;&lt;br /&gt;Enfim são todos conceitos muito abstratos e ainda em discussão, logo "nada" é certo sobre esse tema. No mínimo o assunto é interessante e intrigante para os desenvolvedores e clientes (quem realmente interessa). Se acostume com esse novo paradigma /expressividade no desenvolvimento. (tudo mais perto da linguagem de&lt;br /&gt;domínio do sistema)&lt;br /&gt;&lt;br /&gt;/ps: perdoem os erros de português.&lt;br /&gt;/Links interessantes sobre os assuntos/.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-style: italic; color: rgb(0, 0, 153);"&gt;    * _http://www.fragmental.tw_  (Blog sobre pesquisa em DSL)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-style: italic; color: rgb(0, 0, 153);"&gt;    * _http://martinfowler.com/bliki&lt;/span&gt;&lt;div style="font-weight: bold; font-style: italic; color: rgb(0, 0, 153);" id="1f1n" class="ArwC7c ckChnd"&gt;&lt;wbr&gt;/FluentInterface.html_ (Fowler&lt;br /&gt;    "ditando" sobre o que é uma Interface Fluente)&lt;br /&gt;  * _http://www.infoq.com/presenta&lt;wbr&gt;tions/domain-specific-language&lt;wbr&gt;s_&lt;br /&gt;    (Vídeo com uma introdução sobre DSL)&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3760273245894556929-2154293670601139790?l=archsofty.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://archsofty.blogspot.com/feeds/2154293670601139790/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3760273245894556929&amp;postID=2154293670601139790' title='2 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3760273245894556929/posts/default/2154293670601139790'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3760273245894556929/posts/default/2154293670601139790'/><link rel='alternate' type='text/html' href='http://archsofty.blogspot.com/2007/11/fluent-interface.html' title='Fluent Interface ...'/><author><name>Leandro</name><uri>http://www.blogger.com/profile/09724892719833243149</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3760273245894556929.post-5523821506659547497</id><published>2007-11-30T05:39:00.000-08:00</published><updated>2007-11-30T05:52:18.181-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='modismos'/><category scheme='http://www.blogger.com/atom/ns#' term='integração'/><category scheme='http://www.blogger.com/atom/ns#' term='soa'/><category scheme='http://www.blogger.com/atom/ns#' term='modelagem'/><title type='text'>Da arte de integrar sistemas algo é certo... (um pouquinho de S.O.A.)</title><content type='html'>&lt;span style="font-weight: bold;"&gt;Integrar sistemas&lt;/span&gt; &lt;span style="font-weight: bold; font-style: italic;"&gt;--&gt;&lt;/span&gt; Pode ser entendido como a "arte" de interligar diversos sistemas que precisam de SERVIÇOS (não somente dados, além disso é necessário inteligência) dos demais. Essa interligação pode ser feita de diversas formas [implementadas] por exemplo:&lt;br /&gt;Usando WebServices.&lt;br /&gt;Usando RCP. (RMI, COM+ ...)&lt;br /&gt;Usando Tabelas Corporativas.&lt;br /&gt;Usando outros sistemas como "ponte". (sistemas para integração de aplicações)&lt;br /&gt;...&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Premissas&lt;/span&gt;&lt;br /&gt;É dever do "artista" notar onde há (ou haverá) convergência ou necessidades dos vários sistemas se integrarem. Projetar aplicações já prevendo possíveis integrações é uma ótima e difícil tarefa.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Eis o problema.... (integração via Tabelas Corporativas)&lt;/span&gt;&lt;br /&gt;Numa empresa Xyz (empresa de três letrinhas http://blog.fragmental.com.br/2007/06/07/3-letrinhas/) o parque de sistemas conta com aproximadamente 8 grandes sistemas.&lt;br /&gt;&lt;br /&gt;Sistema 1 - Recursos Humanos (S1)&lt;br /&gt;Sistema 2 - Capacitação dos Recursos Humanos (S2)&lt;br /&gt;...&lt;br /&gt;&lt;br /&gt;O S1 trata do domínio de &lt;span style="font-style: italic;"&gt;recursos humanos&lt;/span&gt; da empresa, nele há uma &lt;span style="font-style: italic;"&gt;tabela corporativa&lt;/span&gt; denominada rh_pf para manter informações das várias pessoas fisícas. O S2 no momento de analise percebeu que existiria um conceito de &lt;span style="font-style: italic;"&gt;aluno&lt;/span&gt; que necessitaria
