<?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>André L. S. &#187; Tutoriais</title>
	<atom:link href="http://www.andrels.com/wp-pt_BR/index.php/category/tutoriais/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.andrels.com/wp-pt_BR</link>
	<description>Desenvolvimento de Softwares, Tecnologia e Games</description>
	<lastBuildDate>Wed, 08 Feb 2012 12:37:50 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Compilando objetos inválidos do Oracle de maneira fácil</title>
		<link>http://www.andrels.com/wp-pt_BR/index.php/2012/01/compilando-objetos-invalidos-do-oracle-de-maneira-facil/#utm_source=feed&#038;utm_medium=feed&#038;utm_campaign=feed</link>
		<comments>http://www.andrels.com/wp-pt_BR/index.php/2012/01/compilando-objetos-invalidos-do-oracle-de-maneira-facil/#comments</comments>
		<pubDate>Mon, 02 Jan 2012 21:39:46 +0000</pubDate>
		<dc:creator>André</dc:creator>
				<category><![CDATA[Dicas rápidas]]></category>
		<category><![CDATA[Oracle]]></category>
		<category><![CDATA[Tutoriais]]></category>
		<category><![CDATA[plsql]]></category>

		<guid isPermaLink="false">http://www.andrels.com/wp-pt_BR/?p=454</guid>
		<description><![CDATA[Quando se compila um objeto que é referenciado por vários outros objetos, estes ficam inválidos até que sejam recompilados novamente,<a href="http://www.andrels.com/wp-pt_BR/index.php/2012/01/compilando-objetos-invalidos-do-oracle-de-maneira-facil/" class="searchmore">Read the Rest...</a><div class="clr"></div>]]></description>
			<content:encoded><![CDATA[<p>Quando se compila um objeto que é referenciado por vários outros objetos, estes ficam inválidos até que sejam recompilados novamente, coisa que o Oracle deveria fazer e, de alguma maneira, as vezes não faz.</p>
<p>Então aqui vai uma dica para quem tem de compilar várias <em>packages</em>, <em>procedures</em> e/ou <em>functions</em> inválidas diariamente devido à esta falha do Oracle.</p>
<p>Existe um comando que força o banco a compilar todos os objetos inválidos sob um determinado usuário, o comando é:</p>
<pre class="brush:sql">exec dbms_ultility.compile_schema(&lt;USUARIO&gt;);</pre>
<p>Substitua por <i>user</i> onde está &lt;USUARIO&gt; se os objetos estiverem sob o usuário que está conectado, ou pelo nome de usuário correspondente.</p>
<p>O comando demora um pouco para ser executado e não compila todos os objetos que estão inválidos por erro de codificação, para descobrir quais objetos estão inválidos, você pode executar a seguinte <em>query</em>:</p>
<pre class="brush:sql">
select object_name
from all_objects
where status = 'INVALID'
</pre>
<p>Será listado os objetos que estão inválidos na base.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.andrels.com/wp-pt_BR/index.php/2012/01/compilando-objetos-invalidos-do-oracle-de-maneira-facil/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Compartilhando conexão 3G do Android com PCs ou Notebooks via USB</title>
		<link>http://www.andrels.com/wp-pt_BR/index.php/2011/10/compartilhando-conexao-3g-do-android-com-pc-ou-notebook-via-usb/#utm_source=feed&#038;utm_medium=feed&#038;utm_campaign=feed</link>
		<comments>http://www.andrels.com/wp-pt_BR/index.php/2011/10/compartilhando-conexao-3g-do-android-com-pc-ou-notebook-via-usb/#comments</comments>
		<pubDate>Wed, 05 Oct 2011 21:43:50 +0000</pubDate>
		<dc:creator>André</dc:creator>
				<category><![CDATA[Android]]></category>
		<category><![CDATA[Configurações]]></category>
		<category><![CDATA[Dispositivos]]></category>
		<category><![CDATA[Sistemas Operacionais]]></category>
		<category><![CDATA[Tutoriais]]></category>
		<category><![CDATA[3g]]></category>
		<category><![CDATA[android]]></category>
		<category><![CDATA[conexão]]></category>
		<category><![CDATA[proxy]]></category>
		<category><![CDATA[usb]]></category>

		<guid isPermaLink="false">http://www.andrels.com/wp-pt_BR/?p=389</guid>
		<description><![CDATA[O Froyo, versão 2.2 do Android, vem com um aplicativo padrão para compatilhamento da conexão 3G com outros dispositivos que<a href="http://www.andrels.com/wp-pt_BR/index.php/2011/10/compartilhando-conexao-3g-do-android-com-pc-ou-notebook-via-usb/" class="searchmore">Read the Rest...</a><div class="clr"></div>]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">O Froyo, versão 2.2 do Android, vem com um aplicativo padrão para compatilhamento da conexão 3G com outros dispositivos que utilizem da tecnologia wi-fi. O problema surge quando você não dispõe de uma placa wi-fi, como é o caso da maioria esmagadores de desktops vendidos atualmente.</p>
<p style="text-align: justify;"><a href="https://market.android.com/details?id=com.proxoid&amp;feature=search_result" target="_blank">ProxoId</a>, aplicativo gratuito disponível no <a href="https://market.android.com/" target="_blank">Android Marketing</a>, lhe permite compartilhar a conexão 3G utilizando somente o cabo USB.</p>
<p style="text-align: justify;">O aplicativo precisa de um programa <em>stand alone</em> rodando no computador para funcionar e que os drivers para o Android estejam instalado neste mesmo equipamento.</p>
<p style="text-align: justify;">O driver, assim como o programa, pode ser encontrado em forma de arquivo ZIP para Windows 32bits <a href="http://www.baroukh.com/proxoid/proxoid-adb.zip" target="_blank">aqui</a> e para Windows 64 bits <a href="http://www.baroukh.com/proxoid/proxoid-adb64.zip">aqui</a>. Se você instalou os drivers que vêm no CD do fabricante, pule para o passo <strong>Reconhecendo o smartphone</strong>.</p>
<h2>Instalando os drivers</h2>
<p style="text-align: justify;">Descompacte o arquivo ZIP e conecte o aparelho ao computador. O assistente de novos dispositivos será aberto.</p>
<p style="text-align: justify;"><img class="aligncenter size-full wp-image-397" title="assistente" src="http://www.andrels.com/wp-pt_BR/wp-content/uploads/2011/10/img1.png" alt="" width="503" height="390" /></p>
<p style="text-align: justify;">Escolha a opção &#8220;Não, não agora&#8221; e clique em &#8220;Avançar&#8221;. Na tela seguinte, escolha a opção &#8220;Instalar de uma lista ou local específico&#8221;.</p>
<p style="text-align: center;"><img class="aligncenter size-full wp-image-398" title="img2" src="http://www.andrels.com/wp-pt_BR/wp-content/uploads/2011/10/img2.png" alt="" width="503" height="390" /></p>
<p style="text-align: justify;">Habilite as opções &#8220;Procurar o melhor driver nestes locais&#8221; e &#8220;Incluir este local na pesquisa&#8221;, então clique em procurar.</p>
<p style="text-align: center;"><img class="aligncenter size-full wp-image-399" title="img3" src="http://www.andrels.com/wp-pt_BR/wp-content/uploads/2011/10/img3.png" alt="" width="503" height="390" /></p>
<p style="text-align: justify;">Na caixa de diálogo, selecione o diretório onde você descompactou o arquivo ZIP &gt; &#8220;usb_driver&#8221; &gt; &#8220;x86&#8243;, como na imagem.</p>
<p style="text-align: justify;"><img class="aligncenter size-full wp-image-400" title="img4" src="http://www.andrels.com/wp-pt_BR/wp-content/uploads/2011/10/img4.png" alt="" width="325" height="318" /></p>
<p style="text-align: justify;">Clique em avançar e siga os passos até o fim da instalação.</p>
<h2>Reconhecendo o smartphone</h2>
<p style="text-align: justify;">Com o aparelho plugado, acesse o diretório &#8220;proxoid-adb&#8221; e execute o arquivo &#8220;check.bat&#8221;. Deverá aparecer a tela abaixo com o número do dispositivo.</p>
<p style="text-align: justify;"><img class="aligncenter size-full wp-image-401" title="img5" src="http://www.andrels.com/wp-pt_BR/wp-content/uploads/2011/10/img5.png" alt="" width="500" height="206" /></p>
<p style="text-align: justify;">Caso não apareça, tente desconectar o aparelho e conectar novamente ou reinstalar os drivers.</p>
<h2>Configurando ProxoId</h2>
<p style="text-align: justify;">A tela de configuração é aberto quando o ProxoId é executado:<br />
&#8220;Start/Stop ProxoId&#8221; &#8211; Indica se o serviço está em execução (ticado) ou parado;<br />
&#8220;Port&#8221; &#8211; Número da porta para o proxy<br />
&#8220;User-Agent Filter&#8221; &#8211; Máscara do User-Agent (Browser).</p>
<p style="text-align: justify;"><img class="aligncenter size-full wp-image-402" title="proxoid" src="http://www.andrels.com/wp-pt_BR/wp-content/uploads/2011/10/img6.png" alt="" width="235" height="350" /></p>
<h2>Configurando Browser</h2>
<h4>Internet Explorer e Google Chrome</h4>
<p style="text-align: justify;"><strong></strong>Clique no menu &#8220;Iniciar&#8221; &gt; &#8220;Painel de Controle&#8221; e &#8220;Opções da Internet&#8221;. Clique na aba &#8220;Conexões&#8221; e no botão &#8220;Configurações da LAN&#8221;.</p>
<p style="text-align: justify;"><img class="aligncenter size-full wp-image-403" title="img7" src="http://www.andrels.com/wp-pt_BR/wp-content/uploads/2011/10/img7.png" alt="" width="363" height="450" /></p>
<p style="text-align: justify;">No campo &#8220;Endereço&#8221;, digite &#8220;localhost&#8221; e no campo &#8220;Porta&#8221; digite o mesmo valor que está nas configurações do &#8220;ProxoId&#8221;.</p>
<p style="text-align: justify;"><img class="aligncenter size-full wp-image-406" title="img10" src="http://www.andrels.com/wp-pt_BR/wp-content/uploads/2011/10/img10.png" alt="" width="384" height="338" /></p>
<h4>FireFox</h4>
<p style="text-align: justify;"><strong></strong>Abra o Firefox, clique no menu &#8220;Opções&#8221;. Selecione a guia &#8220;Avançado&#8221; &gt; &#8220;Rede&#8221; e clique no botão &#8220;Configurar Conexão&#8221;. Habilite a opção &#8220;Configuração manual de proxy.</p>
<p style="text-align: justify;"><img class="aligncenter size-full wp-image-404" title="img8" src="http://www.andrels.com/wp-pt_BR/wp-content/uploads/2011/10/img8.png" alt="" width="450" height="416" /></p>
<p style="text-align: justify;">No campo &#8220;HTTP&#8221;, digite &#8220;localhost&#8221; e no campo &#8220;Porta&#8221; digite o mesmo valor que está nas configurações do &#8220;ProxoId&#8221;.</p>
<p style="text-align: center;"><img class="aligncenter" title="img9" src="http://www.andrels.com/wp-pt_BR/wp-content/uploads/2011/10/img9.png" alt="" width="376" height="400" /></p>
<h2>Compartilhando conexão</h2>
<p style="text-align: justify;">Habilite a opção &#8220;Start/Stop ProxoId&#8221; na aplicação do seu Android.<br />
No computador, abra o diretório &#8220;proxoid-adb&#8221; e execute o arquivo &#8220;start-tunnel.bat&#8221;.</p>
<p style="text-align: justify;">Pronto! Enquanto estiver usando estas configurações de proxy, todo o tráfego passa a ser disponibilizado pelo sinal 3G do seu aparelho!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.andrels.com/wp-pt_BR/index.php/2011/10/compartilhando-conexao-3g-do-android-com-pc-ou-notebook-via-usb/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Como usar controle de Playstation 3 no PC via Bluetooth</title>
		<link>http://www.andrels.com/wp-pt_BR/index.php/2011/09/como-usar-controle-de-playstation-3-no-pc-via-bluetooth/#utm_source=feed&#038;utm_medium=feed&#038;utm_campaign=feed</link>
		<comments>http://www.andrels.com/wp-pt_BR/index.php/2011/09/como-usar-controle-de-playstation-3-no-pc-via-bluetooth/#comments</comments>
		<pubDate>Fri, 16 Sep 2011 02:16:22 +0000</pubDate>
		<dc:creator>André</dc:creator>
				<category><![CDATA[Configurações]]></category>
		<category><![CDATA[Dispositivos]]></category>
		<category><![CDATA[Games]]></category>
		<category><![CDATA[Tutoriais]]></category>
		<category><![CDATA[bluetooth]]></category>
		<category><![CDATA[joystick]]></category>
		<category><![CDATA[pc]]></category>
		<category><![CDATA[playstation 3]]></category>

		<guid isPermaLink="false">http://www.andrels.com/wp-pt_BR/?p=372</guid>
		<description><![CDATA[Por curiosidade, tentei parear o controle de PS3 (Playstation 3) com meu computador via Bluetooth, sem sucesso. Atrás de uma<a href="http://www.andrels.com/wp-pt_BR/index.php/2011/09/como-usar-controle-de-playstation-3-no-pc-via-bluetooth/" class="searchmore">Read the Rest...</a><div class="clr"></div>]]></description>
			<content:encoded><![CDATA[<p>Por curiosidade, tentei parear o controle de PS3 (Playstation 3) com meu computador via Bluetooth, sem sucesso. Atrás de uma forma de fazê-lo, encontrei um driver customizado que permite usar o joystick de PS3 no PC.</p>
<p>Abaixo descrevo o passo-a-passo de como  fazer.</p>
<h4>Requisitos:</h4>
<ul>
<li>Adaptador Bluetooth (caso seu computador/notebook não tenha) &#8211; Como <a href="http://lista.mercadolivre.com.br/dongle-bluetooth">estes</a>;</li>
<li>Cabo USB do controle;</li>
<li>.NET Framework 4 &#8211; Pode ser baixado <a href="http://www.microsoft.com/download/en/details.aspx?id=17851">aqui</a>;</li>
<li>Sistema operacional Windows XP, Vista ou 7 (seven).</li>
</ul>
<p>Os drivers padrão dos adaptadores e do Windows não reconhecem o controle do Playstation 3, para isso você precisará baixar o driver customizado do site <a href="http://www.motioninjoy.com" target="_blank">Motionin Joy</a> para <a href="http://www.xinputer.com/download/MotioninJoy_060004_x86_signed.zip">Windows XP, Windows Vista e Windows 7 (32 bits)</a> ou <a href="http://www.xinputer.com/download/MotioninJoy_060004_amd64_signed.zip">Windows XP, Windows Vista e Windows 7 (64 bits)</a>.</p>
<p>Após o download, extraia o arquivo e execute-o. Siga os passos para instalação até o final e execute o DS3 Tool, ou clique no menu Iniciar, Programas, MotioninJoy e DS3 Tool.</p>
<p>Aparecerá a tela abaixo: <img class="aligncenter size-full wp-image-373" src="http://www.andrels.com/wp-pt_BR/wp-content/uploads/2011/09/tela1.jpg" alt="" width="500" height="398" /></p>
<p>Conecte o joystick no PC usando o cabo USB. Clique no menu &#8220;Driver Manager&#8221;, selecione o dispositivo encontrado e clique no botão &#8220;Install all&#8221;.</p>
<p><img class="aligncenter size-full wp-image-374" src="http://www.andrels.com/wp-pt_BR/wp-content/uploads/2011/09/tela2.jpg" alt="" width="549" height="437" /></p>
<p>Após o término da instalação (demora cerca de um minuto), clique em &#8220;Profiles&#8221;.</p>
<p>O controle deve aparecer na lista (indicada pelo círculo). Selecione a opção  &#8221;Playstation 2 (POV, Joysticks, Analog Trigger)&#8221;, &#8220;Custom&#8221; e o número correspondente do controle (no nosso caso &#8220;1&#8243;).</p>
<p><img class="aligncenter size-full wp-image-375" src="http://www.andrels.com/wp-pt_BR/wp-content/uploads/2011/09/tela3.jpg" alt="" width="549" height="437" /></p>
<p>Para finalizar, clique no menu &#8220;Bluetooth Pair&#8221;, selecione seu controle na lista &#8220;Dual Shock 3&#8243; e clique em &#8220;Pair Now&#8221;.</p>
<p><img class="aligncenter size-full wp-image-377" src="http://www.andrels.com/wp-pt_BR/wp-content/uploads/2011/09/tela4.jpg" alt="" width="549" height="437" /></p>
<p>Pronto! Quando aparecer o número MAC onde está escrito &#8220;Have Paired to&#8221;, você poderá desconectar o cabo USB e utilizar o controle via Bluetooth normalmente, como um joystick comum de PC.</p>
<p>Enjoy! <img src='http://www.andrels.com/wp-pt_BR/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.andrels.com/wp-pt_BR/index.php/2011/09/como-usar-controle-de-playstation-3-no-pc-via-bluetooth/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Android 2.2 &#8211; Instalando aplicativos direto no cartão SD</title>
		<link>http://www.andrels.com/wp-pt_BR/index.php/2011/09/android-2-2-instalando-aplicativos-direto-no-cartao-sd/#utm_source=feed&#038;utm_medium=feed&#038;utm_campaign=feed</link>
		<comments>http://www.andrels.com/wp-pt_BR/index.php/2011/09/android-2-2-instalando-aplicativos-direto-no-cartao-sd/#comments</comments>
		<pubDate>Mon, 12 Sep 2011 21:37:20 +0000</pubDate>
		<dc:creator>André</dc:creator>
				<category><![CDATA[Android]]></category>
		<category><![CDATA[Configurações]]></category>
		<category><![CDATA[Tutoriais]]></category>
		<category><![CDATA[android]]></category>
		<category><![CDATA[memoria]]></category>

		<guid isPermaLink="false">http://www.andrels.com/wp-pt_BR/?p=357</guid>
		<description><![CDATA[Quem tem smartphones Android com pouca memória interna e vive baixando aplicativos, sabe como é frustrante quando aparece o ícone<a href="http://www.andrels.com/wp-pt_BR/index.php/2011/09/android-2-2-instalando-aplicativos-direto-no-cartao-sd/" class="searchmore">Read the Rest...</a><div class="clr"></div>]]></description>
			<content:encoded><![CDATA[<p><img class="alignleft size-full wp-image-359" style="margin-top: 5px; margin-bottom: 5px;" title="android_full" src="http://www.andrels.com/wp-pt_BR/wp-content/uploads/2011/09/android_full.png" alt="" width="233" height="265" />Quem tem smartphones Android com pouca memória interna e vive baixando aplicativos, sabe como é frustrante quando aparece o ícone de &#8220;Pouco Espaço&#8221;.</p>
<p>No Android 2.2 existe a possibilidade de migrar o local de instalação dos aplicativos já instalados, porém, alguns não lhe dão a possibilidade de movê-los para o SD.</p>
<p>Atrás de soluções para resolver este probleminha no meu Motorola Milestone, encontrei um excelente tutorial no <a href="http://www.mundozoom.com.br/android-instalar-aplicativos-no-cartao-sd.html" target="_blank">Mundo Zoom</a> que ensina como instalar aplicativos direto no cartão SD, mesmos aqueles aplicativos que não permitem movê-los, sem a necessidade de ser usuário <em>root</em>.</p>
<p>Primeiro baixe, de preferência, o ZIP de <a href="http://developer.android.com/sdk/index.html" target="_blank">Android SDK</a> e extraia-o e, navegue até o diretório &#8220;<strong>android-sdk-windows\platform-tools</strong>&#8220;.</p>
<p>Configure seu aparelho para o modo debug. Não sabe? Vá em <strong>&#8220;Configurações&#8221; &gt; &#8220;Aplicativos&#8221; &gt; &#8220;Desenvolvimento&#8221;</strong> e ative a opção <strong>&#8220;Depuração USB&#8221;</strong>.</p>
<p>Conecte seu smartphone à porta USB e ative a opção &#8220;Nenhum&#8221; (ou &#8220;Somente carregar bateria&#8221;) no Gerenciador de Conexão USB.</p>
<p>Agora Abra o prompt de comando clicando no menu Iniciar, executar. Digite &#8220;cmd&#8221; (sem aspas) e pressione Enter.</p>
<p>Com o prompt e a janela do Windows Explorer abertos, clique no arquivo &#8220;adb.exe&#8221; e arraste para o prompt, em seguida dê um espaço e digite &#8220;shell&#8221;. Pressione Enter.</p>
<p style="text-align: center;"><a href="http://www.andrels.com/wp-pt_BR/wp-content/uploads/2011/09/ss1.jpg#utm_source=feed&amp;utm_medium=feed&amp;utm_campaign=feed"><img class="size-full wp-image-364 aligncenter" title="ss1" src="http://www.andrels.com/wp-pt_BR/wp-content/uploads/2011/09/ss1.jpg" alt="" width="540" height="386" /></a></p>
<p>Deverá aparecer o símbolo &#8220;$&#8221; e o cursor piscando. Agora digite o comando &#8220;<strong>pm setInstallLocation 2</strong>&#8221; e pressione Enter.</p>
<p>Este comando define a partição &#8220;2&#8243;, que é o cartão SD, como local padrão para a instalação dos aplicativos.</p>
<p>Pronto, isto é tudo que você precisa para que, a partir de agora, os aplicativos sejam instalados direto no cartão SD.</p>
<p>Caso o procedimento não tenha dado certo, no site <a href="http://www.mundozoom.com.br/android-instalar-aplicativos-no-cartao-sd.html" target="_blank">Mundo Zoom</a> existem algumas soluções de problemas que podem te ajudar.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.andrels.com/wp-pt_BR/index.php/2011/09/android-2-2-instalando-aplicativos-direto-no-cartao-sd/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>A importância de File.separator e File.pathSeparator</title>
		<link>http://www.andrels.com/wp-pt_BR/index.php/2011/08/a-importancia-de-file-separator-e-file-pathseparator/#utm_source=feed&#038;utm_medium=feed&#038;utm_campaign=feed</link>
		<comments>http://www.andrels.com/wp-pt_BR/index.php/2011/08/a-importancia-de-file-separator-e-file-pathseparator/#comments</comments>
		<pubDate>Wed, 24 Aug 2011 16:35:07 +0000</pubDate>
		<dc:creator>André</dc:creator>
				<category><![CDATA[Dicas rápidas]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[programação]]></category>

		<guid isPermaLink="false">http://www.andrels.com/wp-pt_BR/?p=352</guid>
		<description><![CDATA[Quase todos os programadores Java conhecem os métodos citados no título, mas muito poucos se preocupam em utiliza-los. Estes dois<a href="http://www.andrels.com/wp-pt_BR/index.php/2011/08/a-importancia-de-file-separator-e-file-pathseparator/" class="searchmore">Read the Rest...</a><div class="clr"></div>]]></description>
			<content:encoded><![CDATA[<p>Quase todos os programadores Java conhecem os métodos citados no título, mas muito poucos se preocupam em utiliza-los.</p>
<p>Estes dois métodos servem para que o programador não precise &#8220;adivinhar&#8221; qual é o separador de arquivos e qual é o separador de caminhos em cada sistema operacional.</p>
<p>No Linux/Unix, os métodos <b><a href="http://download.oracle.com/javase/1,5.0/docs/api/java/io/File.html#separator">File.separator</a></b> e <b><a href="http://download.oracle.com/javase/1,5.0/docs/api/java/io/File.html#pathSeparator">File.pathSeparator</a></b> retornam &#8220;/&#8221; e &#8220;.&#8221; respectivamente, enquanto que, no Windows, estes mesmos métodos retornam &#8220;\&#8221; (ou &#8220;\\&#8221; &#8211; escape) e &#8220;;&#8221;.</p>
<p>Passei por um caso recente, onde o código abaixo lançava a <i>exception</i> FileNotFoundException no Linux, mas funcionava perfeitamente no Windows:</p>
<pre class="brush:java">
String caminhoAp = ctx.getRealPath();
String caminhoArq = caminhoAp + "\\" + "WEB-INF/classes/pacotes/da/minha/aplicacao/";

File arquivo = new File(caminhoArq, "relatorio.pdf");
OutputStream out = new FileOutputStream(arquivo);
...
</pre>
<p>Então passou a funcionar nos dois sistemas operacionais após substituir &#8220;\\&#8221; por File.separator na linha 2, desta forma:</p>
<pre class="brush:java">
String caminhoAp = ctx.getRealPath();
String caminhoArq = caminhoAp + File.separator + "WEB-INF/classes/pacotes/da/minha/aplicacao/";

File arquivo = new File(caminhoArq, "relatorio.pdf");
OutputStream out = new FileOutputStream(arquivo);
...
</pre>
<p>A utilização destes métodos, além de ser uma boa prática, é muito útil quando se tem a mesma versão de um sistema feito em Java rodando de diferentes sistemas operacionais.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.andrels.com/wp-pt_BR/index.php/2011/08/a-importancia-de-file-separator-e-file-pathseparator/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Instalando multifuncional Epson Stylus CX5600 no Ubuntu 10.04</title>
		<link>http://www.andrels.com/wp-pt_BR/index.php/2011/08/instalando-multifuncional-epson-stylus-cx5600-no-ubuntu-10-04/#utm_source=feed&#038;utm_medium=feed&#038;utm_campaign=feed</link>
		<comments>http://www.andrels.com/wp-pt_BR/index.php/2011/08/instalando-multifuncional-epson-stylus-cx5600-no-ubuntu-10-04/#comments</comments>
		<pubDate>Fri, 05 Aug 2011 16:05:30 +0000</pubDate>
		<dc:creator>André</dc:creator>
				<category><![CDATA[Configurações]]></category>
		<category><![CDATA[Dispositivos]]></category>
		<category><![CDATA[Sistemas Operacionais]]></category>
		<category><![CDATA[Tutoriais]]></category>

		<guid isPermaLink="false">http://www.andrels.com/wp-pt_BR/?p=306</guid>
		<description><![CDATA[Procurando pela Web encontrei vários tutoriais que explicavam como instalar a multifuncional Epson Stylus CX5600 no Linux, todos sem sucesso.<a href="http://www.andrels.com/wp-pt_BR/index.php/2011/08/instalando-multifuncional-epson-stylus-cx5600-no-ubuntu-10-04/" class="searchmore">Read the Rest...</a><div class="clr"></div>]]></description>
			<content:encoded><![CDATA[<p>Procurando pela Web encontrei vários tutoriais que explicavam como instalar a multifuncional Epson Stylus CX5600 no Linux, todos sem sucesso. Após meses de procura, encontrei <a href="http://lgallardo.com/en/2009/12/05/escaner-multifuncional-epson-stylus-cx5600-en-linux/">este tutorial</a>, do Luis Gallardo, que explica como fazer.</p>
<p>Como o tutorial explica a instalação no Ubuntu 9.10 não foi preciso seguir alguns passos. Então mostrarei abaixo os passos que utilizei para a instalação na versão 10.04 do Ubuntu.</p>
<p>Será necessário baixar os drivers da Avasys, para isso acesse este <a href="http://www.avasys.jp/lx-bin2/linux_e/spc/DL1.do">link</a>, role a página para baixo, escolha a opção &#8220;<em>Epson Stylus CX4300/</em><wbr><em>CX4400/</em><wbr><em>CX4450/</em><wbr><em>CX5500/</em><wbr><em>CX5600/</em><wbr><em>DX4400/</em><wbr><em>DX4450</em>&#8220;, distribuição &#8220;<em>Ubuntu</em>&#8221; e versão &#8220;<em>10.04</em>&#8221; e clique em &#8220;<em>Next</em>&#8220;.</wbr></wbr></wbr></wbr></wbr></wbr></p>
<p>Na próxima página, baixe os arquivos &#8220;<strong>iscan-data_1.9.0-1_all.deb</strong>&#8220;, &#8220;<strong>iscan_2.26.4-2.ltdl7_i386.deb</strong>&#8221; e &#8220;<strong>iscan-plugin-cx4400_2.1.3-1_i386.deb</strong>&#8220;. Em seguida, execute os comandos abaixo:</p>
<pre class="brush:bash">sudo dpkg -i iscan-data_1.9.0-1_all.deb
sudo dpkg -i iscan_2.26.4-2.ltdl7_i386.deb
sudo dpkg -i iscan-plugin-cx4400_2.1.3-1_i386.deb</pre>
<p>Tudo certo, certifique-se que o scanner está ligado e execute o comando</p>
<pre class="brush:bash">lsusb</pre>
<p>Deverá aparecer uma lista de dispositivos conectados às portas USB, como esta:</p>
<pre class="brush:bash">Bus 003 Device 004: ID 04b8:083f Seiko Epson Corp. Stylus DX4450
Bus 003 Device 003: ID 04fc:05d8 Sunplus Technology Co., Ltd
Bus 003 Device 002: ID 04f3:0216 Elan Microelectronics Corp.
Bus 003 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 002 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 001 Device 003: ID 18e3:9101 Fitipower Integrated Technology Inc
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub</pre>
<p>A primeira linha &#8220;<em>Bus 003 Device 004: ID 04b8:083f Seiko Epson Corp. Stylus DX4450</em>&#8221; significa que a multifuncional foi detectada no endereço 003:004.</p>
<p>Este passos foram suficientes para que o scanner fosse detectado pelo XSane, mas só o usuário <b>root</b> conseguia usar o programa.</p>
<p>Para resolver este problema, edite o arquivo <em>/lib/udev/rules.d/40-libsane.rules</em> e acrescente as linhas abaixo:</p>
<pre class="brush:text"># Epson CX5600
ATTRS{idVendor}=="04b8", ATTRS{idProduct}=="083f", MODE="0664", GROUP="saned", ENV{libsane_matched}="yes"</pre>
<p>Desligue e ligue a impressora novamente. Para saber se deu certo, execute o comando <em>lsusb</em>. A saída deverá ser parecida com a saída abaixo:</p>
<pre class="brush:bash">Bus 003 Device 004: ID 04b8:083f Seiko Epson Corp. Stylus DX4450</pre>
<p>Repare no <em>Bus <strong>003</strong></em> e no <em>Device <strong>004</strong></em> (os números poderão ser diferentes). Com estes números execute o comando</p>
<pre class="brush:bash">ls -l /dev/bus/usb/&lt;BUS&gt;/&lt;DEVICE&gt;</pre>
<p>Substituia o &lt;BUS&gt; e &lt;DEVICE&gt; pelos respectivos números, neste caso:</p>
<pre class="brush:bash">ls -l /dev/bus/usb/003/004</pre>
<p>Você verá algo parecido com</p>
<pre class="brush:bash">crw-rw-r--+ 1 root saned 189, 129 2011-07-01 14:01 /dev/bus/usb/003/004</pre>
<p>Neste ponto é possível ver que todos os usuários pertencentes ao grupo <b>saned</b> estão aptos para usar o scanner.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.andrels.com/wp-pt_BR/index.php/2011/08/instalando-multifuncional-epson-stylus-cx5600-no-ubuntu-10-04/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Corrigindo o erro &#8220;Allowed memory size of&#8230;&#8221; do WordPress</title>
		<link>http://www.andrels.com/wp-pt_BR/index.php/2011/07/corrigindo-o-erro-allowed-memory-size-of-do-wordpress/#utm_source=feed&#038;utm_medium=feed&#038;utm_campaign=feed</link>
		<comments>http://www.andrels.com/wp-pt_BR/index.php/2011/07/corrigindo-o-erro-allowed-memory-size-of-do-wordpress/#comments</comments>
		<pubDate>Wed, 06 Jul 2011 01:38:02 +0000</pubDate>
		<dc:creator>André</dc:creator>
				<category><![CDATA[Configurações]]></category>
		<category><![CDATA[Dicas rápidas]]></category>
		<category><![CDATA[Softwares]]></category>
		<category><![CDATA[correção]]></category>
		<category><![CDATA[error]]></category>
		<category><![CDATA[fatal]]></category>
		<category><![CDATA[memory]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[wordpress]]></category>

		<guid isPermaLink="false">http://www.andrels.com/wp-pt_BR/?p=302</guid>
		<description><![CDATA[Acabei de atualizar meu WordPress para a versão 3.2, ao terminar a atualização o servidor retornada a página de erro<a href="http://www.andrels.com/wp-pt_BR/index.php/2011/07/corrigindo-o-erro-allowed-memory-size-of-do-wordpress/" class="searchmore">Read the Rest...</a><div class="clr"></div>]]></description>
			<content:encoded><![CDATA[<p>Acabei de atualizar meu WordPress para a versão 3.2, ao terminar a atualização o servidor retornada a página de erro 500. Vasculhando o arquivo de log do WP descubri que estava dando o erro <strong>Fatal error: Allowed memory size of 33554432 bytes exhausted</strong>, aliás, vários erros assim.</p>
<p>Para descobrir se este é o seu problema, acesse o arquivo <strong>error_log</strong> que está no diretório <strong>wp-admin</strong> do WordPress e cheque as últimas linhas.</p>
<p>O procedimento abaixo resolveu o problema, mas, dependendo do servidor de hospedagem, talvez as configurações do PHP não permita o redimensionamento de memória em tempo de execução.</p>
<p>Edite o arquivo <strong>wp-settings.php </strong>que está na raiz do WordPress e adicione a linha abaixo após &#8220;&lt;?php&#8221;</p>
<pre class="brush:php">define('WP_MEMORY_LIMIT', '64M');</pre>
<p>Aqui eu aloquei 64MB para o PHP, mas como saber quanto de espaço foi e deve ser alocado?</p>
<p>Na mensagem de erro ele mostra a quantidade que está sendo alocada, é o número comprido da mensagem &#8220;Fatal error: Allowed memory size of <span style="text-decoration: underline;">33554432</span>&#8230;&#8221;. Aqui ele diz que foi alocado 32MB (para converter bytes em megabytes faça o cálculo 33554432 / (1024^2) = 32).</p>
<p>Dependendo do resultado do cálculo, indique um valor superior.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.andrels.com/wp-pt_BR/index.php/2011/07/corrigindo-o-erro-allowed-memory-size-of-do-wordpress/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Como recuperar e escrever campos CLOB</title>
		<link>http://www.andrels.com/wp-pt_BR/index.php/2011/05/como-recuperar-e-escrever-campos-clob/#utm_source=feed&#038;utm_medium=feed&#038;utm_campaign=feed</link>
		<comments>http://www.andrels.com/wp-pt_BR/index.php/2011/05/como-recuperar-e-escrever-campos-clob/#comments</comments>
		<pubDate>Fri, 13 May 2011 17:01:25 +0000</pubDate>
		<dc:creator>André</dc:creator>
				<category><![CDATA[Desenvolvimento]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Tutoriais]]></category>
		<category><![CDATA[banco de dados]]></category>
		<category><![CDATA[blob]]></category>
		<category><![CDATA[clob]]></category>
		<category><![CDATA[download]]></category>
		<category><![CDATA[tutorial]]></category>

		<guid isPermaLink="false">http://www.andrels.com/wp-pt_BR/?p=285</guid>
		<description><![CDATA[O Character Large Object (ou CLOB), como o próprio nome já diz, é um tipo de campo muito comum em<a href="http://www.andrels.com/wp-pt_BR/index.php/2011/05/como-recuperar-e-escrever-campos-clob/" class="searchmore">Read the Rest...</a><div class="clr"></div>]]></description>
			<content:encoded><![CDATA[<p>O <em>Character Large Object</em> (ou CLOB), como o próprio nome já diz, é um tipo de campo muito comum em Bancos de Dados usado para armazenar textos com uma quantidade enorme de caracteres.</p>
<p>No MySQL, por exemplo, o tipo CLOB está descrito como MEMO, mas a função é a mesma.</p>
<p>Estes dias precisei recuperar um valor de um campo CLOB que era retornado por um <em>SELECT</em>, como nunca tinha utilizado este campo no Java, resolvi escrever este pequeno tutorial como um memorando e, também, ajudar a quem precisar.</p>
<h4>Escrevendo valores em campo CLOB</h4>
<p>O método do <em>PreparedStatement</em> utilizado para a gravação de um CLOB é o <em>setAsciiStream</em>, passando a posição do campo CLOB, o <em>InputStream </em>dos dados e o ponto final de leitura do <em>InputStream.</em></p>
<pre class="brush:sql">ps.setAsciiStream(posicaoClob, inputStream, tamanhoDoTexto);</pre>
<p><strong>Exemplo funcional:</strong></p>
<pre class="brush:java">String sql = "INSERT INTO TESTE (texto) VALUES(?)";
		try{
			String txt = leArquivoTxt();
			ByteArrayInputStream bais = new ByteArrayInputStream(txt.getBytes());

			PreparedStatement ps = conexao.prepareStatement(sql);
			//Campo CLOB é a '?' que está na posição 1 do INSERT
			ps.setAsciiStream(1, bais, txt.length());

			ps.execute();

			ps.close();
		}catch (Exception e) {
			e.printStackTrace();
		}</pre>
<h4>Recuperando valor de um campo CLOB</h4>
<p>Como executamos um <em>SELECT</em>, será necessário capturar o <em>ResultSet </em>, iterar as linhas e chamar o método para a recuperação de um CLOB é o <em>getClob</em>, passando a posição em que o campo se encontra na query ou, simplesmente, o nome da coluna.</p>
<pre class="brush:sql">rs.getClob("xml");</pre>
<p><strong>Exemplo funcional:</strong></p>
<pre class="brush:java">String sql = "SELECT xml FROM TESTE";
		try{
			PreparedStatement ps = conexao.prepareStatement(sql);
			ResultSet rs = ps.executeQuery();

			while(rs.next()){
				Clob clob = rs.getClob("xml");
				BufferedReader reader = new BufferedReader(clob.getCharacterStream());
				StringBuffer strBuf = new StringBuffer();

				String linha = null;
				while((linha = reader.readLine()) != null){
					strBuf.append(linha);
//Character.LINE_SEPARATOR insere a quebra de linha
					strBuf.append((char)Character.LINE_SEPARATOR);
				}

				System.out.println("=========== CLOB ===========");
				System.out.println(strBuf.toString());
			}

			rs.close();
			ps.close();
		}catch (Exception e) {
			e.printStackTrace();
		}</pre>
<p>É isso aí. Simples, fácil e indolor. <img src='http://www.andrels.com/wp-pt_BR/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>Caso queiram, podem baixar a aplicação de exemplo <a href="http://www.andrels.com/wp-pt_BR/wp-content/plugins/download-monitor/download.php?id=6" title="clicado 148 vezes">aqui</a></p>
<p>Para recuperar um campo BLOB veja este <a href="http://www.andrels.com/wp-pt_BR/index.php/2010/02/inserindo-arquivos-em-campos-blob-de-uma-base-de-dados/#utm_source=feed&amp;utm_medium=feed&amp;utm_campaign=feed">tópico</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.andrels.com/wp-pt_BR/index.php/2011/05/como-recuperar-e-escrever-campos-clob/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Instalando aplicativos .apk no emulador do Android SDK</title>
		<link>http://www.andrels.com/wp-pt_BR/index.php/2011/02/instalando-aplicativos-apk-no-emulador-do-android-sdk/#utm_source=feed&#038;utm_medium=feed&#038;utm_campaign=feed</link>
		<comments>http://www.andrels.com/wp-pt_BR/index.php/2011/02/instalando-aplicativos-apk-no-emulador-do-android-sdk/#comments</comments>
		<pubDate>Sun, 27 Feb 2011 15:30:44 +0000</pubDate>
		<dc:creator>André</dc:creator>
				<category><![CDATA[Android]]></category>
		<category><![CDATA[Configurações]]></category>
		<category><![CDATA[Dicas rápidas]]></category>
		<category><![CDATA[android]]></category>
		<category><![CDATA[apk]]></category>
		<category><![CDATA[emulador]]></category>
		<category><![CDATA[google]]></category>
		<category><![CDATA[sdk]]></category>

		<guid isPermaLink="false">http://www.andrels.com/wp-pt_BR/?p=277</guid>
		<description><![CDATA[Algumas vezes dependemos de aplicações de terceiros para testar se nossa aplicação está funcionando corretamente ou, simplesmente, acessar recursos do<a href="http://www.andrels.com/wp-pt_BR/index.php/2011/02/instalando-aplicativos-apk-no-emulador-do-android-sdk/" class="searchmore">Read the Rest...</a><div class="clr"></div>]]></description>
			<content:encoded><![CDATA[<p>Algumas vezes dependemos de aplicações de terceiros para testar se nossa aplicação está funcionando corretamente ou, simplesmente, acessar recursos do emulador que não estão disponíveis nas ferramentas que o acompanham.</p>
<p>Nos diretórios de instalação do SDK, geralmente em <em>platform-tools</em>, existe um executável chamado <strong>adb</strong>, através dele instalaremos aplicações de terceiros.</p>
<p>Antes de mais nada, você precisará do pacote de instalação do aplicativo (.apk). Para isso, procure em sites de busca ou faça backup através de seu aparelho Android usando aplicativos com o <a title="AppSaver" href="https://market.android.com/details?id=com.IQBS.android.appSaver&amp;feature=search_result">AppSaver</a>.</p>
<p>- Inicie o emulador, podendo ser pelo SDK Manager ou pelo plugin do Android no Eclipse.</p>
<p>- Através do prompt do DOS (Windows) ou de um terminal (Linux), acesse o diretório <em>platform-tools</em>, e execute a linha de comando:</p>
<pre class="brush:bash">$ adb install &lt;caminho do arquivo .apk&gt;</pre>
<p>Você verá a mensagem:</p>
<pre class="brush:bash">$ adb install Aplicativo.apk
125 KB/s (1091937 bytes in 8.474s)
        pkg: /data/local/tmp/Aplicativo.apk
Success</pre>
<p>Agora o aplicativo estará disponível no menu do emulador, como se estivesse instalado no seu smartphone. <img src='http://www.andrels.com/wp-pt_BR/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.andrels.com/wp-pt_BR/index.php/2011/02/instalando-aplicativos-apk-no-emulador-do-android-sdk/feed/</wfw:commentRss>
		<slash:comments>16</slash:comments>
		</item>
		<item>
		<title>Solução para &#8220;JDK não encontrado&#8221; instalando Android SDK no Windows 7 x64</title>
		<link>http://www.andrels.com/wp-pt_BR/index.php/2010/12/solucao-para-jdk-nao-encontrado-instalando-android-sdk-no-windows-7-x64/#utm_source=feed&#038;utm_medium=feed&#038;utm_campaign=feed</link>
		<comments>http://www.andrels.com/wp-pt_BR/index.php/2010/12/solucao-para-jdk-nao-encontrado-instalando-android-sdk-no-windows-7-x64/#comments</comments>
		<pubDate>Tue, 21 Dec 2010 22:29:35 +0000</pubDate>
		<dc:creator>André</dc:creator>
				<category><![CDATA[Configurações]]></category>
		<category><![CDATA[Tutoriais]]></category>
		<category><![CDATA[64 bits]]></category>
		<category><![CDATA[android]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[windows 7]]></category>

		<guid isPermaLink="false">http://www.andrels.com/wp-pt_BR/?p=271</guid>
		<description><![CDATA[Para aqueles que tentam instalar o SDk do Android em um computador com Windows 7 64 bits e estão enfrentando<a href="http://www.andrels.com/wp-pt_BR/index.php/2010/12/solucao-para-jdk-nao-encontrado-instalando-android-sdk-no-windows-7-x64/" class="searchmore">Read the Rest...</a><div class="clr"></div>]]></description>
			<content:encoded><![CDATA[<p>Para aqueles que tentam instalar o SDk do Android em um computador com Windows 7 64 bits e estão enfrentando o erro &#8220;JDK Not Found&#8221;, a solução encontrada no site <a href="http://www.eighthourlunch.com/node/161">http://www.eighthourlunch.com/node/161</a> foi de incluir algumas chaves no registro do Windows e, a partir daí, o instalador no Android SDK encontrará o JDK instalado.</p>
<p>O arquivo .REG está disponível para download <a href="http://www.andrels.com/wp-pt_BR/wp-content/plugins/download-monitor/download.php?id=5" title="clicado 1851 vezes">aqui</a>.</p>
<p>Antes de executar o arquivo, abra-o no bloco de notas e altere o caminho &#8220;C:\\Arquivos de Programas\\Java\\jdk1.6.0_23&#8243; para o diretório onde está instalado o JDK e o caminho &#8220;C:\\Arquivos de Programas\\Java\\jre6&#8243; para onde está o JRE.</p>
<p>Esta solução funcionou para mim. <img src='http://www.andrels.com/wp-pt_BR/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.andrels.com/wp-pt_BR/index.php/2010/12/solucao-para-jdk-nao-encontrado-instalando-android-sdk-no-windows-7-x64/feed/</wfw:commentRss>
		<slash:comments>12</slash:comments>
		</item>
		<item>
		<title>INNER JOIN e OUTER JOIN</title>
		<link>http://www.andrels.com/wp-pt_BR/index.php/2010/07/inner-join-e-outer-join/#utm_source=feed&#038;utm_medium=feed&#038;utm_campaign=feed</link>
		<comments>http://www.andrels.com/wp-pt_BR/index.php/2010/07/inner-join-e-outer-join/#comments</comments>
		<pubDate>Fri, 30 Jul 2010 14:02:17 +0000</pubDate>
		<dc:creator>André</dc:creator>
				<category><![CDATA[Desenvolvimento]]></category>
		<category><![CDATA[Oracle]]></category>
		<category><![CDATA[Tutoriais]]></category>
		<category><![CDATA[inner join]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[outer join]]></category>
		<category><![CDATA[postgresql]]></category>
		<category><![CDATA[sql]]></category>
		<category><![CDATA[sql server]]></category>

		<guid isPermaLink="false">http://www.andrels.com/wp-pt_BR/?p=244</guid>
		<description><![CDATA[Se você é um DBA ou trabalha com programação e usa muito banco de dados SQL, este tópico não é<a href="http://www.andrels.com/wp-pt_BR/index.php/2010/07/inner-join-e-outer-join/" class="searchmore">Read the Rest...</a><div class="clr"></div>]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">Se você é um DBA ou trabalha com programação e usa muito banco de dados SQL, este tópico não é você, a menos que não conheça as cláusulas INNER JOIN e OUTER JOIN, muito comuns em SGBDs SQL.</p>
<p style="text-align: justify;">Não sabe o que é SGBD? Os <strong>S</strong>istemas de <strong>G</strong>erenciamento de <strong>B</strong>anco de <strong>D</strong>ados são programas que auxiliam na manipulação dos dados armazenados. O MySQL, PostgreSQL, MS SQL Server ou Oracle, que você tem em sua casa ou empresa, são SGBDs.</p>
<p style="text-align: justify;">Para este tutorial você precisa ter, pelo menos, o conhecimento básico de SQL.</p>
<p style="text-align: justify;">Chega de enrolação, vamos ao que interessa!</p>
<h4>INNER JOIN</h4>
<p style="text-align: justify;">A cláusula INNER JOIN é usada quando se quer recuperar dados em mais de uma tabela através da igualdade de suas <em>foreign keys</em>.</p>
<p style="text-align: justify;">Por exemplo, pense que você quer criar um programa que sirva como agenda telefônica. Você cadastra as pessoas e os contatos telefônicos, como uma pessoa poderá ter nenhum até N números de telefones, você separa em duas entidades como neste modelo:<br />
<img class="aligncenter size-full wp-image-247" title="post - ptg" src="http://www.andrels.com/wp-pt_BR/wp-content/uploads/2010/07/post-ptg.jpg" alt="" width="197" height="249" /></p>
<p style="text-align: justify;">Olhando rapidamente você percebe que a entidade TELEFONE tem o atributo <strong>NUM_PESSOA</strong> que é o número de identificação do registro na entidade PESSOA.</p>
<p style="text-align: justify;">Vamos supor que as tabelas estejam preenchidas com os seguintes registros:</p>
<pre> +----------------------------+  +---------------------------+
 |           PESSOA           |  |         CONTATO           |
 +------------+---------------+  +------------+--------------+
 | NUM_PESSOA | NOME_PESSOA   |  | NUM_PESSOA | NUM_TELEFONE |
 | 1          | José          |  | 1          | 6589-3666    |
 | 2          | Arnaldo       |  | 3          | 9888-6699    |
 | 3          | Maria         |  | 3          | 8956-6666    |
 | 4          | Elverdelando  |  | 2          | 2888-9877    |
 +------------+---------------+  +------------+--------------+</pre>
<p style="text-align: justify;">Para recuperar os telefones de uma pessoa você deve usar INNER JOIN, implicitamente ou explicitamente. Vou explicar os dois casos.</p>
<p style="text-align: justify;">O método <strong>explícito</strong> é usar a cláusula explicitamente (duh!), que é formada por <strong>INNER JOIN </strong><em>&lt;tabela filha&gt;</em><strong> ON </strong><em>&lt;atributos de identificação&gt;</em>, no nosso exemplo:</p>
<pre class="brush:sql">SELECT nome_completo, num_telefone FROM pessoa INNER JOIN telefone <strong>ON</strong> pessoa.num_pessoa = telefone.num_pessoa</pre>
<p style="text-align: justify;">Estamos dizendo: &#8220;me traga o nome e os números dos telefones da pessoa onde o número da pessoa em TELEFONE seja igual ao número da pessoa em PESSOA&#8221;.</p>
<p style="text-align: justify;">Na forma <strong>implícita</strong> você não usa a cláusula INNER JOIN, o tratamento de igualdade é feito na cláusula <strong>WHERE</strong>. Usando o mesmo exemplo:</p>
<pre class="brush:sql">SELECT nome_completo, num_telefone FROM pessoa, telefone WHERE pessoa.num_pessoa = telefone.num_pessoa</pre>
<p style="text-align: justify;">Em ambos os casos o resultado será:</p>
<pre> +---------------------------+
 |         CONTATO           |
 +------------+--------------+
 | NOM_PESSOA | NUM_TELEFONE |
 | José       | 6589-3666    |
 | Maria      | 9888-6699    |
 | Maria      | 8956-6666    |
 | Arnaldo    | 2888-9877    |
 +------------+--------------+</pre>
<p style="text-align: justify;">&#8220;Que simples! Hummmm espera um pouco&#8230; Onde está o Elverdelando (que nominho, hein?!).&#8221;</p>
<p style="text-align: justify;">Lembra que dissemos ao banco &#8220;me traga o nome e os números dos telefones da pessoa onde o número da pessoa em TELEFONE seja igual ao número da pessoa em PESSOA&#8221;? Então! O Elverdelando não esta na tabela TELEFONE, por isso não foi retornado no resultado.</p>
<p style="text-align: justify;">Quando você precisar retornar os dados, mesmo não estando na tabela filha, usamos o <strong>OUTER JOIN</strong>.</p>
<h4>OUTER JOIN</h4>
<p style="text-align: justify;">A clásula OUTER JOIN tem duas variantes, <strong>LEFT OUTER JOIN</strong> e <strong>RIGHT OUTER JOIN</strong>, sendo que estas cláusula devem ser declaradas sempre de maneira explícita. Alguns SGBDs facilitam a utilização do OUTER JOIN te polpando de declarar toda a sintaxe, como é o caso do Oracle que utiliza o símbolo <strong>(+)</strong> na identificação fraca, mas <strong>NÃO É ANSI</strong>, ou seja, não funcionará em qualquer SGBD.</p>
<p style="text-align: justify;">Para que apareçam todas as pessoas, inclusive as que não têm número de telefone cadastrado usamos <strong>LEFT OUTER JOIN</strong> ou <strong>RIGHT OUTER JOIN</strong>.</p>
<p style="text-align: justify;">A sintaxe é parecida com a INNER JOIN, mudando apenas o nome da cláusula: <strong>LEFT[RIGHT] OUTER JOIN </strong><em>&lt;tabela filha&gt;</em><strong> ON </strong><em>&lt;atributos de identificação&gt;;</em></p>
<p style="text-align: justify;">Assim, faremos&#8230;</p>
<pre class="brush:sql">SELECT nome_completo, num_telefone FROM pessoa LEFT OUTER JOIN telefone ON pessoa.num_pessoa = telefone.num_pessoa</pre>
<p>ou então</p>
<pre class="brush:sql">SELECT nome_completo, num_telefone FROM telefone RIGHT OUTER JOIN pessoa ON pessoa.num_pessoa = telefone.num_pessoa</pre>
<p style="text-align: justify;">Em ambos os casos o resultado será:</p>
<pre> +-----------------------------+
 |         CONTATO             |
 +--------------+--------------+
 | NOM_PESSOA   | NUM_TELEFONE |
 | José         | 6589-3666    |
 | Maria        | 9888-6699    |
 | Maria        | 8956-6666    |
 | Arnaldo      | 2888-9877    |
 | Elverdelando |              |
 +--------------+--------------+</pre>
<p style="text-align: justify;">Como você pôde perceber, a única diferença entre o <strong>LEFT OUTER JOIN</strong> e o <strong>RIGHT OUTER JOIN</strong> é só a indicação de qual é o lado forte do relacionamento, ou seja, em qual lado da cláusula está a tabela que pode não ter valores na tabela filha. No nosso caso, ambos apontando para a tabela PESSOA.</p>
<p style="text-align: justify;"><em>INNER JOIN</em> é muito usado para consulta em banco de dados, quase que totalmente em seu método implícito. Já as cláusulas <em>OUTER JOIN</em> também são usadas, mas não com tanta frequência, posso dizer que é raro encontra-las por aí.</p>
<p style="text-align: justify;">Espero que este tutorial os ajude! <img src='http://www.andrels.com/wp-pt_BR/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.andrels.com/wp-pt_BR/index.php/2010/07/inner-join-e-outer-join/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Instalando suporte multi-idioma nos Windows 7 Professional e Home Premium</title>
		<link>http://www.andrels.com/wp-pt_BR/index.php/2010/05/instalando-suporte-multi-idioma-nos-windows-7-professional-e-home-premium/#utm_source=feed&#038;utm_medium=feed&#038;utm_campaign=feed</link>
		<comments>http://www.andrels.com/wp-pt_BR/index.php/2010/05/instalando-suporte-multi-idioma-nos-windows-7-professional-e-home-premium/#comments</comments>
		<pubDate>Thu, 06 May 2010 17:01:19 +0000</pubDate>
		<dc:creator>André</dc:creator>
				<category><![CDATA[Configurações]]></category>
		<category><![CDATA[Sistemas Operacionais]]></category>
		<category><![CDATA[Tutoriais]]></category>
		<category><![CDATA[idioma]]></category>
		<category><![CDATA[windows]]></category>
		<category><![CDATA[windows 7]]></category>

		<guid isPermaLink="false">http://www.andrels.com/wp-pt_BR/?p=215</guid>
		<description><![CDATA[O suporte multi-idioma é nativo nas edições Enterprise e Ultimate do Windows 7, porém, seguindo este tutorial, você também conseguirá<a href="http://www.andrels.com/wp-pt_BR/index.php/2010/05/instalando-suporte-multi-idioma-nos-windows-7-professional-e-home-premium/" class="searchmore">Read the Rest...</a><div class="clr"></div>]]></description>
			<content:encoded><![CDATA[<p><img class="aligncenter size-full wp-image-221" title="wind" src="http://www.andrels.com/wp-pt_BR/wp-content/uploads/2010/05/wind.jpg" alt="" width="431" height="286" /></p>
<p>O suporte multi-idioma é nativo nas edições <em>Enterprise</em> e <em>Ultimate do Windows 7</em>, porém, seguindo este tutorial, você também conseguirá alternar entre os idiomas nas edições <em>Professional</em> e <em>Home Premium</em>.</p>
<p>Primeiro você precisará do Vistalizator. Este aplicativo lhe permite instalar o suporte multi-idiomas em todas as versões do Windows 7 e, como ele é portável, não precisa de instalação. Você pode baixa-lo clicando <a href="http://www.froggie.sk/download.html" target="_blank">aqui</a>.</p>
<p>Depois baixe os idiomas para a arquitetura <a href="http://www.froggie.sk/7lp64rtm.html">x64 (64 bits)</a> ou <a href="http://www.froggie.sk/7lp32rtm.html">x86 (32 bits)</a>.</p>
<p>Agora execute o Vistalizator e clique em &#8220;Add languages&#8221;.</p>
<p><img class="aligncenter size-full wp-image-216" title="1" src="http://www.andrels.com/wp-pt_BR/wp-content/uploads/2010/05/1.jpg" alt="" width="450" height="309" /></p>
<p>Localize o arquivo com o idioma que deseja e clique em &#8220;Open&#8221;.</p>
<p>Aparecerá a mensagem abaixo, então clique em OK para prosseguir.</p>
<p><img class="aligncenter size-full wp-image-217" title="2" src="http://www.andrels.com/wp-pt_BR/wp-content/uploads/2010/05/2.jpg" alt="" width="376" height="199" /></p>
<p>Em seguida será aberta uma tela com os dados do arquivo e a descrição do idioma, então clique em &#8220;Install Language&#8221;.</p>
<p style="text-align: center;"><img class="aligncenter size-full wp-image-218" title="3" src="http://www.andrels.com/wp-pt_BR/wp-content/uploads/2010/05/3.jpg" alt="" width="450" height="205" /></p>
<p>Aguarde e processo de extração e instalação.</p>
<p><img class="aligncenter size-full wp-image-219" title="4" src="http://www.andrels.com/wp-pt_BR/wp-content/uploads/2010/05/41.jpg" alt="" width="450" height="103" /></p>
<p>O Vistalizator exibirá os idiomas instalados na sua máquina e, entre eles, estará o idioma que você escolheu. Selecione-o e clique em &#8220;Change language&#8221;.</p>
<p><img class="aligncenter size-full wp-image-220" title="5" src="http://www.andrels.com/wp-pt_BR/wp-content/uploads/2010/05/5.jpg" alt="" width="450" height="309" /></p>
<p>Reinicie o sistema e <em>voilá</em>. <img src='http://www.andrels.com/wp-pt_BR/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>Agora você tem um Windows 7 com suporte multi-idioma.</p>
<p>A única coisa ruim que pude perceber até agora é que toda vez que quiser alternar entre os idiomas você precisará usar o Vistalizator, devido as edições <em>Professional</em> e <em>Home Premium</em> não ter esta opção habilitada por padrão.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.andrels.com/wp-pt_BR/index.php/2010/05/instalando-suporte-multi-idioma-nos-windows-7-professional-e-home-premium/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Solucionando problemas com remoção de HD externo no Windows 7</title>
		<link>http://www.andrels.com/wp-pt_BR/index.php/2010/05/slucionando-problemas-com-remocao-de-hd-externo-no-windows-7/#utm_source=feed&#038;utm_medium=feed&#038;utm_campaign=feed</link>
		<comments>http://www.andrels.com/wp-pt_BR/index.php/2010/05/slucionando-problemas-com-remocao-de-hd-externo-no-windows-7/#comments</comments>
		<pubDate>Mon, 03 May 2010 02:17:22 +0000</pubDate>
		<dc:creator>André</dc:creator>
				<category><![CDATA[Configurações]]></category>
		<category><![CDATA[Sistemas Operacionais]]></category>
		<category><![CDATA[Tutoriais]]></category>
		<category><![CDATA[armazenamento]]></category>
		<category><![CDATA[hd]]></category>
		<category><![CDATA[windows]]></category>
		<category><![CDATA[windows 7]]></category>

		<guid isPermaLink="false">http://www.andrels.com/wp-pt_BR/?p=204</guid>
		<description><![CDATA[Algumas vezes tive problemas quando removia meu HD externo usando o Assistente de Remoção de Dispositivos do Windows 7, o<a href="http://www.andrels.com/wp-pt_BR/index.php/2010/05/slucionando-problemas-com-remocao-de-hd-externo-no-windows-7/" class="searchmore">Read the Rest...</a><div class="clr"></div>]]></description>
			<content:encoded><![CDATA[<p>Algumas vezes tive problemas quando removia meu HD externo usando o <em>Assistente de Remoção de Dispositivos</em> do <em>Windows 7</em>, o mais comum deles era o famoso &#8220;Este dispositivo está sendo usado no momento. Feche os programas ou janelas&#8230;&#8221;. Esta mensagem aparecia mesmo com todos os programas fechados.</p>
<p>Depois de checar as configurações do Windows, seus processos e serviços, constatei que o problema estava no serviço &#8220;Serviço de compartilhamento de Rede do Windows Media Player&#8221;, que me obrigava para-lo antes de remover o dispositivo.</p>
<p>Ainda sim, esta solução não me parecia correta, então encontrei a mais adequada. Segue:</p>
<p>O serviço &#8220;Serviço de compartilhamento de Rede do Windows Media Player&#8221; é responsável por compartilhar seus arquivos de mídia (músicas e vídeos) em sua rede ou internet (como seu próprio nome já diz). Esta configuração é padrão da instalação do Windows 7, então para desabilitar o recurso&#8230;</p>
<p style="text-align: left;">Clique em &#8220;Iniciar&#8221;, na caixa de pesquisa digite &#8220;Central de rede e Compartilhamento&#8221; e selecione o aplicativo, conforme é exibido na imagem acima</p>
<p style="text-align: left;"><img class="size-full wp-image-206   aligncenter" style="margin-top: 5px; margin-bottom: 5px;" src="http://www.andrels.com/wp-pt_BR/wp-content/uploads/2010/05/1.gif" alt="" width="376" height="500" /></p>
<p style="text-align: left;">Clique na opção &#8220;Escolher opções de grupo doméstico e de compartilhamento&#8221;</p>
<p style="text-align: center;"><img class="size-full wp-image-207    aligncenter" style="margin-top: 5px; margin-bottom: 5px;" src="http://www.andrels.com/wp-pt_BR/wp-content/uploads/2010/05/2.png" alt="" width="450" height="333" /></p>
<p style="text-align: left;">Agora clique em &#8220;Escolha opções de streaming de mídia&#8230;&#8221;</p>
<p style="text-align: center;"><img class="size-full wp-image-208  aligncenter" style="margin-top: 5px; margin-bottom: 5px;" src="http://www.andrels.com/wp-pt_BR/wp-content/uploads/2010/05/3.gif" alt="" width="450" height="266" /></p>
<p style="text-align: left;">Altere a opção do item &#8220;Programas de mídia neste PC e conexões remotas&#8221; para &#8220;Bloqueado&#8221;</p>
<p style="text-align: center;"><img class="size-full wp-image-209  aligncenter" style="margin-top: 5px; margin-bottom: 5px;" title="4" src="http://www.andrels.com/wp-pt_BR/wp-content/uploads/2010/05/4.jpg" alt="" width="450" height="159" /></p>
<p style="text-align: left;">Pronto, a partir de agora você poderá remover seu HD externo ou qualquer outro dispositivo de armazenamento removível sem problemas.</p>
<p style="text-align: left;"> <img src='http://www.andrels.com/wp-pt_BR/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.andrels.com/wp-pt_BR/index.php/2010/05/slucionando-problemas-com-remocao-de-hd-externo-no-windows-7/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Habilitando a barra do Windows Media Player na barra de tarefas do Windows 7</title>
		<link>http://www.andrels.com/wp-pt_BR/index.php/2010/04/habilitando-a-barra-do-windows-media-player-na-barra-de-tarefas-do-windows-7/#utm_source=feed&#038;utm_medium=feed&#038;utm_campaign=feed</link>
		<comments>http://www.andrels.com/wp-pt_BR/index.php/2010/04/habilitando-a-barra-do-windows-media-player-na-barra-de-tarefas-do-windows-7/#comments</comments>
		<pubDate>Wed, 21 Apr 2010 15:34:33 +0000</pubDate>
		<dc:creator>André</dc:creator>
				<category><![CDATA[Configurações]]></category>
		<category><![CDATA[Sistemas Operacionais]]></category>
		<category><![CDATA[Softwares]]></category>
		<category><![CDATA[Tutoriais]]></category>
		<category><![CDATA[barra de tarefas]]></category>
		<category><![CDATA[windows 7]]></category>
		<category><![CDATA[windows media player]]></category>
		<category><![CDATA[windows vista]]></category>
		<category><![CDATA[wmpband.dll]]></category>

		<guid isPermaLink="false">http://www.andrels.com/wp-pt_BR/?p=189</guid>
		<description><![CDATA[Infelizmente o Windows Media Player 12, que é instalado junto com o Windows 7, não tem suporte para minimizá-lo como<a href="http://www.andrels.com/wp-pt_BR/index.php/2010/04/habilitando-a-barra-do-windows-media-player-na-barra-de-tarefas-do-windows-7/" class="searchmore">Read the Rest...</a><div class="clr"></div>]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">Infelizmente o Windows Media Player 12, que é instalado junto com o Windows 7, não tem suporte para minimizá-lo como barra de ferramentas da barra de tarefas. Para habilitar a barra, apenas copie um aquivo do Windows Media Player que vem com o Windows Vista. Agora mostrarei como fazer:</p>
<p style="text-align: justify;"><strong>1. </strong>Você precisará da <em>dll</em> <strong>wmpband.dll</strong>, que vem com o Windows Vista. Se não tiver, faça o download <a href="http://www.andrels.com/wp-pt_BR/wp-content/plugins/download-monitor/download.php?id=4" title="clicado 1411 vezes">aqui</a> (contém a dll para 32 e 64 bits);</p>
<p style="text-align: justify;"><strong>2. </strong>Copie o arquivo (32 ou 64 bits, dependendo do seu Windows) para o diretório onde está instalado o Windows Media Player, no meu caso &#8220;<strong>C:\Program Files\Windows Media Player</strong>&#8220;;</p>
<p style="text-align: justify;"><strong>3. </strong>Agora verifique se o serviço &#8220;<strong>Serviço de Compartilhamento de rede do Windows Media Player</strong>&#8221; (&#8220;<strong>Windows Media Player Network Sharing Service</strong>&#8221; para Windows em inglês) está parado. Para isso clique no menu Iniciar e, na caixa de busca, digite &#8220;Serviços&#8221; (ou &#8220;Services&#8221; para Windows em Inglês) e clique no respectivo item da lista. Agora localize o serviço e pare-o, caso esteja rodando.<a href="http://www.andrels.com/wp-pt_BR/wp-content/uploads/2010/04/Snap3.jpg#utm_source=feed&amp;utm_medium=feed&amp;utm_campaign=feed"><img class="aligncenter size-full wp-image-193" style="margin-top: 5px; margin-bottom: 5px;" title="Snap3" src="http://www.andrels.com/wp-pt_BR/wp-content/uploads/2010/04/Snap3.jpg" alt="" width="482" height="429" /></a></p>
<p style="text-align: justify;"><strong>4. </strong>Abra o prompt de comando em modo administrador. Iniciar &gt; Todos os Programas &gt; Acessórios &gt; clique com o botão direito em &#8220;Prompt de Comando&#8221; e clique em &#8220;Executar como Administrador&#8221;.</p>
<p style="text-align: justify;"><strong>5. </strong>Digite o comando <strong>regsvr32</strong> &#8220;<strong>C:\Program Files\Windows Media Player\wmpband.dll</strong>&#8220;, substituia o caminho para o local onde o arquivo foi copiado. Espere alguns segundos até aparecer a mensagem:<a href="http://www.andrels.com/wp-pt_BR/wp-content/uploads/2010/04/5.jpg#utm_source=feed&amp;utm_medium=feed&amp;utm_campaign=feed"><img class="aligncenter size-full wp-image-191" style="margin-top: 5px; margin-bottom: 5px;" title="5" src="http://www.andrels.com/wp-pt_BR/wp-content/uploads/2010/04/5.jpg" alt="" width="365" height="138" /></a><strong> </strong></p>
<p><strong>6. </strong>Abra o Windows Media Player e então o minimize-o. Depois clique com o botão direito na barra de tarefas &gt; Barra de Ferramentas &gt; Windows Media Player.<a href="http://www.andrels.com/wp-pt_BR/wp-content/uploads/2010/04/4545456.png#utm_source=feed&amp;utm_medium=feed&amp;utm_campaign=feed"><img class="aligncenter size-full wp-image-194" title="4545456" src="http://www.andrels.com/wp-pt_BR/wp-content/uploads/2010/04/4545456.png" alt="" width="509" height="218" /></a></p>
<p><strong>7.</strong> E <em>voilá</em>! <a href="http://www.andrels.com/wp-pt_BR/wp-content/uploads/2010/04/45454561.png#utm_source=feed&amp;utm_medium=feed&amp;utm_campaign=feed"><img class="size-full wp-image-195 alignnone" title="4545456" src="http://www.andrels.com/wp-pt_BR/wp-content/uploads/2010/04/45454561.png" alt="" width="321" height="45" /></a></p>
<p>Esta característica a Microsoft devia ter mantido nativamente, muita gente que conheço usa este recurso. Só lamentos <em>uncle </em>Bill!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.andrels.com/wp-pt_BR/index.php/2010/04/habilitando-a-barra-do-windows-media-player-na-barra-de-tarefas-do-windows-7/feed/</wfw:commentRss>
		<slash:comments>13</slash:comments>
		</item>
		<item>
		<title>Configurando acesso à internet via proxy em aplicações Java</title>
		<link>http://www.andrels.com/wp-pt_BR/index.php/2010/03/configurando-acesso-a-internet-via-proxy-em-aplicacoes-java/#utm_source=feed&#038;utm_medium=feed&#038;utm_campaign=feed</link>
		<comments>http://www.andrels.com/wp-pt_BR/index.php/2010/03/configurando-acesso-a-internet-via-proxy-em-aplicacoes-java/#comments</comments>
		<pubDate>Wed, 24 Mar 2010 01:35:42 +0000</pubDate>
		<dc:creator>André</dc:creator>
				<category><![CDATA[Desenvolvimento]]></category>
		<category><![CDATA[Dicas rápidas]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Tutoriais]]></category>
		<category><![CDATA[internet]]></category>
		<category><![CDATA[prompt]]></category>
		<category><![CDATA[proxy]]></category>

		<guid isPermaLink="false">http://www.andrels.com/wp-pt_BR/?p=186</guid>
		<description><![CDATA[Hoje tive um problema no meu trabalho onde um client, que roda via prompt de comando (Prompt do DOS), não<a href="http://www.andrels.com/wp-pt_BR/index.php/2010/03/configurando-acesso-a-internet-via-proxy-em-aplicacoes-java/" class="searchmore">Read the Rest...</a><div class="clr"></div>]]></description>
			<content:encoded><![CDATA[<p>Hoje tive um problema no meu trabalho onde um client, que roda via prompt de comando (Prompt do DOS), não conseguia acessar o servidor hospedado na internet, isso porque a empresa onde trabalho utiliza proxy.</p>
<p>Depois de algumas tentativas acabei achando duas soluções para resolver o problema de acesso: a primeira foi passar como parâmetros <em>Java</em> as configurações do proxy.</p>
<pre class="brush:shell">$ java -Dhttp.proxyHost=serv -Dhttp.proxyPort=porta -Dhttp.proxyUser=usu -Dhttp.proxyPassword=senha ClasseJava
</pre>
<p><strong>-Dhttp.proxyHost</strong> = IP ou nome do servidor proxy<br />
<strong>-Dhttp.proxyPort</strong> = Porta do proxy<br />
<strong>-Dhttp.proxyUser</strong> = Usuário<br />
<strong>-Dhttp.proxyPassword</strong> = Senha</p>
<p>Desta forma a classe <i>ClasseJava</i> terá acesso à internet através do proxy.</p>
<p>A outra forma foi inserir as configurações na própria classe:</p>
<pre class="brush:java">
public static void main(String[] args){
...
System.getProperties().put("proxySet", "true");
System.getProperties().put("http.proxyHost", "serv");
System.getProperties().put("http.proxyPort", "porta");
System.getProperties().put("http.proxyUser", "usuario");
System.getProperties().put("http.proxyPassword", "senha");
...
}
</pre>
<p><strong>proxySet</strong> = Define se passará ou não por um servidor proxy<br />
<strong>http.proxyHost</strong> = IP ou nome do servidor proxy<br />
<strong>http.proxyPortt</strong> = Porta do proxy<br />
<strong>http.proxyUse</strong> = Usuário<br />
<strong>http.proxyPassword</strong> = Senha</p>
<p>Usando um destes recursos você poderá configurar sua aplicação para acessar à internet através de um proxy.</p>
<p>Espero ter ajudado. Até +! <img src='http://www.andrels.com/wp-pt_BR/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.andrels.com/wp-pt_BR/index.php/2010/03/configurando-acesso-a-internet-via-proxy-em-aplicacoes-java/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Playlist do Amarok pára após tocar uma música</title>
		<link>http://www.andrels.com/wp-pt_BR/index.php/2010/03/playlist-do-amarok-para-apos-tocar-uma-musica/#utm_source=feed&#038;utm_medium=feed&#038;utm_campaign=feed</link>
		<comments>http://www.andrels.com/wp-pt_BR/index.php/2010/03/playlist-do-amarok-para-apos-tocar-uma-musica/#comments</comments>
		<pubDate>Wed, 17 Mar 2010 01:52:05 +0000</pubDate>
		<dc:creator>André</dc:creator>
				<category><![CDATA[Configurações]]></category>
		<category><![CDATA[Dicas rápidas]]></category>
		<category><![CDATA[Softwares]]></category>
		<category><![CDATA[amarok]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[playlist]]></category>

		<guid isPermaLink="false">http://www.andrels.com/wp-pt_BR/?p=180</guid>
		<description><![CDATA[Recentemente enfrentei um problema que vários outros usuários do Amarok 2.1.1 vêm enfrentando: O Amarok só toca uma música do<a href="http://www.andrels.com/wp-pt_BR/index.php/2010/03/playlist-do-amarok-para-apos-tocar-uma-musica/" class="searchmore">Read the Rest...</a><div class="clr"></div>]]></description>
			<content:encoded><![CDATA[<p>Recentemente enfrentei um problema que vários outros usuários do Amarok 2.1.1 vêm enfrentando: O Amarok só toca uma música do playlist e depois pára.</p>
<p>Para resolver este problema: Feche o Amarok, delete o arquivo <strong> ~/.kde/share/apps/amarok/current.xspf </strong>e então reinicie o Amarok.</p>
<p>Pelo menos comigo funcionou e espero que funcione com todos! <img src='http://www.andrels.com/wp-pt_BR/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>Até +.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.andrels.com/wp-pt_BR/index.php/2010/03/playlist-do-amarok-para-apos-tocar-uma-musica/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Criando janelas transparentes e com formas usando Java Swing/AWT</title>
		<link>http://www.andrels.com/wp-pt_BR/index.php/2010/03/criando-janelas-transparentes-e-com-formas-usando-java-swingawt-2/#utm_source=feed&#038;utm_medium=feed&#038;utm_campaign=feed</link>
		<comments>http://www.andrels.com/wp-pt_BR/index.php/2010/03/criando-janelas-transparentes-e-com-formas-usando-java-swingawt-2/#comments</comments>
		<pubDate>Tue, 16 Mar 2010 22:40:50 +0000</pubDate>
		<dc:creator>André</dc:creator>
				<category><![CDATA[Desenvolvimento]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Tutoriais]]></category>
		<category><![CDATA[awt]]></category>
		<category><![CDATA[janela]]></category>
		<category><![CDATA[jframe]]></category>
		<category><![CDATA[swing]]></category>
		<category><![CDATA[transparencia]]></category>

		<guid isPermaLink="false">http://www.andrels.com/wp-pt_BR/?p=168</guid>
		<description><![CDATA[O AWT nos oferece uma gama de possibilidades quando falamos sobre manipulação de janelas. Hoje falarei sobre duas destas possibilidades<a href="http://www.andrels.com/wp-pt_BR/index.php/2010/03/criando-janelas-transparentes-e-com-formas-usando-java-swingawt-2/" class="searchmore">Read the Rest...</a><div class="clr"></div>]]></description>
			<content:encoded><![CDATA[<p>O AWT nos oferece uma gama de possibilidades quando falamos sobre manipulação de janelas. Hoje falarei sobre duas destas possibilidades com a classe AWTUtilities.</p>
<h3></h3>
<h3><strong>Deixando a janela transparente</strong></h3>
<p>Para deixar uma <strong>Window</strong> (JFrame, JDialog e etc) transparente,  você deve usar o método <strong>AWTUtilities.setWindowOpacity</strong>. Este método recebe como parâmetro a janela que deve ser alterada e o grau de transparência, que varia entre 0 (zero) e 1, sendo 0 (zero) invisível e 1 totalmente visível.</p>
<pre class="brush:java">JFrame  window = new JFrame("Minha janela");

//70% de transparência
AWTUtilities.setWindowOpacity(window, .7f);
window.setSize(800,600);
window.setVisible(true);
</pre>
<p>O resultado será:<a href="http://www.andrels.com/wp-pt_BR/wp-content/uploads/2010/03/2.jpg#utm_source=feed&amp;utm_medium=feed&amp;utm_campaign=feed"><img class="aligncenter size-full wp-image-174" title="2" src="http://www.andrels.com/wp-pt_BR/wp-content/uploads/2010/03/2.jpg" alt="" width="480" height="368" /></a></p>
<h3><strong>Alterando a forma da janela</strong></h3>
<p>Para alterar a forma da janela você deve usar o método <strong>AWTUtilities.setWindowShape</strong>. Este método recebe como parâmetro a janela que deve ser alterada e a forma (java.awt.Shape) que a janela deverá assumir.</p>
<p>A forma mais eficiente de usar este método é através do <em>componentResized()</em>, pois você poderá recalcular o tamanho da janela para não deforma-la ou não perder os componentes de vista.</p>
<p>Aqui deixaremos nossa janela com a forma de um triângulo com 70% de transparência.</p>
<pre class="brush:java">final JFrame  window = new JFrame("Minha janela");

try {
	//Adicionando o ComponentListener responsável pelo componentResized
	window.addComponentListener(new ComponentAdapter(){
		@Override
		//implementando o método componentResized
		public void componentResized(ComponentEvent e) {
			int[] x = {0,400,800}; //Pontos X do polígono
			int[] y = {600,0,600}; //Pontos Y do polígono

			//Criaremos um triângulo de 800 x 600
			Shape shape = new Polygon(x, y, 3);

			AWTUtilities.setWindowShape(window, shape);

			//com transparência de 70%
			AWTUtilities.setWindowOpacity(window, 0.7f);
		}
	});
} catch (SecurityException e) {
	// TODO Auto-generated catch block
	e.printStackTrace();
} catch (IllegalArgumentException e) {
	// TODO Auto-generated catch block
	e.printStackTrace();
}

window.setUndecorated(true); //removendo barra de título
window.setSize(800,600);
window.setVisible(true);
</pre>
<p>Repare que invoquei o método <strong><em>setUndecorated( )</em></strong> passando o valor <em>true</em>, este método é responsável por ocultar a barra de título (aquele com o ícone e os botões de maximizar, minimizar e fechar) que, se estiver visível, o método <em>AWTUtilities.setWindowShape( </em>) não surtirá efeito.</p>
<p>O resultado:<a href="http://www.andrels.com/wp-pt_BR/wp-content/uploads/2010/03/1.jpg#utm_source=feed&amp;utm_medium=feed&amp;utm_campaign=feed"><img class="aligncenter size-full wp-image-175" title="1" src="http://www.andrels.com/wp-pt_BR/wp-content/uploads/2010/03/1.jpg" alt="" width="480" height="365" /></a></p>
<p>Espero que tenham gostado e até a próxima!</p>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 618px; width: 1px; height: 1px; overflow: hidden;">
<pre class="brush:java">//Pontos X do polígono</pre>
</div>
]]></content:encoded>
			<wfw:commentRss>http://www.andrels.com/wp-pt_BR/index.php/2010/03/criando-janelas-transparentes-e-com-formas-usando-java-swingawt-2/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Inserindo arquivos em campos BLOB de uma base de dados</title>
		<link>http://www.andrels.com/wp-pt_BR/index.php/2010/02/inserindo-arquivos-em-campos-blob-de-uma-base-de-dados/#utm_source=feed&#038;utm_medium=feed&#038;utm_campaign=feed</link>
		<comments>http://www.andrels.com/wp-pt_BR/index.php/2010/02/inserindo-arquivos-em-campos-blob-de-uma-base-de-dados/#comments</comments>
		<pubDate>Mon, 22 Feb 2010 16:39:03 +0000</pubDate>
		<dc:creator>André</dc:creator>
				<category><![CDATA[Desenvolvimento]]></category>
		<category><![CDATA[Dicas rápidas]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Tutoriais]]></category>
		<category><![CDATA[arquivo]]></category>
		<category><![CDATA[blob]]></category>
		<category><![CDATA[jdbc]]></category>
		<category><![CDATA[Oracle]]></category>

		<guid isPermaLink="false">http://www.andrels.com/wp-pt_BR/?p=157</guid>
		<description><![CDATA[Para inserir um arquivo, seja ele de qualquer formato, é necessário utilizar o método setBinaryStream implementado pelo PreparedStatement. PreparedStatemente.setBinaryStream(int índice,<a href="http://www.andrels.com/wp-pt_BR/index.php/2010/02/inserindo-arquivos-em-campos-blob-de-uma-base-de-dados/" class="searchmore">Read the Rest...</a><div class="clr"></div>]]></description>
			<content:encoded><![CDATA[<p>Para inserir um arquivo, seja ele de qualquer formato, é necessário utilizar o método <em>setBinaryStream</em> implementado pelo PreparedStatement.</p>
<pre class="brush:java">
PreparedStatemente.setBinaryStream(int índice, Inputstream is, int tamanho);
</pre>
<p>Para o exemplo definimos uma tabela chamada <i>arquivo</i> que contém um campo <b>BLOB</b> chamado <i>ARQ</i>.</p>
<pre class="brush:java">
//Conexão normal, como qualquer JDBC
Class.forName("oracle.jdbc.driver.OracleDriver");
Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@&lt;IP&gt;:&lt;PORTA&gt;:&lt;SID>","&lt;USUARIO&gt;","&lt;SENHA&gt;");

//Acessando o arquivo a ser enviado e recuperando um InputStream
File arquivo = new File("&lt;CAMINHO_COMPLETO_DO_ARQUIVO&gt;");
FileInputStream fis = new FileInputStream(arquivo);

//Preparando a chamada normalmente
PreparedStatement ps = conn.prepareStatement("INSERT INTO ARQUIVO (arq) VALUES(?)");

//Informando o inputstream e o tamanho do arquivo a ser enviado
ps.setBinaryStream(1, fis, (int)arquivo.length());

ps.execute();

ps.close();
conn.close();
</pre>
<p>No meu teste utilizei a base de dados Oracle 8i. Como não tenho à disposição uma base MySQL/PostgreSQL/MS SQL Server, deixo vocês encarregados de testar e me enviar os resultados, OK? <img src='http://www.andrels.com/wp-pt_BR/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>[]&#8216;s e até a próxima!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.andrels.com/wp-pt_BR/index.php/2010/02/inserindo-arquivos-em-campos-blob-de-uma-base-de-dados/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Recuperando cursor de uma procedure do Oracle no Java</title>
		<link>http://www.andrels.com/wp-pt_BR/index.php/2010/01/recuperando-cursor-de-uma-procedure-do-oracle-no-java/#utm_source=feed&#038;utm_medium=feed&#038;utm_campaign=feed</link>
		<comments>http://www.andrels.com/wp-pt_BR/index.php/2010/01/recuperando-cursor-de-uma-procedure-do-oracle-no-java/#comments</comments>
		<pubDate>Mon, 18 Jan 2010 01:07:32 +0000</pubDate>
		<dc:creator>André</dc:creator>
				<category><![CDATA[Desenvolvimento]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Oracle]]></category>
		<category><![CDATA[Tutoriais]]></category>

		<guid isPermaLink="false">http://www.andrels.com/wp-pt_BR/?p=145</guid>
		<description><![CDATA[Percebi que muitas pessoas acabam chegando aqui pesquisando uma forma de recuperar cursores através de procedures do Oracle, para estas<a href="http://www.andrels.com/wp-pt_BR/index.php/2010/01/recuperando-cursor-de-uma-procedure-do-oracle-no-java/" class="searchmore">Read the Rest...</a><div class="clr"></div>]]></description>
			<content:encoded><![CDATA[<p>Percebi que muitas pessoas acabam chegando aqui pesquisando uma forma de recuperar cursores através de <em>procedures</em> do Oracle, para estas pessoas eu coloco à disposição uma maneira de fazê-lo.</p>
<p>Para que o cursor possa ser retornado é preciso declara-lo como <em>REF CURSOR</em> no <em>spec</em> da <em>Package</em>.</p>
<pre class="brush:sql">  --Criando o tipo REF CURSOR que será o cursor
  type g_cursor is ref cursor;</pre>
<p>Em ambos, <em>spec</em> e <em>body</em>, você precisa declarar uma variável <em>out</em> do tipo do <em>REF CURSOR</em> mencionado acima.</p>
<pre class="brush:sql">  procedure PRO_RETORNA_LISTA_CARROS(
    i_id     in     tbl_car.car_id%type,
    o_cursor in out g_cursor);</pre>
<p>Para devolver o cursor com os resultados (caso haja), é necessário abri-lo no <em>body</em> da <em>procedure</em>, desta forma:</p>
<pre class="brush:sql">open o_cursor for
          select car_id, company, model, color, hp, price
          from tbl_car
          where car_id = i_id;</pre>
<p>A <em>Package</em> completa ficará assim:</p>
<pre class="brush:sql">create or replace package PAC_CURSOR is
  --Criando o tipo REF CURSOR que será o cursor
  type g_cursor is ref cursor;

  --Procedure que retornará o cursor
  procedure PRO_RETORNA_LISTA_CARROS(
    i_id     in     tbl_car.car_id%type,
    o_cursor in out g_cursor); -- Nosso cursor

end PAC_CURSOR;
/

create or replace package body PAC_CURSOR is
  procedure PRO_RETORNA_LISTA_CARROS(
    i_id     in     tbl_car.car_id%type,
    o_cursor in out g_cursor) is

       begin
        --Abrindo o cursor para retornar os valores
        open o_cursor for
          select car_id, company, model, color, hp, price
          from tbl_car
          where car_id = i_id;

  end PRO_RETORNA_LISTA_CARROS;

end PAC_CURSOR;</pre>
<p>Temos o lado do Oracle pronto, agora precisamos tratar a chamada no Java.</p>
<p>Como o cursor está sendo retornado por uma <em>procedure</em>, usaremos um <em>java.sql.CallableStatement</em>.</p>
<pre class="brush:java">CallableStatement cs = conn.prepareCall("{call PAC_CURSOR.PRO_RETORNA_LISTA_CARROS(?,?)}");</pre>
<p>O <em>registerOutParameter</em> receberá o tipo <em>oracle.jdbc.OracleTypes.CURSOR</em> e retornará um <em>java.sql.ResultSet</em>. Iteraremos o ResultSet do mesmo modo que iteramos um Iterator.<br />
Cada coluna retornada pelo <em>SELECT</em> será representado como um mapa, usando o <em>getter</em> correpondente. Por exemplo, chamaremos o método <em>getString(&lt;nome coluna&gt;)</em> quando retornar um <em>varchar</em>, <em>getDate(&lt;nome coluna&gt;)</em> quando retornar um <em>date</em> e etc.</p>
<p>O código completo fica assim:</p>
<pre class="brush:java">//Chamando o procedure
CallableStatement cs = conn.prepareCall("{call PAC_CURSOR.PRO_RETORNA_LISTA_CARROS(?,?)}");

//Definindo o tipo do retorno, no caso o cursor
cs.registerOutParameter("o_cursor", OracleTypes.CURSOR);
cs.setLong("i_id", id);

cs.execute();//Executando a chamada

//Recuperando o cursor como um Resultset
ResultSet rs = (ResultSet)cs.getObject("o_cursor");

//Iterando as linhas retornadas
while(rs.next()){
	//Obtendo o valor das colunas
	System.out.println("ID: " + rs.getLong("car_id"));
	System.out.println("Marca: " + rs.getString("company"));
	System.out.println("Modelo: " + rs.getString("model"));
	System.out.println("Cor: " + rs.getString("color"));
	System.out.println("HP: " + rs.getString("hp"));
	System.out.println("Preco: " + rs.getFloat("price"));
}</pre>
<p>No final você conseguirá obter qualquer valor retornado em um <em>SELECT</em>.</p>
<p>Até a próxima!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.andrels.com/wp-pt_BR/index.php/2010/01/recuperando-cursor-de-uma-procedure-do-oracle-no-java/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Habilitando Telnet e TFTP no Windows 7</title>
		<link>http://www.andrels.com/wp-pt_BR/index.php/2009/12/habilitando-telnet-e-tftp-no-windows-7/#utm_source=feed&#038;utm_medium=feed&#038;utm_campaign=feed</link>
		<comments>http://www.andrels.com/wp-pt_BR/index.php/2009/12/habilitando-telnet-e-tftp-no-windows-7/#comments</comments>
		<pubDate>Tue, 22 Dec 2009 13:18:50 +0000</pubDate>
		<dc:creator>André</dc:creator>
				<category><![CDATA[Configurações]]></category>
		<category><![CDATA[Dicas rápidas]]></category>
		<category><![CDATA[Sistemas Operacionais]]></category>
		<category><![CDATA[telnet]]></category>
		<category><![CDATA[tftp]]></category>
		<category><![CDATA[windows]]></category>

		<guid isPermaLink="false">http://www.andrels.com/wp-pt_BR/?p=141</guid>
		<description><![CDATA[Assim como o Windows Vista, o Windows 7 não vem com os clients do Telnet e do TFTP habilitado por<a href="http://www.andrels.com/wp-pt_BR/index.php/2009/12/habilitando-telnet-e-tftp-no-windows-7/" class="searchmore">Read the Rest...</a><div class="clr"></div>]]></description>
			<content:encoded><![CDATA[<p>Assim como o Windows Vista, o Windows 7 não vem com os <em>clients</em> do Telnet e do TFTP habilitado por padrão.</p>
<p>Para habilitá-lo clique em <em>Painel de Controle</em> ><em> Programas e Recursos</em> > na lateral esquerda clique em<em> Ativar ou desativar recursos do Windows</em> > habilite o Cliente Telnet e Cliente TFTP e então clique em OK.</p>
<p>Não testei no Windows Vista, mas o processo deve ser o mesmo.</p>
<p>Até mais!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.andrels.com/wp-pt_BR/index.php/2009/12/habilitando-telnet-e-tftp-no-windows-7/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Os comandos mais usados de Unix agora para Win32</title>
		<link>http://www.andrels.com/wp-pt_BR/index.php/2009/11/os-comandos-mais-usados-de-unix-agora-para-win32/#utm_source=feed&#038;utm_medium=feed&#038;utm_campaign=feed</link>
		<comments>http://www.andrels.com/wp-pt_BR/index.php/2009/11/os-comandos-mais-usados-de-unix-agora-para-win32/#comments</comments>
		<pubDate>Tue, 03 Nov 2009 21:11:30 +0000</pubDate>
		<dc:creator>André</dc:creator>
				<category><![CDATA[Dicas rápidas]]></category>
		<category><![CDATA[Sistemas Operacionais]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[unix]]></category>
		<category><![CDATA[windows]]></category>

		<guid isPermaLink="false">http://www.andrels.com/wp-pt_BR/?p=138</guid>
		<description><![CDATA[Já pensou rodar comandos como grep, chown, tail e su no Windows e ainda poder substituir o dir pelo ls?<a href="http://www.andrels.com/wp-pt_BR/index.php/2009/11/os-comandos-mais-usados-de-unix-agora-para-win32/" class="searchmore">Read the Rest...</a><div class="clr"></div>]]></description>
			<content:encoded><![CDATA[<p>Já pensou rodar comandos como <em>grep</em>, <em>chown</em>, <em>tail</em> e <em>su</em> no Windows e ainda poder substituir o <em>dir</em> pelo <em>ls</em>?</p>
<p>Procurando na internet por uma alternativa <em>Win32</em> para o comando <em>tail</em>, encontrei o UnixUtils. Uma compilação para Windows dos comandos mais utilizados no Linux/Unix.</p>
<p>Você pode fazer o download do ZIP pelo SourceForge clicando <a title="UnixUtils" href="http://sourceforge.net/projects/unxutils/" target="_blank">aqui</a>.</p>
<p>Até a próxima!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.andrels.com/wp-pt_BR/index.php/2009/11/os-comandos-mais-usados-de-unix-agora-para-win32/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Gerando &#8216;EXE&#8217; para iniciar suas aplicações Java</title>
		<link>http://www.andrels.com/wp-pt_BR/index.php/2009/10/gerando-exe-para-iniciar-suas-aplicacoes-java/#utm_source=feed&#038;utm_medium=feed&#038;utm_campaign=feed</link>
		<comments>http://www.andrels.com/wp-pt_BR/index.php/2009/10/gerando-exe-para-iniciar-suas-aplicacoes-java/#comments</comments>
		<pubDate>Wed, 28 Oct 2009 01:25:19 +0000</pubDate>
		<dc:creator>André</dc:creator>
				<category><![CDATA[Desenvolvimento]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Tutoriais]]></category>
		<category><![CDATA[exe]]></category>
		<category><![CDATA[jsmooth]]></category>
		<category><![CDATA[windows]]></category>

		<guid isPermaLink="false">http://www.andrels.com/wp-pt_BR/?p=117</guid>
		<description><![CDATA[Percebi que muitos desenvolvedores precisam, ou já precisaram, distribuir suas aplicações Java de forma que os usuários de Windows pudessem<a href="http://www.andrels.com/wp-pt_BR/index.php/2009/10/gerando-exe-para-iniciar-suas-aplicacoes-java/" class="searchmore">Read the Rest...</a><div class="clr"></div>]]></description>
			<content:encoded><![CDATA[<p>Percebi que muitos desenvolvedores precisam, ou já precisaram, distribuir suas aplicações Java de forma que os usuários de Windows pudessem iniciá-las naturalmente, sem a necessidade de chamar o comando <em>java -jar &lt;arquivo jar&gt;</em> ou executar um arquivo .BAT.</p>
<p>Eu, que também já passei por isso, encontrei um solução fácil e com muitos recursos: <a href="http://jsmooth.sourceforge.net/" target="_blank">JSmooth</a>.</p>
<p>Este programinha possibilita que você &#8220;transforme&#8221; seu JAR em um executável (EXE), mas claro, ainda sim você precisará ter o JVM instalado no micro que rodará o executável.</p>
<p>Aqui só destacarei as configurações que considero relevantes, então vamos ao que interessa!</p>
<hr />Baixe o JSmooth em <a href="http://sourceforge.net/projects/jsmooth/files/" target="_blank">http://sourceforge.net/projects/jsmooth/files/</a>;</p>
<p>Após instalá-lo (ou descompactá-lo, depende do arquivo que você baixou) execute-o;</p>
<p>No menu lateral, clique em &#8220;<em>Skeleton</em>&#8220;;</p>
<p style="text-align: center;"><a href="http://www.andrels.com/wp-pt_BR/wp-content/uploads/2009/10/1.jpg#utm_source=feed&amp;utm_medium=feed&amp;utm_campaign=feed"><img class="size-full wp-image-119 aligncenter" title="1" src="http://www.andrels.com/wp-pt_BR/wp-content/uploads/2009/10/1.jpg" alt="1" width="524" height="364" /></a></p>
<p>No &#8220;<em>Skeleton Selection</em>&#8221; você informa como a aplicação será executada, aqui selecionaremos <em>Window Wrapper</em>.</p>
<p>No &#8220;<em>Skeleton Properties</em>&#8221; você define uma mensagem caso o usuário não tenha o JVM instalador (<em>Message</em>) e onde ele poderá baixá-lo (<em>URL</em>).</p>
<p>&#8220;<em>Launch java app in the exe process</em>&#8221; indica se o JAR será executado no mesmo processo do EXE, aparecendo somente o executável no Gerenciador de Tarefas do Windows, caso contrário também será o processo <em>javaw.exe</em>.</p>
<p>&#8220;<em>Single Instance&#8221; </em>define se você ser aberto mais de uma instância.</p>
<p>&#8220;<em>Debug Console</em>&#8221; executa o EXE em uma janela do prompt de comando, exibindo os possíveis <em>Stacktraces </em>gerados pela aplicação.</p>
<p>Agora clique em &#8220;<em>Executable</em>&#8221;</p>
<p style="text-align: center;"><a href="http://www.andrels.com/wp-pt_BR/wp-content/uploads/2009/10/2.jpg#utm_source=feed&amp;utm_medium=feed&amp;utm_campaign=feed"><img class="aligncenter size-full wp-image-120" title="2" src="http://www.andrels.com/wp-pt_BR/wp-content/uploads/2009/10/2.jpg" alt="2" width="524" height="364" /></a></p>
<p>Em &#8220;<em>Executable Settings</em>&#8221; você informa onde o EXE será gerado (&#8220;<em>Executable Binary</em>&#8220;), o ícone do EXE (&#8220;<em>Executable Icon</em>&#8220;) e qual será o diretório de execução da aplicação.</p>
<p>Clique em &#8220;<em>Application</em>&#8221;</p>
<p style="text-align: center;"><a href="http://www.andrels.com/wp-pt_BR/wp-content/uploads/2009/10/3.jpg#utm_source=feed&amp;utm_medium=feed&amp;utm_campaign=feed"><img class="aligncenter size-full wp-image-121" title="3" src="http://www.andrels.com/wp-pt_BR/wp-content/uploads/2009/10/3.jpg" alt="3" width="524" height="364" /></a></p>
<p>Primeiro, clique no ícone <img class="size-full wp-image-125 alignnone" title="7" src="http://www.andrels.com/wp-pt_BR/wp-content/uploads/2009/10/7.jpg" alt="7" width="50" height="27" /> e selecione o JAR que contém a classe principal (que contém o método <em>main</em>).</p>
<p>Em seguida, selecione a classe no campo &#8220;<em>Main Class</em>&#8221; clicando no botão <img class="alignnone size-full wp-image-126" title="8" src="http://www.andrels.com/wp-pt_BR/wp-content/uploads/2009/10/8.jpg" alt="8" width="39" height="20" />.</p>
<p>O campo &#8220;<em>Application arguments</em>&#8221; você passa os parâmetros necessário para a sua classe.</p>
<p>&#8220;<em>Embedded JAR</em>&#8221; possibilita que você integre seu JAR no EXE, ou seja, não será necessário ter os dois arquivos, pois o EXE descompactará o JAR a cada execução.</p>
<p>Agora, clique em &#8220;<em>JVM Selection</em>&#8220;.</p>
<p style="text-align: center;"><a href="http://www.andrels.com/wp-pt_BR/wp-content/uploads/2009/10/4.jpg#utm_source=feed&amp;utm_medium=feed&amp;utm_campaign=feed"><img class="aligncenter size-full wp-image-122" title="4" src="http://www.andrels.com/wp-pt_BR/wp-content/uploads/2009/10/4.jpg" alt="4" width="524" height="364" /></a></p>
<p>Aqui você pode definir qual versão, mínima (&#8220;<em>Minimum JVM Version</em>&#8220;) e máxima (&#8220;<em>Maximum JVM Version</em>&#8220;), da virtual machine  rodará sua aplicação.</p>
<p>O&#8221;<em>JVM Search Sequence</em>&#8221; indica a ordem de busca do arquivo <em>javaw</em>.<em>exe</em>, neste caso ele procurará primeiro no registro, depois no diretório informado na variável de ambiente &#8220;JAVA_HOME&#8221; e assim por diante.</p>
<p>E então clique em &#8220;<em>JVM Configuration</em>&#8221;</p>
<p style="text-align: center;"><a href="http://www.andrels.com/wp-pt_BR/wp-content/uploads/2009/10/5.jpg#utm_source=feed&amp;utm_medium=feed&amp;utm_campaign=feed"><img class="aligncenter size-full wp-image-123" title="5" src="http://www.andrels.com/wp-pt_BR/wp-content/uploads/2009/10/5.jpg" alt="5" width="524" height="364" /></a></p>
<p>Aqui você informa a quantidade máxima de memória que sua aplicação poderá usar (&#8220;<em>Maximum Memory</em>&#8220;), quanta memória será alocada para sua aplicação assim que ela iniciar (&#8220;<em>Initial Memory Allocation</em>&#8220;) e os argumentos que será passado à JVM para sua aplicação.</p>
<p>Até este ponto você somente configurou o JSmooth, mas ainda não temos o EXE. Para isso, clique no botão <img class="size-full wp-image-124 alignnone" title="6" src="http://www.andrels.com/wp-pt_BR/wp-content/uploads/2009/10/6.jpg" alt="6" width="32" height="30" />, caso você ainda não tenha salvo o projeto será aberta uma janela para escolher o local de salvamento do arquivo. Feito isso, o EXE será gerado no diretório indicado no campo &#8220;<em>Executable Binary</em>&#8221; da tela &#8220;<em>Executable</em>&#8220;.</p>
<p>Agora é só dar um duplo clique no arquivo EXE e aplicação iniciará!</p>
<p style="text-align: left;">
<p>Para mais informações acessem <a href="http://jsmooth.sourceforge.net/" target="_blank">http://jsmooth.sourceforge.net/</a></p>
<p style="text-align: left;">
<p style="text-align: left;">Espero que tenham gostado, comentem à vontade!</p>
<p style="text-align: left;">Até mais! <img src='http://www.andrels.com/wp-pt_BR/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.andrels.com/wp-pt_BR/index.php/2009/10/gerando-exe-para-iniciar-suas-aplicacoes-java/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Recuperando coleção de objetos de uma procedure Oracle</title>
		<link>http://www.andrels.com/wp-pt_BR/index.php/2009/09/recuperando-colecao-de-objetos-de-uma-procedure-oracle/#utm_source=feed&#038;utm_medium=feed&#038;utm_campaign=feed</link>
		<comments>http://www.andrels.com/wp-pt_BR/index.php/2009/09/recuperando-colecao-de-objetos-de-uma-procedure-oracle/#comments</comments>
		<pubDate>Mon, 21 Sep 2009 19:06:53 +0000</pubDate>
		<dc:creator>André</dc:creator>
				<category><![CDATA[Desenvolvimento]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Oracle]]></category>
		<category><![CDATA[Tutoriais]]></category>
		<category><![CDATA[collection]]></category>
		<category><![CDATA[jdbc]]></category>
		<category><![CDATA[sql]]></category>

		<guid isPermaLink="false">http://www.andrels.com/wp-pt_BR/?p=109</guid>
		<description><![CDATA[Como prometido há muito tempo atrás (e bota tempo nisso) no tópico &#8220;Passando Objetos Java para uma Procedure do Oracle&#8220;,<a href="http://www.andrels.com/wp-pt_BR/index.php/2009/09/recuperando-colecao-de-objetos-de-uma-procedure-oracle/" class="searchmore">Read the Rest...</a><div class="clr"></div>]]></description>
			<content:encoded><![CDATA[<p>Como prometido há muito tempo atrás (e bota tempo nisso) no tópico &#8220;<a href="http://www.andrels.com/wp-pt_BR/index.php/2009/05/passando-objetos-java-para-uma-procedure-do-oracle/#utm_source=feed&amp;utm_medium=feed&amp;utm_campaign=feed" target="_self">Passando Objetos Java para uma Procedure do Oracle</a>&#8220;, mostrarei como recuperar objetos <a href="http://java.sun.com/" target="_blank">Java</a> contendo uma coleção de outro objetos através de uma procedure do <a href="http://www.oracle.com/">Oracle</a>. Para quem não leu, é altamente recomendado ler o <a href="http://www.andrels.com/wp-pt_BR/index.php/2009/05/passando-objetos-java-para-uma-procedure-do-oracle/#utm_source=feed&amp;utm_medium=feed&amp;utm_campaign=feed" target="_self">post anterior</a>.</p>
<p>Para este tutorial, precisamos incluir a tabela TBL_CLASS e adicionar sua <em>primary key</em> como <em>foreign key</em> na TBL_USER.</p>
<pre class="brush:sql">--num class será a PK e o desc_class será a descrição
create table TBL_CLASS (num_class number, desc_class varchar(100));
alter table TBL_CLASS add primary key(num_class);

alter table TBL_USER add num_class number;
alter table TBL_USER add constraint FK_CLASS foreign key(num_class) references tbl_class(num_class);</pre>
<p>Agora precisamos incluir os novos tipos:</p>
<pre class="brush:sql">create or replace type class_type as object (num_class number, desc_class varchar2(100), users arr_users);
/
create or replace type arr_class as table of class_type;
/</pre>
<p>O tipo <em>class_type</em> será o objeto. Repare que na sua assinatura incluímos o tipo <em>arr_users</em>, que será nossa coleção de <em>user_type</em> (vide <a href="http://www.andrels.com/wp-pt_BR/index.php/2009/05/passando-objetos-java-para-uma-procedure-do-oracle/#utm_source=feed&amp;utm_medium=feed&amp;utm_campaign=feed" target="_self">post anterior</a>), o tipo <em>arr_class</em> será uma coleção de <em>class_type</em>.</p>
<p>Agora incluiremos a <em>procedure</em> responsável por retornar nossa coleção de <em>class_type</em>.</p>
<pre class="brush:sql">procedure pro_select_class(clas in class_type, class_return in out arr_class)is
  class_ref_cur ref_cur;
  --Coleção de classes
  classes arr_class := arr_class();

  begin
    open class_ref_cur for
      select cast(
                multiset(
                  select num_class,
                         desc_class,
                         (select cast(
                                  multiset(
                                    select user_name,
                                           height,
                                           b_date
                                    from tbl_user
                                    --Fazendo o JOIN com a TBL_USER
                                    where tbl_user.num_class = tbl_class.num_class
                                  ) as arr_users)
                          from dual) users
                  from tbl_class
                  --Usando o atributo num_class do parâmetro de entrada
                  where num_class = clas.num_class) as arr_class
      ) classes
    from dual;

    --incluindo ao retorno no array
    fetch class_ref_cur into classes;
    --passando o array para a variável out
    class_return := classes;
end pro_select_class;</pre>
<p>Repare que a <em>procedure</em> recebe o tipo <em>class_type</em> como parâmetro <em>in</em> e retorna o tipo <em>arr_class</em>.</p>
<p>Separando trecho responsável por resgatar e montar nossos objetos teremos:</p>
<pre class="brush:sql">
--Montará a coleção de retorno
select cast(
        multiset(

          --Retornará os objetos class_type e seus atributos
          select num_class,
                 desc_class,

                 --Populará a coleção com user_type
                 (select cast(
                          multiset(
                            select user_name,
                                   height,
                                   b_date
                            from tbl_user
                            where tbl_user.num_class = tbl_class.num_class
                          ) as arr_users)

                  from dual) users

          from tbl_class
          where num_class = clas.num_class) as arr_class
) classes
from dual;
</pre>
<p>Os objetos de banco estão prontos, agora para o Java!</p>
<p>Criaremos o objeto que será interpretado pelo Oracle. Vamos chamá-lo de TypeClass:</p>
<pre class="brush:java">
public class TypeClass implements SQLData{
	public static final String ORACLE_OBJECT_NAME = "CLASS_TYPE"; //Nome do tipo no Oracle
	public static final String ORACLE_CLASS_ARRAY_NAME = "ARR_CLASS"; //Nome do array no Oracle

        //campos criados na tabela TBL_CLASS
	private Long number;
	private String desc;
	private Array users; //Esta será a coleção de user_type (ou TypeUser no Java)

	public String getSQLTypeName() throws SQLException {
		return ORACLE_OBJECT_NAME;
	}

	public void readSQL(SQLInput stream, String typeName) throws SQLException {
		setNumber(stream.readLong());
		setDesc(stream.readString());
		setUsers(stream.readArray());//Usado pelo JDBC driver para ler a coleção
	}

	public void writeSQL(SQLOutput stream) throws SQLException {
		stream.writeLong(getNumber());
		stream.writeString(getDesc());
		stream.writeArray(getUsers());//Usado pelo JDBC driver para armazenar a coleção
	}
	//Getters e setters omitidos
}
</pre>
<p>Precisamos mapear os dois tipos já que ambos serão interpretados na requisição, desta forma:</p>
<pre class="brush:java">
Map<String, Class<?>> typeMaps = connection.getTypeMap();
typeMaps.put(TypeUser.ORACLE_OBJECT_NAME, TypeUser.class);
typeMaps.put(TypeClass.ORACLE_OBJECT_NAME, TypeClass.class);
</pre>
<p>Também precisaremos mapear os dois <em>arrays</em>:</p>
<pre class="brush:java">
typeMaps.put(TypeClass.ORACLE_CLASS_ARRAY_NAME, TypeClass[].class);//retornado pela procedure
typeMaps.put(TypeUser.ORACLE_USER_ARRAY_NAME, TypeUser[].class);//retornado pela coleção de class_type
</pre>
<p>Para a requisição faremos:</p>
<pre class="brush:java">
cs = conn.prepareCall("{call PAC_BEAN.PRO_SELECT_CLASS(?,?)}");
//registrando o tipo de saída, que será um array de TypeClass
cs.registerOutParameter("class_return", OracleTypes.ARRAY, TypeClass.ORACLE_CLASS_ARRAY_NAME);

//passando o objeto de parâmetros da query
cs.setObject("clas", classQry);

cs.execute();
//recuperando e iterando o array de TypeClass
Object[] array = (Object[])cs.getArray("class_return").getArray();

for(Object obj : array){
	TypeClass objClass = ((TypeClass)obj);

	System.out.println("Description: "+objClass.getDesc());

        //Aqui pegamos a coleção (ou array) de user_type(TypeUser) retornada pela query.
	Object[] userArray = (Object[])objClass.getUsers().getArray();
	for(Object user : userArray){
		System.out.println("\tName: " + ((TypeUser)user).getName());
		System.out.println("\tHeight: " + ((TypeUser)user).getHeight());
		System.out.println("\tBirth: " + sdf.format(((TypeUser)user).getBirth())+ "\r\n");
	}
}
</pre>
<p>O final você terá um TypeClass que contém um <a href="http://www.j2ee.me/j2se/1.4.2/docs/api/java/sql/class-use/Array.html" target="_blank">java.sql.Array</a> de TypeUser no atributo getUsers().</p>
<p>E aqui cumpro minha promessa. Baixe o código fonte com o exemplo contendo este e o post anterior <a href="http://www.andrels.com/wp-pt_BR/wp-content/plugins/download-monitor/download.php?id=3" title="clicado 186 vezes">aqui</a>.</p>
<p>Até a próxima!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.andrels.com/wp-pt_BR/index.php/2009/09/recuperando-colecao-de-objetos-de-uma-procedure-oracle/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Tirando Screen Shots com Java</title>
		<link>http://www.andrels.com/wp-pt_BR/index.php/2009/09/tirando-screen-shots-com-java/#utm_source=feed&#038;utm_medium=feed&#038;utm_campaign=feed</link>
		<comments>http://www.andrels.com/wp-pt_BR/index.php/2009/09/tirando-screen-shots-com-java/#comments</comments>
		<pubDate>Wed, 16 Sep 2009 22:35:57 +0000</pubDate>
		<dc:creator>André</dc:creator>
				<category><![CDATA[Desenvolvimento]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Tutoriais]]></category>
		<category><![CDATA[awt]]></category>
		<category><![CDATA[desktop]]></category>
		<category><![CDATA[image]]></category>

		<guid isPermaLink="false">http://www.andrels.com/wp-pt_BR/?p=101</guid>
		<description><![CDATA[Aqui mostrarei como fazer uma classe para tirar Screen shots . Estava pensando com quão complexo seria fazer uma classe<a href="http://www.andrels.com/wp-pt_BR/index.php/2009/09/tirando-screen-shots-com-java/" class="searchmore">Read the Rest...</a><div class="clr"></div>]]></description>
			<content:encoded><![CDATA[<p>Aqui mostrarei como fazer uma classe para tirar <em>Screen shots </em>.</p>
<p>Estava pensando com quão complexo seria fazer uma classe que tirasse <em>screen shots</em> do compulador local e o armazenasse em um arquivo. Perguntando ao tio &#8220;G&#8221; descobri a classe <a href="http://java.sun.com/j2se/1.4.2/docs/api/java/awt/Robot.html" target="_blank">Robot</a>, que possui o método <a href="http://java.sun.com/j2se/1.4.2/docs/api/java/awt/Robot.html#createScreenCapture(java.awt.Rectangle)" target="_blank">createScreenCapture</a>.</p>
<p>Agora mostrarei como implementar esta funcionalidade:</p>
<pre class="brush:java">Robot robot = new Robot();
//Definindo o retângulo que será a área de captura da tela que, neste caso, será a tela inteira.
Rectangle rect = new Rectangle(Toolkit.getDefaultToolkit().getScreenSize());

BufferedImage img = robot.createScreenCapture(rect);</pre>
<p>Aqui definimos a área de captura e obtivemos um <a href="http://java.sun.com/j2se/1.4.2/docs/api/java/awt/image/BufferedImage.html" target="_blank">BufferedImage</a>, que já é nossa imagem. Agora é só persisti-la no disco.</p>
<pre class="brush:java">//Capturando o ImageWriter e ImageWriterParam
ImageWriter writer = ImageIO.getImageWritersByFormatName("jpeg").next();
ImageWriteParam iwp = writer.getDefaultWriteParam();

//Definindo o modo de compressão e a qualidade
iwp.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
iwp.setCompressionQuality(1);

//Persistindo a imagem
writer.setOutput(new FileImageOutputStream(arquivo));

IIOImage iioimage = new IIOImage(img, null, null);

writer.write(null, iioimage, iwp);
writer.dispose();</pre>
<p>Aqui capturamos o <a href="http://java.sun.com/j2se/1.4.2/docs/api/javax/imageio/ImageWriter.html" target="_blank">ImageWriter</a> e <a href="http://java.sun.com/j2se/1.4.2/docs/api/javax/imageio/ImageWriteParam.html" target="_blank">ImageWriterParam</a> para configurar o método de compressão e a qualidade da imagem.</p>
<p>Na linha <strong>07</strong> definimos a qualidade como 1, onde o valor varia de 0 (zero), maior compressão e menor qualidade, até 1 (um), menor compressão e maior qualidade. Em seguida persistimos o arquivo no HD.</p>
<p>Pronto! Simples, não?!.</p>
<p>Faça o download do exemplo <a href="http://www.andrels.com/wp-pt_BR/wp-content/plugins/download-monitor/download.php?id=2" title="clicado 96 vezes">aqui</a>.</p>
<p>Até a próxima!</p>
<div id="_mcePaste" style="overflow: hidden; position: absolute; left: -10000px; top: 142px; width: 1px; height: 1px;">
<pre class="brush:java">Neste caso será a tela inteira.</pre>
</div>
]]></content:encoded>
			<wfw:commentRss>http://www.andrels.com/wp-pt_BR/index.php/2009/09/tirando-screen-shots-com-java/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Limitando número máximo de caracteres em um JTextField</title>
		<link>http://www.andrels.com/wp-pt_BR/index.php/2009/08/limitando-numero-maximo-de-caracteres-em-um-jtextfield/#utm_source=feed&#038;utm_medium=feed&#038;utm_campaign=feed</link>
		<comments>http://www.andrels.com/wp-pt_BR/index.php/2009/08/limitando-numero-maximo-de-caracteres-em-um-jtextfield/#comments</comments>
		<pubDate>Thu, 27 Aug 2009 16:28:34 +0000</pubDate>
		<dc:creator>André</dc:creator>
				<category><![CDATA[Desenvolvimento]]></category>
		<category><![CDATA[Dicas rápidas]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[jtextfield]]></category>
		<category><![CDATA[swing]]></category>

		<guid isPermaLink="false">http://www.andrels.com/wp-pt_BR/?p=93</guid>
		<description><![CDATA[A implementação padrão do JTextField não permite definir um limite para inserção de caracteres. Para habilitar este recurso é necessário<a href="http://www.andrels.com/wp-pt_BR/index.php/2009/08/limitando-numero-maximo-de-caracteres-em-um-jtextfield/" class="searchmore">Read the Rest...</a><div class="clr"></div>]]></description>
			<content:encoded><![CDATA[<p>A implementação padrão do <em>JTextField</em> não permite definir um limite para inserção de caracteres. Para habilitar este recurso é necessário implementar um <em>Document</em>, onde será necessário sobrescrever o método <em>insertString</em>.</p>
<pre class="brush:java">public class MaxLengthTextDocument extends PlainDocument {
	//Armazena o número máximo de caracteres para o texto.
	private int maxChars;

	@Override
	public void insertString(int offs, String str, AttributeSet a)
			throws BadLocationException {
		if(str != null &#038;&#038; (getLength() + str.length() < maxChars)){
            		super.insertString(offs, str, a);
        	}
	}

	//getter e setter omitidos
}</pre>
<p>Aqui definimos a classe <em>MaxLengthTextDocument</em> estendendo a <em>PlainDocument</em>. No atributo <em>insertString</em> inserimos uma regra onde só será inserido valor se comprimento não ultrapassar o valor máximo.</p>
<p>Depois é só inserir a implementação no JTextField, desta forma:</p>
<pre class="brush:java">	...
	MaxLengthTextDocument maxLength = new MaxLengthTextDocument();
	maxLength.setMaxChars(50);//Limitamos para 50 caracteres

	jTextField.setDocument(maxLength);
	...</pre>
<p>E voilá!</p>
<p>Até mais!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.andrels.com/wp-pt_BR/index.php/2009/08/limitando-numero-maximo-de-caracteres-em-um-jtextfield/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>JLabel com preenchimento (Padding)</title>
		<link>http://www.andrels.com/wp-pt_BR/index.php/2009/08/jlabel-com-preenchimento-padding/#utm_source=feed&#038;utm_medium=feed&#038;utm_campaign=feed</link>
		<comments>http://www.andrels.com/wp-pt_BR/index.php/2009/08/jlabel-com-preenchimento-padding/#comments</comments>
		<pubDate>Fri, 21 Aug 2009 21:29:45 +0000</pubDate>
		<dc:creator>André</dc:creator>
				<category><![CDATA[Desenvolvimento]]></category>
		<category><![CDATA[Dicas rápidas]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[component]]></category>
		<category><![CDATA[swing]]></category>

		<guid isPermaLink="false">http://www.andrels.com/wp-pt_BR/?p=81</guid>
		<description><![CDATA[Para adicionar preenchimento (padding) à um JLabel podemos usar as próprias bordas. Colocamos um EmptyBorder com o espaçamento que precisamos.<a href="http://www.andrels.com/wp-pt_BR/index.php/2009/08/jlabel-com-preenchimento-padding/" class="searchmore">Read the Rest...</a><div class="clr"></div>]]></description>
			<content:encoded><![CDATA[<p>Para adicionar preenchimento (padding) à um JLabel podemos usar as próprias bordas. Colocamos um EmptyBorder com o espaçamento que precisamos. Desta forma:</p>
<pre class="brush:java">...
JLabel jLabel = new JLabel("Meu JLabel");
//Borda usada para o preenchimento
Border paddingBorder = BorderFactory.createEmptyBorder(10,10,10,10);

jLabel.setBorder(BorderFactory.createCompoundBorder(border,paddingBorder));
...</pre>
<p>Neste caso colocamos um espaçamento de 10 pixels no topo, à esquerda, à direita e em baixo do JLabel respectivamente.</p>
<p style="text-align: center;">
<p style="text-align: center;"><img class="size-full wp-image-83 aligncenter" title="JLabel Padding" src="http://www.andrels.com/wp-pt_BR/wp-content/uploads/2009/08/2.gif" alt="JLabel Padding" width="300" height="100" /></p>
<p>Se ainda quiser colocar uma borda envolta do JLabel, pode-se usar uma CompoundBorder, inserindo a borda e o preenchimento. Desta forma:</p>
<pre class="brush:java">...
JLabel jLabel = new JLabel("Meu JLabel");
//Borda usada para o preenchimento
Border paddingBorder = BorderFactory.createEmptyBorder(10,10,10,10);
//Borda que ficará envolta do JLabel
Border border = BorderFactory.createLineBorder(Color.BLUE);

jLabel.setBorder(BorderFactory.createCompoundBorder(border,paddingBorder));
...</pre>
<p style="text-align: center;"><img class="size-full wp-image-84 aligncenter" title="JLabel padding" src="http://www.andrels.com/wp-pt_BR/wp-content/uploads/2009/08/3.gif" alt="JLabel padding" width="300" height="100" /></p>
<p>Baixe o código fonte desta dica <a href="http://www.andrels.com/wp-pt_BR/wp-content/plugins/download-monitor/download.php?id=1" title="clicado 92 vezes">aqui</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.andrels.com/wp-pt_BR/index.php/2009/08/jlabel-com-preenchimento-padding/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Tutorial iBatis, aprendendo o básico</title>
		<link>http://www.andrels.com/wp-pt_BR/index.php/2009/07/tutoral-ibatis-aprendendo-o-basico/#utm_source=feed&#038;utm_medium=feed&#038;utm_campaign=feed</link>
		<comments>http://www.andrels.com/wp-pt_BR/index.php/2009/07/tutoral-ibatis-aprendendo-o-basico/#comments</comments>
		<pubDate>Sat, 04 Jul 2009 15:53:37 +0000</pubDate>
		<dc:creator>André</dc:creator>
				<category><![CDATA[Desenvolvimento]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Tutoriais]]></category>
		<category><![CDATA[ibatis]]></category>
		<category><![CDATA[Oracle]]></category>

		<guid isPermaLink="false">http://www.andrels.com/wp-pt_BR/?p=54</guid>
		<description><![CDATA[Geralmente quando se fala sobre frameworks de persistência logo vem à cabeça Hibernate/JPA. Há pouco tempo fui apresentado ao iBatis,<a href="http://www.andrels.com/wp-pt_BR/index.php/2009/07/tutoral-ibatis-aprendendo-o-basico/" class="searchmore">Read the Rest...</a><div class="clr"></div>]]></description>
			<content:encoded><![CDATA[<p>Geralmente quando se fala sobre frameworks de persistência logo vem à cabeça Hibernate/JPA. Há pouco tempo fui apresentado ao iBatis, um framework que eu, particularmente, acho muito fácil de instalar, configurar e usar. Você pode baixa-lo através do site de sua mantenedora, a <a href="http://www.apache.org" target="_blank">Apache</a>, clicando <a href="http://ibatis.apache.org/java.cgi?Preferred=http%3A%2F%2Flinorg.usp.br%2Fapache">aqui</a>.</p>
<p>Neste tutorial usarei a versão 2.3.4 build 726.</p>
<p><em><strong>Configurando o iBatis</strong></em></p>
<p>Ao contrário dos demais frameworks, para configurar o iBatis você só precisa de um arquivo XML de configuração, chamado <em>SqlMapConfig</em><em>. </em></p>
<p>As principais seções do xml são:</p>
<pre class="brush: xml">&lt;properties resource="tuto/ibatis/config/SqlMap.properties"/&gt;</pre>
<p>Este código é opcional e serve para indicar o arquivo properties com as variável de configuração que serão usada no XML.</p>
<pre class="brush: xml">&lt;typeAlias alias="car" type="tuto.ibatis.beans.Car"/&gt;</pre>
<p>Indica o Bean utilizado e qual será seu aliás. Você pode configurar várias linhas, tudo depende da complexidade e necessidade da sua modelagem.<br />
No nosso exemplo, usaremos o <em>bean</em> Car abaixo:</p>
<pre class="brush:java">public class Car {
	private Long carId;
	private String company;
	private String model;
	private String color;
	private Integer	hp;
	private Float price;

	//Setters e getters omitidos
}</pre>
<pre class="brush: xml">&lt;transactionManager type="JDBC"&gt;
    &lt;dataSource type="SIMPLE"&gt;
        &lt;property name="JDBC.Driver" value="${driver}"/&gt;
        &lt;property name="JDBC.ConnectionURL" value="${url}"/&gt;
        &lt;property name="JDBC.Username" value="${username}"/&gt;
        &lt;property name="JDBC.Password" value="${password}"/&gt;
    &lt;/dataSource&gt;
&lt;/transactionManager&gt;</pre>
<p>Parâmetros usados na conexão com o banco. As variáveis ${driver}, ${url}, ${username} e ${password} estão definidas no arquivo .properties indicado na seção  <em>properties</em>. Se você preferir, também pode colocar os valores diretamente nos campos, sem precisar defini-los em outro local.</p>
<p>Veja como será arquivo completo:</p>
<pre class="brush: xml">&lt;?xml version="1.0" encoding="UTF-8"?&gt;

&lt;!DOCTYPE sqlMapConfig PUBLIC "-//ibatis.apache.org//DTD SQL Map Config 2.0//EN"
        "http://ibatis.apache.org/dtd/sql-map-config-2.dtd"&gt;

&lt;sqlMapConfig&gt;
    &lt;properties resource="tuto/ibatis/config/SqlMap.properties"/&gt;

    &lt;settings
        cacheModelsEnabled="true"
        enhancementEnabled="true"
        lazyLoadingEnabled="true"
        maxRequests="32"
        maxSessions="10"
        maxTransactions="5"
        useStatementNamespaces="false" /&gt;

    &lt;typeAlias alias="car" type="tuto.ibatis.beans.Car"/&gt;

    &lt;transactionManager type="JDBC"&gt;
        &lt;dataSource type="SIMPLE"&gt;
            &lt;property name="JDBC.Driver" value="${driver}"/&gt;
            &lt;property name="JDBC.ConnectionURL" value="${url}"/&gt;
            &lt;property name="JDBC.Username" value="${username}"/&gt;
            &lt;property name="JDBC.Password" value="${password}"/&gt;
        &lt;/dataSource&gt;
    &lt;/transactionManager&gt;

    &lt;sqlMap resource="tuto/ibatis/sqlmaps/CarSqlMap.xml"/&gt;
&lt;/sqlMapConfig&gt;</pre>
<p>O <em>properties</em> tem o seguinte conteúdo:</p>
<pre class="brush:plain">driver=oracle.jdbc.OracleDriver
url=jdbc:oracle:thin:@&lt;host&gt;:&lt;porta&gt;:&lt;sid&gt;
username=&lt;login&gt;
password=&lt;senha&gt;</pre>
<p>Em seguida devemos configurar nosso <em>SqlMap</em>. Este XML conterá as <em>querys </em> utilizadas na aplicação e deverá  ter o nome do descrito na seçao <em>sqlMap</em> do <em>SqlMapConfig</em>, no nosso caso será <em>CarSqlMap.xml</em>.</p>
<p>No nosso exemplo apenas veremos a utilização das <em>tags </em><em>select</em>, <em>insert, </em><em>update </em>e <em>delete</em>.</p>
<pre class="brush:xml">&lt;select id="getCars" resultClass="tuto.ibatis.beans.Car"
	parameterClass="java.lang.Long"&gt;
    SELECT COMPANY  as company,
           MODEL    as model,
           COLOR    as color,
           HP       as hp,
           PRICE    as price
    FROM TBL_CAR
    WHERE CAR_ID = #var#
&lt;/select&gt;</pre>
<p>Executa o <em>select </em>podendo retornar uma única linha ou uma coleção, o tipo retornado é o mesmo especificado no atributo <em>resultClass, o</em> <em>parameterClass</em> é o tipo passado para executar a <em>query</em> e o <em>id</em> é a identificação para chamada da <em>query</em>.</p>
<p>Usaremos o <em>SqlMap</em> abaixo:</p>
<pre class="brush:xml">&lt;?xml version="1.0" encoding="UTF-8"?&gt;

&lt;!DOCTYPE sqlMap PUBLIC "-//ibatis.apache.org//DTD SQL Map 2.0//EN"
	"http://ibatis.apache.org/dtd/sql-map-2.dtd"&gt;

&lt;sqlMap namespace="Car"&gt;
    &lt;select id="getCars" resultClass="tuto.ibatis.beans.Car"
    parameterClass="java.lang.Long"&gt;
        SELECT COMPANY  as company,
               MODEL    as model,
               COLOR    as color,
               HP       as hp,
               PRICE    as price
        FROM TBL_CAR
        WHERE CAR_ID = #var#
    &lt;/select&gt;

    &lt;insert id="addCar" parameterClass="tuto.ibatis.beans.Car"&gt;
        INSERT INTO TBL_CAR (CAR_ID, COMPANY, MODEL, COLOR, HP, PRICE)
        VALUES (#carId#, #company#, #model#, #color#, #hp#, #price#)
    &lt;/insert&gt;

    &lt;delete id="delCar" parameterClass="java.lang.Long"&gt;
        DELETE FROM TBL_CAR WHERE CAR_ID = #var#
    &lt;/delete&gt;

    &lt;update id="updCar" parameterClass="tuto.ibatis.beans.Car"&gt;
        UPDATE TBL_CAR
          SET COMPANY = #company#,
              MODEL = #model#,
              COLOR = #color#,
              HP = #hp#,
              PRICE = #price#
        WHERE CAR_ID = #carId#
    &lt;/update&gt;
&lt;/sqlMap&gt;</pre>
<p>Agora que já configuramos o acesso ao banco de dados e o mapeamento dos objetos, vamos implementar a classe <em>singleton</em> que usaremos como <em>SqlMapClient</em>, aqui nós a chamaremos de OracleMapConfig.</p>
<pre class="brush:java">package tuto.ibatis.connection;

import java.io.Reader;

import com.ibatis.common.resources.Resources;
import com.ibatis.sqlmap.client.SqlMapClient;
import com.ibatis.sqlmap.client.SqlMapClientBuilder;

public class OracleMapConfig {
	private static final SqlMapClient sqlMapClient;

	static{
		try{
			//Definindo o caminho para o SqlMapConfig e criando o reader
			String res = "tuto/ibatis/config/SqlMapConfig.xml";
			Reader reader = Resources.getResourceAsReader(res);

			//Recuperando o client para o SqlMap
			sqlMapClient = SqlMapClientBuilder.buildSqlMapClient(reader);
		} catch(Exception e){
			e.printStackTrace();
			throw new RuntimeException(e);
		}
	}

	//Método usado para recuperar o client
	public static SqlMapClient getSqlMapClient(){
		return sqlMapClient;
	}
}</pre>
<p>O <em>client</em> é responsável por executar as <em>querys</em> configuradas no <em>SqlMap</em> e nos fornecer os resultados.</p>
<p><em><strong>Executando Querys e tratando retornos</strong></em></p>
<p>Para chamar uma das <em>querys</em> é muito simples, apenas chame o <em>cliente </em>e o método correspondente de cada uma.</p>
<p>O <em>select </em>pode ser chamado da seguinte forma:</p>
<pre class="brush:java">OracleMapConfig.getSqlMapClient().queryForObject("&lt;id&gt;", &lt;parâmetro&gt;);</pre>
<p>O <em><strong>id</strong></em>deve ser o <em>id</em> correspondente no <em>SqlMap</em></p>
<p>O código acima tráz apenas uma linha retornada pela <em>query</em>, para trazer todas apenas troque o método para o <em>queryForList</em>, desta forma:</p>
<pre class="brush:java">OracleMapConfig.getSqlMapClient().queryForList("&lt;id&gt;", &lt;parâmetro&gt;);</pre>
<p>Assim, será retornado uma <em>Collection</em> contendo os objetos.</p>
<p>Vamos aos exemplos:<br />
<strong>Select</strong></p>
<pre class="brush:java">try{
	Car car = (Car)OracleMapConfig.getSqlMapClient().queryForObject("getCars",
		new Long(readKeyboard()));

	System.out.println("Marca: "+car.getCompany());
	System.out.println("Modelo: "+car.getModel());
	System.out.println("Cor: "+car.getColor());
	System.out.println("HP: "+car.getHp());
	System.out.println("Preço: "+car.getPrice());
}catch (Exception e) {
	e.printStackTrace();
}</pre>
<p>O <em>id</em> &#8220;getCars&#8221; é o que definimos nos atributos do <em>select</em> do <em>SqlMap</em>, passando um <em>Long</em> e recuperando o tipo Car, ambos também definidos na linha &lt;select id=&#8221;<span style="color: #0000ff;">getCars</span>&#8221; resultClass=&#8221;<span style="color: #0000ff;">tuto.ibatis.beans.Car</span>&#8221; parameterClass=&#8221;<span style="color: #0000ff;">java.lang.Long</span>&#8220;&gt;.</p>
<p><strong>Insert</strong></p>
<pre class="brush:java">try{
	OracleMapConfig.getSqlMapClient().insert("addCar", newCar);
}catch (Exception e) {
	e.printStackTrace();
}</pre>
<p>Agora passamos como parâmetros o próprio tipo Car, &lt;insert id=&#8221;<span style="color: #0000ff;">addCar</span>&#8221; parameterClass=&#8221;<span style="color: #0000ff;">tuto.ibatis.beans.Car</span>&#8220;&gt; e chamamos os métodos usando cerquilha (#, ou jogo-da-velha se preferirem), desta forma:</p>
<pre class="brush:plain">INSERT INTO TBL_CAR (CAR_ID, COMPANY, MODEL, COLOR, HP, PRICE)
VALUES (#carId#, #company#, #model#, #color#, #hp#, #price#)</pre>
<p><strong>Delete</strong></p>
<pre class="brush:java">try{
	int lines = OracleMapConfig.getSqlMapClient().delete("delCar",
		new Long(readKeyboard()));

	System.out.println(lines + " linhas excluídas");
}catch (Exception e) {
	e.printStackTrace();
}</pre>
<p>O método <em>delete</em> do <em>client</em> retorna um tipo <em>int</em> que representa a quantidade de linhas excluídas.</p>
<p><strong>Update</strong></p>
<pre class="brush:java">try{
	int lines = OracleMapConfig.getSqlMapClient().update("updCar", car);

	System.out.println(lines + " carros incluídos");
}catch (Exception e) {
	e.printStackTrace();
}</pre>
<p>O Update retorna um tipo <em>int</em>, que informa a quantidade de linhas afetadas pelo update.</p>
<p>Como você pode ver, com apenas três arquivos XML e três classes conseguimos montar um sistema de manutenção de estoque de consulta de preço basico.</p>
<p>Você pode fazer o download com os fontes deste tutorial clicando <a href="../wordpress_external/downloads/TutoIbatis.zip#utm_source=feed&amp;utm_medium=feed&amp;utm_campaign=feed">aqui</a>.</p>
<p>Até a próxima!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.andrels.com/wp-pt_BR/index.php/2009/07/tutoral-ibatis-aprendendo-o-basico/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

