<?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>PauloMotta.pro &#187; Tutoriais</title>
	<atom:link href="http://www.paulomotta.pro.br/category/tutoriais/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.paulomotta.pro.br</link>
	<description>&#34;Qualquer tecnologia suficientemente avançada é indistinguível da mágica&#34; - Arthur C. Clarke</description>
	<lastBuildDate>Tue, 10 Jan 2012 03:00:16 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.1.2</generator>
		<item>
		<title>Tutorial JPA em atualização e Tutorial de Relatórios!</title>
		<link>http://www.paulomotta.pro.br/2011/09/27/tutorial-jpa-em-atualizacao-e-tutorial-de-relatorios/</link>
		<comments>http://www.paulomotta.pro.br/2011/09/27/tutorial-jpa-em-atualizacao-e-tutorial-de-relatorios/#comments</comments>
		<pubDate>Tue, 27 Sep 2011 15:12:40 +0000</pubDate>
		<dc:creator>prmottajr</dc:creator>
				<category><![CDATA[Principal]]></category>
		<category><![CDATA[Tutoriais]]></category>
		<category><![CDATA[iReport]]></category>
		<category><![CDATA[JPA]]></category>
		<category><![CDATA[JSF]]></category>

		<guid isPermaLink="false">http://www.paulomotta.pro.br/?p=1440</guid>
		<description><![CDATA[Comecei a atualizar o tutorial JPA aqui do site. É claro que quando eu comecei com essa coisa de tutoriais eu achei que daria muito menos trabalho do que realmente dá mas a segunda versão do tutorial vai ficar melhor e maior então vai valer a pena! Além disso estou planejando também a continuação dela [...]]]></description>
			<content:encoded><![CDATA[<p>Comecei a atualizar o <a href="http://www.paulomotta.pro.br/2010/05/17/tutorial-jpa/" target="_blank">tutorial JPA aqui do site</a>. É claro que quando eu comecei com essa coisa de tutoriais eu achei que daria muito menos trabalho do que realmente dá <img src='http://www.paulomotta.pro.br/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  mas a segunda versão do tutorial vai ficar melhor e maior então vai valer a pena! Além disso estou planejando também a continuação dela com outros detalhes.</p>
<p>Outro tópico que vem aí é a criação de relatórios com iReport e com JSF, duas abordagens diferentes.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.paulomotta.pro.br/2011/09/27/tutorial-jpa-em-atualizacao-e-tutorial-de-relatorios/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Como usar o JFlex, um tutorial</title>
		<link>http://www.paulomotta.pro.br/2011/03/01/como-usar-o-jflex-um-tutorial/</link>
		<comments>http://www.paulomotta.pro.br/2011/03/01/como-usar-o-jflex-um-tutorial/#comments</comments>
		<pubDate>Tue, 01 Mar 2011 11:00:09 +0000</pubDate>
		<dc:creator>prmottajr</dc:creator>
				<category><![CDATA[Principal]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[Tutoriais]]></category>
		<category><![CDATA[Compiladores]]></category>
		<category><![CDATA[JAVA]]></category>
		<category><![CDATA[Robôs]]></category>

		<guid isPermaLink="false">http://www.paulomotta.pro.br/?p=1291</guid>
		<description><![CDATA[Em uma tentativa de tornar a aula de compiladores mais interessante eu fui em busca de ferramentas que pudessem gerar analisadores léxicos com alguma facilidade. É claro que em ambiente linux você já tem o lex e o flex instalados (ok, se você instalar os pacotes de desenvolvimento, o que quase sempre acontece), mas em [...]]]></description>
			<content:encoded><![CDATA[<p>Em uma tentativa de tornar a aula de compiladores mais interessante eu fui em busca de ferramentas que pudessem gerar analisadores léxicos com alguma facilidade. É claro que em ambiente linux você já tem o lex e o flex instalados (ok, se você instalar os pacotes de desenvolvimento, o que quase sempre acontece), mas em ambiente Windows eu não tinha muita ideia de como providenciar. Como nada é tão trivial como eu gostaria achei melhor colocar um tutorial do que fazer.</p>
<p>Foi aí que esbarrei com o <a href="http://jflex.de/index.html" target="_blank">JFlex</a>, é uma implementação em Java, baseada o <a href="http://www.cs.princeton.edu/~appel/modern/java/JLex/" target="_blank">JLex</a>, sendo este último mais queixo duro. O JFlex tem uma interface gráfica bem simpática, mas que no final das contas você nem precisa usar <img src='http://www.paulomotta.pro.br/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Uma das vantagens é que ele permite usar um modo de compatibilidade para ser usado junto com o <a href="http://www2.cs.tum.edu/projects/cup/" target="_blank">CUP</a> que vai analisar sintaticamente o seu programa. Assim você mata duas etapas do processo de compilação e depois pode escrever seu interpretador ou seu gerador de código!</p>
<p>Para facilitar a tarefa eu juntei as duas ferramentas em um &#8220;toolkit&#8221; já com 2 exemplos mastigados de como usar só o JFlex e dois de como usar a integração com o CUP. Como o pacote original do JFlex tem alguns exemplos interessantes eu deixei ele incluído no toolkit, mas já preparei os Makefiles dos projetos para referenciar a pasta lib que está no arquivo zip (<a title="baixe" href="http://www.paulomotta.pro.br/wp-content/uploads/2011/02/CompToolKit.zip">baixe</a> e descompacte no seu micro que esse parágrafo vai fazer mais sentido).</p>
<p>Então, para usar o JFlex é necessário entender para que ele serve antes de tudo. O objetivo dessa ferramenta gerar um programa que seja capaz de analisar uma entrada (normalmente de arquivo texto) que contém um &#8220;programa&#8221; escrito na linguagem definida e identificar se não contém algum caracter estranho ao que possa ser reconhecido. É só isso mesmo, mas escrever o analisador na mão é bem mais complicado, então por isso usamos esse tipo de ferramenta (pelo menos nos cursos de compiladores).</p>
<p>Para ajudar vou colocar uma figura aqui.</p>
<p style="text-align: center;"><a href="http://www.paulomotta.pro.br/wp-content/uploads/2011/02/JFlex.jpg"><img class="size-medium wp-image-1297  aligncenter" title="JFlex" src="http://www.paulomotta.pro.br/wp-content/uploads/2011/02/JFlex-300x162.jpg" alt="" width="300" height="162" /></a></p>
<p>Temos duas areas nessa figura, uma acima do pontilhado, que é o processo de construção do analisador léxico, e a outra embaixo do pontilhado que é o uso do analisador já pronto. Neste exemplo estou trabalhando com uma linguagem fictícia chamada T1.</p>
<p>Uma saída comum do programa gerado pelo JFlex é uma tabela de símbolos com os valores que foram reconhecidos do programa analisado.</p>
<p>Para funcionar o JFlex recebe um arquivo em formato txt normalmente com a extensão .lex ou .flex, esse arquivo deve seguir um formato definido, com 3 seções separadas por %%:</p>
<ol>
<li>Código do usuário &#8211; esta seção contém códigos que você precise para o seu analisador final, ela é copiada para o arquivo final</li>
<li>Definições e macros &#8211; nesta seção você define macros e seleciona as opções de configuração do JFlex</li>
<li>Regras &#8211; nesta última seção você vai definir as regras que indicam o que  fazer, por exemplo retornar um símbolo, com os textos que vão sendo  reconhecidos da entrada. Essas regras vão ser analisadas para gerar o  autômato da linguagem que depois será codificado pelo JFlex.</li>
</ol>
<p>É melhor colocar um exemplo bem simples aqui:</p>
<blockquote>
<pre>//secao do usuario, nao coloquei nada
%%
//nome da classe CalcLexer
%class CalcLexer
//ativa contagem de linhas
%line
//ativa contaagem de colunas
%column
//coloca em modo de debug que permite usar de forma isolada para testes
%debug
//macros sao escritas em expresoes regulares
LineTerminator = \r|\n|\r\n
WhiteSpace     = {LineTerminator} | [ \t\f]
dec_int_lit = 0 | [1-9][0-9]*
dec_int_id = [A-Za-z_][A-Za-z_0-9]*

%%
//regras
&lt;YYINITIAL&gt; {

 ";"   { return (new Yytoken(0,yytext(),yyline,yychar,yychar+1)); }
 "+"   { System.out.print(" + ");
         return (new Yytoken(0,yytext(),yyline,yychar,yychar+1)); }
 "-"   { System.out.print(" - ");
         return (new Yytoken(0,yytext(),yyline,yychar,yychar+1)); }
 "*"   { System.out.print(" * ");
         return (new Yytoken(0,yytext(),yyline,yychar,yychar+1)); }
 "/"   { System.out.print(" / ");
         return (new Yytoken(0,yytext(),yyline,yychar,yychar+1)); }
 "("   { System.out.print(" ( ");
         return (new Yytoken(0,yytext(),yyline,yychar,yychar+1)); }
 ")"   { System.out.print(" ) ");
         return (new Yytoken(0,yytext(),yyline,yychar,yychar+1)); }

 {dec_int_lit}      { System.out.print(yytext());
 return (new Yytoken(0,yytext(),yyline,yychar,yychar+1)); }

 {dec_int_id}       { System.out.print(yytext());
 return (new Yytoken(0,yytext(),yyline,yychar,yychar+1));}

 {WhiteSpace}       { /* pula, não faz nada */ }   
}
<pre>[^]      { throw new Error("Caracter inválido &lt;"+yytext()+"&gt;"); }</pre>
</pre>
</blockquote>
<p>Então com esse arquivo podemos gerar um analisador léxico capaz de reconhecer os caracteres necessários para escrever expressões aritméticas, mas ele não vai reconhecer se estão corretamente formadas, isso é papel do analisador sintático (que será o CUP).</p>
<p>Outra coisa importante desse exemplo, como estamos operando em modo debug, as regras estão retornando um objeto da classe Yytoken que deve ser fornecida (no toolkit esse exemplo está todo pronto). Quando integrarmos com o CUP o retorno será uma entrada na tabela de símbolos e por isso será do tipo inteiro.</p>
<p>Para encerrar, um breve comentário sobre uns métodos que aparecem na área de regras, temos:</p>
<ul>
<li> yytext() &#8211; retorna o texto atual reconhecido pelo lexer</li>
<li>yyline &#8211; retorna o número da linha atual</li>
<li>yychar &#8211; retorna o número do caracter atual</li>
</ul>
<p>Para integrar com o CUP o uso do yytext() será muito importante, então no próximo texto veremos isso com mais detalhes.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.paulomotta.pro.br/2011/03/01/como-usar-o-jflex-um-tutorial/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Personalizando mensagens com MessageFormat do Java</title>
		<link>http://www.paulomotta.pro.br/2011/01/31/personalizando-mensagens-com-messageformat-do-java/</link>
		<comments>http://www.paulomotta.pro.br/2011/01/31/personalizando-mensagens-com-messageformat-do-java/#comments</comments>
		<pubDate>Mon, 31 Jan 2011 02:48:18 +0000</pubDate>
		<dc:creator>prmottajr</dc:creator>
				<category><![CDATA[Principal]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[Tutoriais]]></category>
		<category><![CDATA[JAVA]]></category>
		<category><![CDATA[PROGRAMAÇÃO]]></category>

		<guid isPermaLink="false">http://www.paulomotta.pro.br/?p=1211</guid>
		<description><![CDATA[Esse post é baseado em um problema que tivemos no trabalho e vai ser bem rapidinho. O problema é, como usar um modelo de texto que precisa ser enviado por email, mas que precisa ser personalizado com alguns valores que identificam o usuário? Esse problema é muito comum, ter que enviar uma senha, ou até [...]]]></description>
			<content:encoded><![CDATA[<p>Esse post é baseado em um problema que tivemos no trabalho e vai ser bem rapidinho. O problema é, como usar um modelo de texto que precisa ser enviado por email, mas que precisa ser personalizado com alguns valores que identificam o usuário?</p>
<p>Esse problema é muito comum, ter que enviar uma senha, ou até mesmo uma mensagem de boas vindas ao sistema. Para isso podemos usar uma classe do Java que já trata isso com uma série de facilidades. Eu vou colocar aqui o exemplo mais básico de todos, mas a documentação da MessageFormat pode ser encontrada <a href="http://download.oracle.com/javase/1.4.2/docs/api/java/text/MessageFormat.html" target="_blank">aqui</a>.</p>
<p>Primeiro de tudo você precisa saber qual será o texto modelo, digamos que seja algo assim:</p>
<blockquote><p>Olá [nome do usuário],</p>
<p>Bem vindo ao sistema! Seu login e senha seguem abaixo:</p>
<p>login=[login do usuário]</p>
<p>senha=[senha gerado pelo sistema]</p></blockquote>
<p>Como podemos ver nesse exemplo, existem 3 valores que precisam ser preenchidos, é claro que COMO conseguir esses valores vai depender do seu sistema, mas provavelmente isso virá do banco de dados então o que precisamos fazer é criar a String modelo que deverá ficar assim:</p>
<blockquote><p>String modelo = &#8220;Olá {0}, Bem vindo ao sistema! Seu login e senha seguem abaixo: login={1} senha={2}&#8221;;</p></blockquote>
<p>A diferença entre os dois textos está nas marcações com parênteses que determinam onde o texto será trocado.</p>
<p>Agora só precisamos de um array do tipo Object com os valores que precisam ser trocados, curiosamente os números entre parênteses representam o índice da String no array que será trocada. Embora não seja muito natural, você poderia usar no texto modelo os números fora de ordem que na hora de substituir o Java vai buscar a String correspondente ao número que você colocou, só para ficar mais claro o texto poderia ser:</p>
<blockquote><p>Olá {1}, bem vindo novamente, seu login é {0}</p></blockquote>
<p>Mas eu acho que isso não é muito natural, prefiro manter a ordem igual entre modelo e array.</p>
<p>Bom agora precisamos de um array de Object, isto porque não são apenas Strings que podem ser substituídas, também podemos usar números e datas (veja maiores detalhes na documentação da classe). Vamos criar um array de Strings para o nosso caso com os textos:</p>
<blockquote><p>String vetor[] = {&#8220;Juca&#8221;, &#8220;jucabala&#8221;, &#8220;senha1234&#8243;};</p></blockquote>
<p>Agora que temos o modelo e o array (que tem os dados que vieram do banco) podemos usar a classe MessageFormat para fazer a troca:</p>
<blockquote><p>String s = MessageFormat.format (modelo, vetor);</p></blockquote>
<p>Assim a String s conterá o novo texto:</p>
<blockquote><p>Olá Juca, Bem vindo ao sistema! Seu login e senha seguem abaixo: login=jucabala senha=senha1234</p></blockquote>
<p>É claro que dá para fazer muito mais coisas com essa classe, mas para essa tarefa de modelos é uma mão na roda!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.paulomotta.pro.br/2011/01/31/personalizando-mensagens-com-messageformat-do-java/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Manipulando arquivos texto em Java</title>
		<link>http://www.paulomotta.pro.br/2011/01/25/manipulando-arquivos-texto-em-java/</link>
		<comments>http://www.paulomotta.pro.br/2011/01/25/manipulando-arquivos-texto-em-java/#comments</comments>
		<pubDate>Tue, 25 Jan 2011 10:00:43 +0000</pubDate>
		<dc:creator>prmottajr</dc:creator>
				<category><![CDATA[Principal]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[Tutoriais]]></category>
		<category><![CDATA[JAVA]]></category>
		<category><![CDATA[PROGRAMAÇÃO]]></category>

		<guid isPermaLink="false">http://www.paulomotta.pro.br/?p=1169</guid>
		<description><![CDATA[Uma das atividades que, como programadores, mais realizamos é trabalhar com arquivos texto. É claro que em alguns casos também trabalhamos com arquivos binários, mas de uma maneiro geral, a maior parte das vezes precisamos manipular mesmo são arquivos texto. O primeiro exemplo que temos que tratar são arquivos CSV, ou Comma Separeted Value &#8211; [...]]]></description>
			<content:encoded><![CDATA[<p>Uma das atividades que, como programadores, mais realizamos é trabalhar com arquivos texto. É claro que em alguns casos também trabalhamos com arquivos binários, mas de uma maneiro geral, a maior parte das vezes precisamos manipular mesmo são arquivos texto.</p>
<p>O primeiro exemplo que temos que tratar são arquivos CSV, ou Comma Separeted Value &#8211; Valores Separados por Vírgula, um tipo de arquivo tradicional para ser aberto em aplicações de planilha como Calc ou Excel. Não existe mistério em gerar esse tipo de arquivo, basta criar as Strings com os valores e as vírgulas nos lugares corretos e aí mandar para o arquivo de saída. Para processar um arquivo desses também não há mistério, basta ler linha a linha e para cada linha podemos usar o método split da classe String para separar os valores.</p>
<p>Mas como ler e escrever em um arquivo? Esse é o nosso tópico, então vamos a ele. Em Java, existem várias classes para se lidar com arquivos considerando que os arquivos são fluxos de bytes. A palavra em inglês é <em>stream</em> que pessoalmente eu acho que não é bem traduzida como fluxo no contexto de informática e programação. A vantagem dessa abstração do Java é que o programa que serve para trabalhar com arquivos pode ser facilmente modificado para trabalhar com conexões de rede.</p>
<p>Então sem mais delongas vamos ver um exemplo de código para abrir um arquivo e ler as linhas:</p>
<blockquote>
<pre>try {
   BufferedReader leitor = new BufferedReader(
      new FileReader("entrada.txt"));
   String linha = leitor.readLine();

   while (linha != null) {
      //processar a linha lida
      System.out.println("linha="+linha);
      linha = leitor.readLine();
   }
   leitor.close();
} catch (FileNotFoundException ex) {
   System.out.println("Erro " + ex);
} catch (IOException ex) {
   System.out.println("Erro " + ex);
}
</pre>
</blockquote>
<p>E para gravar um arquivo usamos o seguinte trecho:</p>
<blockquote>
<pre>try {
   PrintWriter escritor = new PrintWriter(
      new FileWriter("saida.txt"));

   //aqui podemos escrever tudo que for preciso
   escritor.println("gravar minha string no arquivo");
   escritor.flush();
   escritor.close();

} catch (FileNotFoundException ex) {
   System.out.println("Erro " + ex);
}
</pre>
</blockquote>
<p>Os pontos principais desses dois trechos de código são as partes do meio, mas antes vamos entender a estrutura de objetos. Para abrir um arquivo temos que diferenciar entre leitura e escrita assim temos Input para entrada e Output para saída. A classe FileReader é uma classe que cria uma referência para um arquivo capaz de trabalhar sobre bytes, ou seja, lendo bytes. Isso não é muito prático e por isso usamos um BufferedReader que permite ler uma linha inteira. Do outro lado a classe FileWriter permite escrever bytes e por isso vamos usar o PrintWriter para ter acesso a um método que permita escrever uma linha inteira, mas além disso precisamos chamar o método flush para descarregar as informações no arquivo e por fim o método close em ambas as situações permite fechar o arquivo.</p>
<p>Só mais um detalhe, a String que passamos representa o nome do arquivo, se for somente o nome, o arquivo será procurado na pasta onde o programa está executando, mas pode-se passar também um caminho completo. Uma alternativa bem legal é usar um JFileChooser, um diálogo para escolha de arquivos. Não chega a ser complicado, costumo criar um método separado que abre a janela, processa a escolha e retorna um objeto do tipo File. Tanto o FileReader quanto o FileWriter são capazes de receber um File, então se optar por usar um JFileChooser pode continuar usar os trechos de código aí de cima.</p>
<p>Um exemplo de uso do JFileChooser:</p>
<blockquote>
<pre>public static File chooser() {
   JFileChooser chooser = new JFileChooser();
   int returnVal = chooser.showOpenDialog(null);
   File f = null;
   if (returnVal == JFileChooser.APPROVE_OPTION) {
      f = chooser.getSelectedFile();
   }
   return f;
}
</pre>
</blockquote>
<p>E assim bata fazer a chamada desse método diretamente como entrada do FileReader ou FileWriter.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.paulomotta.pro.br/2011/01/25/manipulando-arquivos-texto-em-java/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Netbeans 7.0 M2 e Glassfish 3.1</title>
		<link>http://www.paulomotta.pro.br/2010/11/15/netbeans-7-0-m2-e-glassfish-3-1/</link>
		<comments>http://www.paulomotta.pro.br/2010/11/15/netbeans-7-0-m2-e-glassfish-3-1/#comments</comments>
		<pubDate>Mon, 15 Nov 2010 13:18:03 +0000</pubDate>
		<dc:creator>prmottajr</dc:creator>
				<category><![CDATA[Principal]]></category>
		<category><![CDATA[Tendências]]></category>
		<category><![CDATA[Tutoriais]]></category>
		<category><![CDATA[IDE]]></category>
		<category><![CDATA[JAVA]]></category>
		<category><![CDATA[PROGRAMAÇÃO]]></category>

		<guid isPermaLink="false">http://www.paulomotta.pro.br/?p=1052</guid>
		<description><![CDATA[Já está no forno o Netbeans 7.0 (eu ainda estou me lutando para avaliar o 6.9.1,) mas tudo bem porque M2 significa Milestone 2, ainda tem um tempo até sair a versão final. Até lá podemos ficar com esse vídeo instrucional que mostra as novas características de integração.]]></description>
			<content:encoded><![CDATA[<p>Já está no forno o Netbeans 7.0 (eu ainda estou me lutando para avaliar o 6.9.1,) mas tudo bem porque M2 significa Milestone 2, ainda tem um tempo até sair a versão final. Até lá podemos ficar com esse vídeo instrucional que mostra as novas características de integração.</p>
<p style="text-align: center;"><object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="425" height="350" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="src" value="http://www.youtube.com/v/xpcoeVAGc8Y&amp;feature" /><embed type="application/x-shockwave-flash" width="425" height="350" src="http://www.youtube.com/v/xpcoeVAGc8Y&amp;feature"></embed></object></p>
]]></content:encoded>
			<wfw:commentRss>http://www.paulomotta.pro.br/2010/11/15/netbeans-7-0-m2-e-glassfish-3-1/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

