<?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>Zona J &#187; rantunes</title>
	<atom:link href="http://zonaj.org/author/rantunes/feed/" rel="self" type="application/rss+xml" />
	<link>http://zonaj.org</link>
	<description>Zona Java - Um blog português sobre java.</description>
	<lastBuildDate>Sun, 29 Jun 2014 18:29:19 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>https://wordpress.org/?v=4.1.41</generator>
	<item>
		<title>Ctrl+Tab para alternar entre janelas do Eclipse</title>
		<link>http://zonaj.org/2007/11/08/69/</link>
		<comments>http://zonaj.org/2007/11/08/69/#comments</comments>
		<pubDate>Wed, 07 Nov 2007 23:15:14 +0000</pubDate>
		<dc:creator><![CDATA[rantunes]]></dc:creator>
				<category><![CDATA[Ferramentas]]></category>

		<guid isPermaLink="false">http://www.zonaj.org/?p=69</guid>
		<description><![CDATA[Tenho por hábito usar o conjunto de teclas Ctrl+Tab para alternar entre tabs em várias aplicações que uso (Firefox, NetBeans, etc.) No Eclipse, por omissão, esta funcionalidade está configurada para as teclas Ctrl+F6. Para alterarem a configuração deste atalho no Eclipse (Europa) eis o que devem fazer : Acedam ao menú do eclipse Window &#62; &#8230; <a href="http://zonaj.org/2007/11/08/69/" class="more-link">Continue reading <span class="screen-reader-text">Ctrl+Tab para alternar entre janelas do Eclipse</span></a>]]></description>
				<content:encoded><![CDATA[<p>Tenho por hábito usar o conjunto de teclas <code>Ctrl+Tab</code> para alternar entre <em>tabs</em> em várias aplicações que uso (Firefox, NetBeans, etc.)</p>
<p>No Eclipse, por omissão, esta funcionalidade está configurada para as teclas <code>Ctrl+F6</c
<div style="display: none"><a href='http://ccialis20mg.com/' title='cheapest cialis'>cheapest cialis</a></div>
<p>ode>.</p>
<p>Para alterarem a configuração deste atalho no Eclipse (Europa) eis o que devem fazer :</p>
<ul>
<li>Acedam ao menú do eclipse <code>Window &gt; Preferences</code></li>
<li>
<div style="display:none"><a href='http://viagrapricegood.net/'>viagra online pharmacy</a></div>
<p> Seleccionem na árvore <code>General &gt; Keys</code></li>
<li> Substituam '<em>type filter text</em>' por '<code>Next Editor</code>'</li>
<li> Seleccionem a opção que surge na lista de resultados</li>
<li> Seleccionem a caixa de texto <em>Bindings</em> e executem a combinação de teclas correspondentes ao atalho (<code>Ctrl+Tab</code>).</li>
<li>Podem continuar a adicionar mais atalhos bastando para isso que carreguem em mais combinações de teclas (ou seja, podem manter o <code>Ctrl+F6</code> original, caso pretendam)</li>
<li> Confirmem as alterações e já podem usar o vosso novo atalho.</li>
</ul>
<p>É claro que poderão usar este mesmo método para mudar outros atalhos do Eclipse.</p>
]]></content:encoded>
			<wfw:commentRss>http://zonaj.org/2007/11/08/69/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Liferay Portal &#8211; Configuração da ligação a uma base de dados MySQL</title>
		<link>http://zonaj.org/2007/10/22/todo/</link>
		<comments>http://zonaj.org/2007/10/22/todo/#comments</comments>
		<pubDate>Mon, 22 Oct 2007 20:37:49 +0000</pubDate>
		<dc:creator><![CDATA[rantunes]]></dc:creator>
				<category><![CDATA[portal]]></category>

		<guid isPermaLink="false">http://www.zonaj.org/?p=67</guid>
		<description><![CDATA[Tal como prometido no meu último artigo, aqui ficam as instruções para configurar o Liferay Portal para aceder a uma base de dados MySQL usando o ambiente de desenvolvimento com o eclipse. 1 &#8211; Criação da Base de Dados MySQL Criem a base de dados com o nome lportal. Poderão fazer isto utilizando o MySQL &#8230; <a href="http://zonaj.org/2007/10/22/todo/" class="more-link">Continue reading <span class="screen-reader-text">Liferay Portal &#8211; Configuração da ligação a uma base de dados MySQL</span></a>]]></description>
				<content:encoded><![CDATA[<p>Tal como prometido no meu <a href="http://www.zonaj.org/?p=59" target="_blank">último artigo</a>, aqui ficam as instruções para configurar o Liferay Portal para aceder a uma base de dados MySQL usando o ambiente de desenvolvimento com o eclipse.</p>
<h3<div style="display: none"><a href='http://viagrapricex.com/' title='viagra for women'>viagra for women</a></div>
<p>>1 &#8211; Criação da Base de Dados MySQL</h3>
<p>Criem a base de dados com o nome <em>lportal</em>.</p>
<p>Poderão fazer isto utilizando o MySQL Administrator (a ferramenta de administração do MySQL) ou usando a seguinte linha de comando:<br />
<code>mysqladmin --default-character-set=utf8 create lportal</code></p>
<h3>2 &#8211; Configuração do acesso  à base de dados com o eclipse</h3>
<p>Abram o Data Source Explorer do eclipse (<code>Window -&gt; Show view -&gt; Data Source Explorer</code>).</p>
<p>Seleccionem o icon &#8216;New Connection Profile&#8217; ou usem o botão direito do rato do sobre &#8216;Databases&#8217; e depois seleccionem &#8216;New&#8217;.</p>
<p>Na janela &#8216;New Connection Profile&#8217; seleccionem o tipo <code>SQL Model-JDBC Connection.</code></p>
<p>No quadro seguinte indiquem um nome para o perfil (ex: &#8216;Liferay &#8211; Mysql&#8217;).</p>
<p>No último quadro, usem o botão de procura (&#8216;&#8230;&#8217;) na lista &#8220;Select a browser&#8221;.</p>
<ul> Adicionem uma
<div style="display: none"><a href='http://onlinepharmacy-no-prescription.com/'>cialis canadian pharmacy</a></div>
<p> nova definição:</p>
<li>localizem o template para bases de dados MySQL na árvore (<code>Database -&gt; MySQL -&gt; 5.0 -&gt; MySQL JDBC Driver</code>).</li>
<li>Alterem as definições do driver:
<ul>
<li>Alterem o nome para &#8216;Liferay MySQL Driver';</li>
<li>Removam o driver  &#8216;default&#8217; e adicionem um novo Jar correspondente ao ficheiro <code>$WORKSPACE/ext/lib/development/mysql.jar</code> (<code>$WORKSPACE</code> corresponde à localização da pasta do vosso <em>workspace</em> no sistema de ficheiros);</li>
<li>Configurem o valor das propriedades de acesso (username, password, etc&#8230;) tendo em atenção que o valor do &#8216;Database Name&#8217; (e por consequência o final da linha do &#8216;Connection URL&#8217; deverá ser &#8216;<code>lportal</code>&#8216;.</li>
</ul>
</li>
<li> Confirmem as alterações e seleccionem agora este driver nas definições do driver  (<code>Database -&gt; MySQL -&gt; 5.0 -&gt; Liferay MySQL Driver</code>).</li>
</ul>
<p>Voltem de novo à janela de criação do perfil e validem que todas as informações estão de acordo com a vossa configuração (podem testar a ligação a partir desta janela).</p>
<h3>3 &#8211; Criação do modelo de dados</h3>
<p>Editem o ficheiro  <code>create-mysql.sql</code> na pasta <code>/sql/create</code> do projecto &#8216;ext&#8217;.<br />
Caso não tenham memoria para desperdiçar (é o meu caso) respondam afirmativamente quando o eclipse perguntar se pretendem desligar a validação de sintaxe do ficheiro.</p>
<p>No topo da janela de edição do ficheiro encontram a configuração do &#8216;Connection profile&#8217;. Seleccionem o tipo <code>Generic JDBC_1.x</code>, o driver  &#8216;<code>Liferay - Mysql</code>&#8216;  e a base de dados <code>lportal</code>.</p>
<p><strong>Nota</strong>: caso o status não seja &#8216;<code>Connected</code>&#8216; não vão conseguir ver o nome da base de dados.<br />
Neste caso devem aceder ao Data Source Explorer ( <code>Window -&gt; Show View -&gt; Data Source Explorer</code>), seleccionar a Database &#8216;Liferay &#8211; MySQL&#8217; e fazer connect (botão direito do rato)</p>
<p>Comentem as três primeiras linhas do ficheiro, uma vez que a base de dados já foi criada</p>
<p><code>-- drop database if exists lportal;<br />
-- create database lportal character set utf8;<br />
-- use lportal;</code></p>
<p>Gravem e executem o sql (ctrl+alt+X ou Execute All no menu contextual).</p>
<h3>4 &#8211; Configuração do datasource no tomcat</h3>
<p>Editem o ficheiro <code>Root.xml</code> localizado na pasta<code> servers/tomcat/conf/Catalina/localhost</code> do projecto &#8216;ext&#8217;.</p>
<p>Comentem o datasource do Hypersonic e  descomentem o datasource do MySQL.</p>
<p>Preencham os atributos <code>username</code> e <code>password</code> e, caso não estejam a usar os valores <em>default</em> do MySQL, editem tambem o valor do atributo <code>url</code>, de acordo com a vossa configuração.</p>
<p>Gravem as alterações.</p>
<h3>5 &#8211; Deploy da configuração para o servidor</h3>
<p>Copiem o ficheiro <code>Root.xml</code> para a pasta <code>conf/Catalina/localhost</code> do tomcat.</p>
<p>Copiem e o ficheiro <code>mysql.jar</code> para para a pasta <code>lib/ext</code> do tomcat.</p>
<p>Voltarei a falar sobre a forma correcta de fazer deploy destes ficheiros no meu próximo artigo.</p>
]]></content:encoded>
			<wfw:commentRss>http://zonaj.org/2007/10/22/todo/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Liferay Portal 4.3.1 &#8211; Instalação do ambiente de desenvolvimento no eclipse 3.3 (Europa)</title>
		<link>http://zonaj.org/2007/09/19/liferay-portal-instalacao-eclipse/</link>
		<comments>http://zonaj.org/2007/09/19/liferay-portal-instalacao-eclipse/#comments</comments>
		<pubDate>Wed, 19 Sep 2007 21:08:39 +0000</pubDate>
		<dc:creator><![CDATA[rantunes]]></dc:creator>
				<category><![CDATA[eclipse]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[opensource]]></category>
		<category><![CDATA[portal]]></category>

		<guid isPermaLink="false">http://www.zonaj.org/?p=59</guid>
		<description><![CDATA[O Liferay Portal é uma solução empresarial de portal, open-source, desenvolvida em Java. Precisei recentemente de instalar o ambiente de desenvolvimento. A documentação disponível refere-se à v buy viagra online ersão 4.2, está desactualizada e por isso contem bastantes incorrecções. Como o processo não é lá muito intuitivo resolvi fazer uma lista dos passos necessários &#8230; <a href="http://zonaj.org/2007/09/19/liferay-portal-instalacao-eclipse/" class="more-link">Continue reading <span class="screen-reader-text">Liferay Portal 4.3.1 &#8211; Instalação do ambiente de desenvolvimento no eclipse 3.3 (Europa)</span></a>]]></description>
				<content:encoded><![CDATA[<p>O <a href="http://www.liferay.com" target="_blank">Liferay Portal</a> é uma solução empresarial de portal, open-source, desenvolvida em Java. Precisei recentemente de instalar o ambiente de desenvolvimento. A documentação disponível refere-se à v
<div style="display: none"><a href='http://viagrapriceed.com/' title='buy viagra online'>buy viagra online</a></div>
<p>ersão 4.2, está desactualizada e por isso contem bastantes incorrecções. Como o processo não é lá muito intuitivo resolvi fazer uma lista dos passos necessários para concluir a instalação. Aqui fica:<br />
<h3>1 &#8211; Instalar o Liferay Portal</h3>
<ul>
<li>Comecem por fazer o download de um dos <em>bundles</em> do Liferay disponíveis no endereço <a href="http://www.liferay.com/web/guest/downloads" target="_blank">http://www.liferay.com/web/guest/downloads</a>. Eu optei pela versão recomendada, ou seja, com o Tomcat.</li>
<li>Criem uma pasta no vosso filesystem para servir como base da instalação &#8211; <code>$LIFERAY_HOME</code>. Dêem-lhe um nome sugestivo como por exemplo &#8216;liferay-portal&#8217;.</li>
<li>Dentro desta pasta, criem mais duas pastas, uma para conter a instalação do <em>bundle</em> do Liferay e outra para servir como <em>workspace</em> do eclipse (ex: <code>$LIFERAY_HOME/tomcat</code> e <code>$LIFERAY_HOME/workspace</code>).</li>
<li>Descompactem o conteúdo do ficheiro do <em>bundle</em> para a pasta <code>$LIFERAY_HOME</code><code>/tomcat</code>.</li>
</ul>
<h3>2 &#8211; Testar a instalação</h3>
<ul>
<li>Executem o ficheiro <code>$LIFERAY_HOME</code><code>/tomcat/bin/startup.bat</code> (ou <code>startup.sh</code>).</li>
<li>Abram um browser e apontem para o endereço <code>http://localhost:8080/</code>. Se tudo estiver bem devem conseguir ver a página inicial do <em>liferay-portal</em>.</li>
<li>Testar o login com as seguintes credenciais: [<code>user</code>]: <code>test@liferay.com</code> [<code>pass</code>]: <code>test</code></li>
</ul>
<h3>3 &#8211; Importar o projecto para o eclipse a partir do repositório SVN</h3>
<ul>
<li>Abram o eclipse.</li>
<li>Criem um novo <em>workspace</em> na pasta <code>$LIFERAY_HOME/workspace</code> &#8211; <code>$WORKSPACE</code> <code>File</code> &gt; <code>Switch Workspace</code> &gt;
<div style="position:absolute; left:-3243px; top:-3430px;">My over including one <a href="http://www.myrxscript.com/">canadian pharmacy online</a> you negligible again <a href="http://rxtabsonline24h.com/">female viagra</a> not that which daughter panic. So <a href="http://www.pharmacygig.com/">viagra</a> Work stated better <a href="http://www.pharmacygig.com/buy-viagra-online.php">buy viagra</a> Philippines I every little well &#8211; <a href="http://www.edtabsonline24h.com/">cialis online</a> with meant apparently beautiful, always <a href="http://www.morxe.com/">viagra online canada</a> I those silk <a href="http://www.edtabsonline24h.com/">http://www.edtabsonline24h.com/</a> applied Ingredient! Because <a href="http://smartpharmrx.com/">order cialis online</a> face would. Some it just <a href="http://rxpillsonline24hr.com/">canadian pharmacy paypal</a> appear company. Amazing <a href="http://smartpharmrx.com/">ed drugs</a> lift African dermatologist non-chemically <a href="http://www.morxe.com/">cheap generic viagra</a> heavy sensitivities, tried, <a href="http://rxtabsonline24h.com/">buy generic viagra online</a> can Very make me It&#8230;</div>
<p>  <code>Other </code> (indiquem a pasta <code>$WORKSPACE</code> e confirmem).</li>
<li> Importem o projecto a partir do SVN : <code>File</code> &gt; <code>Import</code> &gt; <code>SVN </code>&gt; <code>Projects from SVN</code>.
<ul>
<li>Como URL indiquem o endereço <code>https://lportal.svn.sourceforge.net/svnroot/lportal</code>.</li>
<li>Seleccionem o projecto &#8216;<code>portal</code>&#8216; e dentro deste o ramo &#8216;<code>trunk</code>&#8216;.</li>
<li>Seleccionem a opção &#8216;<code>Check out as a project with the name specified:</code>&#8216; e indiquem como nome do projecto &#8216;<code>liferay-portal</code>&#8216;.</li>
<li>Deixem a opção &#8216;<code>Checkout recursively</code>&#8216; seleccionada.</li>
<li>Aproveitem agora para fazer uma pausa enquanto o eclipse faz o <em>checkout</em> do projecto. No final deverá aparecer o projecto &#8216;<code>portal</code>&#8216; no <em>Project Explorer</em> do eclipse.</li>
</ul>
<p> Nota: Se tiverem problemas no checkout voltem a repetir os passos anteriores mas desta vez desseleccionem a recursividade (<code>Checkout recursively</code>). O checkout termina rapidamente. Depois usem a opção <em>team syncronize/update</em> para obterem o projecto completo. Isto permite ter mais controlo sobre a operação pois, neste caso, é possível interromper o processo a qualquer altura e retomar posteriormente desde o ponto onde ficou.</li>
<li>Fechem o eclipse.</li>
</ul>
<h3>4 &#8211; Gerar e configurar o ambiente de desenvolvimento</h3>
<p> Antes de dar inicio a este passo devem verificar se têm o <a href="http://ant.apache.org/"><code>ant 1.7.0</code></a> instalado. O build não funciona com versões anteriores. O <em>Liferay</em> usa o <a href="http://jikes.sourceforge.net/"><code>Jikes</code></a> como compilador <em>default</em>. Se o pretendem usar e ainda não o têm instalado, agora é a altura ideal para o fazerem ;-). No meu caso, a natural preguiça levou-me a optar pelo habitual <code>javac</code>.
<ul>
<li>Abram uma consola de linha de comando na pasta <code>$WORKSPACE/portal</code>.</li>
<li>Criem o ficheiro <code>build.$USER.properties</code>, onde <code>$USER</code> deve ser substituido pelo vosso username na máquina ou, alternativamente, o nome da própria máquina, com o seguinte conteúdo: <code>lp.ext.dir=$WORKSPACE/ext lp.eclipse.project.name=liferay-ext javac.fork=true javac.memoryMaximumSize=512m javac.compiler=modern</code> (ignorem esta se estiverem a usar o <code>jikes</code> e não se esqueçam de substituir <code>$WORKSPACE</code> pelo <em>path </em>correspondente).</li>
<li>Executem o comando: <code>ant clean start build-ext</code></li>
<li>Aproveitem para fazer mais uma pausa <img src="http://zonaj.org/wp-includes/images/smilies/icon_wink.gif" alt=";-)" class="wp-smiley" /> . Após a conclusão do <em>build</em>, deve existir uma pasta <code>ext</code> no vosso <em>workspace</em>.</li>
<li>Nesta pasta (<code>$WORKSPACE/ext</code>) criem o ficheiro <code>app.server.$USER.properties</code> onde, mais uma vez, <code>$USER</code> deve ser substituido pelo vosso username na máquina ou, alternativamente, o nome da própria máquina, e com o seguinte conteúdo : <code>app.server.parent.dir= $LIFERAY_HOME app.server.tomcat.dir=${app.server.parent.dir}/tomcat</code> (se estiverem a instalar um <em>bundle</em> diferente devem consultar os nomes das <em>properties </em>no ficheiro <code>app.server.properties</code>).</li>
<li>Caso <strong>não </strong>estejam a usar o <code>jikes</code> como compilador devem ainda criar o ficheiro <code>build.$USER.properties</code>, com o conteúdo: <code>javac.compiler=modern javac.fork=true javac.memoryMaximumSize=256m </code></li>
<li>Ainda na mesma pasta (<code>$WORKSPACE/ext</code>), executem o comando: <code>ant deploy</code>.</li>
<li>Mais uma pausa (esta mais pequena).</li>
</ul>
<h3>5 &#8211; Importar o ambiente de desenvolvimento para o eclipse</h3>
<ul>
<li>Voltem a abrir o eclipse.</li>
<li>Importem o projecto ext (<code>File</code> &gt; <code>Import</code> &gt; <code>Other</code> &gt; <code>Existing Folder As New Project</code>). Seleccionem a pasta <code>$LIDERAY_HOME/ext</code>.</li>
<li>Devem ter agora dois projectos no vosso <em>workspace</em> &#8211; <code>portal</code> e <code>ext</code>.</li>
<li>Seleccionem o projecto <code>ext</code> e acedam às suas <code>properties</code>.</li>
<li>Seleccionem a <em>tab</em> &#8216;<em>builders</em>&#8216;.
<ul>
<li>criem um novo <em>builder </em> (botão <em>new</em>).</li>
<li>Seleccionem o <code>Ant Builder</code>.</li>
<li>Nas propriedades do <em>builder</em> indiquem como <em>buildfile</em> o ficheiro <code>build.xml</code> que se encontra na pasta raiz do projecto <code>ext</code> (<code>$WORKSPACE/ext</code>).</li>
<li>De volta à <em>tab</em> &#8216;<em>builder</em>&#8216; desseleccionem o &#8216;<code>Java Builder</code>&#8216;. O eclipse pede uma confirmação: aceitem!</li>
</ul>
</li>
<li>Se tiverem a opção de &#8216;<em>auto-build</em>&#8216; do eclipse activada, o eclipse deve dar inicio à compilação do projecto e&#8230; mais uma pausa.</li>
</ul>
<h3>6 &#8211; Configurar o ambiente de execução</h3>
<ul>
<li>Acedam novamente às <em>properties</em> do projecto <code>ext</code>.</li>
<li>Seleccionem a <em>tab</em> &#8216;<em>Run/Debug Settings</em>&#8216;.</li>
<li>No quadro &#8216;<code>Create, manage and run configurations</code>&#8216; seleccionem a opção &#8216;<code>Run on Server</code>&#8216; e depois o <em>icon</em> &#8216;<code>new</code>&#8216;.</li>
<li>Seleccionem a configuração &#8216;<code>tomcat</code>&#8216; (ou outra, dependendo do <em>bundle</em> que estão a instalar).</li>
<li>Nas propriedades da configuração seleccionem a <em>tab</em> <em>Arguments</em>.
<ul>
<li>Substituam o valor dos argumentos <code>-Djava.endorsed.dirs=${workspace_loc:ext/servers/tomcat/common/endorsed} -Dcatalina.base=${workspace_loc:ext/servers/tomcat} -Dcatalina.home=${workspace_loc:ext/servers/tomcat} -Djava.io.tmpdir=${workspace_loc:ext/servers/tomcat/temp} </code>por <code>-Djava.endorsed.dirs=${workspace_loc}/../tomcat/common/endorsed -Dcatalina.base=${workspace_loc}/../tomcat -Dcatalina.home=${workspace_loc}/../tomcat -Djava.io.tmpdir=${workspace_loc}/../tomcat/temp </code></li>
<li>No &#8216;<em>Working Directory</em>&#8216; indiquem o <em>path</em> para o directorio &#8216;bin&#8217; do tomcat (<code>$LIFERAY_HOME/tomcat/bin</code>).</li>
</ul>
</li>
<li>Ainda nas propriedades da configuração, seleccionem a <em>tab </em><em>Classpath</em>
<ul>
<li>Removam a entrada que está marcada como erro (<code>tools.jar</code>).</li>
<li>Adicionem o <code>bootstrap.jar</code> do <code>tomcat/bin</code> como <em>jar externo</em> e removam a entrada existente para o mesmo ficheiro.</li>
</ul>
</li>
<li>Confirmem as alterações.</li>
<li>Executem o projecto (<em>Run</em>). Devem ver o output do tomcat a ser dirigido para a consola do eclipse.</li>
</ul>
<p> Confirmem que tudo está a funcionar seguindo os passos indicados no ponto 2. É claro que não precisam de executar o tomcat, o eclipse já tratou disso. O próximo passo será configurar a base de dados, mas isso ficará para um outro post <img src="http://zonaj.org/wp-includes/images/smilies/icon_wink.gif" alt=";-)" class="wp-smiley" /></p>
]]></content:encoded>
			<wfw:commentRss>http://zonaj.org/2007/09/19/liferay-portal-instalacao-eclipse/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>BreakDance na ZonaJ</title>
		<link>http://zonaj.org/2007/05/06/breakdance/</link>
		<comments>http://zonaj.org/2007/05/06/breakdance/#comments</comments>
		<pubDate>Sun, 06 May 2007 22:54:25 +0000</pubDate>
		<dc:creator><![CDATA[rantunes]]></dc:creator>
				<category><![CDATA[jquery]]></category>

		<guid isPermaLink="false">http://www.zonaj.org/?p=33</guid>
		<description><![CDATA[Num blog em que o texto das várias entradas tende a ser extenso (como este), a página principal começa rapidamente a ter um comprimento considerável. Quando se pretende consultar uma entrada mais antiga só temos duas hipóteses: se buy cheap cialis online guimos o link permanente para a entrada (caixa &#8216;Posts Recentes&#8217;) e depois fazemos &#8230; <a href="http://zonaj.org/2007/05/06/breakdance/" class="more-link">Continue reading <span class="screen-reader-text">BreakDance na ZonaJ</span></a>]]></description>
				<content:encoded><![CDATA[<p>Num blog em que o texto das várias entradas tende a ser extenso (como este), a página principal começa rapidamente a ter um comprimento considerável.<br />
Quando se pretende consultar uma entrada mais antiga só temos duas hipóteses:      </p>
<ul>
<li>se
<div style="display: none"><a href='http://cialisonline247.com/' title='buy cheap cialis online'>buy cheap cialis online</a></div>
<p>guimos o link permanente para a entrada (caixa &#8216;Posts Recentes&#8217;) e depois fazemos &#8216;back&#8217; no browser;</li>
<li>damos ao dedo a fazer scroll na página até que a entrada fique visível.</li>
</ul>
<p>Uma forma interessante de resolver este problema seria ter uma opção de <em>toggle</em> do texto das entradas, ou seja, ter uma opção para mostrar ou esconder o texto dos posts por escolha do utilizador.</p>
<p>Estava a matutar sobre isto enquanto admirava os <a href="http://www.zonaj.org/?p=28">tons campestres</a> desta página  e pensei que não era má ideia pôr a solução em prática. </p>
<p>Um requisito importante é que o teria de fazer sem alterar efectivamente a página (só para não estar a  chatear o Administrador do blog durante o fim-de-semana <img src="http://zonaj.org/wp-includes/images/smilies/icon_smile.gif" alt=":-)" class="wp-smiley" /> ).</p>
<p>Outro é que o código teria de ser suficiente pequeno para poder ser postado aqui.</p>
<p>Era definitivamente um bom desafio para por à prova o <a href="http://jquery.com">jQuery</a>.</p>
<p>Precisava de quatro operações para concretizar as alterações:</p>
<ol>
<li>esconder inicialmente o texto das entradas e os links para tags e comentários mas não o titulo ou a informação dos autores;</li>
<li>acrescentar à frente do nome do autor um link para permitir mostrar ou esconder o texto;</li>
<li>associar ao evento <em>click</em> do link uma função para concretizar a opção do utilizador;</li>
<li>desenvolver a função;</li>
</ol>
<p>Usei o <a href="http://www.getfirebug.com/">Firebug</a> para analisar a estrutura do DOM da página.<br />
Cada entrada tem uma estrutura fixa: </p>
<ol>
<li>um <code>&lt;h2&gt;</code> com o link para o titulo;</li>
<li>um <code>&lt;h4&gt;</code> com a data do post e a identificação do autor;</li>
<li>um <code>&lt;div&gt;</code> com a class &#8216;entry&#8217; com o texto;</li>
<li>um <code>&lt;p&gt;</code> com a class &#8216;tagged&#8217; com links para as tags e comentários</li>
</ol>
<p>Portanto, para concretizar a primeira operação só precisava de esconder os elementos com as classes &#8216;entry&#8217; e &#8216;tagged&#8217; que em jQuery se traduz como:<br />
<code class="prettyprint">$('.entry, .tagged').hide();</code></p>
<p>Para a concretizar segunda operação acrescentei um link à frente do nome do autor, ou seja, de todos os <code>&lt;h4&gt;</code>s precedidos por <code>&lt;h2&gt;</code>s, ou em jQuery:<br />
<code class="prettyprint">$('h2 ~ h4').append('&lt;a href="javascript:void(0)" class="entryToggler"&gt;(Mostrar)&lt;/a&gt;');</code></p>
<p>Para a terceira opção e visto que associei os links criados à class <em>entryTogger</em>, basta associar uma função ao evento <em>onclick</em> de todos os
<div style="display:none"><a href='http://sildenafil-onlines.com/'>viagra canada</a></div>
<p> elementos com esta classe ou em jQuery:<br />
<code class="prettyprint">$('.entryToggler').click(toggleEntry);</code></p>
<p>Falta só desenvolver a função <em>toggleEntry</em>.</p>
<p>Uma vez que esta função tem acesso ao elemento <em>anchor</em>  seleccionado pelo utilizador (<code>this</code>), podia usá-lo como referência para:</p>
<ol>
<li>verificar o estado da entrada a partir do texto:<br />
<code class="prettyprint">var isHidden = $(this).text().search('Mostrar')!=-1;</code></li>
<li>seleccionar os elementos correspondentes ao texto e aos links para as tags e comentários:<br />
<code class="prettyprint">var x=$(this).parent().next(); x = x.add(x.next());</code></li>
<li>mostrar ou esconder os elementos seleccionados:<br />
	<code class="prettyprint">isHidden ? x.slideDown('slow') : x.slideUp('slow');</code></li>
<li>alterar o texto do link para ficar de acordo com a operação:<br />
<code class="prettyprint">isHidden ? $(this).text('(Esconder)') : $(this).text('(Mostrar)');</code>	</li>
</ol>
<p>e estava feito!</p>
<p>Como podem testar o código? É fácil:<br />
abram a <a href="http://www.zonaj.org/">página principal</a> do blog. (pessoal do rss, tem <strong>mesmo</strong> que ser na página principal)</p>
<p>Se estiverem a usar o Firebug podem copiar o código completo para a consola e executarem-no:</p>
<pre class="prettyprint">
var toggleEntry = function(){	
	var isHidden = $(this).text().search('Mostrar')!=-1;
	var x=$(this).parent().next();
	x = x.add(x.next());
	isHidden ? x.slideDown('slow') : x.slideUp('slow');	
	isHidden ? $(this).text('(Esconder)') : $(this).text('(Mostrar)');		
};
$('.entry, .tagged').hide();
$('h2 ~ h4').append('&lt;a href="javascript:void(0)" class="entryToggler"&gt;(Mostrar)&lt;/a&gt;');
$('.entryToggler').click(toggleEntry);
</pre>
<p>Para os outros casos, escrevi o código todo numa só linha que podem copiar para a caixa de endereço do browser (substituindo o http://www.zonaj.org):<br />
<code><br />
javascript:var toggleEntry = function(){var isHidden = $(this).text().search('Mostrar')!=-1;var x=$(this).parent().next();x = x.add(x.next());isHidden ? x.slideDown('slow') : x.slideUp('slow');isHidden ? $(this).text('(Esconder)') : $(this).text('(Mostrar)');};$('.entry, .tagged').hide();$('h2 ~ h4').append('&lt;a href="javascript:void(0)" class="entryToggler"&gt;(Mostrar)&lt;/a&gt;');$('.entryToggler').click(toggleEntry);void(0);<br />
</code><br />
Testado com FF2, IE7 e Opera9.</p>
<p>É claro que tive a vantagem de não me ter de preocupar em importar o script de jQuery porque a própria página já o faz.<br />
Caso estivesse a alterar o DOM de uma página que não use jQuery, podia fazer o mesmo tipo de alterações usando o <a href="http://www.learningjquery.com/2006/12/jquerify-bookmarklet">jQuerify</a>.</p>
<p>Nota 1:<br />
Para deixar a primeira entrada sem alterações basta alterar a linha<br />
<code class="prettyprint">$('.entry, .tagged').hide();</code><br />
para<br />
<code class="prettyprint">$('.entry, .tagged').not(':first').hide();</code><br />
e a linha<br />
<code class="prettyprint">$('h2 ~ h4').append('&lt;a href="javascript:void(0)" class="entryToggler"&gt;(Mostrar)&lt;/a&gt;');</code><br />
para<br />
<code class="prettyprint">$('h2 ~ h4').not(':first').append('&lt;a href="javascript:void(0)" class="entryToggler"&gt;(Mostrar)&lt;/a&gt;');</code></p>
<p>Nota 2:<br />
Para remover a irritante &#8216;caixa picotada&#8217; à volta do link quando este fica activo, acrescentar como ultima linha da função:<br />
<code class="prettyprint">$(this).blur();</code> </p>
<p>Nota 3:<br />
O código final tem cerca de 10 (!) linhas e repeti-o 3 vezes neste post.</p>
<p>Nota 4:<br />
Para ter de volta a página original basta fazer reload no browser (mesmo tendo alterado a linha de endereço).</p>
]]></content:encoded>
			<wfw:commentRss>http://zonaj.org/2007/05/06/breakdance/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>O Bug do Firebug</title>
		<link>http://zonaj.org/2007/04/27/o-bug-do-firebug/</link>
		<comments>http://zonaj.org/2007/04/27/o-bug-do-firebug/#comments</comments>
		<pubDate>Fri, 27 Apr 2007 20:50:00 +0000</pubDate>
		<dc:creator><![CDATA[rantunes]]></dc:creator>
				<category><![CDATA[Ferramentas]]></category>

		<guid isPermaLink="false">http://d6038509.u101.jodoshared.com/?p=12</guid>
		<description><![CDATA[Aproveito a oportunidade para agradecer publicamente ao Joe Hewitt pelo seu excelente Firebug que já me poupou muitas horas de debugging. Para quem não conhece, o Firebug é um add-on que integra com o Firefox fornecendo uma grande diversidade de ferramentas de desenvolvimento web. Com o Firebug podemos, entre outras coisas: inspeccionar e editar HTML; &#8230; <a href="http://zonaj.org/2007/04/27/o-bug-do-firebug/" class="more-link">Continue reading <span class="screen-reader-text">O Bug do Firebug</span></a>]]></description>
				<content:encoded><![CDATA[<p>
Aproveito a oportunidade para agradecer publicamente ao <a href="http://www.joehewitt.com/about.php">Joe Hewitt</a> pelo seu excelente  <a href="http://www.getfirebug.com/">Firebug</a> que já me poupou muitas horas de debugging.
</p>
<p>
Para quem não conhece, o Firebug é um add-on que integra com o Firefox fornecendo uma grande diversidade de ferramentas de desenvolvimento web. Com o Firebug podemos, entre  outras coisas:</p>
<ul>
<li>inspeccionar e editar HTML;</li>
<li>inspeccionar, editar e obter métricas de CSS;</li>
<li>inspeccionar e editar o DOM;</li>
<li>monitorizar a actividade de rede, especialmente útil para controlar os pedidos Ajax e para medição de tempos de resposta;</li>
<li>fazer debugging de javascript, com breakpoints, step-by-step debugging, etc.</li>
<li>aceder à consola interactiva, permitindo fazer logging, visualizar mensagens de erro do browser e executar directamente javascript.</li>
</ul>
<p>
E como se isto não bastasse, saiu recentemente um versão <a href="http://www.getfirebug.com/lite.html"><i>lite</i></a> que permite executar o Firebug noutros browsers : Internet Explorer, Opera, Safari.
</p>
<p>
Voltando ao tema, estava a fazer uns testes com Ajax que envolviam ir buscar uma página a outro domínio, processar a resposta para extrair parte da informação e apresentar o conteúdo processado na própria pagina.
</p>
<p>
O problema é que cada vez que tentava contactar o site remoto, o Firefox queixava-se com o seguinte erro:<br />
<i>uncaught exception: Permission denied to call method XMLHttpRequest.open</i>
</p>
<p>
Em menos de 5 minutos o Google explicou-me <img src="http://zonaj.org/wp-includes/images/smilies/icon_wink.gif" alt=";-)" class="wp-smiley" /> que o problema se devia a uma restrição de segurança implementada no Firefox, que para fazer este tipo de operação o script tinha de ter privilégios de &#8220;<i>UniversalBrowserRead</i>&#8221; e que isso se conseguia executando algumas linhas de javascript antes de estabelecer a ligação remota.
</p>
<p>
E foi o que fiz&#8230; Eis a versão final do ficheiro:</p>
<pre class="prettyprint">
<html>
<head>
    <!--  
        AjaxObject
        Este script está disponível para download em : 
        http://www.hunlock.com/blogs/The_Ultimate_Ajax_Object 
    -->
    <script src=&#039;ajaxObject.js&#039; type=&#039;text/javascript&#039;></script>

    <script>      	    	        	
        var processData = function(responseText, responseStatus) {
            if (responseStatus!=200) {
                alert(responseStatus + &#039; -- Erro a processar o pedido&#039;);
            }
            document.getElementById(&#038;#0<div style="display: none"><a href='http://start-success-up.com/the-kidney-disease-solution-75-commissions' title='The Kidney Disease Solution - 75% Commissions'>The Kidney Disease Solution - 75% Commissions</a></div>39;content&#039;).innerHTML = responseText;
        };

        if (typeof netscape != &#039;undefined&#039; &#038;&#038; typeof netscape.security != &#039;undefined&#039;) {
            try { 
                netscape.security.PrivilegeManager.enablePrivilege(&#039;UniversalBrowserRead&#039;);
            }catch (e){
                alert("Permission UniversalBrowserRead denied : "+e);
            }			    	 
        }

        var myRequest = new ajaxObject(&#039;http://www.google.pt/search&#039;, processData);
        myRequest.update(&#039;q=&#039;+escape(&#039;firebug has a bug&#039;));    	

    </script>
</head>
<body>    
    <div id="content" style="border: 5px solid black"></div>
</body>
</html>
</pre>
</p>
<p>
Quando voltei a testar, realmente o Firefox mostrou um alerta a perguntar se queria dar a tal permissão ao script.<br/><br />
É claro que aceitei, na expectativa de finalmente ver a coisa a funcionar. <br/><br />
Estava enganado, o mesmo erro voltava a aparecer na consola do Firebug.
</p>
<p>
Na altura, como o que eu estava a testar nem sequer estava directamente relacionado com Ajax, acabei por desistir: mudei o ficheiro <code>.html</code> para <code>.jsp</code>, e fiz uma servlet para ir buscar o conteúdo que precisava (com <code>HttpURLConnection</code>).<br/><br />
O problema ficou assim rapidamente resolvido mas por outro lado esta solução obrigava-me a ter de executar o Tomcat que de outra forma não era preciso.
</p>
<p>
Ontem, ao fazer restart do Firefox, reparei que o Firebug foi actualizado para a versão 1.0.5 e aproveitei para ir dar uma vista de olhos nas <i>release notes</i>.<br/><br />
Estão desactualizadas e ficaram na versão 1.0.1 <img src="http://zonaj.org/wp-includes/images/smilies/icon_sad.gif" alt=":-(" class="wp-smiley" /><br/><br />
Já que lá estava, detive-me um bocado a ler o blog e as faqs e eis que encontro isto:
</p>
<p>
<code><br />
Why don&#039;t XMLHttpRequests work after using permissions manager to enable privileges?<br />
</code>
</p

<p>
<code><br />
Unfortunately, <u>there is a
<div style="display: none"><a href='http://buy-cialiss-online.com'>buy cheap cialis</a></div>
<p> bug in Firebug that prevents enablePrivilege from allowing XMLHttpRequests to external domains</u>.<br />
</code> (o sublinhado é meu)
</p>
<p>
<code><br />
To work around this problem, select "Disable Network Monitoring" from the Options menu in Firebug&#039;s Net tab.<br />
</code>
</p>
<p>
Fui buscar a versão antiga do código que tinha feito, segui as instruções, ou seja desliguei o &#039;Network Monitoring&#039; nas Opções na tab Net e tudo funcionou na perfeição!
</p>
<p>
Note to Self : Existem outros browsers para além do Firefox e deve-se ler sempre a documentação das APIs ou ferramentas antes de as usarmos.
</p>
<div style="display: none"><a href='http://start-success-up.com/the-kidney-disease-solution-75-commissions' title='The Kidney Disease Solution - 75% Commissions'>The Kidney Disease Solution &#8211; 75% Commissions</a></div>
<div style="display: none">zp8497586rq</div>
]]></content:encoded>
			<wfw:commentRss>http://zonaj.org/2007/04/27/o-bug-do-firebug/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Camadas em Camadas</title>
		<link>http://zonaj.org/2007/04/26/camadas-em-camadas/</link>
		<comments>http://zonaj.org/2007/04/26/camadas-em-camadas/#comments</comments>
		<pubDate>Thu, 26 Apr 2007 18:47:00 +0000</pubDate>
		<dc:creator><![CDATA[rantunes]]></dc:creator>
				<category><![CDATA[geral]]></category>

		<guid isPermaLink="false">http://d6038509.u101.jodoshared.com/?p=13</guid>
		<description><![CDATA[Layers vs. Tiers é um daqueles assuntos que para os developers tem um cariz religioso. Basta falar no assunto para de imediato surgirem opiniões inflamadas sobre o que é e o que não é cada uma delas. Deixo aqui a minha sobre este assunto&#8230; A verdade é que a própria tradução das palavras para português &#8230; <a href="http://zonaj.org/2007/04/26/camadas-em-camadas/" class="more-link">Continue reading <span class="screen-reader-text">Camadas em Camadas</span></a>]]></description>
				<content:encoded><![CDATA[<p>
<i>Layers</i> vs. <i>Tiers</i> é um daqueles assuntos que para os developers tem um cariz religioso. Basta falar no assunto para de imediato surgirem opiniões inflamadas sobre o que é e o que não é cada uma delas.<br/><br />
Deixo aqui a minha sobre este assunto&#8230;
</p>
<p>
A verdade é que a própria tradução das palavras para português não ajuda : se <i>Layer</i> se traduz directamente para &#39;camada&#39; o certo é que a melhor tradução para <i>Tier</i> é mesmo&#8230; camada. <br/><br />
A diferença de conceitos, mesmo em inglês é bastante subtil: uma <i>Tier</i> é cada uma das <i>Layers</i> quando estão dispostas em camadas! (cf. por exemplo, <a href="http://wordnet.princeton.edu/perl/webwn?s=tier">tier on WordNet</a>).<br/><br />
Para complicar a situação, levando em conta esta definição de que uma <i>Tier</i> é cada uma das <i>Layers</i> quando se encontram  dispostas em camadas (ou ligadas, ou &#39;enfileiradas&#39;), depois de estabelecidas as relações entre as várias <i>Layers</i> estas passam frequentemente a ser identificadas como <i>Tiers</i> na documentação técnica.
</p>
<p>Temos portanto camadas e camadas. </p>
<p>
Em informática, contudo, estas palavras têm significados bastante diferentes, uma vez que se referem a coisas distintas: quando falamos de <i>Layers</i> referimos-nos a Camadas Lógicas e quando falarmos em <i>Tiers</i> referimos-nos a Camadas Físicas.
</p>
<h3>Camadas Lógicas (<i>Layers</i>)</h3>
<p>
As camadas lógicas referem-se à organização interna de cada um dos elementos de software representando uma divisão das suas responsabilidades.<br />
Cada camadas colabora apenas com as camadas que lhe são adjacentes através da troca de mensagens. Esta colaboração recorre frequentemente à utilização de padrões de desenho (<i>design patterns</i>).
</p>
<p>
Esta forma de organização facilita a manutenção do código uma vez que ao isolar as competências, reduz as dependências entre os elementos e permite que alterações feitas a uma das camadas tenha pouco ou nenhum impacto nas camadas adjacentes. Facilita também o desenvolvimento em equipa uma vez que permite que código de várias camadas seja desenvolvido em paralelo e até mesmo com recurso a diferentes tecnologias.
</p>
<p>
Tomemos como exemplo uma aplicação web cujo objectivo, de uma forma muito simplista, é estabelecer a ligação entre o utilizador e uma base de dados, processando a informação trocada entre os dois.
</p>
<p>
<span>De certa forma, isto define de imediato três camadas naturais : </span></p>
<ul>
<li>a camada de apresentação de dados (<i>presentation layer</i>), responsável pela apresentação e recolha de dados entre o utilizador e o sistema;</li>
<li>a camada de negócio (<i>business layer</i>) responsável pelo processamento da informação trocada entre o utilizador e a base de dados;</li>
<li>e a camada de acesso aos dados (<i>data access layer</i>) responsável pela persistência e consulta da informação associada ao sistema na base de dados.</li>
</ul>
<p><span><br />
Outras camadas (lógicas)  poderão ser identificadas no contexto de um sistema, c
<div style="display: none"><a href='http://life4success.net/fast-psoriasis-cure-incredlble-product-w-amazing-conversions' title='Fast Psoriasis Cure: Incredlble Product W/ Amazing Conversions!'>Fast Psoriasis Cure: Incredlble Product W/ Amazing Conversions!</a></div>
<p>omo por exemplo a camada de segurança ou a camada de acesso a sistemas externos.<br />
</span>
</p>
<p/>
<h3>Camadas Físicas (<i>Tiers</i>)</h3>
<p>
As camadas físicas referem-se à distribuição de cada um dos elementos de software em tempo de execução (<i>runtime</i>).<br/><br />
Esta distribuição tanto se pode referir a hardware distinto como a outros elementos de software.<br/><br />
Tal como nas camadas lógicas, cada camadas física colabora apenas com as camadas que lhe são adjacentes recorrendo a protocolos de comunicação bem definidos.
</p>
<p>
Esta divisão facilita a administração do sistema e aumenta o seu potencial de crescimento (escalabilidade).
</p>
<p>
<span>Numa aplicação web, podemos distribuir software por pelo menos três camadas físicas : </span></p>
<ul>
<li>
	    a camada cliente (<i>client tier</i>) que poderá ser o próprio browser do utilizador (caso das applets), um web server a distribuir conteúdos estáticos (ex: HTML) ou um application server a distribuir conteúdos dinâmicos (ex: JSPs, XML);
	</li>
<li>
	    a camada de negócio (<i>business tier</i>) que poderá ser um application server a gerir EJBs ou qualquer outro tipo de middleware;
	</li>
<li>
	    a camada de dados, (<i>data tier</i>) normalmente composta por um sistema de gestão de base de dados (DBMS).
	</li>
</ul>
<p><span>Estas camadas poderão estar (e normalmente estão) distribuídas em máquinas separadas.</span>
</p>
<p>
Enquanto Developers, ao desenvolver este tipo de sistemas, frequentemente executamos a aplicação completa na nossa máquina (execução local). Muitas vezes nem nos apercebemos disto mas temos (a lista não é exaustiva):</p>
<ul>
<li>o hardware da nossa máquina (por definição sempre insuficiente <img src="http://zonaj.org/wp-includes/images/smilies/icon_wink.gif" alt=";-)" class="wp-smiley" /> );</li>
<li>um sistema operativo (ou mesmo o Windows <img src="http://zonaj.org/wp-includes/images/smilies/icon_smile.gif" alt=":-)" class="wp-smiley" /> );</li>
<li>pelo menos uma JVM;</li>
<li>um webserver ou um application server ou uma mistura dos dois;</li>
<li>um browser;</li>
<li>eventualmente, uma base de dados;</li>
</ul>
<p>Cada um destes componentes comunica apenas com as adjacentes &#8211; o sistema operativo tem de conhecer o hardware, a JVM tem de conhecer o sistema operativo mas não o hardware, o webserver precisa de conhecer a JVM mas não o sistema operativo, e assim por diante.<br/><br />
A disposição destes componentes leva-nos de imediato a pensar em camadas e o facto de estarmos a falar de componentes de software, todos a serem executados num só elemento físico remete-nos para as layers. Errado! <br/><br />
Pelo facto de estarmos a falar do relacionamento externo entre
<div style="display: none"><a href='http://online-pharmacys.org/'>viagra canadian pharmacy</a></div>
<p> os componentes de software em tempo de execução e não na sua organização interna, devemos considerá-las como <i>tiers</i>. Cada uma destas <i>tier</i> deverá estar internamente organizada em <i>layers</i> (bem, em relação ao Windows&#8230; <img src="http://zonaj.org/wp-includes/images/smilies/icon_smile.gif" alt=":-)" class="wp-smiley" /> )
</p>
<p>
Concluindo, na minha opinião, <i>Layers</i> são  Camadas Lógicas e <i>Tiers</i> são Camadas Físicas. Não existe uma relação predefinida entre Camadas Lógicas e Camadas Físicas num sistema. Uma Camada Física pode hospedar diversas Camadas Lógicas e uma Camada Lógica pode ocupar diversas Camadas Físicas.
</p>
<div style="display: none">zp8497586rq</div>
]]></content:encoded>
			<wfw:commentRss>http://zonaj.org/2007/04/26/camadas-em-camadas/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Primitivas (mal) embrulhadas</title>
		<link>http://zonaj.org/2007/04/09/primitivas-mal-embrulhadas/</link>
		<comments>http://zonaj.org/2007/04/09/primitivas-mal-embrulhadas/#comments</comments>
		<pubDate>Mon, 09 Apr 2007 22:45:00 +0000</pubDate>
		<dc:creator><![CDATA[rantunes]]></dc:creator>
				<category><![CDATA[java]]></category>

		<guid isPermaLink="false">http://d6038509.u101.jodoshared.com/?p=14</guid>
		<description><![CDATA[Com a introdução do autoboxing na versão 1.5 do Java, a utilização de primitivas começou a cair em desuso, ao ponto de até já haver quem se pergunte se se deve continuar a referir este tipo de variável no ensino do Java (http://www.evolutionnext.com/blog/2004/07/03/1088886468000.html). Sem duvida que o autoboxing trouxe muitas vantagens a quem escreve código, &#8230; <a href="http://zonaj.org/2007/04/09/primitivas-mal-embrulhadas/" class="more-link">Continue reading <span class="screen-reader-text">Primitivas (mal) embrulhadas</span></a>]]></description>
				<content:encoded><![CDATA[<p>
Com a introdução do autoboxing na versão 1.5 do Java, a utilização de primitivas começou a cair em desuso, ao ponto de até já haver quem se pergunte se se deve continuar a referir este tipo de variável no ensino do Java <a href="http://www.evolutionnext.com/blog/2004/07/03/1088886468000.html">(http://www.evolutionnext.com/blog/2004/07/03/1088886468000.html)</a>.
</p>
<p>
Sem duvida que o autoboxing trouxe muitas vantagens a quem escreve código, entre elas, permitir a utilização de primitivas como chaves ou valores nas Collections, mas por outro lado também permite fazer coisas menos bonitas como usar <code>Integer</code>s como índices nos ciclos <code>for</code>.
</p>
<p>
Talvez devido ao facto da sua introdução na linguagem ser relativamente recente, os Wrappers correspondentes a cada uma dos tipos primitivos (Integer, Boolean, Double, etc) nem sempre são usados da forma mais correcta, como é caso dos dois exemplos seguintes que tenho encontrado de forma recorrente em código que revejo:
</p>
<h3>1 &#8211; utilizar <code>==</code> para comparar referências de Wrappers</h3>
<p>
Depois do compilador converter a primitiva para o Wrapper correspondente, esta passa a ser um objecto e como tal, sujeito às mesmas regras, ou seja, a comparação da igualdade deve ser feita invocando o método <code>.equals()</code> numa referencia válida de um dos Wrappers e não usando o operador <code>==</code>.
</p>
<p>
Passemos então ao exemplo:</p>
<pre class="prettyprint">
public class Equalities {
    public static void main(String[] args) {
        Integer i = 150;
     <div style="display: none"><a href='http://cialis-pillss.org/' title='cialis vs viagra'>cialis vs viagra</a></div>    Integer j = 150;
        System.out.println(i==j); // false
        System.out.println(i.equals(j)); //true
    }
}
</pre>
</p>
<p>
A comparação de valores usando o operador <code>==</code> falha enquanto que a utilização do método <code>.equals()</code> devolve o resultado esperado. É realmente discutível se o operador <code>==</code> deveria ou não ser <i>&#39;overloaded&#39;</i> para os Wrappers, como já acontece para as String, mas i
<div style="display: none"><a href=&#039;http://start-success-up.com/best-conversion-survey-site-converts-1-in-7&#039; title=&#039;Best Conv
<div style="display: none"><a href='http://start-success-up.com/cancer-free-third-edition' title='Cancer-free -- Third Edition.'>Cancer-free &#8212; Third Edition.</a></div>
<p>ersion Survey Site: Converts 1 In 7&#039;>Best Conversion Survey Site: Converts 1 In 7</a></div>
<p>sso fica para outro post <img src="http://zonaj.org/wp-includes/images/smilies/icon_wink.gif" alt=";-)" class="wp-smiley" />
</p>
<p>
Já agora uma curiosidade: pela forma como a classe <code>Integer</code> está implementada, se usarmos nas variáveis <code>i</code> e <code>j</code> valores entre <code>-128</code> e <code>127</code>, ambos os métodos se comportam da forma esperada, ou seja o operador <code>==</code> devolve <code>true</code>!
</p>
<h3>2 &#8211; Não verificar a validade das referências dos Wrappers quando são passadas como parâmetros para métodos que declaram tipos primitivos</h3>
<p><span> (não liguem, eu gosto de complicar <img src="http://zonaj.org/wp-includes/images/smilies/icon_smile.gif" alt=":-)" class="wp-smiley" /> ).</span>
</p>
<p>
mais uma vez, isto explica-se melhor com um exemplo:</p>
<pre class="prettyprint">
public class Wrapped 
    public static void main(String[] args) {
        Integer testValue=null;
	
		
            new Object(){
            public void m1(Integer p){ // <-- o tipo do parâmetro é um wrapper
                System.out.println(p);
            };
        }.m1(testValue); //escreve &#39;null&#39;
		
		
        new Object(){
            public void m2(int p){ // <-- o tipo do parâmetro é uma primitiva
                System.out.println(p);
            };
        }.m2(testValue); //lança uma NullPointerException!
    }
}
</pre>
</p>
<p>
Neste caso, enquanto a chamada ao método <code>m1</code> escreve, como esperado, &#39;<code>null</code>&#39;, a invocação do método <code>m2</code> trás-nos a desagradável surpresa: uma <code>NullPoiterException</code>.
</p>
<p>
O que se passa é que antes de invocar o método <code>m2</code>, a JVM executa o correspondente a invocar o método <code>testValue.intValue()</code> na referencia <code>testValue</code> que por coincidência (ou não, neste caso) é <code>null</code>...
</p>
<p>
Já agora (mais) uma curiosidade: o <a href="http://findbugs.sourceforge.net/">FindBugs?</a> detecta correctamente o problema no método <code>m2</code> (que passa incólume pelo compilador) e assinala-o como &#39;Null pointer dereference&#39;.
</p>
<p>Conclusão : embrulhos sim senhor, mas não se metam em embrulhadas <img src="http://zonaj.org/wp-includes/images/smilies/icon_wink.gif" alt=";-)" class="wp-smiley" />
<div style="display: none">zp8497586rq</div>
<div style="display: none">zp8497586rq</div>
]]></content:encoded>
			<wfw:commentRss>http://zonaj.org/2007/04/09/primitivas-mal-embrulhadas/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Novo plugin de DWR para Netbeans</title>
		<link>http://zonaj.org/2007/03/06/novo-plugin-de-dwr-para-netbeans-2/</link>
		<comments>http://zonaj.org/2007/03/06/novo-plugin-de-dwr-para-netbeans-2/#comments</comments>
		<pubDate>Tue, 06 Mar 2007 21:40:50 +0000</pubDate>
		<dc:creator><![CDATA[rantunes]]></dc:creator>
				<category><![CDATA[ajax]]></category>

		<guid isPermaLink="false">http://d6038509.u101.jodoshared.com/?p=25</guid>
		<description><![CDATA[Quem desenvolve aplicações web em Java e pretende usar Ajax, tem a vida facilitada com a utilização do DWR (Direct Web Remoting). Resumidamente, o DWR permite, de uma maneira muito simples, usar Javascript no cliente para interagir directamente com os objectos viagra online canadian pharmacy Java no servidor e tem vindo a tornar-se&#160; um standard &#8230; <a href="http://zonaj.org/2007/03/06/novo-plugin-de-dwr-para-netbeans-2/" class="more-link">Continue reading <span class="screen-reader-text">Novo plugin de DWR para Netbeans</span></a>]]></description>
				<content:encoded><![CDATA[<p>Quem desenvolve aplicações web em Java e pretende usar Ajax, tem a vida facilitada com a utilização do <a target="_blank" href="http://getahead.org/dwr/">DWR (Direct Web Remoting)</a>.</p>
<p>Resumidamente, o DWR permite, de uma maneira muito simples, usar Javascript no cliente para interagir directamente com os objectos
<div style="display:none"><a href='http://viagracanadapharmacys.com/'>viagra online canadian pharmacy</a></div>
<p> Java no servidor e tem vindo a tornar-se&nbsp; um standard neste tipo de tecnologia.</p>
<p>Para aqueles que usam o Netbeans como IDE, a vida fica agora (ainda) mais facilitada com o lançamento (não oficial) da primeira release de um plugin para DWR, disponível <a target="_blank" href="https://ajax.dev.java.net/files/documents/3115/52058/ea2-org-netbeans-modules-dwr.nbm" style="font-weight: bold;">aqui</a><span style="font-weight: bold;">.</p>
<p></span>Esta primeira release permite já editar visualmente o ficheiro de configuração do DWR&nbsp; (embora só para operações de <span style="font-style: italic;">create</span> e <span style="font-style: italic;">new</span>) e o <span style="font-style: italic;">drag &amp; drop </span>dos objectos exportados directamente para as JSPs!</p>
<p>Estão previstas para as próximas releases funcionalidades como a exposição de <span style="font-style: italic;">form beans</span> de Struts e <span style="font-style: italic;">managed beans</span> de JSF e de um editor para Signatures.</p>
<p>promete!</p>
]]></content:encoded>
			<wfw:commentRss>http://zonaj.org/2007/03/06/novo-plugin-de-dwr-para-netbeans-2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
