<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>marcuscavalcanti.net</title>
	<atom:link href="http://www.marcuscavalcanti.net/blog/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.marcuscavalcanti.net/blog</link>
	<description>Software, tecnologia e etc.</description>
	<lastBuildDate>Wed, 21 Jul 2010 03:52:18 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.1</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>O que eu tenho aprendido sobre liderança</title>
		<link>http://www.marcuscavalcanti.net/blog/2010/06/07/o-que-eu-tenho-aprendido-sobre-lideranca/</link>
		<comments>http://www.marcuscavalcanti.net/blog/2010/06/07/o-que-eu-tenho-aprendido-sobre-lideranca/#comments</comments>
		<pubDate>Mon, 07 Jun 2010 03:46:07 +0000</pubDate>
		<dc:creator>Marcus Cavalcanti</dc:creator>
				<category><![CDATA[Carreira & Profissão]]></category>
		<category><![CDATA[líder]]></category>
		<category><![CDATA[liderança. equipe]]></category>
		<category><![CDATA[time]]></category>

		<guid isPermaLink="false">http://www.marcuscavalcanti.net/blog/?p=1351</guid>
		<description><![CDATA[Desde o começo do ano, tenho tido a oportunidade de trabalhar na liderança de projetos de software (por isso o motivo da minha ausência por aqui) e essa experiência tem sido muito enriquecedora para mim no aspecto profissional, pois tenho dado extrema relevância a aspectos, que em outrora, eram menos relevantes do que aspectos técnicos, [...]]]></description>
			<content:encoded><![CDATA[<p>Desde o começo do ano, tenho tido a oportunidade de trabalhar na liderança de projetos de software (por isso o motivo da minha ausência por aqui) e essa experiência tem sido muito enriquecedora para mim no aspecto profissional, pois tenho dado extrema relevância a aspectos, que em outrora, eram menos relevantes do que aspectos técnicos, como: lidar com pessoas, processos, riscos, prazos e expectativas.</p>
<p>Não tenho a menor dúvida de que liderança é algo que possa ser adquirido através de um processo de aprendizagem, o que me faz constatar, que por mais que existam pessoas que tenham alguns aspectos de liderança mais bem desenvolvidos de forma natural, que é possível ainda assim desenvolver ainda mais esses aspectos. Ou seja, sempre podemos ser melhores líderes. Acredito também, que as melhores maneiras de evoluirmos é observando outros líderes e também dando atenção as pessoas com que trabalhamos.</p>
<p>Baseado no assunto liderança, preparei uma lista com quase 40 tópicos que tem sido de suma importância no meu dia-a-dia como líder de projeto. Esses tópicos foram pensados baseados em erros e acertos que tenho cometido como líder de projetos de software, por isso existem tópicos focados no aspecto de software, entretanto a maioria é voltada para líderes de maneira geral.</p>
<p>1 &#8211; Defina, focado no seu problema, os artefatos técnicos a serem usados no seu projeto e certifique-se de que a probabilidade dos mesmos mudarem é pouco provável</p>
<p>2 &#8211; Tenha um plano de comunicação bem definido com a sua equipe</p>
<p>3 &#8211; Desenvolva ou escolha uma metodologia de desenvolvimento e tenha certeza de que as pessoas da sua equipe a entenderam e acharam a mesma útil</p>
<p>4 &#8211; Se preocupe com o seu modelo de dados</p>
<p>5 &#8211; Se possível, tenha sempre o layout em mãos antes do desenvolvimento</p>
<p>6 &#8211; Não exija respeito, conquiste</p>
<p>7 &#8211; Tenha bom humor</p>
<p>8 &#8211; Passe segurança a sua equipe, tenha certeza que ela confie em você, um líder precisa, acima de tudo, inspirar confiança</p>
<p>9 &#8211; Tente não demonstrar desespero, euforia e nem pessimismo</p>
<p>10 &#8211; Saiba cobrar, mas sem pressionar</p>
<p>11 &#8211; Contextualize as pessoas sobre o que elas estão fazendo</p>
<p>12 &#8211; Posicione as pessoas sobre o andamento e o status atual do projeto em que elas estão participando</p>
<p>13 &#8211; Identifique, antes de tudo, os pontos fortes e fracos de cada um e use isso a seu favor</p>
<p>14 &#8211; Promova treinamentos e palestras para pontos em que mais de uma pessoa possua dúvida</p>
<p>15 &#8211; Cobre uma documentação do cliente que agregue ao seu time</p>
<p>16 &#8211; Converse com o seu cliente</p>
<p>17 &#8211; Caso necessário, crie uma documentação própria e simplificada, baseada na documentação original do seu cliente</p>
<p>18 &#8211; Defina e detalhe bem as tarefas de cada membro da sua equipe</p>
<p>19 &#8211; Faça com que as pessoas da sua equipe entendam da aplicação, entendam do negócio, pois só assim elas podem sugerir melhorias</p>
<p>20 &#8211; Tente não ficar dependente de uma mesma pessoas para um ponto específico</p>
<p>21 &#8211; Dê feedback constante</p>
<p>22 &#8211; Ouça a sua equipe</p>
<p>23 &#8211; Reuna sua equipe semanamlmente para discutir como foi a última semana e planejar como será a próxima</p>
<p>24 &#8211; Tenha preferência em trabalhar com equipes enxutas a equipe com muitas pessoas</p>
<p>25 &#8211; Dê atenção as pessoas novas e explique sobre o que ela fará, aprensente ela a equipe, mostre a empresa</p>
<p>26 &#8211; Estime prazos reais para o seu cliente, e não prazos que ele gostaria de ouvir</p>
<p>27 &#8211; Promova ações para estimular a união da sua equipe, como almoços mensais, por exemplo</p>
<p>28 &#8211; Enumere todas as principais funcionalidades do seu sistema, se possível criando uma hierarquia entre elas, isso ajudara você, a equipe e o cliente a terem uma visão macro do projeto</p>
<p>29 &#8211; Crie políticas para o bom de uso de controles de versão, ferramentas de gerenciamento, integração contínua, etc</p>
<p>30 &#8211; Faça uma auto-avaliação periodicamente</p>
<p>31 &#8211; Evite que as pessoas tenham que trabalhar finais de semana, feriados e fazerem hora extra constantemente</p>
<p>32 &#8211; Tenha cuidado em elogiar alguém publicamente. Jamais critique alguém publicamente</p>
<p>33 &#8211; Anote tudo o que você deseja fazer, mesmo que não seja prioridade</p>
<p>34 &#8211; Mostre e deixe claro a importância de cada membro da equipe</p>
<p>35 &#8211; Não fale mal da sua equipe para outras pessoas</p>
<p>36 &#8211; Trabalhe e se esforçe mais do que todo mundo, você é o exemplo</p>
<p>37 &#8211; Sua equipe precisa te admirar e se espelhar em você</p>
<p>38 &#8211; Saiba dizer não, demarque seu limite</p>
<p>39 &#8211; Em caso de fracasso, a culpa é do líder, em caso de sucesso, o mérito é de todos</p>
<p>Alguns desses pontos são de cunho mais técnico, outros de cunho gerencial e outras focam no relacionamento inter-pessoal entre você e os membros da sua equipe e entre os membros da sua equipe com eles mesmo. Não se esqueça, que antes de qualquer coisa, nós trabalhamos com humanos e humanos são passíveis a cometerem erros, humanos tem dias bons e ruins, humanos tem expectativas, humanos necessitam de comunicação.</p>
<p>Um recurso que tem me ajudado a ter esses pontos de maneira mais clara é o <a href="http://pt.wikipedia.org/wiki/Mapa_mental" target="_blank" style="text-decoration: underline">mapa mental</a>, pois dessa maneira consigo ter todos esses pontos listados e interligados, proporcionando uma organização lógica aos mesmos. </p>
<p>Para finalizar, sempre se questione com a seguinte pergunta: eu seria liderado por mim mesmo?</p>
]]></content:encoded>
			<wfw:commentRss>http://www.marcuscavalcanti.net/blog/2010/06/07/o-que-eu-tenho-aprendido-sobre-lideranca/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>BDD com JBehave</title>
		<link>http://www.marcuscavalcanti.net/blog/2010/01/08/bdd-com-jbehave/</link>
		<comments>http://www.marcuscavalcanti.net/blog/2010/01/08/bdd-com-jbehave/#comments</comments>
		<pubDate>Fri, 08 Jan 2010 19:39:55 +0000</pubDate>
		<dc:creator>Marcus Cavalcanti</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Tecnologia, Software & Desenvolvimento]]></category>
		<category><![CDATA[BDD]]></category>
		<category><![CDATA[TDD]]></category>
		<category><![CDATA[Testes]]></category>

		<guid isPermaLink="false">http://www.marcuscavalcanti.net/blog/?p=1304</guid>
		<description><![CDATA[Conforme prometido no tópico anterior, irei mostrar o conceito de BDD através da utilização do framework JBehave, que é o framework de BDD mais famoso para Java e que foi desenvolvido pelo Dan North, o idealizador deste conceito.
Antes de mais nada, vamos citar alguns conceitos importantes de BDD.
Estórias e Cenários
BDD é baseado em estórias e [...]]]></description>
			<content:encoded><![CDATA[<p>Conforme prometido no <a href="http://www.marcuscavalcanti.net/blog/2010/01/07/algumas-observacoes-sobre-bdd/" style="text-decoration: underline" target="_blank">tópico anterior</a>, irei mostrar o conceito de <a href="http://dannorth.net/introducing-bdd" style="text-decoration: underline" target="_blank">BDD</a> através da utilização do <em>framework</em> <a href="http://jbehave.org/" style="text-decoration: underline" target="_blank">JBehave</a>, que é o <em>framework</em> de BDD mais famoso para Java e que foi desenvolvido pelo <a href="http://dannorth.net/" style="text-decoration: underline" target="_blank">Dan North</a>, o idealizador deste conceito.</p>
<p>Antes de mais nada, vamos citar alguns conceitos importantes de BDD.</p>
<h3>Estórias e Cenários</h3>
<p>BDD é baseado em estórias e cenários, e para criarmos ambos, vamos seguir alguns padrões pré-definidos por autores de BDD. Uma vez que BDD é focado em comportamento e sequência, as estórias e cenários devem ter um formato rígido para que as ferramentas consigam entendê-los e interpretá-los.</p>
<p>As estórias, possuem o seguinte formato:<br />
<!--DEVFMTCODE--><pre class="devcodeblock" title="Text"><div class="devcodeoverflow"><ol><li></li><li>As I [X]</li><li>I want [Y]</li><li>so that [Z]</li><li></li></ol></div></pre><!--END_DEVFMTCODE--></p>
<p>E os cenários possuem o seguinte formato:<br />
<!--DEVFMTCODE--><pre class="devcodeblock" title="Text"><div class="devcodeoverflow"><ol><li></li><li>Given some initial context (the givens),</li><li>When an event occurs,</li><li>then ensure some outcomes.</li><li></li></ol></div></pre><!--END_DEVFMTCODE--></p>
<p>Ou seja, isso quer dizer que devemos pensar em nossos requisitos de maneira que possam ser escritos baseados nessa convenção.</p>
<p>O JBehave é originalmente escrito para entender estórias em inglês, entretanto como BDD é focado em pessoas (<em>stakeholders</em>) e na descrição de situações reais, faz muito mais sentido semanticamente que as estórias e cenários sejam escritos em português e para resolver isso, usei uma <a href="http://codificando.com/2009/04/15/jbehave-brasil-bdd-em-java-no-nosso-idioma/" target="_blank" style="text-decoration: underline">contribuição</a> do <a href="http://codificando.com/" target="_blank" style="text-decoration: underline">Emerson Macedo</a> para que os cenários possam ser escritos e entendidos em português pelo JBehave.</p>
<h3>Começando com o JBehave</h3>
<p>O primeiro passo para utilização do JBehave, é fazer <em><a href="http://jbehave.org/software/download/" target="_blank" style="text-decoration: underline">download</em> do JAR</a> do projeto e incluí-lo no <em>classpath</em> do seu projeto.</p>
<p>O próximo passo é escrever a estória juntamente com o cenário e para tal resolvi criar um exemplo simples para que o entendimento do conceito possa ser casado através do código a ser desenvolvido. </p>
<p>O exemplo escolhido é baseado no requisito: <strong>Compra de produtos em promoção com aviso por email</strong>. E é isso que nosso cenário BDD deve descrever.</p>
<p>Por questão de organização, resolvi quebrar a estória em 3 cenários diferentes, onde a primeira parte representa a verificação de produtos em promoção, a segunda representa a compra desses produtos e o terceiro é a finalização da compra e o envio de email. Então, a estória e os cenários ficaram assim:</p>
<p><!--DEVFMTCODE--><pre class="devcodeblock" title="Text"><div class="devcodeoverflow"><ol><li></li><li>Compra de produtos em promoção com aviso por email</li><li>&nbsp;</li><li>Narrativa:</li><li>Como um usuário</li><li>Eu quero comprar produtos em promoção</li><li>E então receber um email de confirmação</li><li>&nbsp;</li><li>Cenário: Verificar produtos em promoção</li><li>Dado Que uma loja possui 10 produtos</li><li>E Que 5 estão em promoção</li><li>Quando Eu verifico quais estão em promoção</li><li>Então Preencho minha sacola apenas com produtos em promoção</li><li>&nbsp;</li><li>Cenário: Comprar produtos em promoção</li><li>Dado Que minha sacola de compras está preenchida com 5 produtos em promoção</li><li>Quando Eu verifico o somatório de produtos</li><li>Então Devo ter somente um total de 500 reais em produtos</li><li>&nbsp;</li><li>Cenário: Enviar email</li><li>Dado Que minha sacola está preenchida de produtos</li><li>Quando Enviar um email de confirmação</li><li>Então Devo receber o status do envio &quot;true&quot;</li><li></li></ol></div></pre><!--END_DEVFMTCODE--></p>
<p>A primeira linha do arquivo texto representa o título da nossa estória, o requisito de fato. A narrativa é um resumo do que essa estória deve cumprir e a seguir vem os três cenários, que no caso são as três etapas da estória.</p>
<p>É importante notar, que as palavras chaves em inglês (<em>Given</em>, <em>When</em>, <em>Then</em>, <em>And</em>) foram substituídas  por palavras em português (Dado, Quando, Então, E).</p>
<p>Esse arquivo texto deve ser salvo com a extensão <em>*.cenario</em> e o seu nome está diretamente ligado a classe que irei criar no passo a seguir, que no caso é a classe que representa a estória e a associação com os cenários.</p>
<h3>Criando a classe que irá comportar os cenários</h3>
<p>Nesse passo irei criar a classe que irá apontar os cenários que compõe a estória e essa classe deve extender a classe <a href="http://jbehave.org/javadoc/latest/core/org/jbehave/scenario/Scenario.html" class="broken_link"  target="_blank" style="text-decoration: underline"><em>Scenario</em></a> do JBehave. Dessa forma, a classe ficaria assim:</p>
<p><strong>PrecoPromocaoTeste.java</strong><br />
<!--DEVFMTCODE--><pre class="devcodeblock" title="Java"><div class="devcodeoverflow"><ol><li></li><li><span style="color: #000000; font-weight: bold;">package</span> <span style="color: #006699;">scenario1</span><span style="color: #339933;">;</span></li><li>&nbsp;</li><li><span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">scenario1.steps.CompraSteps</span><span style="color: #339933;">;</span></li><li><span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">scenario1.steps.EmailSteps</span><span style="color: #339933;">;</span></li><li><span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">scenario1.steps.PromocaoSteps</span><span style="color: #339933;">;</span></li><li><span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">scenario1.util.PtBRScenario</span><span style="color: #339933;">;</span></li><li>&nbsp;</li><li><span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> PrecoPromocaoTeste <span style="color: #000000; font-weight: bold;">extends</span> PtBRScenario <span style="color: #009900;">&#123;</span></li><li>	<span style="color: #000000; font-weight: bold;">public</span> PrecoPromocaoTeste<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; addSteps<span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">new</span> PromocaoSteps<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; addSteps<span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">new</span> CompraSteps<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; addSteps<span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">new</span> EmailSteps<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></li><li>	<span style="color: #009900;">&#125;</span></li><li><span style="color: #009900;">&#125;</span></li><li></li></ol></div></pre><!--END_DEVFMTCODE--></p>
<p>No exemplo acima, estou extendo a classe <em>PtBRScenario</em> só para que a estória e o cenário sejam escritos em português, mas essa classa herda a classe <em>Scenario</em> como descrito anteriormente.</p>
<p>No construtor da classe, inclui os passos que a estória deve seguir para ser satisfeita e como quebrei a estória em três pedaços, precisei incluir três passos sequenciados.</p>
<h3>Criando os passos da estória</h3>
<p>Como a estória foi quebrada em três partes, se faz por necessário a criação de 3 classes que irão representar os passos da estória e todas essas classes devem herdar a classe <em><a href="http://jbehave.org/javadoc/latest/core/org/jbehave/scenario/steps/Steps.html" class="broken_link"  target="_blank" style="text-decoration: underline">Steps</a></em> do JBehave.</p>
<p>Pela ordem definida na nossa classe de cenário, vamos aos passos:</p>
<p><strong>PromocaoSteps.java</strong><br />
<!--DEVFMTCODE--><pre class="devcodeblock" title="Java"><div class="devcodeoverflow"><ol><li><span style="color: #000000; font-weight: bold;">package</span> <span style="color: #006699;">scenario1.steps</span><span style="color: #339933;">;</span></li><li>&nbsp;</li><li><span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">java.util.List</span><span style="color: #339933;">;</span></li><li>&nbsp;</li><li><span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">junit.framework.Assert</span><span style="color: #339933;">;</span></li><li>&nbsp;</li><li><span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">org.jbehave.scenario.annotations.Given</span><span style="color: #339933;">;</span></li><li><span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">org.jbehave.scenario.annotations.Then</span><span style="color: #339933;">;</span></li><li><span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">org.jbehave.scenario.annotations.When</span><span style="color: #339933;">;</span></li><li>&nbsp;</li><li><span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">scenario1.entity.Loja</span><span style="color: #339933;">;</span></li><li><span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">scenario1.entity.Produto</span><span style="color: #339933;">;</span></li><li><span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">scenario1.util.PtBRSteps</span><span style="color: #339933;">;</span></li><li><span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">scenario1.vo.Sacola</span><span style="color: #339933;">;</span></li><li>&nbsp;</li><li><span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> PromocaoSteps <span style="color: #000000; font-weight: bold;">extends</span> PtBRSteps <span style="color: #009900;">&#123;</span>	</li><li>	Loja loja 		<span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Loja<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></li><li>	Sacola sacola 	<span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Sacola<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></li><li>	List<span style="color: #339933;">&lt;</span>Produto<span style="color: #339933;">&gt;</span> listaProdutoPromocao<span style="color: #339933;">;</span></li><li>	<span style="color: #000066; font-weight: bold;">int</span> quantidadeProdutoPromocao<span style="color: #339933;">;</span></li><li>&nbsp;</li><li>	@Given<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Que uma loja possui $quant produtos&quot;</span><span style="color: #009900;">&#41;</span></li><li>	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> populaLoja<span style="color: #009900;">&#40;</span><a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Ainteger+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #003399;">Integer</span></a> quantidade<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span></li><li>		loja.<span style="color: #006633;">inicializaProdutos</span><span style="color: #009900;">&#40;</span>quantidade<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></li><li>	<span style="color: #009900;">&#125;</span>	</li><li>&nbsp;</li><li>	@Given<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Que $quant estão em promoção&quot;</span><span style="color: #009900;">&#41;</span></li><li>	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> informaProdutosPromocao<span style="color: #009900;">&#40;</span><a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Ainteger+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #003399;">Integer</span></a> quantidade<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span></li><li>		loja.<span style="color: #006633;">colocaProdutosPromocao</span><span style="color: #009900;">&#40;</span>quantidade<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></li><li>		quantidadeProdutoPromocao <span style="color: #339933;">=</span> quantidade<span style="color: #339933;">;</span></li><li>	<span style="color: #009900;">&#125;</span>	</li><li>&nbsp;</li><li>	@When<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Eu verifico quais estão em promoção&quot;</span><span style="color: #009900;">&#41;</span></li><li>	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> verificaProdutosPromocao<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>		</li><li>		listaProdutoPromocao <span style="color: #339933;">=</span> loja.<span style="color: #006633;">retornaProdutosPromocao</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></li><li>	<span style="color: #009900;">&#125;</span></li><li>&nbsp;</li><li>	@Then<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Preencho minha sacola apenas com produtos em promoção&quot;</span><span style="color: #009900;">&#41;</span></li><li>	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> populaSacola<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span></li><li>		sacola.<span style="color: #006633;">populaSacola</span><span style="color: #009900;">&#40;</span>listaProdutoPromocao<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></li><li>&nbsp;</li><li>		<span style="color: #000000; font-weight: bold;">Assert</span>.<span style="color: #006633;">assertEquals</span><span style="color: #009900;">&#40;</span>listaProdutoPromocao.<span style="color: #006633;">size</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>, quantidadeProdutoPromocao<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></li><li>	<span style="color: #009900;">&#125;</span></li><li><span style="color: #009900;">&#125;</span></li></ol></div></pre><!--END_DEVFMTCODE--></p>
<p><strong>CompraSteps.java</strong><br />
<!--DEVFMTCODE--><pre class="devcodeblock" title="Java"><div class="devcodeoverflow"><ol><li><span style="color: #000000; font-weight: bold;">package</span> <span style="color: #006699;">scenario1.steps</span><span style="color: #339933;">;</span></li><li>&nbsp;</li><li><span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">java.util.ArrayList</span><span style="color: #339933;">;</span></li><li><span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">java.util.List</span><span style="color: #339933;">;</span></li><li>&nbsp;</li><li><span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">junit.framework.Assert</span><span style="color: #339933;">;</span></li><li>&nbsp;</li><li><span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">org.jbehave.scenario.annotations.Given</span><span style="color: #339933;">;</span></li><li><span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">org.jbehave.scenario.annotations.Then</span><span style="color: #339933;">;</span></li><li><span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">org.jbehave.scenario.annotations.When</span><span style="color: #339933;">;</span></li><li>&nbsp;</li><li><span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">scenario1.entity.Produto</span><span style="color: #339933;">;</span></li><li><span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">scenario1.util.PtBRSteps</span><span style="color: #339933;">;</span></li><li><span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">scenario1.vo.Sacola</span><span style="color: #339933;">;</span></li><li>&nbsp;</li><li><span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> CompraSteps <span style="color: #000000; font-weight: bold;">extends</span> PtBRSteps <span style="color: #009900;">&#123;</span></li><li>	Sacola sacola 				<span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Sacola<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></li><li>	<span style="color: #000066; font-weight: bold;">double</span> somatorioProdutos 	<span style="color: #339933;">=</span> 0d<span style="color: #339933;">;</span></li><li>&nbsp;</li><li>	@Given<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Que minha sacola de compras está preenchida com $quant produtos em promoção&quot;</span><span style="color: #009900;">&#41;</span></li><li>	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> verificaSacola<span style="color: #009900;">&#40;</span><a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Ainteger+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #003399;">Integer</span></a> quantidade<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span></li><li>		List<span style="color: #339933;">&lt;</span>Produto<span style="color: #339933;">&gt;</span> listaProduto <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> ArrayList<span style="color: #339933;">&lt;</span>Produto<span style="color: #339933;">&gt;</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></li><li>&nbsp;</li><li>		<span style="color: #000000; font-weight: bold;">for</span> <span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">int</span> i<span style="color: #339933;">=</span><span style="color: #cc66cc;">1</span><span style="color: #339933;">;</span> i<span style="color: #339933;">&lt;=</span>quantidade<span style="color: #339933;">;</span> i<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span></li><li>			Produto produto 	<span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Produto<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></li><li>			produto.<span style="color: #006633;">preco</span> 		<span style="color: #339933;">=</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Amath+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #003399;">Math</span></a>.<span style="color: #006633;">round</span><span style="color: #009900;">&#40;</span><a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Amath+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #003399;">Math</span></a>.<span style="color: #006633;">random</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">*</span>100<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></li><li>			produto.<span style="color: #006633;">emPromocao</span> 	<span style="color: #339933;">=</span> <span style="color: #000066; font-weight: bold;">true</span><span style="color: #339933;">;</span></li><li>&nbsp;</li><li>			listaProduto.<span style="color: #006633;">add</span><span style="color: #009900;">&#40;</span>produto<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></li><li>		<span style="color: #009900;">&#125;</span></li><li>&nbsp;</li><li>		sacola.<span style="color: #006633;">populaSacola</span><span style="color: #009900;">&#40;</span>listaProduto<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></li><li>	<span style="color: #009900;">&#125;</span></li><li>&nbsp;</li><li>	@When<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Eu verifico o somatório de produtos&quot;</span><span style="color: #009900;">&#41;</span></li><li>	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> verificaTotalProdutosSacola<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span></li><li>		<span style="color: #000000; font-weight: bold;">for</span> <span style="color: #009900;">&#40;</span> Produto produto <span style="color: #339933;">:</span> sacola.<span style="color: #006633;">retornaProdutos</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span></li><li>			somatorioProdutos <span style="color: #339933;">=</span> produto.<span style="color: #006633;">preco</span> <span style="color: #339933;">+</span> somatorioProdutos<span style="color: #339933;">;</span></li><li>		<span style="color: #009900;">&#125;</span></li><li>	<span style="color: #009900;">&#125;</span></li><li>&nbsp;</li><li>	@Then<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Devo ter somente um total de R$ $total reais em produtos&quot;</span><span style="color: #009900;">&#41;</span></li><li>	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> validaSacola<span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">double</span> totalProduto<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>		</li><li>		<span style="color: #000000; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span> somatorioProdutos <span style="color: #339933;">&gt;</span> totalProduto <span style="color: #009900;">&#41;</span></li><li>			<span style="color: #000000; font-weight: bold;">Assert</span>.<span style="color: #006633;">fail</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Total de produtos é acima de R$ 500&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></li><li>	<span style="color: #009900;">&#125;</span></li><li><span style="color: #009900;">&#125;</span></li><li></li></ol></div></pre><!--END_DEVFMTCODE--></p>
<p><strong>EmailSteps.java</strong><br />
<!--DEVFMTCODE--><pre class="devcodeblock" title="Java"><div class="devcodeoverflow"><ol><li><span style="color: #000000; font-weight: bold;">package</span> <span style="color: #006699;">scenario1.steps</span><span style="color: #339933;">;</span></li><li>&nbsp;</li><li><span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">static</span> org.<span style="color: #006633;">jbehave</span>.<span style="color: #006633;">Ensure</span>.<span style="color: #006633;">ensureThat</span><span style="color: #339933;">;</span></li><li>&nbsp;</li><li><span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">org.jbehave.scenario.annotations.Given</span><span style="color: #339933;">;</span></li><li><span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">org.jbehave.scenario.annotations.Then</span><span style="color: #339933;">;</span></li><li><span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">org.jbehave.scenario.annotations.When</span><span style="color: #339933;">;</span></li><li>&nbsp;</li><li><span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">scenario1.util.PtBRSteps</span><span style="color: #339933;">;</span></li><li><span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">scenario1.vo.Sacola</span><span style="color: #339933;">;</span></li><li>&nbsp;</li><li><span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">com.guilhermechapiewski.fluentmail.email.EmailMessage</span><span style="color: #339933;">;</span></li><li><span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">com.guilhermechapiewski.fluentmail.transport.EmailTransportConfiguration</span><span style="color: #339933;">;</span></li><li>&nbsp;</li><li><span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> EmailSteps <span style="color: #000000; font-weight: bold;">extends</span> PtBRSteps <span style="color: #009900;">&#123;</span></li><li>	Sacola sacola 		<span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Sacola<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></li><li>	<a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Aboolean+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #003399;">Boolean</span></a> statusEnvio <span style="color: #339933;">=</span> <span style="color: #000066; font-weight: bold;">false</span><span style="color: #339933;">;</span></li><li>&nbsp;</li><li>	@Given<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Que minha sacola está preenchida de produtos&quot;</span><span style="color: #009900;">&#41;</span></li><li>	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> verificaSacola<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span></li><li>		<a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Asystem+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #003399;">System</span></a>.<span style="color: #006633;">out</span>.<span style="color: #006633;">println</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Lista cheia..&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></li><li>	<span style="color: #009900;">&#125;</span></li><li>&nbsp;</li><li>	@When<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Enviar um email de confirmação&quot;</span><span style="color: #009900;">&#41;</span></li><li>	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> enviaEmail<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span></li><li>		EmailTransportConfiguration.<span style="color: #006633;">configure</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;localhost&quot;</span>, <span style="color: #000066; font-weight: bold;">false</span>, <span style="color: #000066; font-weight: bold;">false</span>, <span style="color: #0000ff;">&quot;&quot;</span>, <span style="color: #0000ff;">&quot;&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></li><li>&nbsp;</li><li>		<span style="color: #000000; font-weight: bold;">new</span> EmailMessage<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span></li><li>	&nbsp;&nbsp;&nbsp;&nbsp;	.<span style="color: #006633;">from</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;eusou@marcuscavalcanti.net&quot;</span><span style="color: #009900;">&#41;</span></li><li>	&nbsp;&nbsp;&nbsp;&nbsp;	.<span style="color: #006633;">to</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;eusou@marcuscavalcanti.net&quot;</span><span style="color: #009900;">&#41;</span></li><li>	&nbsp;&nbsp;&nbsp;&nbsp;	.<span style="color: #006633;">withSubject</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Testando BDD&quot;</span><span style="color: #009900;">&#41;</span></li><li>	&nbsp;&nbsp;&nbsp;&nbsp;	.<span style="color: #006633;">withBody</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Testando terceiro cenário e o final da estória.&quot;</span><span style="color: #009900;">&#41;</span></li><li>	&nbsp;&nbsp;&nbsp;&nbsp;	.<span style="color: #006633;">send</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></li><li>&nbsp;</li><li>		statusEnvio <span style="color: #339933;">=</span> <span style="color: #000066; font-weight: bold;">true</span><span style="color: #339933;">;</span></li><li>	<span style="color: #009900;">&#125;</span></li><li>&nbsp;</li><li>	@Then<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Devo receber o status do envio <span style="color: #000099; font-weight: bold;">\&quot;</span>$retorno<span style="color: #000099; font-weight: bold;">\&quot;</span>&quot;</span><span style="color: #009900;">&#41;</span></li><li>	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> recebeStatusEnvio<span style="color: #009900;">&#40;</span><a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #003399;">String</span></a> retorno<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>	</li><li>		ensureThat<span style="color: #009900;">&#40;</span>statusEnvio.<span style="color: #006633;">toString</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">equals</span><span style="color: #009900;">&#40;</span>retorno<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></li><li>	<span style="color: #009900;">&#125;</span></li><li><span style="color: #009900;">&#125;</span></li></ol></div></pre><!--END_DEVFMTCODE--></p>
<p>Nos exemplos acima, que representam os passos de um cenário, é importante notar que os métodos seguem a ordem definida no arquivo texto, assim como todos são anotados com as palavras chaves correspondentes, no caso <em>Given</em>, <em>When</em>, <em>And</em>, <em>Then</em>. As anotações recebem como parâmetro as frases descritas no arquivo texto, excluindo apenas as palavras chaves no começo da frase, que estão devidamente representadas pelas anotações.</p>
<p>Os parâmetros são identificados com o formato <em>$variavel</em>, e uma vez que usamos esses parâmetros, devemos também colocá-los na assinatura dos métodos. Esses parâmetros são automaticamente capturados pelo JBehave através do uso de <a href="http://guia-er.sourceforge.net/" target="_blank" style="text-decoration: underline">expressões regulares</a>. </p>
<h3>Executando o exemplo</h3>
<p>Para executar o exemplo deve-se executar a classe que extende a classe <em>Scenario</em> do JBehave, nesse caso seria a classe <em>PrecoPromocaoTeste.java</em>, e para acompanhar os resultados, eu utilizo a integração do <a href="http://www.eclipse.org/" target="_blank" style="text-decoration: underline">Eclipse</a> com o <a href="http://www.junit.org/" target="_blank" style="text-decoration: underline">JUnit</a>, através de uma <em><a href="http://www.eclipse.org/articles/viewArticle/ViewArticle2.html" target="_blank" style="text-decoration: underline">view</a></em> própria da <a href="http://pt.wikipedia.org/wiki/IDE" target="_blank" style="text-decoration: underline">IDE</a>.</p>
<p>No exemplo, usei ainda algumas classes auxiliares criadas especificamente para o exemplo, mas que não irei mostrar aqui os seus códigos para não tornar o tópico extenso demais. De qualquer forma, ao final desse tópico botarei um <em>link</em> para <em>download</em> do projeto no Eclipse que contém todos os códigos.</p>
<h3>Observações finais</h3>
<p>Um dos problemas que eu notei no JBehave é em relação a parametrização de alguns valores no arquivo texto para o código Java, em alguns casos isso pode se tornar um trabalho sacal e pouco produtivo, mas acredito que com a evolução do <em>framework</em> esse problema será resolvido.</p>
<p>Algumas pessoas utilizam alternativas variadas para resolver esse problema, como  por exemplo criar o valor dos parâmetros diretamente como atributos nas classes que representam os passos. Eu particularmente não gosto dessa abordagem, pois acredito que isso faz com que os arquivos que descrevem os cenários percam seu valor e esses arquivos são essencial para utilização e sentido do BDD.</p>
<p>No exemplo citado, usei ainda algumas bibliotecas como <a href="http://code.google.com/p/fluentmailapi/" target="_blank" style="text-decoration: underline">FluentMailApi</a>, Mail e Activation da <a href="http://java.sun.com/products/javamail/" target="_blank" style="text-decoration: underline">JavaMail</a> e <a href="http://code.google.com/p/hamcrest/" target="_blank" style="text-decoration: underline">Hamcrest</a>. Essas bibliotecas servem basicamente para o envio de email e uso mais aperfeiçoado de expressões regulares por parte do JBehave.</p>
<p>Para finalizar, é importante citar que as classes do meu negócio (Sacola, Usuario, Loja, etc) foram construídas baseadas no meu requesito, no meu cenário, que foi a primeira etapa a ser elaborada na construção do exemplo.</p>
<h3>Download</h3>
<p>Para <em>download</em> do projeto completo no Eclipse, basta <a href="http://www.marcuscavalcanti.net/blog/wp-content/uploads/JBehave/JBehaveLab.rar" style="text-decoration: underline" target="_blank">clicar aqui</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.marcuscavalcanti.net/blog/2010/01/08/bdd-com-jbehave/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Algumas observações sobre BDD</title>
		<link>http://www.marcuscavalcanti.net/blog/2010/01/07/algumas-observacoes-sobre-bdd/</link>
		<comments>http://www.marcuscavalcanti.net/blog/2010/01/07/algumas-observacoes-sobre-bdd/#comments</comments>
		<pubDate>Thu, 07 Jan 2010 22:35:13 +0000</pubDate>
		<dc:creator>Marcus Cavalcanti</dc:creator>
				<category><![CDATA[Tecnologia, Software & Desenvolvimento]]></category>
		<category><![CDATA[BDD]]></category>
		<category><![CDATA[TDD]]></category>
		<category><![CDATA[Testes]]></category>

		<guid isPermaLink="false">http://www.marcuscavalcanti.net/blog/?p=1271</guid>
		<description><![CDATA[Ultimamente estive pesquisando sobre o assunto BDD (Behaviour-Driven Development) e também praticado com alguns exemplos reais, através disso devo dizer que consegui tirar algumas conclusões bem interessantes sobre o assunto, nas quais gostaria de expor aqui. Vamos a elas:
BDD ajuda você, BDD ajuda seu cliente
Um ponto que pude observar, é que usando BDD a possibilidade [...]]]></description>
			<content:encoded><![CDATA[<p>Ultimamente estive pesquisando sobre o assunto BDD (<a href="http://dannorth.net/introducing-bdd" target="_blank" style="text-decoration: underline">Behaviour-Driven Development</a>) e também praticado com alguns exemplos reais, através disso devo dizer que consegui tirar algumas conclusões bem interessantes sobre o assunto, nas quais gostaria de expor aqui. Vamos a elas:</p>
<h3>BDD ajuda você, BDD ajuda seu cliente</h3>
<p>Um ponto que pude observar, é que usando BDD a possibilidade de um cliente participar de um projeto é imensa, mesmo que você não use alguma metodologia ágil (falarei sobre isso a seguir). E por que ele pode participar? É simples, pois é ele quem pode escrever os testes. Se ainda assim não for o seu cliente o responsável por escrever os testes, será ele quem irá validá-los, ou seja, você pode escrever os testes e pedir para que ele aprove ou não. Isso é muito importante, pois nesse caso os testes em BDD seriam o contrato entre você o seu cliente, entre o que você está entregando e o que ele está esperando.</p>
<h3>BDD favorece o sucesso do uso de metodologias ágeis</h3>
<p>Sem dúvida nenhuma um dos pontos fortes do uso de BDD é que suas características se encaixam muito bem em equipes que fazem o uso de <a href="http://en.wikipedia.org/wiki/Agile_software_development"  target="_blank" style="text-decoration: underline">metodologia ágil</a>. E são vários pontos que favorecem.</p>
<p>Uma delas é a já citada participação do cliente, pois um dos requisitos para o sucesso do uso de metodologias ágeis é a participação e contribuição efetiva do cliente e no caso do uso de BDD ele pode participar diretamente, uma vez que é ele quem é o responsável (<a href="http://improveit.com.br/scrum/product_owner" target="_blank" style="text-decoration: underline">PO</a>) por criar as estórias (ítens do <a href="http://improveit.com.br/scrum/product_backlog"  target="_blank" style="text-decoration: underline">backlog</a>) e criar os <a href="http://en.wikipedia.org/wiki/Acceptance_testing" target="_blank" style="text-decoration: underline">testes de aceitação</a> para as mesmas, onde tudo isso é usado no BDD.</p>
<p>Os artefatos que constituem BDD são muito, mais muito semelhantes aos artefatos presentes em ágil.</p>
<p> Em BDD se usa estórias e testes de aceitação, além de BDD favorecer a construção de aplicativos de forma evolutiva (<a href="http://scrummethodology.com/scrum-sprint/" target="_blank" style="text-decoration: underline"><em>sprints</em></a>) e tudo isso casa perfeitamente com os requisitos das metodologias ágeis.</p>
<h3>Favorece a escrita de testes antes da implementação</h3>
<p>Uma boa prática na criação de testes, independente se você usa BDD ou TDD, é que os <a href="http://stackoverflow.com/questions/319513/when-not-to-write-tests-before-implementation" target="_blank" style="text-decoration: underline">testes sejam criados antes de tudo</a>. Ok, eu concordo, mas devo dizer que com TDD isso não é muito nítido, pois na maioria dos casos, principalmente no começo, as pessoas tendem a implementar os códigos e depois escreverem os testes para validá-los. Já com BDD, a primeira coisa que você precisa ter em mãos antes de implementar os testes são as estórias e os cenários, não tem como fugir disso, o que torna muito mais nítido que em primeiro lugar vem os testes  e depois as implementações.</p>
<h3>Torna mais nítido o que sua aplicação deve fazer</h3>
<p>Com BDD é muito mais fácil isolar as funcionalidade da sua aplicação, já que o que é testado é exatamente isso, dessa forma fica fácil identificar os componentes que envolvem determinada funcionalidade, torna mais nítido qual é o papel daquela funcionalidade, além do que consegue dar um sentido melhor para a sua aplicação de maneira geral.</p>
<p>Com BDD, você consegue ainda uma visão de <em><a href="http://en.wikipedia.org/wiki/Workflow" target="_blank" style="text-decoration: underline">workflow</a></em> da sua aplicação, ou seja, uma visão macro, o que favorece dar manutenção a mesma. Percebo também, que BDD favorece um bom design de código, evitando assim problemas de desenvolvimento como códigos com <a href="http://jcspl.net/2007/12/17/acoplamento-e-coesao/" target="_blank" style="text-decoration: underline">alto-acoplamento</a>.</p>
<h3>Torna os testes mais humanos</h3>
<p>A essência do BDD são os cenários e não parte isoladas da aplicação e essa maneira de lidar com testes favorece o entendimento por parte de nós, humanos.</p>
<p>Testes de interface com o <a href="http://seleniumhq.org/" target="_blank" style="text-decoration: underline">Selenium</a>,  tornam-se mais compreensíveis num contexto que envolva BDD, como em um teste de login, por exemplo.</p>
<h3>Conclusão</h3>
<p>Na minha opinião, está mais do que clara a vantagem no uso de BDD, entretanto ele não substitui o uso de TDD, pois a abordagem de ambas são diferentes e complementares.</p>
<p>No próximo tópico, irei mostrar um cenário de testes com o <em>framework</em> <a href="http://jbehave.org/reference/latest/index.html" target="_blank" style="text-decoration: underline">JBehave</a>, um <em>framework</em> BDD para Java.</p>
<h3>Mais sobre o assunto</h3>
<p><a href="http://blog.objectmentor.com/articles/2008/11/27/the-truth-about-bdd" target="_blank" style="text-decoration: underline">The truth about DDD</a></p>
<p><a href="http://inter-sections.net/2007/10/03/the-difference-between-tdd-and-bdd" target="_blank" style="text-decoration: underline">The difference between TDD and BDD</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.marcuscavalcanti.net/blog/2010/01/07/algumas-observacoes-sobre-bdd/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Algumas frases sobre SOA e BPM</title>
		<link>http://www.marcuscavalcanti.net/blog/2009/12/16/algumas-frases-sobre-soa-e-bpm/</link>
		<comments>http://www.marcuscavalcanti.net/blog/2009/12/16/algumas-frases-sobre-soa-e-bpm/#comments</comments>
		<pubDate>Wed, 16 Dec 2009 21:59:07 +0000</pubDate>
		<dc:creator>Marcus Cavalcanti</dc:creator>
				<category><![CDATA[BPM]]></category>
		<category><![CDATA[SOA]]></category>

		<guid isPermaLink="false">http://www.marcuscavalcanti.net/blog/?p=1255</guid>
		<description><![CDATA[Tenho andado sem tempo para postar coisas novas (apesar de ter mais de 20 posts engatilhados) e para não ficar tão ausente, resolvi colocar em prática algo que eu já vinha tendo vontade de fazer há algum tempo, que no caso seria publicar frases de autores que costumo ler.
As frases são tiradas de um contexto [...]]]></description>
			<content:encoded><![CDATA[<p>Tenho andado sem tempo para postar coisas novas (apesar de ter mais de 20 <em>posts</em> engatilhados) e para não ficar tão ausente, resolvi colocar em prática algo que eu já vinha tendo vontade de fazer há algum tempo, que no caso seria publicar frases de autores que costumo ler.</p>
<p>As frases são tiradas de um contexto específico, mas podem tranquilamente ser usadas de maneira isolada para reflexão, aprendizado e até para fixar uma idéia.</p>
<p>Nessa &#8220;primeira edição&#8221;, vou me ater a frases que envolvam SOA e BPM.</p>
<p>Eis as frases:</p>
<p><em>&#8220;The first of those milestones has come to pass: process is not simply the way business operates itself, but manages itself.&#8221;</em><br />
<strong>Phil Gilbert</strong></p>
<p><em>&#8220;It’s been said, “If you can’t measure it, you can’t manage it.”  It’s also been said, “Opinions are like a*******, everybody’s got one.”   The ability to manage by fact (measurement), rather than opinion, is what sets the rare professional manager from the masses of loudmouth, intimidating, egotists who’ve been given the title Manager.   Leaders, on the other hand, earn that title.  And one of the most effective ways of earning that title is to learn to mange objectively, not subjectively.  Objective management starts with identifying objective performance measurements.&#8221;</em><br />
<strong>Jim Reardan</strong></p>
<p><em>&#8220;Service Decomposition splits service, not function.&#8221;</em><br />
<strong>Thomas Erl</strong></p>
<p><em>&#8220;IT realizes the burden is not on them anymore. The business has to be the responsible party.&#8221;</em><br />
<strong>Peter Woodhull</strong></p>
<p><em>&#8220;Often when we look at business processes and SOA we ignore the information aspect and focus on the technology aspect. What&#8217;s important is that you have some vision of sets of services that you need now and then over time to meet your business requirements.&#8221;</em><br />
<strong>Mike Rosen</strong></p>
<p><em>&#8220;Unless you use SOA in the context of what you&#8217;re trying to do with the business, you can end up with just the new spaghetti to replace the old spaghetti.&#8221;</em><br />
<strong>Marc Smith</strong></p>
<p><em>&#8220;&#8230;often sees a team of business experts thinking in purely business terms and a team of developers thinking only in terms of what code they&#8217;ll need to write. But SOA is not the sort of architecture that one builds by throwing code at it. It is, at its core, very conceptual.&#8221;</em><br />
<strong>Sandy Kemsley</strong></p>
<p><em>&#8220;Using SOA as we do &#8211; as an architecture and business modeling approach &#8211; helps bridge the gap between traditional business process modeling and technology delivery.&#8221;</em><br />
<strong>Steve Jones</strong></p>
<p><em>&#8220;SOA is simply the technology architecture that defines how any technology is designed and deployed. BPM, on the other hand, represents how you link business strategy to business implementation… with [SOA-based] technology being a part of that implementation.&#8221;</em><br />
<strong>Phil Gilbert</strong></p>
]]></content:encoded>
			<wfw:commentRss>http://www.marcuscavalcanti.net/blog/2009/12/16/algumas-frases-sobre-soa-e-bpm/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Gerando pacotes do ALBPM com Maven e Ant</title>
		<link>http://www.marcuscavalcanti.net/blog/2009/11/30/gerando-pacotes-do-albpm-com-maven-e-ant/</link>
		<comments>http://www.marcuscavalcanti.net/blog/2009/11/30/gerando-pacotes-do-albpm-com-maven-e-ant/#comments</comments>
		<pubDate>Mon, 30 Nov 2009 15:00:39 +0000</pubDate>
		<dc:creator>Marcus Cavalcanti</dc:creator>
				<category><![CDATA[BPM]]></category>
		<category><![CDATA[ALBPM]]></category>
		<category><![CDATA[Ant]]></category>
		<category><![CDATA[Maven]]></category>
		<category><![CDATA[OracleBPM]]></category>

		<guid isPermaLink="false">http://www.marcuscavalcanti.net/blog/?p=1251</guid>
		<description><![CDATA[O Maven é um framework da Apache que possui muitas utilidades, uma delas é a geração de pacotes das aplicações sem que seja necessário uma IDE para realizar tal trabalho, isso é muito útil para que toda a equipe possa gerar um pacote da aplicação sem que seja necessário ter todo o projeto configurado em [...]]]></description>
			<content:encoded><![CDATA[<p>O <a href="http://maven.apache.org/" target="_blank" style="text-decoration: underline">Maven</a> é um framework da <a href="http://www.apache.org/" target="_blank" style="text-decoration: underline">Apache</a> que possui muitas utilidades, uma delas é a geração de pacotes das aplicações sem que seja necessário uma IDE para realizar tal trabalho, isso é muito útil para que toda a equipe possa gerar um pacote da aplicação sem que seja necessário ter todo o projeto configurado em sua máquina, dessa forma fica-se independente de IDE e máquinas.</p>
<p>Outra utilidades do Maven é o gerenciamento de dependências da aplicação, pois uma vez que sua aplicação use outras bibliotecas, não se faz por necessário incluir os devidos JARs no repositório da aplicação, basta apenas informar isso no Maven e deixar que ele se encarregue de encontrar essas bibliotecas e baixar para sua máquina.</p>
<p>No caso do <a href="http://download.oracle.com/docs/cd/E13165_01/albsi/docs60/index.html" target="_blank" style="text-decoration: underline">ALBPM</a> (Aqualogic BPM), temos um cenário um pouco diferente, pois no final das contas tudo que é gerado são arquivos XML com as informações dos seus processos, então nesse caso usamos o Maven apenas para geração de pacotes. No ALBPM, um pacote nada mais é que o diretório da aplicação compactado (zipado) com uma extensão específica, no caso *.exp, deve-se considerar ainda a exclusão de alguns diretórios na geração do pacote, pois esses diretórios são gerados em tempo de compilação pela engine do ALBPM. Baseado nisso, criei uma configuração do Maven que será responsável pela geração de pacote de um projeto no ALBPM.</p>
<p>Usei ainda uma integração do Maven com o <a href="http://ant.apache.org/" target="_blank" style="text-decoration: underline">Ant</a>, através de um <a href="http://maven.apache.org/plugins/maven-antrun-plugin/" target="_blank" style="text-decoration: underline">plugin específico</a> do Maven, onde o Ant será responsável por realizar algumas rotinas bem específicas, como renomear o arquivo gerado e apagar diretórios que não serão usados.</p>
<p>Vale ressaltar que eu testei essa rotina apenas para o ALBPM na versão 6.*, no caso da versão 5.*, acho que não deve mudar muita coisa, mas a extensão do pacote gerada é diferente, portanto será necessário algumas adaptações para que essa rotina funcione também nessa versão. No caso das versões já com a Oracle como responsável pelo produto (<a href="http://www.oracle.com/us/technologies/bpm/bpm-suite/index.htm" target="_blank" style="text-decoration: underline">OracleBPM</a>), essa rotina também deverá funcionar sem problemas.</p>
<h3>Criando o POM do Maven</h3>
<p>Como nosso projeto do ALBPM possui apenas um único módulo, será necessário a criação apenas de um único arquivo *.pom, que no caso será o responsável por incluir os plugins que serão usados, além de chamar um arquivo com algumas tasks do Ant. Dessa forma, o arquivo POM fica assim:</p>
<p><!--DEVFMTCODE--><pre class="devcodeblock" title="XML"><div class="devcodeoverflow"><ol><li><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;project</span> <span style="color: #000066;">xmlns</span>=<span style="color: #ff0000;">&quot;http://maven.apache.org/POM/4.0.0&quot;</span></span></li><li><span style="color: #009900;">	<span style="color: #000066;">xmlns:xsi</span>=<span style="color: #ff0000;">&quot;http://www.w3.org/2001/XMLSchema-instance&quot;</span></span></li><li><span style="color: #009900;">	<span style="color: #000066;">xsi:schemaLocation</span>=<span style="color: #ff0000;">&quot;http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span></li><li>&nbsp;</li><li>	<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;modelVersion<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>4.0.0<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/modelVersion<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></li><li>	<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;groupId<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>com.b2w<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/groupId<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></li><li>	<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;artifactId<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>ControleOrcamento<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/artifactId<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></li><li>	<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;packaging<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>pom<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/packaging<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></li><li>	<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;version<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>1.0<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/version<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></li><li>	<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;name<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>ControleOrcamento Project<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/name<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>	</li><li>&nbsp;</li><li>	<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;properties<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></li><li>		<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;packageName<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>ControleOrcamento<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/packageName<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></li><li>		<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;packageDirectory<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>package<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/packageDirectory<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></li><li>		<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;packageExtension<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>exp<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/packageExtension<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>		</li><li>	<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/properties<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></li><li>&nbsp;</li><li>	<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;build<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></li><li>	&nbsp;&nbsp; 	<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;plugins<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></li><li>	&nbsp;&nbsp; 		<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;plugin<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></li><li>				<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;artifactId<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>maven-assembly-plugin<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/artifactId<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></li><li>				<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;executions<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></li><li>					<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;execution<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></li><li>						<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;id<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>assemble-zip<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/id<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></li><li>						<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;phase<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>install<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/phase<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></li><li>						<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;goals<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></li><li>							<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;goal<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>attached<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/goal<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></li><li>						<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/goals<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></li><li>					<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/execution<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></li><li>				<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/executions<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></li><li>				<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;configuration<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;appendAssemblyId<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>false<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/appendAssemblyId<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>&nbsp;&nbsp; </li><li>					<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;finalName<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>${packageName}<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/finalName<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </li><li>					<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;descriptors<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></li><li>						<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;descriptor<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>assembly-descriptor.xml<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/descriptor<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></li><li>					<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/descriptors<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></li><li>				<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/configuration<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></li><li>			<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/plugin<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;		<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;plugin<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></li><li>				<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;groupId<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>org.apache.maven.plugins<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/groupId<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></li><li>				<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;artifactId<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>maven-antrun-plugin<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/artifactId<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></li><li>				<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;executions<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>									</li><li>					<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;execution<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></li><li>						<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;id<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>rename-package<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/id<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></li><li>						<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;phase<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>install<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/phase<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></li><li>						<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;configuration<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></li><li>							<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;tasks<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></li><li>								<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;property</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;package_name&quot;</span> <span style="color: #000066;">value</span>=<span style="color: #ff0000;">&quot;${packageName}&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span><span style="color: #000000; font-weight: bold;">&lt;/property<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></li><li>								<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;property</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;package_extension&quot;</span> <span style="color: #000066;">value</span>=<span style="color: #ff0000;">&quot;${packageExtension}&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span><span style="color: #000000; font-weight: bold;">&lt;/property<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></li><li>								<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;property</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;package_directory&quot;</span> <span style="color: #000066;">value</span>=<span style="color: #ff0000;">&quot;${packageDirectory}&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span><span style="color: #000000; font-weight: bold;">&lt;/property<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></li><li>								<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;ant</span> <span style="color: #000066;">antfile</span>=<span style="color: #ff0000;">&quot;maven-setup.xml&quot;</span> <span style="color: #000000; font-weight: bold;">&gt;</span><span style="color: #000000; font-weight: bold;">&lt;/ant<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></li><li>							<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/tasks<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>							</li><li>						<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/configuration<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></li><li>						<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;goals<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></li><li>							<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;goal<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>run<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/goal<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></li><li>						<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/goals<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></li><li>					<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/execution<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>					</li><li>				<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/executions<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></li><li>			<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/plugin<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></li><li>	&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/plugins<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></li><li>	<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/build<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>&nbsp;&nbsp;	</li><li>&nbsp;</li><li>	<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;repositories<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></li><li>		<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;repository<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></li><li>			<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;id<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>default<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/id<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></li><li>			<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;name<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>Internal<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/name<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></li><li>			<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;url<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>http://intranet/archiva/repository/internal<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/url<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></li><li>		<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/repository<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></li><li>		<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;repository<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></li><li>			<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;id<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>ideais<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/id<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></li><li>			<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;name<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>Ideais<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/name<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></li><li>			<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;url<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>http://intranet/archiva/repository/ideais<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/url<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></li><li>		<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/repository<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></li><li>		<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;repository<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></li><li>			<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;id<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>thirdparty<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/id<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></li><li>			<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;name<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>Thirdparty Artifacts<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/name<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></li><li>			<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;url<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>http://intranet/archiva/repository/thirdparty<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/url<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></li><li>		<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/repository<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>	</li><li>	<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/repositories<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></li><li>&nbsp;</li><li><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/project<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></li></ol></div></pre><!--END_DEVFMTCODE--></p>
<p>A idéia aqui não estar explicando o que é um POM, sua estrutura, como funciona, etc, a idéia é apenas mostrar como criar um POM com o intuito de gerar pacotes do ALBPM.</p>
<h3>Explicando o POM utilizado</h3>
<p>No começo do nosso POM temos algumas informações obrigatórias que o Maven exige, portanto acho que não vale a pena citá-las, dessa forma partindo para a declaração das propriedades (
<properties></properties>), nós temos:</p>
<p>packageName &#8211; Nome do diretório da aplicação<br />
packageDirectory &#8211; Diretório onde deverá ser gerado o pacote<br />
packageExtension &#8211; Extensão do pacote a ser gerado</p>
<p>Na parte da declaração de plugins, nós declaramos os dois plugins que utilizaremos: maven-assembly-plugin (será o responsável por gerar o arquivo compactado, excluir os diretórios não desejados, etc) e maven-antrun-plugin (será o responsável por fazer algumas tarefas pontuais como renomear o arquivo compactado e deletar os diretórios não utilizados e que são gerados pelo plugin anterior).</p>
<p>No caso do plugin maven-assembly-plugin, associamos ainda um descriptor, que é um arquivo XML que contém todas as rotinas que esse plugin deverá executar e que possui o seguinte conteúdo:</p>
<p><!--DEVFMTCODE--><pre class="devcodeblock" title="XML"><div class="devcodeoverflow"><ol><li><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;assembly<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></li><li>	<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;formats<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></li><li>		<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;format<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>zip<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/format<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></li><li>	<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/formats<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></li><li>	<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;includeBaseDirectory<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>false<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/includeBaseDirectory<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>	</li><li>	<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;fileSets<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></li><li>		<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;fileSet<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></li><li>			<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;directory<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>${basedir}/${packageName}<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/directory<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>		&nbsp;&nbsp;			&nbsp;&nbsp;	</li><li>			<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;filtered<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>true<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/filtered<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>			</li><li>		&nbsp;&nbsp;	<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;excludes<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>		&nbsp;&nbsp;		</li><li>				<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;exclude<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>**/.svn/**<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/exclude<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></li><li>				<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;exclude<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>**/fuego.portal.jar/**<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/exclude<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></li><li>				<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;exclude<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>**/build/**<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/exclude<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></li><li>				<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;exclude<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>**/system/**<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/exclude<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></li><li>		&nbsp;&nbsp;	<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/excludes<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>		&nbsp;&nbsp;	</li><li>		<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/fileSet<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></li><li>	<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/fileSets<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>	</li><li><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/assembly<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></li></ol></div></pre><!--END_DEVFMTCODE--></p>
<p>No conteúdo acima, especificamos no elemento<br />
<formats> o formato do arquivo a ser gerado, no caso um zip. No elemento <includeBaseDirectory> informamos ao plugin que não queremos que ele inclua o diretório base no arquivo zip a ser gerado. No elemento <fileSets> definimos uma série de regras que o arquivo a ser zipado deverá obedecer: no primeiro elemento (<directory>) informamos qual diretório deverá ser zipado, repare que nesse caso usamos os valores das propriedades definido no arquivo POM do Maven. No segundo elemento, no caso <filtered>, informamos que NÃO queremos que o plugin inclua os diretórios que não possuem arquivos, ou seja, não queremos diretórios em branco. No terceiro elemento (<excludes>), informamos ao plugin quais são os diretórios e arquivos que NÃO devem ser incluídos no arquivo zip a ser gerado, nesse caso não queremos incluir nenhum diretório/arquivo do SVN, não queremos incluir o JAR fuego.portal, assim como não queremos incluir os diretórios build e system, pois eles são gerados pela IDE em tempo de compilação e não são necessários para nosso pacote.</p>
<h3>Explicando o arquivo Ant</h3>
<p>No nosso POM, declaramos o plugin maven-antrun-plugin, que será o plugin responsável por executar tasks do Ant.</p>
<p>Ainda no arquivo POM, definimos algumas propriedades que o arquivo Ant deverá conhecer, ou seja, ele irá herdar as propriedades que definimos no POM, bem como definimos qual é o arquivo XML que conterá as taks do Ant a serem executadas, no nosso caso esse arquivo é o maven-setup.xml.</p>
<p>O arquivo maven-setup.xml conterá duas rotinas: uma que é renomear o zip gerado, para ao invés de possuir a extensão .zip, possuir a extensão .exp (propriedade definida no POM e herdada no arquivo Ant), e outra rotina deverá ser remover o diretório target, que é gerado pelo maven-assembly-plugin e que no nosso caso não teria nenhuma utilidade. Dessa forma o conteúdo do nosso arquivo Ant ficou assim:</p>
<p><!--DEVFMTCODE--><pre class="devcodeblock" title="XML"><div class="devcodeoverflow"><ol><li><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;?xml</span> <span style="color: #000066;">version</span>=<span style="color: #ff0000;">&quot;1.0&quot;</span> <span style="color: #000066;">encoding</span>=<span style="color: #ff0000;">&quot;UTF-8&quot;</span><span style="color: #000000; font-weight: bold;">?&gt;</span></span></li><li><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;project</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;mavensetup&quot;</span> <span style="color: #000066;">default</span>=<span style="color: #ff0000;">&quot;setup&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span></li><li>	<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;target</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;setup&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span></li><li>			<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;echo</span> <span style="color: #000066;">level</span>=<span style="color: #ff0000;">&quot;info&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>Renomeando o pacote para ${package_name}.${package_extension}<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/echo<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></li><li>		&nbsp;&nbsp;	<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;move</span> <span style="color: #000066;">file</span>=<span style="color: #ff0000;">&quot;target/${package_name}.zip&quot;</span> <span style="color: #000066;">tofile</span>=<span style="color: #ff0000;">&quot;${package_directory}/${package_name}.${package_extension}&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span><span style="color: #000000; font-weight: bold;">&lt;/move<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></li><li>		&nbsp;&nbsp;	<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;echo</span> <span style="color: #000066;">level</span>=<span style="color: #ff0000;">&quot;info&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>Apagando o diretorio /target<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/echo<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></li><li>		&nbsp;&nbsp;	<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;delete</span> <span style="color: #000066;">dir</span>=<span style="color: #ff0000;">&quot;target&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span><span style="color: #000000; font-weight: bold;">&lt;/delete<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></li><li>&nbsp;&nbsp;	<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/target<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></li><li><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/project<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></li></ol></div></pre><!--END_DEVFMTCODE--></p>
<p>Repare, que no arquivo Ant usamos as propriedades definidas no nosso POM do Maven e usamos ainda o elemento <echo> para termos informação do que o Ant está fazendo.</p>
<h3>Resumindo</h3>
<p>Usando apenas 3 arquivos (pom.xml, assembly-descriptor.xml, maven-setup.xml) nós temos nosso pacote do ALBPM sendo gerado pelo Maven e pronto para ser deployado na versão enterprise do ALBPM.</p>
<p>Agora basta apenas um <em>mvn install</em> na linha de comando para geração do pacote.</p>
<h3>Mais informações</h3>
<p><a href="http://victor.hogemann.eti.br/2009/07/comecando-com-o-maven.html" class="broken_link"  target="_blank" style="text-decoration: underline">Começando com o Maven</a></p>
<p><a href="http://maven.apache.org/plugins/maven-assembly-plugin/" target="_blank" style="text-decoration: underline">Maven Assembly Plugin</a></p>
<p><a href="http://maven.apache.org/plugins/maven-antrun-plugin/" target="_blank" style="text-decoration: underline">Maven AntRun Plugin</a></p>
<p><a href="http://maven.apache.org/guides/introduction/introduction-to-the-lifecycle.html" target="_blank" style="text-decoration: underline">Maven Lifecycle</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.marcuscavalcanti.net/blog/2009/11/30/gerando-pacotes-do-albpm-com-maven-e-ant/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Entendendo como funciona a arquitetura do Weblogic Server em ambientes clusterizados</title>
		<link>http://www.marcuscavalcanti.net/blog/2009/11/24/entendendo-como-funciona-a-arquitetura-do-weblogic-server-em-ambientes-clusterizados/</link>
		<comments>http://www.marcuscavalcanti.net/blog/2009/11/24/entendendo-como-funciona-a-arquitetura-do-weblogic-server-em-ambientes-clusterizados/#comments</comments>
		<pubDate>Tue, 24 Nov 2009 16:50:07 +0000</pubDate>
		<dc:creator>Marcus Cavalcanti</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Cluster]]></category>
		<category><![CDATA[Clustering]]></category>
		<category><![CDATA[Managed Server]]></category>
		<category><![CDATA[Node Manager]]></category>
		<category><![CDATA[Weblogic]]></category>
		<category><![CDATA[Weblogic Domain]]></category>
		<category><![CDATA[Weblogic Server]]></category>

		<guid isPermaLink="false">http://www.marcuscavalcanti.net/blog/?p=1231</guid>
		<description><![CDATA[Antes de mais nada, gostaria de ressaltar que esse post não tem o intuito de ensinar ou mostrar o passo-a-passo para a criação de um ambiente clusterizado com o Weblogic Server, na verdade o intuito é mostrar como é e como funciona essa arquitetura, usando um exemplo prático criado para esse propósito específico. Para criação [...]]]></description>
			<content:encoded><![CDATA[<p>Antes de mais nada, gostaria de ressaltar que esse post não tem o intuito de ensinar ou mostrar o passo-a-passo para a criação de um ambiente clusterizado com o <a href="http://pt.wikipedia.org/wiki/BEA_Weblogic_Server" target="_blank" style="text-decoration: underline">Weblogic Server</a>, na verdade o intuito é mostrar como é e como funciona essa arquitetura, usando um exemplo prático criado para esse propósito específico. Para criação e configuração de um ambiente clusterizado, indico a <a href="http://www.oracle.com/technology/documentation/bea.html" target="_blank" style="text-decoration: underline">documentação da Oracle/BEA</a>, na qual estarei citando os links ao final do post.</p>
<h3>Domínio</h3>
<p>Quando trabalhamos em um ambiente de desenvolvimento, basicamente o que temos que nos preocupar é referente a criação de um domínio. Um domínio nada mais é que um conjunto de recursos e serviços que fisicamente são mantidos através de arquivos.</p>
<p>A parte principal de um domínio chama-se Administration Server, que é uma instância de um Weblogic Server responsável por manter e configurar seus recursos. Todo esse gerenciamento do Adminstration Server é feito através do Admin Console, que por sua vez é uma aplicação que é deployada no seu Administration Server e que será responsável por fornecer uma interface gráfica para que você possa gerenciar seu domínio, ou seja, toda a configuração feita pelo Admin Console é baseada em XML e é ele quem gerencia esses arquivos.</p>
<p>É através do Administration Server que você faz o <em>deploy/undeploy</em> das suas aplicações, porém em um ambiente de produção, ou até mesmo de homologação, o mais indicado é que tenhamos nossas aplicações em um servidor a parte, que são chamados de Managed Servers.</p>
<h3>Managed Servers</h3>
<p>Uma instância de um Weblogic Server, que não é uma instância do Administration Server, é chamada de Managed Server, é no Managed Server onde suas aplicações e recursos serão deployados de fato, deixando para o Administration Server apenas a responsabilidade de gerenciá-los.</p>
<p>São os Managed Servers que hospedam todos os componentes e recursos que constituem uma aplicação, e toda vez que um Managed Server é inicializado, ele se conecta com o Administration Server para obter informações de configuração e <em>deployment</em>.</p>
<h3>Cluster. O quê é e por quê usar?</h3>
<p>Em ambientes de produção é normal que existam certas preocupações que não ocorrem com ambientes de desenvolvimento, como alta disponibilidade das aplicações e balanceamento de carga.</p>
<p>Imagine que ocorra qualquer problema na máquina onde a sua aplicação está deployada? O quê fazer? Para não ficar a mercê desse tipo de problema, o correto é pensar em uma estrutura em que sua aplicação possa ser replicada em N instância de servidores em máquinas diferentes, onde caso uma máquina dê problema, a outra assume e assim sucessivamente.</p>
<p>Outro problema comum é a sobrecarga de uma aplicação. Um cenário normal em aplicações web é o acesso de muitos usuários e consequentemente o processamento a exaustão das máquinas onde essas aplicações estão deployadas, isso por muitas vezes pode ocasionar um estouro de processamento ou até mesmo um tempo de resposta maior para o usuário. E como fazer para resolver esse problema? A resposta é através do balanceamento de carga.</p>
<p>Para resolver esses tipos de problemas foi criada uma estrutura cuja o nome é Cluster. Um Cluster é um conjuto de computadores que trabalham de forma conjunta cujo objetivo é fazer com que todo o processamento da aplicação seja distribuído a N computadores, mas de forma que pareça com que eles sejam um computador só.</p>
<h3>Cluster e Managed Servers</h3>
<p>Um Cluster de Weblogic Server corresponde a múltiplas instância de Weblogic Server que estão trabalhando e ﻿rodando simultaneamente com o objetivo de prover escalabilidade e disponibilidade.</p>
<p>Ou seja, um Cluster é um conjunto de Managed Servers, e cada Managed Server representa um nó de um cluster.</p>
<p>Quando se pensa em uma arquitetura usando Clusters, é normal que se pense em mais de uma máquina, afinal não faz muito sentido ter um Cluster com uma máquina, pois caso essa máquina pare de funcionar, todas as aplicações também irão parar.</p>
<h3>A relação Managed Servers, Machines e Domínio</h3>
<p>Partindo do princípio que um Cluster deve necessariamente ter mais de uma máquina, chegamos ao conceito de &#8220;Machines&#8221; do Weblogic Server.</p>
<p>Uma &#8220;machine&#8221; é exatamente uma máquina, um computador físico, e essa máquina pode ter mais de um managed server, ou seja, pode ter mais de uma instância do Weblogic Server rodando ao mesmo tempo. É óbvio que nesse caso teríamos que ter essas duas instâncias rodando em portas diferentes.</p>
<p>Dessa forma, chegamos a seguinte associação: Domínio -> Administration Server -> Cluster -> Machine -> Managed Server.</p>
<h3>Node Manager</h3>
<p>Quando falamos a nível de máquina (machine), devemos falar também dos Node Managers. Um Node Manager não está associado a um domínio, está associado a uma máquina, já que uma máquina pode ter mais de um Managed Server.</p>
<p>Um Node Manager é uma aplicação standalone responsável por gerenciar Managed Servers em uma máquina (machine) remota. Através do Node Manager é possível inicializar, parar e re-startar instâncias do Administration Server e dos Managed Servers de uma máquina remota.</p>
<h3>Multi-cast Address</h3>
<p>Em um ambiente clusterizado, precisamos ter N computadores trabalhando de forma conjunta de forma que isso seja transparente, mas quando usamos recursos como sessões, ou até mesmo conexões distribuídas, precisamos que isso também seja feito de forma distribuída, sem que seja necessário por exemplo criar uma sessão para cada Managed Server.</p>
<p>Isso é feito através do multi-cast address, que é um IP associado a um cluster, que por sua vez irá informar esse IP para seus Managed Servers para que os mesmos possam usar um único IP para fazer esse tipo de compartilhamento.</p>
<h3>Juntando tudo</h3>
<p>Para dar uma visão mais clara de toda essa arquitetura e quem está associado a o que, resolvi criar um diagrama que mostra todos os elementos citados acima e associação/relação entre eles.</p>
<p>No exemplo usei ainda o <a href="http://httpd.apache.org/" target="_blank" style="text-decoration: underline">Apache</a> como Servidor Web, que será a porta de entrada de tudo, será ele que irá receber as requisições HTTP, fazer o balanceamento de carga e delegar as responsabilidades para os Managed Servers. Será o Apache ainda o responsável por identificar e servir conteúdo estático sem que seja necessário passar pelo Cluster.</p>
<h3>Diagrama</h3>
<div class="wp-caption alignnone" style="width: 160px"><a href="http://img99.imageshack.us/img99/6514/weblogicserverarchitect.jpg" target="_blank"><img alt="clique para ampliar" src="http://img99.imageshack.us/img99/6514/weblogicserverarchitect.th.jpg" title="Weblogic Server Architecture" width="150" height="111" border="0" /></a><p class="wp-caption-text">clique para ampliar</p></div>
<h3>Mais Informações</h3>
<p><strong>Weblogic Server</strong><br />
<a href="http://download.oracle.com/docs/cd/E13222_01/wls/docs92/admin.html" target="_blank" style="text-decoration: underline">http://download.oracle.com/docs/cd/E13222_01/wls/docs92/admin.html</a></p>
<p><strong>Understanding Cluster Configuration </strong><br />
<a href="http://download.oracle.com/docs/cd/E12840_01/wls/docs103/cluster/config.html" target="_blank" style="text-decoration: underline">http://download.oracle.com/docs/cd/E12840_01/wls/docs103/cluster/config.html</a></p>
<p><strong>Understanding Weblogic Server Clustering</strong><br />
<a href="http://download.oracle.com/docs/cd/E13222_01/wls/docs92/cluster/overview.html" target="_blank" style="text-decoration: underline">http://download.oracle.com/docs/cd/E13222_01/wls/docs92/cluster/overview.html</a></p>
<p><strong>Setting Up Weblogic Cluster</strong><br />
<a href="http://download.oracle.com/docs/cd/E12840_01/wls/docs103/cluster/setup.html" target="_blank" style="text-decoration: underline">http://download.oracle.com/docs/cd/E12840_01/wls/docs103/cluster/setup.html</a></p>
<p><strong>Using Node Manager</strong><br />
<a href="http://download.oracle.com/docs/cd/E13222_01/wls/docs92/server_start/nodemgr.html" target="_blank" style="text-decoration: underline">http://download.oracle.com/docs/cd/E13222_01/wls/docs92/server_start/nodemgr.html</a></p>
<p><strong>Node Manager Architecture</strong><br />
<a href="http://download.oracle.com/docs/cd/E13222_01/wls/docs81b/adminguide/nodemgr.html" target="_blank" style="text-decoration: underline">http://download.oracle.com/docs/cd/E13222_01/wls/docs81b/adminguide/nodemgr.html</a></p>
<p><strong>Configure Apache HTTP Server</strong><br />
<a href="http://download.oracle.com/docs/cd/E15051_01/wls/docs103/plugins/apache.html" target="_blank" style="text-decoration: underline">http://download.oracle.com/docs/cd/E15051_01/wls/docs103/plugins/apache.html</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.marcuscavalcanti.net/blog/2009/11/24/entendendo-como-funciona-a-arquitetura-do-weblogic-server-em-ambientes-clusterizados/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Dica rápida: recuperando um domínio corrompido no Weblogic</title>
		<link>http://www.marcuscavalcanti.net/blog/2009/11/11/dica-rapida-recuperando-um-dominio-corrompido-no-weblogic/</link>
		<comments>http://www.marcuscavalcanti.net/blog/2009/11/11/dica-rapida-recuperando-um-dominio-corrompido-no-weblogic/#comments</comments>
		<pubDate>Wed, 11 Nov 2009 16:54:03 +0000</pubDate>
		<dc:creator>Marcus Cavalcanti</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Abruptly]]></category>
		<category><![CDATA[Corrompido]]></category>
		<category><![CDATA[Domain]]></category>
		<category><![CDATA[Start]]></category>
		<category><![CDATA[Weblogic]]></category>
		<category><![CDATA[Workshop]]></category>

		<guid isPermaLink="false">http://www.marcuscavalcanti.net/blog/?p=1211</guid>
		<description><![CDATA[Essa é uma dica rápida para quem trabalha com aplicações em cima do Weblogic.
Um domínio Weblogic pode ser corrompido por diversos motivos, como: domínio ser encerrado de forma forçada ( com um kill -9, por exemplo), máquina ser desligada de forma repentina, falta de luz, etc. Quando isso acontece, seu domínio que estava rodando pode [...]]]></description>
			<content:encoded><![CDATA[<p>Essa é uma dica rápida para quem trabalha com aplicações em cima do Weblogic.</p>
<p>Um domínio Weblogic pode ser corrompido por diversos motivos, como: domínio ser encerrado de forma forçada ( com um <em>kill -9</em>, por exemplo), máquina ser desligada de forma repentina, falta de luz, etc. Quando isso acontece, seu domínio que estava rodando pode ser corrompido, e com isso a seguinte mensagem é retornada ao tentar iniciá-lo novamente:</p>
<p><!--DEVFMTCODE--><pre class="devcodeblock" title="Text"><div class="devcodeoverflow"><ol><li>Server cannot be started.&nbsp;&nbsp; The server process cannot be started, or terminated abruptly. Check the start script.</li></ol></div></pre><!--END_DEVFMTCODE--></p>
<p>Para resolver isso é muito simples, basta remover todas as pastas <strong>build</strong> pré-existentes (são geradas automaticamente pela seu Workshop, quando a aplicação é compilada) e em seguida basta fazer um <em>start</em> do seu domínio novamente.</p>
<p>Outra dica, é que antes de tentar fazer o <em>deploy</em> das aplicações em cima desse domínio novamente, que antes faça um <em>undeploy</em> (usando o <em>console</em>) das mesmas, pois se o domínio foi encerrado de forma forçada, as aplicações ainda estarão lá deployadas e caso você tente novamente, provavelmente não conseguirá.</p>
<p>Procurei sobre isso nos forums da Oracle e não achei nada, então fica aí a dica, pois isso evita que você tenha que re-criar e configurar seu domínio novamente.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.marcuscavalcanti.net/blog/2009/11/11/dica-rapida-recuperando-um-dominio-corrompido-no-weblogic/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Existe SOA sem BPM?</title>
		<link>http://www.marcuscavalcanti.net/blog/2009/10/14/existe-soa-sem-bpm/</link>
		<comments>http://www.marcuscavalcanti.net/blog/2009/10/14/existe-soa-sem-bpm/#comments</comments>
		<pubDate>Wed, 14 Oct 2009 15:35:11 +0000</pubDate>
		<dc:creator>Marcus Cavalcanti</dc:creator>
				<category><![CDATA[BPM]]></category>
		<category><![CDATA[SOA]]></category>
		<category><![CDATA[BAM]]></category>
		<category><![CDATA[BPEL]]></category>
		<category><![CDATA[BPMN]]></category>
		<category><![CDATA[Business Process]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[TI]]></category>

		<guid isPermaLink="false">http://www.marcuscavalcanti.net/blog/?p=1199</guid>
		<description><![CDATA[Recentemente fiz uma apresentação sobre BPM na empresa onde eu trabalho e o meu foco foi explicar o que são processos de negócio, o que é BPM e para que serve, quais são seus benefícios, além de mostrar todo o suporte que BPM dá para uma organização migrar e utilizar SOA, que é exatamente sobre [...]]]></description>
			<content:encoded><![CDATA[<p>Recentemente fiz uma apresentação sobre BPM na empresa onde eu trabalho e o meu foco foi explicar o que são processos de negócio, o que é BPM e para que serve, quais são seus benefícios, além de mostrar todo o suporte que BPM dá para uma organização migrar e utilizar SOA, que é exatamente sobre o que eu vou falar neste tópico.</p>
<p>BPM pode muito bem existir sem SOA, já que BPM é uma modalidade que foca na aplicação de práticas e conceitos para melhoria e absorção de processos de negócios por parte de uma organização, mas e SOA, pode existir sem BPM?</p>
<p>SOA é um modelo arquitetural de construção de <em>software</em> que possui alguns pilares, dentre eles:<br />
<br/></p>
<ul>
<li>Interoperabilidade</li>
<li>Flexibilidade e agilidade a mudanças</li>
<li>Alinhamento entre TI e negócio</li>
<li>Redução de custos</li>
<li>Exposição no formato de serviços das principais atividades/operações da empresa</li>
<li>Reutilização e re-aproveitamento</li>
<li>Baixo acoplamento</li>
</ul>
<p>Dentre os pilares citados acima, é fácil perceber que SOA gera valores semelhantes ao que aplicação adequada de uma solução BPM geraria, entretanto BPM não é uma maneira de se construir <em>software</em>, BPM está muito além disso, está no topo, mas deve atuar lado-a-lado a SOA para produzir resultados mais duráveis, que gerem mais valor ao negócio, que sejam mais fáceis de manterem e de darem manutenção. E o somatório disso tudo proporciona resultados mais efetivos.</p>
<p>Certa vez li uma analogia sobre uso de SOA sem BPM e que de certa forma ajuda a esclarecer a importância da aplicação de BPM junto a SOA. Era mais ou menos assim: &#8220;Usar SOA sem BPM seria como um malabarista com uma mão atada atrás das costas. Ele poderia ainda fazer alguns malabarismos, mas não seria tão eficaz e nem tão rápido como poderia ser&#8221;.</p>
<h3>E na prática como BPM complementa SOA?</h3>
<p>Um dos pilares citados em uma arquitetura SOA é a possibilidade do alinhamento entre TI e negócio, e BPM ajudaria isso de forma efetiva através de uma notação para mapeamento de processos, no caso BPMN. Existe forma mais efetiva do que representar ações no formato de desenhos e diagramas? Dessa forma analistas de negócio e analistas de processos conseguem trabalhar juntos com times de TI na implantação e implementação de uma arquitetura SOA, onde através do mapeamento dos processos de negócio, conseguiriam identificar serviços que agreguem e tenham importância para o negócio de uma organização, identificando assim a necessidade de implementá-los.</p>
<p>Em relação a possibilidade de mudanças, BPM oferece todo suporte e facilidade para mudanças através da visão holística que o mapeamento de um processo de negócio proporciona, dando a possibilidade de visualização de papéis, atividades, setores, departamentos e parceiros de uma organização, ou seja, todos os <em>stakeholders</em>, além do conhecimento de todo fluxo da informação.</p>
<p>Do ponto de vista da automatização de processos de negócio, através dos <em>softwares</em> BPMS, BPM oferece adaptadores e conectores para realizar a integração entre sistemas legados através da exposição de serviços e atuando na composição e orquestração desses serviços, BPM proporciona uma &#8220;API visual&#8221; de toda as integrações e uma facilidade maior de manutenção e mudança.</p>
<h3>BPM no topo de uma arquitetura SOA</h3>
<p>BPM deve atuar no topo de uma arquitetura orientada a serviços, pois uma arquitetura SOA deve focar de ponta-a-ponta no negócio, e dessa forma BPM atuaria do ínicio ao fim em uma arquitetura SOA.</p>
<p>BPM proporciona o melhor uso de serviços de negócio oferecidos por SOA gerenciando a relação entre eles sob o ponto de vista de processos de negócio.</p>
<h3>BPM ajuda na Governança de SOA</h3>
<p>Numa arquitetura SOA, consumidores e fornecedores de serviço são executados em diferentes processos de negócio, são desenvolvidos e gerenciados por diferentes departamentos e exigem um grande número de coordenação para trabalhar juntos com sucesso.</p>
<p>Para SOA ter êxito, múltiplas aplicações precisam compartilhar serviços comuns, o que significa que eles precisam ser coordenados para tornarem estes serviços comuns e reutilizáveis (olha o BPM aí!). Estes são os problemas de governança e eles são muito mais complexos do que problemas de aplicações monolíticas ou mesmo problemas de componentes e códigos reutilizáveis.</p>
<h3>Exemplo real</h3>
<p>Fiz um rascunho simples de uma arquitetura em camadas que utiliza BPM, SOA e BPEL e que estará exemplificada logo abaixo. O processo é para um banco e o intuito é fornecer o empréstimo de uma quantia em dinheiro para um cliente, que no caso é quem faz essa solicitação. Tudo começa e termina no BPM, que atua como um orquestrador de serviços.</p>
<p>Nesse exemplo temos serviços em um nível mais baixo, que no caso são serviços expostos por sistemas de terceiros, módulos de ERP, CRM, etc. Temos nível intermediário com um processo de negócio BPEL que faz a composição de alguns serviços presentes no nível mais baixo e no topo de tudo temos o BPM orquestrando todos os serviços e controlando todo o processo.</p>
<p><div class="wp-caption aligncenter" style="width: 330px"><a href="http://img70.imageshack.us/img70/586/bpmsoabpela.png" target="_blank" border="0"><img alt="Diagrama de uma arquitetura SOA com BPM" src="http://img70.imageshack.us/img70/2392/bpmsoabpel.png" title="Diagrama de uma arquitetura SOA com BPM" width="320" height="222" /></a><p class="wp-caption-text">clique para ampliar</p></div><br />
Para finalizar, é importante ressaltar que através do uso de BPM e de BPMS, é possível definir métricas e indicadores, comos os <a href="http://pt.wikipedia.org/wiki/KPI" target="_blank" style="text-decoration: underline">KPI&#8217;s</a> (<em>Key Performance Indicators</em>) e utilizar ferramentas que dão todo suporte para acompanhamento de nossos processos de negócio, como as ferramentas de <a href="http://en.wikipedia.org/wiki/Business_activity_monitoring" target="_blank" style="text-decoration: underline">BAM</a>, onde o intuito seria fornecer relatórios em tempo real que podem servir como caráter estratégico e  para tomadas de decisão, além também da possibilidade de usar as informações geradas para alimentar ferramentas de <a href="http://pt.wikipedia.org/wiki/Business_intelligence" target="_blank" style="text-decoration: underline">BI</a> (<em>Business Inteligence</em>) e consequentemente obter resultados mais completos para a organização.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.marcuscavalcanti.net/blog/2009/10/14/existe-soa-sem-bpm/feed/</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
		<item>
		<title>Usando PAPI para criar e recuperar instância de processos no ALBPM/OracleBPM</title>
		<link>http://www.marcuscavalcanti.net/blog/2009/09/02/usando-papi-para-criar-e-recuperar-instancia-de-processos-no-albpmoraclebpm/</link>
		<comments>http://www.marcuscavalcanti.net/blog/2009/09/02/usando-papi-para-criar-e-recuperar-instancia-de-processos-no-albpmoraclebpm/#comments</comments>
		<pubDate>Wed, 02 Sep 2009 17:06:40 +0000</pubDate>
		<dc:creator>Marcus Cavalcanti</dc:creator>
				<category><![CDATA[BPM]]></category>
		<category><![CDATA[ALBPM]]></category>
		<category><![CDATA[BPMS]]></category>
		<category><![CDATA[OracleBPM]]></category>
		<category><![CDATA[PAPI]]></category>
		<category><![CDATA[PAPI-WS]]></category>
		<category><![CDATA[ProcessService]]></category>

		<guid isPermaLink="false">http://www.marcuscavalcanti.net/blog/?p=1144</guid>
		<description><![CDATA[O PAPI (Process API) é uma API do ALBPM/OracleBPM que permite que se possa interagir diretamente com a engine de execução de processos da ferramenta, e dentre outras coisas é possível: criar instâncias, recuperar instâncias, realizar buscas, abortar instâncias, enviar notificações, auditar uma instância, etc. 
Ou seja, é muito importante sabermos que essa API existe [...]]]></description>
			<content:encoded><![CDATA[<p>O <a href="http://download.oracle.com/docs/cd/E12483_01/albsi60/papi/index.html" style="text-decoration: underline" target="_blank">PAPI (<em>Process</em> API)</a> é uma API do ALBPM/OracleBPM que permite que se possa interagir diretamente com a <em>engine</em> de execução de processos da ferramenta, e dentre outras coisas é possível: criar instâncias, recuperar instâncias, realizar buscas, abortar instâncias, enviar notificações, auditar uma instância, etc. </p>
<p>Ou seja, é muito importante sabermos que essa API existe e principalmente sabermos como usá-la. Existem duas maneiras de usá-la: externa e internamente. Externamente isso pode ser feito usando o <a href="http://download.oracle.com/docs/cd/E12483_01/albsi60/papi/papi_ws/c_Head_PAPI_WS.html" style="text-decoration: underline" target="_blank">PAPI-WS</a>, que são serviços expostos pelo próprio ALBPM para que se possa usar o PAPI, porém um pouco limitado. Outra opção é usando a <a href="http://download.oracle.com/docs/cd/E12483_01/albsi60/papi/papi/c_Structure_of_a_Java_PAPI_Application.html" style="text-decoration: underline" target="_blank">JAVA API</a>, que é mais completa. Dentro do ALBPM usamos diretamente a Java API através do Catálogo de API&#8217;s da ferramenta.</p>
<h3>Criando e Recuperando Instâncias de Processos</h3>
<p>Fiz um exemplo de código bem simples no ALBPM para poder apresentar como criar instâncias e recuperar instâncias de processos. Seguem os dois exemplos com os respectivos comentários:</p>
<p><strong>Criando Instâncias</strong><br />
Para criar instâncias é muito simples, basta usarmos o método create da API ProcessInstance, passando como parâmetros o ID do processo (sempre com &#8220;/&#8221; na frente), os argumentos de incialização (caso existam), e o nome do método de inicialização, que pode ser visto através da opção &#8220;<em>argument mapping</em>&#8221; do evento de inicialização. Segue o código:</p>
<p><!--DEVFMTCODE--><pre class="devcodeblock" title="Java"><div class="devcodeoverflow"><ol><li></li><li><a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #003399;">String</span></a> processCreateResult <span style="color: #339933;">=</span> create<span style="color: #009900;">&#40;</span>processId <span style="color: #339933;">:</span> <span style="color: #0000ff;">&quot;/Teste&quot;</span>, arguments <span style="color: #339933;">:</span> <span style="color: #000066; font-weight: bold;">null</span>, argumentsSetName <span style="color: #339933;">:</span> <span style="color: #0000ff;">&quot;BeginIn&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></li><li></li></ol></div></pre><!--END_DEVFMTCODE--></p>
<p><strong>Recuperando Instâncias</strong><br />
Para recuperar instâncias também é muito simples, mas devemos ter atenção com a autenticação no DirectoryService onde o projeto correspondente a instância a ser recuperada está <em>deployado</em>.</p>
<p>Esse passo é necessário, pois para recuperar instâncias é usada outra API, no caso a API <a href="http://download.oracle.com/docs/cd/E13154_01/bpm/docs65/standard_components/Fuego/Papi/ProcessService/ProcessService_component.html"  style="text-decoration: underline" target="_blank">ProcessService</a> e para tal precisamos autenticar no DirectoryService antes de tentar recuperar a instância de fato.</p>
<p>Para autenticação no DirectoryService, usamos o método connectTo da API ProcessService, e esse método espera 3 parâmetros: A URL do DirectoryService (pode-se usar as constantes como no exemplo abaixo), o usuário e a senha. O usuário e a senha devem possuir a <em>role</em> onde a atividade de criação da instância está associada.</p>
<p><!--DEVFMTCODE--><pre class="devcodeblock" title="Java"><div class="devcodeoverflow"><ol><li></li><li><span style="color: #009900;">&#40;</span>ProcessService<span style="color: #009900;">&#41;</span>.<span style="color: #006633;">connectTo</span><span style="color: #009900;">&#40;</span>url <span style="color: #339933;">:</span> Fuego.<span style="color: #006633;">Server</span>.<span style="color: #006633;">directoryURL</span>, user <span style="color: #339933;">:</span> <span style="color: #0000ff;">&quot;tester&quot;</span>, password <span style="color: #339933;">:</span> <span style="color: #0000ff;">&quot;tester&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></li><li>businessProcess <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span>ProcessService<span style="color: #009900;">&#41;</span>.<span style="color: #006633;">getProcess</span><span style="color: #009900;">&#40;</span>process <span style="color: #339933;">:</span> <span style="color: #0000ff;">&quot;/Teste&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></li><li></li></ol></div></pre><!--END_DEVFMTCODE--></p>
<p>Agora para visualizar o resultado, basta o seguinte código:</p>
<p><!--DEVFMTCODE--><pre class="devcodeblock" title="Java"><div class="devcodeoverflow"><ol><li></li><li>logMessage<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;-------------------------------------------------------------------&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></li><li>logMessage<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Instância do Processo Criado: &quot;</span><span style="color: #339933;">+</span>processCreateResult<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></li><li>logMessage<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Referência da Instância Recuperada: &quot;</span><span style="color: #339933;">+</span>businessProcess<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></li><li>logMessage<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;-------------------------------------------------------------------&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></li><li></li></ol></div></pre><!--END_DEVFMTCODE--></p>
]]></content:encoded>
			<wfw:commentRss>http://www.marcuscavalcanti.net/blog/2009/09/02/usando-papi-para-criar-e-recuperar-instancia-de-processos-no-albpmoraclebpm/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Vivendo e aprendendo</title>
		<link>http://www.marcuscavalcanti.net/blog/2009/08/06/vivendo-e-aprendendo/</link>
		<comments>http://www.marcuscavalcanti.net/blog/2009/08/06/vivendo-e-aprendendo/#comments</comments>
		<pubDate>Thu, 06 Aug 2009 19:55:15 +0000</pubDate>
		<dc:creator>Marcus Cavalcanti</dc:creator>
				<category><![CDATA[Carreira & Profissão]]></category>

		<guid isPermaLink="false">http://www.marcuscavalcanti.net/blog/?p=1086</guid>
		<description><![CDATA[Eu acredito que um bom profissional, independente da profissão, sabe sempre que pode melhorar mais, sabe que pode chegar a um nível mais elevado que o seu atual e sabe principalmente que faltam ainda muitas coisas pra ele aprender e se aperfeiçoar. Não conhecer ou ter domínio sobre determinado assunto, não significa que não sejamos [...]]]></description>
			<content:encoded><![CDATA[<p>Eu acredito que um bom profissional, independente da profissão, sabe sempre que pode melhorar mais, sabe que pode chegar a um nível mais elevado que o seu atual e sabe principalmente que faltam ainda muitas coisas pra ele aprender e se aperfeiçoar. Não conhecer ou ter domínio sobre determinado assunto, não significa que não sejamos bons profissionais e que não sejamos competentes, afinal sempre existirá algo para se aprender. Não existe o ápice, o topo ou o nível máximo na carreira de um profissional, isso é uma utopia e quem acredita que chegou a tal nível, demonstra precisar aprender mais do que qualquer um.</p>
<p>Na minha opinião, para uma pessoa ser considerada um bom profissional ela precisa ter principalmente 3 características, são elas: estudo, experiência e o famoso pensamento &#8220;<em>out of the box</em>&#8220;.</p>
<p>É claro, que existem outros fatores não menos importantes, como: bom relacionamento inter-pessoal, ambição, humildade, caráter, etc, mas que não citei, pois acredito que isso já deveria ser parte do cidadão, da pessoa e se não somos bons cidadãos, boas pessoas, dificilmente seremos um bom profissional.</p>
<p>Voltando aos 3 tópicos citados acima, irei falar um pouco da minha percepção sobre cada um desses ítens e consequentemente o porque de eu considerá-los os mais valiosos.</p>
<h3>Estudo</h3>
<p>Desde que eu me entendo por gente, escuto que para &#8220;ser alguém na vida&#8221; eu deveria estudar muito, já que o mercado profissional é muito concorrido e blá blá blá.. aquele papo de sempre, chato, mas que não deixa de ser uma enorme verdade. Só que além de termos o desejo de ser um &#8220;profissional bem posicionado no mercado&#8221;, acredito ser mais importante estudarmos para entendermos o porque das coisas, para nos questionarmos, para questionarmos outras pessoas, para darmos outras idéias e consequentemente sairmos da inércia de um padrão estabelecido.</p>
<p>Estudar não significa só ir para escola e passar com nota boa, como também não significa só ir para faculdade e ter o melhor CR da turma, é óbvio que isso tudo é importante, mas há muitas coisas além disso. </p>
<p>Estudar significa ter interesse pelo que estamos lendo e pesquisando, significa termos curiosidade sobre o motivo de como as coisas funcionam, significa termos sempre aquela anseio por novos conhecimentos para irmos além. Estudar está diretamente ligado a nossa aptidão e gosto por determinado assunto, pois no meu modo de ver é impossível estudar e se interessar por algo em que não se tenha prazer. Quem nunca viu uma penca de pessoas estudando para um concurso durante anos e não sendo aprovada? Quem não conhece pessoas que foram muito mal na escola e que hoje são bons profissionais? Quem não conhece pessoas que não fizeram faculdade e hoje são bons profissionais? E finalmente, quem não conhece pessoas que são formadas em outra área e hoje são bons profissionais em outras? Eu já vi pessoas que se enquadram em todas essas situações.</p>
<p>Estudar também, nesse caso, é o contrário de acomodação, afinal quem estuda, lê e se informa, nunca está acomodado, está sempre por dentro das novidades, está sempre trocando e compartilhando conhecimento e consequemente desempenhando melhor a sua atividade profissional.</p>
<h3>Experiência</h3>
<p>Esse é um fator determinante para nos tornamos um bom profissional, quanto mais bagagem tivermos, mais fácil será prever alguns problemas, mais fácil será identificar problemas e mais fácil será criar soluções para os problemas.</p>
<p>Uma pessoa que está começando agora, com talento, interessada e esforçada, pode ser uma pessoa muito boa de se trabalhar, de fazer parte da sua equipe, mas ela só será considerada como um profissional completo (completo != topo), quando ela adquirir determinada experiência em sua área de atuação profissional. Por exemplo: existem bons médicos recém-formados, que estudaram, se especializaram e que lêem bastante, mas que provavelmente demorariam mais a associar alguns sintomas a determinada patalogia, que um médico, com as mesmas virtudes, mas com mais experiência, talvez identificasse mais rápido. Isso se chama experiência, bagagem.</p>
<p>Sendo específico no mercado de desenvolvimento de <em>software</em>: quem nunca viu aquele cara que trocou a versão de uma API usada em um projeto (que funcionava!) e passou a ter enormes problemas na aplicação? A intenção desse cara foi boa, com toda certeza, mas nesse caso lhe faltou experiência para saber que a nova versão da API pode impactar diretamente questões de ambiente e infra-estrutura. Provavelmente um profissional mais experiente, não mudaria a versão de uma API que já funcionava e era estável, por uma versão mais atual, só porque é mais atual, ele faria isso caso houvesse um BOM motivo.</p>
<p>Não tem jeito, se existem dois profissionais com o mesmo nível de estudo e de habilidade e técnica, o que tem mais experiência vai acabar se sobressaindo, pois esse saberá lhe dar com situações mais críticas, situações que exigem um tempo de resposta mais rápido e situações que exigem uma análise mais profunda para detecção do problema ou para bolar uma solução.</p>
<h3>Pensamento &#8220;<em>out of the box</em>&#8220;</h3>
<p>Pensar de uma maneira &#8220;<em><a href="http://searchcio.techtarget.com/sDefinition/0,,sid182_gci213466,00.html" target="_blank" style="text-decoration: underline">out of the box</a></em>&#8220;, significa pensar em uma maneira de fazer algo fora dos padrões pré-estabelecidos, que poucas ou nenhuma pessoa pensaria da mesma forma, é ser criativo e imaginativo para criar e enxergar uma solução para um problema existente, é conseguir enxergar pra frente e pros lados.</p>
<p>Existem determinadas situações onde um problema requer uma solução <em>&#8220;out of the box&#8221;</em>, na indústria de <em>software</em> existem muitos casos em que uma solução <em>&#8220;out of the box&#8221;</em> foi usada para resolver determinado problema ou para criar determinado produto. Certa vez assisti a uma palestra do <a href="http://gc.blog.br/" target="_blank" style="text-decoration: underline">Guilherme Chapiewski</a> onde ele (se eu não me engano) havia <a href="http://blog.twitter.com/2008/07/twitter-and-xmpp-drinking-from-fire.html" target="_blank" style="text-decoration: underline">pensado em uma maneira</a> de diminuir o tráfego (requests/responses) de comunicação do Twitter usando o protocolo <a href="http://xmpp.org/" target="_blank" style="text-decoration: underline">XMPP</a>, ao invés de apenas a sua API REST. Isso é pensar <em>out of the box</em>.</p>
<p>Não faltam exemplos sobre pensamentos &#8220;fora da caixa&#8221;, inclusive vários fora da indústria de <em>software</em>. Recentemente assisti um vídeo muito interessante sobre um projeto para o metrô de uma determinada cidade onde o trem não pararia. Esse vídeo pode ser visto <a href="http://inkdesigners.com/2008/07/04/pensando-out-of-the-box" target="_blank" style="text-decoration: underline">aqui</a>.</p>
<h3>Por que eu estou dizendo isso tudo?</h3>
<p>A idéia de publicar algo sobre o assunto surgiu essa semana, quando eu estava tentando resolver um problema pouco convencional reportado por um cliente. </p>
<p>Estamos dando suporte a algumas aplicações desenvolvidas por terceiros, portanto tudo fica mais difícil, e o erro reportado pelo cliente não conseguia ser reproduzido no meu ambiente de desenvolvimento, mas ao gerar um pacote para fazer o <em>deploy</em> no nosso ambiente de homologação interno, o mesmo erro que ocorria com o cliente, passou a ocorrer conosco. </p>
<p>O mais curioso é que o erro só acontecia em determinadas situações bem específicas MESMO, então toda possibilidade de identificação do erro ia por água baixo, pois não conseguiamos associar um erro ao outro, e a cada mudança nos valores das variáveis usadas para <em>input</em> no sistema, o erro não conseguia ser simulado novamente.</p>
<p>Até que um companheiro de trabalho começou a fazer perguntas que demonstravam toda sua experiência e um pensamento <em>&#8220;out of the box&#8221;</em> para enxergar o problema, eis o diálogo que tivemos:</p>
<p>- Qual arquitetura do SO do ambiente de desenvolvimento?<br />
- 32 bits<br />
- E de homologação?<br />
- 32 também<br />
- Qual JVM você tá usando em desenvolvimento?<br />
- A da Sun<br />
- E do ambiente de homologação é a da Sun também?<br />
- Humm, não, é JRockit<br />
- Experimenta mudar a do ambiente de homologação para Sun</p>
<p>Resumindo, mudei o ambiente de homologação para usar a JVM da Sun e o erro esquisito parou de ocorrer, a partir disso, conseguimos identificar que o problema estava ao realizar cálculos utilizando o tipo float, que não é o mais adequado para cálculos, mas que o código que já estava feito estava usando. O problema era no arredondamento do resultado do cálculo e de acordo com a arquitetura da JVM utilizada esse valor variava. Mudamos os tipos para BigDecimal e tiro e queda, problema resolvido, mesmo tendo JVM diferentes em ambientes diferentes.</p>
<p>O que se conclui é que o meu amigo teve uma sacada diferente para esse problema, conseguiu pensar de uma maneira &#8220;<em><strong>out of the box</strong></em>&#8221; e achar uma solução para o problema. Isso tudo baseado na sua <strong>experiência</strong> com <a href="http://pt.wikipedia.org/wiki/Linguagem_de_programa%C3%A7%C3%A3o_de_baixo_n%C3%ADvel" target="_blank" style="text-decoration: underline">linguagens de baixo nível</a>, que sem dúvida lhe deu embasamento para pensar na razão da problema. Sem <strong>estudar</strong>, ele também não conseguiria ter essa percepção do problema.</p>
<p>E para você, quais são as principais características que determinam um bom profissional?</p>
]]></content:encoded>
			<wfw:commentRss>http://www.marcuscavalcanti.net/blog/2009/08/06/vivendo-e-aprendendo/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>BPMS, workflow e legados</title>
		<link>http://www.marcuscavalcanti.net/blog/2009/07/09/bpms-workflow-e-legados/</link>
		<comments>http://www.marcuscavalcanti.net/blog/2009/07/09/bpms-workflow-e-legados/#comments</comments>
		<pubDate>Thu, 09 Jul 2009 04:15:51 +0000</pubDate>
		<dc:creator>Marcus Cavalcanti</dc:creator>
				<category><![CDATA[BPM]]></category>
		<category><![CDATA[Orquestração]]></category>
		<category><![CDATA[Processos]]></category>
		<category><![CDATA[Workflow]]></category>

		<guid isPermaLink="false">http://www.marcuscavalcanti.net/blog/?p=969</guid>
		<description><![CDATA[Vez ou outra recebo por email, dúvidas de pessoas que estão iniciando com BPM, estudando processos de negócio ou passando por alguma situação que envolva processos e TI, na maioria das vezes (quando as perguntas são bacanas) eu procuro respondê-las baseado na minha opinião pessoal.
Recentemente recebi duas dúvidas de uma analista de processos confusa com [...]]]></description>
			<content:encoded><![CDATA[<p>Vez ou outra recebo por email, dúvidas de pessoas que estão iniciando com BPM, estudando processos de negócio ou passando por alguma situação que envolva processos e TI, na maioria das vezes (quando as perguntas são bacanas) eu procuro respondê-las baseado na minha opinião pessoal.</p>
<p>Recentemente recebi duas dúvidas de uma analista de processos confusa com os termos comuns usados dentro dessa área de processos e também em relação a adoção de processos negócio servindo como orquestrador de sistemas legados.</p>
<p>Eis as perguntas e as minhas respostas:</p>
<p><strong>1) Qual é a diferença básica entre o BPMS e um <em>Workflow</em>?</strong></p>
<p>Os softwares BPMS se assemelham com <em>Workflow</em> de diversas maneiras, a principal delas é que ambos servem como apoio para gestão de processos de negócio, onde você consegue fazer o mapeamento, modelagem e desenho desses processo de negócio. Entretanto os BPMS, por serem uma <em>suite</em>, oferecem mais opções que um <em>Workflow</em>. Com ambos, tanto BPMS e <em>Workflow</em>, você consegue fazer a modelagem dos processos, mas no geral os BPMS são mais usados para execução, monitoração e automação de processos de negócio. Já o foco principal dos <em>Workflow</em> é servir como um &#8220;tradutor&#8221; de processos de negócios (e todos seus usuários, regras e cenários) para uma notação visual, que irá servir como uma espécie de documentação para uma visão macro (ou até mesmo mais detalhada, dependendo do caso) do processo de negócio.</p>
<p>Apesar de ser possível executar e automatizar processos de negócio com a tecnologia <em>Workflow</em>, OS BPMS possuem alguns recursos como BAM, BRM, facilidade de integração entre sistemas através de adaptadores, padrão de notação visual (BPMN), facilidade para orquestração de serviços (BPEL), que por exemplo um <em>Workflow</em> não possui.</p>
<p>Processos de negócio mais complexos são melhores atentidos com uma solução BPMS do que com <em>Workflow</em>.</p>
<p>Abaixo, dois bons links como complementação de leitura para esse tópico:</p>
<p><a href="http://www.cio.com/article/148305/Workflow_BPM_I_m_So_Confused_" target="_blank" style="text-decoration: underline"><em>Workflow? BPM? I&#8217;m So Confused!</em></a></p>
<p><a href="http://www.ariscommunity.com/users/ripa/2009-04-02-bpm-babylonia-comparing-bpa-and-bpms-comparing-apples-and-oranges" target="_blank" style="text-decoration: underline"><em>Comparing BPA and BPMS is like comparing apples and oranges</em></a></p>
<p><strong>2) Posso utilizar um BPMS apenas para controle do processo? E continuar utilizando meus sistemas legados normalmente, sem mudar o trabalho dos usuários?</strong></p>
<p>Quanto aos sistemas legados, como eu disse anteriormente, os BPMS oferecem ótimos recursos para integração com sistemas legados, seja através de <em>Web Services</em>, Banco de Dados, Filas JMS, dentre outros. Por isso não há a necessidade de que esses sistemas legados deixem de existir, eles podem muito bem ser orquestrados no seu processo de negócio utilizando uma solução BPMS, mas o que é muito importante e nunca deve ser esquecido é o real motivo da existência desse processo: por que ele existe? Para que ele existe? Qual seu foco? Essas são perguntas que não podem deixar de ser respondidas.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.marcuscavalcanti.net/blog/2009/07/09/bpms-workflow-e-legados/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Usando o HermesJMS com JDK 1.6 no Weblogic</title>
		<link>http://www.marcuscavalcanti.net/blog/2009/07/08/usando-o-hermesjms-com-jdk-16-no-weblogic/</link>
		<comments>http://www.marcuscavalcanti.net/blog/2009/07/08/usando-o-hermesjms-com-jdk-16-no-weblogic/#comments</comments>
		<pubDate>Wed, 08 Jul 2009 20:41:05 +0000</pubDate>
		<dc:creator>Marcus Cavalcanti</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Hermes]]></category>
		<category><![CDATA[HermesJMS]]></category>
		<category><![CDATA[JDK]]></category>
		<category><![CDATA[JMS]]></category>
		<category><![CDATA[JVM]]></category>
		<category><![CDATA[Weblogic]]></category>

		<guid isPermaLink="false">http://www.marcuscavalcanti.net/blog/?p=1043</guid>
		<description><![CDATA[O HermesJMS é uma ferramenta muito útil para dar suporte ao desenvolvimento de aplicações que trabalham com JMS (menssageria), ou seja, para quem trabalha com integrações, processos e SOA é de grande utilidade.
Com o HermesJMS é possível publicar mensagens, remover, ver o conteúdo das mensagens publicadas, a quantidade, dentre outras funcionalidades. Eu diria que o [...]]]></description>
			<content:encoded><![CDATA[<p>O <a href="http://www.hermesjms.com/" target="_blank" style="text-decoration: underline">HermesJMS</a> é uma ferramenta muito útil para dar suporte ao desenvolvimento de aplicações que trabalham com <a href="http://java.sun.com/products/jms/" target="_blank" style="text-decoration: underline">JMS</a> (menssageria), ou seja, para quem trabalha com integrações, processos e SOA é de grande utilidade.</p>
<p>Com o HermesJMS é possível publicar mensagens, remover, ver o conteúdo das mensagens publicadas, a quantidade, dentre outras funcionalidades. Eu diria que o HermesJMS está para JMS como o <a href="http://www.soapui.org/" target="_blank" style="text-decoration: underline">soapUI</a> está pra <em>Web Services</em>.</p>
<p>Só que existe um pequeno probleminha de incompatibilidade entre o HermesJMS e o Weblogic 10.2. O HermesJMS foi construído com a <a href="http://java.com/pt_BR/download/faq/jvm.xml" target="_blank" style="text-decoration: underline">JVM</a> 1.6 e o <a href="http://e-docs.bea.com/platform/suppconfigs/configs102/102_over/overview.html" target="_blank" style="text-decoration: underline">Weblogic 10.2</a> roda com a JVM 1.5, portanto quando tentamos acessar <em>resources</em> JMS configurados em um servidor Weblogic temos um probleminha com o <a href="http://nullability.org/?p=95" target="_blank" style="text-decoration: underline"><em>ClassLoader</em></a>, segundo <em>bug</em> relatado <a href="http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6434149" target="_blank" style="text-decoration: underline">nesse link</a>.</p>
<p>Geralmente para resolução desse problema, quando eu ia usar o Hermes,  eu mudava a minha <a href="http://lowfatlinux.com/linux-environment-variables.html" target="_blank" style="text-decoration: underline">váriavel ambiente</a> JAVA_HOME para apontar para o JDK 1.5, para agilizar esse processo pode ser feito um <a href="http://pt.wikipedia.org/wiki/Shell_script" target="_blank" style="text-decoration: underline">Shell Script</a> que seta essa varíavel de ambiente apontando para o JDK 1.5 e abrindo o HermesJMS logo em seguida, mas existe uma solução melhor e mais limpa para isso, que é setando uma propriedade na inicialização do HermesJMS, seguem os passos necessários:</p>
<p>1) Entrar no diretório de instalação do HermesJMS, no meu caso é /opt/HermesJMS<br />
2) Editar o arquivo <strong>hermes.sh</strong> que fica dentro do diretório <strong>bin</strong><br />
3) Ir para a última linha desse arquivo e adicionar a propriedade: <em>-Dsun.lang.ClassLoader.allowArraySyntax=true</em></p>
<p>Dessa forma, a última linha do arquivo /bin/hermes.sh ficaria assim:</p>
<p><!--DEVFMTCODE--><pre class="devcodeblock" title="Text"><div class="devcodeoverflow"><ol><li>&quot;$JAVACMD&quot; -XX:NewSize=256m -Xmx1024m -Dsun.lang.ClassLoader.allowArraySyntax=true $HERMES_OPTS -Dhermes.home=$HERMES_HOME -Dhermes=$HERMES_CFG -Dhermes.libs=$HERMES_LIB_PROPERTY -classpath $LOCALCLASSPATH hermes.browser.HermesBrowser</li></ol></div></pre><!--END_DEVFMTCODE--></p>
<p>Esse pequeno <em>workaround</em> corrige esse probleminha de incompatibilidade entre o HermesJMS e o Weblogic 10.2 e nos permite usar o HermesJMS com o JDK 1.6.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.marcuscavalcanti.net/blog/2009/07/08/usando-o-hermesjms-com-jdk-16-no-weblogic/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Pensando em uma arquitetura simples para integração entre sistemas</title>
		<link>http://www.marcuscavalcanti.net/blog/2009/06/10/pensando-em-uma-arquitetura-simples-para-integracao-entre-sistemas/</link>
		<comments>http://www.marcuscavalcanti.net/blog/2009/06/10/pensando-em-uma-arquitetura-simples-para-integracao-entre-sistemas/#comments</comments>
		<pubDate>Wed, 10 Jun 2009 15:34:20 +0000</pubDate>
		<dc:creator>Marcus Cavalcanti</dc:creator>
				<category><![CDATA[Arquitetura e Padrões]]></category>
		<category><![CDATA[Arquitetura]]></category>
		<category><![CDATA[integração]]></category>
		<category><![CDATA[REST]]></category>
		<category><![CDATA[RESTful]]></category>

		<guid isPermaLink="false">http://www.marcuscavalcanti.net/blog/?p=971</guid>
		<description><![CDATA[Tentei bolar um título melhor para o tópico, porém confesso que não consegui, mas ainda assim acho que o título se aplica no que será falado nas próximas linhas.
O problema
Em um projeto pessoal recente precisei fazer a integração entre três sistemas distintos, na verdade os sistemas são distintos, mas não deveriam ser. Trata-se de um [...]]]></description>
			<content:encoded><![CDATA[<p>Tentei bolar um título melhor para o tópico, porém confesso que não consegui, mas ainda assim acho que o título se aplica no que será falado nas próximas linhas.</p>
<h3>O problema</h3>
<p>Em um projeto pessoal recente precisei fazer a integração entre três sistemas distintos, na verdade os sistemas são distintos, mas não deveriam ser. Trata-se de um site e o que ocorre é que esse mesmo site possui três módulos (sistemas) que estão em plataformas, linguagens e lugares diferentes. Conclui-se que é um projeto que foi crescendo desordenadamente e que em nenhum momento ninguém pensou em uma maneira de organizar melhor os módulos e realizar as integrações. Como esses módulos foram feitos em linguagens e plataformas diferentes, o requisito número um do cliente era que esses módulos se comunicassem e que essa comunicação fosse transparente pra ele e para quem fosse administrar o sistema.</p>
<h3>Cenário atual</h3>
<p>O site é um pequeno site de e-commerce e dos três módulos existentes, um diz respeito ao <em>frontend/backend</em> do site e é feito com .NET/SQL Server, o outro módulo é o <em>backend</em> de vendas e é feito com PHP/MySQL e o último módulo é o de <em>newsletter (mailing)</em> que também está em PHP/MySQL. O módulo de vendas foi o último a ser desenvolvido e deveria ser mantido, o problema é que o administrador do sistema precisa &#8220;inputar&#8221; todas as vendas na mão, isso mesmo, na mão! Atualmente, quando um cliente tem interesse em algum produto do site, ele envia um email ao administrador informando qual(is) o(s) produto(s) ele tem interesse e os seus dados pessoais, e por sua vez o administrador entra no módulo de vendas, cadastra esse novo cliente, cria um pedido de venda, gera um login/senha para esse cliente e envia por email para que ele possa se autenticar no módulo de venda, concluir a compra e efetuar o pagamento.</p>
<p>Além de ser algo totalmente mecânico e nada prático, não há nenhuma relação entre os módulos do site e o administrador precisa reproduzir os dados do produto, que já existe em um módulo, em outro. Eram esses problemas que deveriam ser remediados.</p>
<h3>Requisitos do cliente</h3>
<p>Um dos requisitos do cliente, era de que o site (<em>frontend e backend</em>) deveria ser construído novamente, pois o atual além de ter sido construído em uma plataforma que ele não tinha mais interesse em manter, também estava incompleto e apresentando problemas, portanto o primeiro requisito era refazer todo o site com PHP/MySQL.</p>
<p>O segundo requisito era que o processo compra de produtos deveria ser todo feito através do site, pelo cliente, e não da forma arcaica como é atualmente e que foi descrita acima.</p>
<p>O terceiro requisito era que o módulo de vendas deveria ser mantido, pois ele atendia o que o cliente precisava, sendo assim o sistema que eu iria desenvolver deveria alimentar diretamente esse módulo de vendas.</p>
<h3>Estrutura do módulo de vendas</h3>
<p>Felizmente o módulo de vendas estava construído de uma maneira que facilitou o meu trabalho, quem o desenvolveu se preocupou em criar classes de modelo, uma camada de persistência e uma camada de negócio, portanto pude pensar em uma arquitetura simples em funcional muito em função disso.</p>
<h3>Arquitetura pensada</h3>
<p>Tentei pensar em algo que não criasse uma dependência entre os sistemas e que me fizesse mexer o minímo possível, ou nada, no módulo de vendas que seria mantido. Outros fatores que levei em consideração era que eu queria algo fácil de implementar, de dar manutenção e que de certa forma fosse rápido de desenvolver.</p>
<p>Conclui o desenvolvimento do (<em>frontend/backend</em>) e parti para pensar em uma arquitetura que me permitisse fazer tudo o que citei acima e que além disso me permitisse utilizar a boa estrutura que eu encontrei no módulo de vendas.</p>
<p>Para construir o site utilizei o <a href="http://www.codeigniter.com" target="_blank" style="text-decoration: underline">Code Igniter</a>, que é um <em>framework</em> que tenho prática, e também é leve e rápido de desenvolver, mas o que vale ressaltar é que arquitetura é algo que é independente de <em>framework</em>, portanto se eu tivesse utilizado qualquer outro <em>framework</em>, ou até mesmo se eu não tivesse utilizado nenhum <em>framework</em>, não faria a mínima diferença. Nesse caso os <em>frameworks</em> escolhidos só entram como facilitadores na implantação da arquitetura.</p>
<p>Mas voltando ao foco inicial, que é explicar a arquitetura, o que eu pensei foi em criar um <a href="http://pt.wikipedia.org/wiki/Web_service" target="_blank" style="text-decoration: underline"><em>Web Service</em></a> com as operações específicas para tudo o que eu precisaria fazer no módulo de vendas, ou seja, eu precisaria identificar todas as ações que eu precisaria realizar para fazer essa integração e alimentar esse módulo. Na verdade, além de alimentar eu também precisaria recuperar algumas informações do módulo de vendas. Como os módulos (site, vendas, <em>newsletter</em>) ficariam provavelmente em servidores diferentes, em bancos diferentes e em estruturas diferentes essa era a forma mais limpa de realizar a integração sem causar dependência entre esses módulos e com isso dar manutenção seria bem mais fácil.</p>
<p>Como já estava definido que eu iria utilizar <em>Web Service</em>, eu optei por utilizar o formato <a href="http://www.xfront.com/REST-Web-Services.html" target="_blank" style="text-decoration: underline">RESTful</a>, pois eles se encaixava perfeitamente na minha necessidade: me trazia simplicidade, praticidade, facilidade, além do que no meu caso a aplicabilidade de <a href="http://en.wikipedia.org/wiki/Resource_oriented_architecture" target="_blank" style="text-decoration: underline">ROA</a>, que é o <a href="http://alexbarnett.net/blog/archive/2006/11/04/REST-Web-Services-and-ROA.aspx" target="_blank" style="text-decoration: underline">conceito que <em>Web Services</em> RESTful utilizam</a>, era muito mais evidente do que a abordagem de serviços.</p>
<p>O próximo passo era identificar os recursos necessários e criar as <a href="http://en.wikipedia.org/wiki/Uniform_Resource_Identifier" target="_blank" style="text-decoration: underline">URI</a> que eu utilizaria nos <em>requests</em> do meu<em> Web Service</em> REST, então ficou dessa forma:</p>
<ul>
<li><em>user/new</em></li>
<li><em>user/retrieve/email</em></li>
<li><em>user/retrieve/cpf</em></li>
<li><em>order/new</em></li>
<li><em>order/save/products</em></li>
<li><em>order/retrieve/last</em></li>
<li><em>shipping/calculate</em></li>
</ul>
<p>Para desenvolver esse <em>Web Service</em> RESTful resolvi utilizar o <a href="http://framework.zend.com" target="_blank" style="text-decoration: underline">Zend Framework</a>, pois ele possui alguns componentes que me ajudariam a desenvolver esse <em>Web Service</em> mais rápido, como o <a href="http://framework.zend.com/manual/en/zend.rest.html" target="_blank" style="text-decoration: underline">suporte a <em>Web Services</em> RESTful</a>, por exemplo, o ZF também tem uma <a href="http://framework.zend.com/manual/en/zend.json.html" target="_blank" style="text-decoration: underline">API para trabalhar com JSON</a> muito boa, então esse foi outro componente do ZF que eu resolvi utilizar.</p>
<p>Como no módulo de vendas já existiam classes de modelo que representavam as <a href="http://blog.rodrigoallemand.com.br/?p=138" target="_blank" style="text-decoration: underline">entidades do meu domínio</a>, o que eu fiz foi criar uma estrutura <a href="http://json.org" target="_blank" style="text-decoration: underline">JSON</a> semelhante as essas entidades e que representaria os <a href="http://www.w3.org/TR/2002/WD-ws-arch-scenarios-20020730/#S003" target="_blank" style="text-decoration: underline"><em>requests/responses</em></a> do meu <em>Web Service</em> RESTful. Paralelo a isso criei algumas classes de apoio que serviriam como os <a href="http://static.springframework.org/spring-ws/docs/1.0-m3/reference/html/ch05s02.html" target="_blank" style="text-decoration: underline"><em>Marshallers</em> e <em>Unmarshallers</em></a> do <a href="http://www.springsource.org/" target="_blank" style="text-decoration: underline">Spring</a>. <em>Marshallers</em> e <em>unmarshallers</em> são como <em>data mappers</em>, e no meu caso servem para eu mapear um objeto JSON para um objeto PHP (classes modelo) e também realizar o inverso.</p>
<p>Dessa forma com objetos JSON convertidos para objetos PHP que representavam as minhas classes modelo eu poderia usar a camada de persistência existente na aplicação para persistir todo objeto, então no caso de salvar um novo usuário, ficou assim:</p>
<p><!--DEVFMTCODE--><pre class="devcodeblock" title="PHP"><div class="devcodeoverflow"><ol><li><span style="color: #000000; font-weight: bold;">function</span> saveUser<span style="color: #009900;">&#40;</span><span style="color: #000088;">$user</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>	</li><li>	<span style="color: #000088;">$userObject</span> <span style="color: #339933;">=</span> Unmarshaller<span style="color: #339933;">::</span><span style="color: #004000;">user</span><span style="color: #009900;">&#40;</span>Zend_Json<span style="color: #339933;">::</span><span style="color: #004000;">decode</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$user</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>	</li><li>	<span style="color: #000088;">$conn</span> 	&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #339933;">=</span> DB<span style="color: #339933;">::</span><span style="color: #004000;">getConnectionHandler</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></li><li>&nbsp;</li><li>	<span style="color: #000088;">$result</span> 	<span style="color: #339933;">=</span> <span style="color: #000088;">$conn</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">user</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">save</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$userObject</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>	</li><li>&nbsp;</li><li>	<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span> <span style="color: #000088;">$result</span> <span style="color: #009900;">&#41;</span></li><li>		<span style="color: #b1b100;">return</span> <a href="http://www.php.net/array"><span style="color: #990000;">array</span></a><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'status'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #009900; font-weight: bold;">TRUE</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'response'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'Usuário cadastrado com sucesso.'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>	</li><li>	<span style="color: #b1b100;">else</span></li><li>		<span style="color: #b1b100;">return</span> <a href="http://www.php.net/array"><span style="color: #990000;">array</span></a><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'status'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #009900; font-weight: bold;">FALSE</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'response'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #000088;">$conn</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">ErrorMsg</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>	 </li><li>&nbsp;</li><li><span style="color: #009900;">&#125;</span></li><li></li></ol></div></pre><!--END_DEVFMTCODE--></p>
<p>Bem simples, né? No exemplo acima, criei algumas classes estáticas (utilitárias), a primeira me retorna um objeto de conexão com o banco de dados e a segunda classe representa o <em>unmarshaller</em> para transformar um Objeto JSON em uma classe de modelo que representa um usuário, após isso foi só persistir o usuário e retornar as mensagens correspondentes para quem está acessando recurso.</p>
<h3>Visão geral</h3>
<p>No fluxo de salvar um novo usuário, teríamos:</p>
<p>1) Site (módulo site) deseja salvar um novo usuário;<br />
2) Site monta um objeto JSON com os dados que representam o novo usuário;<br />
3) Site acessa o <em>Web Service</em> RESTful do módulo de venda através do recurso user/new;<br />
4) No módulo de venda, o método mapeado para o recurso user/new, faz <em>unmarshaller</em> do objeto JSON mapeando os valores desse objeto JSON para uma classe de modelo;<br />
5) O usuário é persistido através do objeto que foi mapeado no passo anterior;<br />
6) O Web Service RESTful retorna a mensagem correspondente para o site.</p>
<p>Quando se fala em arquitetura é comum pensarmos em algo complexo, cheio de tecnologias, frameworks e etc, mas o foco de arquitetura não deve ser esse, o foco de arquitetura deve ser pensar em uma estrutura que prime pela organização, relacionamento e reuso dos componentes de softwares envolvidos em um sistema, onde o intuito deve ser facilitar e não complicar.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.marcuscavalcanti.net/blog/2009/06/10/pensando-em-uma-arquitetura-simples-para-integracao-entre-sistemas/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Download de projeto BPM para iniciantes no ALBPM (ou OracleBPM)</title>
		<link>http://www.marcuscavalcanti.net/blog/2009/05/12/download-de-projeto-bpm-para-iniciantes-no-albpm-ou-oraclebpm/</link>
		<comments>http://www.marcuscavalcanti.net/blog/2009/05/12/download-de-projeto-bpm-para-iniciantes-no-albpm-ou-oraclebpm/#comments</comments>
		<pubDate>Tue, 12 May 2009 21:55:40 +0000</pubDate>
		<dc:creator>Marcus Cavalcanti</dc:creator>
				<category><![CDATA[BPM]]></category>
		<category><![CDATA[ALBPM]]></category>
		<category><![CDATA[BPMS]]></category>
		<category><![CDATA[OracleBPM]]></category>

		<guid isPermaLink="false">http://www.marcuscavalcanti.net/blog/?p=956</guid>
		<description><![CDATA[Hoje fiz uma apresentação sobre BPM e o BPMS Aqualogic BPM (ou OracleBPM) na empresa que eu trabalho, o objetivo era mostrar o que é BPM para quem não conhece e principalmente apresentar a solução BPMS citada em um projeto piloto.
Para apresentação, criei um projeto piloto &#8220;empréstimo bancário&#8221; onde é possível mostrar os conceitos mais [...]]]></description>
			<content:encoded><![CDATA[<p>Hoje fiz uma apresentação sobre BPM e o BPMS Aqualogic BPM (ou OracleBPM) na empresa que eu trabalho, o objetivo era mostrar o que é BPM para quem não conhece e principalmente apresentar a solução BPMS citada em um projeto piloto.</p>
<p>Para apresentação, criei um projeto piloto &#8220;empréstimo bancário&#8221; onde é possível mostrar os conceitos mais básicos do ALBPM. Como imagino existirem mais pessoas com tal necessidade, irei disponibilizar o download do projeto, bem como o script SQL necessário para criação da tabela usada no projeto.</p>
<p>Os tópicos abordados na apresentação foram:</p>
<p><em>- O que é BPM e BPMS?</p>
<p>- BPMN</p>
<p>- BPM(s) não é arrastar e soltar figurinhas </p>
<p>- Workspace</p>
<p>- Processo</p>
<p>- Screenflow</p>
<p>- Atividades (Globais (Global Creation e Global), Automáticas, Interativas, Grab/Joins/Split)</p>
<p>- Transições</p>
<p>- BPM OBjects, Instance Variables, Local Variables, Project Variables</p>
<p>- Argumentos / Argument Mapping</p>
<p>- Business Parameters e Business Rules</p>
<p>- Exceções</p>
<p>- Grupos</p>
<p>- Connectors</p>
<p>- Logs (Log Viewer), Problems View, Variables View e Outline View</p>
<p>- Componentes (Catálogo)</p>
<p>- Organization (Roles, Usuários)</p>
<p>- Presentations e JSP</p>
<p>- External Resources</p>
<p>- Geração de &#8220;pacote&#8221; (.exp)</p>
<p>- SVN</em></p>
<p><a href="http://www.marcuscavalcanti.net/blog/wp-content/uploads/BPM_piloto/Piloto.exp" style="text-decoration: underline" target="_blank">Download do projeto.</a></p>
<p><a href="http://www.marcuscavalcanti.net/blog/wp-content/uploads/BPM_piloto/piloto.sql" style="text-decoration: underline" target="_blank">Download do script SQL.</a></p>
<p>PS: O projeto não disponibiliza todos os tópicos abordados e citados acima, mas quase todos.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.marcuscavalcanti.net/blog/2009/05/12/download-de-projeto-bpm-para-iniciantes-no-albpm-ou-oraclebpm/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>Evento internacional de BPM (DF, RJ, SP)</title>
		<link>http://www.marcuscavalcanti.net/blog/2009/05/07/evento-internacional-de-bpm-df-rj-sp/</link>
		<comments>http://www.marcuscavalcanti.net/blog/2009/05/07/evento-internacional-de-bpm-df-rj-sp/#comments</comments>
		<pubDate>Thu, 07 May 2009 17:33:50 +0000</pubDate>
		<dc:creator>Marcus Cavalcanti</dc:creator>
				<category><![CDATA[BPM]]></category>
		<category><![CDATA[evento]]></category>

		<guid isPermaLink="false">http://www.marcuscavalcanti.net/blog/?p=950</guid>
		<description><![CDATA[Vai acontencer nos dias 01, 06 e 07 de outrubro um evento internacional de BPM aqui no Brasil, onde teremos apresentações nas cidades de Brasília, Rio de Janeiro e São Paulo.
Segue a chamada do Evento:
A ELO Group e o GPI/UFRJ estão promovendo o evento internacional ‘Elaboração e Implantação de Estratégias de Sucesso em BPM’, com [...]]]></description>
			<content:encoded><![CDATA[<p>Vai acontencer nos dias 01, 06 e 07 de outrubro um <a href="http://www.elogroup.com.br/eventobpm/" target="_blank" style="text-decoration: underline">evento internacional de BPM</a> aqui no Brasil, onde teremos apresentações nas cidades de Brasília, Rio de Janeiro e São Paulo.</p>
<p>Segue a chamada do Evento:</p>
<p><em>A ELO Group e o GPI/UFRJ estão promovendo o evento internacional ‘Elaboração e Implantação de Estratégias de Sucesso em BPM’, com a participação do Prof. Michael Rosemann, uma referência mundial no assunto. O evento será realizado nos dias 01, 06 e 07 de outubro de 2009, nas cidades de Brasília, Rio de Janeiro e São Paulo, respectivamente. INSCRIÇÕES ABERTAS!</em></p>
<p>Uma das organizadoras do evento será a <a href="http://www.elogroup.com.br/" target="_blank" style="text-decoration: underline">ELO Group</a>, que vem tendo algumas iniciativas legais de BPM em prol da disseminação do conhecimento, duas dessas iniciativas são a publicação BPM 360 e também <a href="http://www.elogroup.com.br/base_webinar.html" target="_blank" style="text-decoration: underline"><em>Webinars</em> gratuitos</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.marcuscavalcanti.net/blog/2009/05/07/evento-internacional-de-bpm-df-rj-sp/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Wizard de formulários com JS sem bibliotecas</title>
		<link>http://www.marcuscavalcanti.net/blog/2009/04/28/wizard-de-formularios-com-js-sem-bibliotecas/</link>
		<comments>http://www.marcuscavalcanti.net/blog/2009/04/28/wizard-de-formularios-com-js-sem-bibliotecas/#comments</comments>
		<pubDate>Tue, 28 Apr 2009 16:41:57 +0000</pubDate>
		<dc:creator>Marcus Cavalcanti</dc:creator>
				<category><![CDATA[Web]]></category>
		<category><![CDATA[form]]></category>
		<category><![CDATA[formulário wizard]]></category>
		<category><![CDATA[Java Script]]></category>
		<category><![CDATA[JS]]></category>
		<category><![CDATA[script]]></category>
		<category><![CDATA[wizard]]></category>

		<guid isPermaLink="false">http://www.marcuscavalcanti.net/blog/?p=942</guid>
		<description><![CDATA[Em um projeto que estou participando, temos um formulário para lá de grande, são 5 passos, ou seja, um wizard e sendo que em um dos passos existe uma tela com mais de 100 inputs, sendo que esse valor é dinâmico, mas dificilmente tem menos que 100 inputs, é mais normal ter mais do que [...]]]></description>
			<content:encoded><![CDATA[<p>Em um projeto que estou participando, temos um formulário para lá de grande, são 5 passos, ou seja, um <em>wizard</em> e sendo que em um dos passos existe uma tela com mais de 100 <em>inputs</em>, sendo que esse valor é dinâmico, mas dificilmente tem menos que 100 <em>inputs</em>, é mais normal ter mais do que isso.</p>
<p>Estávamos usando o <a href="http://www.jquery.com"  target="_blank" style="text-decoration: underline">jQuery</a> até então, que é uma biblioteca JS, que contém inúmeros <em>plugins</em>, além de vários facilitadores para construção de aplicações mais interativas. Acho bacana terem surgidos várias bibliotecas JS, onde o jQuery talvez seja a principal dessas, pois com isso o nível de interatividade entre o usuário e as aplicações aumentaram consideravelmente e isso trás (ou pelo menos deveria) outros prós, como: facilidade de navegação e usabilidade mais intuitiva nas interfaces que fazem o bom uso desses recursos. Para os desenvolvedores sem dúvidas também foi algo positivo, pois é bem tranquilo hoje fazer uma requisição ajax com uma linha de <em>script</em>, além de termos também um código mais organizado e estruturado.</p>
<p>Só que eu sempre tive um certo receio em relação a essas bibliotecas, não com as bibliotecas em si, mas da forma que alguns desenvolvedores as usam, principalmente em caso de aplicações para um grande número de acessos em um ambiente mais &#8220;pesado&#8221;, já vi alguns casos em que o uso dessas bibliotecas atrapalhou mais do que ajudou e recentemente isso aconteceu comigo.</p>
<p>Utilizei um <em>plugin</em> do jQuery pronto para criar <em>wizards</em> de formulário, ou formulário no formato de <em>wizard</em>, como preferir. Esse <em>plugin</em>, além de ser pouco flexível, causou um problema na minha aplicação justamente no <em>wizard</em> que possui vários <em>inputs</em>. O problema é que ao entrar nesse <em>wizard</em>, o <em>browser</em> simplesmente para durante uns 3s, respira, e depois mostra o <em>wizard</em>, e vamos combinar que isso é muito esquisito, não é um comportamento normal. Para ser sincero não consegui identificar a causa principal, mas desconfio de várias coisas, primeiro é que no geral essas bibliotecas são muito pesadas, só para esse <em>wizard</em> de form eram mais de 50kb de arquivo, algo desnecessário, ainda mais considerando um ambiente com MUITO VOLUME de acessos, pois isso acaba causando um <em>overhead</em>. O segundo é em relação ao código da função para geração do <em>wizard</em>, achei o mesmo extenso demais para fazer algo que funciona, mas que é pouco flexível. O terceiro é que essas bibliotecas JS já são uma abstração de N componentes nativos do JS e por mais que seja ínfimo, isso também pode ajudar a causar um <em>overhead</em>.</p>
<p>Mediante a esses percalços e também a falta de flexibilidade do <em>script</em> que eu utilizei, resolvi criar o meu próprio <em>script</em> para fazer o <em>wizard</em> do formulário, esse <em>script</em> é bem simples, não utiliza nenhuma biblioteca JS, é bem fácil de entender e extender, além de ser flexível. Falando assim parece até uma maravilha do mundo moderno hehe, mas realmente o <em>script</em> resolveu meus problemas de performance e me deu a flexibilidade que eu queria. Testei o mesmo no Firefox 3, Opera 9 e IE 7 e funcionou perfeitamente e da mesma maneira em ambos.</p>
<p>Para <strong>visualizar o <em>script</em> funcionando</strong>, basta <a href="http://www.marcuscavalcanti.net/blog/wp-content/uploads/wizard/wizard.html" target="_blank" style="text-decoration: underline">clicar aqui</a>, para fazer o <strong><em>download</em></strong> do mesmo, é só <a href="http://www.marcuscavalcanti.net/blog/wp-content/uploads/wizard/wizard.rar"  target="_blank" style="text-decoration: underline">clicar aqui</a>.</p>
<p>Se surgirem dúvidas ou problemas, sugiro criar um comentário que responderei somente por aqui, até porque caso outras pessoas que venham a utilizar o <em>script</em> tenham a mesma dúvida, já fico mais fácil de achar e procurar.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.marcuscavalcanti.net/blog/2009/04/28/wizard-de-formularios-com-js-sem-bibliotecas/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Usando GET e POST corretamente</title>
		<link>http://www.marcuscavalcanti.net/blog/2009/04/22/usando-get-e-post-corretamente/</link>
		<comments>http://www.marcuscavalcanti.net/blog/2009/04/22/usando-get-e-post-corretamente/#comments</comments>
		<pubDate>Wed, 22 Apr 2009 17:19:22 +0000</pubDate>
		<dc:creator>Marcus Cavalcanti</dc:creator>
				<category><![CDATA[Web]]></category>
		<category><![CDATA[GET]]></category>
		<category><![CDATA[HTTP]]></category>
		<category><![CDATA[POST]]></category>

		<guid isPermaLink="false">http://www.marcuscavalcanti.net/blog/?p=925</guid>
		<description><![CDATA[Pelo título do tópico parece um assunto básico, correto? E realmente é, mas infelizmente ainda vejo muitos desenvolvedores fazendo o mal uso dos métodos GET e POST do protocolo HTTP. Principalmente no caso de desenvolvedores Web, esse assunto deveria ser pré-requisito antes mesmo de aprender qualquer linguagem de programação, ou então, até antes mesmo de [...]]]></description>
			<content:encoded><![CDATA[<p>Pelo título do tópico parece um assunto básico, correto? E realmente é, mas infelizmente ainda vejo muitos desenvolvedores fazendo o mal uso dos métodos GET e POST do protocolo HTTP. Principalmente no caso de desenvolvedores Web, esse assunto deveria ser pré-requisito antes mesmo de aprender qualquer linguagem de programação, ou então, até antes mesmo de aprender HTML.</p>
<p>A especificação do protocolo HTTP diz, que o mesmo <a href="http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html" style="text-decoration: underline" target="_blank">possui 8 métodos</a>, porém os métodos geralmente mais usados são GET e POST. Quando aprendemos a desenvolver para Web, é comum lermos ou sermos informados, que o método POST deve ser usado em formulários e que o método GET deve ser usado através de links. Isso é uma inverdade.</p>
<p>Tanto o método GET, como o método POST, podem ser usados de várias maneiras, contudo existem boas práticas que indicam as melhores maneiras de fazer o uso desses métodos, a seguir explicarei melhor quais são essas maneiras.</p>
<h3>Explicando GET e POST</h3>
<p>O método GET faz a passagem de parâmetros para o servidor HTTP através de uma URL, enquanto o método POST envia um documento ao servidor HTTP com o conteúdo contido nesse documento (<em>message body</em>).</p>
<h3>Quando usar GET e quando usar POST?</h3>
<p>O método GET deve ser usado para acessar recursos, ou seja, para recuperar informações (dados), enquanto o método POST deve ser usado em ações que modifiquem essas informações.</p>
<p>Sendo mais claro, o método POST é usado em ações destrutivas, como: inscrição em algum serviço, modificação do estado de algum recurso no banco de dados, etc. Enquanto o método GET é usado em ações não destrutivas, como: buscas, listagens, etc.</p>
<h3>Na prática</h3>
<p>GET deve ser usado em operações seguras, justamente por ser indicado em ações que não modifiquem o estado de um recurso, pois imagine que você tenha em sua aplicação um link (GET) que leve a remoção de um determinado ítem, o que poderia acontecer no caso desse link ser indexado por algum <em>web crawler</em>? Pois bem, esse é um dos casos no qual o método POST seria indicado (operações não-seguras).</p>
<h3>Exemplos reais</h3>
<p><strong>GET</strong>: query, buscas, filtros, listagem.</p>
<p><strong>POST</strong>: inscrição em serviços (newsletter, por exemplo), alteração/edição/remoção de  recursos em banco de dados, envio de email.</p>
<h3>Referências</h3>
<p><a href="http://www.w3.org/TR/webarch/" style="text-decoration: underline" target="_blank">Architecture of the World Wide Web</a></p>
<p><a href="http://www.cs.tut.fi/~jkorpela/forms/methods.html#fund" style="text-decoration: underline" target="_blank">The fundamental differences between &#8220;GET&#8221; and &#8220;POST&#8221;</a></p>
<p><a href="http://www.w3.org/2001/tag/doc/whenToUseGet.html" style="text-decoration: underline" target="_blank">URIs, Addressability, and the use of HTTP GET and POST</a></p>
<p><a href="http://www.w3.org/MarkUp/html-spec/html-spec_toc.html#SEC8.2" style="text-decoration: underline" target="_blank">Form Submission</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.marcuscavalcanti.net/blog/2009/04/22/usando-get-e-post-corretamente/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Web Services: REST versus WS-*, WS-* versus REST</title>
		<link>http://www.marcuscavalcanti.net/blog/2009/04/13/webservices-rest-versus-ws-soap/</link>
		<comments>http://www.marcuscavalcanti.net/blog/2009/04/13/webservices-rest-versus-ws-soap/#comments</comments>
		<pubDate>Mon, 13 Apr 2009 16:15:10 +0000</pubDate>
		<dc:creator>Marcus Cavalcanti</dc:creator>
				<category><![CDATA[SOA]]></category>
		<category><![CDATA[REST]]></category>
		<category><![CDATA[SOAP]]></category>
		<category><![CDATA[Web Service]]></category>
		<category><![CDATA[WS-*]]></category>
		<category><![CDATA[WSDL]]></category>

		<guid isPermaLink="false">http://www.marcuscavalcanti.net/blog/?p=904</guid>
		<description><![CDATA[Um dos maiores problemas no desenvolvimento de software é a integração entre aplicações que foram construídas sobre plataformas/linguagens distintas, onde essas aplicações deveriam conversar entre si com o intuito de trocar informações. Para resolver, ou melhor, tentar resolver esse problema, foi proposto um padrão que atende pelo nome de Web Services, que hoje é um [...]]]></description>
			<content:encoded><![CDATA[<p>Um dos maiores problemas no desenvolvimento de software é a integração entre aplicações que foram construídas sobre plataformas/linguagens distintas, onde essas aplicações deveriam conversar entre si com o intuito de trocar informações. Para resolver, ou melhor, tentar resolver esse problema, foi proposto um padrão que atende pelo nome de <em>Web Services</em>, que hoje é um padrão mantido pela <a href="http://www.w3c.org" target="_blank" style="text-decoration: underline">W3C</a> e <a href="http://www.oasis-open.org/specs/" target="_blank" style="text-decoration: underline">OASIS</a>.</p>
<p><em>Web Services</em> são componentes que permitem que duas aplicações troquem informações entre si utilizando um canal de comunicação (<a href="http://en.wikipedia.org/wiki/Computer_network" target="_blank" style="text-decoration: underline"><em>network</em></a>), na maioria das vezes o protocolo <a href="http://en.wikipedia.org/wiki/HTTP" target="_blank" style="text-decoration: underline">HTTP</a>. Existem alguns tipos de <em>Web Services</em>, mas os mais conhecidos e usados hoje em dia são: RPC, WS-* (WSDL/SOAP) e REST.</p>
<p>Dos padrões citados, provavelmente o formato mais conhecido e usado hoje em dia é o WS-*, que define que um serviço deve receber/responder mensagens no formato XML (<a href="http://en.wikipedia.org/wiki/SOAP_(protocol)" target="_blank" style="text-decoration: underline">SOAP</a>) e deve possuir um contrato que defina os seus serviços (<a href="http://en.wikipedia.org/wiki/Web_Services_Description_Language" target="_blank" style="text-decoration: underline">WSDL</a>). Só que esse formato, principalmente depois da popularização do REST, vem sofrendo pesadas críticas de toda comunidade de desenvolvimento, que alega que esse formato é burocrático e complicado, enquanto o REST é um formato mais simples e objetivo.</p>
<p>Minha opinião é que tanto o padrão WS-* como o padrão REST não se substituem, pelo menos não por enquanto, e que tentar fazer essa comparação ainda não agrega, pois existem casos específicos onde REST é muito bem-vindo, assim como existem casos onde o padrão WS-* é muito bem-vindo.</p>
<h3>WS-* &#8211; Vantagens e desvantagens</h3>
<p>Uma das principais reclamações em relação a esse formato é que o mesmo <a href="http://en.wikipedia.org/wiki/WS-*" target="_blank" style="text-decoration: underline">possui N especificações</a> e que isso o torna complexo e burocrático, e de certa forma eu concordo. Só para se ter uma idéia existem mais de 15 especificações para esse formato e conhecer todas é humanamente impossível e inviável.</p>
<p>Outra reclamação é em relação ao <em><a href="http://pt.wikipedia.org/wiki/Overhead" target="_blank" style="text-decoration: underline">overhead</a></em> que a troca de mensagens de um serviço no padrão WS-* pode causar, pois todas as mensagens precisam ser envelopadas dentro de um pacote SOAP, que nada mais é que um XML padronizado. Esse <em>overhead</em> é causado, pois dentro de um envelope SOAP, o que é usado é a menor parte do conteúdo que está ali contido, dessa forma há muito &#8220;lixo&#8221;.</p>
<p>Essas duas reclamações citadas acima, são as maiores reclamações dos desenvolvedores em relação a serviços WS-*, contudo no meu modo de ver existem também muitas vantagens no uso do formato WS-*, principalmente no que diz respeito a integração entre aplicações corporativas e também em relação a <a href="http://en.wikipedia.org/wiki/Service-oriented_architecture" target="_blank" style="text-decoration: underline">SOA</a>.</p>
<p>Por exemplo, eu trabalho em um ambiente onde existem muitos serviços, muitos mesmos, e esses serviços são desenvolvidos por N fornecedores, em N plataformas distintas e são usados por N por aplicações. É um cenário bem complexo e eu não imaginaria esse cenário sem o uso do formato WS-*. E por quê? Em primeiro lugar porque ter um contrato formal desses serviços é totalmente necessário, afinal eu preciso saber o nome desses serviços, preciso saber o que eles estão esperando receber, o que eles irão me responder e como serão esses dados. Imagine se um serviço desses mudar o caos que seria?</p>
<p>Outro fator muito importante são as ferramentas de apoio, afinal elas além de facilitar o trabalho, trazem também produtividade. Existem N ferramentas que ajudam na simulação, testes, geração de <a href="http://en.wikipedia.org/wiki/Mock_object" target="_blank" style="text-decoration: underline"><em>Mock</em>&#8217;s</a>, teste de carga, <em>debug</em> e tantas outras atividades necessárias no desenvolvimento/acesso a esses serviços. A principal ferramenta <em>free</em> usada hoje em dia é o <a href="http://www.soapui.org/" target="_blank" style="text-decoration: underline">soapUI</a>.</p>
<p>Em relação a SOA, o formato WS-* também se mostra a melhor opção. SOA é uma maneira de se construir softwares baseado no conceito de serviços, onde esses serviços devem possuir um contrato formal, devem ser independentes (possuir baixo acoplamento) e devem ser reutilizáveis. Outro princípio de SOA diz que esses serviços devem ter a capacidade de serem descobertos e nesse ponto o WS-* mais uma vez sai na frente, pois o mesmo possui o protocolo <a href="http://pt.wikipedia.org/wiki/UDDI" target="_blank" style="text-decoration: underline">UDDI</a>, que é um método utilizado para publicar e descobrir diretórios de serviço em uma arquitetura SOA.</p>
<h3>REST &#8211; O que é, vantagens e desvantagens</h3>
<p>REST é o acrônimo de <em>Representational State Transfer</em>, que é um modelo de arquitetura baseado no protocolo HTTP e que utiliza <a href="http://en.wikipedia.org/wiki/Uniform_Resource_Identifier" target="_blank" style="text-decoration: underline">URI</a> para identificação dos seus serviços. REST é uma maneira de construir serviços usando o protocolo HTTP como ele foi concebido, ou seja, usando: POST, GET, DELETE e PUT.</p>
<p>Serviços RESTful (serviços REST) partem do princípio que o protocolo HTTP é rico o suficiente para que seja criada uma abstração  &#8211; no caso WS-* seria uma abstração &#8211; para construção de serviços.</p>
<p>Uma das vantagens em utilizar serviços REST sem dúvida nenhuma é a simplicidade, afinal criar serviços REST é usar de maneira parecida o protocolo HTTP como usamos atualmente no desenvolvimento de aplicações Web, ou seja, se você usa o método POST em um formulário, você consequentemente está usando REST, a única diferença é que o submit desse formulário devolveria um conteúdo HTML, quando que em um serviço RESTful o indicado seria devolver uma estrutura mais padronizada, no caso um XML ou um <a href="http://www.json.org/" target="_blank" style="text-decoration: underline">JSON</a>, por exemplo.</p>
<p>Outra vantagem no uso de serviços REST é a performance, pois os seus <em>request/response</em> são infinitamente menores se comparados com os do formato WS-*, e são menores, porque não precisam ser envelopados dentro de um pacote SOAP, serviços REST apenas recebem o que precisam e consequentemente respondem o que é necessário.</p>
<p>Serviços construídos no formato REST também são mais humanos, ou seja, são mais compreensíveis que serviços WS-*. Isso se deve ao fato de que para construir um serviço REST não é necessário conhecer N especificações, não é necessário saber o que é WSDL, assim como também não é necessário conhecer um pacote SOAP. São mais humanos também, pois são identificados através de URI&#8217;s.</p>
<p>Dentre outras vantagens de serviços RESTful destaco a possibilidade de fazer <em>cache</em> das operações, possibilidade de criar camadas intermediárias (<em>proxy</em>, <em>gateway</em>, <em>cache servers</em>) com o intuito de aumentar a performance ou segurança e possibilidade de usar HTTPS nativamente.</p>
<p>Pensando em um ambiente corporativo, em aplicações <em>enterprise</em> e em arquitetura SOA, começam a surgir alguns problemas em relação a adoção de serviços REST, a começar pelo fato de que REST não possui um padrão oficial para descrição dos seus serviços, até existe uma frente interessada em criar esse padrão utilizando <a href="https://wadl.dev.java.net/" target="_blank" style="text-decoration: underline">WADL</a>, mas ainda não existe nada oficial, portanto essa é uma grande desvantagem.</p>
<p>Serviços REST também não possuem estado, são <em><a href="http://en.wikipedia.org/wiki/Stateless_server" target="_blank" style="text-decoration: underline">stateless</a></em>, ao contrário de serviços WS-*, pois os mesmos podem possuir estado entre uma chamada e outra. Serviços REST também não permitem requisições assíncronas e utilizando o formato WS-* é possível fazer requisições sem que seja necessário esperar uma resposta.</p>
<p>Pensando em SOA, REST não é a melhor opção, afinal, conforme citado anteriormente, REST não possui um contrato formal para definir a interface dos seus serviços, assim como também não possui uma maneira para que esses serviços possam ser publicados e descobertos.</p>
<p>Outra desvantagem no meu modo de ver, é que para construção de um processo BPEL, se faz por necessário que os serviços possuam uma interface que os descreva (WSDL), nesse caso serviços REST não seriam os mais indicados para serem usados dentro de um processo BPEL, contudo existem algumas maneiras de realizar esse <em><a href="http://whatis.techtarget.com/definition/0,,sid9_gci868091,00.html" class="broken_link"  style="text-decoration: underline" target="_blank">workaround</a></em> para usar serviços REST dentro de um processo BPEL. Dependendo da ferramenta escolhida, algumas fornecem soluções como a criação de <em>Partner Links</em> HTTP, ou seja, são <em>Partner Links</em> próprios para serviços REST, ou então, algumas outras ferramentas fornecem maneiras um pouco mais trabalhosas como a criação de um WSDL que descreva o serviço HTTP (REST).</p>
<h3>Afinal, qual devo usar?</h3>
<p>Sinto lhe frustrar, mas a resposta para essa pergunta é: depende, cada caso é um caso.</p>
<p>Não é inteligente ignorar uma ou outra opção, ou ser cego a ponto de desconsiderar os benefícios e vantagens de cada uma. Na minha opinião, fomentar essa discussão é cair no mesmo de discutir <a href="http://www.marcuscavalcanti.net/blog/2009/03/17/ponto-para-o-rails/" target="_blank" style="text-decoration: underline">&#8220;qual linguagem é melhor&#8221;</a>, afinal cada uma tem seu propósito.</p>
<p>Os fanáticos por REST costumam dizer que o formato WS-* só existe, pois os grandes <em>players</em> do mercado (Oracle, IBM, Microsoft, etc) estão envolvidos, já que esses grandes <em>players</em> desenvolvem ferramentas específicas para facilitar a criação e a manutenção a serviços construídos dessa maneira. Quem faz essa afirmação está completamente equivocado, pois por mais burocrático que serviços WS-* possam ser, eles ainda possuem uma enorme utilidade que serviços REST ainda não satisfazem.</p>
<p>Agora, no caso de serviços para celulares, PDA&#8217;s, e outros dispositivos móveis, onde cada dado enviado/recebido tem um custo alto, utilizar serviços REST é sem dúvida a melhor opção. Da mesma maneira que para prover serviços de aplicativos web, como <em><a href="http://pt.wikipedia.org/wiki/Mashup" target="_blank" style="text-decoration: underline">mashups</a></em>, REST também é a melhor opção, a maior prova disso é que em serviços como Twitter, Facebook, Amazon e até mesmo o Google, estão usando REST em larga escala. </p>
<p>Mas também existe o outro lado da moeda, pois pensando em um ambiente complexo, com muitos serviços, repositórios, ainda não dá para pensar em outro formato que não seja WS-*.</p>
<p>Enfim, mais uma vez volto ao ponto de que devemos conhecer as opções para tomar a decisão de escolher o que é mais adequado, REST não substitui WS-* e vice-versa, <a href="http://www.infoq.com/news/2007/07/wsrest" target="_blank" style="text-decoration: underline">insistir nessa rixa não agrega</a> e quem não enxerga dessa maneira, precisa rever seus conceitos, ou então estudar mais.</p>
<p>Aproveito para deixar o link para download de uma apresentação sobre REST, que fiz no meio do ano passado, na empresa que eu trabalho: <a href="http://www.marcuscavalcanti.net/blog/wp-content/uploads/apresentacao-rest.ppt" target="_blank" style="text-decoration: underline">clique para fazer download</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.marcuscavalcanti.net/blog/2009/04/13/webservices-rest-versus-ws-soap/feed/</wfw:commentRss>
		<slash:comments>16</slash:comments>
		</item>
		<item>
		<title>Primeiras impressões sobre o Yii framework</title>
		<link>http://www.marcuscavalcanti.net/blog/2009/04/09/primeiras-impressoes-sobre-o-yii-framework/</link>
		<comments>http://www.marcuscavalcanti.net/blog/2009/04/09/primeiras-impressoes-sobre-o-yii-framework/#comments</comments>
		<pubDate>Thu, 09 Apr 2009 05:33:49 +0000</pubDate>
		<dc:creator>Marcus Cavalcanti</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Framework]]></category>
		<category><![CDATA[Yii]]></category>

		<guid isPermaLink="false">http://www.marcuscavalcanti.net/blog/?p=875</guid>
		<description><![CDATA[Seguindo a febre de frameworks, que borbulham a todo momento, em todas as linguagens, de todos os gostos, surge então mais um! Na verdade, se fosse mais um eu nem me daria ao trabalho de estar escrevendo sobre algo que seria irrelevante, mas esse tal de Yii Framework ao que me parece veio para ficar, [...]]]></description>
			<content:encoded><![CDATA[<p>Seguindo a febre de <em>frameworks</em>, que borbulham a todo momento, em todas as linguagens, de todos os gostos, surge então mais um! Na verdade, se fosse mais um eu nem me daria ao trabalho de estar escrevendo sobre algo que seria irrelevante, mas esse tal de <a href="http://www.yiiframework.com/" target="_blank" style="text-decoration: underline">Yii Framework</a> ao que me parece veio para ficar, mesmo tendo pouquíssimo contato com ele, acho que dá para afirmar isso com alguma certeza.</p>
<h3>O que é o Yii Framework?</h3>
<p>O Yii é um <em>framework</em> que está sendo mantido e desenvolvido pelo <a href="http://qiangxue.com/" target="_blank" style="text-decoration: underline">criador</a> do <em>framework</em> <a href="http://www.xisc.com/" target="_blank" style="text-decoration: underline">Prado</a>, que é um famoso <em>framework</em> <a href="http://www.php.net" target="_blank" style="text-decoration: underline">PHP</a> baseado no conceito de <em><a href="http://en.wikipedia.org/wiki/Event-driven_programming" target="_blank" style="text-decoration: underline">event-driven programming</a></em>, que a grosso modo seria um <em>framework</em> em que o seu fluxo é determinado por eventos.</p>
<h3>Comparação com outros <em>frameworks</em></h3>
<p>Quando digo que o Yii não é mais um <em>framework</em> <a href="http://pt.wikipedia.org/wiki/MVC" target="_blank" style="text-decoration: underline">MVC</a>, digo, pois ele parece ser muito mais maduro, estável, flexível e bem projetado que o restante, além do que ele é focado em performance, ou seja, foi desenvolvido pensando em aplicações Web &#8220;parrudas&#8221; e que precisam ser <a href="http://pt.wikipedia.org/wiki/Escalabilidade" target="_blank" style="text-decoration: underline">escaláveis</a>.</p>
<p>Tenho alguma experiência com <em>frameworks</em> em PHP, já desenvolvi projetos que estão em produção usando o <a href="http://kohanaphp.com/" target="_blank" style="text-decoration: underline">Kohana</a>, <a href="http://www.codeigniter.com" target="_blank" style="text-decoration: underline">Code Igniter</a> e o <a href="http://www.drupal.org" target="_blank" style="text-decoration: underline">Drupal</a> (também é um <em>framework</em>!), além de já ter desenvolvido aplicações <em>dummy</em> usando o <a href="http://framework.zend.com/" target="_blank" style="text-decoration: underline">Zend Framework</a>, <a href="http://www.akelos.org/" target="_blank" style="text-decoration: underline">Akelos</a> e <a href="http://cakephp.org/" target="_blank" style="text-decoration: underline">Cake</a>, e por isso posso afirmar que o Yii é diferenciado. Por exemplo, o Code Igniter eu gosto bastante, mas ele é muito <em>lightweight</em> e não é PHP 5, o Zend Framework é sólido, mas na verdade é mais um conjunto de componentes do que um <em>framework</em>, o Kohana, que é um <em><a href="http://pt.wikipedia.org/wiki/Fork" target="_blank" style="text-decoration: underline">fork</a></em> do CI, é interessante, mas ainda precisa comer muito feijão com arroz, o Cake sinceramente não me agrada e o Akelos é bem interessante, mas tem pouca comunidade e documentação. Nenhum desses, com exceção do ZF, me parece ser um projeto a longo prazo como o Yii.</p>
<p>O Yii é baseado em várias idéias do queridinho Ruby on Rails, e assim como o RoR possui geradores de código para gerar: <em>controllers</em>, <em>models</em>, <em>scaffoldings</em> apenas usando linha de comando. Ainda não me acostumei muito com essas idéias de geradores de código hehe, sou um pouco conservador em relação a isso, e muita &#8220;mágica&#8221; as vezes me preocupa, mas de qualquer maneira esses geradores trazem uma agilidade absurda e no final das contas se houver um equilíbrio entre agilidade e controle do que está sendo gerado, acho que vale muito a pena.</p>
<h3>Principais atrativos</h3>
<p>Além de ser bem projetado, com uma arquitetura bem definida, uso de design patterns e facilidade de ser extendido, o que me atraiu no Yii foi algumas <em>features</em> mais avançadas e que outros <em>frameworks</em> não possuem nativamente, como: sistema de <em>cache</em> em camadas (usando <a href="http://www.danga.com/memcached/" target="_blank" style="text-decoration: underline">memcached</a> e <a href="http://br.php.net/apc" target="_blank" style="text-decoration: underline">apc</a>), suporte a web services (WS-*), <a href="http://en.wikipedia.org/wiki/Internationalization_and_localization" target="_blank" style="text-decoration: underline">internacionalização</a> de verdade, sistema de autenticação/permissão usando <a href="http://henriquebastos.net/2008/05/30/implemente-controles-de-acesso-eficientes-com-rbac/" target="_blank" style="text-decoration: underline">RBAC</a>, integração nativa com <a href="http://jquery.com" target="_blank" style="text-decoration: underline">jQuery</a>, acesso a dados usando DAO, ORM + ActiveRecord (com <em><a href="http://martinfowler.com/eaaCatalog/lazyLoad.html" target="_blank" style="text-decoration: underline">lazy loading</a></em>, inclusive), etc.</p>
<p>Outro ponto que me convenceu foi a <a href="http://www.yiiframework.com/doc/" target="_blank" style="text-decoration: underline">documentação</a>, que é bem completa, clara e objetiva, possuindo manuais, tutorias, screencasts, fóruns e API.</p>
<p>O <em>framework</em> também é todo modularizado, permitindo que componentes sejam desenvolvidos para serem totalmente desacoplados da aplicação.</p>
<h3>Aprendizado</h3>
<p>A curva de aprendizado do Yii é muito mais alta que a do CI ou do Kohana, por exemplo, apesar de no site do <em>framework</em> dizer o contrário. Mesmo com o <em>framework</em> tendo uma documentação extensa, <em>skeletons</em> para construção da aplicação e geradores de código, entender como funciona o <em>framework</em> e sua arquitetura não é tão simples como os outros <em>frameworks</em> citados anteriormente, mas isso não quer dizer que o código seja ilegível, ou difícil de entender, muito pelo contrário, como a tendência dos <em>frameworks</em> hoje em dia é descomplicar e humanizar, acredito que o Yii tenho seguido essa linha, apenas acho que para um desenvolvedor inexperiente será mais árduo aprender o Yii do que o CI.</p>
<h3>O que pode melhorar</h3>
<p>Como é um <em>framework</em> recente, mesmo tendo muitas funcionalidades mais avançadas, algumas outras ainda senti falta. Por exemplo, o <em>framework</em> ainda não tem um suporte para testes, seja <a href="http://dannorth.net/introducing-bdd" target="_blank" style="text-decoration: underline">BDD</a> ou <a href="http://www.agiledata.org/essays/tdd.html" target="_blank" style="text-decoration: underline">TDD</a> e isso hoje em dia é inaceitável. O RoR, por exemplo, é um <em>framework</em> que tem a parte de testes muito forte dentro do <em>framework</em> e toda sua comunidade também é assim, em PHP isso é um pouco diferente, portanto seria interessante que o Yii começasse a fornecer mecanismos para realização de testes, porém nada impede que se integre o <a href="http://www.simpletest.org/" target="_blank" style="text-decoration: underline">SimpleTest</a> ou <a href="http://www.phpunit.de/" target="_blank" style="text-decoration: underline">PHPUnit</a> com o Yii.</p>
<p>Outra coisa que senti falta também foi suporte para serviços <a href="http://www.xfront.com/REST-Web-Services.html" target="_blank" style="text-decoration: underline">REST</a>, o <em>framework</em> apesar de oferecer suporte a <em>Webservices</em>, só oferece suporte para Webservices no padrão SOAP/WSDL, REST seria muito interessante, até mesmo porque um dos pilares do <em>framework</em> é performance.</p>
<h3>Conclusão</h3>
<p>Estou animado com esse novo <em>framework</em>, apesar de ter pouco contato, senti seriedade no trabalho, mas só posso afirmar tudo que eu disse depois que eu tiver uma experiência real com o <em>framework</em>.</p>
<p>No momento estou participando de um <em>job</em> novo, em que estou definindo o que será usado como <em>framework</em> web, na verdade, não gosto e não costumo usar tecnologias que não tenho experiência em projetos que estou a frente, mas como esse projeto não é crítico e nem complexo, possa ser que eu use o Yii para ter uma opinião formada sobre o mesmo, e caso eu opte realmente por essa opção, irei comunicando o progresso.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.marcuscavalcanti.net/blog/2009/04/09/primeiras-impressoes-sobre-o-yii-framework/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Mostrando mensagens de log no stdOut (console) do Weblogic</title>
		<link>http://www.marcuscavalcanti.net/blog/2009/03/27/mostrando-mensagens-de-log-no-console-do-weblogic/</link>
		<comments>http://www.marcuscavalcanti.net/blog/2009/03/27/mostrando-mensagens-de-log-no-console-do-weblogic/#comments</comments>
		<pubDate>Fri, 27 Mar 2009 04:17:26 +0000</pubDate>
		<dc:creator>Marcus Cavalcanti</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Console]]></category>
		<category><![CDATA[log]]></category>
		<category><![CDATA[Oracle]]></category>
		<category><![CDATA[stdOut]]></category>
		<category><![CDATA[Weblogic]]></category>
		<category><![CDATA[Workshop]]></category>

		<guid isPermaLink="false">http://www.marcuscavalcanti.net/blog/?p=837</guid>
		<description><![CDATA[Essa é uma dica bem rapidinha, que na verdade estou postando, pois não achei nada no Google muito relevante a respeito. Como imagino que existem pessoas com o mesmo probleminha, então segue a dica logo abaixo.
Na aplicação web do projeto que estou trabalhando, nós fazemos o uso da API Commons Logging do Apache para poder [...]]]></description>
			<content:encoded><![CDATA[<p>Essa é uma dica bem rapidinha, que na verdade estou postando, pois não achei nada no Google muito relevante a respeito. Como imagino que existem pessoas com o mesmo probleminha, então segue a dica logo abaixo.</p>
<p>Na aplicação web do projeto que estou trabalhando, nós fazemos o uso da API <a href="http://commons.apache.org/logging/" target="_blank" style="text-decoration: underline">Commons Logging</a> do Apache para poder fazer <em>logging</em> da aplicação, só que para o <em>log</em> aparecer corretamente no <em>console</em> existe um pequeno &#8220;macete&#8221;, que por incrivel que pareça não diz com mais detalhes na <a href="http://e-docs.bea.com/wls/docs103/logging/config_logs.html#wp1011903" target="_blank" style="text-decoration: underline">documentação do Weblogic</a>.</p>
<p>O probleminha era, que por mais que eu fizesse o seguinte:</p>
<p><!--DEVFMTCODE--><pre class="devcodeblock" title="Java"><div class="devcodeoverflow"><ol><li></li><li><span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> SovWS <span style="color: #009900;">&#123;</span></li><li>&nbsp;</li><li>	<span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000000; font-weight: bold;">static</span> Log log <span style="color: #339933;">=</span>&nbsp;&nbsp;LogFactory.<span style="color: #006633;">getLog</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;SOV-&quot;</span><span style="color: #339933;">+</span>SovWS.<span style="color: #000000; font-weight: bold;">class</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></li><li>&nbsp;</li><li>	@WebMethod</li><li>	<span style="color: #000000; font-weight: bold;">public</span> SaveMetaResponseDocument saveMeta<span style="color: #009900;">&#40;</span>SaveMetaRequestDocument request<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>		</li><li>		log.<span style="color: #006633;">info</span><span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">getClass</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">+</span> <span style="color: #0000ff;">&quot; iniciando a nova meta&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ....</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #009900;">&#125;</span></li><li><span style="color: #009900;">&#125;</span></li><li></li></ol></div></pre><!--END_DEVFMTCODE--></p>
<p>Eu não conseguia fazer com que a mensagem de <em>log</em> aparecesse no console do <em>Workshop</em>, ainda que tudo estivesse correto.</p>
<p>Para resolver é muito simples, basta ir nas propriedades do projeto, ir nos <em>facets</em> do projeto e verificar se a extensão <strong><em>Weblogic Integrated Commons Logging</em></strong> está como um <em>facet</em> do projeto, se não estiver, está aí o problema e para resolver basta adicionar esse novo <em>facet</em>.</p>
<p>Para ter certeza que está tudo certinho, sugiro abrir o arquivo <strong>weblogic-application.xml</strong> e verificar se a seguinte configuração está presente:</p>
<p><!--DEVFMTCODE--><pre class="devcodeblock" title="XML"><div class="devcodeoverflow"><ol><li></li><li><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;wls:library-ref<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;wls:library-name<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>wls-commonslogging-bridge<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/wls:library-name<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;wls:specification-version<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>1.0<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/wls:specification-version<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;wls:exact-match<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>true<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/wls:exact-match<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></li><li><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/wls:library-ref<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></li><li></li></ol></div></pre><!--END_DEVFMTCODE--></p>
<p>Se a seguinte configuração estiver presente, pronto, tudo ok! Agora o <em>log</em> deverá aparecer no console sem problemas.</p>
<p>PS: Só para ressaltar que essa dica é válida para ambiente de desenvolvimento.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.marcuscavalcanti.net/blog/2009/03/27/mostrando-mensagens-de-log-no-console-do-weblogic/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Oracle BPM com JSP e Ajax</title>
		<link>http://www.marcuscavalcanti.net/blog/2009/03/23/oraclebpm-com-jsp-e-ajax/</link>
		<comments>http://www.marcuscavalcanti.net/blog/2009/03/23/oraclebpm-com-jsp-e-ajax/#comments</comments>
		<pubDate>Mon, 23 Mar 2009 18:54:57 +0000</pubDate>
		<dc:creator>Marcus Cavalcanti</dc:creator>
				<category><![CDATA[BPM]]></category>
		<category><![CDATA[Ajax]]></category>
		<category><![CDATA[ALBPM]]></category>
		<category><![CDATA[JSP]]></category>
		<category><![CDATA[Oracle]]></category>
		<category><![CDATA[OracleBPM]]></category>
		<category><![CDATA[Tutorial]]></category>

		<guid isPermaLink="false">http://www.marcuscavalcanti.net/blog/?p=750</guid>
		<description><![CDATA[Nos projetos de BPM que tenho participado utilizando o Oracle BPM como solução BPMS, dificilmente faço o uso de presentations, é muito mais comum eu optar em utilizar páginas JSP como camada de apresentação dos meus processos. Isso se dá pelo fato de que as presentations são bastante limitadas, e quando se faz por necessário [...]]]></description>
			<content:encoded><![CDATA[<p>Nos projetos de BPM que tenho participado utilizando o Oracle BPM como solução BPMS, dificilmente faço o uso de <em>presentations</em>, é muito mais comum eu optar em utilizar páginas <a href="http://pt.wikipedia.org/wiki/JavaServer_Pages" target="_blank" style="text-decoration: underline">JSP</a> como camada de apresentação dos meus processos. Isso se dá pelo fato de que as <em>presentations</em> são bastante limitadas, e quando se faz por necessário ter interfaces mais elaboradas e customizadas, o JSP passa a ser a melhor opção.</p>
<p>Usando JSP, um novo leque de opções passou a existir e uma dessas opções passou a ser a possibilidade de usar Ajax. Ajax, para quem nunca ouviu falar, não é uma linguagem, uma API, tão pouco um framework, Ajax é o acrônimo de <strong><em>Asynchronous Javascript And XML</em></strong> e nada mais é que um conjunto de técnicas usadas para criar aplicações web interativas (<a href="http://en.wikipedia.org/wiki/Rich_Internet_application" target="_blank" style="text-decoration: underline">RIA</a>). Um dos pilares do Ajax é permitir comunicação assíncrona entre cliente e servidor utilizando requisições <a href="http://pt.wikipedia.org/wiki/HTTP" target="_blank" style="text-decoration: underline">HTTP</a>.</p>
<p>O Oracle BPM oferece uma maneira bem interessante de usar Ajax nas páginas JSP, mesmo não sendo nativa e também não tendo nada a respeito dizendo na documentação, é possível fazer a integração da camada de apresentação de um processo BPM com o próprio processo de uma maneira bem tranquila.</p>
<p>Para exemplificar isso melhor, criei um projeto bem simples no Oracle BPM, que na verdade só serve para mostrar como funciona essa integração entre páginas JSP e métodos dentro de um BPM Object através de Ajax.</p>
<h3>Primeiros passos</h3>
<p>Para começar, criei um BPM Object bem simples, que possui 3 atributos: name (String), mail (String), documents (String[]). Os dois primeiros atributos, que representam o nome e o email de alguém, são do tipo String e o terceiro atributo, que no caso representa os documentos de uma pessoa, é do tipo Array de String. Chamei esse objeto de: <strong>BpmObject</strong>.</p>
<p>Nesse mesmo objeto (BpmObject), criei ainda um método, esse método será responsável por retornar os documentos de um usuário. Na verdade esse é o método que irei chamar via requisição Ajax através de uma página JSP. O nome desse método ficou definido como <strong>getDocuments()</strong>.</p>
<p>No futuro precisarei alterar esse objeto, mas eu explico depois.</p>
<h3>Criando a página JSP</h3>
<p>No Oracle BPM, para informar que a apresentação de determinado BPM Object deva se dar por meio de uma página JSP, se faz por necessário a utilização de <em>Screenflows</em>. <em><a href="http://download.oracle.com/docs/cd/E13154_01/bpm/docs65/studio/modules/screenflows/c_What_is_a_Screenflow.html" target="_blank" style="text-decoration: underline">Screenflow</a></em> é um fluxo semelhante ao de um processo normal, mas a principal diferença é que o mesmo é executado por um participante único, ou seja, dentro de um <em>Screenflow</em> não existem <em><a href="http://vishals.blogspot.com/2007/09/lanes-and-pools.html" target="_blank" style="text-decoration: underline">lanes</a></em>.</p>
<p>Após ter criado um processo normal, apenas com uma atividade do tipo <em>Global Creation</em> (para criar uma instância do processo) e também com uma <em>Interactive Activity</em> (para apontar para o <em>Screenflow</em>), parti para criação do <em>Screenflow</em> de fato. O <em>Screenflow</em> em questão, será tão simples quanto o processo no qual ele está associado, no caso contará apenas com uma única atividade do tipo <em>Interactive Component Call</em>, que será a responsável por &#8220;chamar&#8221; uma página JSP associando-a ao BPM Object criado no passo anterior.</p>
<p>Para chamar uma página JSP, se faz por necessária associar um BPM Object a mesma, então nesse caso criei um váriavel de instância do tipo BpmObject (o mesmo criado no primeiro passo) e dei o seu nome de <strong>bpmObject</strong>. Após isso, criei uma página JSP dentro de: <strong>/projetoBPM/webRoot/customJSP/ajaxPage.jsp</strong>.</p>
<p>O nome da página em questão é <strong>ajaxPage.jsp</strong>, e por enquanto ela irá possuir o seguinte código:</p>
<p><!--DEVFMTCODE--><pre class="devcodeblock" title="Java"><div class="devcodeoverflow"><ol><li></li><li><span style="color: #339933;">&lt;%</span>@ page session<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;true&quot;</span><span style="color: #339933;">%&gt;</span></li><li><span style="color: #339933;">&lt;%</span>@ taglib uri<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;http://java.sun.com/jstl/core&quot;</span> prefix<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;c&quot;</span><span style="color: #339933;">%&gt;</span></li><li><span style="color: #339933;">&lt;%</span>@ taglib uri<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;http://fuego.com/jsp/ftl&quot;</span> prefix<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;f&quot;</span><span style="color: #339933;">%&gt;</span></li><li>&nbsp;</li><li><span style="color: #339933;">&lt;!</span>DOCTYPE html <span style="color: #000000; font-weight: bold;">PUBLIC</span> <span style="color: #0000ff;">&quot;-//W3C//DTD XHTML 1.0 Strict//EN&quot;</span> <span style="color: #0000ff;">&quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd&quot;</span><span style="color: #339933;">&gt;</span></li><li><span style="color: #339933;">&lt;</span>html xmlns<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;http://www.w3.org/1999/xhtml&quot;</span><span style="color: #339933;">&gt;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #339933;">&lt;</span>head<span style="color: #339933;">&gt;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #339933;">&lt;</span>title<span style="color: #339933;">&gt;</span>Teste Ajax<span style="color: #339933;">/</span>title<span style="color: #339933;">&gt;</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #339933;">&lt;</span>script type<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;text/javascript&quot;</span> src<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;&lt;f:webResources relativePath='js/prototype-1.6.0.3.js'/&gt;&quot;</span><span style="color: #339933;">&gt;&lt;/</span>script<span style="color: #339933;">&gt;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #339933;">&lt;/</span>head<span style="color: #339933;">&gt;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #339933;">&lt;</span>body leftmargin<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;0&quot;</span> topmargin<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;0&quot;</span><span style="color: #339933;">&gt;</span></li><li>&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;Teste Ajax</li><li>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #339933;">&lt;</span>br<span style="color: #339933;">/&gt;&lt;</span>br<span style="color: #339933;">/&gt;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;Nome<span style="color: #339933;">:</span> <span style="color: #339933;">&lt;</span>c<span style="color: #339933;">:</span>out value<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;${bpmObject.nome}&quot;</span> <span style="color: #339933;">/&gt;</span> </li><li>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #339933;">&lt;</span>br<span style="color: #339933;">/&gt;&lt;</span>br<span style="color: #339933;">/&gt;</span></li><li>&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #339933;">&lt;</span>div id<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;teste&quot;</span><span style="color: #339933;">&gt;&lt;/</span>div<span style="color: #339933;">&gt;</span></li><li>&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #339933;">&lt;/</span>body<span style="color: #339933;">&gt;</span></li><li>&nbsp;</li><li><span style="color: #339933;">&lt;/</span>html<span style="color: #339933;">&gt;</span></li></ol></div></pre><!--END_DEVFMTCODE--></p>
<p>Então, relembrando os passos até aqui:</p>
<p>1) Criação de BPM Object com 3 atributos e um método;<br />
2) Criação de processo com uma atividade do tipo <em>Global Creation</em> e outra do tipo <em>Interactive Activity</em>;<br />
3) Criação de <em>Screenflow</em>;<br />
4) Associação (<em>Implementation Type</em>) da <em>Interactive Activity</em> do processo ao <em>Screenflow</em> criado;<br />
5) Criação de atividade do tipo <em>Interactive Component Call</em> no <em>Screenflow</em>;<br />
6) Criação de váriavel de instância no <em>Screenflow</em> com o tipo sendo o mesmo do BPM Object que foi criado no primeiro passo;<br />
7) Definição do <em>Implementation Type</em> da <em>Interactive Component Call</em> como <em>BPM Object Interactive Call</em>;<br />
8) Associação do BPM Object criado como váriavel de instância da <em>Interactive Component Call</em> do <em>Screenflow</em>;<br />
9) Definição da página ajaxPage.jsp como <em>JSP Presentation</em> da <em>Interactive Component Call</em> do <em>Screenflow</em>.</p>
<p>Feito os passos acima, a estrutura do processo está pronta para criação da página JSP que irá fazer a requisição via Ajax a um método do BPM Object que foi criado no primeiro passo.</p>
<h3>Fazendo a requisição Ajax e explicando alguns components da <em>taglib</em> do Oracle BPM</h3>
<p>Para criação do mecanismo que irá fazer a requisição Ajax, se faz por necessário a utilização da <em>taglib</em> do Oracle BPM, sem ela não seria possível usar Ajax, ou então seria bastante árduo fazer tal integração.</p>
<p>Por exemplo, para incluir a biblioteca <a href="http://www.prototypejs.org/" target="_blank" style="text-decoration: underline">Prototype</a>, que no caso será a responsável por fazer o &#8220;trabalho sujo&#8221; e criar o objeto XMLHttpRequest para fazer a requisição assíncrona, utilizei a <em>tag</em> <strong>f:webResources</strong> (linha 10). Esta <em>tag</em> inclui os <em>resources</em> inclusos no projeto BPM, sem que seja necessário informar explicitamente o <em>context path</em> da aplicação para inclusão de imagens, CSS ou Javascripts.</p>
<p>Outra <em>tag</em> importante é a <strong>f:invokeUrl</strong>, que no caso irá gerar a URL para execução de um método dentro de um BPM Object. Dessa forma, a página JSP precisa ser alterada, pois agora irá contar com uma função Javascript que irá fazer a chamada via Ajax ao método <strong>getDocuments()</strong> do BPM Object criado no primeiro passo, retornando o <em>output</em> do método para div <strong>teste</strong>.</p>
<p>Página JSP alterada:</p>
<p><!--DEVFMTCODE--><pre class="devcodeblock" title="Java"><div class="devcodeoverflow"><ol><li></li><li><span style="color: #339933;">&lt;%</span>@ page session<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;true&quot;</span><span style="color: #339933;">%&gt;</span></li><li><span style="color: #339933;">&lt;%</span>@ taglib uri<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;http://java.sun.com/jstl/core&quot;</span> prefix<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;c&quot;</span><span style="color: #339933;">%&gt;</span></li><li><span style="color: #339933;">&lt;%</span>@ taglib uri<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;http://fuego.com/jsp/ftl&quot;</span> prefix<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;f&quot;</span><span style="color: #339933;">%&gt;</span></li><li>&nbsp;</li><li><span style="color: #339933;">&lt;!</span>DOCTYPE html <span style="color: #000000; font-weight: bold;">PUBLIC</span> <span style="color: #0000ff;">&quot;-//W3C//DTD XHTML 1.0 Strict//EN&quot;</span> <span style="color: #0000ff;">&quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd&quot;</span><span style="color: #339933;">&gt;</span></li><li><span style="color: #339933;">&lt;</span>html xmlns<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;http://www.w3.org/1999/xhtml&quot;</span><span style="color: #339933;">&gt;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #339933;">&lt;</span>head<span style="color: #339933;">&gt;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #339933;">&lt;</span>title<span style="color: #339933;">&gt;</span>Teste Ajax<span style="color: #339933;">/</span>title<span style="color: #339933;">&gt;</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #339933;">&lt;</span>script type<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;text/javascript&quot;</span> src<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;&lt;f:webResources relativePath='js/prototype-1.6.0.3.js'/&gt;&quot;</span><span style="color: #339933;">&gt;&lt;/</span>script<span style="color: #339933;">&gt;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #339933;">&lt;</span>script<span style="color: #339933;">&gt;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;function callAjaxMethod <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span></li><li>		var bpmUrl	<span style="color: #339933;">=</span><span style="color: #0000ff;">'&lt;f:invokeUrl var=&quot;bpmObject&quot; methodName=&quot;getDocuments&quot; /&gt;'</span><span style="color: #339933;">;</span>		</li><li>		<span style="color: #000000; font-weight: bold;">return</span> bpmUrl<span style="color: #339933;">;</span></li><li>	<span style="color: #009900;">&#125;</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</li><li>&nbsp;</li><li>	<span style="color: #000000; font-weight: bold;">new</span> Ajax.<span style="color: #006633;">Updater</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'teste'</span>, callAjaxMethod<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #339933;">&lt;/</span>script<span style="color: #339933;">&gt;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #339933;">&lt;/</span>head<span style="color: #339933;">&gt;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #339933;">&lt;</span>body leftmargin<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;0&quot;</span> topmargin<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;0&quot;</span><span style="color: #339933;">&gt;</span></li><li>&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;Teste Ajax</li><li>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #339933;">&lt;</span>br<span style="color: #339933;">/&gt;&lt;</span>br<span style="color: #339933;">/&gt;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;Nome<span style="color: #339933;">:</span> <span style="color: #339933;">&lt;</span>c<span style="color: #339933;">:</span>out value<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;${bpmObject.nome}&quot;</span> <span style="color: #339933;">/&gt;</span> </li><li>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #339933;">&lt;</span>br<span style="color: #339933;">/&gt;&lt;</span>br<span style="color: #339933;">/&gt;</span></li><li>&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #339933;">&lt;</span>div id<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;teste&quot;</span><span style="color: #339933;">&gt;&lt;/</span>div<span style="color: #339933;">&gt;</span></li><li>&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #339933;">&lt;/</span>body<span style="color: #339933;">&gt;</span></li><li>&nbsp;</li><li><span style="color: #339933;">&lt;/</span>html<span style="color: #339933;">&gt;</span></li><li></li></ol></div></pre><!--END_DEVFMTCODE--></p>
<p>Repare que foi criada a função JS <strong>callAjaxMethod</strong>. Abaixo dessa função existe ainda a função JS <strong><a href="http://www.prototypejs.org/api/ajax/updater" target="_blank" style="text-decoration: underline">Ajax.Updater</a></strong>, que no caso é uma função da biblioteca Prototype que irá fazer a chamada ao método do BPM Object, retornando seu <em>output</em> para a div <strong>teste</strong>.</p>
<h3>Criando um <em>output</em> para o método getDocuments do BPM Object</h3>
<p>Finalmente essa é a última parte desse pequeno tutorial. Agora a única coisa que falta é criar um <em>output</em> para o método do BPM Object que irá ser chamado via requisição Ajax.</p>
<p>Antes de mais nada, preciso dizer algo a respeito da <em>tag</em> <strong>f:invokeUrl</strong>, pois para ela funcionar corretamente existem algumas peculiariades. </p>
<p>Para um método de um BPM Object ser reconhecido por esta <em>tag</em>, ele deve ter uma das quatro assinaturas abaixo:</p>
<ul>
<li>methodName(Fuego.Net.HttpRequest request, Fuego.Net.HttpResponse response)</li>
<li>methodName(java.util.Map requestParameters, java.util.Map requestHeaders)</li>
<li>methodName(java.util.Map requestParameters)</li>
<li>methodName()</li>
</ul>
<p>No caso, eu optei por utilizar a primeira opção, pois para usar a função <strong>Ajax.Updater</strong> da Prototype, eu preciso escrever diretamente no <em>output</em> do método, ao invés de setar as informações necessárias através dos seus atributos.</p>
<p>Em virtude disso, o método <strong>getDocuments</strong> do objeto <strong>BpmObject</strong> agora passará a ter a seguinte assinatura:</p>
<p><!--DEVFMTCODE--><pre class="devcodeblock" title="Java"><div class="devcodeoverflow"><ol><li></li><li>getDocuments<span style="color: #009900;">&#40;</span>Fuego.<span style="color: #006633;">Net</span>.<span style="color: #006633;">HttpRequest</span> request, Fuego.<span style="color: #006633;">Net</span>.<span style="color: #006633;">HttpResponse</span> response<span style="color: #009900;">&#41;</span></li><li></li></ol></div></pre><!--END_DEVFMTCODE--></p>
<p>Agora, finalmente o código do método <strong>getDocuments</strong>, que ficará da seguinte maneira:</p>
<p><!--DEVFMTCODE--><pre class="devcodeblock" title="Java"><div class="devcodeoverflow"><ol><li></li><li><span style="color: #000000; font-weight: bold;">for</span> <span style="color: #009900;">&#40;</span><a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #003399;">String</span></a> doc <span style="color: #339933;">:</span> documents<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;response.<span style="color: #006633;">bodyTextContent</span><span style="color: #009900;">&#40;</span>arg1 <span style="color: #339933;">:</span> doc<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></li><li><span style="color: #009900;">&#125;</span></li><li></li></ol></div></pre><!--END_DEVFMTCODE--></p>
<p>No código acima, estou percorrendo o atributo <strong>documents</strong> (array) e imprimindo no <em>output</em> todos os documentos definidos para aquele atributo, dessa forma, quando a função <strong>callAjaxMethod</strong> é chamada na página JSP, ela automaticamente chama (assincronamente) este método contido dentro do BPM Object, imprimindo todos os documentos definidos para dentro da div com o ID <strong>teste</strong>.</p>
<h3>Conclusão</h3>
<p>Utilizando os recursos corretos do Oracle BPM, como sua taglib e seus componentes, não é muito difícil fazer uma tela de apresentação mais interativa usando Ajax. No exemplo acima, foi criado um projeto bem simples, apenas para ilustrar, com o intuito de mostrar a atualização do conteúdo de uma div feita assincronamente através de uma requisição Ajax. </p>
]]></content:encoded>
			<wfw:commentRss>http://www.marcuscavalcanti.net/blog/2009/03/23/oraclebpm-com-jsp-e-ajax/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Ponto para o Rails!</title>
		<link>http://www.marcuscavalcanti.net/blog/2009/03/17/ponto-para-o-rails/</link>
		<comments>http://www.marcuscavalcanti.net/blog/2009/03/17/ponto-para-o-rails/#comments</comments>
		<pubDate>Tue, 17 Mar 2009 03:34:08 +0000</pubDate>
		<dc:creator>Marcus Cavalcanti</dc:creator>
				<category><![CDATA[Tecnologia, Software & Desenvolvimento]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Rails]]></category>
		<category><![CDATA[RoR]]></category>

		<guid isPermaLink="false">http://www.marcuscavalcanti.net/blog/?p=671</guid>
		<description><![CDATA[É muito curioso ver todo o frenesi e o burburinho que o Rails (RoR) vem causando entre os desenvolvedores mundo a fora, pelo menos aos que estão próximos a mim isso é nítido, as pessoas ficam maravilhadas, quase em êxtase! Acho isso fantástico, pois de certa forma o RoR tem feito com que uma série [...]]]></description>
			<content:encoded><![CDATA[<p>É muito curioso ver todo o frenesi e o burburinho que o <a href="http://rubyonrails.org/" target="_blank" style="text-decoration: underline">Rails (RoR)</a> vem causando entre os desenvolvedores mundo a fora, pelo menos aos que estão próximos a mim isso é nítido, as pessoas ficam maravilhadas, quase em êxtase! Acho isso fantástico, pois de certa forma o RoR tem feito com que uma série de preconceitos sejam quebrados e esquecidos. E qual o principal motivo para tudo isso? A simplicidade e a praticidade.</p>
<p>Linguagens de programação tendem a ser parecidas com religião ou com times de futebol, a pessoa simplesmente escolhe uma e defende aquilo com todas as forças, geralmente de forma cega. Eu particularmente acredito que, para defender ou criticar algo, se faz por necessário conhecer profundamente aquilo que você defende ou critica, pois só assim você terá argumentos para apontar falhas ou reconhecer méritos. Sou, ainda, a favor da filosofia &#8220;cabeça aberta&#8221;, que em poucas palavras quer dizer: não tenha medo, muito menos preconceito, de conhecer algo novo, conheça para a partir disso você ter uma opinião formada se aquilo te agrada, ou não.</p>
<p>É comum acontecer em fóruns e em listas de discussão debates sobre <a href="http://www.google.com.br/search?hl=pt-BR&#038;client=firefox-a&#038;rls=com.ubuntu%3Aen-US%3Aunofficial&#038;hs=dBQ&#038;q=qual+linguagem+de+programa%C3%A7%C3%A3o+%C3%A9+melhor&#038;btnG=Pesquisar&#038;meta=" target="_blank" style="text-decoration: underline">&#8220;qual linguagem é melhor&#8221;</a>, na maioria das vezes as pessoas atacam uma linguagem, ou defendem outra, simplesmente baseadas em sua opinião pessoal, ou melhor, baseados na falta de conhecimento. As pessoas não conseguem enxergar que todas têm seus prós e contras, como tudo na vida, e que a partir de uma situação real que é possível avaliar a melhor opção.</p>
<p>Eu comecei a programar através do PHP e hoje em dia trabalho basicamente só com Java. Programadores Java tendem a achar PHP um lixo, na maioria das vezes com embasamentos e teorias totalmente furadas, que demonstram tremenda falta de conhecimento. Eu concordo que o PHP tem uma má fama devido a linguagem ter demorado a amadurecer, como também concordo que o nível dos programadores em PHP no geral é baixo, é duro admitir, mas no geral é assim, provavelmente pela facilidade que a linguagem proporciona e também por sua curva de aprendizado ser bem mais baixa que a do Java, por exemplo. Mas isso quer dizer que o PHP é ruim? Eu poderia enumerar uma série de vantagens que o PHP tem em relação ao Java, da mesma forma que o Java tem uma série de outras vantagens em relação ao PHP, mas esse não é o foco do tópico, o foco é justamente o contrário.</p>
<h3>Uma &#8220;nova&#8221; era</h3>
<p>E para acabar, ou pelo menos ajudar bastante, surge o famoso <em>framework</em> Ruby on Rails, o <em>hype</em> do momento tratando-se de linguagem de programação! Ruby on Rails é um <em>framework</em> de desenvolvimento web que prega o conceito de que algo deve ser simples, prático e prazeroso de fazer, dessa forma inúmeros benefícios são alcançados, como: códigos com mais qualidade, tempo de desenvolvimento mais curto e comunidade participativa. Ruby on Rails não é uma <a href="http://pt.wikipedia.org/wiki/Linguagem_de_programa%C3%A7%C3%A3o"  target="_blank" style="text-decoration: underline">linguagem de programação</a>, é um <a href="http://pt.wikipedia.org/wiki/Framework" target="_blank" style="text-decoration: underline"><em>framework</em></a>, que foi desenvolvido em cima da linguagem <a href="http://www.ruby-lang.org/pt/"  target="_blank" style="text-decoration: underline">Ruby</a>, que é uma linguagem de programação criada por um <a href="http://pt.wikipedia.org/wiki/Yukihiro_Matsumoto" target="_blank" style="text-decoration: underline">japonês</a> em 1995 baseada nos pontos fortes de várias linguagens da época. Reparou no trecho <strong>&#8220;&#8230;que havia de melhor em outras linguagens&#8230;&#8221;?</strong> Ou seja, o próprio criador da linguagem era (ou é) totalmente desprovido de preconceitos, e com isso conseguiu identificar os pontos fortes e fracos de várias linguagens com o intuito de criar uma, que no seu modo de ver, seria mais eficiente.</p>
<h3>Complexidade não é sinal de qualidade</h3>
<p>Uma linguagem de programação, um <em>framework</em> ou uma <a href="http://pt.wikipedia.org/wiki/API"  target="_blank" style="text-decoration: underline">API</a>, tem como principal objetivo (pelo menos deveria) fornecer uma maior praticidade aos desenvolvedores em solucionar problemas. Essa deveria ser a premissa básica para que uma determinada linguagem ou plataforma fosse adotada em um projeto, entretanto nada impede que N linguagens ou plataformas trabalhem de forma conjunta, desde que proporcionem alternativas para descomplicar o problema.</p>
<p>Só para esclarecer: simplicidade, praticidade, produtividade e facilidade nesse caso são sinônimos!</p>
<p>Outro ponto a ser observado é que a <a href="http://pt.wikipedia.org/wiki/Engenharia_de_software"  target="_blank" style="text-decoration: underline">engenharia de software</a> é um assunto relativamente novo, principalmente se formos comparar as outras engenharias, como a civil, e por isso é tão comum observarmos novas metodologias, padrões e linguagens surgindo a todo momento. Mas o que elas tem em comum é que todas tem como objetivo resolver os problemas da maneira &#8220;menos complexa&#8221; que for possível, é claro que outros fatores são levados em consideração, entretanto se paramos para pensar a simplicidade é sempre a prioridade.</p>
<p>E é por isso que o RoR está na crista da onda, pois talvez nenhum <em>framework</em> descomplique tanto as coisas como ele, e o melhor é que isso é contagioso, pois a todo momento surgem mais e mais <em>frameworks</em> &#8220;<a href="http://mail-archives.apache.org/mod_mbox/struts-dev/200509.mbox/%3C43186873.7080309@twdata.org%3E"   target="_blank" style="text-decoration: underline">RoR <em>like</em></a>&#8220;, em PHP existe uma penca deles, como: Akelos, Code Igniter, Cake, Kohana. Até o sempre conservador Java se rendeu ao RoR e lançou o <a href="http://groovy.codehaus.org/"   target="_blank" style="text-decoration: underline">Groovy</a> (<a href="http://jcp.org/en/jsr/detail?id=241"   target="_blank" style="text-decoration: underline">JSR 241</a>) e consequentemente o <a href="http://www.grails.org/""   target="_blank" style="text-decoration: underline">Grails</a>, que é um <em>framework</em> web baseado em quem? No Rails!</p>
<h3>Maçãs são maçãs e bananas são bananas!</h3>
<p>O título acima parece estranho, mas ele serve para deixar claro o seguinte: comparar linguagens não é algo inteligente, ao invés disso, procure conhecê-las e tirar proveito do melhor de cada uma. PHP é PHP, Java é Java, Python é Python! Assim como maçãs são maçãs e bananas são bananas, portanto não cabem comparações. Parece óbvio, e na verdade é, mas mesmo assim existem pessoas que ainda insistem em levar essa discussão adiante, onde dificilmente é tirado algum proveito.</p>
<p>Só para deixar claro, eu nunca desenvolvi uma aplicação sequer usando o RoR, já usei alguns <em>frameworks</em> &#8220;RoR <em>like</em>&#8221; e tive ótimas experiências, entretanto não acho que o RoR substitui o Java, o PHP, ou até mesmo o .NET, como eu já disse, cada um tem o seu propósito e por isso deve haver um equilíbrio na tomada de decisões sobre &#8220;o que escolher?&#8221;, fatores como: experiência com determinada linguagem, documentação, maturidade, infra-estrutura, segurança não podem ser esquecidos de forma alguma, pois no final é a sinergia entre vários fatores que determina as opções a serem escolhidas.</p>
<p>É normal, e de certa forma até compreensível, nos deixarmos levar pela emoção de conhecer um novo mundo e com isso embarcamos no erro de que a partir daquele momento tudo será feito &#8220;daquela forma&#8221;, com &#8220;aquela nova linguagem&#8221;, e isso é um erro, dos graves! Nesse ponto, a experiência, o conhecimento e o equilíbrio fazem toda a diferença na tomada de decisão mais acertada.</p>
<p>Só para finalizar, gostaria de ressaltar que nada impede que existam linguagens e <em>frameworks</em> ruins, é claro que eles existem, mas mais uma vez, para termos essa certeza é preciso conhecer. Da mesma forma que, não é só porque devemos abrir a nossa cabeça e olharmos para os lados, ao invés de olharmos só para frente, que devemos deixar de considerar nossas preferências e aquilo com que temos mais facilidade. Preferência e preconceito não são sinônimos.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.marcuscavalcanti.net/blog/2009/03/17/ponto-para-o-rails/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Dica: página de manutenção usando o arquivo .htaccess</title>
		<link>http://www.marcuscavalcanti.net/blog/2009/03/15/pagina-de-manutencao-usando-htaccess/</link>
		<comments>http://www.marcuscavalcanti.net/blog/2009/03/15/pagina-de-manutencao-usando-htaccess/#comments</comments>
		<pubDate>Sun, 15 Mar 2009 20:40:37 +0000</pubDate>
		<dc:creator>Marcus Cavalcanti</dc:creator>
				<category><![CDATA[Miscelânea]]></category>
		<category><![CDATA[Apache]]></category>
		<category><![CDATA[htaccess]]></category>

		<guid isPermaLink="false">http://localhost/blog/?p=619</guid>
		<description><![CDATA[Essa é uma dica bem rapidinha.
Como podem perceber, atualizei esse Blog recentemente, pois estava a procura de uma interface mais clean e ampla, além de querer dar uma ênfase maior a busca.
Durante a atualização desse Blog, utilizei um recurso muito interessante e simples, que é o famoso arquivo .htaccess ou hypertext access. Esse arquivo é [...]]]></description>
			<content:encoded><![CDATA[<p>Essa é uma dica bem rapidinha.</p>
<p>Como podem perceber, atualizei esse Blog recentemente, pois estava a procura de uma <em>interface</em> mais <em>clean</em> e ampla, além de querer dar uma ênfase maior a busca.</p>
<p>Durante a atualização desse Blog, utilizei um recurso muito interessante e simples, que é o famoso arquivo .htaccess ou <em>hypertext access</em>. Esse arquivo é um arquivo do Apache que permite a descentralização do controle de um diretório <em>Web</em> pelo Apache. Os arquivos .htaccess permitem reescrever URL&#8217;s, definir autenticações para um diretório, customizar mensagens de erro, ter controle sobre mecanismos de <em>cache</em> e etc.</p>
<p>Através desse arquivo eu criei uma regra para que todos os usuários que acessassem o meu Blog visualizassem uma página de manutenção, com exceção ao meu IP, pois eu deveria ver todo o site normalmente já que precisaria ajustá-lo e configurá-lo.</p>
<p>A regra é bem simples, segue abaixo:</p>
<p><!--DEVFMTCODE--><pre class="devcodeblock" title="Apache configuration"><div class="devcodeoverflow"><ol><li></li><li><span style="color: #00007f;">Options</span> +<span style="color: #0000ff;">FollowSymlinks</span></li><li><span style="color: #00007f;">RewriteEngine</span> <span style="color: #0000ff;">on</span></li><li><span style="color: #00007f;">RewriteCond</span> %{REQUEST_URI} !/manutencao.html$</li><li><span style="color: #00007f;">RewriteCond</span> %{REMOTE_ADDR} !^200\.239\.200\.121$</li><li>&nbsp;</li><li><span style="color: #00007f;">RewriteRule</span> $ /manutencao.html [R=<span style="color: #ff0000;">302</span>,L] </li><li></li></ol></div></pre><!--END_DEVFMTCODE--></p>
<p>Na configuração acima existe a opção de definir o IP (200.239.200.121) que deverá ser excluído da regra e a regra nada mais é que um redirecionamento para uma página específica de manutenção do site (manutencao.html).</p>
<p>Simples, porém útil. </p>
<p>Para mais informações sobre o .htaccess indico acessar a sua <a href="http://httpd.apache.org/docs/1.3/howto/htaccess.html" target="_blank" style="text-decoration: underline">documentação oficial</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.marcuscavalcanti.net/blog/2009/03/15/pagina-de-manutencao-usando-htaccess/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Leitura recomendada</title>
		<link>http://www.marcuscavalcanti.net/blog/2009/03/15/leitura-recomendada/</link>
		<comments>http://www.marcuscavalcanti.net/blog/2009/03/15/leitura-recomendada/#comments</comments>
		<pubDate>Sun, 15 Mar 2009 18:04:23 +0000</pubDate>
		<dc:creator>Marcus Cavalcanti</dc:creator>
				<category><![CDATA[Sem categoria]]></category>

		<guid isPermaLink="false">http://localhost/blog/?p=598</guid>
		<description><![CDATA[Abaixo alguns livros que li recentemente, ou que estou lendo atualmente com um breve comentário sobre os mesmos.
 Uma leitura contemporânea, bem fácil e agradável de ler. Nesse livro o autor cita 30 maneiras de como conquistar os seus clientes, baseado em sua experiência na sorveteria da família e também como executivo de uma grande [...]]]></description>
			<content:encoded><![CDATA[<p>Abaixo alguns livros que li recentemente, ou que estou lendo atualmente com um breve comentário sobre os mesmos.</p>
<p><div style="float:left;padding-right:5px;padding-bottom:5px;"><a href='http://openlibrary.org/b/OL9510950M' ><img src='http://covers.openlibrary.org/b/olid/OL9510950M-S.jpg' alt='TREAT YOUR CUSTOMERS' title='View this title in Open Library' /></a></div><div style="font-weight:bold"><a href='http://openlibrary.org/b/OL9510950M' title='View this title in Open Library' >TREAT YOUR CUSTOMERS: THIRTY LESSONS ON SERVICE AND SALES THAT I LEARNED AT MY FAMILY'S DAIRY QUEEN STORE</a>; Bob Miglani</div><a href="http://worldcat.org/isbn/9781401301989" title="Find in a library using WorldCat">WorldCat</a><span class="Z3988" title="ctx_ver=Z39.88-2004&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Abook&amp;rfr_id=info%3Asid%2Fwww.marcuscavalcanti.net%3AOpenBook&amp;rft.genre=book&amp;rft.btitle=TREAT+YOUR+CUSTOMERS&amp;rft.isbn=9781401301989&amp;rft.au=Bob+Miglani&amp;rft.pub=Hyperion&amp;rft.date=June+6%2C+2006&amp;rft.tpages=152"></span> Uma leitura contemporânea, bem fácil e agradável de ler. Nesse livro o autor cita 30 maneiras de como conquistar os seus clientes, baseado em sua experiência na sorveteria da família e também como executivo de uma grande corporação.</p>
<p><div style="float:left;padding-right:5px;padding-bottom:5px;"><a href='http://openlibrary.org/b/OL9825430M' ><img src='http://covers.openlibrary.org/b/olid/OL9825430M-S.jpg' alt='Patterns Of Enterprise Application Architecture' title='View this title in Open Library' /></a></div><div style="font-weight:bold"><a href='http://openlibrary.org/b/OL9825430M' title='View this title in Open Library' >Patterns Of Enterprise Application Architecture</a>; Martin Fowler</div><a href="http://worldcat.org/isbn/9780321127426" title="Find in a library using WorldCat">WorldCat</a><span class="Z3988" title="ctx_ver=Z39.88-2004&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Abook&amp;rfr_id=info%3Asid%2Fwww.marcuscavalcanti.net%3AOpenBook&amp;rft.genre=book&amp;rft.btitle=Patterns+Of+Enterprise+Application+Architecture&amp;rft.isbn=9780321127426&amp;rft.au=Martin+Fowler&amp;rft.pub=Addison-Wesley+Professional&amp;rft.date=November+5%2C+2002&amp;rft.edition=1st+Edition&amp;rft.tpages=560&amp;rft.series=Signature"></span> Mais um livro de um dos maiores pesquisadores de software da atualidade: Martin Fowler. Nesse livro o autor cita os problemas rotineiros que ocorrem em arquiteturas de sistemas corporativos causados principalmente por um design mal projetado. O autor descreve ainda quais soluções poderiam ser usadas para resolver tais problemas.</p>
<p><div style="float:left;padding-right:5px;padding-bottom:5px;"><a href='http://openlibrary.org/b/OL10492061M' ><img src='http://covers.openlibrary.org/b/olid/OL10492061M-S.jpg' alt='The Google Story' title='View this title in Open Library' /></a></div><div style="font-weight:bold"><a href='http://openlibrary.org/b/OL10492061M' title='View this title in Open Library' >The Google Story</a>; David A. Vise</div><a href="http://worldcat.org/isbn/0330440055" title="Find in a library using WorldCat">WorldCat</a><span class="Z3988" title="ctx_ver=Z39.88-2004&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Abook&amp;rfr_id=info%3Asid%2Fwww.marcuscavalcanti.net%3AOpenBook&amp;rft.genre=book&amp;rft.btitle=The+Google+Story&amp;rft.isbn=0330440055&amp;rft.au=David+A.+Vise&amp;rft.pub=Pan&amp;rft.date=2006&amp;rft.tpages=336"></span> Livro que conta toda história do Google, desde quando ainda era uma &#8220;idéia louca&#8221; de faculdade até a sua criação e a de alguns dos seus mais famosos serviços.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.marcuscavalcanti.net/blog/2009/03/15/leitura-recomendada/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Resolvendo o problema de som travado no Ubuntu ao carregar streaming no Firefox</title>
		<link>http://www.marcuscavalcanti.net/blog/2009/03/08/resolvendo-o-problema-de-som-travado-no-ubuntu-ao-carregar-streaming-no-firefox/</link>
		<comments>http://www.marcuscavalcanti.net/blog/2009/03/08/resolvendo-o-problema-de-som-travado-no-ubuntu-ao-carregar-streaming-no-firefox/#comments</comments>
		<pubDate>Sun, 08 Mar 2009 20:39:14 +0000</pubDate>
		<dc:creator>Marcus Cavalcanti</dc:creator>
				<category><![CDATA[Ubuntu & Linux]]></category>
		<category><![CDATA[Firefox]]></category>
		<category><![CDATA[Flash]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Som Travado]]></category>

		<guid isPermaLink="false">http://www.marcuscavalcanti.net/blog/?p=565</guid>
		<description><![CDATA[No Firefox, ao entrar em sites que contenham streaming (som e vídeo) disponibilizados por flash-players (myspace, last.fm, youtube, etc), faz com que o som desses players acabe entrando em conflito com o som local do SO, com isso o mesmo fica travado.
O que ocorre é que muito provavelmente o Flash não usa o PulseAudio, e [...]]]></description>
			<content:encoded><![CDATA[<p>No Firefox, ao entrar em sites que contenham streaming (som e vídeo) disponibilizados por <em>flash-players</em> (myspace, last.fm, youtube, etc), <a style="text-decoration: underline" href="https://bugs.launchpad.net/ubuntu/+source/firefox-3.0/+bug/314596" target="_blank">faz com que o som desses <em>players</em> acabe entrando em conflito com o som local do SO</a>, com isso o mesmo fica travado.</p>
<p>O que ocorre é que muito provavelmente o Flash não usa o PulseAudio, e com isso acaba travando o som do sistema até que o Firefox seja fechado. Nenhum outro programa consegue tocar som até que o Firefox seja fechado.</p>
<p>Para resolver isso é muito simples, basta baixar o pacote <strong>libflashsupport</strong> que força o Flash a usar o sistema PulseAudio. É possível baixar usando o Synaptic, ou então por linha de comando da seguinte maneira:</p>
<p><!--DEVFMTCODE--><pre class="devcodeblock" title="Text"><div class="devcodeoverflow"><ol><li>sudo apt-get install libflashsupport</li></ol></div></pre><!--END_DEVFMTCODE--></p>
<p>Feito o passo acima, basta reiniciar o Firefox e o problema estará resolvido.</p>
<p><strong>Obs</strong>: A minha versão do Ubuntu é a 8.04 (Hardy Heron), mas pesquisando no Google observei pessoas que utilizam versões anteriores com o mesmo problema. Não sei, se dá versão 8.10 em diante o problema foi resolvido.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.marcuscavalcanti.net/blog/2009/03/08/resolvendo-o-problema-de-som-travado-no-ubuntu-ao-carregar-streaming-no-firefox/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Comandos úteis para Linux</title>
		<link>http://www.marcuscavalcanti.net/blog/2009/03/05/comandos-uteis-para-linux/</link>
		<comments>http://www.marcuscavalcanti.net/blog/2009/03/05/comandos-uteis-para-linux/#comments</comments>
		<pubDate>Thu, 05 Mar 2009 21:12:51 +0000</pubDate>
		<dc:creator>Marcus Cavalcanti</dc:creator>
				<category><![CDATA[Ubuntu & Linux]]></category>
		<category><![CDATA[Comandos]]></category>
		<category><![CDATA[Command Line]]></category>
		<category><![CDATA[Linha de Comando]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Terminal]]></category>
		<category><![CDATA[Unix]]></category>

		<guid isPermaLink="false">http://www.marcuscavalcanti.net/blog/?p=527</guid>
		<description><![CDATA[Confesso que desde que mudei meu SO de Windows para Linux, desenvolver ficou muito mais prazeroso e prático. Há muito tempo atrás, tinha um amigo que insistia nisso comigo, mas eu sempre acabava relutando e ficando com Windows. Os motivos eram muitos, mas o principal de todos era a comodidade.
Há cerca de 1 ano e [...]]]></description>
			<content:encoded><![CDATA[<p>Confesso que desde que mudei meu SO de Windows para Linux, desenvolver ficou muito mais prazeroso e prático. Há muito tempo atrás, tinha um <a href="http://www.awm.com.br" target="_blank" style="text-decoration: underline">amigo</a> que insistia nisso comigo, mas eu sempre acabava relutando e ficando com Windows. Os motivos eram muitos, mas o principal de todos era a comodidade.</p>
<p>Há cerca de 1 ano e meio, talvez um pouco mais, resolvi ceder a pressão e dar uma chance ao <a href="http://www.infowester.com/tux.php" target="_blank" style="text-decoration: underline">Pinguim</a>, mas fiz isso usando <em><a href="http://en.wikipedia.org/wiki/Dual_boot"  target="_blank" style="text-decoration: underline">dual boot</a></em>. Por experiência própria, afirmo com convicção, que quem acaba optando por essa tática de transição, quase sempre acaba ficando com Windows, o negócio tem que ser na marra mesmo hehehe. O mesmo serve para <a href="http://en.wikipedia.org/wiki/Virtual_machine"  target="_blank" style="text-decoration: underline">máquinas virtuais</a>, se você tiver como SO base o Windows e instalar em uma VM uma distribuição Linux, fatalmente você cairá no mesmo problema.</p>
<p>Não sou daqueles que ficam malhando o Windows/Microsoft a torto e a direito, acho que a dupla tem os seus méritos, que por sinal são muitos, mas tratando-se de liberdade, flexibilidade e segurança, fica muito difícil comparar um SO baseado em <a href="http://en.wikipedia.org/wiki/Unix" target="_blank" style="text-decoration: underline">Unix</a>, como o Linux e o Mac OS X, com o Windows. Sem contar que hoje em dia, algumas distribuições como o <a href="http://www.ubuntu.com/" target="_blank" style="text-decoration: underline">Ubuntu</a>, por exemplo, estão quase tão fáceis de usar como o Windows.</p>
<p>Uma das coisas mais fantásticas dos sistemas operacionais baseados em Unix são sua <a href="http://en.wikipedia.org/wiki/Command_line_interface" target="_blank" style="text-decoration: underline">linha de comando</a> poderosíssima, pois através dela é possível fazer N operações com velocidade, flexibilidade, alcançe e combinando-as. A linha de comando de um SO baseado em Unix é, por exemplo, muito mais avançada que a linha de comando do Windows (<a href="http://en.wikipedia.org/wiki/MS-DOS"  target="_blank" style="text-decoration: underline">MS-DOS</a>), que sinceramente é muito fraca.</p>
<p>Se você é usuário Windows, não quer instalar o Linux em uma VM e não quer deixar o seu computador <em>dual boot</em>, então ainda existe uma alternativa derradeira: é o <a href="http://aurelio.net/cygwin/" target="_blank" style="text-decoration: underline">Cygwin</a>. Cygwin é um programinha que você instala como outro qualquer no Windows e que te proporciona todo o poder da linha de comando, inclusive já o usei em uma das minhas várias tentativas de transição &#8220;windows->linux&#8221;.</p>
<p>Separei uma coleção de comandos úteis, que me ajudam bastante nas tarefas do meu dia-a-dia, seja como desenvolvedor ou também como usuário, se alguém quiser contribuir com essa listinha, está convidado :)</p>
<p>Vamos lá:</p>
<p>Permissão (de tudo) a partir de um diretório recursivamente (forçada)<br />
<!--DEVFMTCODE--><pre class="devcodeblock" title="Text"><div class="devcodeoverflow"><ol><li>$ chmod -Rf 7777 /diretorio</li></ol></div></pre><!--END_DEVFMTCODE--></p>
<p>Mostra/controla as <em>network interfaces</em> (conexões <em>wireless</em> e com fio, por exemplo)<br />
<!--DEVFMTCODE--><pre class="devcodeblock" title="Text"><div class="devcodeoverflow"><ol><li>$ ifconfig</li></ol></div></pre><!--END_DEVFMTCODE--></p>
<p>Alterar o <em>owner</em> e o grupo de usuário de um arquivo<br />
<!--DEVFMTCODE--><pre class="devcodeblock" title="Text"><div class="devcodeoverflow"><ol><li>$ chown user:group arquivo.txt</li></ol></div></pre><!--END_DEVFMTCODE--></p>
<p>Criação de Link Simbólico (se você não sabe o que é, <a href="http://www.vivaolinux.com.br/dica/Link-simbolico-e-hardlink/" target="_blank" style="text-decoration: underline">clique aqui</a>, é muito útil!)<br />
<!--DEVFMTCODE--><pre class="devcodeblock" title="Text"><div class="devcodeoverflow"><ol><li>$ ln -s /diretorio/que/sera/criado/o/link /diretorio/de/destino</li></ol></div></pre><!--END_DEVFMTCODE--></p>
<p>Remover todos os arquivos com determinada extensão a partir do diretório atual recursivamente<br />
<!--DEVFMTCODE--><pre class="devcodeblock" title="Text"><div class="devcodeoverflow"><ol><li>$ find ./ -name &quot;.svn&quot; | xargs rm -Rf</li></ol></div></pre><!--END_DEVFMTCODE--></p>
<p>Alterar <em>encoding</em> de arquivo de ISO-8859-1 para UTF-8<br />
<!--DEVFMTCODE--><pre class="devcodeblock" title="Text"><div class="devcodeoverflow"><ol><li>$ iconv -f ISO-8859-1 -t UTF-8 nome_arquivo_original.php &gt; nome_arquivo_alterado.php</li></ol></div></pre><!--END_DEVFMTCODE--></p>
<p>Listar periféricos (<em>hardware</em>)<br />
<!--DEVFMTCODE--><pre class="devcodeblock" title="Text"><div class="devcodeoverflow"><ol><li>$ lspci</li></ol></div></pre><!--END_DEVFMTCODE--></p>
<p>Listar periféricos USB<br />
<!--DEVFMTCODE--><pre class="devcodeblock" title="Text"><div class="devcodeoverflow"><ol><li>$ lsusb</li></ol></div></pre><!--END_DEVFMTCODE--></p>
<p>Verificar se determinada porta (8685) está aberta<br />
<!--DEVFMTCODE--><pre class="devcodeblock" title="Text"><div class="devcodeoverflow"><ol><li>$ netstat -an | grep &quot;8685&quot;</li></ol></div></pre><!--END_DEVFMTCODE--></p>
<p>Redirecionar porta. Nesse caso redireciona da 80 para 7001, se a porta não estiver aberta, o comando abre<br />
<!--DEVFMTCODE--><pre class="devcodeblock" title="Text"><div class="devcodeoverflow"><ol><li>$ redir --lport=80 --cport=7001 &amp;</li></ol></div></pre><!--END_DEVFMTCODE--></p>
<p>Procurar por nome de arquivo a partir do diretório atual recursivamente<br />
<!--DEVFMTCODE--><pre class="devcodeblock" title="Text"><div class="devcodeoverflow"><ol><li>$ find ./ -name nome_do_arquivo</li></ol></div></pre><!--END_DEVFMTCODE--></p>
<p>Procurar por diretório recursivamente a partir do atual<br />
<!--DEVFMTCODE--><pre class="devcodeblock" title="Text"><div class="devcodeoverflow"><ol><li>$ find . -type d -name diretorio</li></ol></div></pre><!--END_DEVFMTCODE--></p>
<p>Procurar por conteúdo (texto) dentro do arquivo, recursivamente, a partir do diretorio especificado mostrando apenas o nome dos arquivos onde foram encontrados o texto buscado (<em>case-insensitive</em>)<br />
<!--DEVFMTCODE--><pre class="devcodeblock" title="Text"><div class="devcodeoverflow"><ol><li>$ find /diretorio -exec grep -il &quot;TEXTO&quot; {} ;</li></ol></div></pre><!--END_DEVFMTCODE--></p>
<p>Procurar por conteúdo (texto) dentro de arquivos apenas com a extensão &#8220;.log&#8221; (<em>case-insensitive</em>), recursivamente, a partir do diretório especificado, mostrando o nome dos arquivos que foram encontrados o texto buscado<br />
<!--DEVFMTCODE--><pre class="devcodeblock" title="Text"><div class="devcodeoverflow"><ol><li>$ find /directory -iname &quot;*.log&quot; -exec grep -il &quot;TEXTO&quot; {} ;</li></ol></div></pre><!--END_DEVFMTCODE--></p>
<p>Informar onde estão os arquivos binários de um programa<br />
<!--DEVFMTCODE--><pre class="devcodeblock" title="Text"><div class="devcodeoverflow"><ol><li>$ whereis php</li></ol></div></pre><!--END_DEVFMTCODE--></p>
<p>Incluir um caminho (<em>path</em>) no <em>path</em> do SO<br />
<!--DEVFMTCODE--><pre class="devcodeblock" title="Text"><div class="devcodeoverflow"><ol><li>$ export PATH=$PATH:/opt/lampp/bin</li></ol></div></pre><!--END_DEVFMTCODE--></p>
<p>Listar os processos correntes do SO<br />
<!--DEVFMTCODE--><pre class="devcodeblock" title="Text"><div class="devcodeoverflow"><ol><li>$ ps aux</li></ol></div></pre><!--END_DEVFMTCODE--></p>
<p>Listar os processos correntes do SO filtrando por determinada <em>string</em><br />
<!--DEVFMTCODE--><pre class="devcodeblock" title="Text"><div class="devcodeoverflow"><ol><li>$ ps aux | grep &quot;apache&quot;</li></ol></div></pre><!--END_DEVFMTCODE--></p>
<p>Encerrar (cancela) um processo ou grupo de processo a partir do seu ID (pid), nesse caso &#8220;78452&#8243;<br />
<!--DEVFMTCODE--><pre class="devcodeblock" title="Text"><div class="devcodeoverflow"><ol><li>$ kill -9 78452</li></ol></div></pre><!--END_DEVFMTCODE--></p>
<p>Copiar por SSH um arquivo de uma máquina remota para a máquina local<br />
<!--DEVFMTCODE--><pre class="devcodeblock" title="Text"><div class="devcodeoverflow"><ol><li>$ scp user@192.168.1.100:/home/usuario_remoto/Desktop/file.txt /home/meu_usuario/Desktop/file.txt</li></ol></div></pre><!--END_DEVFMTCODE--></p>
<p>Mostrar as últimas linhas de um arquivo (atualizado dinamicamente conforme um novo conteúdo é inserido)<br />
<!--DEVFMTCODE--><pre class="devcodeblock" title="Text"><div class="devcodeoverflow"><ol><li>$ tail -f nome_do_arquivo.log</li></ol></div></pre><!--END_DEVFMTCODE--></p>
<p>Lembrando que alguns dos comandos acima, para serem executados, necessitam de privilégios de um super-usuário, como o usuário <em>root</em> por exemplo.</p>
<p>Existem ainda uma infinidade de outros comandos úteis, mas que eu tenha lembrado, os que mais uso são esses. Os comandos mais básicos e simples, como: man, wget, ls, cd, cp, cat, rm, mv, etc.. não vou mostrar, pois não tem muito mistério, mas no Google é possível encontrar milhares de boas referências.</p>
<p><em>Hope this helps!</em></p>
]]></content:encoded>
			<wfw:commentRss>http://www.marcuscavalcanti.net/blog/2009/03/05/comandos-uteis-para-linux/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Algumas observações e dicas sobre o Oracle/Aqualogic BPM Enterprise</title>
		<link>http://www.marcuscavalcanti.net/blog/2009/03/04/algumas-observacoes-e-dicas-sobre-o-oracle-aqualogic-bpm-enterprise/</link>
		<comments>http://www.marcuscavalcanti.net/blog/2009/03/04/algumas-observacoes-e-dicas-sobre-o-oracle-aqualogic-bpm-enterprise/#comments</comments>
		<pubDate>Wed, 04 Mar 2009 06:34:17 +0000</pubDate>
		<dc:creator>Marcus Cavalcanti</dc:creator>
				<category><![CDATA[BPM]]></category>
		<category><![CDATA[ALBPM]]></category>
		<category><![CDATA[Aqualogic]]></category>
		<category><![CDATA[Deploy]]></category>
		<category><![CDATA[Enterprise]]></category>
		<category><![CDATA[Oracle]]></category>
		<category><![CDATA[OracleBPM]]></category>

		<guid isPermaLink="false">http://www.marcuscavalcanti.net/blog/?p=441</guid>
		<description><![CDATA[Desde a última sexta-feira até hoje ao final do dia, podemos dizer que passei um certo sofrimento tentando fazer o deploy de um projeto no Oracle BPM Enterprise, só que a minha situação é um pouco atípica, pois no ambiente de homologação e produção do cliente, a versão que está sendo utilizada da distribuição enterprise [...]]]></description>
			<content:encoded><![CDATA[<p>Desde a última sexta-feira até hoje ao final do dia, podemos dizer que passei um certo sofrimento tentando fazer o <em>deploy</em> de um projeto no Oracle BPM Enterprise, só que a minha situação é um pouco atípica, pois no ambiente de homologação e produção do cliente, a versão que está sendo utilizada da distribuição <em>enterprise</em> ainda é a 6.04, ou seja, Aqualogic BPM Enterprise e não Oracle BPM Enterprise (mais recente).</p>
<p>Há cerca de um mês atrás eu havia <a href="http://www.marcuscavalcanti.net/blog/2009/02/03/diferencas-entre-versoes-do-aqualogic-bpm-para-oracle-bpm-studio/" target="_blank" style="text-decoration: underline">falado sobre isso</a>, lembra? Resumidamente o que eu havia dito é que apesar de saber que a versão no cliente ainda era a 6.04, eu havia tomado a decisão de usar a versão nova do Oracle BPM Studio, pois em relação a ferramenta pouca coisa havia mudado e o que havia mudado não impactaria no arquivo gerado a ser <em>deployado</em> nas distribuições <em>enterprise</em>. Inclusive o pessoal da Oracle havia me confirmado isso em um workshop que eu havia ido.</p>
<p>Como o <a href="http://pt.wikipedia.org/wiki/Cluster" target="_blank" style="text-decoration: underline"><em>cluster</em></a> lá do meu trabalho onde está (estava) rodando a versão 6.04 da distribuição <em>enterprise</em> estava muito instável, resolvi fazer a instalação em outra máquina. Foi aí que começou a minha própria <a href="http://pt.wikipedia.org/wiki/Via_Crucis"  target="_blank" style="text-decoration: underline">Via Crucis</a>. Um detalhe importante é que eu nunca havia feito a instalação da distribuição <em>enterprise</em>, portanto era uma experiência totalmente nova para mim.</p>
<p>A distribuição <em>enterprise</em> do ALBPM possui alguns conceitos um pouco diferentes da versão usada para desenvolvimento (Studio), a começar pelo conceito de <em>directory service</em> e pelas outras aplicações que vem agregadas juntas a instalação. Dentre as aplicações que me interessavam estavam apenas o <em>process administrator</em>, <em>workspace</em> e <em>process engine</em>. Tinha ainda o PAPI Web Services, que pode ser muito importante dentro de um projeto BPM, mas como eu não precisaria integrar outros projetos com o meu projeto BPM, então o PAPI-WS nesse caso não seria necessário, pelo menos não naquele <em>directory service</em> atual. <em>Directory Service</em> é onde ficam guardadas as informações referentes a usuários, <em>roles</em>, grupos, <em>resources</em> externos e outras informações que fazem parte de um projeto no BPM, além também dessas aplicações já citadas. Não necessariamente cada projeto deve ter o seu próprio <em>directory service</em>, na verdade N projetos podem compartilhar o mesmo. Outro ponto importante diz respeito a <em>process execution engine</em>, pois cada <em>directory service</em> possui a sua própria <em>engine</em>, ou até mesmo mais de uma, mas apenas uma engine cadastrada pode estar &#8220;rodando&#8221;. Uma <em>engine</em> está associada a um servidor de aplicações e no meu caso está associada a uma instância do <a href="http://www.oracle.com/appserver/weblogic/weblogic-suite.html"  target="_blank" style="text-decoration: underline">weblogic</a>, pois foi essa a versão que eu havia escolhido no ato do download.</p>
<p>Sinceramente, apesar de já ter escutado comentários de que a distribuição <em>enterprise</em> (<= 6.*) era um pouco irregular e que possuia algumas peculiaridades, eu não sabia que seria tão árdua a sua instalação. O primeiro problema que eu encontrei foi na criação de um <em>directory service</em>, nesse ponto, através de uma tela do tipo wizard, a instalação solicita as informações do banco de dados onde serão gravadas as informações do <em>directory service</em>, no meu caso eu escolhi como banco de dados o Oracle (<a href="http://www.oracle.com/technology/products/database/xe/index.html"  target="_blank"  style="text-decoration: underline">Oracle-XE</a>). Nessa mesma tela, a configuração solicita qual o nome do <a href="http://www.oracle.com/technology/obe/2day_dba/schema/schema.htm" target="_blank"  style="text-decoration: underline">Schema</a> onde serão criadas as tabelas e eu aconselho fortemente deixar essa opção em branco, pois além dela ser opcional, o negócio só funcionou depois que eu a deixei em branco. Em uma das minhas tentativas mal sucedidas eu até havia criado o schema &#8220;na mão&#8221;, mas mesmo assim não funcionou. Primeiro problema resolvido, nome dos schemas deixados em branco e tudo ok.</p>
<p>O segundo problema talvez tenha sido o pior de resolver. Depois de informar todos os dados necessários para a configuração viria a tela de progresso e conclusão da criação do <em>directory service</em>, nesse momento só resta aguardar até que a ferramenta termine o processo de criação. Mas para o meu azar o processo nunca conseguia ser concluído, pois sempre antes de chegar em 100% o processo me mostrava a mensagem: <em><strong>failed!</strong></em> Tentei mais algumas vezes e após tantos insucessos resolvi verificar os <em>logs</em> e ver qual era o erro. O <em>log</em> nesse caso ajudou e não ajudou, pois no <em>log</em> a informação principal do erro é que uma exceção havia sido disparada quando o JAR de algum EJB estava tentando ser gerado pela instalação. Pesquisei, pesquisei, pesquisei e nada&#8230; resolvi então falar com um amigo de trabalho que tinha comentado que a instalação da distribuição <em>enterprise</em> era meio caótica. Ele pediu para eu ver o <em>stack-trace</em> todo da exceção. Após reparar bem o <em>stack-trace</em> percebi que o mesmo continha uma frase que terminava com <em>&#8220;too many open files&#8221;</em> e informei sobre a mensagem para esse amigo, ele então me disse que esse problema não tinha relação com o JAR do EJB, na verdade o problema estava ocorrendo, pois o SO (Ubuntu) estava tentando abrir mais de 1024 arquivos ao mesmo tempo durante a instalação e que eu precisaria mudar algumas configurações padrões do SO (file descriptor) para resolver esse problema, isso no caso seria um <a href="http://e-docs.bea.com/wls/docs100/perform/OSTuning.html"  target="_blank"  style="text-decoration: underline"><em>OS tuning</em></a>. Mudanças feitas e não deu outra: o diretório foi criado com sucesso!</p>
<p>O próximo problema ocorria ao tentar <em>startar</em> a <em>process execution engine</em>. Sempre que eu tentava inicializar a <em>engine</em> a mensagem de status nunca se modificava, não informava nem que estava inicializada e nem que estava parada. Após bater bastante cabeça com isso, fui até o manual de instalação e verifiquei que um dos pré-requisitos era que a versão do Weblogic fosse a 9.2 e no meu caso eu estava usando a 10.0 ou 10.3. Na verdade esse problema ocorreu mais em razão de um vacilo meu do que qualquer outra coisa. Instalei a versão 9.2, criei outro diretório novamente e agora eu conseguia <em>startar</em> a <em>engine</em> sem problemas.</p>
<p>Acho que tive também alguns problemas de versão de <a href="http://java.com/pt_BR/download/faq/jvm.xml" target="_blank"  style="text-decoration: underline">JVM</a>, no caso <a href="http://en.wikipedia.org/wiki/JRockit" target="_blank"  style="text-decoration: underline">JRockit</a>, mas isso foi tranquilo de resolver, porque o erro era bem evidente.</p>
<p>Instalação concluída, fui tentar finalmente fazer o <em>deploy</em> de um projeto e&#8230; mais problemas! Fazer o <em>deploy</em> eu até conseguia, mas ao tentar executar os processos um erro estranho ocorria e verificando o <em>log</em> percebi que alguns arquivos do projeto não estavam sendo encontrados. Para mim nada poderia explicar aquilo a não ser problemas de versão, pois como eu já citei, a versão de desenvolvimento que eu estava usando era diferente da versão da distribuição <em>enterprise</em>. Resolvi então tentar abrir o projeto em uma versão de ambiente de desenvolvimento igual a da distribuição <em>enterprise</em> com o intuito de gerar o arquivo a ser <em>deployado</em> em versões iguais. Ao abrir o projeto em uma versão mais antiga não tive nenhum problema, o ALBPM Studio conseguiu detectar todos os processos, <em>screenflows</em>, <em>resources</em> e etc, mas ao tentar executar o processo comecei a ter alguns problemas. Após alguns <em>debugs</em>, percebi que alguns métodos da API de Java (<em>Component Catalog</em>) simplesmente não existiam, ou, não funcionavam nessa versão mais antiga (ALBPM Studio 6.04) e que provavelmente esse poderia ser o mesmo problema que ocorria na distribuição <em>enterprise</em>. Isso de certa forma fazia com que a minha teoria de que não haviam mudanças consideráveis entre as versões ALBPM e OracleBPM caísse por terra.</p>
<p>Fiz os ajustes no projeto na versão mais antiga da ferramenta, gerei um arquivo de <em>deploy</em> novo e fui novamente tentar rodar o projeto na distribuição <em>enterprise</em>. Mesmo problema! A essa hora minha paciência estava esvaindo-se, mas eu precisava conseguir <em>deployar</em> o projeto de qualquer jeito. Resolvi, só por desencargo de consciência, baixar a distribuição <em>enterprise</em> em sua versão mais atual, no caso já como Oracle BPM Enterprise 10g3. Baixei, fiz a instalação &#8211; que por sinal foi muito mais tranquila &#8211; e tentei fazer o deploy do projeto e executá-lo. Para minha surpresa (ou não) foi de primeira! Consegui executar o projeto direitinho na versão nova da distribuição <em>enterprise</em>, o que me faz concluir que a versão 6.04 (ou <) é realmente problemática ou então o impacto entre versões Oracle (Oracle BPM) x BEA (Aqualogic BPM) é realmente considerável.</p>
<h3>Dicas Finais</h3>
<ul>
<li>Caso use a distribuição <em>enterprise</em> na versão 6 (ou <) use o Weblogic 9.2 e não 10.0 (ou >);</li>
<li>Não esqueça de mudar as configurações (<em>file descriptor</em>) do seu SO para permitir que ele consiga abrir mais de 1024 arquivos simultaneamente;</li>
<li>Na criação de um <em>directory service</em>, deixei que a ferramente crie um schema para você no banco de dados, portanto deixe a opção em branco;</li>
<li>Verificar possíveis incompatibilidades entre versões de JVM;</li>
<li>É necessário sempre inicializar a instância do Weblogic antes de inicializar o Admin Center do BPM;</li>
<li>Caso não consiga <em>startar</em> a sua <em>engine</em> e tudo pareça estar correto, tente acessar o console do weblogic e dar <em>unlock</em> no usuário <strong>FuegoWeblogicDeployer</strong>, pois quando uma engine tenta ser inicializada várias vezes e não consegue, esse usuário fica travado;</li>
<li>Caso algum erro ocorra no <em>Process Administrator</em> ou então no <em>Workspace</em>, tente ver o código fonte da página HTML, pois em muitas vezes o erro (detalhado) fica oculto dentro de comentários.</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.marcuscavalcanti.net/blog/2009/03/04/algumas-observacoes-e-dicas-sobre-o-oracle-aqualogic-bpm-enterprise/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>O paradoxo de(a) TI</title>
		<link>http://www.marcuscavalcanti.net/blog/2009/02/25/o-paradoxo-de-ti/</link>
		<comments>http://www.marcuscavalcanti.net/blog/2009/02/25/o-paradoxo-de-ti/#comments</comments>
		<pubDate>Wed, 25 Feb 2009 18:30:35 +0000</pubDate>
		<dc:creator>Marcus Cavalcanti</dc:creator>
				<category><![CDATA[Tecnologia, Software & Desenvolvimento]]></category>
		<category><![CDATA[BPM]]></category>
		<category><![CDATA[mercado ti]]></category>
		<category><![CDATA[Ondas de TI]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[TI]]></category>

		<guid isPermaLink="false">http://www.marcuscavalcanti.net/blog/?p=399</guid>
		<description><![CDATA[Semana passada rolou uma apresentação sobre TDD muito interessante na empresa que eu trabalho, onde foram apresentados desde os conceitos básicos de TDD, até os tipos de testes existentes e finalizando com uma aplicação exemplo.
No final rolou uma rodada de perguntas, onde foram questionados assuntos como BDD, programação defensiva, contract by domain, dentre outras metodologias [...]]]></description>
			<content:encoded><![CDATA[<p>Semana passada rolou uma apresentação sobre <a href="http://en.wikipedia.org/wiki/Test-driven_development" target="_blank" style="text-decoration: underline">TDD</a> muito interessante na empresa que eu trabalho, onde foram apresentados desde os conceitos básicos de TDD, até os tipos de testes existentes e finalizando com uma aplicação exemplo.</p>
<p>No final rolou uma rodada de perguntas, onde foram questionados assuntos como <a href="http://behaviour-driven.org/" target="_blank" style="text-decoration: underline">BDD</a>, <a href="http://pt.wikipedia.org/wiki/Programa%C3%A7%C3%A3o_defensiva" target="_blank" style="text-decoration: underline">programação defensiva</a>, contract by domain, dentre outras metodologias e padrões. Nesse ponto da apresentação, a maioria das pessoas que estavam presentes ficaram meio perdidas com as milhares de <a href="http://en.wikipedia.org/wiki/Buzzword"  target="_blank" style="text-decoration: underline"><em>buzzwords</em></a> associadas com as perguntas que foram feitas. O pessoal mais antigo ficou mais perdido ainda e até brincaram sobre a questão do &#8220;estamos ficando velho&#8221;.</p>
<p>Paralelamente a isso, começei a ler essa semana um livro do <a href="http://www.trcr.com.br" target="_blank" style="text-decoration: underline">Tadeu Cruz</a> sobre <a href="http://www.trcr.com.br/index.php/biblioteca/" target="_blank" style="text-decoration: underline">BPM e BPMS</a>, onde no primeiro capítulo ele fala sobre a questão da desorganização informacional, muitas vezes causadas pelo excesso de informação e as novas ondas de TI que surgem a todo momento. Outra coisa que o autor do livro cita e crítica é que existem muitos casos de determinadas organizações, que forçam o uso de determinado software sem obter o real benenfício que esse software deveria oferecer, na maioria dos casos, por questões comerciais ou de interesse próprio dessas organizações. Questões como: para que determinada tecnologia foi criada, como deveria ser corretamente usada, como efetivamente está sendo usada, quais deveriam ser os resultados esperados do seu uso e quais são os resultados que estão sendo obtidos com sua utilização, orientariam de forma efetiva o profissional ou a organização com o intuito de medir se a adoção de determinada tecnologia está realmente sendo benéfica. Esse tipo de situação tem ocorrido muito com BPM, que é o novo <a href="http://en.wikipedia.org/wiki/Hype_cycle" target="_blank" style="text-decoration: underline"><em>hype</em></a> do momento tratando-se de TI.</p>
<p>O que as duas histórias tem em comum e onde estou querendo chegar?</p>
<p>O que eu quero dizer é o seguinte: até onde vale apena conhecer N conceitos diferentes e até onde não vale a pena? Nos casos citados acima tem um pouco das duas coisas, bem como suas respostas. No caso específico do TDD, deveríamos considerar que o melhor a ser feito seria debater sobre as <em>buzzwords</em> que o assunto levantou, ou o melhor seria não conhecer muitos desses novos padrões e metodologias? Eu fico com a primeira opção, mas a segunda opção pode contradizer a primeira. Explico logo abaixo.</p>
<p>Vale a pena usar TDD e BDD em um projeto sem conhecer seus benefícios, o resultado a ser esperado e os possíveis obstáculos a serem vencidos? Não. Pois nesse caso tudo de positivo que TDD traria sendo usada da forma correta, traria inversamente em dobro no caso do seu mal uso, pois nesse caso o projeto acabaria tendo novos percalços (além dos já conhecidos), como: prazos atrasados, código mal estruturado, equipe perdida e etc. E isso acontece em larga escala em TI, não apenas no caso específico do TDD, já que o mais se vê são empresas gastando milhões em &#8220;soluções&#8221; de TI (CRM, ERP, BI, etc) &#8211; muitas vezes empurradas pelos ótimos vendedores dos grandes players do mercado &#8211; sem obter benefício algum sobre aquilo (ou até mesmo desconhecendo o porquê do seu uso). Na verdade muito pelo contrário, pois como muito desses processos são feitos sem estruturação alguma e demoram meses, anos&#8230; no final das contas a dor de cabeça e o custo envolvido não atingem nem de perto o <a href="http://www.artigonal.com/gestao-artigos/a-famosa-relacao-custo-x-beneficio-602803.html" target="_blank" style="text-decoration: underline">custo x benefício</a> esperado sobre aquele investimento.</p>
<p>Outro fênomeno interessante a ser observado e que de certa maneira ligam as duas histórias é a infobia. Infobia é uma palavra que o Tadeu Cruz usa para definir o medo por informação, ou seja, em determinado momento, com a enxurrada de tantas <em>buzzwords</em>, as pessoas acabam ficando reativas em absorver novas tecnologias e entender o seu significado,  com isso de certa forma ficam estagnadas, pois deixam de absorver novos conhecimentos. Mas em compensação não adianta em nada conhecer várias palavrinhas mágicas superficialmente só para dizer que &#8220;domina&#8221; aquela tecnologia do momento. Por isso, acredito que dependendo do contexto, é válido ou não conhecer uma nova tecnologia. Esta aí mais um caso do <strong>paradoxo de TI</strong>. De certa forma, mas sem generalizar, a infobia consegue explicar a frase &#8220;estamos ficando velho&#8221;.</p>
<p>Devemos considerar que TI não irá salvar o mundo, TI pode ajudar de forma efetiva qualquer negócio de qualquer natureza, desde que seja aplicada da forma correta, e aplicar de forma correta envolve antes de mais nada: estruturação, disciplina, educação, mudança e planejamento. Ao mesmo tempo que sabemos de diversos casos onde TI trouxe um real benefício as organizações, sabemos de tantos outros onde TI acabou com negócios, projetos e sonhos. A <a href="http://www1.folha.uol.com.br/folha/informatica/ult124u19223.shtml" target="_blank" style="text-decoration: underline">bolha da internet</a> talvez seja o melhor exemplo que ilustra essa situação das ondas de TI.</p>
<p>Muitas vezes as ondas de TI trazem a tona novas tecnologias que surgem apenas com o objetivo de remediar uma tecnologia já existente. O que as vezes é considerado como inovação, nada mais é que uma evolução de algo que tenha tido insucesso no passado, dessa forma uma tecnologia X surge apenas com o intuito de servir como &#8220;curativo&#8221; da tecnologia Y, que prometeu maravilhas e na verdade devido ao seu mal uso (ou não) só trouxe dores de cabeça.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.marcuscavalcanti.net/blog/2009/02/25/o-paradoxo-de-ti/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>SVN Free</title>
		<link>http://www.marcuscavalcanti.net/blog/2009/02/24/svn-free/</link>
		<comments>http://www.marcuscavalcanti.net/blog/2009/02/24/svn-free/#comments</comments>
		<pubDate>Tue, 24 Feb 2009 23:44:41 +0000</pubDate>
		<dc:creator>Marcus Cavalcanti</dc:creator>
				<category><![CDATA[Miscelânea]]></category>
		<category><![CDATA[Controle de Versão]]></category>
		<category><![CDATA[SVN]]></category>
		<category><![CDATA[VCS]]></category>

		<guid isPermaLink="false">http://www.marcuscavalcanti.net/blog/?p=371</guid>
		<description><![CDATA[Tinha o hábito de usar o assembla &#8211; serviço no qual gosto bastante &#8211; como ferramenta de gestão de projetos web, principalmente seu controle de versão (SVN), mas  agora com o serviço sendo pago, fui a procura de outro serviço semelhante. Acho justo pagar por um serviço, mas no assembla eu basicamento só usava [...]]]></description>
			<content:encoded><![CDATA[<p>Tinha o hábito de usar o <a href="http://www.assembla.com/" target="_blank" style="text-decoration: underline">assembla</a> &#8211; serviço no qual gosto bastante &#8211; como ferramenta de gestão de projetos web, principalmente seu controle de versão (SVN), mas  agora com o serviço sendo pago, fui a procura de outro serviço semelhante. Acho justo pagar por um serviço, mas no assembla eu basicamento só usava o SVN (com raras exceções) e mesmo assim para projetos esporádicos, então no meu caso não seria vantajoso pagar por TODO o serviço.</p>
<p>Em busca de alternativas, achei três serviços interessantes. Um muito semelhante ao assembla, mas com um poucos menos de funcionalidades, outro bem mais simples e um que não cheguei a usar, só vi alguns usuários indicando em algum fórum <em>open-source</em>.</p>
<p>Vamos aos serviços:</p>
<p><strong><a href="http://www.unfuddle.com" target="_blank" style="text-decoration: underline">Unfuddle</a></strong><br />
Serviço semelhante ao assembla, contudo com menos funcionalidades. Mesmo assim ele possui alguns recursos interessantes como: número infinito de repositórios, <em>tickets</em> e um <em>dashboard</em> bem interessante, apesar de simples. O único porém desse serviço é que na versão <em>free</em> só é possível ter um projeto por vez, mas ainda assim é possível criar N repositórios sem necessariamente ter que associá-los a um projeto.</p>
<p><strong><a href="http://opensvn.csie.org/" target="_blank" style="text-decoration: underline">OpenSVN</a></strong><br />
Esse é bem mais simples, a idéia é só fornecer um repositório SVN mesmo, onde no caso não contém os recursos do serviço citado acima. Como se propõe em ser só um serviço de SVN, funciona muito bem.</p>
<p><strong><a href="https://developer.berlios.de/" target="_blank" style="text-decoration: underline">Berlios</a></strong><br />
Não cheguei a usar, mas oferece além de repositórios SVN, repositórios CVS, GIT, Mercurial. Possui outros recursos como gerenciador de tarefas, calendário, forums e gerenciador de arquivos.</p>
<p><strong><a href="http://www.projectlocker.com/" target="_blank" style="text-decoration: underline">Project Locker</a></strong><br />
Repositório para até 5 usuários com 500mb de espaço</p>
<h3>Outras Alternativas</h3>
<p>Existem ainda outras alternativas, algumas possuem restrições como: expor o código para qualquer usuário, ser específico para uma plataforma ou ser comercial. Alguns eu realmente não cheguei a usar, por isso coloquei como &#8220;outras alternativas&#8221;.</p>
<p><strong><a href="http://code.google.com/hosting/" target="_blank" style="text-decoration: underline">Google Code</a></strong><br />
Como é um serviço Google, dispensa comentários, sua única limitação, se é que isso pode ser chamado de limitação, é que qualquer projeto está automaticamente aberto para qualquer um, ou seja, qualquer um pode fazer um <em>svn checkout</em>. Como a proposta do serviço é ser um <em>host</em> de projetos <em>open-source</em>, então nada mais justo.</p>
<p><strong><a href="http://www.sourceforge.net" target="_blank" style="text-decoration: underline">SourceForge</a></strong><br />
Talvez esse seja o mais antigo dos serviços de hospedagem de código. Serviço confiável, estável e talvez seu único &#8220;problema&#8221; é o mesmo do Google Code (citado acima).</p>
<p><strong><a href="http://beanstalkapp.com/" target="_blank" style="text-decoration: underline">Beanstalk</a></strong><br />
Possui uma versão free, mas não sei maiores detalhes, seu foco é comercial. Dentre as suas principais características está o fato de tudo ser feito por interface gráfica (web) e possuir integração com outros serviços.</p>
<p><strong>DevjaVu</strong><br />
Além de repositórios de controle de versão, possui também outras ferramentas de gerenciamento.</p>
<p><strong><a href="http://www.codeplex.com/" target="_blank" style="text-decoration: underline">CodePlex</a></strong><br />
<em>Hosting</em> de projetos open-source da Microsoft.</p>
<p><strong><a href="http://www.xp-dev.com/" target="_blank" style="text-decoration: underline">XP-Dev</a></strong><br />
Repositório SVN de até 1.5gb <em>free</em> e também com <em>project tracking</em>.</p>
<p><strong><a href="http://www.assembla.com/" target="_blank" style="text-decoration: underline">Assembla</a></strong><br />
Talvez a ferramenta mais completa de todas, era totalmente <em>free</em> até o começo de fevereiro. Agora cobra uma taxa por projeto e por participante associado.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.marcuscavalcanti.net/blog/2009/02/24/svn-free/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>Como usar jQuery sem conflito com outras bibliotecas JavaScript</title>
		<link>http://www.marcuscavalcanti.net/blog/2009/02/17/como-usar-jquery-sem-conflito-com-outras-bibliotecas-javascript/</link>
		<comments>http://www.marcuscavalcanti.net/blog/2009/02/17/como-usar-jquery-sem-conflito-com-outras-bibliotecas-javascript/#comments</comments>
		<pubDate>Tue, 17 Feb 2009 04:47:30 +0000</pubDate>
		<dc:creator>Marcus Cavalcanti</dc:creator>
				<category><![CDATA[Web]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[Prototype]]></category>

		<guid isPermaLink="false">http://www.marcuscavalcanti.net/blog/?p=324</guid>
		<description><![CDATA[Estava trabalhando em uma página que já fazia o uso da biblioteca jQuery para apresentação de alguns componentes, contudo surgiu a necessidade de usar ajax nessa mesma página. Apesar da jQuery possuir um bom suporte para ajax, eu gosto muito também da prototype, pois além de ter mais prática (com ajax), também já tenho algumas [...]]]></description>
			<content:encoded><![CDATA[<p>Estava trabalhando em uma página que já fazia o uso da biblioteca <a href="http://www.jquery.com" target="_blank" style="text-decoration: underline">jQuery</a> para apresentação de alguns componentes, contudo surgiu a necessidade de usar ajax nessa mesma página. Apesar da jQuery possuir um <a href="http://docs.jquery.com/Ajax" target="_blank" style="text-decoration: underline">bom suporte para ajax</a>, eu gosto muito também da <a href="http://www.prototypejs.org/" target="_blank" style="text-decoration: underline">prototype</a>, pois além de ter mais prática (com ajax), também já tenho algumas customizações prontas.</p>
<p>Após incluir a prototype e testar a página, percebi que um erro de JavaScript estava ocorrendo, no começo achei que a causa do erro era em razão de uma função &#8211; usando a prototype &#8211; que eu tinha acabado de fazer, mas depois usando o bem dito <a href="http://getfirebug.com/" target="_blank" style="text-decoration: underline">firebug</a> e fazendo alguns <em>debugs</em>, percebi que o erro era mesmo em um conflito entre a jQuery e a prototype.</p>
<p>O problema ocorre, pois as duas bibliotecas fazem o uso da função &#8220;$()&#8221; para acessar as suas funções, o que acaba gerando o conflito.</p>
<p>A biblioteca jQuery fornece algumas maneiras de resolver isso, mas todas giram em torno da função <a href="http://docs.jquery.com/Core/jQuery.noConflict" target="_blank" style="text-decoration: underline">jQuery.noConflict()</a>. A solução que oferece o maior custo x benefício na minha opinião, é a que eu não preciso alterar os meus métodos já existentes, ou seja, não precisaria ter que fazer isso:</p>
<p><!--DEVFMTCODE--><pre class="devcodeblock" title="Javascript"><div class="devcodeoverflow"><ol><li></li><li><span style="color: #003366; font-weight: bold;">var</span> $j <span style="color: #339933;">=</span> jQuery.<span style="color: #660066;">noConflict</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></li><li>$j<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;div&quot;</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">hide</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></li><li></li></ol></div></pre><!--END_DEVFMTCODE--></p>
<p>No caso acima, se eu já tivesse N funções usando jQuery, eu precisaria fazer uma <a href="http://pt.wikipedia.org/wiki/Refatora%C3%A7%C3%A3o" target="_blank" style="text-decoration: underline">refatoração</a> do meu código para mudar o método &#8220;chamador&#8221; das minhas funções de $() para $j(), isso geraria algum tempo perdido com muitas mudanças e muitos testes. A solução que encontrei pede apenas para que as funções fiquem dentro da <em>document ready area </em> da jQuery, então ficaria mais ou menos assim:</p>
<p><!--DEVFMTCODE--><pre class="devcodeblock" title="Javascript"><div class="devcodeoverflow"><ol><li><span style="color: #339933;">&lt;</span>script src<span style="color: #339933;">=</span><span style="color: #3366CC;">&quot;prototype.js&quot;</span><span style="color: #339933;">&gt;&lt;/</span>script<span style="color: #339933;">&gt;</span></li><li>&nbsp;&nbsp; <span style="color: #339933;">&lt;</span>script src<span style="color: #339933;">=</span><span style="color: #3366CC;">&quot;jquery.js&quot;</span><span style="color: #339933;">&gt;&lt;/</span>script<span style="color: #339933;">&gt;</span></li><li>&nbsp;&nbsp; <span style="color: #339933;">&lt;</span>script<span style="color: #339933;">&gt;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp; jQuery.<span style="color: #660066;">noConflict</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></li><li>&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #006600; font-style: italic;">// Put all your code in your document ready area</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp; jQuery<span style="color: #009900;">&#40;</span>document<span style="color: #009900;">&#41;</span>.<span style="color: #660066;">ready</span><span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>$<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #006600; font-style: italic;">// Do jQuery stuff using $</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;div&quot;</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">hide</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></li><li>&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #006600; font-style: italic;">// Use Prototype with $(...), etc.</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp; $<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'someid'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">hide</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></li><li> <span style="color: #339933;">&lt;/</span>script<span style="color: #339933;">&gt;</span></li></ol></div></pre><!--END_DEVFMTCODE--></p>
<p>Da maneira acima eu não precisaria mudar nenhuma função já existente, bastaria apenas incluí-las dentro do bloco indicado.</p>
<p>Segundo a <a href="http://docs.jquery.com/Using_jQuery_with_Other_Libraries" target="_blank" style="text-decoration: underline">documentação</a>, essa seria a solução mais adequada na maioria dos casos.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.marcuscavalcanti.net/blog/2009/02/17/como-usar-jquery-sem-conflito-com-outras-bibliotecas-javascript/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Backup e sincronização de arquivos fácil fácil!</title>
		<link>http://www.marcuscavalcanti.net/blog/2009/02/11/backup-e-sincronizacao-de-arquivos-facil-facil/</link>
		<comments>http://www.marcuscavalcanti.net/blog/2009/02/11/backup-e-sincronizacao-de-arquivos-facil-facil/#comments</comments>
		<pubDate>Wed, 11 Feb 2009 14:35:53 +0000</pubDate>
		<dc:creator>Marcus Cavalcanti</dc:creator>
				<category><![CDATA[Miscelânea]]></category>
		<category><![CDATA[Backup]]></category>
		<category><![CDATA[Sincronização]]></category>
		<category><![CDATA[Ubuntu & Linux]]></category>

		<guid isPermaLink="false">http://www.marcuscavalcanti.net/blog/?p=308</guid>
		<description><![CDATA[Recebi ontem de um amigo a indicação de um serviço de backup e sincronização de arquivos, algo que eu estava realmente precisando, mas sempre que procurei nunca achei nada muito vantajoso ou prático.
No primeiro momento fiquei meio ressabiado, pois como ele é usuário de Windows, fiquei temoroso de não existir uma versão para Linux, ledo [...]]]></description>
			<content:encoded><![CDATA[<p>Recebi ontem de um amigo a indicação de um serviço de backup e sincronização de arquivos, algo que eu estava realmente precisando, mas sempre que procurei nunca achei nada muito vantajoso ou prático.</p>
<p>No primeiro momento fiquei meio ressabiado, pois como ele é usuário de Windows, fiquei temoroso de não existir uma versão para Linux, ledo engano&#8230; além de existir versões para Linux, existem versões específicas para Ubuntu e ainda por cima para distribuições 64 bits! Existem ainda versões para usuários de Mac. Fantástico!</p>
<p>Resolvi testar o serviço de nome <a href="https://www.getdropbox.com/referrals/NTYwMDIzNzk" target="_blank" style="text-decoration: underline">Dropbox</a>. Após baixar a versão para Ubuntu 8.04 x86_64, apenas precisei reiniciar o nautilus com o comando &#8220;<em>sudo killall nautilus</em>&#8221; e finalmente testar.</p>
<p>Na primeira vez que o programa é iniciado ele pergunta se você já possui uma conta no serviço, caso não possua, através da própria interface de instalação ele dá todo suporte para criação de uma nova conta, após a conta ter sido criada o próximo passo é definir onde ficará o diretório no seu computador que será responsável pelo backup/sincronização dos arquivos. Deixei o padrão do Dropbox, onde nesse caso é criado um diretório em &#8220;<em>/home/$user/Dropbox</em>&#8220;, a partir disso, qualquer arquivo ou diretório que estiver dentro de &#8220;<em>/home/$user/Dropbox</em>&#8221; terá automaticamente um backup feito no caso de um arquivo novo, ou a sincronização realizada em caso de um arquivo já existente e modificado. Muito fácil!</p>
<p>Como ele se integra com o Nautilus, ao clicar com o botão direito sobre qualquer arquivo ou diretório, automaticamente aparece uma nova opção com opções do Dropbox.</p>
<h3>Pulo do Gato</h3>
<p>Para quem é desenvolvedor, sabe que fica complicado ficar movendo um diretório para dentro de outro. Por dois motivos: o primeiro é que fica muito trabalhoso mover qualquer alteração para um novo diretório e o segundo é que o contexto da aplicação e o apontamento para endereços físicos dos arquivos de configuração deixam de funcionar. Para resolver isso resolvi fazer um teste, o que eu fiz foi criar um diretório fora do meu diretório /Dropbox e criar um <a href="http://www.vivaolinux.com.br/dica/Link-simbolico-e-hardlink/"  target="_blank" style="text-decoration: underline">link simbólico</a> desse diretório apontando para /Dropbox. O negócio simplesmente funcionou! Genial! Agora posso apontar os meus diretórios de &#8220;origem&#8221; para dentro do /Dropbox sem precisar movê-los.</p>
<h3>Parte Ruim</h3>
<p>Como nem tudo são flores, a parte ruim é que o o Dropbox é free até 2gb de uso, após isso custa cerca de 10 dólares por mês ou 99 dólares por ano. Mas ainda assim acho que vale muito, nós brasileiros não temos hábito de pagar por serviços online, mas esquecemos que tudo tem um custo. No caso do Dropbox eu imagino que o custo para manter sua estrutura seja caro.</p>
<h3>Outras <em>features</em> interessantes</h3>
<p><strong>Compartilhamento</strong> &#8211; É possível compartilhar um diretório entre N contas de usuário. Digamos que eu tenha um diretório /musicas, então outro amigo meu pode ter acesso a esse mesmo diretório e ainda mais: se tanto eu quanto ele atualizarmos esse diretório, os dois conseguem visualizar as atualizações.</p>
<p><strong>Interface Web</strong> &#8211; O Dropbox possui uma interface web onde é possível acompanhar todos os arquivos já indexados, bem como os últimos arquivos modificados e download dos mesmos.</p>
<p><strong>Revisões</strong> &#8211; É possível ter um histórico de revisões de um arquivo, ou seja, todas as alterações que aquele arquivo sofreu, bem parecido com <a href="http://pt.wikipedia.org/wiki/Sistema_de_controle_de_vers%C3%A3o"  target="_blank" style="text-decoration: underline">controles de versão</a>.</p>
<h3>Resumo</h3>
<p>Não conhecia o serviço, mas após usar por alguns minutos o indico fortemente, ainda não tenho reclamações a fazer, até mesmo porque ainda não subi uma grande quantidade de arquivos, mas se eu tiver novidades, tanto positivas quanto negativas, volto a atualizar esse espaço.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.marcuscavalcanti.net/blog/2009/02/11/backup-e-sincronizacao-de-arquivos-facil-facil/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Não utilize XMLObject para apresentação no Oracle BPM!</title>
		<link>http://www.marcuscavalcanti.net/blog/2009/02/06/nao-utilize-xmlobject-para-apresentacao-no-oraclebpm/</link>
		<comments>http://www.marcuscavalcanti.net/blog/2009/02/06/nao-utilize-xmlobject-para-apresentacao-no-oraclebpm/#comments</comments>
		<pubDate>Fri, 06 Feb 2009 21:50:19 +0000</pubDate>
		<dc:creator>Marcus Cavalcanti</dc:creator>
				<category><![CDATA[BPM]]></category>
		<category><![CDATA[BPMObject]]></category>
		<category><![CDATA[Fuego]]></category>
		<category><![CDATA[JSP]]></category>
		<category><![CDATA[Oracle]]></category>
		<category><![CDATA[OracleBPM]]></category>
		<category><![CDATA[XMLObject]]></category>

		<guid isPermaLink="false">http://www.marcuscavalcanti.net/blog/?p=214</guid>
		<description><![CDATA[Quem trabalha com Web Services no Oracle BPM sabe que é inevitável fugir do XMLObject. E por quê é inevitável? Simplesmente porque toda vez que algum serviço é catalogado, tanto o seu request quanto o seu response são catalogados como um objeto desse tipo, que nada mais é que do que a representação XML de [...]]]></description>
			<content:encoded><![CDATA[<p>Quem trabalha com Web Services no Oracle BPM sabe que é inevitável fugir do <a href="http://download.oracle.com/docs/cd/E13154_01/bpm/docs65/standard_components/Fuego/Xml/XMLObject/XMLObject_component.html" target="_blank" style="text-decoration: underline">XMLObject</a>. E por quê é inevitável? Simplesmente porque toda vez que algum serviço é catalogado, tanto o seu request quanto o seu response são catalogados como um objeto desse tipo, que nada mais é que do que a representação XML de um tipo complexo, ou seja, um <a href="http://www.w3schools.com/Schema/schema_elements_ref.asp" target="_blank" style="text-decoration: underline">XML Schema (XSD)</a>.</p>
<p>Na parte de apresentação no BPM existem duas opções: presentations e JSP. Em ambos os casos é necessário sempre utilizar um <a href="http://download.oracle.com/docs/cd/E13154_01/bpm/docs65/studio/modules/bpm_objects/c_Head_BPM_Objects.html" target="_blank" style="text-decoration: underline">BPM Object</a> para fazer a representação dos dados. Um BPM Object é puramente um objeto e com isso contém atributos e métodos específicos.</p>
<p>No meu caso, tenho trabalhado com JSP para a camada de visualização, já que preciso ir um pouco além do que simplesmente exibir dados. As telas do meu processo precisam um alto nível de customização e também possuem bastantes regras de validação e fluxo no lado do cliente usando Java Script. É também comum no meu processo a utilização de serviços externos, e com isso se faz por necessário apresentar os dados retornados por esses serviços nas minhas páginas JSP. Conforme dito anteriormente, para mostrar esses dados preciso de um BPM Object e para não criar um BPM Object redudante, ou seja, um BPM Object com a estrutura idêntica do XML Object &#8211; que já está cadastrado no meu projeto &#8211; o que eu fiz foi criar um atributo nesse BPM Object que encapsula um XML Object, dessa forma poderia usar os atributos do XML Object como atributos dentro do meu BPM Object. Algo como um atributo do tipo de uma lista genérica em um objeto java.</p>
<p>Mas qual foi a minha surpresa ao iterar sobre esse atributo do tipo XML Object no meu JSP? Simplesmente não funciona, ou melhor, funciona pela metade! hehe .. deixa eu explicar.</p>
<p>Se eu tenho um BPM Object com a seguinte estrutura:</p>
<p><!--DEVFMTCODE--><pre class="devcodeblock" title="Text"><div class="devcodeoverflow"><ol><li>MyBPMObject</li><li>- name (string)</li><li>- email (string)</li><li>- address (XMLObject)</li><li>&nbsp;</li><li>Address (XMLObject)</li><li>- zipcode (int)</li><li>- city (string)</li><li>- state (string)</li></ol></div></pre><!--END_DEVFMTCODE--></p>
<p>E no JSP tentar acessar o atributo da seguinte forma:</p>
<p><!--DEVFMTCODE--><pre class="devcodeblock" title="HTML"><div class="devcodeoverflow"><ol><li>Nome: <span style="color: #009900;">&lt;c:out <span style="color: #000066;">value</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;${bpmObject.name}&quot;</span><span style="color: #66cc66;">/</span>&gt;</span></li><li><span style="color: #009900;">&lt;<a href="http://december.com/html/4/element/br.html"><span style="color: #000000; font-weight: bold;">br</span></a><span style="color: #66cc66;">/</span>&gt;</span></li><li>Estado: <span style="color: #009900;">&lt;c:out <span style="color: #000066;">value</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;${bpmObject.address.state}&quot;</span><span style="color: #66cc66;">/</span>&gt;</span></li></ol></div></pre><!--END_DEVFMTCODE--></p>
<p>Funciona!</p>
<p>Agora, se o meu XMLObject fosse do tipo array, ou seja, uma lista, não funciona! Vejamos o meu BPMObject alterado para suportar uma lista de endereços (address):</p>
<p><!--DEVFMTCODE--><pre class="devcodeblock" title="Text"><div class="devcodeoverflow"><ol><li></li><li>MyBPMObject</li><li>- name (string)</li><li>- email (string)</li><li>- address[] (XMLObject)</li><li></li></ol></div></pre><!--END_DEVFMTCODE--></p>
<p>No JSP:</p>
<p><!--DEVFMTCODE--><pre class="devcodeblock" title="HTML"><div class="devcodeoverflow"><ol><li></li><li>Nome: <span style="color: #009900;">&lt;c:out <span style="color: #000066;">value</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;${bpmObject.name}&quot;</span><span style="color: #66cc66;">/</span>&gt;</span></li><li><span style="color: #009900;">&lt;<a href="http://december.com/html/4/element/br.html"><span style="color: #000000; font-weight: bold;">br</span></a><span style="color: #66cc66;">/</span>&gt;</span></li><li>Estado: <span style="color: #009900;">&lt;c:out <span style="color: #000066;">value</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;${bpmObject.address[0].state}&quot;</span><span style="color: #66cc66;">/</span>&gt;</span></li><li></li></ol></div></pre><!--END_DEVFMTCODE--></p>
<p>O exemplo acima não funciona, é como se o atributo &#8220;address&#8221; não existisse! Bizarro! Tentei inclusive usando a própria <a href="http://download.oracle.com/docs/cd/E13154_01/bpm/docs65/taglib/index.html" target="_blank" style="text-decoration: underline">taglib do BPM</a> e nada!</p>
<p>O que eu tive que fazer? Tcharammm.. criar um BPM Object idêntico ao meu XMLObject e criar um método dentro desse BPM Object que recebe como parâmetro um XML Object, o que ele faz é mapear os valores desse XML Object para os seus próprios atributos&#8230; totalmente POG! Mas foi o jeito&#8230;</p>
<p>Se alguém souber de algum &#8220;pulo do gato&#8221;, por favor me informe que eu publico aqui, mas eu sinceramente acho difícil ter alguma mágica, por mais óbvio que seja, não funciona. O mais bizarro ainda, é que se no Screenflow que antecede o JSP eu der um output do objeto da mesma forma que eu estou dando no JSP, funciona, só não funciona mesmo no JSP :(</p>
<p>Fica a dica: não usem XML Object para apresentar dados!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.marcuscavalcanti.net/blog/2009/02/06/nao-utilize-xmlobject-para-apresentacao-no-oraclebpm/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Diferenças entre versões do Aqualogic BPM para Oracle BPM Studio</title>
		<link>http://www.marcuscavalcanti.net/blog/2009/02/03/diferencas-entre-versoes-do-aqualogic-bpm-para-oracle-bpm-studio/</link>
		<comments>http://www.marcuscavalcanti.net/blog/2009/02/03/diferencas-entre-versoes-do-aqualogic-bpm-para-oracle-bpm-studio/#comments</comments>
		<pubDate>Tue, 03 Feb 2009 22:04:22 +0000</pubDate>
		<dc:creator>Marcus Cavalcanti</dc:creator>
				<category><![CDATA[BPM]]></category>
		<category><![CDATA[ALBPM]]></category>
		<category><![CDATA[Aqualogic]]></category>
		<category><![CDATA[BEA]]></category>
		<category><![CDATA[BPMS]]></category>
		<category><![CDATA[Oracle]]></category>
		<category><![CDATA[OracleBPM]]></category>

		<guid isPermaLink="false">http://www.marcuscavalcanti.net/blog/?p=240</guid>
		<description><![CDATA[Sei que estou devendo um post falando de um exemplo real de um processo de negócio sendo executado por uma ferramenta BPMS, mas enquanto esse post não vem irei falar sobre algo relacionado, mais especificamente sobre as diferenças que notei até agora entre o Aqualogic BPM 6.03, ainda com a BEA Systems como mantenadora e [...]]]></description>
			<content:encoded><![CDATA[<p>Sei que estou devendo um post falando de um exemplo real de um processo de negócio sendo executado por uma ferramenta BPMS, mas enquanto esse post não vem irei falar sobre algo relacionado, mais especificamente sobre as diferenças que notei até agora entre o Aqualogic BPM 6.03, ainda com a BEA Systems como mantenadora e o Oracle BPM Studio 10.3, que passou a ser o novo nome do Aqualogic BPM após a <a style="text-decoration: underline" href="http://www.oracle.com/corporate/press/2008_jan/bea.html" target="_blank">aquisição da BEA pela Oracle</a>.</p>
<h3>O início</h3>
<p>Ao iniciar o projeto que estou atualmente, confesso que fiquei no impasse de &#8220;qual versão usar?&#8221;, pois o BPM Server (enterprise) de produção ainda é o 6, ou seja, Aqualogic. Paralelo a isso, comecei a ter alguns problemas com a versão 6.03 do Aqualogic BPM Studio na minha máquina, pois como tenho dois <em>localhost</em> (alias) apontando para o mesmo IP local (127.0.0.1), ao subir a engine um erro com a mensagem &#8220;server has exited&#8221; começou a ocorrer e com isso não conseguia &#8220;startar&#8221; a ferramenta. Pesquisando no Google, vi no falecido fórum da BEA, uma thread dizendo que para resolver esse problema bastaria eu  comentar uma das linhas que apontam para o meu IP local no arquivo de hosts do meu SO. Fiz o procedimento e&#8230; nada! Ainda nessa mesma thread, havia outro comentário informando que na versão nova (Oracle) a engine estava mais esperta e resolvia esses tipos de problemas, foi a partir disso que resolvi usar a nova versão, ainda meio que ressabiado.</p>
<h3>O problema e a segurança</h3>
<p>Mas aí surge um novo problema: a incompatibilidade entre versões. Meu ambiente de desenvolvimento usa a versão nova e o meu ambiente de produção usa a versão mais antiga, será que com isso terei problemas em fazer deploy? A princípio não deveria ocorrer problema algum, pois na verdade o que mudou foi basicamente a skin da ferramenta, o workspace (skin também) e a engine que ficou mais esperta. Nesse meio tempo, por coinciência, tive um treinamento de BPM aqui no RJ com o pessoal da Oracle e ao perguntar pra eles se esse problema poderia se concretizar, fui respondido que não, apesar de nunca terem feito esse teste. Confirmaram ainda, que realmente quase nada havia mudado de uma versão para outra. Foi o suficiente para eu ter segurança na minha decisão.</p>
<h3>A realidade</h3>
<p>Mas no decorrer do projeto, tenho percebido que o buraco é um pouco mais embaixo hehe, nada que comprometa o desenvolvimento, mas alguns cuidados precisam ser tomados e como estou passando pela experiência, acho válido relatar para quem possar vir a passar pelas mesmas situações que eu. Só gostaria de ressaltar, que os testes que tenho feito não são os ideais, pois o que estou testando é o projeto sendo executado no Studio BPM na versão Oracle (nova) e também no Aqualogic (antiga), mas ainda não tentei fazer deploy em uma versão enterprise, pois ainda estou sem ambiente para isso, quando tiver esses testes, atualizo esse post.</p>
<p>Abaixo irei enumerar as diferenças que notei até agora com suas devidas observações.</p>
<p><strong>Controle de Versão</strong><br />
Na versão 6.03 (Aqualogic), a ferramenta ainda não possuia um controle de versão embutido para SVN, se fazia por necessário <a style="text-decoration: underline" href="http://74.125.47.132/search?q=cache:o2j-XVjVjnEJ:forums.bea.com/thread.jspa%3FthreadID%3D300003640+albpm+svn&#038;hl=pt-BR&#038;ct=clnk&#038;cd=1&#038;gl=br&#038;client=firefox-a" target="_blank">instalar um plugin (Subversive)</a> para ter essa funcionalidade, agora isso já vem de graça! Essa sem dúvida foi uma melhoria muito positiva na qual não tive problema algum entre as versões.</p>
<p><strong>Connectors</strong><br />
O BPM Studio, em ambas as versões, tem uma coisa muito legal chamada <em>connectors</em>. Com os <em>connectors</em> é possível criar um atalho para determinada atividade sem ter que puxar uma <em>transition</em> para a mesma, isso é muito bom para ajudar na organização do processo, pois com isso evita-se que um monte de <em>transitions</em> fiquem entrelaçadas deixando o processo uma verdadeira zona.</p>
<p>Com <em>connectors</em> comecei a ter alguns problemas, pois processos que possuiam <em>connectors</em> na versão nova simplesmente não funcionavam na versão antiga. Pior do que isso, processos com <em>connectors</em> na versão nova não abrim na versão antiga! Não consegui descobrir o motivo, a única conclusão que cheguei é que geralmente o problema ocorria com <em>connectors</em> que <em>linkavam</em> para uma atividade final (End) do processo.</p>
<p>Conclusão: não uso mais.</p>
<p><strong>Instanciar Variáveis</strong><br />
Esse foi um comportamento que eu sinceramente prefiro da versão antiga, pois acho mais correto.</p>
<p>O que ocorre é que algumas variáveis de instância eu não preciso instanciar, então em um array de BPMObject eu consigo ter algo do tipo:</p>
<p><!--DEVFMTCODE--><pre class="devcodeblock" title="Java"><div class="devcodeoverflow"><ol><li>bpmObject<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span>.<span style="color: #006633;">nome</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;Marcus Cavalcanti&quot;</span><span style="color: #339933;">;</span></li></ol></div></pre><!--END_DEVFMTCODE--></p>
<p>Ou seja, não precisei instanciar aquele índice corrente do array. Já na versão antiga isso não funciona, obviamente ocorre um NullPointerException, então para resolver isso eu preciso fazer:</p>
<p><!--DEVFMTCODE--><pre class="devcodeblock" title="Java"><div class="devcodeoverflow"><ol><li></li><li>bpmObject<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> MeuBpmObject<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></li><li>bpmObject<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span>.<span style="color: #006633;">nome</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;Marcus Cavalcanti&quot;</span><span style="color: #339933;">;</span></li><li></li></ol></div></pre><!--END_DEVFMTCODE--></p>
<p>Eu prefiro a segunda opção, mais conservadora. Sinceramente não sei como e porque a primeira opção funciona na versão nova, pois não deveria.</p>
<p><strong>Activity x Transitions</strong><br />
Uma mudança simples, mas muito significativa ocorreu nessa nova versão. Toda vez que uma atividade é adicionada ou removida, automaticamente o layout se ajusta e na maioria das vezes bagunçando as transitions entre uma atividade e outra. Agora na nova versão existe a possibilidade de habilitar/desabilitar esse &#8220;recurso&#8221;. É muito simples, basta ir em:</p>
<p><!--DEVFMTCODE--><pre class="devcodeblock" title="Text"><div class="devcodeoverflow"><ol><li></li><li>Window &gt; BPM Preferences &gt; Activity &gt; General</li><li></li></ol></div></pre><!--END_DEVFMTCODE--></p>
<p>Seguido os passos acima, basta apenas desmarcar o último checkbox. Fichinha!</p>
<p><strong>Gráficos e Skin</strong><br />
Nossa&#8230; esse foi um avanço e tanto! Na versão para Linux os ícones ficavam horrorosos! Ficavam sem transparência por causa do PNG, então ficava aquele fundo preto e era horrível, além do mais os ícones agora estão bem mais trabalhados e bonitinhos :)</p>
<p>O Workspace foi outra coisa que mudou, achei a nova skin bem melhor e funcional, parece que cabem mais informações.</p>
<h3>Conclusão</h3>
<p>Conforme dito no começo, mudanças em relação a <em>features</em> não existem de uma versão para outra, mas percebi algumas pequenas mudanças ao executar o mesmo projeto em versões diferentes, o que pode trazer pequenos problemas.</p>
<p>Acredito que a principal questão seja em relação a diferença entre versões de desenvolvimento e enterprise, mas esses testes ainda não possuo e assim que possuir atualizo esse post. Da mesma forma, se surgirem novas diferenças entre as &#8220;versões Studio&#8221;, esse espaço será atualizado.</p>
<p>PS: se alguém tiver percebido mais algum comportamento estranho, fique a vontade para compartilhar, os comentários estão aí pra isso!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.marcuscavalcanti.net/blog/2009/02/03/diferencas-entre-versoes-do-aqualogic-bpm-para-oracle-bpm-studio/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Além do Desenvolvedor</title>
		<link>http://www.marcuscavalcanti.net/blog/2009/01/31/alem-do-desenvolvedor/</link>
		<comments>http://www.marcuscavalcanti.net/blog/2009/01/31/alem-do-desenvolvedor/#comments</comments>
		<pubDate>Sat, 31 Jan 2009 03:51:50 +0000</pubDate>
		<dc:creator>Marcus Cavalcanti</dc:creator>
				<category><![CDATA[Carreira & Profissão]]></category>
		<category><![CDATA[Carreira]]></category>
		<category><![CDATA[Desenvolvedor]]></category>
		<category><![CDATA[mercado ti]]></category>
		<category><![CDATA[Profissional]]></category>

		<guid isPermaLink="false">http://www.marcuscavalcanti.net/blog/?p=218</guid>
		<description><![CDATA[Confesso que o termo &#8220;desenvolvedor&#8221; sempre foi algo que me incomodou, algo como o termo &#8220;web designer&#8221; para os designers. E por que me incomoda? Simplesmente porque acho esse termo muito limitador, dá a sensação de que o desenvolvedor é um cara limitado ou que só faz coisas pontuais, como desenvolver códigos. Na verdade não [...]]]></description>
			<content:encoded><![CDATA[<p>Confesso que o termo &#8220;desenvolvedor&#8221; sempre foi algo que me incomodou, <a href="http://webinsider.uol.com.br/index.php/2007/04/11/nao-existe-webdesigner/" target="_blank" style="text-decoration: underline">algo como o termo &#8220;web designer&#8221; para os designers</a>. E por que me incomoda? Simplesmente porque acho esse termo muito limitador, dá a sensação de que o desenvolvedor é um cara limitado ou que só faz coisas pontuais, como desenvolver códigos. Na verdade não é apenas isso, pelo menos não deveria ser, pois um bom profissional tem que ir muito além disso.</p>
<p>Ao passar dos anos aprendi que um &#8220;bom desenvolvedor&#8221; deve se preocupar com questões além do código, como por exemplo:</p>
<ul>
<li><a href="http://www.marketingdebusca.com.br/seo/"  style="text-decoration: underline;" target="_blank">SEO</a> (no caso de websites, claro);</li>
<li>Segurança (<a href="http://en.wikipedia.org/wiki/SQL_injection"  style="text-decoration: underline;" target="_blank">sql injection</a>, <a href="http://en.wikipedia.org/wiki/Cross-site_scripting"  style="text-decoration: underline;" target="_blank">xss</a>, <a href="http://en.wikipedia.org/wiki/Computer_security" style="text-decoration: underline;" target="_blank">etc</a>);</li>
<li><a href="http://webinsider.uol.com.br/index.php/2003/11/06/arquitetura-de-informacao-que-diabo-e-isso-1/" style="text-decoration: underline;" target="_blank">Arquitetura da Informação</a>;</li>
<li><a href="http://developer.yahoo.com/performance/rules.html"   style="text-decoration: underline;" target="_blank">Performance</a>;</li>
<li><a href="http://www.smashingmagazine.com/2008/11/13/15-useful-project-management-tools/" style="text-decoration: underline;" target="_blank">Organização do Projeto</a>;</li>
<li<a href="http://informatica.hsw.uol.com.br/sistemas-operacionais.htm"    style="text-decoration: underline;" target="_blank">Sistemas Operacionais</a> e <a href="http://en.wikipedia.org/wiki/Server_(computing)" style="text-decoration: underline;" target="_blank">Servidores</a>;</li>
<li><a href="http://www.baguete.com.br/colunasDetalhes.php?id=1392"  style="text-decoration: underline;" target="_blank">Metodologias de Desenvolvimento</a>;</li>
<li><a href="http://brunnosilvaweblog.blogspot.com/2009/01/voc-no-ser-um-bom-programador.html" class="broken_link"  style="text-decoration: underline;" target="_blank">Ter bom convívio social</a>.</li>
</ul>
<p>Os assuntos acima são apenas alguns dentre uma gama de assuntos, que podem ser citados como de interesse de um &#8220;bom desenvolvedor&#8221;. Não estou afirmando que o tal &#8220;bom desenvolvedor&#8221; deve ser um <em>expert</em> em tudo, mas ele deve ter o mínimo de conhecimento em N assuntos para saber os prós e contras que aquilo trará para o seu projeto. Entretanto isso não é uma tarefa das mais fáceis, já que para deter conhecimento de uma gama de assuntos, esse &#8220;bom desenvolvedor&#8221; deve dedicar um considerável espaço de tempo para leituras e pesquisas, sejam em livros propriamente ditos, como em blogs, artigos ou revistas.</p>
<p>Todos os &#8220;bons desenvolvedores&#8221; que conheço e que hoje em dia tem um cargo de maior responsabilidade, como líderes de projeto ou coordenadores de área, possuem uma certa habilidade para lhe dar com assuntos variados, bem como uma certa facilidade em absorver novos conhecimentos. É muito diferente, por exemplo, desenvolver um site que tenha centenas de acessos diários, para um e-commerce que tenha cerca de 1000 compras por hora, pois nesse último caso tudo deve ser pensado de forma diferente: desde a arquitetura, otimizações de banco de dados, resources (javascript) de terceiros, acesso concorrente até privacidade das informações e volume do tráfego de dados&#8230; enfim, não é pouca coisa.</p>
<p>Infelizmente o mercado global de TI aponta que a quantidade dos &#8220;desenvolvedores&#8221; &#8211; aqueles que não queremos ser &#8211; ainda é maior do que as dos &#8220;bons desenvolvedores&#8221;, e isso não sou eu que digo, pesquisas de institutos respeitados (<a href="http://www.baguete.com.br/artigosDetalhes.php?id=342" style="text-decoration: underline;" target="_blank">aqui</a>, <a href="http://www.uai.com.br/UAI/html/sessao_4/2008/06/23/em_noticia_interna,id_sessao=4&#038;id_noticia=68424/em_noticia_interna.shtml" style="text-decoration: underline;" target="_blank">aqui</a>, <a href="http://www.infoblogs.com.br/view.action?contentId=4914&#038;Setor-de-TI-alerta-para-carencia-de-mao-de-obra-qualificada" style="text-decoration: underline;" target="_blank">aqui</a> e <a href="http://www.convergenciadigital.com.br/cgi/cgilua.exe/sys/start.htm?from_info_index=11&#038;infoid=15825&#038;sid=46" style="text-decoration: underline;" target="_blank">aqui)</a> apontam para uma escassez de mão-de-obra qualificada no mercado. Eu ainda diria mais: acredito que no Brasil a disparidade deva ser ainda maior.</p>
<p>Certamente você que está lendo esse post pode achar que não se enquadra nesse perfil citado acima, mas será que realmente não? Se você tem essa certeza, é um bom caminho, mas procure não se acomodar. É como diz aquela famosa e sábia frase de <a href="http://pt.wikipedia.org/wiki/S%C3%B3crates"  style="text-decoration: underline;" target="_blank">Sócrates</a>: &#8220;Quanto mais se aprende mais se tem a certeza de que nada se sabe&#8221;. Agora, se você ficou na dúvida, não se desespere! Basta apenas começar a pesquisar e estudar mais, sem botar a carroça na frente dos bois. Uma dica que dou, é de que é preciso ter um foco, devemos nos conhecer melhor, saber o que gostamos de fazer e tentar imaginar onde e como gostaríamos de estar trabalhando daqui há alguns anos, a partir disso, acredito ser possível saber suas aptidões e o que pesquisar/estudar, pois de <a href="http://carreiradeti.com.br/perfil-profissional-faz-tudo/" style="text-decoration: underline" target="_blank">nada adianta</a> conhecer mil coisas superficialmente e não ter foco em nada, definitivamente não é isso que o mercado procura.</p>
<p>Outro ponto que não posso esquecer, são as famosas empresas que querem aquele cara &#8220;ninja&#8221;. Um ninja deve ser o cara que sabe de tudo e mais um pouco. Muitas vezes essas empresas pagam pelo &#8220;ninja&#8221; um salário de estagiário e exigem do &#8220;ninja&#8221; um desempenho de sênior, já que quando o &#8220;ninja&#8221; foi contratado não foi levado em conta o seu nível de experiência e conhecimento. Essas empresas, apenas colaboram de forma efetiva para degradação do mercado e pela escassez de bons profissionais.</p>
<p>Devemos saber dividir as coisas: uma coisa é um bom profissional, que tem um foco bem definido, mas que possui conhecimento sobre outros assuntos, outra coisa é um profissional que sabe assobiar, chupar cana e cantar ao mesmo tempo, mas que na verdade não faz nenhum dos três bem. Quando surgir uma empresa ou profissional com esse perfil, desconfie.</p>
<p>PS: Como são sinônimos, eu diria que o termo &#8220;programador&#8221; causa o mesmo efeito.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.marcuscavalcanti.net/blog/2009/01/31/alem-do-desenvolvedor/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Convertendo objeto em array com PHP</title>
		<link>http://www.marcuscavalcanti.net/blog/2009/01/21/convertendo-objeto-em-array-com-php/</link>
		<comments>http://www.marcuscavalcanti.net/blog/2009/01/21/convertendo-objeto-em-array-com-php/#comments</comments>
		<pubDate>Thu, 22 Jan 2009 02:10:44 +0000</pubDate>
		<dc:creator>Marcus Cavalcanti</dc:creator>
				<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://www.marcuscavalcanti.net/blog/?p=181</guid>
		<description><![CDATA[Mais do que nunca têm-se trabalhado com objetos em PHP, algumas vezes de forma certa, outras vezes de forma errada, mas isso não vem ao caso, a questão é que com a explosão dos frameworks MVC e o uso da camada modelo como representante dos dados de uma aplicação, tornou-se muito comum enviar objetos ao [...]]]></description>
			<content:encoded><![CDATA[<p>Mais do que nunca têm-se trabalhado com objetos em PHP, algumas vezes de forma certa, outras vezes de forma errada, mas isso não vem ao caso, a questão é que com a explosão dos frameworks MVC e o uso da camada modelo como representante dos dados de uma aplicação, tornou-se muito comum enviar objetos ao invés de arrays para nossa camada de visualização. Até aí nenhum problema, o problema surge quando precisamos trabalhar em cima desses objetos e realizar ordenações, filtrar elementos repetidos, extrair elementos específicos, dentre outras necessidades. Apesar da <a href="http://www.php.net/spl" style="text-decoration: underline;" target="_blank">SPL</a> ter chegado, o PHP ainda não tem um framework como o <a href="http://java.sun.com/j2se/1.5.0/docs/api/java/util/Collections.html" style="text-decoration: underline;" target="_blank">Collections Framework</a> do Java para realizar esse trabalho, então  muitas vezes torna-se árduo e nem um pouco prazeroso fazer certas operações. Entretanto o PHP possui boas funções para manipular arrays e em muitos casos torna-se vantajoso transformar objetos em arrays, pois assim é possível fazer o uso dessas funções.</p>
<p>Pensando nas situações descritas acima e também baseado em necessidades reais do meu dia-a-dia, criei uma função muito simples que converte um objeto em array.</p>
<p>Imagine um objeto com a seguinte estrutura:</p>
<p><!--DEVFMTCODE--><pre class="devcodeblock" title="PHP"><div class="devcodeoverflow"><ol><li>TableEditor Object</li><li><span style="color: #009900;">&#40;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #009900;">&#91;</span>db<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=&gt;</span> Resource id <span style="color: #666666; font-style: italic;">#82</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #009900;">&#91;</span>pk<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=&gt;</span> id_idioma_afiliado</li><li>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #009900;">&#91;</span>table<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=&gt;</span> idioma_afiliado</li><li>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #009900;">&#91;</span>fields<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=&gt;</span> <a href="http://www.php.net/array"><span style="color: #990000;">Array</span></a></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #009900;">&#40;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #009900;">&#91;</span>id_idioma_afiliado<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=&gt;</span> <a href="http://www.php.net/array"><span style="color: #990000;">Array</span></a></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #009900;">&#40;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #009900;">&#91;</span>display<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=&gt;</span> id_idioma_afiliado</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #009900;">&#91;</span>input<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=&gt;</span> text</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #009900;">&#91;</span>values<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=&gt;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #009900;">&#91;</span><span style="color: #b1b100;">default</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=&gt;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #009900;">&#41;</span></li><li>&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #009900;">&#91;</span>afiliado_id<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=&gt;</span> <a href="http://www.php.net/array"><span style="color: #990000;">Array</span></a></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #009900;">&#40;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #009900;">&#91;</span>display<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=&gt;</span> afiliado_id</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #009900;">&#91;</span>input<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=&gt;</span> text</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #009900;">&#91;</span>values<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=&gt;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #009900;">&#91;</span><span style="color: #b1b100;">default</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=&gt;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #009900;">&#41;</span></li><li>&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #009900;">&#91;</span>idioma_id<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=&gt;</span> <a href="http://www.php.net/array"><span style="color: #990000;">Array</span></a></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #009900;">&#40;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #009900;">&#91;</span>display<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=&gt;</span> idioma_id</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #009900;">&#91;</span>input<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=&gt;</span> text</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #009900;">&#91;</span>values<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=&gt;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #009900;">&#91;</span><span style="color: #b1b100;">default</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=&gt;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #009900;">&#41;</span></li><li>&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #009900;">&#91;</span>tx_descricao_afiliado<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=&gt;</span> <a href="http://www.php.net/array"><span style="color: #990000;">Array</span></a></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #009900;">&#40;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #009900;">&#91;</span>display<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=&gt;</span> tx_descricao_afiliado</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #009900;">&#91;</span>input<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=&gt;</span> textarea</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #009900;">&#91;</span>values<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=&gt;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #009900;">&#91;</span><span style="color: #b1b100;">default</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=&gt;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #009900;">&#41;</span></li><li>&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #009900;">&#91;</span>tx_transfer<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=&gt;</span> <a href="http://www.php.net/array"><span style="color: #990000;">Array</span></a></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #009900;">&#40;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #009900;">&#91;</span>display<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=&gt;</span> tx_transfer</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #009900;">&#91;</span>input<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=&gt;</span> textarea</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #009900;">&#91;</span>values<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=&gt;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #009900;">&#91;</span><span style="color: #b1b100;">default</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=&gt;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #009900;">&#41;</span></li><li>&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #009900;">&#91;</span>tx_informacao_afiliado<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=&gt;</span> <a href="http://www.php.net/array"><span style="color: #990000;">Array</span></a></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #009900;">&#40;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #009900;">&#91;</span>display<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=&gt;</span> tx_informacao_afiliado</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #009900;">&#91;</span>input<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=&gt;</span> textarea</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #009900;">&#91;</span>values<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=&gt;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #009900;">&#91;</span><span style="color: #b1b100;">default</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=&gt;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #009900;">&#41;</span></li><li>&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #009900;">&#91;</span>tx_apresentacao_afiliado<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=&gt;</span> <a href="http://www.php.net/array"><span style="color: #990000;">Array</span></a></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #009900;">&#40;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #009900;">&#91;</span>display<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=&gt;</span> tx_apresentacao_afiliado</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #009900;">&#91;</span>input<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=&gt;</span> textarea</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #009900;">&#91;</span>values<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=&gt;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #009900;">&#91;</span><span style="color: #b1b100;">default</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=&gt;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #009900;">&#41;</span></li><li>&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #009900;">&#41;</span></li><li><span style="color: #009900;">&#41;</span></li></ol></div></pre><!--END_DEVFMTCODE--></p>
<p>Se quiséssemos ordená-lo, por exemplo, apesar de não ser difícil, demandaria tempo.<br />
Mas e se ao invés de um objeto, tivéssemos um array? Algo como:</p>
<p><!--DEVFMTCODE--><pre class="devcodeblock" title="PHP"><div class="devcodeoverflow"><ol><li><a href="http://www.php.net/array"><span style="color: #990000;">Array</span></a></li><li><span style="color: #009900;">&#40;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #009900;">&#91;</span>db<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=&gt;</span> Resource id <span style="color: #666666; font-style: italic;">#82</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #009900;">&#91;</span>pk<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=&gt;</span> id_idioma_afiliado</li><li>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #009900;">&#91;</span>table<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=&gt;</span> idioma_afiliado</li><li>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #009900;">&#91;</span>fields<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=&gt;</span> <a href="http://www.php.net/array"><span style="color: #990000;">Array</span></a></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #009900;">&#40;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #009900;">&#91;</span>id_idioma_afiliado<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=&gt;</span> <a href="http://www.php.net/array"><span style="color: #990000;">Array</span></a></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #009900;">&#40;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #009900;">&#91;</span>display<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=&gt;</span> id_idioma_afiliado</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #009900;">&#91;</span>input<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=&gt;</span> text</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #009900;">&#91;</span>values<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=&gt;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #009900;">&#91;</span><span style="color: #b1b100;">default</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=&gt;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #009900;">&#41;</span></li><li>&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #009900;">&#91;</span>afiliado_id<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=&gt;</span> <a href="http://www.php.net/array"><span style="color: #990000;">Array</span></a></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #009900;">&#40;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #009900;">&#91;</span>display<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=&gt;</span> afiliado_id</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #009900;">&#91;</span>input<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=&gt;</span> text</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #009900;">&#91;</span>values<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=&gt;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #009900;">&#91;</span><span style="color: #b1b100;">default</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=&gt;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #009900;">&#41;</span></li><li>&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #009900;">&#91;</span>idioma_id<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=&gt;</span> <a href="http://www.php.net/array"><span style="color: #990000;">Array</span></a></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #009900;">&#40;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #009900;">&#91;</span>display<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=&gt;</span> idioma_id</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #009900;">&#91;</span>input<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=&gt;</span> text</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #009900;">&#91;</span>values<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=&gt;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #009900;">&#91;</span><span style="color: #b1b100;">default</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=&gt;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #009900;">&#41;</span></li><li>&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #009900;">&#91;</span>tx_descricao_afiliado<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=&gt;</span> <a href="http://www.php.net/array"><span style="color: #990000;">Array</span></a></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #009900;">&#40;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #009900;">&#91;</span>display<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=&gt;</span> tx_descricao_afiliado</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #009900;">&#91;</span>input<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=&gt;</span> textarea</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #009900;">&#91;</span>values<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=&gt;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #009900;">&#91;</span><span style="color: #b1b100;">default</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=&gt;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #009900;">&#41;</span></li><li>&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #009900;">&#91;</span>tx_transfer<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=&gt;</span> <a href="http://www.php.net/array"><span style="color: #990000;">Array</span></a></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #009900;">&#40;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #009900;">&#91;</span>display<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=&gt;</span> tx_transfer</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #009900;">&#91;</span>input<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=&gt;</span> textarea</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #009900;">&#91;</span>values<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=&gt;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #009900;">&#91;</span><span style="color: #b1b100;">default</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=&gt;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #009900;">&#41;</span></li><li>&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #009900;">&#91;</span>tx_informacao_afiliado<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=&gt;</span> <a href="http://www.php.net/array"><span style="color: #990000;">Array</span></a></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #009900;">&#40;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #009900;">&#91;</span>display<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=&gt;</span> tx_informacao_afiliado</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #009900;">&#91;</span>input<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=&gt;</span> textarea</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #009900;">&#91;</span>values<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=&gt;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #009900;">&#91;</span><span style="color: #b1b100;">default</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=&gt;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #009900;">&#41;</span></li><li>&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #009900;">&#91;</span>tx_apresentacao_afiliado<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=&gt;</span> <a href="http://www.php.net/array"><span style="color: #990000;">Array</span></a></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #009900;">&#40;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #009900;">&#91;</span>display<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=&gt;</span> tx_apresentacao_afiliado</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #009900;">&#91;</span>input<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=&gt;</span> textarea</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #009900;">&#91;</span>values<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=&gt;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #009900;">&#91;</span><span style="color: #b1b100;">default</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=&gt;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #009900;">&#41;</span></li><li>&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #009900;">&#41;</span></li><li><span style="color: #009900;">&#41;</span></li></ol></div></pre><!--END_DEVFMTCODE--></p>
<p>Ficaria muito mais fácil, não?!</p>
<p>Para obter esse resultado, basta jogar a funçãozinha abaixo como um helper no seu projeto ou criar um método estático em sua classe utilitária. Segue:</p>
<p><!--DEVFMTCODE--><pre class="devcodeblock" title="PHP"><div class="devcodeoverflow"><ol><li><span style="color: #000000; font-weight: bold;">function</span> objectToArray <span style="color: #009900;">&#40;</span><span style="color: #000088;">$object</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span></li><li>	<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span> <a href="http://www.php.net/count"><span style="color: #990000;">count</span></a><span style="color: #009900;">&#40;</span><span style="color: #000088;">$object</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">&gt;</span> 1 <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span></li><li>		<span style="color: #000088;">$arr</span> <span style="color: #339933;">=</span> <a href="http://www.php.net/array"><span style="color: #990000;">array</span></a><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></li><li>		<span style="color: #b1b100;">for</span> <span style="color: #009900;">&#40;</span> <span style="color: #000088;">$i</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span> <span style="color: #000088;">$i</span> <span style="color: #339933;">&lt;</span> <a href="http://www.php.net/count"><span style="color: #990000;">count</span></a><span style="color: #009900;">&#40;</span><span style="color: #000088;">$object</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #000088;">$i</span><span style="color: #339933;">++</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span></li><li>			<span style="color: #000088;">$arr</span><span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <a href="http://www.php.net/get_object_vars"><span style="color: #990000;">get_object_vars</span></a><span style="color: #009900;">&#40;</span><span style="color: #000088;">$object</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$i</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></li><li>		<span style="color: #009900;">&#125;</span></li><li>&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #b1b100;">return</span> <span style="color: #000088;">$arr</span><span style="color: #339933;">;</span></li><li>&nbsp;</li><li>	<span style="color: #009900;">&#125;</span> <span style="color: #b1b100;">else</span> <span style="color: #009900;">&#123;</span></li><li>		<span style="color: #b1b100;">return</span> <a href="http://www.php.net/get_object_vars"><span style="color: #990000;">get_object_vars</span></a><span style="color: #009900;">&#40;</span><span style="color: #000088;">$object</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></li><li>	<span style="color: #009900;">&#125;</span></li><li><span style="color: #009900;">&#125;</span></li></ol></div></pre><!--END_DEVFMTCODE--></p>
<p>Para utilizar, é simples:</p>
<p><!--DEVFMTCODE--><pre class="devcodeblock" title="PHP"><div class="devcodeoverflow"><ol><li><span style="color: #666666; font-style: italic;">// $object é o seu objeto</span></li><li><span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">&quot;&lt;pre&gt;&quot;</span><span style="color: #339933;">;</span></li><li><a href="http://www.php.net/print_r"><span style="color: #990000;">print_r</span></a><span style="color: #009900;">&#40;</span>objectToArray<span style="color: #009900;">&#40;</span><span style="color: #000088;">$object</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></li><li><span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">&quot;&lt;/pre&gt;&quot;</span><span style="color: #339933;">;</span></li></ol></div></pre><!--END_DEVFMTCODE--></p>
<p>A boa notícia é que esta função preserva toda hierarquia dos seus objetos criando dimensões dentro desse array, no caso uma <a href="http://pt.wikipedia.org/wiki/Matriz_(matem%C3%A1tica)"  style="text-decoration: underline;" target="_blank">matriz</a>. O exemplo que eu usei foi bem simples, apenas para poder ilustrar o uso da função, mas caso tivéssemos um objeto mais &#8220;complexo&#8221; toda sua estrutura seria mantida sem problemas.</p>
<p>Uma dica bem simples, mas espero que seja de grande utilidade! :)</p>
]]></content:encoded>
			<wfw:commentRss>http://www.marcuscavalcanti.net/blog/2009/01/21/convertendo-objeto-em-array-com-php/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Introdução ao BPM e BPMS</title>
		<link>http://www.marcuscavalcanti.net/blog/2009/01/18/introducao-bpm-e-bpms/</link>
		<comments>http://www.marcuscavalcanti.net/blog/2009/01/18/introducao-bpm-e-bpms/#comments</comments>
		<pubDate>Sun, 18 Jan 2009 17:00:10 +0000</pubDate>
		<dc:creator>Marcus Cavalcanti</dc:creator>
				<category><![CDATA[BPM]]></category>
		<category><![CDATA[SOA]]></category>
		<category><![CDATA[Aqualogic]]></category>
		<category><![CDATA[BPMN]]></category>
		<category><![CDATA[BPMS]]></category>
		<category><![CDATA[Oracle]]></category>
		<category><![CDATA[OracleBPM]]></category>
		<category><![CDATA[Processos]]></category>

		<guid isPermaLink="false">http://www.marcuscavalcanti.net/blog/?p=121</guid>
		<description><![CDATA[O objetivo desse post era sair um pouco dos assuntos teóricos e partir para um assunto mais específico, onde iria dar algumas dicas sobre como fazer upload de arquivos e gravar o conteúdo em um banco de dados usando a ferramenta Oracle BPM Studio, mas como BPM é um assunto &#8211; apesar de muito falado [...]]]></description>
			<content:encoded><![CDATA[<p>O objetivo desse post era sair um pouco dos assuntos teóricos e partir para um assunto mais específico, onde iria dar algumas dicas sobre como fazer upload de arquivos e gravar o conteúdo em um banco de dados usando a ferramenta <a href="http://download.oracle.com/docs/cd/E13154_01/bpm/docs65/index.html" style="text-decoration: underline" target="_blank">Oracle BPM Studio</a>, mas como BPM é um assunto &#8211; apesar de muito falado no mundo de TI &#8211; ainda obscuro, achei que valeria a pena fazer uma breve introdução sobre BPM e BPMS antes de falar especificamente sobre uma ferramenta BPMS.</p>
<h3>
BPM</h3>
<p>BPM é o acrônimo de Business Process Management, que traduzindo para o português seria Gerenciamento de Processos de Negócio.</p>
<p>Definir o termo <a href="http://bpmsbrasil.blogspot.com/2007/05/bpm-o-inexplicvel.html" style="text-decoration: underline" target="_blank">BPM não é uma tarefa trivial</a>, pois como se trata de um assunto amplo e recente, cabem mil definições, algumas não tão boas, de cunho mais comercial e outras mais simples.  Porém acredito que as explicações mais simples, não conseguem dar um <em>overview</em> sobre BPM para uma pessoa leiga no assunto, portanto tentarei usar exemplos e conceitos para tentar passar melhor esse significado.</p>
<p>BPM tem a ver com processos, e BPMS com processos e software. Sendo prático, eu diria que BPM é uma metodologia, um conjunto de boas práticas, com o o intuito de mapear e gerenciar processos de negócio, onde são (ou não) envolvidos clientes, usuários, fornecedores e atividades automáticas (informatizadas), onde o principal objetivo do BPM seria obter uma melhoria desse processo.</p>
<p>Se ainda não ficou muito claro, para facilitar as coisas, darei um exemplo real. Imagine o seguinte cenário:</p>
<ul>
<li>Departamento comercial da empresa X identifica que o produto Y é um produto com forte potencial de venda;</li>
<li>Departamento comercial solicita ao departamento de compra/venda o produto Y;</li>
<li>Departamento de compra/venda vai em busca de fornecedores fazendo cotação de preços em busca do melhor custo x benefício;</li>
<li>Departamento de compra/venda define o fornecedor Z como escolhido e esse fica de fazer a entrega dos produtos em 15 dias;</li>
<li>Na data estipulada, o setor de logística da empresa X, recebe o produto do fornecedor Z e assim comunica ao departamento comercial que este está disponível para venda;</li>
<li>Departamento comercial da empresa X, então comunica ao departamento de marketing, que nesse caso irá bolar um campanha de divulgação desse novo produto;</li>
<li>Campanha criada, produto finalmente é lançado.</li>
</ul>
<p>Repare no fluxo acima e perceba que isso é um processo de negócio, pois ele possui um começo, envolve pessoas, pode envolver outros recursos, tem um objetivo bem definido e provavelmente ocorre com certa frequência. Esse processo pode ser melhorado, se tornar mais eficiente? É provável que sim e é nesse ponto que entram o BPM e o BPMS. O BPM seria uma forma de mapear esse processo, identificar gargalos, pontos falhos afim de melhorá-lo e para isso a ajuda de um (bom) software BPMS é muito importante.</p>
<h3>BPMS</h3>
<p>BPMS (Bussiness Process Management Software) seria o braço direito do BPM na melhoria do processo exemplificado acima, através do BPMS seria possível <a href="http://en.wikipedia.org/wiki/BPMN" style="text-decoration: underline" target="_blank">modelar esse processo visualmente</a> e com recursos específicos de uma ferramenta BPMS é possível ter métricas e controles de todo fluxo do processo, dessa forma seria possível, por exemplo, simular esse processo de diversas maneiras, criar mecanismos de automação e fornecer relatórios específicos para tomadas de decisão. Tudo isso com o objetivo único e exclusivo da melhoria desse processo.</p>
<p>É difícil falar sobre BPM sem ser um pouco repetitivo, sem deixar a leitura cansativa, pois trata-se de um assunto muito teórico e abstrato, mas a melhor forma de falar sobre BPM é com exemplos, portanto, com o assunto introduzido, no próximo post mostrarei um cenário de um processo real em que estou trabalhando atualmente e a necessidade do uso de uma ferramenta BPMS.</p>
<p>Só para finalizar, BPM hoje em dia é um dos &#8220;<a href="http://thebpmexperience.wordpress.com/2006/03/17/bpm-e-soa/" style="text-decoration: underline" target="_blank">componentes&#8221; que fazem parte de uma arquitetura SOA</a> completa, o que não significa que para ter uma solução SOA eu tenha que fazer o uso do BPM, porém se usados juntos da forma correta, tornam-se uma poderosa dupla na gestão, automatização e melhoria de processos de negócios.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.marcuscavalcanti.net/blog/2009/01/18/introducao-bpm-e-bpms/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Getters e Setters?</title>
		<link>http://www.marcuscavalcanti.net/blog/2009/01/14/getters-e-setters/</link>
		<comments>http://www.marcuscavalcanti.net/blog/2009/01/14/getters-e-setters/#comments</comments>
		<pubDate>Thu, 15 Jan 2009 02:52:06 +0000</pubDate>
		<dc:creator>Marcus Cavalcanti</dc:creator>
				<category><![CDATA[Arquitetura e Padrões]]></category>
		<category><![CDATA[getter/setter]]></category>
		<category><![CDATA[OO]]></category>

		<guid isPermaLink="false">http://www.marcuscavalcanti.net/blog/?p=89</guid>
		<description><![CDATA[Logo quando comecei a programar orientado a objetos, percebi que muitas aplicações faziam o uso dos famosos pares get/set, então a primeira coisa que eu fazia ao construir uma classe, era pedir para que a IDE gerasse esses pares dos meus atributos privados antes mesmo de fazer qualquer coisa. Mas o que eu não me [...]]]></description>
			<content:encoded><![CDATA[<p>Logo quando comecei a programar orientado a objetos, percebi que muitas aplicações faziam o uso dos famosos pares get/set, então a primeira coisa que eu fazia ao construir uma classe, era pedir para que a IDE gerasse esses pares dos meus atributos privados antes mesmo de fazer qualquer coisa. Mas o que eu não me questionava, era sobre o real motivo do uso dessa dupla.</p>
<p>Hoje em dia vejo muitas aplicações que cometem esse mesmo equívoco que eu cometia há alguns anos atrás, fazem o uso do recurso (que nesse caso passaria a não ser um recurso) sem saber a razão, isso me remete até ao <a href="http://www.marcuscavalcanti.net/blog/2009/01/09/frameworks-x-desenvolvedores/" style="text-decoration: underline" target="_blank">meu primeiro post</a>.</p>
<p>Essa questão sobre o uso de getters e setters tem muito a ver como as coisas são feitas hoje em dia em relação ao desenvolvimento de software, principalmente em desenvolvimento para web, eu diria. Perdeu-se o seu principal foco, razões e objetivos e com isso surgem casos como o uso desenfreado dos getters e setters.</p>
<p>Getters e setters devem ser originalmente usados para encapsular seus atributos, evitando assim que eles sejam acessados diretamente. Dessa forma podemos aplicar determinada regra de negócio antes de atribuir valor a um atributo. Não é necessário, por exemplo, usar getters e setters em alguns objetos que serão imutáveis, ou então, apenas em objetos que servem para receber valor, nesses casos os getters e setters tornariam-se desnecessários.</p>
<p>Hoje em dia só faço o uso dessa dupla, quando realmente sinto essa necessidade, quando sei que meu atributo poderá vir a ter uma regra de negócio específica ou por algum motivo muito peculiar (ver mais abaixo), caso contrário, não uso. Em muitos casos passar os valores para o objeto utilizando o método construtor já resolveria o problema de forma simplória.</p>
<p>Deve-se considerar também, a possibilidade do seu software ser uma API aberta, usada e modificada por outros desenvolvedores, onde talvez você não tenha necessidade de um getter/setter, mas provavelmente para fornecer uma maior flexibilidade do código &#8211; considerando a possibilidade dele ser extendido &#8211; talvez seja interessante disponibilizar os tais pares. Da mesma forma que para <em>debugar</em> um código, talvez seja interessante fazer o uso de getters e setters para saber o valor que está sendo atribuído a uma variável, ao invés de espalhar milhões de breakpoint pelo código.</p>
<p><strong>Links Interessantes</strong><br />
<a href="http://blog.fragmental.com.br/2006/03/04/fowler-e-getters/" style="text-decoration: underline" target="_blank">Fowler e Getters</a><br />
<a href="http://martinfowler.com/bliki/GetterEradicator.html" style="text-decoration: underline" target="_blank">Getter Erradictor</a><br />
<a href="http://www.javaworld.com/javaworld/jw-09-2003/jw-0905-toolbox.html" style="text-decoration: underline" target="_blank">Why getter and setter methods are evil</a><br />
<a href="http://blog.caelum.com.br/2006/09/14/nao-aprender-oo-getters-e-setters/"  style="text-decoration: underline" target="_blank">Como não aprender Java e orientação a objetos</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.marcuscavalcanti.net/blog/2009/01/14/getters-e-setters/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Resolvendo o problema ao conectar o MSN no Pidgin</title>
		<link>http://www.marcuscavalcanti.net/blog/2009/01/12/resolvendo-o-problema-ao-conectar-o-msn-no-pidgin/</link>
		<comments>http://www.marcuscavalcanti.net/blog/2009/01/12/resolvendo-o-problema-ao-conectar-o-msn-no-pidgin/#comments</comments>
		<pubDate>Mon, 12 Jan 2009 14:58:49 +0000</pubDate>
		<dc:creator>Marcus Cavalcanti</dc:creator>
				<category><![CDATA[Miscelânea]]></category>
		<category><![CDATA[Ubuntu & Linux]]></category>
		<category><![CDATA[MSN]]></category>
		<category><![CDATA[Pidgin]]></category>

		<guid isPermaLink="false">http://www.marcuscavalcanti.net/blog/?p=78</guid>
		<description><![CDATA[Estava tentando conectar no MSN usando o Pidgin (Ubuntu), e do nada comecei a ter um problema &#8220;Unable to retrieve MSN Address Book&#8221;.
Dando uma fuxicada no Google, percebi que várias pessoas estavam com esse mesmo problema, inclusive usuários de Windows.
Para resolver o problema é muito simples, basta instalar o pacote &#8220;msn-pecan&#8221; com o comando:
sudo apt-get [...]]]></description>
			<content:encoded><![CDATA[<p>Estava tentando conectar no MSN usando o <a href="http://www.pidgin.im/" target="_blank" style="text-decoration: underline">Pidgin</a> (Ubuntu), e do nada comecei a ter um problema &#8220;Unable to retrieve MSN Address Book&#8221;.</p>
<p>Dando uma fuxicada no Google, <a href="https://bugs.launchpad.net/ubuntu/+source/pidgin/+bug/316252" target="_blank" style="text-decoration: underline">percebi que várias pessoas estavam com esse mesmo problema</a>, inclusive usuários de Windows.</p>
<p>Para resolver o problema é muito simples, basta instalar o pacote &#8220;msn-pecan&#8221; com o comando:<br />
<!--DEVFMTCODE--><pre class="devcodeblock" title="Text"><div class="devcodeoverflow"><ol><li>sudo apt-get install msn-pecan</li></ol></div></pre><!--END_DEVFMTCODE--></p>
<p>E depois é só mudar o protocolo da sua conta para &#8220;WML&#8221; ao invés de &#8220;MSN&#8221;.</p>
<p>Feito os dois passos acima, o problema estará resolvido.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.marcuscavalcanti.net/blog/2009/01/12/resolvendo-o-problema-ao-conectar-o-msn-no-pidgin/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>OO em vários sabores</title>
		<link>http://www.marcuscavalcanti.net/blog/2009/01/11/oo-em-varios-sabores/</link>
		<comments>http://www.marcuscavalcanti.net/blog/2009/01/11/oo-em-varios-sabores/#comments</comments>
		<pubDate>Mon, 12 Jan 2009 02:28:53 +0000</pubDate>
		<dc:creator>Marcus Cavalcanti</dc:creator>
				<category><![CDATA[Arquitetura e Padrões]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[OO]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://www.marcuscavalcanti.net/blog/?p=61</guid>
		<description><![CDATA[Provavelmente não é a primeira vez que alguém teve essa idéia, mas o Jim Weirich teve a iniciativa de criar uma página mostrando a implementação dos principais conceitos de OO em várias linguagens de programação, com suporte nativo a OO, ou não.
A idéia foi criar um problema simples e a partir disso coletar as implementações [...]]]></description>
			<content:encoded><![CDATA[<p>Provavelmente não é a primeira vez que alguém teve essa idéia, mas o <a style="text-decoration: underline" href="http://www.onestepback.org" target="_blank">Jim Weirich</a> teve a iniciativa de criar uma <a style="text-decoration: underline" href="http://onestepback.org/articles/poly/index.html" target="_blank">página</a> mostrando a implementação dos principais conceitos de OO em várias linguagens de programação, com suporte nativo a OO, ou não.</p>
<p>A idéia foi criar um problema simples e a partir disso coletar as implementações nas mais diversas linguagens, das mais loucas as mais famosas.</p>
<p>Eu dei a minha colaboração na <a style="text-decoration: underline" href="http://onestepback.org/articles/poly/oo-php5.html" target="_blank">implementação para PHP 5</a>.</p>
<p>Reparem na &#8220;facilidade&#8221; que seria <a style="text-decoration: underline" href="http://onestepback.org/articles/poly/sp-sed.html" target="_blank">resolver o problema</a> usando SED, que na verdade <a style="text-decoration: underline" href="http://aurelio.net/sed/sed-HOWTO/sed-HOWTO-2.html#toc5" target="_blank">não é considerada uma linguagem de programação</a>.</p>
<p>É a famosa discussão da melhor linguagem. Para mim não existe a melhor linguagem, cada uma tem sua finalidade e consequentemente seus pontos fortes e fracos. Nada impede que um sistema tenha várias linguagens e plataformas, não é mesmo? Aliás, felizardo são aqueles que tem essa visão e know-how de mixar tecnologias. Vide <a href="http://en.wikipedia.org/wiki/Google_platform" target="_blank" style="text-decoration: underline">Google</a>, que dentre outras usa <a href="http://groups.google.com/group/comp.lang.python/browse_thread/thread/af75a3e91a03ec18/?pli=1" target="_blank" style="text-decoration: underline">Python</a>, <a href="http://java.sun.com/developer/technicalArticles/J2SE/google/limoore.html" target="_blank" style="text-decoration: underline">Java</a> e <a href="http://google-styleguide.googlecode.com/svn/trunk/cppguide.xml" target="_blank" style="text-decoration: underline">C++</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.marcuscavalcanti.net/blog/2009/01/11/oo-em-varios-sabores/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>frameworks x desenvolvedores</title>
		<link>http://www.marcuscavalcanti.net/blog/2009/01/09/frameworks-x-desenvolvedores/</link>
		<comments>http://www.marcuscavalcanti.net/blog/2009/01/09/frameworks-x-desenvolvedores/#comments</comments>
		<pubDate>Fri, 09 Jan 2009 19:10:48 +0000</pubDate>
		<dc:creator>Marcus Cavalcanti</dc:creator>
				<category><![CDATA[Arquitetura e Padrões]]></category>
		<category><![CDATA[MVC]]></category>
		<category><![CDATA[OO]]></category>
		<category><![CDATA[Padrões]]></category>

		<guid isPermaLink="false">http://www.marcuscavalcanti.net/blog/?p=26</guid>
		<description><![CDATA[Outro dia na lista php-especialista rolou uma discussão no mínimo curiosa sobre o uso de frameworks. Uns defendiam os frameworks (eu era um desses) e outros eram radicalmente contra, na verdade uma pessoa era radicalmente contra.
Acompanhando a discussão e até participando, refleti sobre alguns pontos e percebi um detalhe que até então estava passando desapercebido [...]]]></description>
			<content:encoded><![CDATA[<p>Outro dia na lista php-especialista rolou uma <a style="text-decoration: underline" href="http://br.groups.yahoo.com/group/php-especialistas/message/18149" target="_blank">discussão</a> no mínimo curiosa sobre o uso de frameworks. Uns defendiam os frameworks (eu era um desses) e outros eram radicalmente contra, na verdade uma pessoa era radicalmente contra.</p>
<p>Acompanhando a discussão e até participando, refleti sobre alguns pontos e percebi um detalhe que até então estava passando desapercebido por mim: frameworks só deveriam ser usados por quem consegue e tem responsailidade ao usá-los.</p>
<p>A frase acima parece meio ambígua e talvez até agressiva, concordo, mas posso explicar melhor.</p>
<p>Tenho visto constantemente em fóruns de discussão, listas e etc, pessoas com dúvida sobre o framework X, só que grande parte dessas dúvidas não são em função de uma limitação do framework X e sim uma limitação do desenvolvedor. Vejo que por exemplo, com essa explosão dos frameworks WEB/MVC, que muitos desenvolvedores fazem o uso do framework X de forma famigerada ferindo todos os conceitos de MVC, conseguem simplesmente esquecer que o framework foi construído dentro desse padrão e que o ideal é que ele permaneça dessa forma. Quando digo isso, não digo isso porque o framework X deve ser imutável, na verdade a grande maioria dos frameworks oferece flexibilidade o suficiente para ser extendido e até alterado (que na maiora das vezes não é a melhor decisão), mas de forma que seja respeitado a sua arquitetura e &#8216;boas práticas&#8217; de design de uma aplicação.</p>
<p>Quase todos esses frameworks foram construídos usando <a href="http://java.sun.com/docs/books/tutorial/java/concepts/" target="_blank" style="text-decoration: underline">OO</a>, mas mesmo assim a maioria dos desenvolvedores que usam esses frameworks não conhecem os principais (básicos) conceitos de OO e com isso acabam tomando decisões que no futuro irá prejudicar o projeto como um todo e consequentemente irão ter o seu filme queimado. Em muitos casos a aplicação correta dos conceitos de OO <a style="text-decoration: underline" href="http://martinfowler.com/articles/enterprisePatterns.html" target="_blank">resolveriam de forma elegante e reutilizável aquele problema</a> que outros optam por resolver de forma <a style="text-decoration: underline" href="http://desciclo.pedia.ws/wiki/POG" target="_blank">bisonha</a>.</p>
<h3>Onde eu quero chegar com tudo isso?</h3>
<p>O que eu quero dizer é que todos deveríamos nos preocupar em entender como as coisas funcionam antes mesmo de usá-las, aprendi isso há bastante tempo atrás com um amigo meu na época em que agia da mesma forma que estou citando aqui, portanto compreendo perfeitamente algumas pessoas ainda agirem dessa forma, principalmente as mais inexperientes, por isso resolvi ter a iniciativa de escrever esse post e talvez gerar uma reflexão. Não sou o dono da verdade, não construo os melhores softwares do mundo, mas procuro sempre saber e entender o que eu estou usando e o que estou fazendo, pois com isso evito problemas para mim e para o meu projeto. E o principal é que evoluo.</p>
<h3>Dicas</h3>
<p>Antes de usar algo, procure se perguntar:</p>
<p>- O que eu preciso?</p>
<p>- Como &#8220;x&#8221; funciona?</p>
<p>- Usar &#8220;x&#8221; resolve o meu problema?</p>
<p>- &#8220;x&#8221; vai me ajudar ou atrapalhar?</p>
<p>- Quais são as outras alternativas a &#8220;x&#8221;?</p>
<p>Acredito que com respostas para as questões acima é possível ter uma resposta que satisfaça a necessidade real do problema e que principalmente nos deixe com a sensação de que o melhor possível foi feito, pelo menos pensado foi. E se mesmo assim algo der errado, como conhecemos o problema e a solução que fracassou, fica mais fácil (ou menos difícil?) de identificar e resolver.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.marcuscavalcanti.net/blog/2009/01/09/frameworks-x-desenvolvedores/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Olá, Mundo</title>
		<link>http://www.marcuscavalcanti.net/blog/2008/10/07/hello-world/</link>
		<comments>http://www.marcuscavalcanti.net/blog/2008/10/07/hello-world/#comments</comments>
		<pubDate>Tue, 07 Oct 2008 15:33:35 +0000</pubDate>
		<dc:creator>Marcus Cavalcanti</dc:creator>
				<category><![CDATA[Sem categoria]]></category>

		<guid isPermaLink="false">http://localhost/blog/?p=1</guid>
		<description><![CDATA[Acho que nada cabia melhor como o tradicional &#8220;Olá, Mundo&#8221; como título do post de estréia.
Ver um &#8220;Olá, Mundo&#8221; impresso na tela sempre foi algo que gerou alegria, satisfação e que principalmente representou uma nova etapa quando falamos especificamente sobre programação, tecnologias, etc, quem é da área sabe o que estou falando.
Há algum tempo estava [...]]]></description>
			<content:encoded><![CDATA[<p>Acho que nada cabia melhor como o tradicional &#8220;Olá, Mundo&#8221; como título do post de estréia.</p>
<p>Ver um &#8220;Olá, Mundo&#8221; impresso na tela sempre foi algo que gerou alegria, satisfação e que principalmente representou uma nova etapa quando falamos especificamente sobre programação, tecnologias, etc, quem é da área sabe o que estou falando.</p>
<p>Há algum tempo estava com a idéia de tocar um blog, seja para compartilhar conhecimento, conhecer gente, ser xingado, ser elogiado ou para quebrar a rotina, e após ter instalado o <a style="text-decoration: underline" href="http://www.wordpress.com" target="_blank">wordpress</a> há algum tempo, aproveitei o começo do ano, que é sempre um bom motivo para iniciar algo e resolvi de vez criar o primeiro post e dar forma a &#8220;criança&#8221;.</p>
<p>Acho que o principal desafio desse blog será manter um foco, mas quando digo foco, não é falar sobre um assunto MUITO específico, pretendo falar sim sobre um assunto, mas um assunto em que eu tenha uma gama de outros assuntos para dar o meu pitaco, então que assim seja.</p>
<p>É agora ou nunca!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.marcuscavalcanti.net/blog/2008/10/07/hello-world/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
