tag:blogger.com,1999:blog-76427706943933338042024-03-05T02:46:50.243-03:00Alexandre SimundiMemória de estudos, dicas, notícias sobre JAVA e outras tecnologiasAlexandre Simundihttp://www.blogger.com/profile/07075473948224038728noreply@blogger.comBlogger27125tag:blogger.com,1999:blog-7642770694393333804.post-71646730449079167212012-01-25T09:58:00.001-02:002014-01-28T16:56:00.081-02:00Katas para Coding Dojos<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj4ZJEGelro6II0svQAy6Yq5iDhYJgbsA0TXLARPyRDOf_u3sXeCbU7eddRZx-0z1dNGxzPd7JIimIDlGav6X5bZe3bTfVE2kAMSY1NoaLMobtVPG9ZkhyDRsOKFkPnq5ObQakvhL4xgJ4/s1600/the_matrix_dojo.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em; text-align: center;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj4ZJEGelro6II0svQAy6Yq5iDhYJgbsA0TXLARPyRDOf_u3sXeCbU7eddRZx-0z1dNGxzPd7JIimIDlGav6X5bZe3bTfVE2kAMSY1NoaLMobtVPG9ZkhyDRsOKFkPnq5ObQakvhL4xgJ4/s320/the_matrix_dojo.jpg" height="232" width="320" /></a></div>
<br />
<br />
Dae gurizada...<br />
<br />
Coding Dojo já é um a prática amplamente utilizada, <a href="http://www.infoq.com/br/articles/codingdojos" target="_blank">há no mínimo 6 anos</a>. Toda vez que eu quero fazer um, saio catando Katas pela internet. Então vai um post pra eu não precisar sair procurando toda vez.<br />
<br />
Primeiramente, o <a href="http://codingdojo.org/cgi-bin/wiki.pl?KataCatalogue" target="_blank">catálogo do codingdojo.org</a> já tem vários Katas interessantes.<br />
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<br />
<br />
<a name='more'></a><br />
<br />
Depois, o resultado básico de uma busca no Google:<br />
<ul>
<li>Pessoal de Sampa fez um <a href="http://www.dtsato.com/blog/2008/10/21/source-of-problems-for-your-coding-dojo/" target="_blank">post sobre isso</a>(e faz tempo);</li>
<li><a href="http://www.butunclebob.com/ArticleS.UncleBob.ThePrimeFactorsKata" target="_blank">Prepared Kata do Uncle Bob</a>;</li>
<li><a href="http://stackoverflow.com/questions/1737427/assignments-i-e-code-kata-for-coding-dojos" target="_blank">Resposta no stackoverflow</a> com vários links;</li>
<li><a href="http://codekata.pragprog.com/" target="_blank">Blog com alguns Katas</a>. Tem alguns Katas bem malucos.. mas vale dar uma olhada.</li>
</ul>
Esse site é do grupo de usuários Scala de Londres. Estive em um dojo na ThoughtWorks lá, e utilizamos esse problema: <a href="http://en.wikipedia.org/wiki/Maze_generation_algorithm">http://en.wikipedia.org/wiki/Maze_generation_algorithm</a><br />
<br />
Eles tem dojos com frequência. Então tem mais katas no site do grupo. <a href="http://www.assembla.com/spaces/lsug-dojo/wiki">ttp://www.assembla.com/spaces/lsug-dojo/wiki</a>.<br />
<br />
Outros Problemas:<br />
<a href="https://en.wikipedia.org/wiki/Conway%27s_Game_of_Life">https://en.wikipedia.org/wiki/Conway%27s_Game_of_Life</a><br />
http://en.wikipedia.org/wiki/Dining_philosophers_problem<br />
<br />
<br />
<br />
Era isso..<br />
AbraçoAlexandre Simundihttp://www.blogger.com/profile/07075473948224038728noreply@blogger.com0tag:blogger.com,1999:blog-7642770694393333804.post-16021919371172812272011-11-29T21:56:00.001-02:002011-11-29T21:57:15.732-02:00Minha carreira no exterior: 1 ano de Europa<div style="text-align: justify;">Dae gurizada...</div><div style="text-align: justify;"><br />
</div><div style="text-align: justify;">Hoje resolvi contar um pouco da minha experiência morando e trabalhando com TI no exterior. Estou morando na Europa faz um pouco mais de 1 ano. Passei 8 meses em Londres e há 6 estou em Dublin.</div><div style="text-align: justify;"><br />
</div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgsFVuCQa7ZW5Q_BJ85f8S_MNvUfDfHydlVM5R6U86ZoOfdWUnJWEaf8oBBzfXHJdDQraFy11VA_cxO9CPMJjP8LkF-FuHHIYsOfxC4lnlMTyj5CceCleR9oW8-iD4k7DF7g71qAfDmxyM/s1600/DSC05210_badresolution.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="266" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgsFVuCQa7ZW5Q_BJ85f8S_MNvUfDfHydlVM5R6U86ZoOfdWUnJWEaf8oBBzfXHJdDQraFy11VA_cxO9CPMJjP8LkF-FuHHIYsOfxC4lnlMTyj5CceCleR9oW8-iD4k7DF7g71qAfDmxyM/s400/DSC05210_badresolution.jpg" width="400" /></a></div><div style="text-align: justify;"><br />
</div><div style="text-align: justify;"><br />
</div><div style="text-align: justify;">Vou contar mais sobre minha experiência em Dublin, pois vim pra cá "com meus próprios pés". Enquanto em Londres, fui como consultor de uma empresa gaúcha, na qual atrabalhei até Junho deste ano.</div><div style="text-align: justify;"><br />
</div><div style="text-align: justify;">Mudei para Dublin na metade de Junho. Cheguei aqui sem nenhuma oprtunidade "pré-arranjada" e acredtio que é essa história que vale a pena ser contada.</div><div style="text-align: justify;"><br />
<a name='more'></a></div><div style="text-align: justify;"><b><span class="Apple-style-span" style="font-size: large;">O mercado - TI como alavanca para sair da crise</span></b></div><div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-align: justify;">A crise de 2008/2009 teve um grande efeito em toda a Europa e na Irlanda a coisa foi feia. Para ter uma idéa, a empresa que trabalho cortou 40% do quadro de funcinários naquela época. Os que ficaram, tiveram seus salários reduzidos, começando pelos diretores. O efeito colateral dessa crise foi a sáida de aproximadamente 40mil Irlanade do país em 2009 e 2010. O principais destinos pra eles são EUA, Canadá e Austrália.<br />
<br />
A situação em geral ainda está complicada, mas existem alguns setores cheios de oportunidades e TI é um deles.<br />
<br />
Um dos diretores da empresa que trabalhei me falou isso há algum tempo atrás e cada vez faz mais sentido pra mim: </div><div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-align: justify;"><br />
</div><div class="separator" style="clear: both; text-align: center;"><a href="http://www.forexmais.com.br/wp-content/uploads/2011/06/forexgratuit-vip-blog-com-405768forex2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em; text-align: justify;"><img border="0" height="200" src="http://www.forexmais.com.br/wp-content/uploads/2011/06/forexgratuit-vip-blog-com-405768forex2.png" width="200" /></a></div><div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-align: justify;"><br />
</div><blockquote class="tr_bq" style="text-align: justify;">Investir em TI, muitas vezes, é uma forma de sair de crises. Redução de custos, eficácia na operação, explorar novos mercados, etc. São estes os objetivos que toda organização, pública ou privada, procura quando os números estão negativos.</blockquote><br />
<div style="text-align: justify;">Acredito que é isso que justiva o mercado de TI estar tão aquecido quando todos os outros estão em baixa. E não estou falando apenas na Irlanda, a Europa toda esta no mesmo barco. Algums países melhores (Reino Unido, Alemanha, etc) outros piores (Espanha, Portugal, Grécia, etc).</div><div style="text-align: justify;"><br />
<div class="separator" style="clear: both; text-align: center;"><a href="http://timesofindia.indiatimes.com/photo/8082879.cms" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://timesofindia.indiatimes.com/photo/8082879.cms" /></a></div><br />
<div style="text-align: center;">Resumindo, a TI aqui está "bombando".</div><br />
</div><div style="text-align: justify;"><b><span class="Apple-style-span" style="font-size: large;">Uma visão rápida sobre imigração</span></b></div><div style="text-align: justify;">Obviamente existem diversas fomar de mudar para outro país. A mais comum e mais fácil é como estudante. Mas na Irlanda, visto de trabalho não é tão difícil assim.</div><div style="text-align: justify;"><br />
</div><div class="separator" style="clear: both; text-align: center;"><a href="http://chacomleite.com/wp-content/uploads/2010/01/passaporte-brasileiro.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="204" src="http://chacomleite.com/wp-content/uploads/2010/01/passaporte-brasileiro.jpg" width="320" /></a></div><div style="text-align: justify;"><br />
</div><div style="text-align: justify;"><br />
</div><div style="text-align: justify;">Basicamente o que você precisa para visto de estudante de 1 ano:</div><ul><li style="text-align: justify;">€3.000 na mão</li>
<li style="text-align: justify;">Curso de ingles de 6 meses pago (cartas da escola)</li>
<li style="text-align: justify;"><b>RESTRIÇÃO: </b>só pode trabalhar 20hs p/ semana nos primeiros 6 meses. Os outros 6 meses pode trabalhar 40hs.</li>
</ul><div style="text-align: justify;">Fiz diversas tentativas para conseguir trabalho "part-time" (20h/semana), mas nenhuma empresa contrata dessa forma. Todas procuram pessoas para trabalhar "full-time".</div><div style="text-align: justify;"><br />
</div><div style="text-align: justify;">O que você precisa para conseguir um visto de trabalho</div><ul><li style="text-align: justify;">Oferta formal de emprego. </li>
<li style="text-align: justify;">Comprovar que você tem os requisitos técnicos para preencher a vaga (certificações, comprovante de experiência, diploma de graduação, etc)</li>
</ul><a href="http://www.djei.ie/labour/workpermits/index.htm">Este link</a> tem mais informações sobre os requisitos necessários para visto de trabalho.<br />
<div style="text-align: justify;"><b><br />
</b></div><div style="text-align: justify;">Eu não sou graduado, no meu caso apresentei os diplomas intermediarios que a minha faculdade oferece, certificações, histórico da faculdade e comprovante de experiência. Deu certo.</div><div style="text-align: justify;"><b><br />
</b></div><div style="text-align: justify;"><b><span class="Apple-style-span" style="font-size: large;">Contratação "overseas" é difícil</span></b></div><div style="text-align: justify;"><br />
<div class="separator" style="clear: both; text-align: center;"><a href="http://www.impactlab.com/wp-content/uploads/2009/11/abroad-jobs-5-300x281.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="299" src="http://www.impactlab.com/wp-content/uploads/2009/11/abroad-jobs-5-300x281.jpg" width="320" /></a></div><br />
Existem diversas empresas dispostas a contratar extrangeiros e prover visto, mas dificilmente uma empresa vai contrar um estrangeiro ser fazer uma entrevista cara-a-cara. Eu fiz alguns contatos antes de chegar aqui e a resposta foi sempre a mesma: "me liga quando estiver na cidade".</div><div style="text-align: justify;"><br />
</div><div style="text-align: justify;">Mas a tentativa é livre. Da uma olhada em: <a href="http://monster.ie/" target="_blank">monster.ie</a> e <a href="http://www.irishjobs.ie/" target="_blank">irishjobs.ie</a></div><div style="text-align: justify;"><br />
</div><div style="text-align: justify;"><b><span class="Apple-style-span" style="font-size: large;">Sorte e meu Greencard</span></b><br />
Inicialmente eu vim para Dublin com a idéia de pegar o visto de estudante. Eu tinha em mãos tudo que era preciso para pegar este visto. O processo de tirar o visto demora entre 1 a 2 meses, pois existe alguns passos a serem seguidos depois que você chega no país: abrir conta em banco, fazer o "CPF", entre outros.<br />
<br />
Quando eu cheguei em Dublin, disparei currículos em vários sites e agências. Viz entrevistas até que achei uma empresa que estava disposta a me prover o greencard.<br />
<br />
Fui na imigração me informar como deveria proceder e recebi a notícia:<br />
<br />
<b>NÃO É POSSÍVEL MUDAR O VISTO DE ESTUDANTE PARA VISTO DE TRABALHO.</b><br />
<br />
A jogada de sorte foi que naquele momento eu não tinha ido na imigração efetivamente fazer o visto de estudante. Estava com um visto provisório, por isso consegui o greencard sem problemas.<br />
<b><br />
</b><br />
#FicaADica, mesmo se você vier como estudante, tente conseguir uma empresar que te dê o greengard ANTES de efetivar o visto.<br />
<b><br />
</b></div><div style="text-align: justify;"><b><span class="Apple-style-span" style="font-size: large;">Dublin, a nova São Paulo</span></b></div><div style="text-align: justify;">São Paulo é o centro econômico do Brasil. Hoje em dia essa centralização está mais "atenuada", mas ainda é a referência. Por muito tempo ela foi a principal cidade onde pessoas de diversar área so país se mudavam em busca de novas oportunidades e uma vida melhor. Olhando pra quantidade de brasileiros que existem aqui, as vezes me parece que Dublin está seguindo o mesmo caminho.<br />
<br />
O fato é que qualquer sub-emprego aqui dá mais grana que muitos "bons empregos" no Brasil. Quem trabalha no Mc Donalds no Brasil, não consegue pagar um aluguel. Trabalhando no Mc Donalds aqui além de conseguir viver "bem", é possível passar as férias em Paris, Roma, Londres, etc.<br />
<br />
A Irlanda é um país pequeno, consequentemente sua capital também. Dublin tem aproximadamente 1.2 milhões de habitantes. com isso a probabilidade de se esbarrar com brasileiros por aqui é bem maior. Isso faz com que você encontre um brasileiro em cada esquina, bar, supermercado, etc.<br />
<br />
O fato é que dentre as principais opções para se esutdar inglês: EUA, Canadá, Austrália, Nova Zelândia, UK; a Irlanda é uma das mais baratas e, por estar na Europa, tem suas vantagens.<br />
<br />
Eu não tenho nenhum problema com isso, mas se você tem um inglês ruim e quer ir morar fora para melhorar eu não recomendaria Dublin. Eu sei que brasileiros existem em todos os lugares, mas procure uma cidade onde tu não esbarre com eles a cada 5min.</div><div style="text-align: justify;"><br />
</div><div style="text-align: justify;"><b><span class="Apple-style-span" style="font-size: large;">Teu inglês não é tão ruim quanto parece</span></b></div><div style="text-align: justify;"><br />
Se tu não fala NADA de inglês você NÃO VAI conseguir trabalho, não importa sua experiencia. Simples assim. Não existe palavra de conforto nem mágica pra isso. Mas o fato é que teu inglês não precisa ser tão maravilhso assim para conseguir um trabalho.<br />
<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><iframe allowfullscreen='allowfullscreen' webkitallowfullscreen='webkitallowfullscreen' mozallowfullscreen='mozallowfullscreen' width='320' height='266' src='https://www.youtube.com/embed/cArRX3bGgKw?feature=player_embedded' frameborder='0'></iframe></div><br />
<div style="text-align: center;">Joel ganhava em torno de R$300mil</div><div style="text-align: center;"><br />
</div><div class="separator" style="clear: both; text-align: center;"><iframe allowfullscreen='allowfullscreen' webkitallowfullscreen='webkitallowfullscreen' mozallowfullscreen='mozallowfullscreen' width='320' height='266' src='https://www.youtube.com/embed/O4zeLlgJ8B0?feature=player_embedded' frameborder='0'></iframe></div><div style="text-align: center;">ganha em torno de R$800mil</div><br />
Entender o que eles falam é mais importarnte que saber falar bem. Quando falo em entender, não me refiro a enteder 100% das palavras e expressões usadas, mas sim entender o que se quer dizer/perguntar.<br />
<br />
Tenho colegas italianos, espanhois, russos e todos tem seu sotaque e suas dificuldades. De certa forma, o pessoal tem paciência com isso.<br />
<br />
<br />
<b><span class="Apple-style-span" style="font-size: large;">A "Tentiada" é livre</span></b><br />
<br />
Se você já consegue se comunicar em ingles e quer morar por aqui, não custa nada tentar. Tanto a Irlanda quanto Canadá e Austrália estão a procura de profissionais de TI.<br />
<br />
Se você tem planos de visitar ou estudar em Dublin, entre em contato com algumas agências, você pode conseguir um emprego durante esse período.<br />
<br />
<br />
Era isso guriazada...<br />
<br />
Qualquer dúvida prende o grito...<br />
<br />
Abraço</div>Alexandre Simundihttp://www.blogger.com/profile/07075473948224038728noreply@blogger.com2Mountjoy Square W, Droim Conrach, Dublin, Co. Cathair Átha Cliath, Ireland53.3561822 -6.258474299999988953.3555312 -6.259091299999989 53.3568332 -6.2578572999999889tag:blogger.com,1999:blog-7642770694393333804.post-8322986196580099782011-11-26T16:03:00.005-02:002011-11-26T16:11:30.110-02:00Scala Tour - Part 1<div style="text-align: justify;"><span class="Apple-style-span" style="font-family: inherit;">Dae gurizada..</span></div><div style="text-align: justify;"><span class="Apple-style-span" style="font-family: inherit;"><br />
</span></div><div style="text-align: justify;"><span class="Apple-style-span" style="font-family: inherit;">Nos últimos meses tenho acompanhado algumas coisas sobre Scala, e minha idéia é criar alguns posts explicando alguns tests.</span></div><div style="text-align: justify;"><span class="Apple-style-span" style="font-family: inherit;"><br />
</span></div><div style="text-align: justify;"><span class="Apple-style-span" style="font-family: inherit;">Vou usar como referência <a href="http://www.scala-lang.org/node/8610">este post do Martin Odersky</a>, pai do Scala, onde ele separa alguns "níveis" de conhecimento.<i> (Não vou entrar no mérito se estes níveis estão certos ou não, só vou usar como referência. E quando digo referência é porque não vou seguir extatamente o que está alí.)</i></span></div><div style="text-align: justify;"><span class="Apple-style-span" style="font-family: inherit;"><br />
</span></div><div style="text-align: justify;"><span class="Apple-style-span" style="font-family: inherit;">Seguindo a idéia do Uncle Bob Martin, vou usar TDD para estudar a linguagem. Então, cada recurso da linaguem vai ser representado com um ou vários testes unitários.</span></div><div style="text-align: justify;"><span class="Apple-style-span" style="font-family: inherit;"><br />
</span></div><div style="text-align: justify;"><span class="Apple-style-span" style="font-family: inherit;">Código fonte: <b><a href="https://github.com/simundi/gyro/tree/master/scala-tour">https://github.com/simundi/gyro/tree/master/scala-tour</a></b></span></div><div style="text-align: justify;"><br />
</div><div style="text-align: justify;"><b><span class="Apple-style-span" style="font-family: inherit; font-size: large;">Ambiente de Desenvolvimento</span></b></div><div style="text-align: justify;"><span class="Apple-style-span" style="font-family: inherit;"><br />
</span></div><div style="text-align: justify;"><span class="Apple-style-span" style="font-family: inherit;">Eu fiz testes rápidos usando o Scala IDE no Eclipse e Eclipse + Maven. Não gostei de nehum deles. Eu encontrei alguns problemas mas não dispensei muito tempo tentando arrumar. Então, não use como base meus problemas para dizer se funciona ou não. Abaixo alguma explicação:</span></div><div style="text-align: justify;"><span class="Apple-style-span" style="font-family: inherit;"></span><br />
<a name='more'></a><span class="Apple-style-span" style="font-family: inherit;"><br />
</span></div><div style="text-align: justify;"><b><span class="Apple-style-span" style="font-family: inherit;">Eclise + Scala IDE + Maven</span></b></div><div style="text-align: justify;"><span class="Apple-style-span" style="font-family: inherit;">Foi minha primeira tentativa. O Scala IDE não funcionou legal com o maven plugin. Não reconheceu as classes Scala e ficou marcando as classes como erro de compialção. </span></div><div style="text-align: justify;"><span class="Apple-style-span" style="font-family: inherit;"><br />
</span></div><div style="text-align: justify;"><span class="Apple-style-span" style="font-family: inherit;">O plugin Scala para o maven funcionou sem problemas. Mas o suporte da IDE não é bom.</span></div><div style="text-align: justify;"><span class="Apple-style-span" style="font-family: inherit;"><br />
</span></div><div style="text-align: justify;"></div><div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-align: justify;"><b><span class="Apple-style-span" style="font-family: inherit;">Scala IDE "puro"</span></b></div><div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-align: justify;"><span class="Apple-style-span" style="font-family: inherit;">Legal, mas achei o suporte pra testes meio pobre. Eu vi que pra fazer isso funcionar tem q fazer uma gamba usando jUnit. Não dei muita atenção e abandonei.</span></div><div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-align: justify;"><span class="Apple-style-span" style="font-family: inherit;"><br />
</span></div><div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-align: justify;"><span class="Apple-style-span" style="font-family: inherit;"><br />
</span></div><div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-align: justify;"><span class="Apple-style-span" style="font-family: inherit; font-size: large;"><b>Então parti para o SBT - Simple Build Tool</b></span></div><div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-align: justify;"><span class="Apple-style-span" style="font-family: inherit;"><br />
</span></div><div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-align: justify;"><span class="Apple-style-span" style="font-family: inherit;">Depois de reclamar um pouco no <a href="https://twitter.com/#!/simundi/status/138765048045780992">twitter</a> o Diego Pacheco <a href="https://twitter.com/#!/diego_pacheco/status/138768749644890112">me deu a dica do sbt</a>. e então comecei a gostar.</span></div><div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-align: justify;"><span class="Apple-style-span" style="font-family: inherit;"><br />
</span></div><div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-align: justify;"><span class="Apple-style-span" style="font-family: inherit;">As instalação do SBT é simples e você encontra instruções aqui: <a href="https://github.com/harrah/xsbt/wiki/Getting-Started-Setup">Sbt Wiki - Setup Guide</a></span></div><div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-align: justify;"><span class="Apple-style-span" style="font-family: inherit;">Pra quem usa Mac recomendo usar o brew pra fazer essas instalações.</span></div><div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-align: justify;"><span class="Apple-style-span" style="font-family: inherit;"><br />
</span></div><div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-align: justify;"><span class="Apple-style-span" style="font-family: inherit;">Estou usando a versão 0.10 do sbt e ela teve algumas mudanças nesta versão que causaram um pouco de confusão. </span></div><div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-align: justify;"><span class="Apple-style-span" style="font-family: inherit;"><br />
</span></div><div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-align: justify;"><span class="Apple-style-span" style="font-family: inherit;">Nas versões anteriores o SBT criava a esturuta básica do projeto, que é semelhante a do maven. Mas nessa versão eles removeram esse comportament. <a href="https://github.com/harrah/xsbt/issues/56">Da uma olhada nesse post de Jul/11</a>. Você tem que criar na mão ou usar outra ferramenta, como o giter8.</span></div><div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-align: justify;"><span class="Apple-style-span" style="font-family: inherit;"><br />
</span></div><div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-align: justify;"><b><span class="Apple-style-span" style="font-family: inherit;">Giter8</span></b></div><div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-align: justify;"><span class="Apple-style-span" style="font-family: inherit;"><br />
</span></div><div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-align: justify;"><span class="Apple-style-span" style="font-family: inherit;">Aproveitando, já usei o Giter8 que também é bem barbada. Ele é funciona basicamente como o "arch types" do maven. </span></div><div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-align: justify;"><br />
</div><div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-align: justify;"><span class="Apple-style-span" style="font-family: inherit;"><a href="https://github.com/n8han/giter8">Link do turorial de instalação</a>.</span></div><div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-align: justify;"><br />
</div><div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-align: justify;">Eu não lembro mais qual o template que eu usei, mas você pode copiar do meu repositório.</div><div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-align: justify;"><br />
</div><div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-align: justify;"><b><span class="Apple-style-span" style="font-size: large;">Aprendendo Scala com TDD</span></b></div><div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-align: justify;"><br />
</div><div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-align: justify;">Lendo o livro Clean Code do Uncle Bob ele menciona sobre aprender um framework usando TDD. A idéia é interessante e decidi fazer um teste no aprendizado de Scala.</div><div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-align: justify;"><br />
</div><div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-align: justify;">Scala tem dois princpais test frameworks <a href="http://www.scalatest.org/">Scala Test</a> e <a href="http://etorreborre.github.com/specs2/">Scala Specs</a>. Primeiramente eu escolhi o Scala Test porque ele foi a primeira opção que aparece no Google. (obviamente, pois eu busquei por "scala test").</div><div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-align: justify;"><br />
</div><div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-align: justify;">Depois dando uma lida <a href="http://stackoverflow.com/questions/2220815/whats-the-difference-between-scalatest-and-scala-specs-unit-test-frameworks">nesse post</a> me pareceu que o Scala Test é mais flexível enquando o Scala Spects é mais tendensioso no uso de BDD. Não tenho nenhuma opnião formada ainda e também não estou interessado nisso agora. </div><div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-align: justify;"><br />
</div><div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-align: justify;">A instalação dele com sbt é simples, só a dicionar a dependência no "build.sbt"</div><div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-align: justify;"><br />
</div><div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-align: justify;"></div><div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-align: justify;">libraryDependencies ++= Seq(</div><div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-align: justify;"> "org.scalatest" %% "scalatest" % "1.6.1" % "test"</div><div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-align: justify;">)</div><div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-align: justify;"><br />
</div><div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-align: justify;">O legal é que você pode usar "Continuos Build" e deixar o compilador roando em background. Enquanto você escreve/modifica o código ele vai compilando e executando os testes.<br />
<br />
Dentro do projeto, rode "sbt" e depois "~ test". <a href="https://github.com/harrah/xsbt/wiki/Getting-Started-Running">Mais informações aqui</a></div><div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-align: justify;"><br />
</div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiOd1zKbp8eKoGA0GKFRHIpKaYoOz6zm_CBT7g3Q-aGTGwrD7D7bXJ6W6aKmj-BKej6fcec8w6X2tIVuEsEhpSzp76Q7LPDqV8OznH5DfeNA2S-ImfD3exEniHXIwo6Yh_Hz4p2vVUv444/s1600/Screen+Shot+2011-11-26+at+17.56.56.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="360" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiOd1zKbp8eKoGA0GKFRHIpKaYoOz6zm_CBT7g3Q-aGTGwrD7D7bXJ6W6aKmj-BKej6fcec8w6X2tIVuEsEhpSzp76Q7LPDqV8OznH5DfeNA2S-ImfD3exEniHXIwo6Yh_Hz4p2vVUv444/s640/Screen+Shot+2011-11-26+at+17.56.56.png" width="640" /></a></div><div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-align: justify;"><br />
</div><br />
<div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-align: justify;"><br />
</div><div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-align: justify;">Agora com o ambiente pronto vai começar a brincadeira.</div><div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-align: justify;"><br />
</div><div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-align: justify;">Era isso...</div><div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-align: justify;"><br />
</div><div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-align: justify;">Abraço,</div><div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-align: justify;">Simundi</div><div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-align: justify;"><br />
</div><div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-align: justify;"><br />
</div>Alexandre Simundihttp://www.blogger.com/profile/07075473948224038728noreply@blogger.com0Mountjoy Square W, Droim Conrach, Dublin, Co. Dublin, Ireland53.3561822 -6.258474299999988953.3555312 -6.259091299999989 53.3568332 -6.2578572999999889tag:blogger.com,1999:blog-7642770694393333804.post-71271995286372685932011-08-02T18:49:00.000-03:002011-08-02T18:49:56.956-03:00Arquiteto de Software: O que você espera saber?<div style="text-align: justify;"><br />
</div><div style="text-align: justify;">Atualmente ando repensando os caminhos da minha carreira profissional e resolvi colocar na ponta do lápis os conhecimentos que gostaria de adquirir nos próximos meses. </div><div style="text-align: justify;"><br />
</div><div style="text-align: justify;">Então criei esse mapa mental sobre o que EU acredito que um Arquiteto de Software deva conhecer. </div><div style="text-align: justify;"><br />
</div><div style="text-align: justify;">Mas espere! É óbvio que não estou criando uma receita de bolo, até porque não tenho condições para isso. <b>É apenas uma reflexão e </b><b>AGUARDO COMENTÁRIOS.</b></div><div style="text-align: justify;"></div><a name='more'></a><br />
<br />
<div style="text-align: justify;">Sei que é meio chavão, mas TI é um organismo vivo, muda MUITO rápido. Se tivesse feito esse mind map há 3 meses com certeza seria diferente. Da mesma forma, daqui a três meses provavelmente será.</div><div style="text-align: justify;"><br />
</div><div style="text-align: justify;"><b><br />
</b></div><div style="text-align: justify;"><br />
</div><div style="text-align: justify;">Então segue:</div><div style="text-align: justify;"><br />
</div><div style="text-align: justify;"><br />
</div><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgJVPlrelJv8udAgLKpAA0VU6rhblyOQ_GnBY2FBBaKKbNMzA9-XCf-cbn8B7SQAGedGyksfph2TxR9jxk38_rj7qEiX_CsJrAjTjeDswpN6-nlEmtCcwjpqBX4r3WFxzYtTtqFZJ6vLJA/s1600/Software+Architecture+Development+Plan.jpeg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="298" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgJVPlrelJv8udAgLKpAA0VU6rhblyOQ_GnBY2FBBaKKbNMzA9-XCf-cbn8B7SQAGedGyksfph2TxR9jxk38_rj7qEiX_CsJrAjTjeDswpN6-nlEmtCcwjpqBX4r3WFxzYtTtqFZJ6vLJA/s640/Software+Architecture+Development+Plan.jpeg" width="640" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">versão 1.0</td></tr>
</tbody></table><div style="text-align: justify;"><br />
</div>Alexandre Simundihttp://www.blogger.com/profile/07075473948224038728noreply@blogger.com3tag:blogger.com,1999:blog-7642770694393333804.post-81256800813045100632011-07-27T14:33:00.000-03:002011-07-27T14:33:54.619-03:00Eclipse Fullscreen no Mac OS LionDae gurizada..<br />
<br />
Pra quem usa Mac com o Lion, segue uma o link de um Plugin para dexiar o Eclipse em Fullscreen mode.<br />
<br />
<a href="http://alblue.bandlem.com/2011/07/full-screen-support-for-eclipse-on-osx.html">http://alblue.bandlem.com/2011/07/full-screen-support-for-eclipse-on-osx.html</a><br />
<br />
Basicamente é ir em: "Help -> Install new software" e colocar a URL: <span class="Apple-style-span" style="color: #cccccc; font-family: monospace; font-size: 13px; line-height: 18px;"><a href="http://github.bandlem.com/">http://github.bandlem.com/</a></span><br />
<br />
Fica a dica...<br />
<br />
era isso..Alexandre Simundihttp://www.blogger.com/profile/07075473948224038728noreply@blogger.com0tag:blogger.com,1999:blog-7642770694393333804.post-38834810745386996962011-07-27T09:28:00.000-03:002011-07-27T09:28:48.125-03:00Rode seus testes com jetty fácil..Dae guriazada..<br />
<br />
Eu conheço o Jetty faz algum tempo, mas nunca dei muita bola pra ele até ver como é fácil rodar uma aplicação web com ele. É perfeito pra fazer testes!!!<br />
<br />
Este post é mais para eu mesmo lembrar do como fazer..rsrsrs<br />
<br />
<br />
Primeiro crie uma aplicação web com maven. Tem várias turorais por ai sobre como fazer isso.<br />
<br />
Mas basicamente essa deve ser a estrutura do projeto:<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi_-5bl5SBji8TnE5SBdKYukXWEJ-BV3_RON0gaSRoFvanC0jiMOhWKwnQ1UBE-cHbiyYJPDydI2KhV8gw8BbTOobomPoACNVTQdoQ1jHWL68kqUkoIRJUsnlzuv9zOo2W6G4zQ_BzlNqE/s1600/Screen+Shot+2011-07-27+at+13.24.47.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi_-5bl5SBji8TnE5SBdKYukXWEJ-BV3_RON0gaSRoFvanC0jiMOhWKwnQ1UBE-cHbiyYJPDydI2KhV8gw8BbTOobomPoACNVTQdoQ1jHWL68kqUkoIRJUsnlzuv9zOo2W6G4zQ_BzlNqE/s1600/Screen+Shot+2011-07-27+at+13.24.47.png" /></a></div><br />
Incluir o plugin do maven par rodar a aplicação com Jetty:<br />
<br />
<pre class="brush:xml"><build>
<plugins>
<plugin>
<groupid>org.mortbay.jetty</groupid>
<artifactid>maven-jetty-plugin</artifactid>
<configuration>
<contextpath>/jetty-test</contextpath>
<connectors>
<connector implementation="org.mortbay.jetty.nio.SelectChannelConnector">
<port>8080</port>
</connector>
</connectors>
</configuration>
</plugin>
</plugins>
</build>
</pre>Acredito que esteja claro os parâmetros que o plugin recebe (contexto e porta). <a href="http://docs.codehaus.org/display/JETTY/Maven+Jetty+Plugin">Mais informações sobre o plugin aqui</a>.<br />
<br />
<br />
No console é só digitar:<br />
<blockquote>mvn jetty:run</blockquote><br />
Depois acessar a url: <a href="http://localhost:8080/jetty-test/">http://localhost:8080/jetty-test/</a><br />
<br />
<br />
E feito o carreto...<br />
<br />
<br />
Era isso. AbraçoAlexandre Simundihttp://www.blogger.com/profile/07075473948224038728noreply@blogger.com0Dublin, Co. Fingal, Ireland53.344103999999987 -6.267493699999931853.244716999999987 -6.5055231999999314 53.443490999999987 -6.0294641999999321tag:blogger.com,1999:blog-7642770694393333804.post-24058478019486771782011-07-22T19:20:00.004-03:002013-03-03T12:12:44.597-03:00Primeiro contato com Node.j e mais sobre non-blocking servers<div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://twimg0-a.akamaihd.net/profile_images/1437021459/nodejs-dark.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="237" src="https://twimg0-a.akamaihd.net/profile_images/1437021459/nodejs-dark.png" width="320" /></a></div>
<br />
Dae gurizada..<br />
<div>
<br /></div>
<div>
Na sequência do meus estudos sobre non-blocking web servers vou dar uma olhada no Node.js.</div>
<div>
<br /></div>
<div>
<b>Instalação: </b><a href="https://github.com/joyent/node/wiki/Installation">https://github.com/joyent/node/wiki/Installation</a></div>
<div>
<br /></div>
<div>
Vou utilizar como base <a href="http://www.youtube.com/watch?v=jo_B4LTHi3I&feature=player_embedded">esta apresentação do Ryan Dahl</a>, que está disponível no site do <a href="http://nodejs.org/">node.js</a></div>
<div>
<br />
Antes de olhar sobre Node.js é importante entender o <a href="http://simundi.blogspot.com/2011/07/c10k-problem-o-que-deft-nodejs-netty-e.html">C10K Problem e Non-blocking I/O</a><br />
<br /></div>
<div>
<b><span class="Apple-style-span" style="font-size: large;">Node.js</span></b></div>
<div>
Node.js nada mais é que uma biblioteca que roda em cima do virutal machine chamada <a href="http://code.google.com/p/v8/">v8</a>. V8 é uma JavaScript Engine escrita pelos engenheiros da Google e é utilizada no Google Chrome.</div>
<div>
<br /></div>
<div>
Node utiliza o v8 para fazer o trabalho de comunicação (networking) corretamente. </div>
<div>
<br /></div>
<div>
<b><span class="Apple-style-span" style="font-size: large;">Não existe "waiting time"</span></b></div>
<div>
Óbvio, é isso que faze dele um non-blocking server: Não ter "waiting time".</div>
<div>
<br /></div>
<div>
Você não consegue mandar o node dormir (sleep). Não é que você seja encorajado a não fazer um "sleep", na verdade você não tem poder para isso. </div>
<div>
<br /></div>
<div>
O que o Node faz é definir Timeouts e deixar processos em idle (ocioso), fazendo com que o consumo de CPU vá para zero.<br />
<div>
<br /></div>
</div>
<div>
De uma olhada nesse código:<br />
<br />
<a name='more'></a><br />
<br />
<pre class="brush: javascript"> setTimeout( function(){
console.log("world");
}, 2000
)
console.log("hello");
</pre>
<div>
<br />
A função timeout do java script está recebendo dois argumentos:<br />
<ol>
<li>Uma função callback que será executada depois do tempo de espera</li>
<li>o tempo de espera em milisegundos</li>
</ol>
<span class="Apple-style-span" style="font-family: monospace; white-space: pre;">//output</span><br />
<pre class="brush: javascript">hello
world
</pre>
O que acontece aqui é que o programa não para quando chamo "setTimeout". O programa segue o o código que está dento da função passada para o "setTime" fica em idle e espera 2 segundos para ser executado.<br />
<br />
<span class="Apple-style-span" style="color: red;">Node nunca pára!</span></div>
<br />
<b><span class="Apple-style-span" style="font-size: large;">O script não termina quando chega ao fim</span></b></div>
<div>
Mudei o código e chamei a função <i>setInterval()</i> ao invés da <i>setTimeout()</i>. Essa função executa a função recebida como parâmetro infinitamente a cada X milesegundos, definido no segundo argumento.<br />
<br />
<pre class="brush: javascript"> setInterval( function(){
console.log("world");
}, 2000
)
console.log("hello");</pre>
O resultado foi:<br />
<br />
<pre class="brush: javascript">hello
world
world
world
world
world
world
</pre>
<div>
<br /></div>
Note que o script chegou ao fim, ou seja, executou a última linha de comando. Mas o programa continou sendo executando devido a chamada da função <i>setInterval()</i>.<br />
<br />
O lado bom disso é que você pode escrever tudo que precisa ser feito e não precisa se preocupar como manter o processo ativo.<br />
<br />
Um ctrl + C resolve a parada.<br />
<br />
<b><span class="Apple-style-span" style="font-size: large;">Simples web server</span></b><br />
<br />
Abaixo está um exemplo de como criar um servidor http. Esse é o mesmo código que está no site do Node.<br />
<br />
<pre class="brush: javascript">var http = require('http');
var server = http.createServer(
function(request, response){
response.writeHead(200, {'content-type':'text/plain'});
response.end("Hello Wrold\n");
}
);
server.listen(8080);
console.log("Server running at http://localhost: 8080");
</pre>
<br />
<br />
A primeira linha carrega o pacote http. Depois disso criamos o serviço e definos a função que irá tratar cada requisição ao servidor.<br />
<br />
Para iniciar o servidor basta digitar "node test3-httpServer.js" e será iniciado.<br />
<br />
Fiz uma requisição utilizando o comando "curl" com o parâmetro "-i" para retornar o cabeçalho HTTP. <br />
<br />
<pre class="brush: cpp">simundi@simundi ~ $ curl -i http://localhost:8080
HTTP/1.1 200 OK
content-type: text/plain
Connection: keep-alive
Transfer-Encoding: chunked
Hello Wrold
</pre>
<br />
<br />
Analisando o cabeçalho temos:<br />
<br />
<ul>
<li><b>Versão 1.1: </b> a última versãõ HTTP</li>
<li><b>Código 200:</b> significa que a requisção foi bem sucedida.</li>
<li><b>Connection keep-alive:</b> vai fazer com que a conexão TCP não seja enerrada logo após a reposta. O que é bom. Afinal, criar conexão TCP toda hora é um custo desnecessário.</li>
<li><b><span class="Apple-style-span" style="color: red;">Transfer-encoding Chunked:</span></b> esse vale a pena explicar bem</li>
</ul>
<br />
<b><span class="Apple-style-span" style="font-size: large;">Transfer-encoding: Chunked / Resposta Assíncrona</span></b><br />
<br />
Antes de entender este atributo, vamos ver como as coisas funcionam sem ele. Um dos atributos existentes no cabeçalho HTTP é o Content-lenght, que diz o tamnho da reposta que está chegando do servidor. Dessa forma o browser(ou outro cliente) sabe quando a reposta terminou de ser enviada.<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="http://www.websequencediagrams.com/cgi-bin/cdraw?lz=QnJvd3Nlci0-U2VydmVyOiBTZW5kIGFueSByZXF1ZXN0CgATBi0-ACMHOiByZXBvbnNlIHRoZSB3aG9sZQAjCCwgaW5jbHVkaW5nABgFQ29udGVudC1MZW5ndGgKCg&s=napkin" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="249" src="http://www.websequencediagrams.com/cgi-bin/cdraw?lz=QnJvd3Nlci0-U2VydmVyOiBTZW5kIGFueSByZXF1ZXN0CgATBi0-ACMHOiByZXBvbnNlIHRoZSB3aG9sZQAjCCwgaW5jbHVkaW5nABgFQ29udGVudC1MZW5ndGgKCg&s=napkin" width="640" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Reposta com Content-Length in the header.</td></tr>
</tbody></table>
<br />
Com o "Transfer-enconding" definido como "Chunked" NÃO TEM Content-Length. Ou seja, para o browser a resposta vai continuar chegando para sempre, até que o servidor informe que a resposta acabou.<br />
<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="http://www.websequencediagrams.com/cgi-bin/cdraw?lz=QnJvd3Nlci0-U2VydmVyOiBTZW5kIGFueSByZXF1ZXN0CgATBi0-ACMHOiBzZW5kIHBhcnQgb2YgcmVwb25zZSAod2l0aG91dCBDb250ZW50LUxlbmd0aCkAKBdvdGhlcgA8CXRoZQBBCABdEmFuACgFAHEXdGhlIGZpbmFsIGNvbW1hbmQK&s=napkin" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="426" src="http://www.websequencediagrams.com/cgi-bin/cdraw?lz=QnJvd3Nlci0-U2VydmVyOiBTZW5kIGFueSByZXF1ZXN0CgATBi0-ACMHOiBzZW5kIHBhcnQgb2YgcmVwb25zZSAod2l0aG91dCBDb250ZW50LUxlbmd0aCkAKBdvdGhlcgA8CXRoZQBBCABdEmFuACgFAHEXdGhlIGZpbmFsIGNvbW1hbmQK&s=napkin" width="640" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Enviando a resposta é enviada em "prestações"</td></tr>
</tbody></table>
<br />
Agora vou mostar um exemplo disso no node.<br />
<br />
<pre class="brush: javascript">var http = require('http')
var server = http.createServer(
function(request, response){
response.writeHead(200, {'content-type':'text/plain'});
response.write("Hello world\n")
setTimeout( function() {
response.end("Second answer\n")
},2000 );
response.write("end of the script\n")
}
);
server.listen(8080);
console.log("Server running at http://localhost: 8080");
</pre>
<br />
Output:<br />
<pre class="brush: javascript">Hello world
end of the script
later response</pre>
<br />
Nesse exemplo o programa escreve "hello world" e "end of script" direto. Depois de 2 segundos ele escreve "later response". Note que é código "response.end" que informa ao cliente que a resposta acabou. Isso é o que o "Transfer-Coding: Chunked" faz.<br />
<br />
<br />
Outra coisa importante que de se notar é que entre a resposta "end of the script" e "later response" o servidor não parou. Ele continua rodando e disponível para receber novas requisições.<br />
<br />
Código dos exemplos: <a href="https://github.com/simundi/gyro/tree/master/lab/nodejs">https://github.com/simundi/gyro/tree/master/lab/nodejs</a><br />
<br />
<br />
Por hoje é só. Node tem várias outras funcionalidades, mas estas vão ficar para outra hora.<br />
<br /></div>
</div>
Alexandre Simundihttp://www.blogger.com/profile/07075473948224038728noreply@blogger.com0Mountjoy Sq., Dublin, Co. Dublin City, Ireland53.3566861 -6.257529299999987426.609281099999997 -66.023154299999987 80.1040911 53.508095700000013tag:blogger.com,1999:blog-7642770694393333804.post-39017716325002861182011-07-19T21:27:00.004-03:002011-07-20T10:51:50.983-03:00C10K Problem. O quê Deft, Node.js, Netty e outros estão solucionando<div style="text-align: justify;">Dae gurizada,</div><div style="text-align: justify;"><br />
</div><div style="text-align: justify;">A idéia de olhar para esse problema surgiu depois que o Diego Pacheco me deu a missão de falar sobre Deft e Loft em um lighting talk que fizemos há algumas semanas atrás.</div><div style="text-align: justify;"><br />
</div><div style="text-align: justify;">O grande impecílio que tive para entender o conceito dos servidores Deft e Loft foi de entender o problema. Eis a motivação do post.<br />
<br />
O que vou tentar explicar são as limitações existetes que fazem com alguns servidores não consigam processar mais que 10mil requisições simultâneas. E (se tudo der certo) você vai entender porque servidors como Deft, Loft, Tornado, Netty, Node.js e outros tem um desempenho diferente que os sservidores normais. </div><div style="text-align: justify;"><br />
<b><span class="Apple-style-span" style="font-size: large;">C10k Problem</span></b></div><div style="text-align: justify;"><br />
</div><div style="text-align: justify;">C10k significa 10.000 (dez mil) conexões simultâneas. Este é a limitação de conexões silmutaneas da maioria dos servidores de aplicação.</div><div style="text-align: justify;"><br />
</div><div style="text-align: justify;">Isso acontece devido a forma que os servidores trabalham com cada conexão recebida.</div><div style="text-align: justify;"><br />
</div><div style="text-align: justify;">Muitas destes problemas são ocasionaos pela forma que o servidor foi impelmentado e de como o Sistema Operaciona (OS) trabalha com sockets.</div><div style="text-align: justify;"><br />
</div><div style="text-align: justify;">Eu vou descrever algumas destas limitações abaixo.</div><div style="text-align: justify;"><br />
<a name='more'></a><br />
</div><div style="text-align: justify;"><b><span class="Apple-style-span" style="font-size: large;">Análise de um servidor</span></b></div><div style="text-align: justify;">Quem já trabalhou com Sockets em Java, já devem ter visto esse código:</div><div style="text-align: justify;"><br />
</div><pre class="brush:java">...
ServerSocket welcomeSocket = new ServerSocket(8080);
while(true){
Socket connectionSocket = welcomeSocket.accept();
...
}
...
</pre><br />
<br />
Código simples, abre um socket na porta 8080 e fica esperando conexões.<br />
<div style="text-align: justify;"><br />
</div><div style="text-align: justify;">Basicamente isso é que os servidores web fazem. É óbvio que eles trabalham de uma forma mais complexa envolvendo threads, alocações de recursos, etc.</div><div style="text-align: justify;"><br />
</div><div style="text-align: justify;">Seguindo no nosso exemplo simples, poderíamos criar uma thread para processar cada requsição. Fazendo assim que o servidor estejá disponível para aceitar (<i>accept()</i>) uma nova conexão.</div><div style="text-align: justify;"><br />
</div><pre class="brush:java">...
ServerSocket welcomeSocket = new ServerSocket(6789);
while(true){
Socket connectionSocket = welcomeSocket.accept();
final new Thread(new Runnable() {
@Override public void run() {
//do anything
}
}).start();
...
</pre><br />
<br />
<div style="text-align: justify;">Nesa forma por exemplo, vamos criar diversar thread para atender as requisições dos clientes. Na perspetiva do SO, temos uma Thread em nível de SO e várias threads na JVM.<br />
<br />
Além dessas threads que estamos criando, o sitema operacional também exerce um tipo de controle sobre as conexões abertas. Cada cliente é um "flie descriptor" aberto no SO.<br />
<br />
<b>O importante aqui é entender que cada <i>accept()</i> vai gerar um file descriptor novo.</b><br />
<b><br />
</b><br />
<b><span class="Apple-style-span" style="font-size: large;">File Descriptor (FD)?</span></b></div><div style="text-align: justify;"><b><br />
</b></div><div style="text-align: justify;">O SO tem o chamado "file descriptor" que basicamente é cada processo (socket, arquivo, fila, etc) existente no SO. Isso incluí processos ativos e "em espera" (waiting).</div><div style="text-align: justify;"><br />
</div><div style="text-align: justify;">Existe um limite de open files que o sistema operacional consegue gerenciar. Por esse motivo utilizar uma thread para cada cliente pode ser tornar um problema, pois irá consumir uma quantidade considerável de recusros.<br />
<br />
<b>OBS:</b> Calma! Não é qualquer sistema que precisa se preocupar com isso. Tudo depende da "Frequência" de acessos e do "Volume" de dados ... ;)</div><div style="text-align: justify;"><br />
<b><span class="Apple-style-span" style="font-size: large;">O Peso de ter muitos processos</span></b><br />
<b><br />
</b><br />
Não vou entrar muito afundo nesse ponto, mas a explicação simples é: ter muitos processos abertos CUSTA CARO para o SO.<br />
<br />
Óbvio, quanto mais processos mais difícil vai ser o trabalho do escalonador do OS.<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg2EuzIKiBwbcrRKD8F9cc-oxKlYgsRvy730h71aNwsPTh_LhuEnx33s_y2HK1MGFqmxceb6DtEfME-gBq3sWuD8NfcNIx2Yr4pnxCl_Qrs6-ofe_pY2fBFWs-HPc00z4o1i2WVx8Qu1Mw0/s640/Metro_Lotado04.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="210" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg2EuzIKiBwbcrRKD8F9cc-oxKlYgsRvy730h71aNwsPTh_LhuEnx33s_y2HK1MGFqmxceb6DtEfME-gBq3sWuD8NfcNIx2Yr4pnxCl_Qrs6-ofe_pY2fBFWs-HPc00z4o1i2WVx8Qu1Mw0/s320/Metro_Lotado04.jpg" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Todos esperando sua hora de entrar...</td></tr>
</tbody></table> Além disso, temos o consumo de memória. Quando mais processos mais memória e... você sabe<br />
<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="http://www.twiddlegeek.com/wp-content/uploads/2011/05/1304455547-98.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="213" src="http://www.twiddlegeek.com/wp-content/uploads/2011/05/1304455547-98.jpg" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Out of memory... </td></tr>
</tbody></table>Essa apresentação fala muito bem sobre isso: <a href="http://bulk.fefe.de/scalable-networking.pdf">http://bulk.fefe.de/scalable-networking.pdf</a><br />
<br />
<br />
<div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"><b><span class="Apple-style-span" style="font-size: large;">Blocking e Non-blocking I/O</span></b></div><br />
<br />
Seguindo os conceitos importantes de entender é o Blocking e Non-blocking I/O.<br />
<br />
Imagine uma conexão com um servidor, onde é feito uma operação de leitura. Neste momento NÃO há nada para ser lido. Nesse caso, podem acontecer duas coisas:<br />
<br />
1) Esperar até que uma resposta seja dada pelo servidor <b>(blocking)</b><br />
2) Retornar imediatamente um erro dizendo que não há informações para serem lidas <b>(non-blocking) </b><br />
<br />
<b>OBS:</b> quando falo em resposta, não me refiro repsota para o usuário final, mas sim em baixo nível mesmo.<br />
<br />
<b>Blocking</b><br />
Comportamento comum dos servidores. Você chama uma operação "read()" e o programa fica esperando até que uma resposta seja dada.<br />
<br />
<b>Non-Blocking</b><br />
Existem duas formas de trabalhar com Non-Blocking I/O.<br />
<br />
1) Fazendo polling, que é ficar tentando ler alguma coisa a cada X tempo.<br />
2) Utlizar notificação assíncrona. Isso significa que o servidor irá gerar um evento infornado que existe coisa para ser lida.<br />
<br />
O SO gera um evento informando que o socket/FD está pronto para ser lido?? Como???<br />
<br />
<br />
</div><div style="text-align: justify;"><b><span class="Apple-style-span" style="font-size: large;">Como são feitos Non-blockings I/O</span></b><br />
<br />
Vou explicar alguns recursos do SO que "produzem" os non-blockings I/O. Esses são os comandos que o SO provê para você saber quando tem algo para ser lido em um socket/FD.<br />
<br />
Ao longo do tempo alguns comandos surgiram e forão substituídos: "Select", "Poll", "Dev/Poll", "epoll" e "kqueue". Cada sistema operacional tem seus próprios comandos.<br />
<br />
</div><div style="text-align: justify;"><b>poll0</b><br />
O comando poll() avisa quando um conjunto de FDs está pronto para ser lido. Esse comando fica lento quando se tem milhares de FDs, pois muitos dos FDs podem estar idle (ocioso) e varrer todos leva muito tempo.<br />
<br />
Se nada for lido nesse File Descriptor, o próximo comando Poll vai dizer que ainda tem coisa para ser lida.<br />
<br />
<b>dev/poll</b><br />
<b><span class="Apple-style-span" style="font-weight: normal;">Com este comando você avisa o SO apenas uma fez quais os FD vocês está interessado. Você faz isso com um "handler". A partir daí você lê um conjunto de FDs prontos para serem lidos, apartir desse "handler".</span></b><br />
<b><span class="Apple-style-span" style="font-weight: normal;"><br />
</span></b><br />
<b><span class="Apple-style-span" style="font-weight: normal;">Esse comando foi cirado para subistituir o <i>poll()</i> no Solaris. Não é recomendada sua utlização no Linux. </span></b><br />
<b><span class="Apple-style-span" style="font-weight: normal;"><br />
</span></b><br />
<b>epoll()</b><br />
Esse é o comando que subistituí o <i>poll()</i> na versão 2.6 do Kernel do Linux. Ele agrupa eventos redundantes e tem trabalha the forma eficiente com eventos em massa, fazendo que tenha uma ótima escalabilidade quando utilizado com grande número de FDs.<br />
<br />
Ele pode ser utilizado com <a href="http://en.wikipedia.org/wiki/Interrupt#Edge-triggered">edge-triggered</a> e <a href="http://en.wikipedia.org/wiki/Interrupt#Level-triggered">level-triggered</a>, que são formas de interrupções utilizadas para otimizar a utlização de CPU.<br />
<br />
<b>kqueue()/kevent()</b><br />
Esse comando é similiar com o <i>epoll()</i>. Na verdade foi criado antes dele, mas para o FreeBSD. O pessoal do Linux criou um novo comando ao invés de uitlizar este.<br />
<br />
<b><br />
</b><br />
<br />
<div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"><b><span class="Apple-style-span" style="font-size: large;">Estratégias de I/O</span></b></div><div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"><br />
</div><div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;">Um pouco mais embasado, podemos olhar algumas estratégias de implementar um servidor. Usando non-blocking, usando threads, etc.</div><div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"><br />
</div><div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;">Isso é uma cópia direta <a href="http://www.kegel.com/c10k.html#strategies">desse link</a>.</div><ul><li>Como utitilizar deversas chamadas de I/O para uma simples thread.</li>
<ul><li>Não usar blocking I/O e se possível usar multi-threading e processos para alcançar concorrência. </li>
<li>Usar chamadas non-blocking (ex: write() em um socket setado O_NONBLOCK) para iniciar o I/O, e as notificações de leitura de eventos (e.g. poll() ou /dev/poll) para saber quando o canal está pronto para leitura. </li>
<li>Usar chamadas assíncronas para começar o I/O e notificações de de encerramento do I/O.</li>
</ul></ul><ul><li>Como controlar o código de cada cliente<ul><li>Um processo para cada cliente (abordagem clássica do Unix)</li>
<li>Uma thread no SO lida com vários clientes. Cada cliente pode ser controlado por: <ul><li>user-level thread </li>
<li>state machine</li>
<li>continuation</li>
</ul></li>
<li>Uma OS-level thread para cada cliente (e.g. classic Java with native threads)</li>
<li>Uma OS-level thread para cada cliente ativo (e.g. Tomcat com Apache na frente; NT completion ports; thread pools)</li>
</ul></li>
</ul></div><div style="text-align: justify;"><span class="Apple-style-span" style="font-size: large;"><b>Conclusão</b></span></div><div style="text-align: justify;"><br />
Utilizar non-blocking I/O e evitar grande número de threads é a basde da nova geração de servidores. Com isso é possível atender um númeor muito maior de requisições por máquina.<br />
<blockquote>"Processos são necessários para escalar computadores muilt-core, não threads compartilhadoras de memória. Os fundamentos dos systemas escaláveis são rápido networking e non-blocking design. O resto é mensageria"<br />
<i>Node.js website</i></blockquote><b><span class="Apple-style-span" style="font-size: large;">Referências</span></b></div><div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"><div style="text-align: justify;"><b><span class="Apple-style-span" style="font-size: large;"><br />
</span></b></div></div><div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"><div style="text-align: justify;">http://www.kegel.com/c10k.html</div></div><div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"><div style="text-align: justify;">http://nodejs.org/#about</div></div><div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"><div style="text-align: justify;">http://bulk.fefe.de/scalable-networking.pdf</div><div style="text-align: justify;">http://www.citi.umich.edu/projects/linux-scalability/reports/accept.html</div></div><div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"><div style="text-align: justify;">http://urbanairship.com/blog/2010/08/24/c500k-in-action-at-urban-airship/</div><div style="text-align: justify;">http://www.techrepublic.com/article/using-the-select-and-poll-methods/1044098</div><div style="text-align: justify;">http://www.developerfusion.com/article/28/introduction-to-tcpip/8/<br />
http://www.kegel.com/dkftpbench/nonblocking.html</div></div>Alexandre Simundihttp://www.blogger.com/profile/07075473948224038728noreply@blogger.com1Mountjoy Sq., Dublin, Co. Dublin City, Ireland53.3566861 -6.257529299999987453.151780099999996 -6.7244482999999873 53.5615921 -5.7906102999999876tag:blogger.com,1999:blog-7642770694393333804.post-36329784756055290352010-07-04T21:34:00.013-03:002010-07-04T23:36:37.104-03:00Taskboard e Standup Meeting não é suficiente. Algumas dicas de como executar...<div style="text-align: center;"><span class="Apple-style-span" style="color: #0000ee;"><u><br />
</u></span></div><div style="text-align: left;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg-cBigFTpSRQnviO_kQyemjPa1iRlYRk02lk1n9iqaMEYk7l7Ahe7UMz4ejheC_9A8aKmH3JhvjS3mOp8rcC-z-Z-ezPAgqoX5NZwNLtFBriDCZ-yEuBthIa4Sp2w5fInEmXXXHQFdPp8/s1600/scrum-board.jpg"><img alt="" border="0" id="BLOGGER_PHOTO_ID_5490229860846033186" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg-cBigFTpSRQnviO_kQyemjPa1iRlYRk02lk1n9iqaMEYk7l7Ahe7UMz4ejheC_9A8aKmH3JhvjS3mOp8rcC-z-Z-ezPAgqoX5NZwNLtFBriDCZ-yEuBthIa4Sp2w5fInEmXXXHQFdPp8/s320/scrum-board.jpg" style="cursor: pointer; display: block; height: 207px; margin-bottom: 10px; margin-left: auto; margin-right: auto; margin-top: 0px; text-align: center; width: 320px;" /></a></div><div><br />
</div><div style="text-align: left;">Trabalhei em diversos projetos que utilizavam TASK BOARD do Scrum. Ao longo do tempo conseguimos otimizar a utlização dos mesmos identificando algumas boas práticas.</div><div><br />
</div><div><br />
<a name='more'></a><br />
</div><div>Seguem: </div><div><br />
</div><div><b><span class="Apple-style-span" style="font-size: large;">1) Detalhar as tarefas</span></b></div><div>O quadro de tarefas deve conter <span class="Apple-style-span" style="color: red;"><b>TODAS as tarefas identificadas</b></span> para uma determinada iteração (spring ou seja lá o nome q vc use).</div><div><br />
</div><div>O objetivo de ter um quadro com as tarefas para na parede é "MICROGERENCIAMENTO". Nesta etapa você deve saber quais as TAREFAS devem ser feitas. Esse detalhamento irá direcionar a equipe.</div><div><br />
</div><div>OBS: não estou falando em escopo, mas sim em tarefas em geral.</div><div><br />
</div><div><br />
</div><div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgqN2PS2w-_I84W7vBuhDZKPukR7bCQiguc4tDU5c-8d86rzEs57rWx5sV-w_m2xe4KLbkjH3SjmGaU6-voWlZXvt7gijxrp_ZA6lXFJWflTkAOof76Njb5thRL7TWvO0sCiWfHs-TJwPA/s1600/escadaria-36-degraus-p.jpg"><img alt="" border="0" id="BLOGGER_PHOTO_ID_5490229202783809970" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgqN2PS2w-_I84W7vBuhDZKPukR7bCQiguc4tDU5c-8d86rzEs57rWx5sV-w_m2xe4KLbkjH3SjmGaU6-voWlZXvt7gijxrp_ZA6lXFJWflTkAOof76Njb5thRL7TWvO0sCiWfHs-TJwPA/s320/escadaria-36-degraus-p.jpg" style="cursor: pointer; display: block; height: 320px; margin-bottom: 10px; margin-left: auto; margin-right: auto; margin-top: 0px; text-align: center; width: 221px;" /></a></div><div style="text-align: center;"><b>Esta escada tem 36 degraus. É isso o que um taskborad deve me dizer. Quantos degraus deve subir para atingir o objetivo.</b></div><div><br />
</div><div><br />
</div><div><br />
</div><div>Benefícios:</div><div><ul><li>Auto-gerenciamento: tarefas detalhadas a equipe irá "visualizar" tudo que deve fazer. Acaba uma tarefa, começa outra. Simples. Isso reduz a depdendência de um Gerente de Projetos.</li>
</ul></div><div><br />
</div><div><b><span class="Apple-style-span" style="font-size: large;">2) Sempre convencionar o PRAZO das tarefas</span></b></div><div><br />
</div><div>Convencione o PRAZO de cada tarefa. O ideal é ser de 1 dia.</div><div><br />
</div><div>Como Eliyahu Goldratt fala no seu livro Corrente Crítica, as tarefas tendem a durar no mínimo toda sua extimativa. Ou seja, se você convenciar q uma terafa irá duar dois dias, dificilmente irá durar menos.</div><div><br />
<br />
Benefícios:</div><div><ul><li>Prazos curtos = atrasos curtos = soluções rápidas. Com o prazo de um dia em quanto tempo você saber que a tarefa atrasou???? um dia!</li>
</ul></div><div><b><span class="Apple-style-span" style="font-size: large;">3) Task board = VISUAL</span></b></div><div>O objetivo de ter o quadro não é seguir a moda do ágil, mas sim ser VISUAL.</div><div><br />
</div><div>Você tem que olhar para o quadro e enxergar!!! </div><div><br />
</div><div>Enxergar o que???</div><div><ul><li>Tudo que deve ser feito</li>
<li>Se você está mais perto do fim ou do início</li>
<li>Atrasos!</li>
<li>Problema/Impedimentos</li>
</ul><div>Os atrasos e problemas devem ser facilmente vistos.</div></div><div><br />
</div><div><br />
</div><div>No exemplo abaixo os post-it são marcadas para cada dia em atraso. Dessa forma é simples visualizar as tarefas com maiores problemas.</div><div><br />
</div><div><br />
</div><div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjOvwnwmHblV2sf7sye5P7dIDm6HaTQoFQQpQQ-Vt1nqIyJb58SySQNrBwULW_rGP9Tp74pGplrRZuztjkXpxXzM586fbEi5vQHnZ63EK7JlaR8BBo331Isduoly1LWX9sxnrNsU1itXTM/s1600/TaskBoard.gif"><img alt="" border="0" id="BLOGGER_PHOTO_ID_5490234553138194594" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjOvwnwmHblV2sf7sye5P7dIDm6HaTQoFQQpQQ-Vt1nqIyJb58SySQNrBwULW_rGP9Tp74pGplrRZuztjkXpxXzM586fbEi5vQHnZ63EK7JlaR8BBo331Isduoly1LWX9sxnrNsU1itXTM/s320/TaskBoard.gif" style="cursor: pointer; display: block; height: 212px; margin-bottom: 10px; margin-left: auto; margin-right: auto; margin-top: 0px; text-align: center; width: 320px;" /></a></div><div><br />
</div><div><br />
</div><div><br />
</div><div><b><span class="Apple-style-span" style="font-size: large;">4) Comunicação</span></b></div><div>A reunião diária é uma ferramenta de COMUNICAÇÃO. </div><div><br />
</div><div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhgwnq0L52i5nHBrPN96Wew9wTZwFLJU5yAaNY5uyrqswTQR3vWKeH2B4J6tZh9N2xwo5hBVOQM46GHr6VpzZe7wUbMaJ3eWNSfpZdxdD7awSm0XgWRgN7yFMirOHVgjD0wh7A0DX_edF4/s1600/megafone_foto_01.png"><img alt="" border="0" id="BLOGGER_PHOTO_ID_5490237184136920674" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhgwnq0L52i5nHBrPN96Wew9wTZwFLJU5yAaNY5uyrqswTQR3vWKeH2B4J6tZh9N2xwo5hBVOQM46GHr6VpzZe7wUbMaJ3eWNSfpZdxdD7awSm0XgWRgN7yFMirOHVgjD0wh7A0DX_edF4/s200/megafone_foto_01.png" style="cursor: pointer; display: block; height: 155px; margin-bottom: 10px; margin-left: auto; margin-right: auto; margin-top: 0px; text-align: center; width: 200px;" /></a></div><div><br />
</div><div><br />
</div><div>Então... DEIXE AS PESSOAS FALAREM!</div><div><br />
</div><div>Crie as regras da reunião<b> e deixe claro para todos</b>:</div><div><ul><li>Regra 1: enuanto um burro fala os outros baixam as orelhas</li>
<li>Regra 2: Falar o "que eu fiz" e "o que vou fazer"</li>
<li>Regra 3: Tempo! Se o tempo é de 5, 10, 15, 20 respeite!</li>
</ul></div><div><br />
</div><div><b><span class="Apple-style-span" style="font-size: large;">7) Reunião Diária != Reunião do Projeto</span></b></div><div><br />
</div><div>Você, Gerente de Projeto/Scrum Master ou seja lá qual for o seu papel.</div><div><br />
</div><div>A reunião diária é para o TIME não para você. Durante a reunião o time irá falar o que fez e o que não conseguiu fazer. Após isso, deve-se atacar os problemas individualmente.</div><div><br />
</div><div><b><span class="Apple-style-span" style="font-size: large;">8) Reunião diária = Feedback</span></b></div><div><span class="Apple-style-span" style="font-size: large;">A reunião diária é uma ferramenta de comunicação para o time.</span></div><div><b><span class="Apple-style-span" style="font-size: large;"><br />
</span></b></div><div>Também é uma ferramenta de feedback para o cliente. Em casos onde se trabalha com outsourcing, fazer as reuniões diárias junto com o cliente irá deixá-lo por dentro de tudo que está acontecendo no projeto.</div><div><b><br />
</b></div><div><b><br />
</b></div><div><b>Bom.. por enquanto é isso.</b></div><div><b><br />
</b></div><div><b>Abraço</b></div><div><b><span class="Apple-style-span" style="font-size: large;"><br />
</span></b></div><div><b><span class="Apple-style-span" style="font-size: large;"><br />
</span></b></div>Alexandre Simundihttp://www.blogger.com/profile/07075473948224038728noreply@blogger.com0tag:blogger.com,1999:blog-7642770694393333804.post-18069634596021030902010-05-21T00:24:00.020-03:002011-11-26T17:03:41.673-02:00Engenharia de Requisitos: todo mundo fala, poucos fazem<div style="text-align: left;"><span class="Apple-style-span" style="font-family: verdana;">Hoje terminei o treinamento sobre Requisitos de Software com o Luiz Parzianello, que ao meu ver é um dos "CARAS" de requisitos no brasil.</span></div><div><span class="Apple-style-span" style="font-size: small;"><span class="Apple-style-span" style="font-family: verdana;"><br />
</span></span></div><div><span class="Apple-style-span" style="font-size: small;"><span class="Apple-style-span" style="font-family: verdana;">O objetivo do post é falar um pouco do porquê resolvi estudar requisitos e algumas dicas para quem está começando a estudar sobre isso. </span></span></div><div><span class="Apple-style-span" style="font-size: small;"><span class="Apple-style-span" style="font-family: verdana;"><br />
</span></span></div><div><b><span class="Apple-style-span" style="font-size: small;"><span class="Apple-style-span" style="font-family: verdana;">Motivação</span></span></b></div><div><ul><li><span class="Apple-style-span" style="font-size: small;"><span class="Apple-style-span" style="font-family: verdana;">É um assunto abordado de forma muito pobre nas faculdades</span></span></li>
<li><span class="Apple-style-span" style="font-size: small;"><span class="Apple-style-span" style="font-family: verdana;">Existe muita gente(inclusive eu) definindo requisitos baseado na experiência(empírico), sem fundamento teórico.</span></span></li>
<li><span class="Apple-style-span" style="font-size: small;"><span class="Apple-style-span" style="font-family: verdana;">É nítido os problemas que requisitos errados e/ou inconsistentes geram nos projetos.</span></span></li>
</ul></div><div><span class="Apple-style-span" style="font-size: small;"><span class="Apple-style-span" style="font-family: verdana;"></span></span><br />
<span class="Apple-style-span" style="font-size: small;"><span class="Apple-style-span" style="font-family: verdana;"></span></span><br />
<a name='more'></a></div><div><b><span class="Apple-style-span" style="font-weight: normal;"><b><span class="Apple-style-span" style="font-size: small;"><span class="Apple-style-span" style="font-family: verdana;">1) Entenda o que um projeto de software representa</span></span></b></span></b></div><div><b><span class="Apple-style-span" style="font-size: small;"><span class="Apple-style-span" style="font-family: verdana;"><br />
</span></span></b></div><div style="text-align: justify;"><span class="Apple-style-span" style="font-size: small;"><span class="Apple-style-span" style="font-family: verdana;">É importante entender que os investimentos realizdados em projetos de software são para realizar transformação entre o cenário atual e um cenário desejado. Significa que o patrocinador do projeto busca eficiência, eficácia e novas oportunidades.</span></span></div><div style="text-align: justify;"><span class="Apple-style-span" style="font-size: small;"><span class="Apple-style-span" style="font-family: verdana;"><br />
</span></span></div><div style="text-align: justify;"><span class="Apple-style-span" style="font-size: small;"><span class="Apple-style-span" style="font-family: verdana;">A figura abaixo exemplifica como entender o "AS IS" e o "TO BE". </span></span></div><div><b><span class="Apple-style-span" style="font-size: small;"><span class="Apple-style-span" style="font-family: verdana;"><br />
</span></span></b></div><div style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhwTQNUf9V25BMU3K3PC1Ra1L9SgPYadktUmwqt7YUS9tXaMad8275QzFSBWwNZ32rqmcDToeHH9m2g1Gm7qDZ6wCnF8TiofZ5RiPMkizctp_EVNbSlJgsdfCXj3urGKJ1fVmveBlkUWPs/s1600/Objetivo.gif"><img alt="" border="0" id="BLOGGER_PHOTO_ID_5474258624519337874" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhwTQNUf9V25BMU3K3PC1Ra1L9SgPYadktUmwqt7YUS9tXaMad8275QzFSBWwNZ32rqmcDToeHH9m2g1Gm7qDZ6wCnF8TiofZ5RiPMkizctp_EVNbSlJgsdfCXj3urGKJ1fVmveBlkUWPs/s400/Objetivo.gif" style="cursor: pointer; display: block; height: 99px; margin-bottom: 10px; margin-left: auto; margin-right: auto; margin-top: 0px; text-align: center; width: 400px;" /></a></div><div><b><span class="Apple-style-span" style="font-weight: normal;"><span class="Apple-style-span" style="font-size: small;"><span class="Apple-style-span" style="font-family: verdana;">Óbvio não?</span></span></span></b><br />
<b><span class="Apple-style-span" style="font-weight: normal;"><b><span class="Apple-style-span" style="font-weight: normal;"><b><span class="Apple-style-span" style="font-weight: normal;"><b><span class="Apple-style-span" style="font-weight: normal;"><b><span class="Apple-style-span" style="font-weight: normal;"><b><span class="Apple-style-span" style="font-weight: normal;"><b><span class="Apple-style-span" style="font-weight: normal;"><b><span class="Apple-style-span" style="font-size: small;"><span class="Apple-style-span" style="font-family: verdana;"><br />
</span></span></b></span></b></span></b></span></b></span></b></span></b></span></b></span></b><br />
<b><span class="Apple-style-span" style="font-weight: normal;"><b><span class="Apple-style-span" style="font-weight: normal;"><b><span class="Apple-style-span" style="font-weight: normal;"><b><span class="Apple-style-span" style="font-weight: normal;"><b><span class="Apple-style-span" style="font-weight: normal;"><b><span class="Apple-style-span" style="font-weight: normal;"><b><span class="Apple-style-span" style="font-weight: normal;"><b><span class="Apple-style-span" style="font-size: small;"><span class="Apple-style-span" style="font-family: verdana;">2) Levantamento de requisitos não é descrever solução...</span></span></b></span></b></span></b></span></b></span></b></span></b></span></b></span></b><br />
<span class="Apple-style-span" style="font-family: verdana;"><br />
</span><br />
<span class="Apple-style-span" style="font-family: verdana;">Entendido que projeto de software faz parte da transformação do "AS IS" para o "TO BE", precisamos explorar o "AS IS", ou seja, o PROBLEMA!!!!</span></div><div style="text-align: justify;"><div style="display: inline !important;"><div style="display: inline !important;"><div style="display: inline !important;"><div style="display: inline !important;"><div style="display: inline !important;"><div style="display: inline !important;"><span class="Apple-style-span" style="font-size: small;"><span class="Apple-style-span" style="font-family: verdana;"><br />
</span></span></div></div></div></div></div></div></div><div style="text-align: justify;"><span class="Apple-style-span" style="font-size: small;"><span class="Apple-style-span" style="font-family: verdana;">Ir para no cliente fazer levantamento de requisitos não significa emitir pedidos, mas sim explorar o cenário atual. </span></span><b><span class="Apple-style-span" style="font-size: small;"><span class="Apple-style-span" style="font-family: verdana;">Não vá falar com o cliente esperando que ele diga: Faça a tela X, importe os arquivos e comunique com webservices. Isso são soluções.</span></span></b></div><div style="text-align: justify;"><b><span class="Apple-style-span" style="font-size: small;"><span class="Apple-style-span" style="font-family: verdana;"><br />
</span></span></b></div><div style="text-align: justify;"><b><span class="Apple-style-span" style="font-size: small;"><span class="Apple-style-span" style="font-family: verdana;"><br />
</span></span></b></div><div style="text-align: justify;"><b><span class="Apple-style-span" style="-webkit-text-decorations-in-effect: underline; color: #0000ee; font-weight: normal;"><img alt="" border="0" id="BLOGGER_PHOTO_ID_5474265310394963586" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEheQfuVjGw42z8A1Ex18Fboxnn3sFH3ggCKlt4w67gGyS1hk8sDv_TkfQvO_j-mbVFWuytrjytsjm7EVJkBQzoifVrIRifGKAE0gbJa0dglKhhNoDlYwswgT54FHc3gAA8lsm1QrN8uibM/s320/mata_fechada.jpg" style="cursor: pointer; display: block; height: 240px; margin-bottom: 10px; margin-left: auto; margin-right: auto; margin-top: 0px; text-align: center; width: 320px;" /></span></b></div><div style="text-align: center;"><span class="Apple-style-span" style="font-size: small;"><span class="Apple-style-span" style="font-family: verdana;">Levantamento de requisitos = Desbravamento</span></span></div><div style="text-align: justify;"><b><span class="Apple-style-span" style="font-size: small;"><span class="Apple-style-span" style="font-family: verdana;"><br />
</span></span></b></div><div style="text-align: justify;"><b><span class="Apple-style-span" style="font-size: small;"><span class="Apple-style-span" style="font-family: verdana;"><br />
</span></span></b></div><div style="text-align: justify;"><span class="Apple-style-span" style="font-size: small;"><span class="Apple-style-span" style="font-family: verdana;">Realizar o levantamento de requisitos e entender o cenário atual, compreender os problemas existentes, identificar os objetivos de negócio com o projeto e especificar os requisitos de usuário e software necessários para atingí-los.</span></span></div><div style="text-align: justify;"><b><span class="Apple-style-span" style="font-weight: normal;"><b><span class="Apple-style-span" style="font-weight: normal;"><b><span class="Apple-style-span" style="font-weight: normal;"><b><span class="Apple-style-span" style="font-size: small;"><span class="Apple-style-span" style="font-family: verdana;"><br />
</span></span></b></span></b></span></b></span></b><br />
<b><span class="Apple-style-span" style="font-weight: normal;"><b><span class="Apple-style-span" style="font-weight: normal;"><b><span class="Apple-style-span" style="font-weight: normal;"><b><span class="Apple-style-span" style="font-size: small;"><span class="Apple-style-span" style="font-family: verdana;">3) Descrição do Problema</span></span></b></span></b></span></b></span></b><br />
<b><span class="Apple-style-span" style="font-weight: normal;"><b><span class="Apple-style-span" style="font-weight: normal;"><b><span class="Apple-style-span" style="font-weight: normal;"><b><span class="Apple-style-span" style="font-size: small;"><span class="Apple-style-span" style="font-family: verdana;"><br />
</span></span></b></span></b></span></b></span></b></div><div><div><div><div style="display: inline !important;"></div></div><div><b><span class="Apple-style-span" style="font-weight: normal;"><b><span class="Apple-style-span" style="font-weight: normal;"><b><span class="Apple-style-span" style="font-weight: normal;"></span></b></span></b></span></b><br />
<b><span class="Apple-style-span" style="font-weight: normal;"><b><span class="Apple-style-span" style="font-weight: normal;"><b><span class="Apple-style-span" style="font-weight: normal;"></span></b></span></b></span></b><br />
<div style="display: inline !important;"><b><span class="Apple-style-span" style="font-weight: normal;"><b><span class="Apple-style-span" style="font-weight: normal;"><b><span class="Apple-style-span" style="font-weight: normal;"><b><span class="Apple-style-span" style="font-weight: normal;"></span></b></span></b></span></b></span></b><br />
<b><span class="Apple-style-span" style="font-weight: normal;"><b><span class="Apple-style-span" style="font-weight: normal;"><b><span class="Apple-style-span" style="font-weight: normal;"><b><span class="Apple-style-span" style="font-weight: normal;"></span></b></span></b></span></b></span></b><br />
<div style="display: inline !important;"><b><span class="Apple-style-span" style="font-weight: normal;"><b><span class="Apple-style-span" style="font-weight: normal;"><b><span class="Apple-style-span" style="font-weight: normal;"><b><span class="Apple-style-span" style="font-weight: normal;"><span class="Apple-style-span" style="font-size: small;"><span class="Apple-style-span" style="font-family: verdana;"><span class="Apple-style-span" style="font-family: Georgia, serif;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEglYYGwRhLrk8BzmG-cAmFFVLCv0ln1AbQzjvGbArWj5to3KRp7GYAUgXVMRaJ_afNNaJrH4BeLHmAYBjohaP-dsdGwpplUWF69tHbS_Wy8iZ0XX6OVzGGSKFuIf8BQvQGF5E5dHUHqzhg/s1600/escrita22.jpg"><img alt="" border="0" id="BLOGGER_PHOTO_ID_5474268820541363394" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEglYYGwRhLrk8BzmG-cAmFFVLCv0ln1AbQzjvGbArWj5to3KRp7GYAUgXVMRaJ_afNNaJrH4BeLHmAYBjohaP-dsdGwpplUWF69tHbS_Wy8iZ0XX6OVzGGSKFuIf8BQvQGF5E5dHUHqzhg/s320/escrita22.jpg" style="cursor: pointer; display: block; height: 320px; margin-bottom: 10px; margin-left: auto; margin-right: auto; margin-top: 0px; text-align: center; width: 309px;" /></a></span></span></span></span></b></span></b></span></b></span></b></div></div></div><div><b><span class="Apple-style-span" style="font-weight: normal;"><b><span class="Apple-style-span" style="font-weight: normal;"><b><span class="Apple-style-span" style="font-family: verdana; font-weight: normal;"></span></b></span></b></span></b><br />
<b><span class="Apple-style-span" style="font-weight: normal;"><b><span class="Apple-style-span" style="font-weight: normal;"><b><span class="Apple-style-span" style="font-family: verdana; font-weight: normal;"></span></b></span></b></span></b><br />
<b><span class="Apple-style-span" style="font-weight: normal;"><b><span class="Apple-style-span" style="font-weight: normal;"><b><span class="Apple-style-span" style="font-weight: normal;"><b><span class="Apple-style-span" style="font-weight: normal;"><span class="Apple-style-span" style="font-size: small;"><span class="Apple-style-span" style="font-family: verdana;">Quando você for entender/descrever os problemas que precisa resolver, tenha em mente que deve utlizar uma estrutura </span></span><b><span class="Apple-style-span" style="font-size: small;"><span class="Apple-style-span" style="font-family: verdana;">NARRATIVA</span></span></b><span class="Apple-style-span" style="font-size: small;"><span class="Apple-style-span" style="font-family: verdana;">, ou seja, você vai contar fatos que acontecem hoje.</span></span></span></b></span></b></span></b></span></b><br />
<div style="display: inline !important;"><span class="Apple-style-span" style="font-family: verdana;"><b><span class="Apple-style-span" style="font-weight: normal;"><b><span class="Apple-style-span" style="font-weight: normal;"><b><span class="Apple-style-span" style="font-weight: normal;"><b><span class="Apple-style-span" style="font-weight: normal;"></span></b></span></b></span></b></span></b><br />
<b><span class="Apple-style-span" style="font-weight: normal;"><b><span class="Apple-style-span" style="font-weight: normal;"><b><span class="Apple-style-span" style="font-weight: normal;"><b><span class="Apple-style-span" style="font-weight: normal;"></span></b></span></b></span></b></span></b></span></div></div><div><div style="display: inline !important;"></div></div><div><b><span class="Apple-style-span" style="font-weight: normal;"><b><span class="Apple-style-span" style="font-weight: normal;"><b><span class="Apple-style-span" style="font-weight: normal;"></span></b></span></b></span></b><br />
<b><span class="Apple-style-span" style="font-weight: normal;"><b><span class="Apple-style-span" style="font-weight: normal;"><b><span class="Apple-style-span" style="font-weight: normal;"></span></b></span></b></span></b><br />
<div style="display: inline !important;"><b><span class="Apple-style-span" style="font-weight: normal;"><b><span class="Apple-style-span" style="font-weight: normal;"><b><span class="Apple-style-span" style="font-weight: normal;"><b><span class="Apple-style-span" style="font-weight: normal;"></span></b></span></b></span></b></span></b><br />
<b><span class="Apple-style-span" style="font-weight: normal;"><b><span class="Apple-style-span" style="font-weight: normal;"><b><span class="Apple-style-span" style="font-weight: normal;"><b><span class="Apple-style-span" style="font-weight: normal;"></span></b></span></b></span></b></span></b><br />
<div style="display: inline !important;"><b><span class="Apple-style-span" style="font-weight: normal;"><b><span class="Apple-style-span" style="font-weight: normal;"><b><span class="Apple-style-span" style="font-weight: normal;"><b><span class="Apple-style-span" style="font-weight: normal;"><span class="Apple-style-span" style="font-size: small;"><span class="Apple-style-span" style="font-family: verdana;"><br />
</span></span></span></b></span></b></span></b></span></b></div></div></div><div><b><span class="Apple-style-span" style="font-weight: normal;"><b><span class="Apple-style-span" style="font-weight: normal;"><span class="Apple-style-span" style="font-size: small;"><span class="Apple-style-span" style="font-family: verdana;">A descrição do problema pode ser composta por</span></span></span></b></span></b></div><div><ul><li><b><span class="Apple-style-span" style="font-weight: normal;"><b><span class="Apple-style-span" style="font-weight: normal;"><b><span class="Apple-style-span" style="font-weight: normal;"><div style="display: inline !important;"><div style="display: inline !important;"><b><span class="Apple-style-span" style="font-weight: normal;"><b><span class="Apple-style-span" style="font-size: small;"><span class="Apple-style-span" style="font-family: verdana;">Texto narrativo:<br />
</span></span></b></span></b></div></div></span></b><b><span class="Apple-style-span" style="font-weight: normal;"><div style="display: inline !important;"><div style="display: inline !important;"><ul style="display: inline !important;"><li style="display: inline !important;"><b><span class="Apple-style-span" style="font-weight: normal;"><b><span class="Apple-style-span" style="font-weight: normal;"><div style="display: inline !important;"><div style="display: inline !important;"><b><span class="Apple-style-span" style="font-weight: normal;"><span class="Apple-style-span" style="font-size: small;"><span class="Apple-style-span" style="font-family: verdana;">Ex: atualmente o gerente utilizar uma planilha para...</span></span></span></b><br />
<b><span class="Apple-style-span" style="font-weight: normal;"><span class="Apple-style-span" style="font-size: small;"><span class="Apple-style-span" style="font-family: verdana;"><br />
</span></span></span></b></div></div></span></b></span></b></li>
<b><span class="Apple-style-span" style="font-weight: normal;"> </span></b></ul></div></div></span></b></span></b></span></b></li>
<b><span class="Apple-style-span" style="font-weight: normal;"><b><span class="Apple-style-span" style="font-weight: normal;">
<li><b><span class="Apple-style-span" style="font-weight: normal;"><div style="display: inline !important;"><div style="display: inline !important;"><b><span class="Apple-style-span" style="font-weight: normal;"><b><span class="Apple-style-span" style="font-size: small;"><span class="Apple-style-span" style="font-family: verdana;">Resultados do cenário atual<br />
</span></span></b></span></b></div></div></span></b><b><span class="Apple-style-span" style="font-weight: normal;"><div style="display: inline !important;"><div style="display: inline !important;"><ul style="display: inline !important;"><li style="display: inline !important;"><b><span class="Apple-style-span" style="font-weight: normal;"><b><span class="Apple-style-span" style="font-weight: normal;"><div style="display: inline !important;"><div style="display: inline !important;"><b><span class="Apple-style-span" style="font-weight: normal;"><span class="Apple-style-span" style="font-size: small;"><span class="Apple-style-span" style="font-family: verdana;">Ex: estamos perdendo clientes pelos motivos...</span></span></span></b><br />
<b><span class="Apple-style-span" style="font-weight: normal;"><span class="Apple-style-span" style="font-size: small;"><span class="Apple-style-span" style="font-family: verdana;"><br />
</span></span></span></b></div></div></span></b></span></b></li>
<b><span class="Apple-style-span" style="font-weight: normal;"> </span></b></ul></div></div></span></b></li>
<li><b><span class="Apple-style-span" style="font-weight: normal;"><div style="display: inline !important;"><div style="display: inline !important;"><b><span class="Apple-style-span" style="font-weight: normal;"><b><span class="Apple-style-span" style="font-size: small;"><span class="Apple-style-span" style="font-family: verdana;">Possíveis causas</span></span></b></span></b><br />
<b><span class="Apple-style-span" style="font-weight: normal;"><b><span class="Apple-style-span" style="font-weight: normal;"></span></b></span></b></div></div></span></b></li>
<li style="display: inline !important;"><b><span class="Apple-style-span" style="font-weight: normal;"><b><span class="Apple-style-span" style="font-weight: normal;"><b><span class="Apple-style-span" style="font-weight: normal;"><b><span class="Apple-style-span" style="font-weight: normal;"><div style="display: inline !important;"><div style="display: inline !important;"><div style="display: inline !important;"><b><span class="Apple-style-span" style="font-weight: normal;"><b><span class="Apple-style-span" style="font-weight: normal;"></span></b></span></b></div></div></div></span></b></span></b></span></b></span></b></li>
<li style="display: inline !important;"><b><span class="Apple-style-span" style="font-weight: normal;"><b><span class="Apple-style-span" style="font-weight: normal;"><b><span class="Apple-style-span" style="font-weight: normal;"><b><span class="Apple-style-span" style="font-weight: normal;"><b><span class="Apple-style-span" style="font-weight: normal;"><b><span class="Apple-style-span" style="font-weight: normal;"><b><span class="Apple-style-span" style="font-weight: normal;"><b><span class="Apple-style-span" style="font-weight: normal;"><b><span class="Apple-style-span" style="font-weight: normal;"><b><span class="Apple-style-span" style="font-weight: normal;"><div style="display: inline !important;"><div style="display: inline !important;"><ul style="display: inline !important;"><li style="display: inline !important;"><b><span class="Apple-style-span" style="font-weight: normal;"><b><span class="Apple-style-span" style="font-weight: normal;"><div style="display: inline !important;"><div style="display: inline !important;"><div style="display: inline !important;"><b><span class="Apple-style-span" style="font-weight: normal;"><span class="Apple-style-span" style="font-size: small;"><span class="Apple-style-span" style="font-family: verdana;">O fato de o cliente não ter acesso ao nosso sistema..</span></span></span></b></div></div></div></span></b></span></b></li>
</ul></div></div></span></b></span></b></span></b></span></b></span></b></span></b></span></b></span></b></span></b></span></b></li>
<b><span class="Apple-style-span" style="font-weight: normal;"><b><span class="Apple-style-span" style="font-weight: normal;"><b><span class="Apple-style-span" style="font-weight: normal;"></span></b></span></b></span></b> </span></b></span></b></ul></div></div><b><span class="Apple-style-span" style="font-weight: normal;"><b><span class="Apple-style-span" style="font-weight: normal;"><b><span class="Apple-style-span" style="font-weight: normal;"></span></b></span></b></span></b><br />
<div style="display: inline !important;"><div style="display: inline !important;"><ul style="display: inline !important;"><li style="display: inline !important;"><b><span class="Apple-style-span" style="font-weight: normal;"><b><span class="Apple-style-span" style="font-weight: normal;"><b><span class="Apple-style-span" style="font-weight: normal;"><b><span class="Apple-style-span" style="font-weight: normal;"><b><span class="Apple-style-span" style="font-weight: normal;"><div style="display: inline !important;"></div></span></b></span></b></span></b></span></b></span></b></li>
<b><span class="Apple-style-span" style="font-weight: normal;"><b><span class="Apple-style-span" style="font-weight: normal;"><b><span class="Apple-style-span" style="font-weight: normal;"> <b><span class="Apple-style-span" style="font-weight: normal;"> </span></b></span></b></span></b></span></b></ul></div></div><b><span class="Apple-style-span" style="font-weight: normal;"><b><span class="Apple-style-span" style="font-weight: normal;"> </span></b></span></b><br />
<div><b><span class="Apple-style-span" style="font-weight: normal;"><b><span class="Apple-style-span" style="font-weight: normal;"><b><b><span class="Apple-style-span" style="font-size: small;"><span class="Apple-style-span" style="font-family: verdana;">4) Descrição da Visão</span></span></b></b></span></b></span></b></div></div><div><div style="display: inline !important;"></div></div><div><b><span class="Apple-style-span" style="font-weight: normal;"><b><span class="Apple-style-span" style="font-weight: normal;"><span class="Apple-style-span" style="font-size: small;"><span class="Apple-style-span" style="font-family: verdana;"><br />
</span></span></span></b></span></b></div><div><b><span class="Apple-style-span" style="font-weight: normal;"><b><span class="Apple-style-span" style="font-weight: normal;"><span class="Apple-style-span" style="font-size: small;"><span class="Apple-style-span" style="font-family: verdana;"><span class="Apple-style-span" style="font-family: Georgia, serif;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh45gYDPONrE4zdtbWUm-WNG5ubLOXH2Cj3FqEmDQM5UxwvtgjhjiDP8BSrTKMKAThTNMios_rl0lSWPkQKgxBEruxJJw1pRcDAhyeEFN68oH-o-JMIa1WCIA9kXewZ-MtnT9He39fpwG4/s1600/executivo-com-binoculo.jpg"><img alt="" border="0" id="BLOGGER_PHOTO_ID_5474269288375977090" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh45gYDPONrE4zdtbWUm-WNG5ubLOXH2Cj3FqEmDQM5UxwvtgjhjiDP8BSrTKMKAThTNMios_rl0lSWPkQKgxBEruxJJw1pRcDAhyeEFN68oH-o-JMIa1WCIA9kXewZ-MtnT9He39fpwG4/s320/executivo-com-binoculo.jpg" style="cursor: pointer; display: block; height: 214px; margin-bottom: 10px; margin-left: auto; margin-right: auto; margin-top: 0px; text-align: center; width: 320px;" /></a></span></span></span></span></b></span></b></div><div><b><span class="Apple-style-span" style="font-weight: normal;"><b><span class="Apple-style-span" style="font-weight: normal;"><span class="Apple-style-span" style="font-size: small;"><span class="Apple-style-span" style="font-family: verdana;">Até agora escrevi sobre o objetivo dos projetos e que requisitos não começam com definição das soluções. Passei algumas dicas para escrever o quê o projeto deve resolver.</span></span></span></b></span></b><br />
<b><span class="Apple-style-span" style="font-weight: normal;"><b><span class="Apple-style-span" style="font-weight: normal;"><span class="Apple-style-span" style="font-size: small;"><span class="Apple-style-span" style="font-family: verdana;">Antes de começar a identificar funcionalidades e ações dos usuários, precisamos ter uma visão claro de o que o cliente espera <b>do projeto</b>.</span></span></span></b></span></b></div><div><b><span class="Apple-style-span" style="font-weight: normal;"><b><span class="Apple-style-span" style="font-weight: normal;"><span class="Apple-style-span" style="font-size: small;"><span class="Apple-style-span" style="font-family: verdana;"><br />
</span></span></span></b></span></b></div><div><b><span class="Apple-style-span" style="font-weight: normal;"><b><span class="Apple-style-span" style="font-weight: normal;"><span class="Apple-style-span" style="font-size: small;"><span class="Apple-style-span" style="font-family: verdana;">Para isso podemos descrever qual a visão (projeção, expectativa, etc) do cliente.</span></span></span></b></span></b></div><div><b><span class="Apple-style-span" style="font-weight: normal;"><b><span class="Apple-style-span" style="font-weight: normal;"><span class="Apple-style-span" style="font-size: small;"><span class="Apple-style-span" style="font-family: verdana;"><br />
</span></span></span></b></span></b></div><div><b><span class="Apple-style-span" style="font-weight: normal;"><b><span class="Apple-style-span" style="font-weight: normal;"><span class="Apple-style-span" style="font-size: small;"><span class="Apple-style-span" style="font-family: verdana;">Essa descrição pode conter:</span></span></span></b></span></b></div><div><ul><li><b><span class="Apple-style-span" style="font-weight: normal;"><b><span class="Apple-style-span" style="font-weight: normal;"><b><span class="Apple-style-span" style="font-weight: normal;"><div style="display: inline !important;"><div style="display: inline !important;"><b><span class="Apple-style-span" style="font-weight: normal;"><span class="Apple-style-span" style="font-size: small;"><span class="Apple-style-span" style="font-family: verdana;">Texto descrevendo a expectativa sobre projeto</span></span></span></b></div></div></span></b></span></b></span></b></li>
<b><span class="Apple-style-span" style="font-weight: normal;"><b><span class="Apple-style-span" style="font-weight: normal;">
<li><b><span class="Apple-style-span" style="font-weight: normal;"><div style="display: inline !important;"><div style="display: inline !important;"><b><span class="Apple-style-span" style="font-weight: normal;"><span class="Apple-style-span" style="font-size: small;"><span class="Apple-style-span" style="font-family: verdana;">Resultados esperados: redução de 50% do tempo de... , aumento de produção no...</span></span></span></b></div></div></span></b></li>
<li><b><span class="Apple-style-span" style="font-weight: normal;"><div style="display: inline !important;"><div style="display: inline !important;"><b><span class="Apple-style-span" style="font-weight: normal;"><span class="Apple-style-span" style="font-size: small;"><span class="Apple-style-span" style="font-family: verdana;">Benefícios esperados: aumento na captação de clientes, etc.</span></span></span></b></div></div></span></b></li>
<li><b><span class="Apple-style-span" style="font-weight: normal;"><div style="display: inline !important;"><div style="display: inline !important;"><b><span class="Apple-style-span" style="font-weight: normal;"><span class="Apple-style-span" style="font-size: small;"><span class="Apple-style-span" style="font-family: verdana;">Recursos necessários: utlizar um sistema para fazer isso, ter acesso ao notebook, etc..</span></span></span></b></div></div></span></b></li>
</span></b></span></b></ul></div><div><b><span class="Apple-style-span" style="font-weight: normal;"><b><span class="Apple-style-span" style="font-weight: normal;"><b><span class="Apple-style-span" style="font-weight: normal;"><b><span class="Apple-style-span" style="font-weight: normal;"><b><b><span class="Apple-style-span" style="font-size: small;"><span class="Apple-style-span" style="font-family: verdana;">5) Requisitos de negócio</span></span></b></b></span></b></span></b></span></b></span></b></div><div><div><div><div style="display: inline !important;"></div></div><div><span class="Apple-style-span" style="font-family: verdana;">Cuidado! Requisitos de negócio devem estar associados VALORES DE NEGÓCIO, ou seja, eficiências, eficácias e oportunidades.</span></div></div></div><div><div><span class="Apple-style-span" style="font-size: small;"><span class="Apple-style-span" style="font-family: verdana;">Este é o mindset:</span></span><br />
<span class="Apple-style-span" style="font-size: small;"><span class="Apple-style-span" style="font-family: verdana;"><br />
</span></span></div><div><b><span class="Apple-style-span" style="color: #000099;"><span class="Apple-style-span" style="font-size: small;"><span class="Apple-style-span" style="font-family: verdana;">Requisito de Negócio = Cenário atual(perdas de oportunidades, ineficiências) + Cenário Desejado (objetivos, conformidades, etc.)</span></span></span></b></div><div><span class="Apple-style-span" style="font-size: small;"><span class="Apple-style-span" style="font-family: verdana;"><br />
</span></span></div><div><span class="Apple-style-span" style="font-family: verdana;">A análise de requisitos não pára por aqui. Na verdade ela só para nos requisitos de software (features), mas isso é assunto para outro post.</span></div><div><span class="Apple-style-span" style="font-family: verdana;"><br />
</span><br />
<span class="Apple-style-span" style="font-family: verdana;">O importante é o entendimento de como pensar requisitos.</span></div><div><span class="Apple-style-span" style="font-family: verdana;"><br />
</span><br />
<span class="Apple-style-span" style="font-family: verdana;">Ainda existem muitos outros aspectos abortados no curso de requistios que fiz. Este é só um pedacinho..</span></div><div><span class="Apple-style-span" style="font-family: verdana;"><b><br />
</b></span><br />
<span class="Apple-style-span" style="font-family: verdana;"><b>O curso de requisitos de software que fiz vale a pena!!! Pra mim deve ser PRÉ-REQUISTITO para qualquer um que deseja intitular-se analista de sistema/negócio/teste.</b></span></div><div><span class="Apple-style-span" style="font-family: verdana;"><br />
</span></div><div><span class="Apple-style-span" style="font-family: verdana;">Era isso..</span></div><div><b><span class="Apple-style-span" style="font-size: small;"><span class="Apple-style-span" style="font-family: verdana;"><br />
</span></span></b></div></div><div><br />
</div>Alexandre Simundihttp://www.blogger.com/profile/07075473948224038728noreply@blogger.com4tag:blogger.com,1999:blog-7642770694393333804.post-39489931682174420142010-03-11T18:07:00.001-03:002010-07-04T23:37:30.854-03:00Instalar OC4j no Ubuntu<div>Esses tempos tive que instalar o OC4J para trabalhar.</div><div><br />
</div><div>Então resolvi fazer esse post para não sofrer novamente com algumas configurações. </div><div><br />
</div><div><br />
</div><div><b><span class="Apple-style-span" style="font-size: large;">Instalação</span></b></div><div><br />
</div><div>Bom a instalação foi tranquila. </div><div>Segui os passos da documentação da Oracle e não tive problemas: http://download.oracle.com/docs/cd/B25221_04/web.1013/b14432/install.htm</div><div><br />
</div><div><b>Atenção com os paths das variáveis de ambiente!</b></div><div><br />
<a name='more'></a><br />
</div><div><b><span class="Apple-style-span" style="font-size: large;">Ativar o Enterprise Manager</span></b></div><div><div><b><br />
</b></div><div>Para ativar no Enterrpise Manager, executei o seginte comando:</div><div><div>java -jar jazn.jar -activateadmin <i><b>oc4jadmin</b></i></div><div><br />
</div><div><b>OBS:</b> o valor <i><b>oc4jadmin</b><span class="Apple-style-span" style="font-style: normal;"> é a senha que será utiliza para acessar o Enterprise Manager.</span></i></div><div><br />
</div><div>O output foi:</div><div><div>This option has been deprecated. </div><div>Please start the OC4J server to set the administrator's password. If the OC4J administrator account has already been activated, use the Application Server Control Console or the Admintool to change the password for this account.</div><div><br />
</div><div><b><span class="Apple-style-span" style="font-size: large;">Startar o Servidor</span></b></div><div><br />
</div><div>Para startar o servidor: </div><div>../../bin/oc4j -start</div><div><br />
</div><div>E startou na porta 8888</div><div><br />
</div><div><br />
</div><div>Para alterar a porta, ou descobrir qual está rodando, o arquivo com essa informação é: </div><div>/opt/servers/oc4j_extended_101350/j2ee/home/config/default-web-site.xml</div><div><br />
</div><div><br />
</div><div><b><span class="Apple-style-span" style="font-size: large;">Arquivos de Configuração</span></b></div><div><br />
</div><div>Como está descrito na <a href="http://www.theserverside.com/tt/articles/content/J2EE-Deployment/chapter.html">nesta documentação</a>, a estrutura básica do arquivo .ear é a seguinte:</div><div><div></div><blockquote><div>AppName.ear</div><div>|_ META-INF\</div><div><span class="Apple-tab-span" style="white-space: pre;"> </span>|_ application.xml</div><div>|_ EJB .jar</div><div>|_ Web Application .war</div><div>|_ Resource Adapter .rar</div><div>|_ Application Client.jar</div><div>|_ Dependency Library.jar</div></blockquote><div></div></div><div><br />
</div><div>Existe um arquivo proprietário do oc4j que contem informações do deploy da sua aplicação, no OC4J. Esse arquivo é o <b>orion-application.xml. </b></div><div><b><br />
</b></div><div><b><span class="Apple-style-span" style="font-weight: normal;"><a href="http://download-east.oracle.com/docs/cd/B25221_04/web.1013/b14433/packag.htm">Nesta outra página da documentação do OC4J</a> tem a descrição completa da estrutura dos arquivos EAR, com os arquivos proprietários do OC4J.</span></b></div><div><b><br />
</b></div><div>Esse arquivo fica armazenado no diretório META-INF dentro do arquivo EAR. Conforme abaixo:</div><div><br />
</div><div><div><blockquote><div>AppName.ear</div><div>|_ META-INF\</div><div><span class="Apple-tab-span" style="white-space: pre;"> </span>|_ application.xml</div><div><span class="Apple-tab-span" style="white-space: pre;"> </span>|_ <b>orion-application.xml</b></div><div>|_ EJB .jar</div><div>|_ Web Application .war</div><div>|_ Resource Adapter .rar</div><div>|_ Application Client.jar</div><div>|_ Dependency Library.jar</div></blockquote><div></div></div></div><div><br />
</div><div><br />
</div><div><b><span class="Apple-style-span" style="font-size: large;">Modo DEBUG e Parâmetros de Memória</span></b></div><div><br />
</div><div>Como eu não consegui rodar o OC4J "dentro" do eclipse, eu configurei ele para rodar em modo DEBUG.</div><div><br />
</div><div>Alterar a seguinte linha no arquivo "oc4j" que está na pasta bin:</div><div><br />
</div><div><div><i><span class="Apple-style-span" style="color: #009900;">$JAVA_HOME/bin/java -Xdebug -Xrunjdwp:transport=dt_socket,address=4999,server=y,suspend=n -Xms512m -Xmx1024m -XX:PermSize=128M -XX:MaxPermSize=256M $JVMARGS -jar $OC4J_JAR $CMDARGS</span></i></div><div><br />
</div><div>Esta linha configura para o servidor rodar em DEBUG e criar um socket na porta 4999 e também configura alguns parâmetros de memória. Para não ocorrer o famoso "perm gen error".</div><div><br />
</div><div><br />
</div><div><br />
</div><div>Era isso...</div></div><div><br />
</div><div><br />
</div><div><br />
</div><div><br />
</div><div><br />
</div></div><div><br />
</div></div></div>Alexandre Simundihttp://www.blogger.com/profile/07075473948224038728noreply@blogger.com1tag:blogger.com,1999:blog-7642770694393333804.post-59881688127874795672010-01-20T09:48:00.002-02:002010-07-04T23:37:47.054-03:00Spring Roo, a filosofia por trás do código...<div style="text-align: left;"><span class="Apple-style-span" style="font-family: arial;"><span class="Apple-style-span" style="font-size: medium;">Dae gurizada..</span></span></div><div><div style="text-align: justify;"><span class="Apple-style-span" style="font-family: arial;"><span class="Apple-style-span" style="font-size: medium;"><br />
</span></span></div><div style="text-align: justify;"><span class="Apple-style-span" style="font-family: arial;"><span class="Apple-style-span" style="font-size: medium;">Esse post está guardado há uns 2 meses, então não reparem as datas... ;)</span></span></div><div style="text-align: justify;"><span class="Apple-style-span" style="font-family: arial;"><span class="Apple-style-span" style="font-size: medium;"><br />
</span></span></div><div style="text-align: justify;"><span class="Apple-style-span" style="font-family: arial;"><span class="Apple-style-span" style="font-size: medium;">No último dia 09/Novembro fui no </span></span><a href="http://www.thedevelopersconference.com.br/"><span class="Apple-style-span" style="font-family: arial;"><span class="Apple-style-span" style="font-size: medium;">TDC</span></span></a><span class="Apple-style-span" style="font-family: arial;"><span class="Apple-style-span" style="font-size: medium;">, onde tive a satisfação de assistir a palestra do próprio Rod Johnson, sobre spring Roo. </span></span></div><div style="text-align: justify;"><span class="Apple-style-span" style="font-family: arial;"><span class="Apple-style-span" style="font-size: medium;"><br />
</span></span></div><div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgJZNBkfQPcWRXfV2_YaGNC9DkR3MINyqEXXAqUfozArOD7tGlK_OoXZxMkhp3AX_Vgni8W4lDY5tnwZssTGSnTqsFRsPlVEJnVhelEwK1Ma8Lc6TMYK_68N8ONHN-wKqSdcT-MuqevHhc/s1600/Simundo_e_Rod.jpg" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"><img alt="" border="0" id="BLOGGER_PHOTO_ID_5410448501435499874" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgJZNBkfQPcWRXfV2_YaGNC9DkR3MINyqEXXAqUfozArOD7tGlK_OoXZxMkhp3AX_Vgni8W4lDY5tnwZssTGSnTqsFRsPlVEJnVhelEwK1Ma8Lc6TMYK_68N8ONHN-wKqSdcT-MuqevHhc/s320/Simundo_e_Rod.jpg" style="cursor: pointer; display: block; height: 240px; margin-bottom: 10px; margin-left: auto; margin-right: auto; margin-top: 0px; text-align: justify; width: 320px;" /></a><br />
<div style="text-align: center;"><span class="Apple-style-span" style="font-family: arial;"><span class="Apple-style-span" style="font-size: medium;">Eu e o Rod. Os carecas.. hehehe</span></span></div></div><div style="text-align: justify;"><span class="Apple-style-span" style="font-family: arial;"><span class="Apple-style-span" style="font-size: medium;"><br />
</span></span></div><div style="text-align: justify;"><span class="Apple-style-span" style="font-family: arial;"><span class="Apple-style-span" style="font-size: medium;"></span></span><br />
<span class="Apple-style-span" style="font-family: arial;"><span class="Apple-style-span" style="font-size: medium;"><a name='more'></a><br />
</span></span></div><div style="text-align: justify;"><span class="Apple-style-span" style="font-family: arial;"><span class="Apple-style-span" style="font-size: medium;">Na verdade o painel sobre Spring Roo não estava previsto para o evento de Floripa. Como o Chris Schalk da Google não pode entrar no Brasil, o Rod Johnson improvisou a apresentação. Valeu muito a pena!!!</span></span></div><div style="text-align: justify;"><span class="Apple-style-span" style="font-family: arial;"><span class="Apple-style-span" style="font-size: medium;"><br />
</span></span></div><div style="text-align: justify;"><span class="Apple-style-span" style="font-family: arial;"><span class="Apple-style-span" style="font-size: medium;">Informações sobre o The Developer Conference - TDC:</span></span></div><div style="text-align: justify;"><span class="Apple-style-span" style="font-family: arial;"><span class="Apple-style-span" style="font-size: medium;">Site Oficial: </span></span><a href="http://www.thedevelopersconference.com.br/tdc/2009/index.seam"><span class="Apple-style-span" style="font-family: arial;"><span class="Apple-style-span" style="font-size: medium;">www.thedevelopersconference.com.br</span></span></a></div><div style="text-align: justify;"><span class="Apple-style-span" style="font-family: arial;"><span class="Apple-style-span" style="font-size: medium;">Resumo do evento: </span></span><a href="http://diego-pacheco.blogspot.com/2009/11/tdc-2009-floripa-eu-fui.html"><span class="Apple-style-span" style="font-family: arial;"><span class="Apple-style-span" style="font-size: medium;">tdc-2009-floripa-eu-fui</span></span></a></div><div style="text-align: justify;"><span class="Apple-style-span" style="font-family: arial;"><span class="Apple-style-span" style="font-size: medium;"><br />
</span></span></div><div style="text-align: justify;"><span class="Apple-style-span" style="font-family: arial;"><span class="Apple-style-span" style="font-size: medium;"><br />
</span></span></div><div style="text-align: justify;"><span class="Apple-style-span" style="font-family: arial;"><span class="Apple-style-span" style="font-size: medium;">Então.. vamos lá...</span></span></div><div style="text-align: justify;"><span class="Apple-style-span" style="font-family: arial;"><span class="Apple-style-span" style="font-size: medium;"><br />
</span></span></div><div style="text-align: justify;"><b><span class="Apple-style-span" style="font-family: arial;"><span class="Apple-style-span" style="font-size: medium;">O que é Spring Roo?</span></span></b></div><div style="text-align: justify;"><span class="Apple-style-span" style="font-family: arial;"><span class="Apple-style-span" style="font-size: medium;"><br />
</span></span></div><div style="text-align: justify;"><span class="Apple-style-span" style="font-family: arial;"><span class="Apple-style-span" style="font-size: medium;">Spring Roo é um gerador de código, que faz isso de forma rápida e fácil (segundo a documentação...rsrsrs)</span></span></div><div style="text-align: justify;"><span class="Apple-style-span" style="font-family: arial;"><span class="Apple-style-span" style="font-size: medium;"><br />
</span></span></div><div style="text-align: justify;"><i><span class="Apple-style-span" style="font-family: arial;"><b><span class="Apple-style-span" style="font-size: medium;">"A missão do Spring Roo é melhorar a produtivadade do desenvolvimento de aplicações java sem comprometer a engenharia, integridade ou flexibilidade." Ben Alex (Líder do projeto)</span></b></span></i></div><div style="text-align: justify;"><span class="Apple-style-span" style="font-family: arial;"><span class="Apple-style-span" style="font-size: medium;"><br />
</span></span></div><div style="text-align: justify;"><span class="Apple-style-span" style="font-family: arial;"><span class="Apple-style-span" style="font-size: medium;">Para quem já mexeu com o Grails, o Spring Roo é bem semelhante. Até porque, o Spring Roo surgiu após a compra do G2One, dona do Grails, pela SpringSource.</span></span></div><div style="text-align: justify;"><span class="Apple-style-span" style="font-family: arial;"><span class="Apple-style-span" style="font-size: medium;"><br />
</span></span></div><div style="text-align: justify;"><span class="Apple-style-span" style="font-family: arial;"><span class="Apple-style-span" style="font-size: medium;">O Spring Roo é feito para os "desenvolvedores desenvolverem". Parece estranho, mas o Roo é feito para quem gosta de escrever código. Esqueça os Wizards!!!!</span></span></div><div style="text-align: justify;"><span class="Apple-style-span" style="font-family: arial;"><span class="Apple-style-span" style="font-size: medium;"><br />
</span></span></div><div style="text-align: justify;"><span class="Apple-style-span" style="font-family: arial;"><span class="Apple-style-span" style="font-size: medium;">Assim como o Grails, o Spring Roo fica "observando" o código que é escrito. Ele faz o"round-trip" do código se adaptando ao código alterado. </span></span></div><div style="text-align: justify;"><span class="Apple-style-span" style="font-family: arial;"><span class="Apple-style-span" style="font-size: medium;"><br />
</span></span></div><div style="text-align: justify;"><span class="Apple-style-span" style="font-family: arial;"><span class="Apple-style-span" style="font-size: medium;">Quando você rodar o Roo o que vai acontecer??? Abrir um SHELL. Dessa forma através de linha de comando você executa a criação do seu projeto.</span></span></div><div style="text-align: justify;"><span class="Apple-style-span" style="font-family: arial;"><span class="Apple-style-span" style="font-size: medium;"><br />
</span></span></div><div style="text-align: justify;"><b><span class="Apple-style-span" style="font-family: arial;"><span class="Apple-style-span" style="font-size: medium;"><br />
</span></span></b></div><div style="text-align: justify;"><b><span class="Apple-style-span" style="font-family: arial;"><span class="Apple-style-span" style="font-size: medium;"><br />
</span></span></b></div><div style="text-align: justify;"><b><span class="Apple-style-span" style="font-family: arial;"><span class="Apple-style-span" style="font-size: medium;">Historinha...</span></span></b></div><div><span class="Apple-style-span" style="font-family: arial;"><span class="Apple-style-span" style="font-family: Georgia, serif;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgJzkSMX1ApCo8Sc72-nw0Oxltw1pvpBgfpYgeZrYWYqPPS-c8K2FbOECM9zadde8_nzhOMfb_MrDnVS8iJrdrgzryIJS9snlXBXYUo4C1r0pWtj0B2_rbH1LaR4pLwWDCUkXumrug2iRI/s1600-h/CanguruBoxe01.jpg" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"><span class="Apple-style-span" style="font-size: medium;"><br />
</span><img alt="" border="0" id="BLOGGER_PHOTO_ID_5410466226341307586" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgJzkSMX1ApCo8Sc72-nw0Oxltw1pvpBgfpYgeZrYWYqPPS-c8K2FbOECM9zadde8_nzhOMfb_MrDnVS8iJrdrgzryIJS9snlXBXYUo4C1r0pWtj0B2_rbH1LaR4pLwWDCUkXumrug2iRI/s320/CanguruBoxe01.jpg" style="cursor: pointer; display: block; height: 320px; margin-bottom: 10px; margin-left: auto; margin-right: auto; margin-top: 0px; text-align: justify; width: 258px;" /></a></span></span></div><div style="text-align: justify;"><span class="Apple-style-span" style="font-family: arial;"><span class="Apple-style-span" style="font-size: medium;">No painel do TDC o Rod Johson comentou que "roo" é um apelido para os cangurus. Roo também significa mola, já fazendo analogia a produtividade que ele proporciona.</span></span></div><div style="text-align: justify;"><span class="Apple-style-span" style="font-family: arial;"><span class="Apple-style-span" style="font-size: medium;"><br />
</span></span></div><div style="text-align: justify;"><span class="Apple-style-span" style="font-family: arial;"><span class="Apple-style-span" style="font-size: medium;"><br />
</span></span></div><div style="text-align: justify;"><span class="Apple-style-span" style="font-family: arial;"><span class="Apple-style-span" style="font-size: medium;"><span class="Apple-style-span" style="font-family: Georgia, serif;"></span></span></span><br />
<span class="Apple-style-span" style="font-family: arial;"><span class="Apple-style-span" style="font-size: medium;"><span class="Apple-style-span" style="font-family: Georgia, serif;"><div style="text-align: justify;"><b><span class="Apple-style-span" style="font-family: arial;"><span class="Apple-style-span" style="font-size: medium;">Filosofia</span></span></b></div><div style="text-align: justify;"><b><span class="Apple-style-span" style="font-family: arial;"><span class="Apple-style-span" style="font-size: medium;"><br />
</span></span></b></div><div style="text-align: justify;"><b><span class="Apple-style-span" style="font-family: arial;"><span class="Apple-style-span" style="font-family: Georgia, serif; font-weight: normal;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgPzPKJU3WYhu1qf1rjyd58OmZ-Mk4ixqW3Sp_oSkg8wLKjpuDDqkPkBOclmu57sewVm7TxrAcS8IefMtn2mHhd0Rd20QyyeTqrPqZvp5JY1IJ_6CKgJiHvxTnSG-bgJ5WWrQIjdfUwYvg/s1600-h/pensadorodin2.jpg" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"><img alt="" border="0" id="BLOGGER_PHOTO_ID_5410476994128640338" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgPzPKJU3WYhu1qf1rjyd58OmZ-Mk4ixqW3Sp_oSkg8wLKjpuDDqkPkBOclmu57sewVm7TxrAcS8IefMtn2mHhd0Rd20QyyeTqrPqZvp5JY1IJ_6CKgJiHvxTnSG-bgJ5WWrQIjdfUwYvg/s320/pensadorodin2.jpg" style="cursor: pointer; display: block; height: 320px; margin-bottom: 10px; margin-left: auto; margin-right: auto; margin-top: 0px; text-align: center; width: 230px;" /></a></span></span></b></div><div style="text-align: justify;"><span class="Apple-style-span" style="font-family: arial;"><span class="Apple-style-span"><span class="Apple-style-span" style="font-size: medium;">O conceito do Roo é que o código java é do do Desenvolvedor. O Roo fica nos bastidores, observando o que é desenvolvido e auxiliando em alguns pontos.</span></span></span></div><div style="text-align: justify;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgPzPKJU3WYhu1qf1rjyd58OmZ-Mk4ixqW3Sp_oSkg8wLKjpuDDqkPkBOclmu57sewVm7TxrAcS8IefMtn2mHhd0Rd20QyyeTqrPqZvp5JY1IJ_6CKgJiHvxTnSG-bgJ5WWrQIjdfUwYvg/s1600-h/pensadorodin2.jpg" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"><span class="Apple-style-span" style="color: black; font-family: arial;"><span class="Apple-style-span" style="font-size: medium;"><br />
</span></span></a></div><div style="text-align: justify;"><span class="Apple-style-span" style="font-family: arial;"><span class="Apple-style-span" style="background-color: white; font-family: Verdana;"><span class="Apple-style-span"><span class="Apple-style-span" style="font-size: medium;">A documentação define o Roo como "um pequeno gênio que fica setando em segundo plano fazendo coisas que eu não preciso me preocupar". Pequeno porquê a versão atual tem menos de 3mb, que lhe permite continuar com o modelo atual de desenvovimento de aplicações java com Spring e você não necessita adaptar novas tecnologias.</span></span></span></span></div><div style="text-align: justify;"><span class="Apple-style-span" style="font-family: arial;"><span class="Apple-style-span" style="background-color: white; font-family: Verdana;"><span class="Apple-style-span"><span class="Apple-style-span" style="font-size: medium;"><br />
</span></span></span></span></div><div style="text-align: justify;"><span class="Apple-style-span" style="font-family: arial;"><span class="Apple-style-span" style="background-color: white; font-family: Verdana;"><span class="Apple-style-span"><span class="Apple-style-span" style="font-family: arial;"><b><span class="Apple-style-span" style="font-size: medium;">"Precisa alterar alguma coisa no código? Faça e deixe que o Roo se vire!"</span></b></span></span></span></span></div><div style="text-align: justify;"><span class="Apple-style-span" style="font-family: arial;"><span class="Apple-style-span" style="background-color: white; font-family: Verdana;"><span class="Apple-style-span"><span class="Apple-style-span" style="font-size: medium;"><br />
</span></span></span></span></div><div style="text-align: justify;"><span class="Apple-style-span" style="font-family: arial;"><span class="Apple-style-span" style="background-color: white; font-family: Verdana;"><span class="Apple-style-span"><span class="Apple-style-span" style="font-size: medium;">Roo não fica no seu caminho, se você quiser reescrever alguma coisa faça, ele irá se adaptar e ajustar os arquivos relevantes.</span></span></span></span></div><div style="text-align: justify;"><span class="Apple-style-span" style="font-family: arial;"><span class="Apple-style-span" style="background-color: white; font-family: Verdana;"><span class="Apple-style-span"><span class="Apple-style-span" style="font-size: medium;"><br />
</span></span></span></span></div><div style="text-align: justify;"><span class="Apple-style-span" style="font-family: arial;"><b><span class="Apple-style-span" style="font-size: medium;"><br />
</span></b></span></div></span></span></span></div><div style="text-align: justify;"><span class="Apple-style-span" style="font-family: arial;"><span class="Apple-style-span" style="font-size: medium;"><br />
</span></span></div><div style="text-align: justify;"><span class="Apple-style-span" style="font-family: arial;"><b><span class="Apple-style-span" style="font-size: medium;">A IDE</span></b></span></div><div style="text-align: justify;"><span class="Apple-style-span" style="font-family: arial;"><span class="Apple-style-span" style="font-size: medium;"><br />
</span></span></div><div style="text-align: justify;"><span class="Apple-style-span" style="font-family: arial;"><span class="Apple-style-span" style="font-size: medium;"><br />
</span></span></div><div style="text-align: justify;"><span class="Apple-style-span" style="font-family: arial;"><span class="Apple-style-span" style="font-family: Georgia, serif;"></span></span><br />
<span class="Apple-style-span" style="font-family: arial;"><span class="Apple-style-span" style="font-family: Georgia, serif;"><div style="text-align: justify;"><span class="Apple-style-span" style="font-family: arial;"><span class="Apple-style-span" style="font-family: Georgia, serif;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhbmEVZs9toKjqnoVu8M2o6l-jx91noumg9Im6XThuwL4YQ2iRZnkghAjn-UzGQtCvVw11hi2_j_IBRfRTcv7x7dCnM7P_x35MKG3CeCTt4Cd5ijZ9gNtqQcVymXXsStJFF0yqWk4n4d9I/s1600-h/ide.png" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"><img alt="" border="0" id="BLOGGER_PHOTO_ID_5410470861593387714" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhbmEVZs9toKjqnoVu8M2o6l-jx91noumg9Im6XThuwL4YQ2iRZnkghAjn-UzGQtCvVw11hi2_j_IBRfRTcv7x7dCnM7P_x35MKG3CeCTt4Cd5ijZ9gNtqQcVymXXsStJFF0yqWk4n4d9I/s320/ide.png" style="cursor: pointer; display: block; height: 98px; margin-bottom: 10px; margin-left: auto; margin-right: auto; margin-top: 0px; text-align: center; width: 320px;" /></a></span></span></div><div style="text-align: center;"><span class="Apple-style-span" style="font-family: arial;"><span class="Apple-style-span" style="font-family: Georgia, serif;"><span class="Apple-style-span" style="font-size: medium;">Roo</span></span></span></div><div><span class="Apple-style-span" style="font-family: arial;"><span class="Apple-style-span" style="font-family: Georgia, serif;"><span class="Apple-style-span" style="font-size: medium;"><br />
</span></span></span></div></span></span></div><div style="text-align: justify;"><span class="Apple-style-span" style="font-family: arial;"><span class="Apple-style-span" style="font-size: medium;">Está claro nos posts sobre o Roo que o objetivo é trazer produtividade ao desenvolvimento de aplicações java. Não tem como relacionar produtividade sem usabilidade quando falamos em ferramentas. </span></span></div><div style="text-align: justify;"><span class="Apple-style-span" style="font-family: arial;"><span class="Apple-style-span" style="font-size: medium;"><br />
</span></span></div><div style="text-align: justify;"><span class="Apple-style-span" style="font-family: arial;"><span class="Apple-style-span" style="font-size: medium;">A grande preocupação é focar na tarefa do desenvolvedor. Por isso o Roo é um "shell", não um conjunto de wizards. Dessa forma, aproveita o "tab-compliting", funcionalidade que o desenvolvedor já está a costumado a utilizar.</span></span></div><div style="text-align: justify;"><span class="Apple-style-span" style="font-family: arial;"><span class="Apple-style-span" style="font-size: medium;"><br />
</span></span></div><div style="text-align: justify;"><span class="Apple-style-span" style="font-family: arial;"><b><span class="Apple-style-span" style="font-size: medium;">O Roo não tem o objetivo de eliminar as IDEs, pelo contrário.</span></b></span><span class="Apple-style-span" style="font-family: arial;"><span class="Apple-style-span" style="font-size: medium;"> Ele etende que a utilização de IDEs é importante, por isso continua executando o round-trip, enquanto os desenvolvedores trabalham com as IDEs normais. Não é necessário nenhum plugin para utilizaro Roo junto com IDEs. Apesar de o Spring Tool Suite ter integração com o Roo, viabilizado que o comandos sejam executados a partir do Eclipse.</span></span></div><div style="text-align: justify;"><span class="Apple-style-span" style="font-family: arial;"><span class="Apple-style-span" style="font-size: medium;"><br />
</span></span></div><div style="text-align: justify;"><span class="Apple-style-span" style="font-family: arial;"><span class="Apple-style-span" style="font-size: medium;"><br />
</span></span></div><div style="text-align: justify;"><span class="Apple-style-span" style="font-family: arial;"><b><span class="Apple-style-span" style="font-size: medium;">Ajuda Contextualizada</span></b></span></div><div style="text-align: justify;"><span class="Apple-style-span" style="font-family: arial;"><span class="Apple-style-span" style="font-size: medium;">Além do </span><i><span class="Apple-style-span" style="font-size: medium;">tab compliting</span><span class="Apple-style-span" style="font-style: normal;"><span class="Apple-style-span" style="font-size: medium;"> foi desenvolvido um sistema de </span></span></i><span class="Apple-style-span" style="font-size: medium;">de dicas, que apresentam sugestões de o que deve ser feito, de acordo com as ações tomadas pelo usuário.</span></span></div><div style="text-align: justify;"><span class="Apple-style-span" style="font-family: arial;"><span class="Apple-style-span" style="font-size: medium;"><br />
</span></span></div><div><span class="Apple-style-span" style="font-family: arial;"><span class="Apple-style-span" style="-webkit-text-decorations-in-effect: underline; color: #0000ee; font-family: Georgia, serif;"><img alt="" border="0" id="BLOGGER_PHOTO_ID_5410465768986972706" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg9BOM81kuVlXlqOFgF8MTpR_Ww5AoIfVWvloowMIW7efSI2dxY7-cGPfWj9VfjQ2Gji2ysyXJytTLQSfYVcaF2j1ytMoFpDn_qwva2VDs4T2G03ElvxUotoz9CY-RZjjheUgDy1TQgBKE/s320/hint.png" style="cursor: pointer; display: block; height: 184px; margin-bottom: 10px; margin-left: auto; margin-right: auto; margin-top: 0px; text-align: justify; width: 320px;" /></span></span></div><div style="text-align: center;"><span class="Apple-style-span" style="font-family: arial;"><span class="Apple-style-span" style="font-size: medium;">Exemplo da utilização da palavra "hint". </span></span></div><div style="text-align: center;"><span class="Apple-style-span" style="font-family: arial;"><span class="Apple-style-span" style="font-size: medium;"><br />
</span></span></div><div style="text-align: justify;"><span class="Apple-style-span" style="font-family: arial;"><span class="Apple-style-span" style="font-size: medium;">Na imagem acima, após digitar a plavra "hint", o Roo apresenta como proceder para cirar um projeto. Na figura abaixo, após ter criado o projeto e digitado "hint", o Roo indica que deve configurar um Data Provider para o projeto.</span></span></div><div style="text-align: justify;"><span class="Apple-style-span" style="font-family: arial;"><span class="Apple-style-span" style="font-size: medium;"><br />
</span></span></div><div style="text-align: justify;"><span class="Apple-style-span" style="font-family: arial;"><span class="Apple-style-span" style="-webkit-text-decorations-in-effect: underline; color: #0000ee; font-family: Georgia, serif;"><img alt="" border="0" id="BLOGGER_PHOTO_ID_5410468791769543826" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhBfCwTpZSxD4-5UKza9VE1C75uFVrhDapvP5rDVWo7e9csXWwqZjUgPP9PAxF3qtklNX7Ivi_c2Iee-LhGkGNFeNa7ATgcYU5Rj1Eu_9lfD7sPYf4sAcd1HbWaJsJWDdR5E1Urd6p4pQU/s320/projeto_criado.png" style="cursor: pointer; display: block; height: 184px; margin-bottom: 10px; margin-left: auto; margin-right: auto; margin-top: 0px; text-align: center; width: 320px;" /></span></span></div><div style="text-align: justify;"><span class="Apple-style-span" style="font-family: arial;"><span class="Apple-style-span" style="font-size: medium;"><br />
</span></span></div><div style="text-align: justify;"><span class="Apple-style-span" style="font-family: arial;"><span class="Apple-style-span" style="font-size: medium;"><br />
</span></span></div><div style="text-align: justify;"><span class="Apple-style-span" style="font-family: arial;"><b><span class="Apple-style-span" style="font-size: medium;"><br />
</span></b></span></div><div style="text-align: justify;"><span class="Apple-style-span" style="font-family: arial;"><b><span class="Apple-style-span" style="font-family: Georgia, serif; font-weight: normal;"><b><span class="Apple-style-span" style="font-family: arial;"><span class="Apple-style-span" style="font-size: medium;">Um projetinho rápido</span></span></b></span></b></span></div><div style="text-align: justify;"><span class="Apple-style-span" style="font-family: arial;"><span class="Apple-style-span" style="font-size: medium;"><br />
</span></span></div><div style="text-align: justify;"><span class="Apple-style-span" style="font-family: arial;"><span class="Apple-style-span" style="font-size: medium;">Bom.. vou colocar aqui os comandos que utilizei para criar um projeto e duas classes com relacionamento.</span></span></div><div style="text-align: justify;"><span class="Apple-style-span" style="font-family: arial;"></span><br />
<span class="Apple-style-span" style="font-family: arial;"><blockquote><b><span class="Apple-style-span" style="color: #009900;"><span class="Apple-style-span" style="font-size: small;">mkdir roo-sample</span></span></b></blockquote></span></div><div style="text-align: justify;"><span class="Apple-style-span" style="font-family: arial; font-size: medium;">Digitei "hint" e o roo me dises que precisava criar um projeto. Segue:</span></div><div style="text-align: justify;"><span class="Apple-style-span" style="font-family: arial;"></span><br />
<span class="Apple-style-span" style="font-family: arial;"><blockquote><span class="Apple-style-span" style="color: #009900;"><b><span class="Apple-style-span" style="font-size: small;">project --topLevelPackage com.simundi.roosample</span></b></span></blockquote></span></div><div style="text-align: justify;"><span class="Apple-style-span" style="font-family: arial; font-size: medium;">O hint me disse que precisava configurar o dataprovider. Usando o TAB compliting eu cheguei ao seginte comando</span></div><blockquote><div style="text-align: justify;"><span class="Apple-style-span" style="font-family: arial;"><span class="Apple-style-span" style="color: #009900;"><b><span class="Apple-style-span" style="font-size: small;">persistence setup --provider HIBERNATE --database HYPERSONIC_IN_MEMORY</span></b></span></span></div><div style="text-align: justify;"></div></blockquote><div style="text-align: justify;"><span class="Apple-style-span" style="font-family: arial; font-size: medium;">OBS: eu digitei "persistence" e apertei TAB, o roo me ajudou a chegar ao resto do comando.</span></div><div style="text-align: justify;"><span class="Apple-style-span" style="font-family: arial;"><span class="Apple-style-span" style="font-size: medium;"><br />
</span></span></div><div style="text-align: justify;"><span class="Apple-style-span" style="font-family: arial;"><span class="Apple-style-span" style="font-size: medium;">Agora, o hint me disse que precisava criar novas entidades. Basta escrever "ent" e usar o TAB. </span></span></div><div style="text-align: justify;"><span class="Apple-style-span" style="font-family: arial;"></span><br />
<span class="Apple-style-span" style="font-family: arial;"><blockquote><span class="Apple-style-span" style="color: #009900;"><b><span class="Apple-style-span" style="font-size: small;">entity --name ~Pessoa</span></b></span></blockquote></span></div><div style="text-align: justify;"><span class="Apple-style-span" style="font-family: arial;"><span class="Apple-style-span" style="font-size: medium;">OBS: o "~" que coloque antes do nome da classe indica que a classe será cirada no pacote padrão. Neste caso o pacote padrão é "com.simundi.roosample".</span></span></div><div style="text-align: justify;"><span class="Apple-style-span" style="font-family: arial;"><span class="Apple-style-span" style="font-size: medium;"><br />
</span></span></div><div style="text-align: justify;"><span class="Apple-style-span" style="font-family: arial;"><span class="Apple-style-span" style="font-size: medium;">Adicionando um novo campo na classe, utilizei o seguinte comando:</span></span></div><div style="text-align: justify;"><span class="Apple-style-span" style="font-family: arial;"></span><br />
<span class="Apple-style-span" style="font-family: arial;"><blockquote><span class="Apple-style-span" style="color: #009900;"><b><span class="Apple-style-span" style="font-size: small;">field string --fieldName nome</span></b></span></blockquote></span></div><div style="text-align: justify;"><span class="Apple-style-span" style="font-family: arial; font-size: medium;">OBS: se digitar "--" e apertar TAB, o roo vai mostrar todas as opções para o comando.</span></div><div style="text-align: justify;"><span class="Apple-style-span" style="font-family: arial;"><span class="Apple-style-span" style="font-size: medium;">Exemplo: digite "field string --fieldName nome </span><b><span class="Apple-style-span" style="font-size: medium;">--</span></b><span class="Apple-style-span" style="font-size: medium;">" e aparte TAB.</span></span></div><div style="text-align: justify;"><span class="Apple-style-span" style="font-family: arial;"><span class="Apple-style-span" style="font-size: medium;"><br />
</span></span></div><div style="text-align: justify;"><span class="Apple-style-span" style="font-family: arial;"><span class="Apple-style-span" style="font-size: medium;">Agora vou só colocar os comandos que executei:</span></span></div><div style="text-align: justify;"><span class="Apple-style-span" style="font-size: medium;"><span class="Apple-style-span" style="font-family: arial;"></span></span></div><blockquote><div style="text-align: justify;"><span class="Apple-style-span" style="font-family: arial;"><span class="Apple-style-span" style="color: #009900;"><b><span class="Apple-style-span" style="font-size: small;">field string --fieldName nome --sizeMax 50 --notNull</span></b></span></span></div><div style="text-align: justify;"><span class="Apple-style-span" style="font-family: arial;"><span class="Apple-style-span" style="color: #009900;"><b><span class="Apple-style-span" style="font-size: small;">entity --name ~Endereco</span></b></span></span></div><div style="text-align: justify;"><span class="Apple-style-span" style="font-family: arial;"><span class="Apple-style-span" style="color: #009900;"><b><span class="Apple-style-span" style="font-size: small;">field number --fieldName numero --type integer</span></b></span></span></div><div style="text-align: justify;"><span class="Apple-style-span" style="font-family: arial;"><span class="Apple-style-span" style="color: #009900;"><b><span class="Apple-style-span" style="font-size: small;">field string --fieldName complemento</span></b></span></span></div></blockquote><div style="text-align: justify;"><span class="Apple-style-span" style="font-size: small;"><span class="Apple-style-span" style="font-family: arial;"></span></span></div><div style="text-align: justify;"><span class="Apple-style-span" style="font-family: arial;"><b><span class="Apple-style-span" style="font-family: Georgia, serif; font-weight: normal;"><b><span class="Apple-style-span" style="font-family: arial;"><span class="Apple-style-span" style="font-size: medium;">Roo no Eclipse</span></span></b></span></b></span></div><div style="text-align: justify;"><span class="Apple-style-span" style="font-family: arial;"><span class="Apple-style-span" style="font-size: medium;"><br />
</span></span></div><div style="text-align: justify;"><span class="Apple-style-span" style="font-family: arial;"><span class="Apple-style-span" style="font-size: medium;">Um dos princípios do Roo é ser independente de plataforma. Então, importei o proejto criado no Eclipse Ganymede. Esse eclpse não tem nenhum plugin da SpringSource, apenas o plugin para o maven. </span></span></div><div style="text-align: justify;"><span class="Apple-style-span" style="font-family: arial;"><span class="Apple-style-span" style="font-size: medium;"><br />
</span></span></div><div style="text-align: justify;"><span class="Apple-style-span" style="font-family: arial;"><span class="Apple-style-span" style="font-size: medium;">O Resultado do projeto é o seguinte:</span></span></div><div style="text-align: justify;"><span class="Apple-style-span" style="font-family: arial;"><span class="Apple-style-span" style="font-size: medium;"><br />
</span></span></div><div style="text-align: justify;"><span class="Apple-style-span" style="font-family: arial;"><span class="Apple-style-span" style="font-family: Georgia, serif;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjQd7IX66wZc8fvQxyDJlD1j_otsqi4d7olzzmtvG_bZ6bEA2yDou4hEqnqWhnrMm1H09rT2f6lVLsyqA_gf02E0Di3hjuHZsRVjzqg1x92xrYQNHZ1Fmf-Z06Gm5XtAhQqzuS-jsJiptA/s1600-h/roo-sample-Estrutura.gif" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"><img alt="" border="0" id="BLOGGER_PHOTO_ID_5428660297684498658" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjQd7IX66wZc8fvQxyDJlD1j_otsqi4d7olzzmtvG_bZ6bEA2yDou4hEqnqWhnrMm1H09rT2f6lVLsyqA_gf02E0Di3hjuHZsRVjzqg1x92xrYQNHZ1Fmf-Z06Gm5XtAhQqzuS-jsJiptA/s400/roo-sample-Estrutura.gif" style="cursor: pointer; display: block; height: 400px; margin-bottom: 10px; margin-left: auto; margin-right: auto; margin-top: 0px; text-align: center; width: 255px;" /></a></span></span></div><div><span class="Apple-style-span" style="font-family: arial;"><span class="Apple-style-span" style="font-size: medium;"><br />
</span></span></div><div><span class="Apple-style-span" style="font-family: arial;"><span class="Apple-style-span" style="font-size: medium;"><br />
</span></span></div><div><span class="Apple-style-span" style="font-family: arial;"><span class="Apple-style-span" style="font-size: medium;"><br />
</span></span></div><div style="text-align: justify;"><span class="Apple-style-span" style="font-family: arial;"><span class="Apple-style-span" style="font-size: medium;"><br />
</span></span></div><div style="text-align: justify;"><span class="Apple-style-span" style="font-family: arial;"><span class="Apple-style-span" style="font-size: medium;">Vou fazer outro post para explicar os arquivos .aj(aspecj), mas para que quiser se adiantar esse post pode sanar dúvidas: </span><a href="http://blog.springsource.com/2009/06/18/roo-part-3/"><span class="Apple-style-span" style="font-size: medium;">http://blog.springsource.com/2009/06/18/roo-part-3/</span></a></span></div><div style="text-align: justify;"><span class="Apple-style-span" style="font-family: arial;"><span class="Apple-style-span" style="font-size: medium;"><br />
</span></span></div><div style="text-align: justify;"><span class="Apple-style-span" style="font-family: arial;"><span class="Apple-style-span" style="font-size: medium;">Em resumo o Roo tem o conceito de </span><a href="http://en.wikipedia.org/wiki/Separation_of_concerns"><span class="Apple-style-span" style="font-size: medium;">SoC(Separation of Concerns)</span></a><span class="Apple-style-span" style="font-size: medium;">. Que separa o comportamento do objetos em pequenas partes. Por isso cada arquivo .aj tem um objetivo. Um é para implementar o comportamento do JavaBean(getters e setters), outro é para implementar os métodos de persistência do objeto( seguindo os princípios do </span><a href="http://domaindrivendesign.org/resources/what_is_ddd"><span class="Apple-style-span" style="font-size: medium;">DDD</span></a><span class="Apple-style-span" style="font-size: medium;">) e por ai vai...</span></span></div><div style="text-align: justify;"><span class="Apple-style-span" style="font-family: arial;"><span class="Apple-style-span" style="font-size: medium;"><br />
</span></span></div><div style="text-align: justify;"><span class="Apple-style-span" style="font-family: arial;"><b><br />
</b></span></div><div style="text-align: justify;"><b><span class="Apple-style-span" style="font-family: arial;"><span class="Apple-style-span" style="font-size: medium;">Criar Add-ons</span></span></b></div><div style="text-align: justify;"><span class="Apple-style-span" style="font-family: arial;"><span class="Apple-style-span" style="font-size: medium;">Não existe material sobre como criar add-ons para o Roo. O concelho do Rod é utilizar o Samples-WebFlow como modelo para criação de Add-Ons. </span></span></div><div style="text-align: justify;"><span class="Apple-style-span" style="font-family: arial;"><span class="Apple-style-span" style="font-size: medium;"><br />
</span></span></div><div style="text-align: justify;"><span class="Apple-style-span" style="font-family: arial;"><span class="Apple-style-span" style="font-size: medium;">Esses temos perguntei para o Ben Alex pelo Twitter se tinha alguma pretenção utilizar JSF com o Roo. ele me informou que existiou uma frente de JSF no projeto, mas agora está em análise. mas existe um projeto Alpha, para integrar Flex no Roo. Isso vai ser show!!!</span></span></div><div style="text-align: justify;"><span class="Apple-style-span" style="font-family: arial;"><span class="Apple-style-span" style="font-size: medium;"><br />
</span></span></div><div style="text-align: justify;"><span class="Apple-style-span" style="font-family: arial;"><b><span class="Apple-style-span" style="font-weight: normal;"><span class="Apple-style-span" style="font-size: medium;"><br />
</span></span></b></span></div><div style="text-align: justify;"><b><span class="Apple-style-span" style="font-family: arial;"><span class="Apple-style-span" style="font-size: medium;">Links</span></span></b></div><div style="text-align: justify;"><span class="Apple-style-span" style="font-family: arial;"><b><span class="Apple-style-span" style="font-size: medium;"><br />
</span></b></span></div><div style="text-align: justify;"><b><span class="Apple-style-span" style="font-family: arial;"><a href="http://blog.springsource.com/2009/05/01/roo-part-1/"><span class="Apple-style-span" style="font-size: medium;">http://blog.springsource.com/2009/05/01/roo-part-1/</span></a></span></b></div><div style="text-align: justify;"><b><span class="Apple-style-span" style="font-family: arial;"><a href="http://blog.springsource.com/2009/05/27/roo-part-2/"><span class="Apple-style-span" style="font-size: medium;">http://blog.springsource.com/2009/05/27/roo-part-2/</span></a></span></b></div><div style="text-align: justify;"><b><span class="Apple-style-span" style="font-family: arial;"><span class="Apple-style-span" style="font-size: medium;"><a href="http://blog.springsource.com/2009/06/18/roo-part-3/">http://blog.springsource.com/2009/06/18/roo-part-3/</a></span></span></b></div><div style="text-align: justify;"><b><span class="Apple-style-span" style="font-family: arial;"><br />
</span></b></div><div style="text-align: justify;"><b><span class="Apple-style-span" style="font-family: arial;"><br />
</span></b></div><div style="text-align: justify;"><span class="Apple-style-span" style="font-family: arial;">Era isso...</span></div><div style="text-align: justify;"><b><span class="Apple-style-span" style="font-family: arial;"><br />
</span></b></div></div>Alexandre Simundihttp://www.blogger.com/profile/07075473948224038728noreply@blogger.com1tag:blogger.com,1999:blog-7642770694393333804.post-16685284926596491072009-09-21T17:31:00.001-03:002010-07-04T23:39:46.218-03:00Desenvolverdor Java mudando de Windows para Linux(Ubuntu)<span class="Apple-style-span" style="font-size: 16px;">Dae guriazada...</span><br />
<div style="text-align: justify;"><br />
</div><div style="text-align: justify;"><div style="text-align: justify;"><span style="font-size: 100%;"><span style="font-family: verdana;">No início do ano meu notebook estragou. Demorei uns 4meses para mandar arrumar. Mas consegui! :D:D:D</span></span></div><span style="font-size: 100%;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhpvOCHKBAJ0hRtVqqMS2H8wi4zuQZRxaS9A5d-0oUZOk8UYl9CzeUA-PVnqKxMt9FBfvZceBu_iZcdBvJsihft19RYQW5aegmFdnLR7UgqdGjy53qEyE3D-kV_Mo152HwUryB2eh3X1hc/s1600-h/Screenshot-1.gif" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" style="font-family: verdana;"><img alt="" border="0" id="BLOGGER_PHOTO_ID_5385207730701644658" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhpvOCHKBAJ0hRtVqqMS2H8wi4zuQZRxaS9A5d-0oUZOk8UYl9CzeUA-PVnqKxMt9FBfvZceBu_iZcdBvJsihft19RYQW5aegmFdnLR7UgqdGjy53qEyE3D-kV_Mo152HwUryB2eh3X1hc/s400/Screenshot-1.gif" style="cursor: pointer; display: block; height: 250px; margin: 0px auto 10px; text-align: center; width: 400px;" /></a></span><br />
<div style="text-align: justify;"><span style="font-size: 100%;"><span style="font-family: verdana;">Então, resolvi mudar e largar de mão o windows vista.</span></span><br />
<br />
<a name='more'></a><br />
<br />
<span style="font-size: 100%;"><span style="font-family: verdana;">Instalei o Ubuntu 9.04. Eu ja usava em dual boot o ubuntu 8. Mas utilizada mais o windows. Agora larguei de mão o windows.. (em partes... :p )</span></span><br />
<br />
<span style="font-size: 100%;"><span style="font-family: verdana;">Abaixo vou colocar algumas dicas para o pessoal verde como eu..</span></span><br />
<br />
<span style="font-family: verdana; font-size: 100%; font-weight: bold;">Organização dos diretórios</span><br />
<br />
<span style="font-size: 100%;"><span style="font-family: verdana;">A estrutura de diretórios é bem diferente. Eu não vou explicar cada estrutura, existem diversos links sobre isso. Vou falar como eu particionei meu HD.</span></span></div><br />
<span style="font-size: 100%;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgPGmeMNFyQoReeZU19wrLl4j-Zu-0DCYm0CITuvPvjfIQ2yI6FUijHLaY9UP9qV0gjejS9LzijQfszkZTgzgmSjbRnBIN903dXoaWw0B1Vcok7W2hr6MgTum9zAT46bdv4ZEt8IGo3uLU/s1600-h/hd.gif" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" style="font-family: verdana;"><img alt="" border="0" id="BLOGGER_PHOTO_ID_5385205860996354626" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgPGmeMNFyQoReeZU19wrLl4j-Zu-0DCYm0CITuvPvjfIQ2yI6FUijHLaY9UP9qV0gjejS9LzijQfszkZTgzgmSjbRnBIN903dXoaWw0B1Vcok7W2hr6MgTum9zAT46bdv4ZEt8IGo3uLU/s400/hd.gif" style="cursor: pointer; display: block; height: 250px; margin: 0px auto 10px; text-align: center; width: 400px;" /></a></span><br />
<span style="font-size: 100%;"><span style="font-family: verdana;">Quem me deu essa dica foi o Giuliano, arquiteto de software na empresa que trabalho.</span></span><br />
<br />
<span style="font-size: 100%;"><span style="font-family: verdana;">As dicas:</span></span></div><ul style="font-family: verdana; text-align: justify;"><li><span style="font-size: 100%;">Separar a pasta /home em uma partição separada e com o maior espaço.</span></li>
<li><span style="font-size: 100%;">Utilizar ext4 para sistemas de arquivos</span></li>
<li><span style="font-size: 100%;">Criar uma partição boot com ext3, pois parece q o Gorme( o kra q faz boot do linux) tem que estar em uma partição desse tipo.</span></li>
<li><span style="font-size: 100%;">Colocar tudo que é coisa relacionada ao Java, na /opt.. jdk, servers, ides.. </span></li>
</ul><div style="text-align: justify;"><br />
<br />
<br />
<span style="font-size: 100%;"><span style="font-family: verdana;">Cagadas:</span></span></div><ul style="font-family: verdana; text-align: justify;"><li><span style="font-size: 100%;">Criei a partição boot muito grande. Coloque 1GB mas não foi utilizado nem 100mb.</span></li>
</ul><div style="text-align: justify;"><br />
<br />
<br />
<span style="font-family: verdana; font-size: 100%; font-weight: bold;">Configuração do JAVA_HOME</span><br />
<br />
<span style="font-size: 100%;"><span style="font-family: verdana;">Bom eu não quis uitlizar o Synaptic para instalar a JDK. Baixei no site e instalei.</span></span><br />
<span style="font-size: 100%;"><span style="font-family: verdana;">No site do Ubuntu eles falaram em configurar o JAVA_HOME no arquvo /</span><span style="font-family: verdana; font-weight: bold;">etc/bash.bashrc</span><span style="font-family: verdana;">. Não consegui. O Giuliano me falou para fazer isso no arquivo </span><span style="font-family: verdana; font-weight: bold;">/etc/profile</span><span style="font-family: verdana;"> e foi lah que fiz. Dae deu tudo certo.</span></span><br />
<br />
<br />
<br />
<span style="font-size: 100%;"><span style="font-family: verdana; font-weight: bold;">Problemas com SVN Client</span></span><br />
<span style="font-size: 100%;"><span style="font-family: verdana;">Para quem estava acostumado com o TortoiseSVN.. pode esquecer. No linux não tem essa barbada. Baixei o SmartSVN que é muito bom. Só é pago... :S</span></span><br />
<br />
<span style="font-size: 100%;"><span style="font-family: verdana; font-weight: bold;">Problemas do SVN no Eclipse</span></span><br />
<span style="font-size: 100%;"><span style="font-family: verdana;">Bom, instalei o Eclipse Galileo e tive problemas para configurar um plugin do SVN.</span></span><br />
<br />
<span style="font-size: 100%;"><span style="font-family: verdana;">Instalei o Subeclipse pela próprioa URL de update do Galileo. Até então tudo tranquillo. Mas dae sempre que tentava conectar em um repositório aparecia uma mensagem sobre SVN Client não instalado ou coisa assim.</span></span><br />
<br />
<span style="font-size: 100%;"><span style="font-family: verdana;">Existem dois tipos de SVN clients. Um é o tal de JavaHL, que é nativo, feito com recursos do SO. O outro é o SVNKit que é feito em java.</span></span><br />
<br />
<span style="font-size: 100%;"><span style="font-family: verdana;">Então através do update do Eclipse instalei o SVNKit. </span></span><br />
<br />
<span style="font-size: 100%;"><span style="font-family: verdana;">Essa é a URL: Subeclipse - http://subclipse.tigris.org/update_1.6.x</span></span><br />
<br />
<br />
<br />
<span style="font-size: 100%;"><span style="font-family: verdana;">Bom era isso..</span></span><br />
<br />
<span style="font-size: 100%;"><span style="font-family: verdana;">Abraço</span></span><br />
<br />
</div>Alexandre Simundihttp://www.blogger.com/profile/07075473948224038728noreply@blogger.com0tag:blogger.com,1999:blog-7642770694393333804.post-3971724242599851572009-06-10T03:12:00.000-03:002009-09-21T17:42:04.783-03:00Faça a mudança acontecer. Não mude.Mudança é sempre uma palavra complicada. Nós, profissionais de TI, sempre adoramos mas organizações nem tanto.<br /><br />Depios de uma certa experiência, que relaciono com as "vivências" não com o tempo, aumentamos nosso poder de obsevação e nossa análise crítica. Apartir daí, somos capazes agregar valor ao nosso trabalho de forma mais intensa.<br /><br />Quando trocamos de empresa essa vontade de trazer nossas experiências a tona é dispertada. Normalmente nos deparamos com diversos pontos que podemos melhor, agregar, modificar, etc, no novo contexto. Isso acontece devido às experiências carregadas na mocihla.<br /><br />Neste momento vejo o primeiro equívoco.<br /><br /><span style="font-weight: bold;">Trazer as crenças da empresa para nós, não </span><span style="font-weight: bold;">trazer a nossas crenças para a Empresa</span><span style="font-weight: bold;"></span><br /><br />Não é bom chegar em um lugar e querar mudar diversas coisas. Apontar diversos falahs. Não e bom porque mal entendemos o ambiente, o contexto, como as coisas funcionam.<br /><br />Viver a rotina da empresa para depios apontar pontos de melhoria é um bom começo. Dessa forma, é possível projetar o impacto das mudanças. Ao conseguir projetar o impacto das mudanças pode-se argumentar para que elas sejam efetuadas.<br /><br />Devemos fazer parte do negócio, enteder os fluxos de trabalho, conhecer as causas e efeitos, o porquê as coisas são como são.<br /><br />A partir daí...<br /><br /><span style="font-weight: bold;">Faça a mudança a contecer</span>, <span style="font-weight: bold;">não mude </span><br /><br />Normalmente temos idéias que, com certeza, vão mudar o mundo. A empresa vai lucrar muito mais, eu vou ganhar uma promoção, tudo vai melhorar. Mas...<br /><br />Apesar da mudança ser uma constante, ela tem que ser controlada pelas organizações. Afinal, qualquer mudança tem custo. Se cada funcionário que entra resolver mudar tudo, a empresa ta ferrada!<br /><br />Por isso, para fazer com que suas idéias possam ser atendidas não proponha simplesmente mudanças. Provoque a inquietude nas pessoas. Provoque a mudança nas pessoas. <span style="font-weight: bold;">Seja um agente de mudanças</span>.<span style="font-weight: bold;"> </span>Levante faíscas para que todos envolta possam acender o fogo. Isso sim que vai fazer todoas ganharem.<br /><br /><span style="font-weight: bold;">Ser um agente de mudanças</span><br />Acredite nas pessoas. Seja humilde. Ouça o que os outros têm a dizer.Valorize o conhecimento de quem está a sua volta.<br /><br />Se você mostrar estas características ANTES de sair mudando tudo, será ouvido.<br /><br /><br /><span style="font-weight: bold;">Pense fora da caixa</span><br />Um dos passos para ter idéias novas é questionar.<br /><br />Não seja "palpiteiro". Questionar sem argumento é palpite. Isso não agrega nada.<br /><br />Questione, entenda, reflita, então provoque a inquietude nas pessoas. Para que todos façam os mesmos questionamentos.<br /><br /><br /><br />Resumindo, tenho três idéias principais sobre mudanças:<br /><br /><ul><li>Entenda o contexto. Não "jogue" tudo que você conhece propondo mudanças em tudo.</li><li>Provoque mudanças em quem está a sua volta. </li><li>Pense fora da caixa.Questione, entenda e refilta sobre o contexto.</li></ul><br />Não sei porque resolvi escrever isso...<br /><br />Mas... são 3h da madruga e veio a inspiração... amanhã eu leio como ficou... heheheh<br /><br />Abraço!Alexandre Simundihttp://www.blogger.com/profile/07075473948224038728noreply@blogger.com0tag:blogger.com,1999:blog-7642770694393333804.post-73110826658458056942009-05-22T16:55:00.000-03:002009-05-28T18:51:56.341-03:00RMI e HIbernate... lições aprendidas<div align="justify"><div><span style=";font-family:arial;font-size:85%;" ></span></div><br /><div><span style=";font-family:arial;font-size:85%;" >Estou participando de um projeto onde decidimos utilizar RMI para conversação de dois módulos do sistema. A decisão não vem ao caso agora, mas achei interessante gurdas alguns "causos"...<br /></span><strong><span style=";font-family:arial;font-size:85%;" ></span></strong></div><br /><br /><div><strong><span style=";font-family:arial;font-size:85%;" >RMI e Hibernate, onde tudo começou</span></strong></div><div><span style=";font-family:arial;font-size:85%;" ></span></div><div><span style=";font-family:arial;font-size:85%;" ></span></div><br /><br /><div><span style=";font-family:arial;font-size:85%;" >Como falei anteriormente, decidimos utilizar RMI para integrar dois módulos do sistema. Um módulo responsável pela parte de negócio( persistência também) e outro por uma parte específica bem baixo nível (baixo nível = bytes.. 01010101...etc...). </span></div><br /><div><span style=";font-family:arial;font-size:85%;" >Então, o gênio projetista teve a seguinte idéia: "Vamos utilizar as classes persistentes para trafegar via RMI".</span><br /></div><br /><div><span style=";font-family:arial;font-size:85%;" >Resultado: LazyInitializationException -LIE.</span></div><br /><div><span style="font-family:arial;"><br /></span><span style=";font-family:arial;font-size:85%;" >Em um determinado método de uma classe acessada via RMI o retorno era um objeto que foi buscado do Hibernate. Este objeto tinha outros objetos, que tinham outros objetos, que tinham outros objetos... blá blá blá...</span><br /><br /></div><div><span style=";font-family:arial;font-size:85%;" >Soluções:</span><br /><br /><br /></div><div><span style="font-family:arial;"><span style="font-size:85%;">1º) Colocar "transient"(do java não do JPA) nos atributos que não deveriam trafegar via RMI. <span style="color: rgb(255, 0, 0);">Puramor de Deus, Nãããão!!!</span></span></span></div><br /><div><span style=";font-family:arial;font-size:85%;" >Imagina ficar colocando transiente em tudo que é atributo espalhado pelo código inteiro. Loucura!!!<br /></span></div><div><br /><span style=";font-family:arial;font-size:85%;" >2º) Modificar o design</span><br /></div></div><div align="justify"><span style=";font-family:arial;font-size:85%;" >Interessante... muito interessante...</span></div><div align="justify"><strong><span style=";font-family:arial;font-size:85%;" ></span></strong> </div><div align="justify"><strong><span style=";font-family:arial;font-size:85%;" >O Design... (não é de moda porr!!)</span></strong><span style="font-family:arial;"></span></div><div align="justify"><br /></div><div align="justify"><span style=";font-family:arial;font-size:85%;" ></span></div><div><br /></div><div align="justify"><span style=";font-family:arial;font-size:85%;" >Tentei fazer algo que representasse o problema. Então abaixo estão algumas classes de domínio, mapeadas no hibernate.</span></div><div><br /><br /></div><div align="justify"><img id="BLOGGER_PHOTO_ID_5340274600664183842" style="margin: 0px auto 10px; display: block; width: 400px; height: 183px; text-align: center;" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhy4rAOCYKCSfphROtoowunPUOhTpf24ZmDVkpTtb17c2NHkUh4Yhn1PVRR6zfJkMti8jQ-VuWL_fCdNMnMQRfex82IwoQjba6Un_ZSZdXRpIB6m-4XIwerkcaRTwSHR54-6nr7ulOjtcw/s400/Model.jpg" border="0" /><span style="font-family:arial;"><span style="font-size:85%;"><strong>OBS:</strong> Para quem não sabe, em RMI devem existir interfaces comuns nos dois lados da comunicação. Então a interface PessoaData é conhecida pelos dois módulos.<br /></span></span><br /><br /><span style=";font-family:arial;font-size:85%;" >Agora, viram o que o projetista gênio fez ?!?!?! </span><br /><span style=";font-family:arial;font-size:85%;" ></span><br /><span style=";font-family:arial;font-size:85%;" >A classe Pessoa implementa a interface PessoaData. Na imagem acima temos somente um exemplo, mas no contexto real são umas 20 classes que irão trafegar via RMI. Todas essas classes são entidades persistentes.</span><br /><span style=";font-family:arial;font-size:85%;" ></span><br /><span style=";font-family:arial;font-size:85%;" >Observe que a interface PessoaData retorna byte[]. Isso mesmo.. o "carinha" que utiliza estas classes vai precisar dos dados convertidos em bytes. <strong>Guarde esta informação</strong>.</span></div><div><br /><br /></div><p><span style=";font-family:arial;font-size:85%;" >Confesso que o projetista gênio(agora já deve-se saber quem é o projetista... :D ) percebeu a burrada somente quando ocorreu o erro com hibernate.</span></p><div><br /></div><p><span style=";font-family:arial;font-size:85%;" >O que vocês conseguem enchergar ai? </span></p><p><span style=";font-family:arial;font-size:85%;" >Bom, vou dizer o que eu consegui enxergar:</span><br /><br /></p><ul><li><span style=";font-family:arial;font-size:85%;" >Uma classe persistente implementa uma interface utilizada para comunicação entre sistemas. <strong>Acomplamento! </strong>Entidade persistente conhece uma interface onde o objetivo é comunicação de dados entre sistemas... "nada a vê"</span><br /></li><li><span style=";font-family:Arial;font-size:85%;" >Pelo motivo acima, a entidade persistente é responsável por converter String, Integer, Date em bytes. <strong>Coesão! </strong>Tava tudo misturado, conversões com bytes em uma classe onde o objeto é enviar e obter informações do banco de dados.</span></li></ul><div><br /></div><p><span style=";font-family:arial;font-size:85%;" ><strong>Solução tomada</strong></span></p><p><span style=";font-family:arial;font-size:85%;" >Utilizamos os famosos Transfer Objects. Segue o exemplo:</span></p><img id="BLOGGER_PHOTO_ID_5340283539220854626" style="margin: 0px auto 10px; display: block; width: 400px; height: 351px; text-align: center;" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEimsTb9bqDTeafMaedg48r486XHNRo9scYZsHYuqIffTpqozcxNgmDQ9cWKRjwTyVCiEvuaQ0I6dY5lnl2dpnWY92IKI694226fdfb_12loMvlFS9D4QMHSj_6HO9xjRnlP-0Ya7D1SfWg/s400/Model2.jpg" border="0" /><br /><br /><p></p><br /><span style=";font-family:arial;font-size:85%;" >Matamos o problema de coesão, onde a classe PessoaTo é responsável por trabalhar os dados para comunicação.</span><br /><span style=";font-family:arial;font-size:85%;" >Matamos o problema de acomplamento onde a classe Pessoa não sabe que a classe PessoaTo existe.</span><br /><span style=";font-family:arial;font-size:85%;" >Matamos o LazyInitializationException. A classe TO contém apenas o que será necessário para transferência.</span><br /><br /><span style=";font-family:arial;font-size:85%;" ><strong>Lições aprendidas</strong></span><br /><ul><li><span style=";font-family:arial;font-size:85%;" >Colocar tudo em uma classe é diferente de economizar tempo</span></li><li><span style=";font-family:Arial;font-size:85%;" >Preguisoço trabalha em dobro... :D</span></li><li><span style=";font-family:Arial;font-size:85%;" >Projetos iterativos minimizam os erros. Descobrimos o problema no início e retrabalho foi de aproximadamente 5hs.</span></li><li><span style=";font-family:arial;font-size:85%;" >Enviar objetos utilizados para persistência via RMI-> ... LazyInitializationException</span></li><li><span style=";font-family:arial;font-size:85%;" >Spring RMI exporter facilita muito!</span></li><li><span style=";font-family:arial;font-size:85%;" >Cuidar as dependências das classes</span></li></ul><br /><span style=";font-family:arial;font-size:85%;" >Era isso.. </span><br /><span style=";font-family:arial;font-size:85%;" ></span><br /><span style=";font-family:arial;font-size:85%;" >Abraço!</span>Alexandre Simundihttp://www.blogger.com/profile/07075473948224038728noreply@blogger.com3tag:blogger.com,1999:blog-7642770694393333804.post-32591584675365043702009-04-17T00:21:00.000-03:002009-04-18T12:59:24.924-03:00Quer aprender Adobe Flex?<p class="MsoNormal" style="font-family: verdana;"><span style="font-size:85%;">Acabei de chegar de uma palestra de demonstração do Adobe Flex na T@rgetTrust.</span></p> <p class="MsoNormal" style="font-family: verdana;"><span style="font-size:85%;"><o:p> </o:p></span></p> <p class="MsoNormal" style="font-family: verdana;"><span style="font-size:85%;">Eu não sei nada sobre Adobe Flex, mas achei muito interessante o que vi hoje.</span></p> <p class="MsoNormal" style="font-family: verdana;"><span style="font-size:85%;"><o:p> </o:p></span></p> <p class="MsoNormal" style="font-family: verdana;"><span style="font-size:85%;">Segue algumas referências para quem estiver afim de iniciar os estudos:</span></p> <p class="MsoNormal" style="font-family: verdana;"><span style="font-size:85%;"><o:p> </o:p></span></p> <p class="MsoNormal" style="font-family: verdana;"><span style="font-size:85%;">Referências:</span></p> <ul style="margin-top: 0cm; font-family: verdana;" type="disc"><li class="MsoNormal" style=""><span style="font-size:85%;"><a href="http://tv.adobe.com/">Adobe TV</a></span></li><li class="MsoNormal" style=""><span style="font-size:85%;"><a href="http://www.adobe.com/devnet/flex/">Flex Developer Center</a></span></li><li class="MsoNormal" style=""><span style="font-size:85%;"><a href="http://www.adobe.com/devnet/flex/tourdeflex/">Tour de Flex</a></span></li></ul> <p class="MsoNormal" style="font-family: verdana;"><span style="font-size:85%;"><o:p> </o:p></span></p> <p class="MsoNormal" style="font-family: verdana;"><span style="font-size:85%;"><o:p> </o:p></span></p> <p class="MsoNormal" style="font-family:verdana;"><span style="font-size:85%;">Listas Brasileiras<br /></span></p> <ul style="margin-top: 0cm;font-family:verdana;" type="disc"><li class="MsoNormal" style=""><span style="font-size:85%;"><a href="http://br.groups.yahoo.com/group/flex-brasil/">FlexBrasil</a></span></li><li class="MsoNormal" style=""><span style="font-size:85%;"><a href="http://groups.google.com.br/group/flexdev?pli=1">FlexDev</a></span></li></ul> <p class="MsoNormal" style="font-family:verdana;"><span style="font-size:85%;"><o:p> </o:p></span></p> <p class="MsoNormal" style="font-family:verdana;"><span style="font-size:85%;">Bibliotecas (outros componentes):</span></p> <ul style="margin-top: 0cm;font-family:verdana;" type="disc"><li class="MsoNormal" style=""><span style="font-size:85%;"><a href="http://code.google.com/p/flexlib/">Flexlib</a></span></li><li class="MsoNormal" style=""><span style="font-size:85%;"><a href="http://code.google.com/p/flexmdi/">Flex MDI</a></span></li><li class="MsoNormal" style=""><span style="font-size:85%;"><a href="http://code.google.com/p/flex-object-handles/">Flex Object Handle</a></span></li><li class="MsoNormal" style=""><span style="font-size:85%;"><a href="http://www.ilog.com/products/ilogelixir/">Ilog Elixir</a></span></li><li class="MsoNormal" style=""><span style="font-size:85%;">Degrafa</span></li></ul> <p class="MsoNormal" style="font-family:verdana;"><span style="font-size:85%;"><o:p> </o:p></span></p> <p class="MsoNormal" style="font-family:verdana;"><span style="font-size:85%;"><o:p> </o:p></span></p> <p class="MsoNormal" style="font-family:verdana;"><span style="font-size:85%;">Frameworks para integração com Java:</span></p> <ul style="margin-top: 0cm;font-family:verdana;" type="disc"><li class="MsoNormal" style=""><span style="font-size:85%;"><a href="http://opensource.adobe.com/wiki/display/blazeds/BlazeDS/">BlazeDS </a>– Free</span></li><li class="MsoNormal" style=""><span style="font-weight: bold;font-size:85%;" >OBS: O spring tem um projeto para integração com BlazeDS</span><span style="font-size:85%;"><br /></span></li><li class="MsoNormal" style=""><span style="font-size:85%;">LCDS - Pago</span></li></ul><span style="font-size:85%;"><br />Tutoriais:<br /></span><ul><li><span style="font-size:85%;"><a href="http://www.adobe.com/devnet/flex/flex_java.html" target="_blank">http://www.adobe.com/devnet/<wbr>flex/flex_java.html</a></span></li><li><span style="font-size:85%;"><a href="http://www.javaworld.com/javaworld/jw-01-2009/jw-01-javaee-flex-1.html?page=1" target="_blank">http://www.javaworld.com/<wbr>javaworld/jw-01-2009/jw-01-<wbr>javaee-flex-1.html?page=1</a></span></li><li><span style="font-size:85%;"><a href="http://www.adobe.com/devnet/livecycle/articles/blazeds_gettingstarted.html" target="_blank">http://www.adobe.com/devnet/<wbr>livecycle/articles/blazeds_<wbr>gettingstarted.html</a></span></li><li><span style="font-size:85%;"><a href="http://blog.digows.com/integrando-adobe-flex-blazeds-springframework-hibernate-uma-soluo-opensource-para-sistemas-web-parte-1/">http://blog.digows.com/integrando-adobe-flex-blazeds-springframework-hibernate-uma-soluo-opensource-para-sistemas-web-parte-1/</a> <span style="font-weight: bold; color: rgb(255, 0, 0);">(Muito Bom!!!)</span><br /></span></li></ul> <p class="MsoNormal" style="font-family:verdana;"><span style="font-size:85%;"><br /></span></p><p class="MsoNormal" style="font-family:verdana;"><span style="font-size:85%;">IDE </span></p> <ul style="margin-top: 0cm;font-family:verdana;" type="disc"><li class="MsoNormal" style=""><span style=";font-size:85%;" lang="EN-US">Flex Buildes ($249)<o:p></o:p></span></li><li class="MsoNormal" style=""><span style=";font-size:85%;" lang="EN-US">Flex Builder plugin para Eclipse ($249)<o:p></o:p></span></li><li class="MsoNormal" style=""><span style=";font-size:85%;" lang="EN-US">Flex SDK (Gratuito)<o:p></o:p></span></li><li class="MsoNormal" style=""><span style=";font-size:85%;" lang="EN-US">Flex versão para estudante<o:p></o:p></span></li></ul> <p class="MsoNormal" style="font-family:verdana;"><span style=";font-size:85%;" lang="EN-US"><o:p> </o:p></span></p> <p class="MsoNormal" style="font-family:verdana;"><span style="font-size:85%;"><br /></span></p><p class="MsoNormal" style="font-family:verdana;"><span style="font-size:85%;"><br /></span></p><p class="MsoNormal" style="font-family:verdana;"><span style=";font-size:85%;" lang="EN-US">Esse post é mais para eu anotar em algum lugar os links do que qualquer outra coisa..</span></p><p class="MsoNormal" style="font-family:verdana;"><span style="font-size:85%;"><br /></span></p><p class="MsoNormal" style="font-family:verdana;"><span style=";font-size:85%;" lang="EN-US">Abraço<br /><o:p></o:p></span></p> <p class="MsoNormal" style="font-family:verdana;"><span style=";font-size:85%;" lang="EN-US"><o:p> </o:p></span><span style="font-size:85%;">Simundi<br /></span></p>Alexandre Simundihttp://www.blogger.com/profile/07075473948224038728noreply@blogger.com0tag:blogger.com,1999:blog-7642770694393333804.post-60134477100233976282008-02-21T02:00:00.000-03:002008-12-09T01:08:19.041-02:00Padrões de Projeto - Gerador de Gráficos com Template Method<span style=";font-family:verdana;font-size:85%;" ><br /></span><div style="text-align: justify;font-family:verdana;"><span style="font-size:85%;">Dae gurizada...<br /><br />Algum tempo atrás eu e um amigo, Marcos Brião, fizemos uma oficina (workshop) na <a href="https://confrariadojava.dev.java.net/">Confraria do Java</a>, grupo de estudos da Ulbra em Canoas/RS, sobre Desgin Patterns.<br /><br /><br />Esses dias tava revirando meus arquivos e encontrei essa apresentação. Nessa oficina fizemos um Gerador de Gráficos simples com alguns patterns. O sistema ficou bem interessante.<br /></span></div><div style="text-align: justify;"><br /><span style=";font-family:verdana;font-size:85%;" >Screenshot:</span><br /></div><span style=";font-family:verdana;font-size:85%;" ><br /></span><span style=";font-family:verdana;font-size:85%;" ><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiRWWQgTXv4Sx6eu73kigt9No8H4JILqOdjGR60kkMjUL1LtQTGc2xOdBDpiEtU-R9dmwMCBuVJj2mfyMSjaMe5lgqsGixYvyjL5xf-qdQZxS1NxJ1PobYkZETz9f3hWZE45gg4NFl-I9s/s1600-h/ScreenShot.jpg"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiRWWQgTXv4Sx6eu73kigt9No8H4JILqOdjGR60kkMjUL1LtQTGc2xOdBDpiEtU-R9dmwMCBuVJj2mfyMSjaMe5lgqsGixYvyjL5xf-qdQZxS1NxJ1PobYkZETz9f3hWZE45gg4NFl-I9s/s320/ScreenShot.jpg" alt="" id="BLOGGER_PHOTO_ID_5167045370629784210" border="0" /></a><br /></span><span style=";font-family:verdana;font-size:85%;" ><br />Faça os downloads:<br /></span><ul style="font-family:verdana;"><li><span style="font-size:85%;"><a href="http://aplicacoes-dos-artigos.googlegroups.com/web/PADROES_DE_PROJETO.pdf"> Apresentação (PDF)</a></span></li><li><span style="font-size:85%;"><a href="http://aplicacoes-dos-artigos.googlegroups.com/web/PadroesProjeto.zip"> Aplicação Exemplo</a></span></li></ul><span style=";font-family:verdana;font-size:85%;" ><br /><br /></span><div style="text-align: justify;font-family:verdana;"><span style="font-size:85%;"> Essa aplicação basicamente gera gráficos com informações digitadas na tela. </span><span style="font-size:85%;">Com o uso de Design Patterns como Template Method e Facade, conseguimos ter uma aplicação fácil de fazer manutenção e entendimento.<br /> Utilizamos o framework JFreeChart(<a href="http://www.jfree.org/">link</a>) para gerar os gráficos.<br /></span></div><span style=";font-family:verdana;font-size:85%;" ><br /><br />Esse é o diagrama de classes:</span><span style=";font-family:verdana;font-size:85%;" ><br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhwFu1oNWMoF7XzmbqhARNGj87BrOsD3TYT_OvkmHKX2XDkz7o1ytA-LwnqWvja0FobT8U8On21J7RUE8nL-S1M6UhFEaWyI35232J62fYWTqeZ9kF8t-BixVrSsFMXMmdTuypayqONenQ/s1600-h/Classes.jpg"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhwFu1oNWMoF7XzmbqhARNGj87BrOsD3TYT_OvkmHKX2XDkz7o1ytA-LwnqWvja0FobT8U8On21J7RUE8nL-S1M6UhFEaWyI35232J62fYWTqeZ9kF8t-BixVrSsFMXMmdTuypayqONenQ/s320/Classes.jpg" alt="" id="BLOGGER_PHOTO_ID_5167039817237070466" border="0" /></a><br /></span><span style=";font-family:verdana;font-size:85%;" ><br /><br /></span><span style="font-weight: bold;font-family:verdana;font-size:85%;" >Template Method</span><span style=";font-family:verdana;font-size:85%;" ><span><br />Definição:</span></span><span style=";font-family:verdana;font-size:85%;" > </span><div style="text-align: justify;font-family:verdana;"><blockquote><span style="font-size:85%;">Definir o esqueleto de um algorítimo em uma operação, postergando (deferring) alguns passos para subclasses. Template Method (Gabaríto de Método) permite que subclasses redefinam certos passos de um algorítimo sem mudar a estrutura do mesmo.<br /><br /></span><div style="text-align: right;"><span style="font-size:85%;"><span style="font-style: italic;">Padroes de Projeto -GoF</span><br /></span></div></blockquote><span style="font-size:85%;"> Vamos imaginar um algorítimo qualquer, com esse exemplo, gerar gráficos.<br /><br />Quando vamos gerar gráficos a lógica para criar o ojeto JFreeChart é sempre a mesma. A única parte que muda, de um gráfico para outro, é quando vamos adicionar os dados ao gráfico.<br /><br />Nesse contexto poderíamos ter uma classe que faria a lógica para gerar o gráfico e quando fosse adicionar dados, passaria a responsabilidade para uma classe filha.<br /><br />Fizemos exatamente isso. Temos uma classe </span><span style="font-size:85%;"><span style="font-weight: bold;">abstrata </span></span><span style="font-size:85%;">chamda GraficoTemplate, que tem a lógica para gerar os gráficos.<br /></span><div style="text-align: justify;"><span style="font-size:85%;"><br />Veja a classe:<br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh8OktxcOw56uYTFH2OX299lLsZXtwx53YmFfI2_EktQsebESNZAVfEGL5BMbPAnFxHNYuy_uchbD2hnYwBwxPF1ACeBX5hWjG1JoXyD3aPeXSW_DoIX3UPXZ1XLS_ZpE_f_YonhKlzMTc/s1600-h/logica.gif"><img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh8OktxcOw56uYTFH2OX299lLsZXtwx53YmFfI2_EktQsebESNZAVfEGL5BMbPAnFxHNYuy_uchbD2hnYwBwxPF1ACeBX5hWjG1JoXyD3aPeXSW_DoIX3UPXZ1XLS_ZpE_f_YonhKlzMTc/s400/logica.gif" alt="" id="BLOGGER_PHOTO_ID_5168088171509383842" border="0" /></a><br /></span></div></div><div style="text-align: justify;font-family:verdana;"><span style="font-size:85%;"><br /></span></div><div style="text-align: justify;font-family:verdana;"><span style="font-size:85%;"> Como vocês podem ver essa clase é bem simples.<br /><br /></span><span style="font-size:85%;"> Temos um método <span style="font-weight: bold;">criarGráfico</span>, que recebe uma lista de dados e retorna um objeto JFreeChart. </span><span style="font-size:85%;">Esse método esta declarado como <span style="font-weight: bold;">final</span>. Isso significa que nenhuma classe que extender esa classe poderá alterar essa lógica. Esse detalhe do método ser final não faz parte do padrão Template Method.<br /><br /></span><span style="font-size:85%;"> Dentro do método criarGrafico eu chamo dois métidos: "carregarDados" e "configurarLegenda".<br /></span><div style="text-align: justify;"><span style="font-size:85%;"> O método "configurarLegenda" é implementado dentro dessa classe mesmo. Ou seja, tem uma implementação padrão, mas qualquer classe que pode sobrescrever o método e alterar essa configuração de legenda.<br /><br /></span><span style="font-size:85%;">O método <span style="font-weight: bold;">"carregarDados"</span>, muita anteção! Aqui que está o Pattern.<br /><br /></span></div><span style="font-size:85%;"> Viu que o método esta marcado como "abstract" e por isso não tem implemetação ?<br /><br /></span><span style="font-size:85%;">Na linguagem java todo método declarado como "abstract" indica que esse método deverá ser implementado na primeira classe concreta que estender essa classe.<br /><br /></span><span style="font-size:85%;"> O comportamento é igual ao de uma interface. Até por que uma interface, para o compiladora java, é uma classe abstrata com métodos abstrados, mas isso é outra história.<br /></span></div><span style=";font-family:verdana;font-size:85%;" > Vamos ver uma classe que estende a GraficoTemplate.<br /><br />Vamos ver a classe que gerar o grafico de Pizza:<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhSSm2APSwRGU0pUpgRXkMXs0EvMfXBSCPGA_1vfhKe4ZZr6NsGvVvnFl1Wvw_9XAOfsEu7SDBlr3dQeTCaGDo7KUB8VAQ9xNt0EDWbBlH04n_zHB42_Rao0_ECpt1BTX_DQVxYiU1m8X4/s1600-h/GraficoPizza.gif"><img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhSSm2APSwRGU0pUpgRXkMXs0EvMfXBSCPGA_1vfhKe4ZZr6NsGvVvnFl1Wvw_9XAOfsEu7SDBlr3dQeTCaGDo7KUB8VAQ9xNt0EDWbBlH04n_zHB42_Rao0_ECpt1BTX_DQVxYiU1m8X4/s400/GraficoPizza.gif" alt="" id="BLOGGER_PHOTO_ID_5168092346217595570" border="0" /></a><br />A classe GraficoPizza estende a GraficoTemplate e, obrigatoriamente, implementa o método "carregarDados(List dados)".<br /><br />É aqui, na classe filha, que é definido como será carregado o gráfico.<br /><br />Simplesmente itero a lista e populo o objeto "grafico", que está definido como protected na classe GraficoTemplate.<br /><br />Veja que nessa implementação eu usso o método "createPieChart3D" da classe ChartFactory.<br /><br />Quando fomos implementar outra classe, como a GraficoLinha, esse método "carregarDados" será diferente.<br /><br /></span><div style="text-align: center;font-family:verdana;"><span style="font-size:85%;">Veja:<a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjt5upcpiyNsZ2A9d7IVQOIO3Dxc_vZGsz8ezpNhAEKg0QFzPSZ1kOonK7QP0rc-uT7Qu2gsgn1IxYAPyp-_kuIh3fHhi6VnUPf7_QWp5eIPRh0sMUStainFpr2_mQlhhJVlLMrUW7n9G0/s1600-h/GraficoLinha.gif"><img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjt5upcpiyNsZ2A9d7IVQOIO3Dxc_vZGsz8ezpNhAEKg0QFzPSZ1kOonK7QP0rc-uT7Qu2gsgn1IxYAPyp-_kuIh3fHhi6VnUPf7_QWp5eIPRh0sMUStainFpr2_mQlhhJVlLMrUW7n9G0/s400/GraficoLinha.gif" alt="" id="BLOGGER_PHOTO_ID_5168094914608038610" border="0" /></a><br /></span></div><span style=";font-family:verdana;font-size:85%;" ><br /><br />A implementação do método "carregarDados" na classe "GraficoLinha" está um pouco diferente.<br /><br /><br />Esse exempo é bem simples. Mas se você conseguiu entender a "lógica"do pattern com certeza irá utlizar muitas vezes esse.<br /><br />O que fizemos aqui é delegar parte da lógica de gerar gráficos para suas classes filhas.<br /><br />Você pode estar pensando que a lógica que está no classe GraficoTemplate é bem simples. E realmente é. Mas poderías implementar nela outros métodos como alterar as cores do gráfico, definir um padráo de tamaho, etc..<br /><br />Isso seria simples e se aplicaria a todos os gráficos da aplicação.<br /><br /><br />Esse exemplo foi construído para explicar, de forma simples, a lógica de 1 padrão de projeto e como é vantajoso sua utilização.<br /><br />Tem pontos da aplicação que estão "feias" quanto a Design. Como por exemplo, não ter utilizado interfaces e utlizar Array de object para transferir dos dados da View para os gráficos.<br /><br /><br />Mas, nem tudo é perfeito...heheheh<br /><br />Conforme irei estudando os Design Patterns vou postando ai...<br /><br />Mais uma vez: Críticas sempre são bem vindas, obrigado.<br /><br />Abraço a todos!</span>Alexandre Simundihttp://www.blogger.com/profile/07075473948224038728noreply@blogger.com2tag:blogger.com,1999:blog-7642770694393333804.post-69690021352648758612008-02-12T00:12:00.000-02:002008-02-13T08:33:31.363-02:001º dia do Curso de Spring<span style="font-size:85%;"><br /><span style="font-family:verdana;">Acabei de chegar do meu 1º dia do curso de Spring na <a href="http://www.targettrust.com.br/">T@arget</a>. </span><br /><br /><span style="font-family:verdana;">E achei ineteressante dar meu feedback aqui.</span><br /><br /><span style="font-family:verdana;">Falando primeiro da infra-estrutura da escola, só tenho um comentário: Tem que melhorar.</span><br /><br /><span style="font-family:verdana;">Depois vêm instrutor, Diego Pacheco. Esse cara é bom. </span><br /><br /><span style="font-family:verdana;">O balanço final é: O investimento, com certeza, valeu a pena. </span><span style="font-family:verdana;">Não tenho dúvida que vou aprender bastante </span><span style="font-family:verdana;">com ele.</span><br /><br /><span style="font-family:verdana;">Pra quem quiser ai vai o </span><a style="font-family: verdana;" href="http://diego-pacheco.blogspot.com/">Blog do Diego Pacheco - http://diego-pacheco.blogspot.com/</a><br /><br /><br /><span style="font-family:verdana;">Abraço!</span></span>Alexandre Simundihttp://www.blogger.com/profile/07075473948224038728noreply@blogger.com0tag:blogger.com,1999:blog-7642770694393333804.post-83087726998073161222008-02-11T14:23:00.000-02:002008-02-12T00:24:37.826-02:00API JavaComm é show di bola<span style="font-size:85%;"><span style="font-family:verdana;">Dea gurizada...</span><br /><br /><span style="font-family:verdana;">Esses dias fiz um esquema que achei bem interessante.</span><br /><br /><span style="font-family:verdana;">Através de um modem GSM( parecido com esse </span><a style="font-family: verdana;" href="http://wirelesstech.com.br/index.php?page_id=8">aqui</a><span style="font-family:verdana;">) conectado a uma porta serial, dei alguns "toques" para celulares para avisar determinada ação de um usuário.</span><br /><br /><span style="font-family:verdana;">Fiz isso através de comandos AT. Pra falar a verdade nem imagnava que dava para fazer isso, até então. </span><br /><br /><span style="font-family:verdana;">Sei que você deve tar pensando: "Por que esse idiota não enviou uma mensagem?"</span><br /><br /><span style="font-family:verdana;">Reposta simples: Dar um toque <span style="font-family:verdana;">não tem custo E se a pessoa atender eu termino a ligação no mesmo instante... :D</span></span><br /><br /><span style="font-family:verdana;">Apanhei um puco para trabalhar com o Buffer do modem. e Para fazer a ligação ser encerrada quando alguem atende o telefone. Mas consegui. </span><span style="font-family:verdana;">Por questões éticas não vou postar o código.</span><br /><br /><span style="font-family:verdana;">Para fazer a comunicação com a porta COMM utilizei a API JavaComm, que é muito, mas muito fácil de usar.</span><br /><br /><span style="font-family:verdana;">Tinha pensando em fazer um tutorial, mas o tutorial do GUJ (link abaixo) está ótimo. Tem tudo que se precisa saber...</span><br /><br /><span style="font-family:verdana;">Links:</span><br /></span><ul style="font-family:verdana;"><li><span style="font-size:85%;"><a href="http://java.sun.com/products/javacomm/reference/api/index.html">API Documentation</a></span></li><li><span style="font-size:85%;"><a href="http://java.sun.com/products/javacomm/reference/docs/API_users_guide_3.html">Reference API</a></span></li><li><span style="font-size:85%;"><a href="http://www.guj.com.br/content/articles/javacommapi/JavaCommAPI.pdf">Tutorial do GUJ</a></span></li></ul><span style=";font-family:verdana;font-size:85%;" ><br />Depois andei lendo pelos fóruns que tem alguns celulares que aceitam commandos AT. Isso significa que é possivel</span><span style=";font-family:verdana;font-size:85%;" >, por exemlpo,</span><span style=";font-family:verdana;font-size:85%;" > conectar o celular em um Note e controlar chamadas, enviar mensagens, etc..<br /><br />Quando tiver mais informações posto por ai.<br /><br /><br />Bom fica ai a dica...<br /><br /><br />Abraço!</span>Alexandre Simundihttp://www.blogger.com/profile/07075473948224038728noreply@blogger.com0tag:blogger.com,1999:blog-7642770694393333804.post-66721857952266098052007-09-24T03:31:00.000-03:002008-12-09T01:08:23.175-02:00Criar uma aplicação com hibernate<span style="font-family: verdana;font-family:verdana;font-size:85%;" >Dae gurizada!!!<br /><br />Esse é um post simples para quem quer confirguar uma aplicação para usar Hibernate com Annotations.<br /><br />Eu usei o </span><span style="font-family: verdana;font-size:85%;" ><a href="http://www.netbeans.info/downloads/index.php">Netbeans 5.5</a> para montar esse exemplo.</span><span style="font-size:85%;"> <span style="font-family:verdana;">Será necessário fazer o download do Hibernate Annotations, que por sua vez precisa do Hibernate Core. Para os teste utilizei o Postgresql 8.2. Segue os links:</span> </span><ul style="font-family: verdana;font-family:verdana;" ><li><span style="font-size:85%;"><a href="http://www.hibernate.org/6.html">Hibernate Core 3.2</a></span></li><li><span style="font-size:85%;"><a href="http://www.hibernate.org/6.html">Hibernate-Annotations 3.3</a></span></li><li><span style="font-size:85%;"><a href="http://www.postgresql.org.br/Downloads">Postgresql 8.2</a><br /></span></li></ul><span style="font-size:85%;"> </span><span style="font-family: verdana;font-family:verdana;font-size:85%;" >Abaixo está o link da aplicação exemplo:</span><span style="font-size:85%;"> </span><ul style="font-family: verdana;font-family:verdana;" ><li><span style="font-size:85%;"><a href="http://groups.google.com/group/aplicacoes-dos-artigos/web/HibernateAppSemLib.zip">Aplicação exemplo (sem libs)<br /></a></span></li></ul><span style="font-size:85%;"> </span><span style="font-family: verdana;font-size:85%;" >E só clicar nos links que irá direto para o local onde pode ser veito o download.</span><span style="font-size:85%;"> </span><span style="font-family: verdana;font-size:85%;" ><br /><br /><br /><span style="font-weight: bold;">1º Passo: Criar o projeto<br /><br /></span></span><div style="text-align: justify; font-family: verdana;"><span style="font-size:85%;"> Esse artigo ainda foi feito no NetBeans 5.5. Para criar um novo projeto vá em Arquivo -> Novo Projeto. Selecione a categoria "Geral" e clique em Aplicação Java. Chamei o projeto de HibernateApp.<br /><br /></span><span style="font-size:85%;"> Crie uma pasta chamada de "lib" na raiz do seu projeto. A estrutura de diretórios vai ficar assim:<br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjQG5dS2cDVny7IMnCdhCVpSf-41PE3v4DjY6qpXao7vE2xDgdsS-kkRs2ZPPEGx_uhp4hFl-i-tJz7N00H5L_0UaLJJPHQ8EM1B5PjqmIfnLzO56MFauTfje1IVEqNNU4kHfVu3ZtFBp8/s1600-h/files.jpg"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjQG5dS2cDVny7IMnCdhCVpSf-41PE3v4DjY6qpXao7vE2xDgdsS-kkRs2ZPPEGx_uhp4hFl-i-tJz7N00H5L_0UaLJJPHQ8EM1B5PjqmIfnLzO56MFauTfje1IVEqNNU4kHfVu3ZtFBp8/s320/files.jpg" alt="" id="BLOGGER_PHOTO_ID_5165498293344993762" border="0" /></a><br /></span><span style="font-size:85%;"><br /></span><span style="font-size:85%;"> Criado o nosso projeto já criei alguns pacotes e classes. Veja:<br /></span></div><span style="font-family: verdana;font-family:verdana;font-size:85%;" ><br /></span><span style="font-size:85%;"><a style="font-family: verdana;" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEijANFZEZSVVFagUg4jQSgiD062_Ao3sjjNx8Nph8iLI1PLuCTZT6AJAoKQ0qykb6QBxSpsTgNMt4RqIBaF0ZYFhWX9KC5QRRNmwW88zZklODf7JS3CcTI_16ezZ0E4td93XlHr5qYgls4/s1600-h/temp5.bmp"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEijANFZEZSVVFagUg4jQSgiD062_Ao3sjjNx8Nph8iLI1PLuCTZT6AJAoKQ0qykb6QBxSpsTgNMt4RqIBaF0ZYFhWX9KC5QRRNmwW88zZklODf7JS3CcTI_16ezZ0E4td93XlHr5qYgls4/s320/temp5.bmp" alt="" id="BLOGGER_PHOTO_ID_5110975530964757586" border="0" /></a></span><span style="font-family: verdana;font-family:verdana;font-size:85%;" ><br /><br /><br />Agora temos qu adicionar os jar necessários para a aplicação rodar. Se você notar, o hibernate tem um monte de JARs, mas nem todos são obrigatórios.<br /><br />Abaixo estão quais os JARs devem estar na pasta LIB do nosso projeto. Vou separar os jars do Hibernate Core e do Hibernate Annotations, mas todos devem ser colocados na pasta LIB direto, não em subpastas.<br /><br />Hibernate Core - 3.2.5GA:<br /></span><span style="font-family: verdana;font-size:85%;" ></span><ul style="font-family: verdana;"><li><span style="font-size:85%;">antlr.jar</span></li><li><span style="font-size:85%;">cglib.jar</span></li><li><span style="font-size:85%;">asm.jar</span></li><li><span style="font-size:85%;">asm-attrs.jars</span></li><li><span style="font-size:85%;">commons-collections.jar</span></li><li><span style="font-size:85%;">commons-logging.jar</span></li><li><span style="font-size:85%;">hibernate3.jar</span></li><li><span style="font-size:85%;">jta.jar</span></li><li><span style="font-size:85%;">dom4j.jar</span></li><li><span style="font-size:85%;">log4j.jar </span></li></ul><pre style="font-family: verdana;" class="programlisting"><span style="font-size:85%;"><br /></span><span style="font-size:85%;">Hibernate Annotations 3.3.0GA<br /></span></pre><ul style="font-family: verdana;"><li><span style="font-size:85%;">ejb3-persistence</span></li><li><span style="font-size:85%;">hibernate-commons-annotations</span></li><li><span style="font-size:85%;">hibernate-annotations</span></li></ul><span style="font-family: verdana;font-family:verdana;font-size:85%;" >Postgresql 8.2<br /></span><ul><li><span style="font-family: verdana;font-family:verdana;font-size:85%;" >postgresql-8.2-505.jdbc4</span></li></ul><span style="font-family: verdana;font-family:verdana;font-size:85%;" ><br />A minha pasta lib ficou assim:<br /><br /></span><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjeqGJnomV5mIZDShIiIsld7b2ta0_bTO48pFCM_FPtpchjZn-h9iJU4gyiC0gGI9keFBZbRecxJFillqw4IUL1Wbwy2HYp95zN61e31TaV7Vq7BdNPVSmUTj6fXY1geh9vHOYhwjXYwPc/s1600-h/lib.jpg"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjeqGJnomV5mIZDShIiIsld7b2ta0_bTO48pFCM_FPtpchjZn-h9iJU4gyiC0gGI9keFBZbRecxJFillqw4IUL1Wbwy2HYp95zN61e31TaV7Vq7BdNPVSmUTj6fXY1geh9vHOYhwjXYwPc/s400/lib.jpg" alt="" id="BLOGGER_PHOTO_ID_5173307029607184050" border="0" /></a><br /><br /><span style="font-size:85%;"><span style="font-family: verdana;">Com os JARs na pasta lib ainda temos que adicionar ao projeto pelo Netbeans.</span><br /><span style="font-family: verdana;">Para isso clique com o botão direito no nome do projeto e clieque em propriedades:</span></span><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhJrNRBrrdYZDUBqoubiNNzitEIjeCsCG6JBCDufC3rS1QjjrRGdPiEFP0hC-crlnIy47Kxm74I31kA1VhagweYS5woLdtNVxbQxcp68_BU4rsaR8ADjMxuqnNFZDTpoKQ5jPFEHbnL2Mg/s1600-h/ap_properties.gif"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhJrNRBrrdYZDUBqoubiNNzitEIjeCsCG6JBCDufC3rS1QjjrRGdPiEFP0hC-crlnIy47Kxm74I31kA1VhagweYS5woLdtNVxbQxcp68_BU4rsaR8ADjMxuqnNFZDTpoKQ5jPFEHbnL2Mg/s400/ap_properties.gif" alt="" id="BLOGGER_PHOTO_ID_5173308043219465922" border="0" /></a><br /><span style="font-size:85%;"><span style="font-family: verdana;">Depois clique em "Bibliotecas" e no botão "Adicionar Jar/Pasta" e localize os jars na pasta lib do nosso projeto:</span><br /></span><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgqszVoidhz8hPVYyKWf4NdQqKxg4v9R1EPSirJVt0fzF7dfeOyfYyGLuI_ilFVydtSlJCIP4Em8zBKFkBJPgeS0jmbKjF0LU8StaGvRu6YgxB8gp_Sijvro-Yzcn2T5wuFrRwtZfqSYFY/s1600-h/add_lib.gif"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgqszVoidhz8hPVYyKWf4NdQqKxg4v9R1EPSirJVt0fzF7dfeOyfYyGLuI_ilFVydtSlJCIP4Em8zBKFkBJPgeS0jmbKjF0LU8StaGvRu6YgxB8gp_Sijvro-Yzcn2T5wuFrRwtZfqSYFY/s400/add_lib.gif" alt="" id="BLOGGER_PHOTO_ID_5173308872148154066" border="0" /></a><br /><br /><span style="font-family: verdana;font-family:verdana;font-size:85%;" ><br /><span style="font-weight: bold;">2º Passo: Criar as classes - Entidades Persistentes.</span><br />É considerado "Entidade persistente" as classes que serão inseridas no banco de dados.<br /><br />No nosso exemplo tenho duas classes que serão persistidas no banco de dados. A classe Pessoa e Endereco.<br /><br />Veja com elas ficaram:<br /><br /></span><span style="font-size:85%;"><a style="font-family: verdana;" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhngHqHCT708mmTNOJ4LZdYUxgBoySpplFdJn5WlREMuY0d3mJzHLDHc8wxt_Jh_pmLF43-fW6NEpGQCu1Q7OHrSuU0wlcH7c_NgzbkGRGP4HCG510r60b0F5Di_EpH5LjVcPPW9zpMP78/s1600-h/temp10.GIF"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhngHqHCT708mmTNOJ4LZdYUxgBoySpplFdJn5WlREMuY0d3mJzHLDHc8wxt_Jh_pmLF43-fW6NEpGQCu1Q7OHrSuU0wlcH7c_NgzbkGRGP4HCG510r60b0F5Di_EpH5LjVcPPW9zpMP78/s320/temp10.GIF" alt="" id="BLOGGER_PHOTO_ID_5113559133340848066" border="0" /></a> <a style="font-family: verdana;" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiDb984Q3v38vjqVsBL5whGibkpcuQe365IhBh4mhKpYdgsmuk2s01kWI4NWgUb2UL1ohmpaZvIYOAMUCxR-gRlFRIYTFSqxBQBZECdzlYcVh5N_M0olnT_PHP6NdsALml1indGiHdNf2U/s1600-h/temp9.GIF"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiDb984Q3v38vjqVsBL5whGibkpcuQe365IhBh4mhKpYdgsmuk2s01kWI4NWgUb2UL1ohmpaZvIYOAMUCxR-gRlFRIYTFSqxBQBZECdzlYcVh5N_M0olnT_PHP6NdsALml1indGiHdNf2U/s320/temp9.GIF" alt="" id="BLOGGER_PHOTO_ID_5113559060326404018" border="0" /></a> </span><span style="font-family: verdana;font-size:85%;" >Explicação</span><span style="color: rgb(0, 153, 0); font-weight: bold; font-family: verdana;font-family:verdana;font-size:85%;" ><br /><br />@</span><span style="font-weight: bold; font-family: verdana;font-family:verdana;font-size:85%;" >Entity:</span><span style="font-family: verdana;font-size:85%;" > Toda classe persistente (POJO) deve user @Entity. Isso indica que a classe é uma entidade persistente(Entity Bean). Ou seja, existe uma tabela no banco de dados que representa essa classe. Por padrão o hibernate considera o nome da tabela igual ao nome da classe.<br /><br />Caso sua classe possua um nome diferente ao nome da tabela, é necessário usar a anotaçao a seguir: </span> <span style="font-weight: bold; font-family: verdana;font-family:verdana;font-size:85%;" ><span style="color: rgb(0, 153, 0);"><br /><br />@</span>Table:</span><span style="font-family: verdana;font-size:85%;" > essa anotação é utiliza quando informamos o nome da tabela. Veja a classe Pessoa. O nome da classe é Pessoa, mas o nome da tabela no banco é TB_Pessoa. </span><span style="font-weight: bold; font-family: verdana;font-family:verdana;font-size:85%;" ><span style="color: rgb(0, 153, 0);"><br /><br />@<span style="color: rgb(0, 0, 0);">Id</span></span>:</span><span style="font-family: verdana;font-size:85%;" > Para o hibernate o ID é a forma de identificar o objeto (bem óbvio).<br />Os ID's podem ser gerados de várias formas dependendo do banco utilizado. O Postgresql, por exemplo, utiliza sequences. O MySQL tem um campo autoincrement e assim por diante.<br /><br />Existem vários tipos de "generators". <a href="http://www.hibernate.org/hib_docs/v3/reference/en/html/mapping.html#mapping-declaration-id-generator">Veja esse link</a> ou veja o <a href="http://simundi.blogspot.com/2007/03/jpahibernate-com-postgresql.html">meu outro post.</a> </span><span style="font-weight: bold; font-family: verdana;font-family:verdana;font-size:85%;" ><span style="color: rgb(0, 153, 0);"><br /><br />@</span>Column:</span><span style="font-family: verdana;font-size:85%;" > Essa anotação simplesmente indica qual coluna da tabela a propriedade irá referenciar. Por padrão todos os atributos da classe são pripriedades de tabelas. </span><span style="font-weight: bold; font-family: verdana;font-family:verdana;font-size:85%;" ><span style="color: rgb(0, 153, 0);"><br /><br />@</span>ManyToOne:</span><span style="font-family: verdana;font-size:85%;" > esse atributo faz as relações entre as classes. </span><span style="font-weight: bold; font-family: verdana;font-family:verdana;font-size:85%;" ><span style="color: rgb(0, 153, 0);"><br /><br />@</span>JoinColumn: </span><span style="font-family: verdana;font-size:85%;" >essa anotação indica qual coluna da classe Pessoa referencia a classe Endereço. </span><span style="font-size:85%;"> </span><span style="font-family: verdana;font-size:85%;" ><br /><br />Agora um desenho para melhorar a compreensão:</span><span style="font-size:85%;"> <a style="font-family: verdana;" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgCEjSuI8twkV8EFucUlvWmjOP2M2-YyPgeWbtqJqY78dLTUEaV2OE0OWcGwpjFjwU81yJK8oog33r-StRJnpxbfufJzCOdznLslYTJZZzxhTrQW5zkUyZLPi148FTkeIaRv9z-yo4DG-g/s1600-h/temp11.gif"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgCEjSuI8twkV8EFucUlvWmjOP2M2-YyPgeWbtqJqY78dLTUEaV2OE0OWcGwpjFjwU81yJK8oog33r-StRJnpxbfufJzCOdznLslYTJZZzxhTrQW5zkUyZLPi148FTkeIaRv9z-yo4DG-g/s320/temp11.gif" alt="" id="BLOGGER_PHOTO_ID_5113574878690955218" border="0" /></a> </span><span style="font-family: verdana;font-family:verdana;font-size:85%;" ><br /></span><span style="font-size:85%;"><a style="font-family: verdana;" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjf64DfjIXBWikBG_Kgti8Ty8LlgFFwOS7yf0sYziC7hssiDxWu8l9dmPsozo70iNHCDarh_LxpT2AdL5MOh9jMwtOfkBniKo9QJAkSWg96pXcoCh1U0d1QknTj3BB9xE5ZFuyT1Eshz5o/s1600-h/temp12.gif"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjf64DfjIXBWikBG_Kgti8Ty8LlgFFwOS7yf0sYziC7hssiDxWu8l9dmPsozo70iNHCDarh_LxpT2AdL5MOh9jMwtOfkBniKo9QJAkSWg96pXcoCh1U0d1QknTj3BB9xE5ZFuyT1Eshz5o/s320/temp12.gif" alt="" id="BLOGGER_PHOTO_ID_5113577627470024674" border="0" /></a> </span><span style="font-family: verdana;font-family:verdana;font-size:85%;" ><br /><br /><span style="font-weight: bold;">3º Passo: Classe/Arquivo de configuração</span>:<br /><br />Você deve estar se perguntando:<br /><br />- Por que esse retardado colocou "'classe/arquivo de configuração" ?<br /><br /></span><div style="text-align: justify; font-family: verdana;"><span style=";font-size:85%;" >Simples! Existem as duas formas de configurar o hibernate. Na verdade são 3.. heheheh</span><span style="font-size:85%;"><br /></span></div><span style="font-family: verdana;font-family:verdana;font-size:85%;" ><br /></span><div style="text-align: justify; font-family: verdana;"><span style=";font-size:85%;" ><blockquote><span style="font-weight: bold;">hibernate.cfg.xml ou hibernate.properties:</span> Até chegar o annotations e jpa o hibernate era configurado através de um arquivo xml ou .properties. Neste arquivo estão as informaões de conexão com o banco e as classes que serão mapeadas. Utiliza-se esse arquivo quando vamos utilizar somente o Hibernate Core.<br /></blockquote></span><span style=";font-size:85%;" ><blockquote><span style="font-weight: bold;">persistence.xml:</span> A especificação EJB3 definiu o arquivo padrão para configuração do mapemaneto objeto relacional. Este arquivo é semelhanto ao hibernate.cfg.xml ( e tambem foi baseado nele). Utiliza-se esse arquivo quando vamos utilizar o EntityManager.<br /></blockquote></span><span style=";font-size:85%;" ><blockquote><span style="font-weight: bold;">Configuração programática (classe):</span> Uma alternativa ao antigo <span style="font-weight: bold;">hibernate.cfg.xml.</span> Todas as configurações informadas no arquivo de configuração do hibernate, podem ser setadas em tempo de execução.<br /></blockquote></span></div><span style="font-size:85%;"> </span><div style="text-align: justify; font-family: verdana;"><span style=";font-size:85%;" ><br /><span style="font-size:85%;"><span style="font-weight: bold;">Nosso <span style="color: rgb(0, 0, 153);">hibernate.cfg.xml</span></span></span><br /><br />Vamos ver primeiro o arquivo de configuração.<br /><br />Crie um arquivo "hibernate.cfg.xml" dentro da pasta src do seu projeto.<br /><br /><blockquote>OBS inútil: esse arquivo do hibernate pode ter outro nome. <span style="font-weight: bold;">É obrigatório o arquivo conter "cfg.xml"</span>.<br />Ex: "qualauernome.cfg.xml"<br />Mas o nome mais comum é "hibernate.cfg.xml". </blockquote>Veja como fica o meu projeto no netbeans:<br /></span><span style="font-size:85%;"><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjUp_rYZcDK-6ZF2f_rnJAkqTP5RRXwlbu86qpEqkJPCsCzy8q3M4V5A4pTga2dp5Ei6CFErBrcxihrNy9nzepYXcIvxp6FYYHR3Hs4M3rVhtrLX3Nd7ZFeXeAShxsZLYXe76jmz7O5m1c/s1600-h/temp7.bmp"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjUp_rYZcDK-6ZF2f_rnJAkqTP5RRXwlbu86qpEqkJPCsCzy8q3M4V5A4pTga2dp5Ei6CFErBrcxihrNy9nzepYXcIvxp6FYYHR3Hs4M3rVhtrLX3Nd7ZFeXeAShxsZLYXe76jmz7O5m1c/s320/temp7.bmp" alt="" id="BLOGGER_PHOTO_ID_5113537860367830914" border="0" /></a><br /></span><span style=";font-size:85%;" ><br />Criado o arquivo vamos ver a maldita configuração:<br /></span><span style="font-size:85%;"><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhOoSh5Tssa584tap6OE3z3WiltZCMt05fUZwTIygVrmBuF4TA3NmlKGvwr_NB0JMGyec_98X7JSF506uyxZBTvXMNfZrgeqIGHRt9zeYwtz_8tLZp5yhiyXDGqG8amL4LsE03qWngkw1Q/s1600-h/temp6.bmp"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhOoSh5Tssa584tap6OE3z3WiltZCMt05fUZwTIygVrmBuF4TA3NmlKGvwr_NB0JMGyec_98X7JSF506uyxZBTvXMNfZrgeqIGHRt9zeYwtz_8tLZp5yhiyXDGqG8amL4LsE03qWngkw1Q/s320/temp6.bmp" alt="" id="BLOGGER_PHOTO_ID_5113539569764814754" border="0" /></a></span><span style=";font-size:85%;" >Explicação<br /></span><span style="font-weight: bold;font-size:85%;" >connection.driver_class:</span><span style=";font-size:85%;" > Nome da classe do driver que será utilizado. No meu caso estou utilizando o postgresql.<br /></span><span style="font-weight: bold;font-size:85%;" ><br /></span><span style="font-weight: bold;font-size:85%;" >connection.url: </span><span style=";font-size:85%;" >URL para conexão com o banco. </span><span style="font-weight: bold;font-size:85%;" >connection.username:</span><span style=";font-size:85%;" > nome do usuário para conexão com o banco </span><span style="font-weight: bold;font-size:85%;" >connection.password</span><span style="font-weight: bold;font-size:85%;" >:</span><span style=";font-size:85%;" > senha para conexão com o banco </span><span style="font-weight: bold;font-size:85%;" ><br /></span><span style=";font-size:85%;" >Até aqui são configuraçoes normais que você já deve ter usado para criar conexões com o banco via JDBC dirto.</span><span style="font-weight: bold;font-size:85%;" ><br /><br />connection.pool_size</span><span style="font-weight: bold;font-size:85%;" >:</span><span style=";font-size:85%;" > Configuração do pool de conexão. No nosso caso o hibernate manterá sempre 1 conexão com o banco.</span><span style="font-weight: bold;font-size:85%;" ><br /><br /></span><span style="font-weight: bold;font-size:85%;" >dialect</span><span style="font-weight: bold;font-size:85%;" > <span style="color: rgb(255, 0, 0);">(Importantíssimo)</span>: </span><span style=";font-size:85%;" >O hibernate gera o sql dinamicamente de acordo com o banco de dados utilizado. A forma do Hibernate saber para qual banco gerar o SQL é o "dialect". <a href="http://www.hibernate.org/hib_docs/reference/en/html/session-configuration.html#configuration-optional-dialects">Veja aqui</a> a tabela de "dialetos" do hibernate.</span><span style="font-weight: bold;font-size:85%;" ><br /></span><span style="font-weight: bold;font-size:85%;" >cache.provider_class</span><span style="font-weight: bold;font-size:85%;" >:</span><span style=";font-size:85%;" > O hibernate possui um podero sistema de Cahce de objetos. Eu particularmente nunca utilizei. Se alguem quiser se aprofundar veja em:<br /></span><ul style="font-family:verdana;"><li><span style="font-size:85%;"><a href="http://www.hibernate.org/hib_docs/reference/en/html/session-configuration.html#configuration-optional-cacheprovider">Second Level e query cache</a></span></li><li><span style="font-size:85%;"><a href="http://www.hibernate.org/hib_docs/reference/en/html/performance.html#performance-cache">Second Level</a></span> </li></ul><span style="font-weight: bold;font-size:85%;" >show_sql</span><span style="font-weight: bold;font-size:85%;" >:</span><span style=";font-size:85%;" > Com o valor "true" exibe todos os comandos SQL executados pelo hibernate no console da IDE e no arquivo de LOG, caso configurado.<br />Ótimo para achar erros.<br /><br /></span><span style="font-weight: bold;font-size:85%;" >hbm2ddl.auto</span><span style="font-weight: bold;font-size:85%;" ><span style="color: rgb(255, 0, 0);">(maravilhoso)</span></span><span style="font-weight: bold;font-size:85%;" >: </span><span style=";font-size:85%;" >Essa cara aqui é muito bom. Esta ferramenta do hibernate gera o schema para o banco de dados, ou seja, ele cria o banco de dados com os seus relacionados, chaves primárias, etc.. a partir das classes configuradas no hibernate. Essa ferramente é executado quando criamos o SessionFactory que veremos a seguir.<br /><br />Algums valores:<br /></span><blockquote style="font-family:verdana;"><span style="font-size:85%;"><span class="literal"><span style="font-weight: bold;">create-drop:</span> Cria as tabelas do banco quando o SessionFactory é iniciado e deleta a base de dados quao termina a executação. Muito cuidado ao usar essa configração com o banco de dados de produção..hehehehe<br /><br /></span><span class="literal" style="font-weight: bold;">update</span></span><span style="font-weight: bold;font-size:85%;" >:</span><span style="font-size:85%;"> Atualizar colunas e tabelas do banco de dados. Essa configuração não deleta nenuma coluna, somente insere.</span></blockquote><span style="font-weight: bold;font-size:85%;" >OBS:</span><span style="font-size:85%;"> É necessário já estar criado o "database".<br /><br /><br /><span style="font-weight: bold;">"mapping class"</span></span><span style="font-weight: bold;font-size:85%;" ><span style="font-weight: bold;">:</span><br /></span><span style="font-size:85%;">Bom esse trecho não é bem uma configuração. Aqui estamos adicionando as classes que serão mapeadas no hibernate. Todas as classe que iremos mapear no hibernate tem que ser adicionadas na configuração.<br /><br /><br />Agora que foi entendido a configuração do hibernate vamos ver como fazer essa mesma configuração na classe:</span><span style=";font-size:85%;" ><br /><br /></span><span style="font-size:85%;"><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgUmMa1MXuiB9uEOPJRen9_56rTd7G7WCHSoccn8UG-kbN5M-qlgnal87Q78IQQ4rJM23VV_F7nEVZOOYlfJiWFTX6EBfCDeMdHwbKvQyGkI7U5fAyt7N3Mm9WmoRBBnxR-XQAoGmspE_s/s1600-h/temp13.GIF"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgUmMa1MXuiB9uEOPJRen9_56rTd7G7WCHSoccn8UG-kbN5M-qlgnal87Q78IQQ4rJM23VV_F7nEVZOOYlfJiWFTX6EBfCDeMdHwbKvQyGkI7U5fAyt7N3Mm9WmoRBBnxR-XQAoGmspE_s/s320/temp13.GIF" alt="" id="BLOGGER_PHOTO_ID_5113580367659159538" border="0" /></a><br /></span><span style=";font-size:85%;" >Nessa classe criamos uma instância da classe <span style="font-weight: bold;">AnnotationConfiguration</span> que é a classe do hibernate que recebe configurações iguais ao do XML.<br /><br />Veja que chamei o método "<span style="font-weight: bold;">setProperty"</span> para setar as propriedades.<br /><span style="font-weight: bold;"><br /><br />4º Passo: Iniciar o Hibernate.<br /><span style="font-weight: bold;"><br /></span></span>Eu criei uma classe chamda <span style="font-weight: bold;">Hibernate</span></span><span style=";font-size:85%;" ><span style="font-weight: bold;">Config</span></span><span style=";font-size:85%;" > com os métodos <span style="font-weight: bold;">iniciarHibernateClass</span>e(mostrado acima)<span style="font-weight: bold;"> </span>e<span style="font-weight: bold;"> iniciarHibernateXML</span><span>, abaixo</span><span style="font-weight: bold;">.<br /></span></span><span style="font-size:85%;"><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjAAkJXdAiwfm6-rveumLgM2JwsZpeCgOh1BlPb2evcN_pRMBaRvhuIpSZXMuC_Olkn03a5JTtfLEB5ukQHCs1HmYwrzP209DczZ4-Cbn_vSsWMJgU33LLZEBtIiXxaLQUtYtoVAae2qfA/s1600-h/temp14.GIF"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjAAkJXdAiwfm6-rveumLgM2JwsZpeCgOh1BlPb2evcN_pRMBaRvhuIpSZXMuC_Olkn03a5JTtfLEB5ukQHCs1HmYwrzP209DczZ4-Cbn_vSsWMJgU33LLZEBtIiXxaLQUtYtoVAae2qfA/s320/temp14.GIF" alt="" id="BLOGGER_PHOTO_ID_5113584336208941058" border="0" /></a></span><span style="font-size:85%;">A lógica para istânciar um objeto SessionFactory é a mesma com o arquivo de configuação e para a classe.<br /><br /><span style="font-weight: bold;">1º</span> Criar o objto <span style="font-weight: bold;">AnnotationConfiguration<br /><br />2º </span>Setar as configurações.<br /> <span style="font-style: italic;">Classe:</span> setar as configurações a partir do método </span><span style=";font-size:85%;" ><span style="font-weight: bold;">setProperty<br /><br /></span></span><span style="font-size:85%;"> <span style="font-style: italic;">Arquivo cfg.xml:</span> chamar o método <span style="font-weight: bold;">configure()</span> da classe AnnotationConfiguration. Este método irá carregar as configurações do arquivo e retornar um objeto do tipo Configuration.<br /><br /><span style="font-weight: bold;">3º</span> Chamar o método<br /> <span style="font-style: italic;">Classe:</span> chamar o método "<span style="font-weight: bold;">buildSessionFactory</span>()" da classe AnnotationConfiguration.<br /> <span style="font-style: italic;">Arquivo:</span> chamar o método "<span style="font-weight: bold;">buildSessionFactory</span>()" do objeto retornado do método "configure()"<br /><br /><br /></span> <span style="font-size:85%;">Se ficiu confuso esses passos veja a classe que vai ajudar.<br /></span><span style=";font-size:85%;" ><br /><br />Bom.. mais uma vez fica aqui meu pedido de críticas e sugestões...<br /><br />No mais era isso...<br /><br />Abração!<br /></span></div><span style="font-family: verdana;font-family:verdana;font-size:85%;" ><br /><br /><br /><br /></span>Alexandre Simundihttp://www.blogger.com/profile/07075473948224038728noreply@blogger.com4tag:blogger.com,1999:blog-7642770694393333804.post-51272993653719522062007-08-26T17:06:00.001-03:002008-12-09T01:08:24.884-02:00O que é o hibernate ?<div style="font-family: verdana;" id="infoblogs"><span style="font-size:85%;"><br /></span> <span style="float: left; margin-right: 10px; margin-top: 7px;font-size:85%;" ><br /> <script> var infoblogs_url = 'http://simundi.blogspot.com/2007/08/o-que-o-hibernate.html'; </script><br /> <script src="http://www.infoblogs.com.br/api/infoblogscredit.js"></script><br /> </span><span style="font-size:85%;">Hibernate. É bem simples entender pra que serve esse bicho: Mapeamento Objeto Relacional</span></div><div style="text-align: justify;"><span style="font-family: verdana;font-size:85%;" ><br /></span><span style="font-size:85%;"><span style="font-family:verdana;">Para os mais experientes falar que o Hibernate faz a "ponte" entre o conceito Relacional com o Orientado a Objetos é fácil. Mas tem bastante gente que não cosegue enxergar isso.<br /><br /><br /></span></span> </div><span style="font-size:85%;"> <span style="font-family:verdana;">Agora veja da seguinte forma. Temos uma tabela, o exemplo clássico, "Pessoa"</span> <a style="font-family: verdana;" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj3U7md4q2yX7Umrt8FjFQZ4lfDTsPmijurrmkZ_M8nlI7AvvdGNzoX7MU86Csgk_Toy8ioFJ1dzF-d4yKdkQzpvRxj3O5PMFTwEOxJS5z_zZxukjV5GYZiv_aYUL1kbQirLEVCt6qzABA/s1600-h/imagem.GIF"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj3U7md4q2yX7Umrt8FjFQZ4lfDTsPmijurrmkZ_M8nlI7AvvdGNzoX7MU86Csgk_Toy8ioFJ1dzF-d4yKdkQzpvRxj3O5PMFTwEOxJS5z_zZxukjV5GYZiv_aYUL1kbQirLEVCt6qzABA/s400/imagem.GIF" alt="" id="BLOGGER_PHOTO_ID_5103109285504676706" border="0" /></a> <span style="font-family:verdana;"><br />Bom ai temos uma tablea com 3 colunas. Transformar isso em objeto é fácil.</span> <span style="font-family:verdana;">Seria um objeto da seguinte forma:</span> <a style="font-family: verdana;" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj8vkgJkQ_WcKEHVkmtESoN-eqcuiIM78tCCIkG15TeVPqaAIObCRrwCiH99ZEdw2kf02q0gLE1RuYMtVacnoDLvInJyR4b94txp6vPhK-qczGt0j5-HfIo4ZYMygrK0DdzKZ74zgWC9i8/s1600-h/tmp.jpg"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj8vkgJkQ_WcKEHVkmtESoN-eqcuiIM78tCCIkG15TeVPqaAIObCRrwCiH99ZEdw2kf02q0gLE1RuYMtVacnoDLvInJyR4b94txp6vPhK-qczGt0j5-HfIo4ZYMygrK0DdzKZ74zgWC9i8/s200/tmp.jpg" alt="" id="BLOGGER_PHOTO_ID_5103110415081075570" border="0" /></a> <span style="font-family:verdana;">Difícil fazer o "Mapemaneto Objeto Relacional" ??</span> <span style="font-family:verdana;"><br /><br />Agora imagine este relacionamento:</span> </span><div style="text-align: center;"><span style="font-size:85%;"><a style="font-family: verdana;" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjJOjjeLU5omXf30ib1HJbeg9OwgT2OO5l_BkGzg88jaEdsBOpqaJKvR3OYiUWmmkzJfeIpXdz2Cq0CEpWV9YMnZOqRL8tEivDbZyLvk1pG9AlrGVdEluQoSH3A5yi_GVCh1S3oOrhCB-o/s1600-h/tmp2.jpg"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjJOjjeLU5omXf30ib1HJbeg9OwgT2OO5l_BkGzg88jaEdsBOpqaJKvR3OYiUWmmkzJfeIpXdz2Cq0CEpWV9YMnZOqRL8tEivDbZyLvk1pG9AlrGVdEluQoSH3A5yi_GVCh1S3oOrhCB-o/s400/tmp2.jpg" alt="" id="BLOGGER_PHOTO_ID_5103112695708709778" border="0" /></a><span style="font-size:85%;"><span style="font-style: italic;font-family:verdana;" >Por favor, ignore o fato de ter feito um ER em uma ferramento de UML... :D</span></span></span> </div><span style=";font-family:verdana;font-size:85%;" > Você consegue enxergar que uma pessoa tem um carro e um endereço?? E que este carro tem um modelo ?? Transformar issto em objeto ainda continua fácil.<br /><br />Mas você já imaginou o código necessário para passar estes dados para objetos ?!<br /><br />Veja: </span><span style="font-size:85%;"><br /><br /><a style="font-family: verdana;" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhms70ohN8qmNUIRnlJIIZI0FUja7Iy6XaM0wIWnTzs4obFjHYa51YSox4nNoc02ydAnuBJdDqbty8eE9U4rTRFFqX8LaCEvuTB8IVKB4lKkZN63cQ15EELPuY5Mws0OtqMGOb-JoOfwr0/s1600-h/tmp3.GIF"><img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 298px; height: 320px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhms70ohN8qmNUIRnlJIIZI0FUja7Iy6XaM0wIWnTzs4obFjHYa51YSox4nNoc02ydAnuBJdDqbty8eE9U4rTRFFqX8LaCEvuTB8IVKB4lKkZN63cQ15EELPuY5Mws0OtqMGOb-JoOfwr0/s400/tmp3.GIF" alt="" id="BLOGGER_PHOTO_ID_5103124403789558690" border="0" /></a><br /><br /><br /><br /><a style="font-family: verdana;" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiXSwWkPSYprE01SKwHDOQ4AAa8uxbVHgPqkZm8dmYjD2H2ttoSEIfbYss_9LPiOXFnqH0kFnmiFgOEtyLeXi-l_vmJdPuG2elVYzmbwWRFzKMhcBFKwan9Xq8sP3CPOeUZQZKiM4Gql0s/s1600-h/tmp2.jpg"><br /></a><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><span style="font-family:verdana;">Muitos vão olhar o código e dizer "Isso não é difícil" ou "Isto eu faço!". Realmente não é nada de outro mundo.<br />Mas imagine um projeto grande, com mais de 800 entidades persistentes. Qualquer programador fiacaria louco !!!</span><br /><br /><br /><span style="font-family:verdana;">Agora veja o <span style="font-weight: bold;">mesmo</span> código com Hibernate:</span><br /><a style="font-family: verdana;" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiNw7AQJxMR2Odt_6wG3jD45eUgOjpZjfW1KcCnvbdY2fNsSAy7i1lGSa0tZZ7sdIgHSPyWnjqLYMyUCT7NlZwlMrgCZ5wK6lyiLlhoodf4d3asOwkDWbhm7cnZcWmQYeR9_jrOCyiZjEE/s1600-h/tmp3.GIF"><img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 327px; height: 212px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiNw7AQJxMR2Odt_6wG3jD45eUgOjpZjfW1KcCnvbdY2fNsSAy7i1lGSa0tZZ7sdIgHSPyWnjqLYMyUCT7NlZwlMrgCZ5wK6lyiLlhoodf4d3asOwkDWbhm7cnZcWmQYeR9_jrOCyiZjEE/s400/tmp3.GIF" alt="" id="BLOGGER_PHOTO_ID_5103127848353330098" border="0" /></a><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><span style="font-family: verdana;font-family:verdana;" >O quê?! É isso mesmo ??? Sim!!</span><br /><br /><span style="font-family: verdana;font-family:verdana;" >Claro, tem uma pequena parte que não esta neste código. A configuração do hibernate. Mas as consultas são simples assim.</span><br /><br /><span style="font-family: verdana;font-family:verdana;" >O que eu mostrei até aqui é uma parte do que o Hibernate faz, agora vou fazer um apêndice sobre JPA.<br /><br /><br /></span></span><span style="font-weight: bold; font-family: verdana;font-size:85%;" >Java Persistence API - JPA<br /><br /></span><span style="font-family: verdana;font-size:85%;" >"Java Persistence API é a interface padrão para mapeamento objeto/relacional e gerenciamento de persistência da plataforma Java EE 5.0"<br /><br /></span><div style="text-align: justify; font-family: verdana;"><span style="font-size:85%;">Bom, espero q agora o termo "mapeamento objeto relacional" seja claro para todo mundo.<br /><br />JPA define um comportamento, um contrato, de como deve ser o mapeamento objeto relacional e o gerenciamento de persistência de objetos java. Veja bem: </span><span style="font-weight: bold;font-size:85%;" >define um contrato</span><span style="font-size:85%;">. A implementação pode ser feita por qualquer um.<br /><br />Eu li no blog <a href="http://beyondclick.wordpress.com/2007/06/25/provedor-de-persistencia-jpa/">Beyond Click</a> uma comparação perfeita. JPA está para persistência assim como JDBC está para conexão com banco de dados.<br /><br />As mais famosas implementações JPA são Hibenate e TopLink, existem outras.<br /><br /><br /></span></div><span style="font-size:85%;"><span style="font-family:verdana;">Voltando ao hibernate... algumas de suas funcionalidades:</span><br /><br /><span style="font-weight: bold;font-family:verdana;" >Persistência transparente</span><br /><span style="font-family:verdana;">Não é necessário executar os comandos SQL de Insert, Update e Delete. O hibernate executa os médoto "save(Object obj)" , "update(Object obj)" e "delete(Object obj)". </span><br /><span style="font-family:verdana;">Ou seja, ele salva, atualiza ou deleta objetos.</span><br /><br /><span style="font-weight: bold;font-family:verdana;" >Consulta Fácil<br /></span><span style="font-family:verdana;">O hibernate possui uma lingugem própria de consulta, o HQL. Esta linguamgem é equivalente a um SQL orientado a objetos. Facilita muuuiiiiiiiiitttoooo as consultas de objetos.<br /><br /><span style="font-weight: bold;">Cache de objetos<br /></span>O hibernate, se for configurado para isso, trabalha com Cache de objetos.<br />Se um usuário consultou os dados da pessoa ID 1 no banco. Essa consulta fica em memória. Caso outro usuário consulte os dados da pessoa ID 1 o hibernate retorna os valores do Cache, não realizando uma nova consulta na base.<br />O isso significa um ganho de desempenho para aplicações de grande porte.<br /><br />Existem outras!!<br /><br /><br /><span style=";font-family:arial;font-size:100%;" ><span style="font-weight: bold;">Como ele faz isso??</span></span><br />Essa parte que é interessante. O hibernate faz um mapemaneto entre classes java e tabelas no banco de dados.<br /><br />Veja:<br /><br />Classe Pessoa<br /></span></span><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhfX79OcrXBA-1BsW_gTNW_7rzd8evwC-6tDOihQpDoDI1fr6fmfSS7jtDEvRIAMVxzpJ-dO6vf4EyYbn5IIjnuvTYc04z_9X8DyKPymXL8jQqyeOhsMdU6YxqEkZsMzfPZNoSjh4nA6ew/s1600-h/tmp4.GIF"><img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhfX79OcrXBA-1BsW_gTNW_7rzd8evwC-6tDOihQpDoDI1fr6fmfSS7jtDEvRIAMVxzpJ-dO6vf4EyYbn5IIjnuvTYc04z_9X8DyKPymXL8jQqyeOhsMdU6YxqEkZsMzfPZNoSjh4nA6ew/s200/tmp4.GIF" alt="" id="BLOGGER_PHOTO_ID_5103137099712885698" border="0" /></a><br /><span style="font-size:85%;"><span style="font-family:verdana;"><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br />Arquivo de Configuração da classe Pessoa<br /></span></span><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgldCrZc7F3DD_S2Gg4MXz-7iaAxWNTf4QT0GEi8o1cCC08mnMiZacRkqyOuoY5dXMFx_cfsFEgA1rMtS1DXp2syzIU-VFSq2XuqrH5EH25ix33dJXS8HiMvhZWMQmW0TmtszJnMt-tzvs/s1600-h/tmp5.GIF"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgldCrZc7F3DD_S2Gg4MXz-7iaAxWNTf4QT0GEi8o1cCC08mnMiZacRkqyOuoY5dXMFx_cfsFEgA1rMtS1DXp2syzIU-VFSq2XuqrH5EH25ix33dJXS8HiMvhZWMQmW0TmtszJnMt-tzvs/s400/tmp5.GIF" alt="" id="BLOGGER_PHOTO_ID_5103138169159742418" border="0" /></a><br /><br /><span style="font-size:85%;"><span style="font-family:verdana;">Esse arquivo xml realiza o tal Mapeamento. É nesse arquivo que esta toda a informação do objeto que será persistido ( inserido no banco de dados).</span><br /><br /><span style="font-family:verdana;">Este arquivo esta nos dizendo que o objeto Pessoa será inserido na tabela Pessoa. Que o atributo nome, da classe pessoa, representa a coluna nome na tabela Pessoa, e assim por diante.</span><br /><br /><span style="font-family:verdana;">Esse arquivo XML existe para cada Entidade Persistente. Uma entidade persistente é um objeto que será inserido no banco de dados.<br /><br /><br /><span style="font-weight: bold;">Estrutura do Hibernate<br /></span>Abaixo está uma foto que tirei so site do hibernate de como é a sua estrutura.<br /><br /></span></span><span style=";font-family:verdana;font-size:85%;" ><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjad-Y9o0HfAruBprzF3eUZzJcgebhLnNeRTh8xQe9ncW9NCqSHWF-iI0bB_BUmWFrnnHObJGmLVSfyNaKweIrkMQO2GKZYDMgbIiyzuW5eSfg90ClGc1Boyd7zN5Vy6gxzOH35EyVkQO8/s1600-h/temp4.bmp"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjad-Y9o0HfAruBprzF3eUZzJcgebhLnNeRTh8xQe9ncW9NCqSHWF-iI0bB_BUmWFrnnHObJGmLVSfyNaKweIrkMQO2GKZYDMgbIiyzuW5eSfg90ClGc1Boyd7zN5Vy6gxzOH35EyVkQO8/s400/temp4.bmp" alt="" id="BLOGGER_PHOTO_ID_5110969689809235010" border="0" /></a></span><br /><br /><br /><span style="font-weight: bold; font-family: verdana;font-family:verdana;font-size:85%;" >Entity Manager<br /></span><span style="font-family: verdana;font-size:85%;" >EntityManager também faz parte da JPA. Esse pacote contem implementações do gerencimaneto de persistência, ciclo de vida dos objetos, a Java Persistence Quary Language e as configurações.<br />É um JAR com classes que fazem isso escrito ai em cima....hehehe<br /></span><span style="font-weight: bold; font-family: verdana;font-family:verdana;font-size:85%;" ><br />Hibernate Core</span><span style="font-family: verdana;font-family:verdana;font-size:85%;" ><br />Este o núcleo do hibernate. Imagine o Hibernate Core como o Java SE da paltaforma Java. São os recursos básicos do hibernate, utilzido pelas demais API's.<br /><br /></span><span style="font-weight: bold; font-family: verdana;font-family:verdana;font-size:85%;" >Hibernate Annotations </span><span style="font-family: verdana;font-family:verdana;font-size:85%;" ><br />O hibernate, como qualquer outro framework para mapeamento objeto relacional, precisa de informarções (chamdados de "meta dados") para transformar tabelas relacionais de uma base de dados em </span><span style="font-family: verdana;font-family:verdana;font-size:85%;" >objetos</span><span style="font-family: verdana;font-size:85%;" >.<br />Antes de lançar o Java 5.0, com o recurso de Annotations, esses "meta dados" eram informados em arquivos XML, com o Java 5.0, o XML foi substituído por "annotatinos". Que fazem o mesmo papel do XML, só que agora na prória Classe.<br />O Hibernate Annotations extende as Annotações padrão da JPA.<br /><br /><br /></span><span style="color: rgb(0, 0, 153); font-family: verdana;font-family:verdana;font-size:85%;" >É bom saber que o hibernate com XML ainda é muito utilizado. </span><span style="font-family: verdana;font-size:85%;" ><br /><br /><br /></span><span style="font-size:85%;"><br /><span style="font-family: verdana;font-family:verdana;" >Espero que quem não conhecia o hibernate possa ter entendido o que o hibernate é.</span><br /><br /><br /><span style="font-family:verdana;">No decorrer dos próximos argitos irei aprofundar alguns dos assutnos que escrevi aqui.</span><br /><br /><br /><span style="font-family:verdana;">Abraço!</span><br /><br /><span style="font-family:verdana;">fui...</span></span>Alexandre Simundihttp://www.blogger.com/profile/07075473948224038728noreply@blogger.com11tag:blogger.com,1999:blog-7642770694393333804.post-30128537092420194492007-08-26T16:28:00.000-03:002008-02-10T21:37:12.706-02:00Hibernate - da teoria à prática<span style="font-size:85%;"><span style="font-family:verdana;">Dae gurizada!!</span><br /><br /><span style="font-family:verdana;">Bom, faz tempo que não paro para escrever algo de útil. Tenho um monte de "artigos rascunhos" no meu blog que nunca ternimo.</span><br /><br /><span style="font-family:verdana;">Hoje, domingo chuvoso, estava assintindo nada na tv e resolvi escrever uma série de artigos sobre o Hibernate, framework que sou apaixonado! E também sobre JPA.</span><br /><br /><span style="font-family:verdana;">Esse artigos irão abordar os seguintes tópicos:</span><br /><br /></span><ul style="text-align: justify;font-family:verdana;"><li><span style="font-size:85%;"><a href="http://simundi.blogspot.com/2007/08/o-que-o-hibernate.html"><span style="font-weight: bold;">O que é o hibernate ?</span></a> Introdução ao objetivo do framework hibernate, conceito de mapeamento objeto-relacional e exemplos comparativos entre aplicações utilizando hibernate X JDBC "na mão".<br /></span></li></ul><ul style="text-align: justify;font-family:verdana;"><li><span style="font-size:85%;"><span style="font-weight: bold;"><a href="http://simundi.blogspot.com/2007/09/criar-uma-aplicao-com-hibernate.html">Criar uma aplicação com hibernate</a>. </span>Configurar uma aplicação do zero utilizando o Hibernate com JPA.<br /></span></li></ul><ul style="text-align: justify;font-family:verdana;"><li><span style="font-size:85%;"><span style="font-weight: bold;">Aplicação exemplo 1.</span>Aplicação onde vamos criar relacionamentos simples (one-to-many) e criar algumas telas CRUD.<br /></span></li></ul><ul style="text-align: justify;font-family:verdana;"><li><span style="font-size:85%;"><span style="font-weight: bold;">Aplicação exemplo 2. </span>Aplicação onde serão realizadas consultas utilizando a API Criteria, Fetching Lazy ( consultas preguisosas) e relacionamentos many-to-many.<span style="font-weight: bold;"></span><br /></span></li></ul><ul style="text-align: justify;font-family:verdana;"><li><span style="font-size:85%;"><span style="font-weight: bold;">Aplicação exemplo 3. </span>Aqui ja teremos um conceito básico e sólido sobre como utilizar o hibernate. Vamos trabalhar com consultas agregadas.<br /></span></li></ul><span style="font-size:85%;"><br /><span style="font-family:verdana;">Acredito que para aprender deve-se sempre optar pela prática. Então resovli fazer artigos simples, mas com aplicações.</span><br /><br /><span style="font-family:verdana;">Espero que seja de ajuda para quem é iniciante.</span><br /><br /><span style="font-family:verdana;">No mais era isso..</span><br /><br /><span style="font-family:verdana;">Assim que o primeiro artigo estiver pronto, será liberado.<br /><br />fui!<br /></span><br /><br /></span>Alexandre Simundihttp://www.blogger.com/profile/07075473948224038728noreply@blogger.com2tag:blogger.com,1999:blog-7642770694393333804.post-21182765102851380202007-04-20T12:28:00.000-03:002007-08-26T19:27:49.818-03:00Certificação "opensource", por que não?<div id="infoblogs"><br /> <span style="float: left; margin-right: 10px; margin-top: 7px;"><br /> <script> var infoblogs_url = 'http://simundi.blogspot.com/2007/04/certificao-opensource-por-que-no.html'; </script><br /> <script src="http://www.infoblogs.com.br/api/infoblogscredit.js"></script><br /> </span><br /></div><br /><br /><div style="text-align: justify;font-family:verdana;"><span style="font-size:78%;">Esses dias me organizando ( contando os $$ ) para certificação, me surgiu uma dúvida. Por que não pode existir uma Certificação "OpenSource"? Não sei se OpenSource é o termo mais adequado, mas acho que representa bem a idéia.<br /><br />Por que não existe uma Certificação onde a Comunidade de desenvolvedores, analistas, etc.. resolvem o que ser avaliado ??<br />Já param pra imaginar quantas pessoas com talento, caráter e sem R$ ou sem interesse existem por ai ?<br /><br />Ou melhor, se você que está lendo isso já fez alguma seleção para alguma vaga. Já pegou alguém certificado que não teinha o seu perfil ??<br /><br />Isso não é uma crítica às certificações Java. Acho as certificações ótimas! Realmente quem passa não pode se dizer leigo no assunto. E se não for isso que queira avaliar num desenvolvedor ?<br /><br />A certificação java foca em "atividades críticas no desenvolvimento e arquitetura de aplicações". Mas e o resto ?<br /><br />Imaginem uma empresa que não se preocupa se ">>" vai deslocar bit para esquerda ou para direita, não utiliza EJB e o interesse é avaliar aqualidade do trabalho (boas práticas) , por exemplo.<br /><br />Do ponto de vista desta empresa é interessante:<br /></span></div><ul style="text-align: justify;font-family:verdana;"><li><span style="font-size:78%;">Avaliar quanto o indivíduo conhece Spring, Hibernate, Struts, JSF, Ajax, JUnit, Lazlo ou qualquer outro "treco" que eu utilize no projeto.</span></li><li><span style="font-size:78%;">Avaliar se ele utiliza boas práticas no desenvolvimento.</span></li><li><span style="font-size:78%;">Até avaliar se o cara utiliza de forma coerente Exceptions..</span></li></ul><div style="text-align: justify;font-family:verdana;"><span style="font-size:78%;"><br />Isso existe ?<br /><br /><br />Imaginem só, quanto mais facilitado o acesso às certificações melhor seria a visão </span><span style="font-weight: bold;font-size:78%;" >de todos </span><span style="font-size:78%;">perante o mercado de trabalho.<br /><br />Dois pontos de vista diferentes:<br /><br />Desempregado:<br /></span><span style="font-style: italic;font-size:78%;" > - Para mim me candidatar a vaga X precisor passar por o teste A, B e o C. <span style="font-weight: bold;">Bom eu tenho uma meta!!</span></span><span style="font-size:78%;"><br /><br />Empresa:<br /></span><span style="font-style: italic;font-size:78%;" >- Para esta vaga, </span><span style="font-weight: bold; font-style: italic;font-size:78%;" >no mínimo</span><span style="font-style: italic;font-size:78%;" > o indivíduo tem que passar pelo teste X, Y e o Z. </span><span style="font-size:78%;"><br /><br /><br />Resumindo. A Certificação "OpenSource" seria criada não pelo "criador", mas sim por pessoas (lógico com uma certa experiência e qualificação), que no dia-a-dia convivem com Desenvolvedores de todos os níveis.<br /><br />O que vocês acham ?? Vai ou não vai ??<br /><br /><br /></span></div>Alexandre Simundihttp://www.blogger.com/profile/07075473948224038728noreply@blogger.com5tag:blogger.com,1999:blog-7642770694393333804.post-27445844241614355332007-04-14T00:07:00.000-03:002008-12-09T01:08:25.888-02:00Ler e gravar arquivos em javaParece besta, mas já vi algumas pessoas com dúvidas..<br /><br />Existem diversas formas em java para ler e gravar arquivos. Vou mostrar uma que me parece a mais simples.<br /><br />Tando para ler ou gravar são utilizados 3 objetos.<br /><br />- File<br />- Writer ou Reader<br />- Objeto para controlar o buffer<br /><br />Gravar um arquivo:<br /><br /><br /><img style="cursor: pointer;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiG0vhlG5fbKIUIfshiCQP6Q_62lrXACVuHVMaeUz-TMqvkKlEbx6-l7Hr7BZXura_Zrr_dRzAIcqH1feN4FdMLjHnXNrd0mVTHxfmlJBXncuEHlUmp0RqrLkGFgL2kTERbG5kCTRGYs10/s400/temp1.jpg" alt="" id="BLOGGER_PHOTO_ID_5051981220342205538" border="0" /><br /><br /><br /><br /><br />Ler um arquivo:<br /><br /><br /><img style="cursor: pointer;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi09wjKmA96l4CdNlH1kEE8NrNf_2ALUMIsqhjV-ga8APPg3-iT5Z2vxSJ5krP_ug8aPgmY-05Tzp8ZKey4-wbwi0nNu7muDZegOOp8PMmm5p0cW5kcqrNd_ZQgflW-uuFwbX0ndlGpHVM/s400/temp2.jpg" alt="" id="BLOGGER_PHOTO_ID_5051981220342205554" border="0" /><br /><br />Tae uma forma bem simples para trabalhar com arquivos...<br /><br />Abraço!Alexandre Simundihttp://www.blogger.com/profile/07075473948224038728noreply@blogger.com5tag:blogger.com,1999:blog-7642770694393333804.post-33687827308436438962007-04-13T18:37:00.000-03:002007-04-13T18:56:31.427-03:00Ordenar objetos em Java<div id="infoblogs"><br /> <span style="float: left; margin-right: 10px; margin-top: 7px;"><br /> <script> var infoblogs_url = 'http://simundi.blogspot.com/2007/04/ordenar-objetos-em-java.html'; </script><br /> <script src="http://www.infoblogs.com.br/api/infoblogscredit.js"></script><br /> </span><br /></div><br /><span style="font-size:85%;"><span style="font-family:verdana;"><br />Hoje tive que ordenar objetos de uma Collection. Essa coleção era resultado de uma consulta muito louca usando a api Criteria do Hibernate, por isso não consegui utilizar um simples ORDER BY.</span><br /><br /><span style="font-family:verdana;">Para resolver meu problema utilizei as API's </span></span><span style="font-weight: bold;font-family:verdana;font-size:85%;" ><a href="http://jakarta.apache.org/commons/collections/">Commons Collection</a> </span><span style="font-size:85%;"><span style="font-family:verdana;">e </span><a style="font-family: verdana;" href="http://jakarta.apache.org/commons/beanutils/"><span style="font-weight: bold;">BeanUtil</span> </a><span style="font-family:verdana;">do Jakarta.</span><br /><br /><span style="font-family:verdana;">O código ficou assim:</span><br /><br /><br /></span> <span style="color: rgb(0, 0, 153);font-family:verdana;font-size:85%;" > List<</span><span style="color: rgb(0, 0, 153);font-family:verdana;font-size:85%;" >BeanComparator></span><span style="color: rgb(0, 0, 153);font-family:verdana;font-size:85%;" > sortFields = new ArrayList();</span><span style="font-size:85%;"><br /></span><span style="color: rgb(0, 0, 153);font-family:verdana;font-size:85%;" > sortFields.add(new BeanComparator("semestre"));</span><span style="font-size:85%;"><br /></span><span style="color: rgb(0, 0, 153);font-family:verdana;font-size:85%;" > sortFields.add(new BeanComparator("nome"));<br /><br /></span><span style="color: rgb(0, 0, 153);font-family:verdana;font-size:85%;" > ComparatorChain multiSort = new ComparatorChain(sortFields);</span><span style="font-size:85%;"><br /></span><span style="color: rgb(0, 0, 153);font-family:verdana;font-size:85%;" > java.util.Collections.sort(disciplinas,multiSort);</span><span style="font-size:85%;"><br /><br /><span style="font-family:verdana;">Tirei o exemplo do </span><a style="font-family: verdana;" href="http://www.javafree.org/">Porta JavaFree</a><span style="font-family:verdana;">, só não achei o link mais</span><br /><br /><span style="font-family:verdana;">Este código é bem simples.</span><br /><br /><span style="font-family:verdana;">Primeiro criei uma list de BeanComparator. BeanComparator é utilizado em conjunto pela classe ComparatorChain para ordenar uma list por vários campos. Nome meu caso nome e semestre.</span><br /><br /><span style="font-family:verdana;">Era isso!</span></span>Alexandre Simundihttp://www.blogger.com/profile/07075473948224038728noreply@blogger.com0