<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-1425412311172548511</id><updated>2011-04-21T18:13:35.982-03:00</updated><title type='text'>Fernando Fiaux de Moraes</title><subtitle type='html'>Página de Fernando Fiaux de Moraes. Informações profissionais sobre mim e assuntos de desenvolvimento de software.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://ffiaux.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1425412311172548511/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://ffiaux.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Fernando Fiaux de Moraes</name><uri>http://www.blogger.com/profile/04449867655225177461</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>7</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-1425412311172548511.post-7250031231662664904</id><published>2008-10-14T00:13:00.002-03:00</published><updated>2008-10-14T00:51:41.426-03:00</updated><title type='text'>Somos todos profissionais. Somos mesmo?</title><content type='html'>A definição de profissional diz:&lt;br /&gt;1. Adjetivo:&lt;br /&gt;a) relativo a profissão&lt;br /&gt;b) que é remunerado pela atividade exercida&lt;br /&gt;&lt;br /&gt;2. Substantivo:&lt;br /&gt;a) aquele que trabalha por profissão&lt;br /&gt;b) quem tem conhecimentos da sua profissão, especialista.&lt;br /&gt;&lt;br /&gt;Costumo dizer que o principal objetivo do trabalho é ganhar dinheiro. Algumas pessoas não gostam, não concordam, mas sim, todos estão em busca de um salário para poder levar a vida, alcançar seus objetivos materiais, etc.&lt;br /&gt;&lt;br /&gt;É claro que acredito que no trabalho temos que alcançar realização pessoal, segurança, satisfação, felicidade. Mas no fim das contas, trabalha-se para receber no fim do mês, não tem outro objetivo maior.&lt;br /&gt;&lt;br /&gt;Falando em salário, é claro que sempre queremos um salário maior, e parece que por mais que ganhemos bem, não estamos satisfeitos, é sempre necessário subir um nível a mais, pois, descer é muito difícil.&lt;br /&gt;&lt;br /&gt;Algumas pessoas vivem para trabalhar, outras trabalham para viver. Alguns acham que devem trabalhar muito enquanto jovens, para depois aproveitar. E alguns, como eu, preferem trocar altos salários por uma qualidade de vida melhor.&lt;br /&gt;&lt;br /&gt;Mas, o que é ser merecedor de um bom salário. O que justifica um bom salário para um profissional? Nesse mercado de TI, onde há muitas vagas e poucas pessoas (boas) para preenchê-las, os salários são os mais variados possíveis, e é possível conseguir um sonhado aumento trocando de emprego.&lt;br /&gt;&lt;br /&gt;Recentemente recebi uma proposta de emprego, após uma indicação interna, por um funcionário conhecido de alguns anos. Fiz o processo seletivo, participei de entrevistas, pequenos testes, para no final, receber a notícia de que fui aprovado e posteriormente, receber a proposta oficial.&lt;br /&gt;&lt;br /&gt;Há por acaso momento ruim como esse na vida do profissional? Avisar aos empregadores atuais que recebeu uma proposta e está saindo. Sim há, é avisar aos que estão fazendo a proposta que você não vai por ter recebido contra-proposta.&lt;br /&gt;&lt;br /&gt;A situação só não é muito difícil quando estamos querendo sair, não queremos mais o atual emprego. Nesse caso, colocamos toda aquela insatisfação e aquele medo de anunciar a proposta para fora como raiva e descontamos naquele chefe de que não gostamos. Nesse caso nem damos ouvidos à contra-propostas.&lt;br /&gt;&lt;br /&gt;Mas e quando não objetivamos sair, e quando as coisas estão num nível muito bom, em equlíbrio (apesar de não estar em perfeição, o que talvez não exista)? Não podemos receber uma proposta aparentemente boa (não somente salarial) como uma boa coisa e levarmos adiante?&lt;br /&gt;&lt;br /&gt;Sim eu acredito que sim, afinal de contas, somos todos profissionais.&lt;br /&gt;&lt;br /&gt;Mas e se recebermos contra-proposta, satisfatória no que diz respeito a salário, e pudermos manter tudo como está, um bom momento, em equilíbrio, e darmos continuidade ao nosso trabalho, não interromper e deixar pela metade. Não podemos continuar?&lt;br /&gt;&lt;br /&gt;Sim eu acredito que sim, afinal de contas, somos todos profissionais.&lt;br /&gt;&lt;br /&gt;Mas qual é a questão? Qual o problema então?&lt;br /&gt;&lt;br /&gt;O problema é quando uma das partes envolvidas diz a você que espera que da próxima vez você não tenha que pedir demissão para ganhar um aumento de salário, para ser valorizado.&lt;br /&gt;&lt;br /&gt;Nesse momento joga-se tudo o que foi dito fora. É como se você não valesse mais nada, fosse um grande de um traidor. Pelo simples fato de aceitar uma contra-proposta (afinal de contas é meu direito também).&lt;br /&gt;&lt;br /&gt;Esse é meu questionamento. Porque isso não é aceito no Brasil? Afinal, de contas, somos todos profissionais. Somos mesmo?&lt;br /&gt;&lt;br /&gt;Obs: não vamos confundir as coisas com ética, ok?&lt;br /&gt;&lt;br /&gt;"Lamentação de um profissional de TI que recentemente recebeu proposta, achou que deveria ir, ficou muito dividido entre o local de trabalha e o local onde trabalharia. Comunicou ao chefe, recebeu contra-proposta. Analisou muito e muito, pesou todos os prós e contras e por fim decidiu ficar, afinal de contas, é um profissional."&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1425412311172548511-7250031231662664904?l=ffiaux.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ffiaux.blogspot.com/feeds/7250031231662664904/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1425412311172548511&amp;postID=7250031231662664904' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1425412311172548511/posts/default/7250031231662664904'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1425412311172548511/posts/default/7250031231662664904'/><link rel='alternate' type='text/html' href='http://ffiaux.blogspot.com/2008/10/somos-todos-profissionais-somos-mesmo.html' title='Somos todos profissionais. Somos mesmo?'/><author><name>Fernando Fiaux de Moraes</name><uri>http://www.blogger.com/profile/04449867655225177461</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1425412311172548511.post-8816764934503565263</id><published>2008-07-10T00:28:00.005-03:00</published><updated>2008-07-16T00:20:04.237-03:00</updated><title type='text'>Extreme Programming, desculpa para não fazer nada? Ou desculpa por não fazer nada?</title><content type='html'>No trabalho sou uma pessoa preocupada com a fase pré-programação, chego a ser chato como consideram alguns, mas prefiro dizer que é seriedade.&lt;br /&gt;&lt;br /&gt;Acho necessário termos análise e projeto antes de escrever o código de um sistema, variando um nível de detalhamento naquilo que for necessário, nas coisas mais complexas.&lt;br /&gt;&lt;br /&gt;Não sou nenhum purista, defensor de coisas que aprendi na faculdade, querendo que tudo seja feito de acordo com as regras. Aliás, que regras são essas? Não necessariamente um conjunto de regras que foi escrito por alguém de uma outra realidade funciona para nós. Além disso, conforme outro dia disse uma pessoa no GUJ quando se discutia metodologias de desenvolvimento, "não podemos usá-las como muleta intelectual".&lt;br /&gt;&lt;br /&gt;Eu sempre soube que na vida real a coisa era diferente, que por questões de tempo, dinheiro, cliente e até política de empresa alguns passos no desenvolvimento de software, essa tal pré-programação, são pulados, feitos de qualquer maneira, etc. Mas não concordo!&lt;br /&gt;&lt;br /&gt;O que eu não imaginava, era que encontraria muito por aí, gente fazendo software como se não existissem técnicas, boas práticas de desenvolvimento, metodologias de desenvolvimento, para resolver os problemas recorrentes, de anos atrás. É como disse meu professor do curso de &lt;a href="http://www.cce.puc-rio.br/informatica/projetoumlcentro.htm"&gt;Projeto de Software Orientado a Componentes&lt;/a&gt; "Levanta a mão quem usa patterns nos projetos em que trabalha ou trabalhou. Ninguém? Tô espantado. Padrão de projeto é algo que tem mais de 15 anos, é para solucionar problemas comuns de projeto, e tem gente que ainda não usa."&lt;br /&gt;&lt;br /&gt;Atualmente se fala muito de metodologias de desenvolvimento ágil, apesar das tais metodologias já terem alguns anos de vida, atualmente isso está crescendo. Uma metodologia muito falada (as vezes é só falada mesmo, pois, existem alguns que falam que são adeptos dela mas não fazem nada de suas práticas) é o Extreme Programming, ou apenas XP.&lt;br /&gt;&lt;br /&gt;Pelo nome, programação extrema, o que a gente pode concluir? Sair programando como louco para terminar o que tem pra fazer, certo? Errado, pelo menos eu vejo assim.&lt;br /&gt;&lt;br /&gt;Fui buscar informação sobre XP, para tirar essa dúvida da cabeça, entender o que é, como é, e desmistificar o mal uso do XP por parte das pessoas.&lt;br /&gt;&lt;br /&gt;Muitas pessoas por aí falam "sou adepto do XP" mas isso sempre me pareceu uma desculpa para não fazer nada da pré-programação, para justificar o fato de não ter uma documentação mínima, com casos de uso, alguns diagramas para descrever o uso da aplicação, para dar apoio ao desenvolvimento. Mas será que o XP diz isso? Justamente isso que eu queria desmistificar, fui atrás de leitura, fui direto a fonte, o site oficial da metodologia: &lt;a href="http://www.extremeprogramming.org"&gt;http://www.extremeprogramming.org&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Fiquei surpreso ao ler as informações do site. De certa forma até empolgado com a metodologia. Mas o que gostei mesmo, foi de ler a página onde são expostas as &lt;a href="http://www.extremeprogramming.org/rules.html"&gt;regras e práticas do Extreme Programming&lt;/a&gt;. &lt;br /&gt;&lt;br /&gt;Gostei de saber, vendo nessa página, que existe uma divisão em quatro grandes áreas: Planejamento, Projeto, Codificação e Teste. Só de termos essa divisão, já morrem aqueles adeptos do XP, que assim se dizem, e que só querem saber de programar, não querem saber de caso de uso (no caso de XP seriam users stories) planejar o desenvolvimento, ou de avaliar o andamento do projeto, os riscos, comunicação entre equipe, etc. Esses caras, na minha opinião, não sabem o que é XP! Dizer que faz XP porque utiliza Pair Programming é bobagem!&lt;br /&gt;&lt;br /&gt;Agora sei que realmente algumas pessoas fazem mal uso da mesma, na minha opinião elas querem mesmo é &lt;span style="font-weight:bold;"&gt;arrumar uma desculpa para não fazer nada&lt;/span&gt;, e o XP não é a melhor das desculpas.&lt;br /&gt;&lt;br /&gt;Não vou entrar em maiores detalhes sobre a metodologia pois conheço pouco e isso pode ser encontrado no site oficial, além  de outros lugares na internet, e livros principalmente. Há muito mais sobre o XP que não foi dito aqui.&lt;br /&gt;&lt;br /&gt;Resumindo. Achei bem interessante o XP, não sou profundo conhecedor da metodologia, mas fico satisfeito em descobrir suas quatro grandes áreas e desmistificá-la para os tais "adeptos do XP". Nunca fiz uso do XP e na verdade eu gosto mesmo é de Scrum!&lt;br /&gt;&lt;br /&gt;Fica registrado meu comentário sobre a metodologia, e minha crítica aos &lt;span style="font-style:italic;"&gt;so called&lt;/span&gt; "adeptos do XP".&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1425412311172548511-8816764934503565263?l=ffiaux.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ffiaux.blogspot.com/feeds/8816764934503565263/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1425412311172548511&amp;postID=8816764934503565263' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1425412311172548511/posts/default/8816764934503565263'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1425412311172548511/posts/default/8816764934503565263'/><link rel='alternate' type='text/html' href='http://ffiaux.blogspot.com/2008/07/extreme-programming-desculpa-para-no.html' title='Extreme Programming, desculpa para não fazer nada? Ou desculpa por não fazer nada?'/><author><name>Fernando Fiaux de Moraes</name><uri>http://www.blogger.com/profile/04449867655225177461</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1425412311172548511.post-577710014265581637</id><published>2008-07-02T00:55:00.002-03:00</published><updated>2008-07-02T01:04:35.266-03:00</updated><title type='text'>Firebug - Ferramenta para o desenvolvedor WEB</title><content type='html'>Uma ótima ferramenta para o desenvolvedor WEB utilizar ao navegar em sua aplicação é o Firebug. O Firebug é um add on para o Firefox, consiste em um conjunto de ferramentas para editar, debugar e monitorar CSS, HTML e JavaScript. &lt;br /&gt;&lt;br /&gt;É praticamente uma IDE, onde você pode visualizar os cabeçalhos de request e responde, visualizar os erros de JavaScript (inclusive em que linha de código), criar watch expressions no JavaScript para testar alterações na hora, realizar inspect no código HTML gerado visualizando ao mesmo tempo o CSS do elemento.&lt;br /&gt;&lt;br /&gt;Excelente para resolver aqueles problemas chatos de CSS resultantes de incompatibilidade entre Firefox e IE. Você identifica onde está o problema e pode testar uma correção na hora. Eliminando re-deploys de sistema, economizando tempo.&lt;br /&gt;&lt;br /&gt;Funciona para qualquer site, mas pode deixar alguns um pouco lentos, por isso não deixe ele sempre ligado.&lt;br /&gt;&lt;br /&gt;Mais informações em: &lt;a href="http://getfirebug.com/"&gt;http://getfirebug.com/&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1425412311172548511-577710014265581637?l=ffiaux.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ffiaux.blogspot.com/feeds/577710014265581637/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1425412311172548511&amp;postID=577710014265581637' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1425412311172548511/posts/default/577710014265581637'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1425412311172548511/posts/default/577710014265581637'/><link rel='alternate' type='text/html' href='http://ffiaux.blogspot.com/2008/07/firebug-ferramenta-para-o-desenvolvedor.html' title='Firebug - Ferramenta para o desenvolvedor WEB'/><author><name>Fernando Fiaux de Moraes</name><uri>http://www.blogger.com/profile/04449867655225177461</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1425412311172548511.post-4766045934149059249</id><published>2008-06-26T01:23:00.059-03:00</published><updated>2008-07-02T01:26:45.570-03:00</updated><title type='text'>Gerador de PDF e gerador de RTF em Java</title><content type='html'>Nas duas últimas semanas tive duas tarefas de trabalho que fizeram com que tivesse contato com duas coisas interessantes e bem úteis: gerar um PDF a partir de código HTML e gerar um relatório em RTF.&lt;br /&gt;&lt;br /&gt;O primeiro caso, tenho que dar méritos a um usuário do GUJ, o qual divulgou o código no &lt;a href="http://www.guj.com.br/posts/list/77682.java"&gt;post&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Já o segundo caso, eu mesmo criei o código, a partir de uma necessidade de geração de um relatório em DOC no trabalho. Como DOC é (até onde eu sei) um formato fechado, decidi por fazer um relatório em RTF, por ser fácilmente visualizado na maioria dos editores de texto e por saber que a biblioteca iText gera arquivos RTF facilmente.&lt;br /&gt;&lt;br /&gt;As classes ficaram bem simples, com código pequeno e vou apresentá-las aqui.&lt;br /&gt;&lt;br /&gt;A classe geradora de PDF a partir de HTML, com algumas modificações que eu fiz em relação a apresentada no GUJ. Essa classe já está pronta para ser colocada em algum projeto e ser utilizada:&lt;br /&gt;&lt;br /&gt;&lt;textarea name="code" class="java"&gt;&lt;br /&gt;import java.io.ByteArrayInputStream;&lt;br /&gt;import java.io.FileInputStream;&lt;br /&gt;import java.io.FileNotFoundException;&lt;br /&gt;import java.io.FileOutputStream;&lt;br /&gt;import java.io.InputStream;&lt;br /&gt;import java.io.OutputStream;&lt;br /&gt;&lt;br /&gt;import org.w3c.dom.Document;&lt;br /&gt;import org.w3c.tidy.Configuration;&lt;br /&gt;import org.w3c.tidy.Tidy;&lt;br /&gt;import org.xhtmlrenderer.pdf.ITextRenderer;&lt;br /&gt;&lt;br /&gt;import com.lowagie.text.DocumentException;&lt;br /&gt;&lt;br /&gt;public class Html2PdfConverter {&lt;br /&gt;   private static final String WORK_DIR = "/work/arquivos/html2pdf/";&lt;br /&gt;&lt;br /&gt;   public InputStream convert( String htmlInput ) throws DocumentException, FileNotFoundException     &lt;br /&gt;      OutputStream out = new FileOutputStream( WORK_DIR + "export.pdf" );&lt;br /&gt;      InputStream in = new ByteArrayInputStream( htmlInput.getBytes() ); &lt;br /&gt;      convert( in, out );&lt;br /&gt;      InputStream converted = new FileInputStream( WORK_DIR + "export.pdf" );&lt;br /&gt;  &lt;br /&gt;      return converted;&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   private void convert( InputStream input, OutputStream output ) throws DocumentException {&lt;br /&gt;      Tidy tidy = new Tidy();&lt;br /&gt;      tidy.setCharEncoding( Configuration.UTF8 );&lt;br /&gt;      Document doc = tidy.parseDOM( input, null );&lt;br /&gt;      ITextRenderer renderer = new ITextRenderer();&lt;br /&gt;      renderer.setDocument( doc, null );&lt;br /&gt;      renderer.layout();&lt;br /&gt;      renderer.createPDF( output );&lt;br /&gt;   }&lt;br /&gt;}&lt;br /&gt;&lt;/textarea&gt;&lt;br /&gt;&lt;br /&gt;Essa classe gera o PDF a partir de uma String a qual o conteúdo é código HTML. No meu caso eu gerei um template velocity representando o template a ser preenchido que iria ser transformado em HTML para ser input dessa classe. Ou seja, um controller qualquer de minha aplicação pega os dados necessários, preenche o template velocity, pega o resultado e passa para a classe geradora de PDF.&lt;br /&gt;&lt;br /&gt;E a classe geradora de RTF.&lt;br /&gt;&lt;br /&gt;&lt;textarea name="code" class="java"&gt;&lt;br /&gt;import java.io.FileInputStream;&lt;br /&gt;import java.io.FileNotFoundException;&lt;br /&gt;import java.io.FileOutputStream;&lt;br /&gt;import java.io.InputStream;&lt;br /&gt;import java.util.List;&lt;br /&gt;&lt;br /&gt;import br.impa.commons.util.StringUtils;&lt;br /&gt;&lt;br /&gt;import com.lowagie.text.Document;&lt;br /&gt;import com.lowagie.text.DocumentException;&lt;br /&gt;import com.lowagie.text.Element;&lt;br /&gt;import com.lowagie.text.Paragraph;&lt;br /&gt;import com.lowagie.text.rtf.RtfWriter2;&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt; * &lt;p&gt;Classe escritora de arquivos texto no formato PDF. Faz uso da biblioteca iText para gerar o arquivo RTF.&lt;/p&gt;&lt;br /&gt; * &lt;p&gt;Uso: a classe disponibiliza um método público para gerar o arquivo RTF: write(). Esse método recebe como parâmetro uma lista de objetos&lt;br /&gt; * do tipo Element - uma interface iText - contendo os parágrafos que serão escritos no arquivo gerado. A responsabilidade pela formação do texto&lt;br /&gt; * é toda do usuário dessa classe, a classe ImpaRTFWriter sabe apenas escrever arquivos RTF a partir de um texto montado em classes iText. Recebe&lt;br /&gt; * como parâmetro também o nome do arquivo a ser gerado, mas esse parâmetro é opcional.&lt;/p&gt;&lt;br /&gt; * &lt;p&gt;Como retorno do processamento, é retornado um InputStream para o arquivo gerado.&lt;/p&gt;&lt;br /&gt; * &lt;p&gt;Exemplo de uso:&lt;/p&gt;&lt;br /&gt; * &lt;p&gt;&lt;br /&gt; *   List&lt;Element&gt; paragraphs = new LinkedList();&lt;br /&gt; *  paragraphs.add( new Paragraph( "ALFREDO IUSEM", new RtfFont( "Arial", 12, RtfFont.BOLD ) ) );&lt;br /&gt; *  paragraphs.add( new Paragraph( "", new RtfFont( "Arial", 12 ) ) );&lt;br /&gt; *  paragraphs.add( new Paragraph( "2 - On convex cones with infinitely many critical angles.", new RtfFont( "Arial", 12, RtfFont.BOLD ) ) );&lt;br /&gt; *  paragraphs.add( new Paragraph( "Optimization 1-2 (2007), p. 115-128.", new RtfFont( "Arial", 12 ) ) );&lt;br /&gt; *  paragraphs.add( new Paragraph( "Em colaboração com A. Seeger.", new RtfFont( "Arial", 12 ) ) );&lt;br /&gt; *  &lt;/p&gt;&lt;br /&gt; * &lt;br /&gt; * @author Fernando Fiaux de Moraes&lt;br /&gt; * &lt;br /&gt; * @see Element&lt;br /&gt; * @see Paragraph&lt;br /&gt; *&lt;br /&gt; */&lt;br /&gt;public class RtfWriter {&lt;br /&gt;   private static final String WORK_DIR = "/work/arquivos/rtf/";&lt;br /&gt;&lt;br /&gt;   private InputStream inputStream;&lt;br /&gt;&lt;br /&gt;   public InputStream getInputStream() {&lt;br /&gt;      return inputStream;&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt; /**&lt;br /&gt;  * Escreve o arquivo RTF.&lt;br /&gt;  * &lt;br /&gt;  * @param paragraphs A lista de objetos do tipo Element, do iText, contendo o texto, no formato iText, a escrever no arquivo RTF.&lt;br /&gt;  * @param fileName O nome do arquivo a gerar. Parâmetro opcional.&lt;br /&gt;  * &lt;br /&gt;  * @return InputStream para o arquivo RTF gerado.&lt;br /&gt;  * &lt;br /&gt;  * @throws FileNotFoundException&lt;br /&gt;  * @throws DocumentException&lt;br /&gt;  */&lt;br /&gt;  public synchronized InputStream write( List&lt;Element&gt; paragraphs, String fileName ) throws FileNotFoundException, DocumentException {&lt;br /&gt;    if ( StringUtils.isNullOrEmpty( fileName ) ) {&lt;br /&gt;       fileName = "export";&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    // Cria o documento&lt;br /&gt;    Document document = new Document();&lt;br /&gt;    RtfWriter2.getInstance( document, new FileOutputStream( WORK_DIR + fileName + ".rtf" ) );&lt;br /&gt;    document.open();&lt;br /&gt;&lt;br /&gt;    // Escreve no documento&lt;br /&gt;    for ( Element element : paragraphs ) {&lt;br /&gt;       document.add( element );&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    // Finaliza e fecha o documento&lt;br /&gt;    document.close();&lt;br /&gt;    inputStream = new FileInputStream( WORK_DIR + fileName + ".rtf" );&lt;br /&gt;&lt;br /&gt;    return inputStream;&lt;br /&gt;   }&lt;br /&gt;}&lt;br /&gt;&lt;/textarea&gt;&lt;br /&gt;&lt;br /&gt;Para uso dessa classe é necessário antes criar uma lista de objetos do tipo Element, contendo a forma como o RTF deve ser escrito. Na verdade você tem que escrever o RTF programáticamente antes de de fato criar o arquivo no filesystem. Um exemplo:&lt;br /&gt;&lt;br /&gt;&lt;textarea name="code" class="java"&gt;&lt;br /&gt;List&lt;Element&gt; paragraphs = new LinkedList&lt;Element&gt;();&lt;br /&gt;paragraphs.add( new Paragraph( "ALFREDO IUSEM", new RtfFont( "Arial", 12, RtfFont.BOLD ) ) );&lt;br /&gt;paragraphs.add( new Paragraph( "", new RtfFont( "Arial", 12 ) ) );&lt;br /&gt;paragraphs.add( new Paragraph( "2 - On convex cones with infinitely many critical angles.", new RtfFont( "Arial", 12, RtfFont.BOLD ) ) );&lt;br /&gt;paragraphs.add( new Paragraph( "Optimization 1-2 (2007), p. 115-128.", new RtfFont( "Arial", 12 ) ) );&lt;br /&gt;paragraphs.add( new Paragraph( "Em colaboração com A. Seeger.", new RtfFont( "Arial", 12 ) ) );&lt;br /&gt;&lt;br /&gt;// Chama o gerador&lt;br /&gt;RtfWriter writer = new RtfWriter();&lt;br /&gt;InputStream inputStream = writer.write( paragraphs, "artigos_ind_published" );&lt;br /&gt;&lt;/textarea&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1425412311172548511-4766045934149059249?l=ffiaux.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ffiaux.blogspot.com/feeds/4766045934149059249/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1425412311172548511&amp;postID=4766045934149059249' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1425412311172548511/posts/default/4766045934149059249'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1425412311172548511/posts/default/4766045934149059249'/><link rel='alternate' type='text/html' href='http://ffiaux.blogspot.com/2008/06/blog-post.html' title='Gerador de PDF e gerador de RTF em Java'/><author><name>Fernando Fiaux de Moraes</name><uri>http://www.blogger.com/profile/04449867655225177461</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1425412311172548511.post-8903233389116575953</id><published>2008-06-26T00:55:00.015-03:00</published><updated>2008-07-10T01:05:50.375-03:00</updated><title type='text'>Posts com código fonte</title><content type='html'>Desde que criei o blog, no pouco tempo que tive para postar alguma coisa que achava interessante e que envolvia exemplo em código, esbarrei no problema: como postar código? Já havia visto por aí em outros sites, um deles é o &lt;a href="http://www.guj.com.br"&gt;GUJ&lt;/a&gt; além de outros blogs. Eu imaginava que seria simples, imaginava um JavaScript com CSS.&lt;br /&gt;&lt;br /&gt;Procurando sobre o assunto, para poder postar aqui no blog código, descobri o SintaxHighLighter do Google, encontrado em &lt;a href="http://code.google.com/p/syntaxhighlighter"&gt;http://code.google.com/p/syntaxhighlighter&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Até aí tudo bem, mas eu sabia que não seria algo que funcionaria automágicamente, um mínimo de esforço seria necessário, a dificuldade foi em descobrir qual seria.&lt;br /&gt;Pesquisei em outros blogs e encontrei tutoriais para isso, mas nenhum foi 100% útil, tive que me virar sozinho um pouco.&lt;br /&gt;&lt;br /&gt;Vou aqui explicar como fiz:&lt;br /&gt;Antes de qualquer coisa, você deve baixar o SyntaxHighLighter no site &lt;a href="http://code.google.com/p/syntaxhighlighter/"&gt;http://code.google.com/p/syntaxhighlighter/&lt;/a&gt;, pois, será necessário colocar os arquivos nele contidos em um servidor, para posteriormente você apontar para eles, dessa maneira funcionará.&lt;br /&gt;Vá em Layout -&gt; Editar HTML. No código do modelo (que é o template de cada post novo criado) você deve procurar por uma div de id outer-wrapper. Outros blogs diziam para procurar por "&lt;!-- end outer-wrapper --&gt;" mas não sei porque isso não funcionou comigo, no meu template não havia isso, mas basta achar o final da div de id outer-wrapper, aproveite e marque o final dela com o comentário "&lt;!-- end outer-wrapper --&gt;."&lt;br /&gt;&lt;br /&gt;Logo após essa div, você deve colocar o código abaixo:&lt;br /&gt;&lt;br /&gt;&lt;textarea name="code" class="javascript"&gt;&lt;br /&gt; &amp;lt;link href='http://NOMEDOHOST/css/SyntaxHighlighter.css' rel='stylesheet' type='text/css'/&amp;gt; &lt;br /&gt; &amp;lt;script src='http://NOMEDOHOST/js/shCore.js' type='text/javascript'/&amp;gt; &lt;br /&gt;  &lt;br /&gt; &amp;lt;script src='http://NOMEDOHOST/js/shBrushCpp.js' type='text/javascript'/&amp;gt; &lt;br /&gt; &amp;lt;script src='http://NOMEDOHOST/js/shBrushCSharp.js' type='text/javascript'/&amp;gt; &lt;br /&gt; &amp;lt;script src='http://NOMEDOHOST/js/shBrushCss.js' type='text/javascript'/&amp;gt; &lt;br /&gt; &amp;lt;script src='http://NOMEDOHOST/js/shBrushJava.js' type='text/javascript'/&amp;gt;&gt; &lt;br /&gt; &amp;lt;script src='http://NOMEDOHOST/js/shBrushJScript.js' type='text/javascript'/&amp;gt; &lt;br /&gt; &amp;lt;script src='http://NOMEDOHOST/js/shBrushSql.js' type='text/javascript'/&amp;gt; &lt;br /&gt; &amp;lt;script src='http://NOMEDOHOST/js/shBrushXml.js' type='text/javascript'/&amp;gt; &lt;br /&gt;  &lt;br /&gt; &lt;script class='javascript'&gt; &lt;br /&gt; //&amp;lt;![CDATA[ &lt;br /&gt;     function FindTagsByName(container, name, Tag) &lt;br /&gt;     { &lt;br /&gt;         var elements = document.getElementsByTagName(Tag); &lt;br /&gt;         for (var i = 0; i &lt; elements.length; i++) &lt;br /&gt;         { &lt;br /&gt;             if (elements[i].getAttribute("name") == name) &lt;br /&gt;             { &lt;br /&gt;                 container.push(elements[i]); &lt;br /&gt;             } &lt;br /&gt;         } &lt;br /&gt;     } &lt;br /&gt;     var elements = []; &lt;br /&gt;     FindTagsByName(elements, "code", "pre"); &lt;br /&gt;     FindTagsByName(elements, "code", "textarea"); &lt;br /&gt;   &lt;br /&gt;  for(var i=0; i &lt; elements.length; i++) { &lt;br /&gt;   if(elements[i].nodeName.toUpperCase() == "TEXTAREA") { &lt;br /&gt;    var childNode = elements[i].childNodes[0]; &lt;br /&gt;    var newNode = document.createTextNode(childNode.nodeValue.replace(/&lt;br\s*\/?&gt;/gi,'\n')); &lt;br /&gt;    elements[i].replaceChild(newNode, childNode); &lt;br /&gt;     &lt;br /&gt;   } &lt;br /&gt; else if(elements[i].nodeName.toUpperCase() == "PRE") { &lt;br /&gt;    brs = elements[i].getElementsByTagName("br"); &lt;br /&gt;    for(var j = 0, brLength = brs.length; j &lt; brLength; j++) { &lt;br /&gt;     var newNode = document.createTextNode("\n"); &lt;br /&gt;     elements[i].replaceChild(newNode, brs[0]); &lt;br /&gt;    } &lt;br /&gt;   } &lt;br /&gt;  } &lt;br /&gt;   //clipboard does not work well, no line breaks &lt;br /&gt;   // dp.SyntaxHighlighter.ClipboardSwf =  &lt;br /&gt;   //"http://liftweb.net/highlighting/swf/clipboard.swf"; &lt;br /&gt;   dp.SyntaxHighlighter.HighlightAll("code"); &lt;br /&gt; //]]&amp;gt; &lt;br /&gt; &lt;/script&gt; &lt;br /&gt;&lt;/textarea&gt;&lt;br /&gt;&lt;br /&gt;Você pode reparar que após o http:// temos NOMEDOHOST, isso porque será necessário que você disponibilize esses arquivos em algum servidor web, por exemplo o google pages.&lt;br /&gt;&lt;br /&gt;Após isso está tudo pronto para postar códigos de exemplo, basta ver o site oficial para aprender o seu uso: &lt;a href="http://code.google.com/p/syntaxhighlighter/"&gt;http://code.google.com/p/syntaxhighlighter/&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1425412311172548511-8903233389116575953?l=ffiaux.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ffiaux.blogspot.com/feeds/8903233389116575953/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1425412311172548511&amp;postID=8903233389116575953' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1425412311172548511/posts/default/8903233389116575953'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1425412311172548511/posts/default/8903233389116575953'/><link rel='alternate' type='text/html' href='http://ffiaux.blogspot.com/2008/06/posts-com-cdigo-fonte.html' title='Posts com código fonte'/><author><name>Fernando Fiaux de Moraes</name><uri>http://www.blogger.com/profile/04449867655225177461</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1425412311172548511.post-3972558352626237906</id><published>2008-06-04T13:42:00.004-03:00</published><updated>2008-12-08T20:08:36.253-02:00</updated><title type='text'></title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_uS-Os5oGWj4/SEbHnzqWgKI/AAAAAAAAAAM/O0LydF_u8UE/s1600-h/logo.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://2.bp.blogspot.com/_uS-Os5oGWj4/SEbHnzqWgKI/AAAAAAAAAAM/O0LydF_u8UE/s320/logo.jpg" alt="" id="BLOGGER_PHOTO_ID_5208069505797226658" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;O Firefox na versão 3 está quase pronto e foi criada uma campanha na tentativa de quebrar o recorde mundial de downloads de um software, ela está sendo chamada de Download Day. Basta acessar o site e confirmar a participação que no dia do lançamento você recebe um email avisando sobre o download. Mais de 700 mil pessoas já confirmaram, resta saber se no dia vai ser possível fazer o download. Segue o link: &lt;a href="http://www.spreadfirefox.com/pt-BR/worldrecord"&gt;http://www.spreadfirefox.com/pt-BR/worldrecord&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1425412311172548511-3972558352626237906?l=ffiaux.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ffiaux.blogspot.com/feeds/3972558352626237906/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1425412311172548511&amp;postID=3972558352626237906' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1425412311172548511/posts/default/3972558352626237906'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1425412311172548511/posts/default/3972558352626237906'/><link rel='alternate' type='text/html' href='http://ffiaux.blogspot.com/2008/06/o-firefox-na-verso-3-est-quase-pronto-e.html' title=''/><author><name>Fernando Fiaux de Moraes</name><uri>http://www.blogger.com/profile/04449867655225177461</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_uS-Os5oGWj4/SEbHnzqWgKI/AAAAAAAAAAM/O0LydF_u8UE/s72-c/logo.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1425412311172548511.post-3332105413061132401</id><published>2008-05-15T23:43:00.005-03:00</published><updated>2008-07-02T01:07:17.056-03:00</updated><title type='text'></title><content type='html'>Sou Fernando Fiaux de Moraes, natural do Rio de Janeiro, onde resido. Bacharel em Informática pela &lt;a href="http://www.puc-rio.br/"&gt;Pontifícia Universidade Católica do Rio de Janeiro&lt;/a&gt; em 2007, atualmente atuo como profissional na área de desenvolvimento de sistemas no &lt;a href="http://www.impa.br/"&gt;IMPA&lt;/a&gt; - Instituto de Matemática Pura e Aplicada - .&lt;br /&gt;&lt;br /&gt;Trabalho desenvolvendo sistemas WEB com Java. Utilizo tecnologias como: Struts, Hibernate, Spring, Maven, MySQL, Linux.&lt;br /&gt;&lt;br /&gt;Atualmente busco novas áreas de atuação, seja como consultor, freelancer, etc. Quero poder botar em prática outros conhecimentos, outras tecnologias, de desenvolvimento WEB como GWT, ICEfaces, Ruby, Ruby on Rails e é claro: Java. Além de desenvolvimento Desktop com Swing.&lt;br /&gt;&lt;br /&gt;Fernando Fiaux de Moraes&lt;br /&gt;ffiaux@gmail.com&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1425412311172548511-3332105413061132401?l=ffiaux.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ffiaux.blogspot.com/feeds/3332105413061132401/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1425412311172548511&amp;postID=3332105413061132401' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1425412311172548511/posts/default/3332105413061132401'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1425412311172548511/posts/default/3332105413061132401'/><link rel='alternate' type='text/html' href='http://ffiaux.blogspot.com/2008/05/pgina-em-construo.html' title=''/><author><name>Fernando Fiaux de Moraes</name><uri>http://www.blogger.com/profile/04449867655225177461</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>
