<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet href="http://feeds.feedburner.com/~d/styles/rss2portuguesefull.xsl" type="text/xsl" media="screen"?><?xml-stylesheet href="http://feeds.feedburner.com/~d/styles/itemcontent.css" type="text/css" media="screen"?><rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0">

<channel>
	<title>Bruno Braga</title>
	
	<link>http://www.brunobraga.com.br</link>
	<description>Um pouco sobre Java, Produtividade e Ferramentas IBM</description>
	<pubDate>Sat, 25 Oct 2008 12:08:58 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.5.1</generator>
	<language>en</language>
			<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" href="http://feeds.feedburner.com/brunobraga" type="application/rss+xml" /><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://add.my.yahoo.com/rss?url=http%3A%2F%2Ffeeds.feedburner.com%2Fbrunobraga" src="http://us.i1.yimg.com/us.yimg.com/i/us/my/addtomyyahoo4.gif">Subscribe with My Yahoo!</feedburner:feedFlare><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://www.newsgator.com/ngs/subscriber/subext.aspx?url=http%3A%2F%2Ffeeds.feedburner.com%2Fbrunobraga" src="http://www.newsgator.com/images/ngsub1.gif">Subscribe with NewsGator</feedburner:feedFlare><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://feeds.my.aol.com/add.jsp?url=http%3A%2F%2Ffeeds.feedburner.com%2Fbrunobraga" src="http://o.aolcdn.com/favorites.my.aol.com/webmaster/ffclient/webroot/locale/en-US/images/myAOLButtonSmall.gif">Subscribe with My AOL</feedburner:feedFlare><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://www.rojo.com/add-subscription?resource=http%3A%2F%2Ffeeds.feedburner.com%2Fbrunobraga" src="http://blog.rojo.com/RojoWideRed.gif">Subscribe with Rojo</feedburner:feedFlare><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://www.bloglines.com/sub/http://feeds.feedburner.com/brunobraga" src="http://www.bloglines.com/images/sub_modern11.gif">Subscribe with Bloglines</feedburner:feedFlare><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://www.netvibes.com/subscribe.php?url=http%3A%2F%2Ffeeds.feedburner.com%2Fbrunobraga" src="http://www.netvibes.com/img/add2netvibes.gif">Subscribe with Netvibes</feedburner:feedFlare><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://fusion.google.com/add?feedurl=http%3A%2F%2Ffeeds.feedburner.com%2Fbrunobraga" src="http://buttons.googlesyndication.com/fusion/add.gif">Subscribe with Google</feedburner:feedFlare><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://www.pageflakes.com/subscribe.aspx?url=http%3A%2F%2Ffeeds.feedburner.com%2Fbrunobraga" src="http://www.pageflakes.com/ImageFile.ashx?instanceId=Static_4&amp;fileName=ATP_blu_91x17.gif">Subscribe with Pageflakes</feedburner:feedFlare><item>
		<title>Pangea - rede social sobre arquitetura de software</title>
		<link>http://www.brunobraga.com.br/2008/10/24/pangea-rede-social-sobre-arquitetura-de-software/</link>
		<comments>http://www.brunobraga.com.br/2008/10/24/pangea-rede-social-sobre-arquitetura-de-software/#comments</comments>
		<pubDate>Fri, 24 Oct 2008 19:08:36 +0000</pubDate>
		<dc:creator>Bruno Braga</dc:creator>
		
		<category><![CDATA[Java]]></category>

		<category><![CDATA[SOA]]></category>

		<category><![CDATA[Tecnologia]]></category>

		<category><![CDATA[Arquitetura de Software]]></category>

		<category><![CDATA[DDD]]></category>

		<category><![CDATA[Pangea]]></category>

		<category><![CDATA[Rede Social]]></category>

		<guid isPermaLink="false">http://www.brunobraga.com.br/?p=50</guid>
		<description><![CDATA[Agora em outubro meu amigo Adriano Tavares da Squadra aqui de Belo Horizonte, junto com outros amigos da Squadra criaram o Pangea.
Segundo descrição do próprio grupo:
&#8220;Pangea é uma rede formada por profissionais e acadêmicos interessados no crescimento e evolução da arquitetura de software&#8221;.
http://pangeanet.ning.com
Se você trabalha com desenvolvimento de software, gosta de arquitetura, quer discutir, colaborar [...]]]></description>
			<content:encoded><![CDATA[<p>Agora em outubro meu amigo <a href="http://pangeanet.ning.com/profile/adrianotavares" target="_blank">Adriano Tavares</a> da Squadra aqui de Belo Horizonte, junto com outros amigos da Squadra criaram o <a href="http://pangeanet.ning.com" target="_blank">Pangea</a>.<br />
Segundo descrição do próprio grupo:</p>
<p>&#8220;Pangea é uma rede formada por profissionais e acadêmicos interessados no crescimento e evolução da arquitetura de software&#8221;.</p>
<p><a href="http://pangeanet.ning.com" target="_blank">http://pangeanet.ning.com</a></p>
<p>Se você trabalha com desenvolvimento de software, gosta de arquitetura, quer discutir, colaborar e aprender mais sobre o tema, não deixe de se cadastrar. Podemos aprender muito com as experiência e idéias de outras pessoas.</p>
<p>Alguns grupos dos quais participo:</p>
<p>- <a href="http://pangeanet.ning.com/group/monstrosdaarquiteturadesoftware" target="_blank">Monstros da Arquitetura de Software</a><br />
- <a href="http://pangeanet.ning.com/group/ddd" target="_blank">Domain-Driven Design</a><br />
- <a href="http://pangeanet.ning.com/group/a" target="_blank">O lugar certo para você aprender e praticar SOA</a></p>
<p>A rede hoje tem 93 membros e quanto mais gente participando melhor.<br />
<embed src="http://static.ning.com/pangeanet/widgets/index/swf/badge.swf?v=3.7.6%3A10555" quality="high" scale="noscale" salign="lt" wmode="transparent" bgcolor="#ffffff" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" width="206" height="64" allowScriptAccess="always" flashvars="networkUrl=http%3A%2F%2Fpangeanet.ning.com%2F&amp;panel=user&amp;username=2lxlyjz7l88mu&amp;avatarUrl=http%3A%2F%2Fapi.ning.com%2Ffiles%2F9qNZKzksbC5f8UpwjyI1vXrlZzyY-PqFPDobH-iP%2AWwkg6ZwYSC1JjBFoyUhU1cqQvgkcrEzMM2nZuQdKFqPFcZ5OMPUAk9i%2F0002_peq.jpg%3Fwidth%3D48%26height%3D48%26crop%3D1%253A1&amp;iAmMemberText=Eu+sou+membro+de%3A&amp;configXmlUrl=http%3A%2F%2Fstatic.ning.com%2Fpangeanet%2Finstances%2Fmain%2Fembeddable%2Fbadge-config.xml%3Ft%3D1224676250" /> <br /><small><a href="http://pangeanet.ning.com/xn/detail/u_2lxlyjz7l88mu">Exibir minha página em <em>Pangea</em></a></small></p>
<p>Uma rede social com esse objetivo é muito melhor do que o orkut, né não? <img src='http://www.brunobraga.com.br/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' /><br />
Colabore!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.brunobraga.com.br/2008/10/24/pangea-rede-social-sobre-arquitetura-de-software/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Rational Team Concert - de olho também no legado</title>
		<link>http://www.brunobraga.com.br/2008/10/20/rational-team-concert-de-olho-tambem-no-legado/</link>
		<comments>http://www.brunobraga.com.br/2008/10/20/rational-team-concert-de-olho-tambem-no-legado/#comments</comments>
		<pubDate>Tue, 21 Oct 2008 00:47:51 +0000</pubDate>
		<dc:creator>Bruno Braga</dc:creator>
		
		<category><![CDATA[IBM]]></category>

		<category><![CDATA[Java]]></category>

		<category><![CDATA[Tecnologia]]></category>

		<category><![CDATA[ClearCase]]></category>

		<category><![CDATA[ClearQuest]]></category>

		<category><![CDATA[Gerência de Configuração]]></category>

		<category><![CDATA[Team Concert]]></category>

		<guid isPermaLink="false">http://www.brunobraga.com.br/?p=47</guid>
		<description><![CDATA[O Rational Team Concert (RTC) foi o primeiro produto do projeto Jazz da IBM, que tem o foco em criar um ambiente mais colaborativo para o desenvolvimento de software - &#8220;People building great software, together&#8221; (slogan do projeto).
A primeira versão do RTC foi liberada dia 30 de junho e as primeiras impressões sobre ele são [...]]]></description>
			<content:encoded><![CDATA[<p>O Rational Team Concert (RTC) foi o primeiro produto do <a href="http://www.jazz.net" target="_blank">projeto Jazz</a> da IBM, que tem o foco em criar um ambiente mais colaborativo para o desenvolvimento de software - &#8220;People building great software, together&#8221; (slogan do projeto).<br />
A primeira versão do RTC foi liberada dia 30 de junho e as primeiras impressões sobre ele são muito boas e podem ser encontradas facilmente em vários blogs.</p>
<p>Para quem nunca usou o RTC, ele possui fácil instalação (ao contrário de muitos softwares IBM), já trás embutido um controlador de versão e um controle de atividades similar ao <a href="http://www.atlassian.com/software/jira" target="_blank">JIRA</a> (que é excelente). E além do foco colaborativo ele tem recursos fortes de Web 2.0.</p>
<p>Então o RTC está sendo uma boa resposta da IBM há algumas limitações do ClearCase (CC) / ClearQuest (CQ), que são softwares com mais de 10 anos. Apesar deu ter mostrado o lado bom do CC e CQ aqui no blog (<a href="http://www.brunobraga.com.br/2008/08/17/controladores-de-versao-clearcase-base-vs-clearcase-ucm" target="_blank">post1</a>, <a href="http://www.brunobraga.com.br/2008/10/16/clearcase-clearquest-ligando-atividades-com-o-codigo-do-seu-projeto" target="_blank">post2</a>), muitas pessoas sabem que configurar e trabalhar com o CQ e principalmente o CC não é algo tão simples =)&#8230; é preciso alguém com um bom conhecimento sobre essas ferramentas.</p>
<p>Com o lançamento do RTC criou-se a dúvida: quem tem ClearCase, deve migrar para o RTC? E quanto a quem pretende usar o RTC e possui outros SCMs (Software Configuration Management) como o SVN e CVS?<br />
A resposta sobre realizar a migração é depende.<br />
Se estiver usando o CVS, certamente será necessaria a <a href="https://jazz.net/learn/LearnItem.jsp?href=content/tech-notes/rational-team-concert-1_0-planning-guide-for-importing-from-subversion-and-cvs/index.html" target="_blank">migração</a>. Em compensação o RTC veio com suporte ao &#8220;legado&#8221; (se é que podemos falar assim) do SVN e ClearCase e eles ainda podem ser utilizados como o controlador de versão principal.<br />
O único problema hoje é que o conector do RTC para o ClearCase / ClearQuest é apenas um &#8220;replicador&#8221; de dados. Ou seja: os arquivos criados no ClearCase são replicados para o controlador de versão do RTC. Então na prática os arquivos estão nos dois lugares.</p>
<p>Isso não é algo muito legal, e eu mesmo abri uma <a href="https://jazz.net/jazz/web/projects/Jazz%20Project#action=com.ibm.team.workitem.viewWorkItem&amp;id=60212" target="_blank">solicitação de melhoria</a> em Agosto para o RTC delegar a responsabilidade de controlador de versão para o ClearCase em vez de replicar os dados, seria uma ponte real entre os dois softwares. A solicitação foi aprovada e acredito que será lançada nas próximas versões (existe uma discussão para ver se entra na versão 1.1 do RTC).</p>
<p>Mas qual a vantagem desse &#8220;bridge&#8221; ou conector entre o RTC e o CC, se o RTC já tem um controlador de versão?<br />
Pelo que pude perceber da equipe dos projetos é que o ClearCase, ClearQuest e outros softwares da Rational vão receber influencias do Jazz e estarão cada vez mais alinhados com esse projeto. Então o controlador de versão do RTC continuará sendo distribuído como uma solução de fácil instalação e com recursos para a maior parte das equipes de desenvolvimento, e a integração com o ClearCase será uma opção mais robusta e com recursos não disponíveis no RTC como <a title="ClearCase Multisite" href="http://www-01.ibm.com/software/awdtools/clearcase/multisite" target="_blank">multisite</a> e outros. Então o plano de migrar do ClearCase para o RTC hoje pode parecer fazer algum sentido por causa das limitações do conector disponível no RTC 1.0 (um replicador) e por aparentemente os softwares serem concorrentes, mas para o futuro talvez não seja a escolha correta dependendo do tamanho da equipe e dos recursos necessários. Manter o investimento no ClearCase e utilizar o conector ou bridge é a melhor no momento. A maior complexidade é justificável.</p>
<p>Em relação ao SVN depende da estratégia de cada equipe. O SVN é free. Não haveria perda de nenhum investimento ao migrar para o controlador de versão do RTC. O que pode ser feito é utilizar os dois juntos por um período de avaliação e depois realizar a migração dos dados para o RTC se for o caso, já que dificilmente o SVN terá mais features do que o controlador de versão do RTC e quanto mais softwares para &#8220;a mesma coisa&#8221;, maior a complexidade.</p>
<p>Nos próximos posts eu vou comentar algo sobre o Rational Quality Manager e Rational Requirements Composer que estão sendo desenvolvidos utilizando o Jazz.</p>
<p>Algumas imagens do RTC:</p>
<p><a href="http://www.brunobraga.com.br/wp-content/uploads/2008/10/rtc1.png"><img class="alignnone size-thumbnail wp-image-48" title="rtc1" src="http://www.brunobraga.com.br/wp-content/uploads/2008/10/rtc1-150x150.png" alt="Rational Team Concert" width="150" height="150" /></a> <a href="http://www.brunobraga.com.br/wp-content/uploads/2008/10/rtc2.png"><img class="alignnone size-thumbnail wp-image-49" title="rtc2" src="http://www.brunobraga.com.br/wp-content/uploads/2008/10/rtc2-150x150.png" alt="Rational Team Concert" width="150" height="150" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.brunobraga.com.br/2008/10/20/rational-team-concert-de-olho-tambem-no-legado/feed/</wfw:commentRss>
		</item>
		<item>
		<title>ClearCase + ClearQuest: ligando atividades com o código do seu projeto</title>
		<link>http://www.brunobraga.com.br/2008/10/16/clearcase-clearquest-ligando-atividades-com-o-codigo-do-seu-projeto/</link>
		<comments>http://www.brunobraga.com.br/2008/10/16/clearcase-clearquest-ligando-atividades-com-o-codigo-do-seu-projeto/#comments</comments>
		<pubDate>Fri, 17 Oct 2008 02:41:36 +0000</pubDate>
		<dc:creator>Bruno Braga</dc:creator>
		
		<category><![CDATA[IBM]]></category>

		<category><![CDATA[Java]]></category>

		<category><![CDATA[ClearCase]]></category>

		<category><![CDATA[ClearQuest]]></category>

		<category><![CDATA[Gerência de Configuração]]></category>

		<guid isPermaLink="false">http://www.brunobraga.com.br/?p=46</guid>
		<description><![CDATA[Antes de mais nada, as pessoas costumam confundir os nomes ClearCase e ClearQuest (ferramentas IBM Rational), afinal são nomes bem parecidos. Mas apesar destas ferramentas trabalharem de forma integrada (opcional), uma tem o papel totalmente diferente da outra.
Meu post anterior foi sobre o ClearCase (CC): Controladores de versão - ClearCase Base vs ClearCase UCM.
E aqui [...]]]></description>
			<content:encoded><![CDATA[<p>Antes de mais nada, as pessoas costumam confundir os nomes ClearCase e ClearQuest (ferramentas IBM Rational), afinal são nomes bem parecidos. Mas apesar destas ferramentas trabalharem de forma integrada (opcional), uma tem o papel totalmente diferente da outra.</p>
<p>Meu post anterior foi sobre o ClearCase (CC): <a href="http://www.brunobraga.com.br/2008/08/17/controladores-de-versao-clearcase-base-vs-clearcase-ucm/" target="_blank">Controladores de versão - ClearCase Base vs ClearCase UCM</a>.</p>
<p>E aqui vamos introduzir o ClearQuest (CQ) e comentar o objetivo de integrar essas duas ferramentas.</p>
<p>Primeiramente para resolvermos o problema dos nomes parecidos, vamos imaginar que a sigla do ClearCase - CC é um C de Código - ela armazena código / arquivos, já que é um controlador de versão. E para o ClearQUEST, podemos dar atenção ao Quest que é &#8220;busca / investigação&#8221; - essa ferramenta entre outras coisas pode gerenciar bugs e um dos processos para resolver bugs é investigar, correto?</p>
<p>O ClearQuest é uma ferramenta que possui muita flexibilidade para automatizar workflows e seu maior uso é no controle de mudanças de software. Nele podemos cadastrar e acompanhar bugs, atividades, e controlar qualquer outro tipo de trabalho a ser realizado pela equipe.</p>
<p>Mas o que isso tem a ver com o ClearCase? Bom, já <a href="http://www.brunobraga.com.br/2008/08/17/controladores-de-versao-clearcase-base-vs-clearcase-ucm" target="_blank">vimos anteriormente</a> que o ClearCase UCM solicita uma atividade em cada check-in. Isso cria uma ligação do código do check-in com a atividade que o desenvolvedor está trabalhando.<br />
A desvantagem nesta afirmação é que o controle de atividades do ClearCase é muito simples, já que esse não é o foco da ferramenta. No ClearCase uma atividade é composta apenas pelo título, não tem descrição, status do andamento, relatórios ou nada poderoso para gerenciamento. Bom, ai é que entra o ClearQuest: ele tem todos esses controles e mais um pouco. E caso sua equipe não esteja satisfeita, ela pode customizar os formulários, acrescentar campos, mudar status, alterar ações, estados e o workflow da solicitação. Isso faz do ClearQuest uma ferramenta excelente ferramenta mesmo sendo utilizada sem a integração com o ClearCase, e é uma das minhas preferidas do portfolio IBM.</p>
<p>Mas voltando ao assunto principal do tópico, associando uma atividade do ClearQuest em cada checkin de arquivos (resultado da integração das ferramentas) é possível ter um controle maior do projeto e do que e foi desenvolvido.<br />
Exemplo:</p>
<ul>
<li>é possível manter a rastreabilidade de atividades do projeto para código, ou até ir mais além: usar a customização para criar um cadastro de caso de uso no CQ, relacionar o caso de uso com uma atividade do CQ e podemos extrair como informação todos os arquivos que foram alterados ou criados ao implementar determinado caso de uso. Esse é um dado importante para analise de impacto;</li>
<li>algumas vezes não queremos buscar a última versão do código do controlador de versão porque ele contém partes de aplicativos que estão pela metade. Precisamos fazer um pacote com o produto, mas no ponto que queremos não existe nenhum label (marco importante). Então com essa integração uma opção é contruir esse pacote baseado nas atividades que queremos que esteja no pacote (ex: Implementação Caso de Uso 1, Implementação Caso de Uso 2, etc..).</li>
<li>o GP tem maior controle de cada atividade do projeto. Sabe quais já foram iniciadas, em que o desenvolvedor está realmente trabalhando (são as atividades &#8220;alteradas&#8221; por último com os arquivos), e pode até fazer um script de métrica que calcule quantas linhas de código foram alteradas em cada atividade, para &#8220;sugerir&#8221; um esforço / custo por atividade.</li>
<li>etc&#8230;</li>
</ul>
<p>Então ligando o nosso produto de trabalho (documentos, diagramas, códigos) as atividades que realizamos no dia a dia, ganhamos um leque a mais de opções e dados que podem ser utilizados para melhorar o gerenciamento e qualidade do projeto.<br />
Partes desses controles também são importantes em certificações com o CMMi.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.brunobraga.com.br/2008/10/16/clearcase-clearquest-ligando-atividades-com-o-codigo-do-seu-projeto/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Controladores de versão - ClearCase Base vs ClearCase UCM</title>
		<link>http://www.brunobraga.com.br/2008/08/17/controladores-de-versao-clearcase-base-vs-clearcase-ucm/</link>
		<comments>http://www.brunobraga.com.br/2008/08/17/controladores-de-versao-clearcase-base-vs-clearcase-ucm/#comments</comments>
		<pubDate>Mon, 18 Aug 2008 00:44:24 +0000</pubDate>
		<dc:creator>Bruno Braga</dc:creator>
		
		<category><![CDATA[IBM]]></category>

		<category><![CDATA[Java]]></category>

		<category><![CDATA[Tecnologia]]></category>

		<category><![CDATA[ClearCase]]></category>

		<category><![CDATA[ClearQuest]]></category>

		<category><![CDATA[Gerência de Configuração]]></category>

		<category><![CDATA[SVN]]></category>

		<guid isPermaLink="false">http://www.brunobraga.com.br/?p=44</guid>
		<description><![CDATA[Independente do processo de desenvolvimento de software adotado (RUP, desenvolvimento ágil, etc..), sua empresa certamente utiliza um software para fazer as gestão dos fontes de projetos. Entre os  controladores de versão mais populares estão o CVS e SVN (gratuitos).  Atualmente eles são os softwares mais utilizados nesta categoria - certamente isso é impulsionados por [...]]]></description>
			<content:encoded><![CDATA[<p>Independente do processo de desenvolvimento de software adotado (RUP, desenvolvimento ágil, etc..), sua empresa certamente utiliza um software para fazer as gestão dos fontes de projetos. Entre os  controladores de versão mais populares estão o CVS e SVN (gratuitos).  Atualmente eles são os softwares mais utilizados nesta categoria - certamente isso é impulsionados por projetos de software livre.<br />
Talvez por este motivo, a maior parte das pessoas pouco sabe sobre outros softwares similares como o Rational ClearCase da IBM. Antes de mais nada, com certeza o objetivo deste post não é fazer propaganda, mas explicar (para quem quer conhecer) um pouco do ClearCase e a diferenças entre seus dois modos de projetos: Base e UCM. Para facilitar o entendimento, em alguns pontos do post, vou tentar fazer um paralelo com ferramentas mais populares - CVS, SVN.</p>
<p>Atualmente no trabalho divido minhas tarefas de Arquitetura de Software Java com suporte a instalação, configuração e utilização de ferramentas IBM Rational. Entre elas o ClearCase. Então vou dedicar uma parte dos meus posts a ferramentas IBM e o que elas podem agregar de valor em projetos.</p>
<p>Olhando do ponto de vista administrativo, o ClearCase possui N features e ferramentas que facilitam o gerenciamento de um projeto. Mas não vamos entrar nestes detalhes neste post. A idéia neste momento é olhar do ponto de vista de um usuário final (um desenvolvedor por exemplo).</p>
<p>Então, mãos a obra: conforme comentei o ClearCase permite criar dois tipos de projetos: Base e UCM.<br />
Um projeto do <strong>ClearCase Base</strong> possui recursos similares ao SVN e CVS. Para esse &#8220;similar&#8221; entenda a presença dos conceitos e recursos básicos: check-in, check-out, branch, labels, etc&#8230;</p>
<p>Já no <strong>ClearCase UCM</strong> as coisas são um pouco diferentes. Além das funcionalidades do ClearCase Base, existem novos recursos e conceitos desconhecidos para muitas pessoas por estarem acostumadas somente ao mundo SVN / CVS, que são dois softwares excelentes e eu mesmo utilizo o SVN em meu projeto de Software Livre.</p>
<p>No <strong>ClearCase UCM</strong> (Unified Change Management) exitem três palavrinhas chave que fazem muita diferença: Stream, Rebase e Delivery. Elas vão nos forçar a trabalhar de uma outra maneira com o código fonte do produto.</p>
<p>Para explicar essas diferenças no momento de utilização da ferramenta vou fazer um paralelo entre dois termos: Branch e Stream.</p>
<p>Um branch a maioria de nós conhecemos. É uma ramificação no controlador de versão do fonte do nosso projeto (main). Essa ramificação é muito utilizada para realizar manutenções evolutivas e correções no software.<br />
Vejamos a figura abaixo:</p>
<p><a href="http://www.brunobraga.com.br/wp-content/uploads/2008/08/branchs.png"><img class="alignnone size-medium wp-image-45" title="branchs" src="http://www.brunobraga.com.br/wp-content/uploads/2008/08/branchs-300x259.png" alt="" width="300" height="259" /></a></p>
<p>Como o branch força o trabalho da equipe em área separadas, ele pode evitar que o código parcial de uma manutenção evolutiva (que está sendo implementada a algumas semanas) vá por engano para homologação/ produção junto com a correção de um bug simples aberto e corrigido nas últimas horas.</p>
<p>Mas o branch não evita um problema comum do desenvolvimento de software empresarial (que geralmente não tem a figura de commiters): a quebra do build ou funcionamento interno (em desenvolvimento) do aplicativo. Se uma pessoa fizer algo errado e realizar o check-in, essa pessoa pode impactar o trabalho de outras pessoas, mesmo em projetos com testes unitários. Um software de integração continua não evita esse problema porque geralmente ele realiza o build do que já está no controlador de versão, e mesmo assim ele não consegue validar todos os tipos de problemas (como em XMLs). Então sempre há um jeito de atrapalhar o trabalho de outro desenvolvedor com um check-in equivocado =P</p>
<p>Para evitar isso o ClearCase UCM existe a opção de utilizar o que é chamado de desenvolvimento em paralelo que é um pouco diferente do conceito do CVS / SVN ou mesmo ClearCase Base.<br />
No ClearCase UCM o cenário de qualquer projeto em equipe teria essas características:</p>
<ul>
<li>cada desenvolvedor que conectar ao projeto, terá automaticamente um &#8220;branch&#8221; exclusivo para trabalhar - no UCM esse &#8220;branch&#8221; é chamado de stream;</li>
<li>o check-in de um desenvolvedor não causa impacto em outro desenvolvedor porque cada desenvolvedor trabalha na sua stream;</li>
<li>todo check-in é relacionado uma atividade então é possível relacionar o código com atividades do projeto;</li>
<li>entre outros&#8230;</li>
</ul>
<p>Estes são apenas algumas características do ClearCase UCM, mas a partir delas já podemos entender como é diferente a maneira de utilizar. Vantagens? Vejamos:<br />
Com streams separadas para os desenvolvedores um desenvolvedor não impacta no trabalho de outro. Após um desenvolvedor realizar vários check-ins de &#8220;código parcial&#8221; para a mesma atividade. Ao acabar de implentar uma determinada funcionalidade, ele fará um Delivery (entrega) da atividade. Nesse momento todos vão poder ver a implementação deste desenvolvedor através do que é chamado de Stream de Integração.<br />
Mas calma, ainda não é possível baixar para a sua Stream a implementação de outro desenvolvedor. Isso acontece porque ainda sim, mesmo dizendo que terminou a atividade o desenvolvedor pode ter feito algo errado, e isso poderia quebrar o seu build. Então o fluxo da ferramenta agora é a validação da Stream de Integração (seja com ferramentas de integração continua ou testes funcionais) e depois a promoção de atividades liberadas pelo desenvolvedor na stream de integração para uma baseline. A partir desse momento qualquer pessoa pode baixar a última versão do código para sua stream (operação chamada de Rebase), afinal o que está na baseline é o fonte correto.</p>
<p>Alguns desses conceitos como baseline são conceitos de Configuration Management (CM) ou Gerência de Configuração, e é dai que vem o nome UCM do ClearCase - Unified Configuration Management. É uma ferramenta construída e baseada nas melhores práticas de CM. Não é atoa que muitas vezes é citada por consultores de CMMi ou MPS.br.</p>
<p>Para completar, segue alguns conceitos de termos novos (considerando o SVN / CVS) que vimos neste post:</p>
<ul>
<li>Stream: em poucas palavras pode ser entendido como um branch integrado a atividades, e geralmente as stream são separadas por desenvolvedores e existe uma de integração - o que não acontece em branchs do SVN, CVS ou ClearCase Base;</li>
<li>Delivery: é a entrega do código de uma atividade para a stream de integração;</li>
<li>Rebase: representa a atualização da sua stream de desenvolvimento a partir de uma baseline;</li>
</ul>
<p>Até a próxima!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.brunobraga.com.br/2008/08/17/controladores-de-versao-clearcase-base-vs-clearcase-ucm/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Enfim um buscador para web com análise de contexto</title>
		<link>http://www.brunobraga.com.br/2008/07/28/emfim-um-buscador-para-web-com-analise-de-contexto/</link>
		<comments>http://www.brunobraga.com.br/2008/07/28/emfim-um-buscador-para-web-com-analise-de-contexto/#comments</comments>
		<pubDate>Mon, 28 Jul 2008 16:48:25 +0000</pubDate>
		<dc:creator>Bruno Braga</dc:creator>
		
		<category><![CDATA[Tecnologia]]></category>

		<category><![CDATA[buscas]]></category>

		<category><![CDATA[cuil]]></category>

		<category><![CDATA[google]]></category>

		<guid isPermaLink="false">http://www.brunobraga.com.br/?p=43</guid>
		<description><![CDATA[Foi lançado hoje um buscador chamado cuil - http://www.cuil.com.
A qualidade da busca, velocidade e ranking das páginas ainda está pior do que o Google, além de estar indexando praticamente só termos em inglês por enquanto. Mas algo que eu queria que existisse a muito tempo no google está presente no cuil: a opção de refinar [...]]]></description>
			<content:encoded><![CDATA[<p>Foi lançado hoje um buscador chamado cuil - <a href="http://www.cuil.com">http://www.cuil.com</a>.</p>
<p>A qualidade da busca, velocidade e ranking das páginas ainda está pior do que o Google, além de estar indexando praticamente só termos em inglês por enquanto. Mas algo que eu queria que existisse a muito tempo no google está presente no cuil: a opção de refinar a busca por contexto.</p>
<p><span class="postbody">A cada dia que passa existem mais e mais páginas na web e está cada vez mais difícil encontrar o que você quer no google por causa de alguns termos ambíguos. Exemplo: se você procurar &#8220;mouse&#8221; no google vem tudo quanto é tipo de coisa, animal, mouse de computador, mouse de desenho (mickey mouse), etc&#8230; Se você quer mouse de computador você teve no resultado da sua busca um monte de links &#8220;inúteis&#8221; que só te atrapalham a achar o que você precisa. E quanto maior a web e mais páginas indexadas mais difícil é encontrar o que queremos. Temos que ficar fazendo refinamentos da busca usando mais palavras, sendo que o correto era ter uma busca de contexto. Você busca &#8220;mouse&#8221;, ele trás os resultados e mostra também os contextos onde essa palavra se aplica para você &#8220;filtrar&#8221;.</span></p>
<p>Essa é a grande novidade do cuil na minha opinião. Se procurarmos por &#8220;mouse&#8221;, podemos usar as abas de contexto para refinar a pesquisa de acordo com o assunto.</p>
<p>Espero que essa feature seja implementada no google que com certeza ainda é o melhor.<br />
Mas o empurrãozinho foi bem vindo =)</p>
]]></content:encoded>
			<wfw:commentRss>http://www.brunobraga.com.br/2008/07/28/emfim-um-buscador-para-web-com-analise-de-contexto/feed/</wfw:commentRss>
		</item>
		<item>
		<title>JMS com Spring</title>
		<link>http://www.brunobraga.com.br/2008/07/22/jms-com-spring/</link>
		<comments>http://www.brunobraga.com.br/2008/07/22/jms-com-spring/#comments</comments>
		<pubDate>Tue, 22 Jul 2008 23:26:47 +0000</pubDate>
		<dc:creator>Bruno Braga</dc:creator>
		
		<category><![CDATA[IBM]]></category>

		<category><![CDATA[Java]]></category>

		<category><![CDATA[JMS]]></category>

		<category><![CDATA[Spring]]></category>

		<category><![CDATA[Websphere MQ]]></category>

		<guid isPermaLink="false">http://www.brunobraga.com.br/?p=42</guid>
		<description><![CDATA[Eu estava viajando, então estive ausente do PC por alguns dias 
De volta agora é hora de colocar o assunto em dia.
Em dois posts anteriores eu falei algo sobre JMS. Um que tratava da integração do Oracle com Java e outro da comunicação do Websphere MQ via JMS. Então para completar o assunto vou mostrar [...]]]></description>
			<content:encoded><![CDATA[<p>Eu estava viajando, então estive ausente do PC por alguns dias <img src='http://www.brunobraga.com.br/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' /><br />
De volta agora é hora de colocar o assunto em dia.</p>
<p>Em dois posts anteriores eu falei algo sobre JMS. Um que tratava da integração do Oracle com Java e outro da comunicação do Websphere MQ via JMS. Então para completar o assunto vou mostrar na prática como enviar e receber mensagens usando JMS e Spring.<br />
Provavelmente esse post vai ser melhor aproveitado por quem já conhece ou utiliza o Spring, mas como é um framework popular é fácil encontrar referencias sobre suas configurações na web.</p>
<p><strong>Connection Factory:</strong></p>
<p>Nosso objetivo é enviar mensagens via JMS para o Websphere MQ (MQSeries), dando seqüencia ao post <a href="http://www.brunobraga.com.br/2008/07/04/websphere-mq-e-jms" target="_blank">Websphere MQ e JMS</a>. Para isso vamos usar o Connection Factory da IBM com.ibm.mq.jms.MQQueueConnectionFactory para gerenciar a conexão. Segue abaixo o trecho de configuração disso no Spring (arquivo applicationContext.xml):</p>

<div class="wp_codebox_msgheader"><span class="codebox_right"><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank">[?]</a><a href="javascript:;" onclick="toggle_collapse('p428');">[<span id="p428_symbol">-</span>]</a></span><span class="codebox_left"><a href="javascript:;" onclick="javascript:showCodeTxt('p42code8'); return false;">View Code</a> XML</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table width="100%" ><tr id="p428"><td class="code" id="p42code8"><pre class="xml"><span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;bean</span> <span style="color: #000066;">id</span>=<span style="color: #ff0000;">&quot;jmsQueueConnectionFactory&quot;</span> <span style="color: #000066;">class</span>=<span style="color: #ff0000;">&quot;com.ibm.mq.jms.MQQueueConnectionFactory&quot;</span><span style="font-weight: bold; color: black;">&gt;</span></span>
	<span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;property</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;hostName&quot;</span><span style="font-weight: bold; color: black;">&gt;</span></span>
		<span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;value<span style="font-weight: bold; color: black;">&gt;</span></span></span>${mq.hostName}<span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;/value<span style="font-weight: bold; color: black;">&gt;</span></span></span> 
	<span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;/property<span style="font-weight: bold; color: black;">&gt;</span></span></span>
	<span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;property</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;queueManager&quot;</span><span style="font-weight: bold; color: black;">&gt;</span></span>
		<span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;value<span style="font-weight: bold; color: black;">&gt;</span></span></span>${mq.queueManager}<span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;/value<span style="font-weight: bold; color: black;">&gt;</span></span></span>
	<span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;/property<span style="font-weight: bold; color: black;">&gt;</span></span></span>
	<span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;property</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;channel&quot;</span><span style="font-weight: bold; color: black;">&gt;</span></span>
		<span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;value<span style="font-weight: bold; color: black;">&gt;</span></span></span>${mq.channel}<span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;/value<span style="font-weight: bold; color: black;">&gt;</span></span></span>
	<span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;/property<span style="font-weight: bold; color: black;">&gt;</span></span></span>
	<span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;property</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;port&quot;</span><span style="font-weight: bold; color: black;">&gt;</span></span>
		<span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;value<span style="font-weight: bold; color: black;">&gt;</span></span></span>${mq.port}<span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;/value<span style="font-weight: bold; color: black;">&gt;</span></span></span>
	<span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;/property<span style="font-weight: bold; color: black;">&gt;</span></span></span>
	<span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;property</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;transportType&quot;</span><span style="font-weight: bold; color: black;">&gt;</span></span>
		<span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;value<span style="font-weight: bold; color: black;">&gt;</span></span></span>1<span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;/value<span style="font-weight: bold; color: black;">&gt;</span></span></span>
	<span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;/property<span style="font-weight: bold; color: black;">&gt;</span></span></span>
<span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;/bean<span style="font-weight: bold; color: black;">&gt;</span></span></span></pre></td></tr></table></div>

<p>Esse transportType é referente ao tipo de comunicação utilizado. O valor 1 é referente a constante  com.ibm.mq.jms.JMSC.MQJMS_TP_CLIENT_MQ_TCPIP que diz que a comunicação é via TCP IP.</p>
<p><strong>Configuração:</strong></p>
<p>As demais configurações do Spring para JMS são simples, e similares a isso:</p>

<div class="wp_codebox_msgheader"><span class="codebox_right"><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank">[?]</a><a href="javascript:;" onclick="toggle_collapse('p429');">[<span id="p429_symbol">-</span>]</a></span><span class="codebox_left"><a href="javascript:;" onclick="javascript:showCodeTxt('p42code9'); return false;">View Code</a> XML</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table width="100%" ><tr id="p429"><td class="code" id="p42code9"><pre class="xml"><span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;bean</span> <span style="color: #000066;">id</span>=<span style="color: #ff0000;">&quot;jmsSpringConnectionFactory&quot;</span> <span style="color: #000066;">class</span>=<span style="color: #ff0000;">&quot;org.springframework.jms.connection.SingleConnectionFactory102&quot;</span><span style="font-weight: bold; color: black;">&gt;</span></span>
	<span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;property</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;targetConnectionFactory&quot;</span><span style="font-weight: bold; color: black;">&gt;</span></span>
		<span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;ref</span> <span style="color: #000066;">local</span>=<span style="color: #ff0000;">&quot;jmsQueueConnectionFactory&quot;</span> <span style="font-weight: bold; color: black;">/&gt;</span></span>
	<span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;/property<span style="font-weight: bold; color: black;">&gt;</span></span></span>
<span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;/bean<span style="font-weight: bold; color: black;">&gt;</span></span></span>
&nbsp;
<span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;bean</span> <span style="color: #000066;">id</span>=<span style="color: #ff0000;">&quot;jmsQueueTemplate&quot;</span> <span style="color: #000066;">class</span>=<span style="color: #ff0000;">&quot;org.springframework.jms.core.JmsTemplate102&quot;</span><span style="font-weight: bold; color: black;">&gt;</span></span>
	<span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;property</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;connectionFactory&quot;</span> <span style="color: #000066;">ref</span>=<span style="color: #ff0000;">&quot;jmsSpringConnectionFactory&quot;</span><span style="font-weight: bold; color: black;">/&gt;</span></span>
	<span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;property</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;pubSubDomain&quot;</span> <span style="color: #000066;">value</span>=<span style="color: #ff0000;">&quot;false&quot;</span><span style="font-weight: bold; color: black;">/&gt;</span></span> <span style="color: #009900;"><span style="color: #808080; font-style: italic;">&lt;!-- false seta para queue (point to point) --&gt;</span></span>
	<span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;property</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;receiveTimeout&quot;</span> <span style="color: #000066;">value</span>=<span style="color: #ff0000;">&quot;500&quot;</span><span style="font-weight: bold; color: black;">/&gt;</span></span>
<span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;/bean<span style="font-weight: bold; color: black;">&gt;</span></span></span></pre></td></tr></table></div>

<p><strong>Utilização:</strong></p>
<p>Para usar é muito simples, basta instanciar o Spring e depois enviar e receber mensagem com praticamente uma linha de código.</p>
<p>Instanciando o Spring:</p>

<div class="wp_codebox_msgheader"><span class="codebox_right"><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank">[?]</a><a href="javascript:;" onclick="toggle_collapse('p4210');">[<span id="p4210_symbol">-</span>]</a></span><span class="codebox_left"><a href="javascript:;" onclick="javascript:showCodeTxt('p42code10'); return false;">View Code</a> JAVA</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table width="100%" ><tr id="p4210"><td class="code" id="p42code10"><pre class="java">BeanFactoryLocator bfs = SingletonBeanFactoryLocator.<span style="color: #006600;">getInstance</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;applicationContext.xml&quot;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">;</span>
BeanFactoryReference bf = bfs.<span style="color: #006600;">useBeanFactory</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;mqSpring&quot;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">;</span></pre></td></tr></table></div>

<p>O Spring irá instanciar as classes configuradas nos beans, e a partir dai é só usar.</p>
<p>Enviando mensagem:</p>

<div class="wp_codebox_msgheader"><span class="codebox_right"><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank">[?]</a><a href="javascript:;" onclick="toggle_collapse('p4211');">[<span id="p4211_symbol">-</span>]</a></span><span class="codebox_left"><a href="javascript:;" onclick="javascript:showCodeTxt('p42code11'); return false;">View Code</a> JAVA</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table width="100%" ><tr id="p4211"><td class="code" id="p42code11"><pre class="java">JmsTemplate jmsTemplate = <span style="color: #66cc66;">&#40;</span>JmsTemplate<span style="color: #66cc66;">&#41;</span> bf.<span style="color: #006600;">getFactory</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>.<span style="color: #006600;">getBean</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;jmsQueueTemplate&quot;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">;</span>
jmsTemplate.<span style="color: #006600;">convertAndSend</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;fila&quot;</span>, <span style="color: #ff0000;">&quot;mensagem&quot;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">;</span></pre></td></tr></table></div>

<p>Recebendo mensagem:</p>

<div class="wp_codebox_msgheader"><span class="codebox_right"><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank">[?]</a><a href="javascript:;" onclick="toggle_collapse('p4212');">[<span id="p4212_symbol">-</span>]</a></span><span class="codebox_left"><a href="javascript:;" onclick="javascript:showCodeTxt('p42code12'); return false;">View Code</a> JAVA</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table width="100%" ><tr id="p4212"><td class="code" id="p42code12"><pre class="java">JmsTemplate jmsTemplate = <span style="color: #66cc66;">&#40;</span>JmsTemplate<span style="color: #66cc66;">&#41;</span> bf.<span style="color: #006600;">getFactory</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>.<span style="color: #006600;">getBean</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;jmsQueueTemplate&quot;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">;</span>
TextMessage textMessage = <span style="color: #66cc66;">&#40;</span>TextMessage<span style="color: #66cc66;">&#41;</span> jmsTemplate.<span style="color: #006600;">receive</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;fila&quot;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">;</span></pre></td></tr></table></div>

<p><strong>Listener:</strong></p>
<p>Uma outra opção para receber mensagens do MQ é criar um listener que fica escutando uma determinada fila e irá receber automaticamente novas mensagens.</p>

<div class="wp_codebox_msgheader"><span class="codebox_right"><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank">[?]</a><a href="javascript:;" onclick="toggle_collapse('p4213');">[<span id="p4213_symbol">-</span>]</a></span><span class="codebox_left"><a href="javascript:;" onclick="javascript:showCodeTxt('p42code13'); return false;">View Code</a> XML</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table width="100%" ><tr id="p4213"><td class="code" id="p42code13"><pre class="xml"><span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;bean</span> <span style="color: #000066;">id</span>=<span style="color: #ff0000;">&quot;messageListener&quot;</span> <span style="color: #000066;">class</span>=<span style="color: #ff0000;">&quot;br.com.globalvalue.exemplomq.ExemploListener&quot;</span> <span style="font-weight: bold; color: black;">/&gt;</span></span>
&nbsp;
<span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;bean</span> <span style="color: #000066;">id</span>=<span style="color: #ff0000;">&quot;jmsListenerContainer&quot;</span> <span style="color: #000066;">class</span>=<span style="color: #ff0000;">&quot;org.springframework.jms.listener.DefaultMessageListenerContainer&quot;</span><span style="font-weight: bold; color: black;">&gt;</span></span>
	<span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;property</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;connectionFactory&quot;</span> <span style="color: #000066;">ref</span>=<span style="color: #ff0000;">&quot;jmsSpringConnectionFactory&quot;</span><span style="font-weight: bold; color: black;">/&gt;</span></span>
	<span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;property</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;messageListener&quot;</span> <span style="color: #000066;">ref</span>=<span style="color: #ff0000;">&quot;messageListener&quot;</span> <span style="font-weight: bold; color: black;">/&gt;</span></span>
	<span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;property</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;destinationName&quot;</span><span style="font-weight: bold; color: black;">&gt;</span></span><span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;value<span style="font-weight: bold; color: black;">&gt;</span></span></span>${mq.queue.inbox}<span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;/value<span style="font-weight: bold; color: black;">&gt;</span></span></span><span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;/property<span style="font-weight: bold; color: black;">&gt;</span></span></span>
<span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;/bean<span style="font-weight: bold; color: black;">&gt;</span></span></span></pre></td></tr></table></div>


<div class="wp_codebox_msgheader"><span class="codebox_right"><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank">[?]</a><a href="javascript:;" onclick="toggle_collapse('p4214');">[<span id="p4214_symbol">-</span>]</a></span><span class="codebox_left"><a href="javascript:;" onclick="javascript:showCodeTxt('p42code14'); return false;">View Code</a> JAVA</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table width="100%" ><tr id="p4214"><td class="code" id="p42code14"><pre class="java"><span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> ExemploListener <span style="color: #000000; font-weight: bold;">implements</span> MessageListener <span style="color: #66cc66;">&#123;</span>
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #993333;">void</span> onMessage<span style="color: #66cc66;">&#40;</span>Message message<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
		<span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span>message <span style="color: #000000; font-weight: bold;">instanceof</span> TextMessage<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
			<span style="color: #000000; font-weight: bold;">try</span> <span style="color: #66cc66;">&#123;</span>
				<span style="color: #aaaadd; font-weight: bold;">System</span>.<span style="color: #006600;">out</span>.<span style="color: #006600;">println</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span>TextMessage<span style="color: #66cc66;">&#41;</span> message<span style="color: #66cc66;">&#41;</span>.<span style="color: #006600;">getText</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">;</span>
			<span style="color: #66cc66;">&#125;</span>
			<span style="color: #000000; font-weight: bold;">catch</span> <span style="color: #66cc66;">&#40;</span>JMSException ex<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
				<span style="color: #000000; font-weight: bold;">throw</span> <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #aaaadd; font-weight: bold;">RuntimeException</span><span style="color: #66cc66;">&#40;</span>ex<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">;</span>
			<span style="color: #66cc66;">&#125;</span>
		<span style="color: #66cc66;">&#125;</span>
		<span style="color: #b1b100;">else</span> <span style="color: #66cc66;">&#123;</span>
			<span style="color: #000000; font-weight: bold;">throw</span> <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #aaaadd; font-weight: bold;">IllegalArgumentException</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;Message must be of type TextMessage&quot;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">;</span>
		<span style="color: #66cc66;">&#125;</span>
	<span style="color: #66cc66;">&#125;</span>
<span style="color: #66cc66;">&#125;</span></pre></td></tr></table></div>

<p>Para executar o código é necessário os jar`s do Spring (e dependencias) e os jar`s da IBM para o Websphere MQ. Espero que o nível de detalhes tenha sido suficientes. Vimos que se o projeto utiliza Spring é fácil enviar e receber mensagens utilizando JMS, mesmo com classes (Factory) de terceiros como no caso do nosso exemplo para Websphere MQ.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.brunobraga.com.br/2008/07/22/jms-com-spring/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Websphere MQ e JMS</title>
		<link>http://www.brunobraga.com.br/2008/07/04/websphere-mq-e-jms/</link>
		<comments>http://www.brunobraga.com.br/2008/07/04/websphere-mq-e-jms/#comments</comments>
		<pubDate>Fri, 04 Jul 2008 03:06:28 +0000</pubDate>
		<dc:creator>Bruno Braga</dc:creator>
		
		<category><![CDATA[IBM]]></category>

		<category><![CDATA[Java]]></category>

		<category><![CDATA[JMS]]></category>

		<category><![CDATA[Websphere MQ]]></category>

		<guid isPermaLink="false">http://www.brunobraga.com.br/?p=39</guid>
		<description><![CDATA[Existem várias formas de realizar comunicação entre aplicações. Entre elas estão: troca de arquivos,  compartilhamento de banco de dados, chamada de métodos remotos (RMI, SOAP) e mensageria.
O MQ (Message Queue) é um padrão para mensageria adotado por várias empresas, entre elas a IBM que possui o produto Websphere MQ (antigamente chamado de MQSeries).
Um dos pontos [...]]]></description>
			<content:encoded><![CDATA[<p>Existem várias formas de realizar comunicação entre aplicações. Entre elas estão: troca de arquivos,  compartilhamento de banco de dados, chamada de métodos remotos (RMI, SOAP) e mensageria.</p>
<p>O MQ (Message Queue) é um padrão para mensageria adotado por várias empresas, entre elas a IBM que possui o produto Websphere MQ (antigamente chamado de MQSeries).</p>
<p>Um dos pontos fortes do MQ se comparado com outras tecnologias é a troca de mensagens assíncronas e garantia de entrega. Ou seja: conseguimos enviar uma mensagem para a fila de um aplicativo sem que este aplicativo esteja no ar e sem ficar parado esperando uma resposta (comunicação assíncrona). Temos ainda a certeza de que se a mensagem saiu da fila é porque ela foi lida (entregue).<br />
Uma comunicação como esta é muito mais segura do que um envio de e-mail, troca de arquivos ou transferências de dados similares.</p>
<p>Um detalhe importante é que apesar da comunicação ser assíncrona, é possível utilizá-la de forma online - onde enviamos e recebemos a resposta em &#8220;tempo real&#8221;. Vou explicar neste post como isso funciona. Alias, já vi implementações que tentam dar essa aparência de comunicação online realizando pooling (loop) nas filas do MQ para verificar se existem novas mensagens. Mas isso não é o procedimento correto. O MQ permite que a aplicação assine uma fila e receba novas mensagens automaticamente sem perder tempo no pooling ou degradar o ambiente.</p>
<p>No caso do Websphere MQ podemos realizar a comunicação de duas maneiras: a primeira é utilizando o Websphere MQ Client que possui uma API para programação em C, Cobol, CPlus, .Net, Java e VB 6. E outra forma bastante útil para o pessoal de Java é utilizando JMS (Java Message Service). O produto Websphere MQ suporta JMS, e neste caso não é necessário instalar ou utilizar o Websphere MQ Client.</p>
<p>Como este é um blog sobre Java vamos citar alguns detalhes da comunicação usando JMS.</p>
<p>Olhando a arquitetura do JMS existem maneiras diferentes de realizar a interação com uma fila (queue).<br />
A primeira é uma comunicação ponto a ponto onde a aplicação 1 envia mensagem para uma fila e somente a aplicação 2 irá ler. Vejamos a imagem abaixo:</p>
<p><a href="http://www.brunobraga.com.br/wp-content/uploads/2008/07/jms1.gif"><img class="alignnone size-medium wp-image-40" title="jms1" src="http://www.brunobraga.com.br/wp-content/uploads/2008/07/jms1-300x93.gif" alt="" width="300" height="93" /></a></p>
<p>Neste modo ponto a ponto, quando a aplicação 2 ler a mensagem via JMS o próprio protocolo irá enviar um acknowledge para a fila (comportamento padrão) e a mensagem será apagada pelo MQ (leitura ocorreu com sucesso).</p>
<p>Se pararmos para pensar esse modo não funcionará caso seja necessário enviar a mesma mensagem para mais de uma aplicação. Outro problema de partir do cliente a requisição de mensagens é que ele teoricamente tem que fazer pooling, verificando de tempos em tempos se existem novas mensagens na fila.</p>
<p>Se for necessário contornar essas limitações existe uma outra forma de comunicação, que é a Publish and Subscribe. Onde vários aplicativos podem assinar uma vila e receber as mensagens quando chegarem. A mensagem só será apagada da fila quando todos receberem.</p>
<p><a href="http://www.brunobraga.com.br/wp-content/uploads/2008/07/jms2.gif"><img class="alignnone size-medium wp-image-41" title="jms2" src="http://www.brunobraga.com.br/wp-content/uploads/2008/07/jms2-300x162.gif" alt="" width="300" height="162" /></a></p>
<p>Um detalhe interessante é que as mensagens não precisam ser necessariamente do tipo texto. O JMS suporta os seguintes tipos de dados: text, map, bytes, stream, e object. O stream é uma boa opção para mensagens muito grandes (enquanto uma ponta está enviando a mensagem a outra já pode ir recebendo), enquanto o tipo object está mais próximo de linguagens orientadas a objeto.</p>
<p>Bom, basicamente é assim que funciona. Nós próximos posts vou tentar mostrar alguns passos de como escrever uma aplicação que envie e receba mensagens via JMS.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.brunobraga.com.br/2008/07/04/websphere-mq-e-jms/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Oracle vs Java</title>
		<link>http://www.brunobraga.com.br/2008/07/01/oracle-vs-java/</link>
		<comments>http://www.brunobraga.com.br/2008/07/01/oracle-vs-java/#comments</comments>
		<pubDate>Tue, 01 Jul 2008 03:07:18 +0000</pubDate>
		<dc:creator>Bruno Braga</dc:creator>
		
		<category><![CDATA[Java]]></category>

		<category><![CDATA[JMS]]></category>

		<category><![CDATA[Oracle]]></category>

		<category><![CDATA[Websphere MQ]]></category>

		<guid isPermaLink="false">http://www.brunobraga.com.br/?p=38</guid>
		<description><![CDATA[Atualmente estou atuando em um projeto onde é necessário a integração do Oracle com Java. Ou seja: é necessário executar código Java dentro do Oracle para uma determinada funcionalidade.
Esse projeto faz parte de um treinamento/consultoria sobre Websphere MQ (antigamente chamado de MQSeries) para um cliente, e vai ser o primeiro tema / &#8220;puxão de orelha&#8221; [...]]]></description>
			<content:encoded><![CDATA[<p>Atualmente estou atuando em um projeto onde é necessário a integração do Oracle com Java. Ou seja: é necessário executar código Java dentro do Oracle para uma determinada funcionalidade.</p>
<p>Esse projeto faz parte de um treinamento/consultoria sobre Websphere MQ (antigamente chamado de MQSeries) para um cliente, e vai ser o primeiro tema / &#8220;puxão de orelha&#8221; depois da reformulação do blog.</p>
<p>Puxão de orelha porque alguns itens referentes a integração do Oracle com Java não são legais. Mas para entender o problema e o funcionamento da integração vamos a um rápido cenário do aplicativo:</p>
<p>Além do treinamento de Websphere MQ o cliente solicitou que fosse desenvolvido um conector MQ em Java para posteriormente ser utilizado pelo sistema deles. Então optamos por desenvolver o conector MQ usando JMS e abstrair toda a complexidade da comunicação. Ele iria enviar mensagens com um comando e receber mensagens com um comando a partir do aplicativo Java. Até esse ponto estava excelente.</p>
<p>A dificuldade começou quando o cliente solicitou que o Conector MQ fosse executado dentro do Oracle através de uma trigger já que o Oracle suportava Java. Realmente o Oracle suporta Java, mas não tão bem como era esperado.<br />
Somente para deixar claro: classes Java simples (recursos nativos da JVM) rodam muito bem no Oracle, isso foi um ponto bem positivo. O problema é executar uma aplicação ou conector que tem vários jars como API.</p>
<p>Objetivamente seguem detalhes sobre pontos problemáticos do Oracle versão 10.2:</p>
<ul>
<li>ele não aceita jar&#8217;s externos. Todos os jar&#8217;s devem ser carregados para o banco usando o comando loadjava.</li>
<li>o comando loadjava carrega as classes do jar mas deixa todas com status INVALID !?!?&#8230; a maneria de resolver isso é usar o comando loadjava com o parâmetro &#8220;-resolve&#8221;.</li>
<li>o problema do parâmetro &#8220;-resolve&#8221; é que ele tenta &#8220;re-compilar&#8221; todas as classes do jar (sendo que um jar já é algo pronto para utilizar). Para cada classe o Oracle solicita as dependências (classes que estão no import). Então para incluir um jar de um driver do MQ preciso de N outros jars para satisfazer as dependências de compilação;</li>
<li>uma forma de resolver o problema acima podemos até utilizar o parâmetro &#8220;-genmissing&#8221; do comando loadjava, ele vai gerar uma classe fake para cada dependência e evita problemas de compilação, mas é obvio que se a classe fake for usada em qualquer ponto do processo (direta ou indiretamente) vai dar erro (ORA-29532: Java call  terminated by uncaught Java exception: java.lang.NoClassDefFoundError:<br />
!!!ERROR!!! generated by genmissing) - então o genmissing não é muito útil, somos obrigados a ter as dependências para compilar / resolver quase tudo usando o &#8220;-resolve&#8221;;</li>
<li>o Oracle carrega para dentro do banco a classe que queremos importar + todos os jars necessários para execução + todas as dependências. Então temos um excesso de classes desnecessariamente;</li>
</ul>
<p>Por causa dessas limitações a integração do Oracle com Java não é tão transparente. Não acredito que isso tenha um tratamento melhor no Oracle 11. Apesar do banco Oracle não ser um Application Server, poderia pelo menos seguir a arquitetura Java e ler as libs de um CLASSPATH. A parte de ter que carregar os jar para dentro do Oracle e re-compilar matou parte do suporte a Java do banco. Esse trabalho todo não vale a pena <img src='http://www.brunobraga.com.br/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Então esse foi o puxão de orelha, e todos esses problemas foram suportados pelo suporte oficial Oracle (<a href="http://metalink.oracle.com" target="_blank">http://metalink.oracle.com</a>).</p>
<p>Mas em tempo, o SQLJ é bastante poderoso: podemos escrever uma classe Java (usando recursos nativos) e em determinados pontos utilizar #sql() (querys) com váriaveis Java. Então considerando somente esta necessidade a utilização é válida.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.brunobraga.com.br/2008/07/01/oracle-vs-java/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Blog reformulado</title>
		<link>http://www.brunobraga.com.br/2008/06/30/blog-reformulado/</link>
		<comments>http://www.brunobraga.com.br/2008/06/30/blog-reformulado/#comments</comments>
		<pubDate>Mon, 30 Jun 2008 05:37:44 +0000</pubDate>
		<dc:creator>Bruno Braga</dc:creator>
		
		<category><![CDATA[Pessoal]]></category>

		<guid isPermaLink="false">http://www.brunobraga.com.br/?p=37</guid>
		<description><![CDATA[Não sei exatamente quem costuma ler este site / blog, mas a partir de hoje quero tentar dar novos rumos para ele. Uma sacudida mesmo =)
Até o momento eu estava um pouco ausente e postando somente uma ou outra notícia (lançamentos do spider, palestras, etc&#8230;). Nunca postei muitas coisas técnicas&#8230;, um pouco por falta de [...]]]></description>
			<content:encoded><![CDATA[<p>Não sei exatamente quem costuma ler este site / blog, mas a partir de hoje quero tentar dar novos rumos para ele. Uma sacudida mesmo =)</p>
<p>Até o momento eu estava um pouco ausente e postando somente uma ou outra notícia (lançamentos do spider, palestras, etc&#8230;). Nunca postei muitas coisas técnicas&#8230;, um pouco por falta de tempo e também porque não era o foco. Mas resolvi mudar isso. Vou começar a postar assuntos técnicos e desafios do dia a dia sobre Java, Ferramentas IBM, Processos, Produtividade, entre outros&#8230;, assim este blog vai seguir o mesmo caminho de <a href="http://blog.fragmental.com.br" target="_blank">Phillip Calçado</a>, <a href="http://gc.blog.br" target="_blank">Guilherme Chapiewski</a>, <a href="http://architecture-journal.blogspot.com" target="_blank">Ricardo Ferreira</a>, e tantos outros&#8230;</p>
<p>Para começar essa nova fase, nada melhor do que uma cara nova, então atualizei a versão do wordpress (software do blog), o layout e muitas outras coisas.</p>
<p>E vamo que vamo&#8230; até o próximo post.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.brunobraga.com.br/2008/06/30/blog-reformulado/feed/</wfw:commentRss>
		</item>
		<item>
		<title>J2EE Spider 1.0.0-M3</title>
		<link>http://www.brunobraga.com.br/2008/05/26/j2ee-spider-100-m3/</link>
		<comments>http://www.brunobraga.com.br/2008/05/26/j2ee-spider-100-m3/#comments</comments>
		<pubDate>Mon, 26 May 2008 18:08:15 +0000</pubDate>
		<dc:creator>Bruno Braga</dc:creator>
		
		<category><![CDATA[Java]]></category>

		<category><![CDATA[J2EE Spider]]></category>

		<category><![CDATA[Open Source]]></category>

		<category><![CDATA[Produtividade]]></category>

		<guid isPermaLink="false">http://www.brunobraga.com.br/2008/05/26/j2ee-spider-100-m3/</guid>
		<description><![CDATA[Bom o projeto está indo bem, a cada dia novas melhorias. Está dando muiiito trabalho, mas está ficando bacana.
O curioso é que o país onde as pessoas mais interagem e sugerem as coisas é a Índia =) O pessoal lá parece ser muito ligado na área de desenvolvimento mesmo.
Fora um ou outro bug a versão [...]]]></description>
			<content:encoded><![CDATA[<p>Bom o projeto está indo bem, a cada dia novas melhorias. Está dando muiiito trabalho, mas está ficando bacana.</p>
<p>O curioso é que o país onde as pessoas mais interagem e sugerem as coisas é a Índia =) O pessoal lá parece ser muito ligado na área de desenvolvimento mesmo.</p>
<p>Fora um ou outro bug a versão 1.0.0-M3 trás 15 melhorias enquanto a 1.0.0-M2 tinha 7. E cada melhoria dessas são significativas, então essa é uma boa release.  Espero ter tempo para dedicar a JSF logo e adicionar essa opção no template da ferramenta até porque meu interesse pessoal é mais por JSF por enquanto.</p>
<p>Como detalhamento segue o changelog:</p>
<p><span class="postbody">&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-<br />
<strong> Version 1.0.0-M3 (2008-05-25)</strong></span></p>
<p><strong> Bug</strong><br />
* [Template] - Acertos no template para Struts - cruds com campo date, javascripts e outros.<br />
* [Template] - Resolvido problema na geração da pasta /jsp/velocity usada para o struts-menu.<br />
* [Plugin - Core] - Quando algum package tinha o mesmo nome do projeto o mapping gerava as classes na pasta errada.</p>
<p><strong>Improvement</strong><br />
* [Plugin - Core] - Distribuição do plug-in usando jar e em arquivo separado do template.<br />
* [Plugin - Core] - Adicionada validação de compatibilidade entre o template e o plug-in.<br />
* [Plugin - Core] - Criação de aba exclusiva para gerenciar templates.<br />
* [Plugin - Core] - Melhoria de performance do build.<br />
* [Plugin - Core] - Adicionado botão para selecionar todos os atributos de uma classe no CRUD.<br />
* [Plugin - UI] - Novo wizard para abrir o SPIDER Editor.<br />
* [Template] - Mais traduções para o i18n do projeto.<br />
* [Template] - Criado atributos para armazenar um resumo das características de cada template.<br />
* [Template] - Adicionado ao template a possibilidade de executar scripts ant para completar o build.<br />
* [Template] - Utilização da feature de executar scripts ant para rodar o xdoclet-build.xml após a geração de CRUDs com Struts.<br />
* [Template] - Alinhamento do código HTML das páginas jsp geradas.<br />
* [Others] - Utilização do Atlassian Bamboo como software de integração contínua e do Fisheye.<br />
* [Others] - Criado um Eclipse Update Site para instalação e atualização do plug-in.<br />
* [Documentation] - Site: tradução de mais páginas para o idioma inglês (mais documentação).<br />
* [Documentation] - Nova sessão &#8220;Getting Started&#8221; no site.</p>
<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-</p>
<p><a href="http://www.j2eespider.org" target="_blank">http://www.j2eespider.org</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.brunobraga.com.br/2008/05/26/j2ee-spider-100-m3/feed/</wfw:commentRss>
		</item>
	</channel>
</rss>
