<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet href="http://feeds.feedburner.com/~d/styles/rss2full.xsl" type="text/xsl" media="screen"?><?xml-stylesheet href="http://feeds.feedburner.com/~d/styles/itemcontent.css" type="text/css" media="screen"?><rss 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:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">

<channel>
	<title>Blog do PJ</title>
	
	<link>http://paulojeronimo.com</link>
	<description>Paulo Jerônimo</description>
	<pubDate>Wed, 22 Oct 2008 20:24:43 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.6.2</generator>
	<language>en</language>
			<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" href="http://feeds.feedburner.com/paulojeronimo" type="application/rss+xml" /><item>
		<title>Saudades do C++?</title>
		<link>http://feeds.feedburner.com/~r/paulojeronimo/~3/428875339/</link>
		<comments>http://paulojeronimo.com/2008/10/22/saudades-do-c/#comments</comments>
		<pubDate>Wed, 22 Oct 2008 19:28:18 +0000</pubDate>
		<dc:creator>PJ</dc:creator>
		
		<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://paulojeronimo.com/?p=125</guid>
		<description><![CDATA[
Às vezes, pra me lembrar de meus bons tempos como programador em C++ (1995-2002), eu estudo um pouco do material disponibilizado gratuitamente pela Stanford Engineering.
 
O curso é disponibilizado gratuitamente, com excelentes materiais (em inglês).

]]></description>
			<content:encoded><![CDATA[<p><!--[endif]--></p>
<p class="MsoNormal"><span style="font-size: 10pt; font-family: Arial;">Às vezes, pra me lembrar de meus bons tempos como programador em C++ (1995-2002), eu estudo um pouco do <a href="http://see.stanford.edu/see/courses.aspx">material disponibilizado gratuitamente pela Stanford Engineering</a>.</span></p>
<p class="MsoNormal"><span style="font-size: 10pt; font-family: Arial;"> </span></p>
<p class="MsoNormal"><span style="font-size: 10pt; font-family: Arial;">O curso é disponibilizado gratuitamente, com excelentes materiais (em inglês).</span></p>
<p class="MsoNormal">
]]></content:encoded>
			<wfw:commentRss>http://paulojeronimo.com/2008/10/22/saudades-do-c/feed/</wfw:commentRss>
		<feedburner:origLink>http://paulojeronimo.com/2008/10/22/saudades-do-c/</feedburner:origLink></item>
		<item>
		<title>Treinamento de JBoss na Dígitro</title>
		<link>http://feeds.feedburner.com/~r/paulojeronimo/~3/402161464/16</link>
		<comments>http://ladoservidor.com/node/16#comments</comments>
		<pubDate>Wed, 24 Sep 2008 21:03:51 +0000</pubDate>
		<dc:creator>Paulo Jerônimo</dc:creator>
		
		<category><![CDATA[ladoservidor]]></category>

		<guid isPermaLink="false">16 at http://ladoservidor.com</guid>
		<description><![CDATA[No dia 12 de setembro começou, no Cliente <a href="http://www.digitro.com.br">Dígitro</a>, em Florianópolis-SC, outra versão dos treinamentos de JBoss do Lado Servidor:
<ol>
<li><a href="http://ladoservidor.com/treinamentos/intro-javaee-jbossas">Introdução a Java EE utilizando o JBoss AS</a>, dia 12/Set;
<li><a href="http://ladoservidor.com/treinamentos/adm-basica-jbossas">Administração básica do JBoss AS</a>, dias 13, 14 e 26/Set;
<li><a href="http://ladoservidor.com/treinamentos/arq-jbossas">Arquitetura e funcionamento do JBoss AS</a>, dias 27 e 28/Set, 11 e 12/Out;
</ol>
Em breve estarei publicando aqui, alguns dos vídeos relativos a tarefas administrativas que desenvolvemos durante o treinamento.]]></description>
			<content:encoded><![CDATA[No dia 12 de setembro começou, no Cliente <a href="http://www.digitro.com.br">Dígitro</a>, em Florianópolis-SC, outra versão dos treinamentos de JBoss do Lado Servidor:
<ol>
<li><a href="http://ladoservidor.com/treinamentos/intro-javaee-jbossas">Introdução a Java EE utilizando o JBoss AS</a>, dia 12/Set;
<li><a href="http://ladoservidor.com/treinamentos/adm-basica-jbossas">Administração básica do JBoss AS</a>, dias 13, 14 e 26/Set;
<li><a href="http://ladoservidor.com/treinamentos/arq-jbossas">Arquitetura e funcionamento do JBoss AS</a>, dias 27 e 28/Set, 11 e 12/Out;
</ol>
Em breve estarei publicando aqui, alguns dos vídeos relativos a tarefas administrativas que desenvolvemos durante o treinamento.]]></content:encoded>
			<wfw:commentRss>http://ladoservidor.com/node/16/feed/</wfw:commentRss>
		<feedburner:origLink>http://ladoservidor.com/node/16</feedburner:origLink></item>
		<item>
		<title>Ant ou Gant?</title>
		<link>http://feeds.feedburner.com/~r/paulojeronimo/~3/402161465/15</link>
		<comments>http://ladoservidor.com/node/15#comments</comments>
		<pubDate>Wed, 24 Sep 2008 20:31:46 +0000</pubDate>
		<dc:creator>Paulo Jerônimo</dc:creator>
		
		<category><![CDATA[ladoservidor]]></category>

		<guid isPermaLink="false">15 at http://ladoservidor.com</guid>
		<description><![CDATA[O Javalobby publicou <A HREF="http://java.dzone.com/articles/ant-or-gant-part-1">este artigo</A> com o mesmo título deste post (mas em inglês), escrito por Meera Subbarao. Eu achei bastante interessante e estou experimentando o <A HREF="http://gant.codehaus.org">Gant</A> para tentar simplificar alguns scripts Ant que tenho que manter em meu trabalho.
</P>
<P>
Ao tentar utilizar o Gant no <A HREF="http://cygwin.com">cygwin</A> de um destkop em meu trabalho, eu obtive a seguinte falha:
</P>
<PRE>
  $ gant
  exception while configuring main class loader:
  java.io.FileNotFoundException: C;c:\pj\ferramentas\java\gant-1.4.0\conf\gant-starter.conf 
  (A sintaxe do nome do arquivo, pasta ou nome do volume está incorreta)
      at java.io.FileInputStream.open(Native Method)
      at java.io.FileInputStream.&#60;init&#62;(FileInputStream.java:106)
      at java.io.FileInputStream.&#60;init&#62;(FileInputStream.java:66)
      at org.codehaus.groovy.tools.GroovyStarter.rootLoader(GroovyStarter.java:81)
      at org.codehaus.groovy.tools.GroovyStarter.main(GroovyStarter.java:130)
</PRE>
<P></P>
<P>
Fiz a correção modificacando os seguintes arquivos no <A HREF="http://groovy.codehaus.org">Groovy</A> e no GAnt:
</P>
<PRE>
  $ cd $GANT_HOME/bin
  $ diff gant.original gant
  62,63c62,63
  &#60;     GANT_HOME=`cygpath --path --mixed "$GANT_HOME"`
  &#60;     ANT_HOME=`cygpath --path --mixed "$ANT_HOME"`
  ---
  &#62;     GANT_HOME=`cygpath --mixed "$GANT_HOME"`
  &#62;     ANT_HOME=`cygpath --mixed "$ANT_HOME"`
  $ cd $GROOVY_HOME/bin
  $ diff startGroovy.original startGroovy
  197,199c197,199
  &#60;     GROOVY_HOME=`cygpath --path --mixed "$GROOVY_HOME"`
  &#60;     JAVA_HOME=`cygpath --path --mixed "$JAVA_HOME"`
  &#60;     GROOVY_CONF=`cygpath --path --mixed "$GROOVY_CONF"`
  ---
  &#62;     GROOVY_HOME=`cygpath --mixed "$GROOVY_HOME"`
  &#62;     JAVA_HOME=`cygpath --mixed "$JAVA_HOME"`
  &#62;     GROOVY_CONF=`cygpath --mixed "$GROOVY_CONF"`
</PRE>
<P>
Esta mudança se fez necessária em função de que o parâmetro --path do utilitário cygpath só faz sentido quando o parâmetro passado é uma lista contendo um caminho (PATH). Todas as variávies *_HOME não são listas de PATHs e sim um caminho único indicando o diretório de instalação de uma ferramenta.
</P>
<P>
Encaminhei <A HREF="http://archive.codehaus.org/lists/org.codehaus.gant.user/msg/25ffc66d0809231028k17c94e39udadf77eea4c8034f@mail.gmail.com">este email</A> para o Russel Winder, desenvolvedor do Gant, que prontamente respondeu-me dizendo que se a solução estiver OK para mim, ela será incorportada no próximo release do Gant.
</P>
<P>
Software livre é isto! Colaboração!!
]]></description>
			<content:encoded><![CDATA[O Javalobby publicou <A HREF="http://java.dzone.com/articles/ant-or-gant-part-1">este artigo</A> com o mesmo título deste post (mas em inglês), escrito por Meera Subbarao. Eu achei bastante interessante e estou experimentando o <A HREF="http://gant.codehaus.org">Gant</A> para tentar simplificar alguns scripts Ant que tenho que manter em meu trabalho.
</P>
<P>
Ao tentar utilizar o Gant no <A HREF="http://cygwin.com">cygwin</A> de um destkop em meu trabalho, eu obtive a seguinte falha:
</P>
<PRE>
  $ gant
  exception while configuring main class loader:
  java.io.FileNotFoundException: C;c:\pj\ferramentas\java\gant-1.4.0\conf\gant-starter.conf 
  (A sintaxe do nome do arquivo, pasta ou nome do volume está incorreta)
      at java.io.FileInputStream.open(Native Method)
      at java.io.FileInputStream.&lt;init&gt;(FileInputStream.java:106)
      at java.io.FileInputStream.&lt;init&gt;(FileInputStream.java:66)
      at org.codehaus.groovy.tools.GroovyStarter.rootLoader(GroovyStarter.java:81)
      at org.codehaus.groovy.tools.GroovyStarter.main(GroovyStarter.java:130)
</PRE>
<P></P>
<P>
Fiz a correção modificacando os seguintes arquivos no <A HREF="http://groovy.codehaus.org">Groovy</A> e no GAnt:
</P>
<PRE>
  $ cd $GANT_HOME/bin
  $ diff gant.original gant
  62,63c62,63
  &lt;     GANT_HOME=`cygpath --path --mixed "$GANT_HOME"`
  &lt;     ANT_HOME=`cygpath --path --mixed "$ANT_HOME"`
  ---
  &gt;     GANT_HOME=`cygpath --mixed "$GANT_HOME"`
  &gt;     ANT_HOME=`cygpath --mixed "$ANT_HOME"`
  $ cd $GROOVY_HOME/bin
  $ diff startGroovy.original startGroovy
  197,199c197,199
  &lt;     GROOVY_HOME=`cygpath --path --mixed "$GROOVY_HOME"`
  &lt;     JAVA_HOME=`cygpath --path --mixed "$JAVA_HOME"`
  &lt;     GROOVY_CONF=`cygpath --path --mixed "$GROOVY_CONF"`
  ---
  &gt;     GROOVY_HOME=`cygpath --mixed "$GROOVY_HOME"`
  &gt;     JAVA_HOME=`cygpath --mixed "$JAVA_HOME"`
  &gt;     GROOVY_CONF=`cygpath --mixed "$GROOVY_CONF"`
</PRE>
<P>
Esta mudança se fez necessária em função de que o parâmetro --path do utilitário cygpath só faz sentido quando o parâmetro passado é uma lista contendo um caminho (PATH). Todas as variávies *_HOME não são listas de PATHs e sim um caminho único indicando o diretório de instalação de uma ferramenta.
</P>
<P>
Encaminhei <A HREF="http://archive.codehaus.org/lists/org.codehaus.gant.user/msg/25ffc66d0809231028k17c94e39udadf77eea4c8034f@mail.gmail.com">este email</A> para o Russel Winder, desenvolvedor do Gant, que prontamente respondeu-me dizendo que se a solução estiver OK para mim, ela será incorportada no próximo release do Gant.
</P>
<P>
Software livre é isto! Colaboração!!
]]></content:encoded>
			<wfw:commentRss>http://ladoservidor.com/node/15/feed/</wfw:commentRss>
		<feedburner:origLink>http://ladoservidor.com/node/15</feedburner:origLink></item>
		<item>
		<title>Oportunidade em JBoss no Rio de Janeiro</title>
		<link>http://feeds.feedburner.com/~r/paulojeronimo/~3/365890449/</link>
		<comments>http://paulojeronimo.com/2008/08/15/oportunidade-em-jboss-no-rio-de-janeiro/#comments</comments>
		<pubDate>Fri, 15 Aug 2008 18:48:30 +0000</pubDate>
		<dc:creator>PJ</dc:creator>
		
		<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://paulojeronimo.com/?p=119</guid>
		<description><![CDATA[A empresa em que trabalho está em busca de um(a) profissional em JBoss. Esta pessoa irá atuar junto à minha equipe em tarefas relacionadas a instalação, configuração, monitoramento e tuning deste servidor de aplicações. É fundamental que a pessoa possua experiência em: Java EE, JBoss, Ant, CVS, Linux e Shell Script. É desejável conhecimentos em [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://paulojeronimo.com/2008/01/30/mudanca-para-o-rio-de-janeiro/">A empresa em que trabalho</a> está em busca de um(a) profissional em JBoss. Esta pessoa irá atuar junto à minha equipe em tarefas relacionadas a instalação, configuração, monitoramento e tuning deste servidor de aplicações. É fundamental que a pessoa possua experiência em: Java EE, JBoss, Ant, CVS, Linux e Shell Script. É desejável conhecimentos em Apache HTTP Server, Subversion (e/ou GIT), ferramentas para testes de performance (Ex.: JMeter), profilers (Ex.: JProfiler) e ferramentas para monitoração (Ex.: <a href="http://www.jboss.com/products/jbosson">JON</a>, <a href="http://www.rhq-project.org/">RHQ Project</a>).</p>
<p>A empresa oferece a contratação no regime CLT incluindo os seguintes benefícios: plano de aposentadoria, de saúde/odontológico, assistência funeral, seguro de vida, vale alimentação, anuênio, auxílio creche, empréstimo consignado, anuênio e prêmio semestral em dinheiro (mediante avaliação de desempenho).</p>
<p>Se você tiver interesse, envie seu currículo para os seguintes emails: pj arroba paulojeronimo ponto com; zero arroba openlink ponto com ponto br.</p>
]]></content:encoded>
			<wfw:commentRss>http://paulojeronimo.com/2008/08/15/oportunidade-em-jboss-no-rio-de-janeiro/feed/</wfw:commentRss>
		<feedburner:origLink>http://paulojeronimo.com/2008/08/15/oportunidade-em-jboss-no-rio-de-janeiro/</feedburner:origLink></item>
		<item>
		<title>Seja agradecido… Você só tem a ganhar!</title>
		<link>http://feeds.feedburner.com/~r/paulojeronimo/~3/319315650/</link>
		<comments>http://paulojeronimo.com/2008/06/20/seja-agradecido-voce-so-tem-a-ganhar/#comments</comments>
		<pubDate>Fri, 20 Jun 2008 14:02:44 +0000</pubDate>
		<dc:creator>PJ</dc:creator>
		
		<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://paulojeronimo.com/?p=117</guid>
		<description><![CDATA[Veja um caso simples que é praticado por pessoas da lanchonete Big Bi, aqui no Rio, aonde costumo fazer lanches e tomar meu café da manhã de vez em quando:
Todo vez que alguém paga R$ X a mais por um lanche, o atendende do balcão GRITA:
- Caixinha!!
Se o R$ X é gordo, a frase muda [...]]]></description>
			<content:encoded><![CDATA[<p>Veja um caso simples que é praticado por pessoas da lanchonete Big Bi, aqui no Rio, aonde costumo fazer lanches e tomar meu café da manhã de vez em quando:</p>
<p>Todo vez que alguém paga R$ X a mais por um lanche, o atendende do balcão GRITA:</p>
<p>- Caixinha!!</p>
<p>Se o R$ X é gordo, a frase muda para:</p>
<p>- Caixinha gorda!!!</p>
<p>E toda a equipe de atendentes e de retaguarda, que prepara os lanches, grita em alto e bom tom:</p>
<p>- Obrigado!!!</p>
<p>Este simples gesto, acredito eu, motiva muita gente a pagar um pouco mais por seu lanche, simplesmente para receberem o sonoro &#8220;Obrigado&#8221;. Pode até ser marketing (e deve ser né), mas nada melhor do que sentir que você foi importante para alguém e que mereceu o seu agradecimento não é?</p>
<p>Resumindo então: agradecer é bom, e em alguns casos pode até lhe fazer ganhar mais, correto?</p>
]]></content:encoded>
			<wfw:commentRss>http://paulojeronimo.com/2008/06/20/seja-agradecido-voce-so-tem-a-ganhar/feed/</wfw:commentRss>
		<feedburner:origLink>http://paulojeronimo.com/2008/06/20/seja-agradecido-voce-so-tem-a-ganhar/</feedburner:origLink></item>
		<item>
		<title>Gerando apresentações S5 com o Txt2tags</title>
		<link>http://feeds.feedburner.com/~r/paulojeronimo/~3/308961749/13</link>
		<comments>http://ladoservidor.com/node/13#comments</comments>
		<pubDate>Tue, 10 Jun 2008 14:11:05 +0000</pubDate>
		<dc:creator>Paulo Jerônimo</dc:creator>
		
		<category><![CDATA[ladoservidor]]></category>

		<guid isPermaLink="false">13 at http://ladoservidor.com</guid>
		<description><![CDATA[<P>

Eu já utilizo o <A HREF="http://txt2tags.sourceforge.net">Txt2tags</A> para a geração de propostas de trabalho, escritas de artigos, sites, ... e agora também, para gerar apresentações no formato <A HREF="http://meyerweb.com/eric/tools/s5/">S5</A>!
</P>
<P>
Antes de entrar no assunto deste post propriamente dito, quero expressar <B>minha opinião sobre o Txt2tags: ele é simples, inteligente e faz o que precisa ser feito, possibilitando que seu usuário seja criativo para resolver um problema de diferentes formas. Fabuloso!</B> Apesar de atualmente vermos na Web cada vez mais e mais páginas dinâmicas serem criadas com o auxílio de ferramentas poderosas e cheias de recursos como Wikis, alternativas e flexibilidade tão grandes como as que são fornecidas pelo Txt2tags são menos visíveis nestas ferramentas. O uso de <A HREF="http://guia-er.sourceforge.net">expressões regulares</A> é o que garante tais características. Outro poder dado pelo Txt2tags, e muito importante para mim, é o de gerar, a partir de um único fonte, variados tipos de documentos: Txt, HTML, XHTML, Latex, ..., e, com este post, pretendo demonstrar como gerar mais um: o <A HREF="http://meyerweb.com/eric/tools/s5/">S5</A>.

</P>
<P>
Na verdade, o <A HREF="http://meyerweb.com/eric/tools/s5/">S5</A> (A Simple Standards-Based Slide Show Systemi) não é um novo formato de documento, mas sim, um código HTML carregado de folhas de estilo (CSS) e código JavaScript, que oferecem ao navegador, a possibilidade de mostrar uma página com marcações (divs) como se fosse uma apresentação escrita em <A HREF="http://www.openoffice.org/">OpenOffice</A>, por exemplo. Eu tenho uma certa antipatia a ferramentas como este último, pela dificuldade que tenho para poder escrever links, e agregar formatos diferentes como vídeos, código, etc. Além disto, eu gosto mesmo de escrever é com o <A HREF="http://vim.org">VIM</A>. Como já disse várias vezes para alunos em cursos que ministrei e para colegas de trabalho, se me colocam um editor como <A HREF="http://www.gnome.org/projects/gedit/">gedit</A> nas mãos, para editar algo, eu me sinto de braços e pernas quebradas... Imagina se pedissem pra trabalhar com um notepad ;-) Só pra concluir: um documento <A HREF="http://txt2tags.sourceforge.net">Txt2tags</A> também pode ficar coloridinho e com a sintaxe destacada no <A HREF="http://vim.org">VIM</A>.

</P>
<P>
Vamos então ao que interessa, que é a explicação do <A HREF="http://ladoservidor.com/arquivos/exemplos/txt2tags/curso-maven.zip">exemplo</A> que você poderá utilizar para criar suas próprias apresentações em <A HREF="http://meyerweb.com/eric/tools/s5/">S5</A>, a partir do <A HREF="http://txt2tags.sourceforge.net">Txt2tags</A>. Baixe o arquivo para sua máquina e descompacte-o em um diretório qualquer. 
</P>
<P>
O arquivo <A HREF="http://ladoservidor.com/arquivos/exemplos/txt2tags/curso-maven/urls.t2t">urls.t2t</A> (no diretório do exemplo) demonstra como eu criei URLs que podem ser adicionadas a um documento t2t qualquer, como no arquivo <A HREF="http://ladoservidor.com/arquivos/exemplos/txt2tags/curso-maven/index.t2t">index.t2t</A>. Lendo com calma o arquivo (sugiro que utilize o <A HREF="http://vim.org">VIM</A>, com a sintax para o t2t habilitada), você verá que os links deste documento são gerados através da utilização das expressões regulares comentadas (leia-os!). Analise bem estas expressões, pois elas dão poder e flexibilidade para criação de um documento qualquer, evitando o trabalho enfadonho de ficar escrevendo links de maneira repetida, como num texto HTML qualquer. Note também, as formas de utilizar o link, tanto numa expressão de pré-processamento <CODE>%!preproc</CODE> do documento t2t quanto numa com pós-processamento <CODE>%!posproc</CODE>.

</P>
<P>
O arquivo <A HREF="http://ladoservidor.com/arquivos/exemplos/txt2tags/curso-maven/defs.t2t">defs.t2t</A> contém definições gerais e mais uma expressão regular mágica, utilizada no pós-processamento do documento (leia com atenção).
</P>
<P>
O arquivo <A HREF="http://ladoservidor.com/arquivos/exemplos/txt2tags/curso-maven/s5-defs.t2t">s5-defs.t2t</A> é responsável por incluir, no cabeçalho do HTML gerado para a apresentação <A HREF="http://meyerweb.com/eric/tools/s5/">S5</A>, as folhas de estilo, o código JavaScript e também define alguns marcadores (que chamei de tags) para as divs que serão interpretadas pelo <A HREF="http://meyerweb.com/eric/tools/s5/">S5</A>.
</P>

<P>
Os arquivos <A HREF="http://ladoservidor.com/arquivos/exemplos/txt2tags/curso-maven/layout.t2t">layout.t2t</A> e <A HREF="http://ladoservidor.com/arquivos/exemplos/txt2tags/curso-maven/header.t2t">header.t2t</A> não contém expressões de pré ou pós processamento do <A HREF="http://txt2tags.sourceforge.net">Txt2tags</A> mas sim, as tags que definem o layout da apresentação <A HREF="http://meyerweb.com/eric/tools/s5/">S5</A> e um cabeçalho que poderá ser compartilhado por várias apresentações neste mesmo formato.
</P>
<P>
Enfim, veja o exemplo, e ser ele for útil para você, sinta-se a vontade para copiá-lo, modificá-lo e/ou redistribuí-lo. Eu o criei porque precisava de algo simples para construir as apresentação para <A HREF="http://ladoservidor.com/arquivos/exemplos/txt2tags/curso-maven">este curso</A>. Mas, achei que seria uma boa contribuição para a <A HREF="http://tech.groups.yahoo.com/group/txt2tags-br/">comunidade Txt2tags</A> a disponibilização do código. 

</P>
<P>
Quero agradecer ao <A HREF="http://aurelio.net/">Aurélio</A> pelas excelentes ferramentas <A HREF="http://txt2tags.sourceforge.net">Txt2tags</A> e <A HREF="http://funcoeszz.net/">FuncoesZZ</A> (que também utilizo bastante) e desejo que o livro <A HREF="http://www.shellscript.com.br">Shell Script Profissional</A> seja um sucesso de vendas! (Já adquiri minha cópia e realmente é um excelente livro).
</P>
<P>

<A HREF="http://txt2tags.sourceforge.net"><IMG ALIGN="middle" SRC="http://txt2tags.sourceforge.net/img/t2tpowered-white.png" BORDER="0" ALT=""></A> <A HREF="http://ladoservidor.com/arquivos/exemplos/txt2tags/artigo.zip">Fontes deste artigo</A>
</P>
]]></description>
			<content:encoded><![CDATA[<P>

Eu já utilizo o <A HREF="http://txt2tags.sourceforge.net">Txt2tags</A> para a geração de propostas de trabalho, escritas de artigos, sites, ... e agora também, para gerar apresentações no formato <A HREF="http://meyerweb.com/eric/tools/s5/">S5</A>!
</P>
<P>
Antes de entrar no assunto deste post propriamente dito, quero expressar <B>minha opinião sobre o Txt2tags: ele é simples, inteligente e faz o que precisa ser feito, possibilitando que seu usuário seja criativo para resolver um problema de diferentes formas. Fabuloso!</B> Apesar de atualmente vermos na Web cada vez mais e mais páginas dinâmicas serem criadas com o auxílio de ferramentas poderosas e cheias de recursos como Wikis, alternativas e flexibilidade tão grandes como as que são fornecidas pelo Txt2tags são menos visíveis nestas ferramentas. O uso de <A HREF="http://guia-er.sourceforge.net">expressões regulares</A> é o que garante tais características. Outro poder dado pelo Txt2tags, e muito importante para mim, é o de gerar, a partir de um único fonte, variados tipos de documentos: Txt, HTML, XHTML, Latex, ..., e, com este post, pretendo demonstrar como gerar mais um: o <A HREF="http://meyerweb.com/eric/tools/s5/">S5</A>.

</P>
<P>
Na verdade, o <A HREF="http://meyerweb.com/eric/tools/s5/">S5</A> (A Simple Standards-Based Slide Show Systemi) não é um novo formato de documento, mas sim, um código HTML carregado de folhas de estilo (CSS) e código JavaScript, que oferecem ao navegador, a possibilidade de mostrar uma página com marcações (divs) como se fosse uma apresentação escrita em <A HREF="http://www.openoffice.org/">OpenOffice</A>, por exemplo. Eu tenho uma certa antipatia a ferramentas como este último, pela dificuldade que tenho para poder escrever links, e agregar formatos diferentes como vídeos, código, etc. Além disto, eu gosto mesmo de escrever é com o <A HREF="http://vim.org">VIM</A>. Como já disse várias vezes para alunos em cursos que ministrei e para colegas de trabalho, se me colocam um editor como <A HREF="http://www.gnome.org/projects/gedit/">gedit</A> nas mãos, para editar algo, eu me sinto de braços e pernas quebradas... Imagina se pedissem pra trabalhar com um notepad ;-) Só pra concluir: um documento <A HREF="http://txt2tags.sourceforge.net">Txt2tags</A> também pode ficar coloridinho e com a sintaxe destacada no <A HREF="http://vim.org">VIM</A>.

</P>
<P>
Vamos então ao que interessa, que é a explicação do <A HREF="http://ladoservidor.com/arquivos/exemplos/txt2tags/curso-maven.zip">exemplo</A> que você poderá utilizar para criar suas próprias apresentações em <A HREF="http://meyerweb.com/eric/tools/s5/">S5</A>, a partir do <A HREF="http://txt2tags.sourceforge.net">Txt2tags</A>. Baixe o arquivo para sua máquina e descompacte-o em um diretório qualquer. 
</P>
<P>
O arquivo <A HREF="http://ladoservidor.com/arquivos/exemplos/txt2tags/curso-maven/urls.t2t">urls.t2t</A> (no diretório do exemplo) demonstra como eu criei URLs que podem ser adicionadas a um documento t2t qualquer, como no arquivo <A HREF="http://ladoservidor.com/arquivos/exemplos/txt2tags/curso-maven/index.t2t">index.t2t</A>. Lendo com calma o arquivo (sugiro que utilize o <A HREF="http://vim.org">VIM</A>, com a sintax para o t2t habilitada), você verá que os links deste documento são gerados através da utilização das expressões regulares comentadas (leia-os!). Analise bem estas expressões, pois elas dão poder e flexibilidade para criação de um documento qualquer, evitando o trabalho enfadonho de ficar escrevendo links de maneira repetida, como num texto HTML qualquer. Note também, as formas de utilizar o link, tanto numa expressão de pré-processamento <CODE>%!preproc</CODE> do documento t2t quanto numa com pós-processamento <CODE>%!posproc</CODE>.

</P>
<P>
O arquivo <A HREF="http://ladoservidor.com/arquivos/exemplos/txt2tags/curso-maven/defs.t2t">defs.t2t</A> contém definições gerais e mais uma expressão regular mágica, utilizada no pós-processamento do documento (leia com atenção).
</P>
<P>
O arquivo <A HREF="http://ladoservidor.com/arquivos/exemplos/txt2tags/curso-maven/s5-defs.t2t">s5-defs.t2t</A> é responsável por incluir, no cabeçalho do HTML gerado para a apresentação <A HREF="http://meyerweb.com/eric/tools/s5/">S5</A>, as folhas de estilo, o código JavaScript e também define alguns marcadores (que chamei de tags) para as divs que serão interpretadas pelo <A HREF="http://meyerweb.com/eric/tools/s5/">S5</A>.
</P>

<P>
Os arquivos <A HREF="http://ladoservidor.com/arquivos/exemplos/txt2tags/curso-maven/layout.t2t">layout.t2t</A> e <A HREF="http://ladoservidor.com/arquivos/exemplos/txt2tags/curso-maven/header.t2t">header.t2t</A> não contém expressões de pré ou pós processamento do <A HREF="http://txt2tags.sourceforge.net">Txt2tags</A> mas sim, as tags que definem o layout da apresentação <A HREF="http://meyerweb.com/eric/tools/s5/">S5</A> e um cabeçalho que poderá ser compartilhado por várias apresentações neste mesmo formato.
</P>
<P>
Enfim, veja o exemplo, e ser ele for útil para você, sinta-se a vontade para copiá-lo, modificá-lo e/ou redistribuí-lo. Eu o criei porque precisava de algo simples para construir as apresentação para <A HREF="http://ladoservidor.com/arquivos/exemplos/txt2tags/curso-maven">este curso</A>. Mas, achei que seria uma boa contribuição para a <A HREF="http://tech.groups.yahoo.com/group/txt2tags-br/">comunidade Txt2tags</A> a disponibilização do código. 

</P>
<P>
Quero agradecer ao <A HREF="http://aurelio.net/">Aurélio</A> pelas excelentes ferramentas <A HREF="http://txt2tags.sourceforge.net">Txt2tags</A> e <A HREF="http://funcoeszz.net/">FuncoesZZ</A> (que também utilizo bastante) e desejo que o livro <A HREF="http://www.shellscript.com.br">Shell Script Profissional</A> seja um sucesso de vendas! (Já adquiri minha cópia e realmente é um excelente livro).
</P>
<P>

<A HREF="http://txt2tags.sourceforge.net"><IMG ALIGN="middle" SRC="http://txt2tags.sourceforge.net/img/t2tpowered-white.png" BORDER="0" ALT=""></A> <A HREF="http://ladoservidor.com/arquivos/exemplos/txt2tags/artigo.zip">Fontes deste artigo</A>
</P>
]]></content:encoded>
			<wfw:commentRss>http://ladoservidor.com/node/13/feed/</wfw:commentRss>
		<feedburner:origLink>http://ladoservidor.com/node/13</feedburner:origLink></item>
		<item>
		<title>5 de junho, aniversário da minha parte feminina</title>
		<link>http://feeds.feedburner.com/~r/paulojeronimo/~3/305752267/</link>
		<comments>http://paulojeronimo.com/2008/06/05/5-de-junho-aniversario-da-minha-parte-feminina/#comments</comments>
		<pubDate>Fri, 06 Jun 2008 01:57:07 +0000</pubDate>
		<dc:creator>PJ</dc:creator>
		
		<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://paulojeronimo.com/?p=52</guid>
		<description><![CDATA[Cinco de Junho é a data do aniversário da minha parte feminina. 

É com esta parte que eu aprendo a me dedicar não somente ao trabalho, a pensar e agir para ter uma vida diferente, valorizando mais a minha família e menos o dinheiro. Não que este último não seja importante, afinal, é difícil mesmo [...]]]></description>
			<content:encoded><![CDATA[<p>Cinco de Junho é a data do aniversário da <strong>minha parte feminina</strong>. <img src='http://paulojeronimo.com/wp/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /><br />
<a href="http://picasaweb.google.com/paulojeronimo/Carnaval2008/photo#5164050718611012802"><img src="http://lh3.ggpht.com/paulojeronimo/R6pkxKzo_MI/AAAAAAAABdw/juMMLYkCdio/s288/DSC03528.JPG" alt="" /></a><br />
É com esta parte que eu aprendo a me dedicar não somente ao trabalho, a pensar e agir para ter uma vida diferente, valorizando mais a minha família e menos o dinheiro. Não que este último não seja importante, afinal, é difícil mesmo viver sem ele. Mas, como escutei de um amigo do trabalho hoje, <strong>o que levamos desta vida é a vida que levamos</strong>. Sendo assim, este post é só pra dizer para minha parte feminina que ela tem razão em querer ter uma vida mais tranquila, sossego ao chegar em casa, paz e calmaria ao colocar a orelha no travesseiro, na hora de dormir.</p>
<p>Este post é para expressar à minha mulher, namorada e amante o meu desejo de que ela tenha um feliz aniversário e uma vida cada vez melhor, hoje e sempre. Parabéns por mais um ano de vida e que Deus lhe conceda a graça de, a cada novo dia, se tornar uma pessoa melhor. Desejo também que eu consiga, sendo a sua parte masculina, fazê-la cada vez mais feliz, amando-a e respeitando-a sempre. Assim, cresceremos ambos.</p>
]]></content:encoded>
			<wfw:commentRss>http://paulojeronimo.com/2008/06/05/5-de-junho-aniversario-da-minha-parte-feminina/feed/</wfw:commentRss>
		<feedburner:origLink>http://paulojeronimo.com/2008/06/05/5-de-junho-aniversario-da-minha-parte-feminina/</feedburner:origLink></item>
		<item>
		<title>Thread Dumps</title>
		<link>http://feeds.feedburner.com/~r/paulojeronimo/~3/300964170/11</link>
		<comments>http://ladoservidor.com/node/11#comments</comments>
		<pubDate>Fri, 30 May 2008 03:03:54 +0000</pubDate>
		<dc:creator>Paulo Jerônimo</dc:creator>
		
		<category><![CDATA[ladoservidor]]></category>

		<guid isPermaLink="false">11 at http://ladoservidor.com</guid>
		<description><![CDATA[<P>
A obtenção de um <i>thread dump</i> ajuda a determinar o que um servidor está fazendo em um dado momento. Um <i>thread dump</i> lista todas as threads sendo executadas por uma aplicação Java e apresenta um <i>stack trace</i> para cada thread. Examinar um <i>thread dump</i> pode dar pistas de se um servidor está parando em determinados momentos. Por exemplo, assumindo que um servidor parou por algum motivo após uma aplicação ter sido iniciada, um <i>thread dump</i> pode ajudar a localizar a causa da parada.

</P>
<P>
A JVM produz um <i>thread dump</i> quando recebe um sinal QUIT. Este sinal pode ser enviado de várias formas, mas ele é geralmente enviado por um comando que envia sinais ou por uma combinação de teclas executadas na janela da aplicação Java em execução. No Unix/Linux, a combinação &#60;ctrl&#62;\ ou o comando <CODE>kill -QUIT id-do-processo</CODE> (equivale ao <CODE>kill -3 id-do-processo</CODE>) podem gerar um <i>thread dump</i>. No Windows, utilize a combinação &#60;ctrl&#62;&#60;break&#62;. Outra forma, é utilizar a interface GUI do <CODE><a href="http://java.sun.com/developer/technicalArticles/J2SE/jconsole.html">jconsole</a></CODE> que vem com o JDK 5.

</P>
<P>
O <a href="http://java.sun.com/developer/technicalArticles/J2SE/jconsole.html">jconsole</a> contém seis abas que mostram diversas informações sobre uma aplicação em execução. Uma delas é nomeada Threads e provê as mesmas informações mostradas por um <i>thread dump</i>.
</P>
<P>
Para executar uma aplicação Java de forma que esta possa ser monitorada pelo <CODE><a href="http://java.sun.com/developer/technicalArticles/J2SE/jconsole.html">jconsole</a></CODE> é necessário iniciá-la com o argumento <CODE>-Dcom.sun.management.jmxremote</CODE>. No caso do <a href="http://www.jboss.org/products/jbossas">JBoss AS</a> por exemplo, este argumento pode ser informado na variável de ambiente <CODE>JBOSS_OPTS</CODE> ou nos scripts de inicialização (<CODE>run.*</CODE>).

</P>
<P>
O <a href="http://java.sun.com/developer/technicalArticles/J2SE/jconsole.html">jconsole</a> também pode ser utilizado para substituir as funções de gerenciamento oferecidas pelo jmx-console. Você pode ler mais a respeito e ver como realizar a configuração do JBoss para suportar o gerenciamento de seus MBeans pelo <a href="http://java.sun.com/developer/technicalArticles/J2SE/jconsole.html">jconsole</a>, lendo <A HREF="http://wiki.jboss.org/wiki/JBossMBeansInJConsole">esta página no wiki do JBoss</A>.
</P>
<P>
A listagem produzida por um <i>thread dump</i> é longa. Desta forma, para visualizá-la é interessante iniciar o <a href="http://www.jboss.org/products/jbossas">JBoss AS</a> com o comando abaixo que irá gerar toda a saída do console padrão e de erros para o arquivo <CODE>jboss.log</CODE>:

</P>
<PRE>
  $ run.sh &#62;&#62; jboss.log 2&#62;&#38;1
</PRE>
<P>
Monitore o arquivo jboss.log com o comando tail em um outro teminal e após perceber que o JBoss finalizou seu startup, execute a combinação de teclas &#60;ctrl&#62;\ na janela de execução do JBoss. Isto irá gerar um <i>thread dump</i> e também irá desvincular o <a href="http://www.jboss.org/products/jbossas">JBoss AS</a> do seu terminal corrente (sem entretanto, pará-lo).

</P>
<P>
Você poderá observar então o conteúdo do arquivo jboss.log que irá conter o <i>thread dump</i>. Ele irá conter uma lista de todas as threads que estão alocadas. Cada thread tem um nome e na maioria das vezes, este nome dá boas dicas da sua função. Você pode por exemplo adivinhar as funções das threads nomeadas "RMI TCP Accept-4444" e "ScannerThread" não é? As threads listadas no início do <i>thread dump</i> são as que são utilizadas pelo JBoss e geralmente, as que estão no final são das da JVM. Segue uma lista de threads interessantes em execução no JBoss:
</P>
<TABLE CELLPADDING="4" BORDER="1">
<TR>
<TH>Nome da Thread</TH>
<TH>Descrição</TH>
</TR>
<TR>

<TD>CompilerThread1</TD>
<TD>Utilizada para a compilação de código Java, geralmente JSPs. Pode haver tantas quanto forem os processadores da máquina. Elas não estão presentes se não estiver sendo executada alguma compilação</TD>
</TR>
<TR>
<TD>GC Daemon</TD>
<TD>Utilizada para a execução do Garbage Collector. Esta thread está presente enquanto ele está sendo executado.</TD>
</TR>
<TR>
<TD>http-0.0.0.0-8080-1</TD>
<TD>Utilizada para processar requisições HTTP de algum cliente. O endereço IP (0.0.0.0) e a porta são variáveis de acordo com a conexão socket aberta. O dígito final varia por requisição</TD>
</TR>

</TABLE>

<P></P>
<P>
O <i>stack trace</i> abaixo da descrição da thread mostra a pilha de execução dos métodos executados pela thread no momento em que o <i>thread dump</i> foi gerado e é extremamente útil para se descobrir o que estava ocorredo naquele momento. Observando com calma, percebemos o que a thread estava fazendo:
</P>
<PRE>
  Name: http-0.0.0.0-8080
  State: RUNNABLE
  Total blocked: 0  Total waited: 0
  
  Stack trace: 
  java.net.PlainSocketImpl.socketAccept(Native Method)
  java.net.PlainSocketImpl.accept(PlainSocketImpl.java:384)
  java.net.ServerSocket.implAccept(ServerSocket.java:450)
  java.net.ServerSocket.accept(ServerSocket.java:421)
  org.apache.tomcat.util.net.DefaultServerSocketFactory.acceptSocket(DefaultServerSocketFactory.java:60)
  org.apache.tomcat.util.net.PoolTcpEndpoint.acceptSocket(PoolTcpEndpoint.java:407)
  org.apache.tomcat.util.net.PoolTcpEndpoint.run(PoolTcpEndpoint.java:647)
  java.lang.Thread.run(Thread.java:595)
</PRE>
<P>

Outra forma de se gerar um <i>thread dump</i> é através do jmx-console do JBoss ou do utilitário de linha de comando <CODE>twiddle</CODE>. Para obter um <i>thread dump</i> através do utilitário <CODE>twiddle</CODE> em um servidor linux, o seguinte comando poderia ser executado:
</P>
<PRE>
  $ twiddle.sh invoke jboss.system:type=ServerInfo listThreadDump
</PRE>

<P></P>
<P>
Para buscar mais informações a respeito deste assunto, sugiro que você leia:
</P>
<UL>
<LI><A HREF="http://java.sun.com/developer/technicalArticles/Programming/Stacktrace/">An Introduction to Java Stack Traces</A>
<LI><A HREF="http://wiki.jboss.org/wiki/ThreadDump">A página ThreadDump do Wiki do JBoss</A>
</UL>
]]></description>
			<content:encoded><![CDATA[<P>
A obtenção de um <i>thread dump</i> ajuda a determinar o que um servidor está fazendo em um dado momento. Um <i>thread dump</i> lista todas as threads sendo executadas por uma aplicação Java e apresenta um <i>stack trace</i> para cada thread. Examinar um <i>thread dump</i> pode dar pistas de se um servidor está parando em determinados momentos. Por exemplo, assumindo que um servidor parou por algum motivo após uma aplicação ter sido iniciada, um <i>thread dump</i> pode ajudar a localizar a causa da parada.

</P>
<P>
A JVM produz um <i>thread dump</i> quando recebe um sinal QUIT. Este sinal pode ser enviado de várias formas, mas ele é geralmente enviado por um comando que envia sinais ou por uma combinação de teclas executadas na janela da aplicação Java em execução. No Unix/Linux, a combinação &lt;ctrl&gt;\ ou o comando <CODE>kill -QUIT id-do-processo</CODE> (equivale ao <CODE>kill -3 id-do-processo</CODE>) podem gerar um <i>thread dump</i>. No Windows, utilize a combinação &lt;ctrl&gt;&lt;break&gt;. Outra forma, é utilizar a interface GUI do <CODE><a href="http://java.sun.com/developer/technicalArticles/J2SE/jconsole.html">jconsole</a></CODE> que vem com o JDK 5.

</P>
<P>
O <a href="http://java.sun.com/developer/technicalArticles/J2SE/jconsole.html">jconsole</a> contém seis abas que mostram diversas informações sobre uma aplicação em execução. Uma delas é nomeada Threads e provê as mesmas informações mostradas por um <i>thread dump</i>.
</P>
<P>
Para executar uma aplicação Java de forma que esta possa ser monitorada pelo <CODE><a href="http://java.sun.com/developer/technicalArticles/J2SE/jconsole.html">jconsole</a></CODE> é necessário iniciá-la com o argumento <CODE>-Dcom.sun.management.jmxremote</CODE>. No caso do <a href="http://www.jboss.org/products/jbossas">JBoss AS</a> por exemplo, este argumento pode ser informado na variável de ambiente <CODE>JBOSS_OPTS</CODE> ou nos scripts de inicialização (<CODE>run.*</CODE>).

</P>
<P>
O <a href="http://java.sun.com/developer/technicalArticles/J2SE/jconsole.html">jconsole</a> também pode ser utilizado para substituir as funções de gerenciamento oferecidas pelo jmx-console. Você pode ler mais a respeito e ver como realizar a configuração do JBoss para suportar o gerenciamento de seus MBeans pelo <a href="http://java.sun.com/developer/technicalArticles/J2SE/jconsole.html">jconsole</a>, lendo <A HREF="http://wiki.jboss.org/wiki/JBossMBeansInJConsole">esta página no wiki do JBoss</A>.
</P>
<P>
A listagem produzida por um <i>thread dump</i> é longa. Desta forma, para visualizá-la é interessante iniciar o <a href="http://www.jboss.org/products/jbossas">JBoss AS</a> com o comando abaixo que irá gerar toda a saída do console padrão e de erros para o arquivo <CODE>jboss.log</CODE>:

</P>
<PRE>
  $ run.sh &gt;&gt; jboss.log 2&gt;&amp;1
</PRE>
<P>
Monitore o arquivo jboss.log com o comando tail em um outro teminal e após perceber que o JBoss finalizou seu startup, execute a combinação de teclas &lt;ctrl&gt;\ na janela de execução do JBoss. Isto irá gerar um <i>thread dump</i> e também irá desvincular o <a href="http://www.jboss.org/products/jbossas">JBoss AS</a> do seu terminal corrente (sem entretanto, pará-lo).

</P>
<P>
Você poderá observar então o conteúdo do arquivo jboss.log que irá conter o <i>thread dump</i>. Ele irá conter uma lista de todas as threads que estão alocadas. Cada thread tem um nome e na maioria das vezes, este nome dá boas dicas da sua função. Você pode por exemplo adivinhar as funções das threads nomeadas "RMI TCP Accept-4444" e "ScannerThread" não é? As threads listadas no início do <i>thread dump</i> são as que são utilizadas pelo JBoss e geralmente, as que estão no final são das da JVM. Segue uma lista de threads interessantes em execução no JBoss:
</P>
<TABLE CELLPADDING="4" BORDER="1">
<TR>
<TH>Nome da Thread</TH>
<TH>Descrição</TH>
</TR>
<TR>

<TD>CompilerThread1</TD>
<TD>Utilizada para a compilação de código Java, geralmente JSPs. Pode haver tantas quanto forem os processadores da máquina. Elas não estão presentes se não estiver sendo executada alguma compilação</TD>
</TR>
<TR>
<TD>GC Daemon</TD>
<TD>Utilizada para a execução do Garbage Collector. Esta thread está presente enquanto ele está sendo executado.</TD>
</TR>
<TR>
<TD>http-0.0.0.0-8080-1</TD>
<TD>Utilizada para processar requisições HTTP de algum cliente. O endereço IP (0.0.0.0) e a porta são variáveis de acordo com a conexão socket aberta. O dígito final varia por requisição</TD>
</TR>

</TABLE>

<P></P>
<P>
O <i>stack trace</i> abaixo da descrição da thread mostra a pilha de execução dos métodos executados pela thread no momento em que o <i>thread dump</i> foi gerado e é extremamente útil para se descobrir o que estava ocorredo naquele momento. Observando com calma, percebemos o que a thread estava fazendo:
</P>
<PRE>
  Name: http-0.0.0.0-8080
  State: RUNNABLE
  Total blocked: 0  Total waited: 0
  
  Stack trace: 
  java.net.PlainSocketImpl.socketAccept(Native Method)
  java.net.PlainSocketImpl.accept(PlainSocketImpl.java:384)
  java.net.ServerSocket.implAccept(ServerSocket.java:450)
  java.net.ServerSocket.accept(ServerSocket.java:421)
  org.apache.tomcat.util.net.DefaultServerSocketFactory.acceptSocket(DefaultServerSocketFactory.java:60)
  org.apache.tomcat.util.net.PoolTcpEndpoint.acceptSocket(PoolTcpEndpoint.java:407)
  org.apache.tomcat.util.net.PoolTcpEndpoint.run(PoolTcpEndpoint.java:647)
  java.lang.Thread.run(Thread.java:595)
</PRE>
<P>

Outra forma de se gerar um <i>thread dump</i> é através do jmx-console do JBoss ou do utilitário de linha de comando <CODE>twiddle</CODE>. Para obter um <i>thread dump</i> através do utilitário <CODE>twiddle</CODE> em um servidor linux, o seguinte comando poderia ser executado:
</P>
<PRE>
  $ twiddle.sh invoke jboss.system:type=ServerInfo listThreadDump
</PRE>

<P></P>
<P>
Para buscar mais informações a respeito deste assunto, sugiro que você leia:
</P>
<UL>
<LI><A HREF="http://java.sun.com/developer/technicalArticles/Programming/Stacktrace/">An Introduction to Java Stack Traces</A>
<LI><A HREF="http://wiki.jboss.org/wiki/ThreadDump">A página ThreadDump do Wiki do JBoss</A>
</UL>
]]></content:encoded>
			<wfw:commentRss>http://ladoservidor.com/node/11/feed/</wfw:commentRss>
		<feedburner:origLink>http://ladoservidor.com/node/11</feedburner:origLink></item>
		<item>
		<title>Implantando aplicações no JBoss via suporte a WebDAV</title>
		<link>http://feeds.feedburner.com/~r/paulojeronimo/~3/300361617/10</link>
		<comments>http://ladoservidor.com/node/10#comments</comments>
		<pubDate>Thu, 29 May 2008 06:39:24 +0000</pubDate>
		<dc:creator>Paulo Jerônimo</dc:creator>
		
		<category><![CDATA[ladoservidor]]></category>

		<guid isPermaLink="false">10 at http://ladoservidor.com</guid>
		<description><![CDATA[<P>
O Servidor <A HREF="http://labs.jboss.com/jbossas">JBoss AS</A> suporta a implantação de diversos arquivos necessários para a execução de uma aplicação Java (*.[jewsr]ar *-ds.xml ...) até mesmo se eles estiverem disponíveis em uma URL como, por exemplo, <CODE>http://servidor/diretorio-com-suporte-a-WebDAV/</CODE>. Este mecanismo é útil em diversas situações. Neste post, vou ilustrar um caso prático: suponhamos que você deseje instalar uma única instância do <A HREF="http://cruisecontrol.sourceforge.net">CruiseControl</A> como a ferramenta responsável pelo processo de <A HREF="http://en.wikipedia.org/wiki/Continuous_Integration">Integração Contínua</A> de diversas aplicações que precisam ser implantadas em diferentes instâncias de JBoss, sendo executadas em várias máquinas distintas.

</P>
<P>
Uma possível solução para este problema é:
</P>
<UL>
<LI>Configurar um servidor Apache na mesma máquina que roda o CruiseControl, ativando os módulos responsáveis pelo suporte ao <A HREF="http://en.wikipedia.org/wiki/WebDAV">WebDAV</A> ou, de maneira alternativa, instalando um Servlet que ofereça este suporte ao <I>container</I> que executa o CruiseControl;
<LI>Configurar no Apache uma URL como, por exemplo, <CODE>http://cruisecontrol.minhaempresa.com/aplicacaoX/</CODE> apontando para o diretório no qual serão gerados os arquivos da aplicação X que precisam ser implantados em uma instância de JBoss;
<LI>Configurar a URL anterior no JBoss para que o mesmo possa fazer uma busca (<I>scan</I>) (via comando <CODE>PROPFIND</CODE> do WebDAV) pelos arquivos da aplicação X, que estão disponíveis na URL;

<LI>Desabilitar o <I>scan</I> automático do JBoss, para que ele não perca o seu tempo tentando verificar se novas versões dos arquivos precisam ser implantadas ou não (ele será avisado sobre isto, pelo CruiseControl);
<LI>Fazer o script de controle do CruiseControl para o aplicação X enviar o comando <I>scan</I> para o JBoss, quando for finalizado o processo de geração (<I>build</I>) dos arquivos desta aplicação, a fim de que este servidor possa realizar a implantação destes arquivos;
<LI>Fazer o processo de testes da aplicação X (via <A HREF="http://junit.org">JUnit</A> ou <A HREF="http://testng.org">TestNG</A> por exemplo) ser iniciado apenas quando o processo de implantação no servidor terminar. Em alguns casos, principalmente na situação em que a implantação é responsável por gerar várias tabelas em um SGBD (como quando se utiliza a <I>feature</I> <I>schemaexport</I> do <A HREF="http://hibernate.org">Hibernate</A>), este processo pode ser um pouco lento, gerando então um pequeno atraso no início dos testes, que só deverão ser iniciados após a completa verificação de que a implantação foi finalizada e bem sucedida.

</UL>

<P>
Uma observação sob esta solução é que, as máquinas que rodam as instâncias de JBoss que serão responsáveis pelas implantações das aplicações X, Y, ..., não precisarão ter serviços como SSH remoto, FTP, NFS, ou quaisquer outros que possibilitem a cópia remota dos arquivos a serem implantados. Esta característica pode ser vista com bons olhos por analistas de segurança já que ela praticamente elimina a necessidade de acesso remoto ao servidor para fins de cópias de arquivo.
</P>
<P>
Ficaria muito extenso este post, se eu fosse entrar em detalhes sobre como realizar a configuração do CruiseControl, do Apache e de seu suporte ao WebDAV. Desta forma, vou apenas apenas dar algumas dicas de como proceder a configuração do JBoss para a realização de algumas tarefas:
</P>
<UL>
<LI>Para desabilitar o <I>scan</I> automático do JBoss é necessário ajustar o valor do atributo <CODE>ScanEnabled</CODE> do MBean <CODE>jboss.deployment:flavor=URL,type=DeploymentScanner</CODE> para <CODE>false</CODE>. Isto é realizado no arquivo jboss-service.xml da configuração que será executada pelo JBoss;

<LI>Para incluir a URL que será acessada pelo JBoss a fim de que o mesmo possa verificar que arquivos estão em um diretório-com-suporte-a-WebDAV/ é necessário adicionar ao atributo <CODE>URLs</CODE> do mesmo MBean a URL a ser utilizada para o <I>scan</I> no servidor HTTP (note a barra final no fim da URL pois ela é ESSENCIAL). Exemplo:
<PRE>
  &#60;attribute name="URLs"&#62;
      deploy/,http://servidor/diretorio-com-suporte-a-WebDAV/
  &#60;/attribute&#62;
</PRE>
<LI>Para enviar o comando <I>scan</I> para o JBoss, ao final do processo de build da aplicação X, será necessário a execução de da operação operação <I>scan</I> do mesmo MBean. Isto pode ser feito de diversas formas, sendo que, uma delas é, através da inclusão das seguintes tasks em um script <A HREF="http://ant.apache.org">Ant</A> (disponíveis em jars do diretório client do JBoss):

<PRE>
  &#60;jmx&#62;
      &#60;invoke target="jboss.deployment:flavor=URL,type=DeploymentScanner" operation="scan"/&#62;
  &#60;/jmx&#62;
</PRE>
<LI>Para instanciar o JBoss (na versão 4.0.5) com o suporte ao <I>scan</I> de URLs com o suporte a WebDAV é preciso executar o run.{sh,bat} passando os parâmetros do exemplo abaixo (ATENÇÃO: se você esquecê-los tomará um TOCO ;-) do JBoss). E mais um pouco de atenção ainda: <U>a informação abaixo é MUIIITOO difícil de ser encontrada em algum manual do JBoss</U>. Fábio Sbano, um amigo Linuxer e Geek de trabalho na Andima, também colaborador do <A HREF="http://ladoservidor.com">Lado Servidor</A>, encontrou <A HREF="http://jira.jboss.com/jira/browse/JBAS-909#action_12313407">este detalhe no JIRA do JBoss</A> para que pudesse fechar a solução abaixo. Desta forma, acho que seria legal a Red Hat rever a documentação e acertar com um pouco mais de ênfase pequenos detalhes como este <A HREF="http://www.redhat.com/docs/manuals/jboss/jboss-eap-4.2/doc/Server_Configuration_Guide/JBoss_MBean_Services-Hot_Deployment_of_Components_the_URLDeploymentScanner.html">nesta página</A> ou <A HREF="http://wiki.jboss.org/wiki/DeploymentScanner">nesta</A>.

<PRE>
  $ run.sh -L commons-logging.jar -L commons-httpclient.jar -L webdavlib.jar
</PRE>
<LI>Caso você esteja utilizando a versão 4.2.2 do JBoss, para que o suporte ao WebDAV funcione, também é necessário que a biblioteca webdavlib.jar esteja disponível no diretório $JBOSS_HOME/lib (por algum motivo ela desapareceu nesta versão) e a linha de execução do run também deverá conter o parâmetro <CODE>-L commmons-codec.jar</CODE>, caso contrário, você também irá ter problemas.
</UL>

<P>
É isto... em próximos posts, mais dicas!
</P>]]></description>
			<content:encoded><![CDATA[<P>
O Servidor <A HREF="http://labs.jboss.com/jbossas">JBoss AS</A> suporta a implantação de diversos arquivos necessários para a execução de uma aplicação Java (*.[jewsr]ar *-ds.xml ...) até mesmo se eles estiverem disponíveis em uma URL como, por exemplo, <CODE>http://servidor/diretorio-com-suporte-a-WebDAV/</CODE>. Este mecanismo é útil em diversas situações. Neste post, vou ilustrar um caso prático: suponhamos que você deseje instalar uma única instância do <A HREF="http://cruisecontrol.sourceforge.net">CruiseControl</A> como a ferramenta responsável pelo processo de <A HREF="http://en.wikipedia.org/wiki/Continuous_Integration">Integração Contínua</A> de diversas aplicações que precisam ser implantadas em diferentes instâncias de JBoss, sendo executadas em várias máquinas distintas.

</P>
<P>
Uma possível solução para este problema é:
</P>
<UL>
<LI>Configurar um servidor Apache na mesma máquina que roda o CruiseControl, ativando os módulos responsáveis pelo suporte ao <A HREF="http://en.wikipedia.org/wiki/WebDAV">WebDAV</A> ou, de maneira alternativa, instalando um Servlet que ofereça este suporte ao <I>container</I> que executa o CruiseControl;
<LI>Configurar no Apache uma URL como, por exemplo, <CODE>http://cruisecontrol.minhaempresa.com/aplicacaoX/</CODE> apontando para o diretório no qual serão gerados os arquivos da aplicação X que precisam ser implantados em uma instância de JBoss;
<LI>Configurar a URL anterior no JBoss para que o mesmo possa fazer uma busca (<I>scan</I>) (via comando <CODE>PROPFIND</CODE> do WebDAV) pelos arquivos da aplicação X, que estão disponíveis na URL;

<LI>Desabilitar o <I>scan</I> automático do JBoss, para que ele não perca o seu tempo tentando verificar se novas versões dos arquivos precisam ser implantadas ou não (ele será avisado sobre isto, pelo CruiseControl);
<LI>Fazer o script de controle do CruiseControl para o aplicação X enviar o comando <I>scan</I> para o JBoss, quando for finalizado o processo de geração (<I>build</I>) dos arquivos desta aplicação, a fim de que este servidor possa realizar a implantação destes arquivos;
<LI>Fazer o processo de testes da aplicação X (via <A HREF="http://junit.org">JUnit</A> ou <A HREF="http://testng.org">TestNG</A> por exemplo) ser iniciado apenas quando o processo de implantação no servidor terminar. Em alguns casos, principalmente na situação em que a implantação é responsável por gerar várias tabelas em um SGBD (como quando se utiliza a <I>feature</I> <I>schemaexport</I> do <A HREF="http://hibernate.org">Hibernate</A>), este processo pode ser um pouco lento, gerando então um pequeno atraso no início dos testes, que só deverão ser iniciados após a completa verificação de que a implantação foi finalizada e bem sucedida.

</UL>

<P>
Uma observação sob esta solução é que, as máquinas que rodam as instâncias de JBoss que serão responsáveis pelas implantações das aplicações X, Y, ..., não precisarão ter serviços como SSH remoto, FTP, NFS, ou quaisquer outros que possibilitem a cópia remota dos arquivos a serem implantados. Esta característica pode ser vista com bons olhos por analistas de segurança já que ela praticamente elimina a necessidade de acesso remoto ao servidor para fins de cópias de arquivo.
</P>
<P>
Ficaria muito extenso este post, se eu fosse entrar em detalhes sobre como realizar a configuração do CruiseControl, do Apache e de seu suporte ao WebDAV. Desta forma, vou apenas apenas dar algumas dicas de como proceder a configuração do JBoss para a realização de algumas tarefas:
</P>
<UL>
<LI>Para desabilitar o <I>scan</I> automático do JBoss é necessário ajustar o valor do atributo <CODE>ScanEnabled</CODE> do MBean <CODE>jboss.deployment:flavor=URL,type=DeploymentScanner</CODE> para <CODE>false</CODE>. Isto é realizado no arquivo jboss-service.xml da configuração que será executada pelo JBoss;

<LI>Para incluir a URL que será acessada pelo JBoss a fim de que o mesmo possa verificar que arquivos estão em um diretório-com-suporte-a-WebDAV/ é necessário adicionar ao atributo <CODE>URLs</CODE> do mesmo MBean a URL a ser utilizada para o <I>scan</I> no servidor HTTP (note a barra final no fim da URL pois ela é ESSENCIAL). Exemplo:
<PRE>
  &lt;attribute name="URLs"&gt;
      deploy/,http://servidor/diretorio-com-suporte-a-WebDAV/
  &lt;/attribute&gt;
</PRE>
<LI>Para enviar o comando <I>scan</I> para o JBoss, ao final do processo de build da aplicação X, será necessário a execução de da operação operação <I>scan</I> do mesmo MBean. Isto pode ser feito de diversas formas, sendo que, uma delas é, através da inclusão das seguintes tasks em um script <A HREF="http://ant.apache.org">Ant</A> (disponíveis em jars do diretório client do JBoss):

<PRE>
  &lt;jmx&gt;
      &lt;invoke target="jboss.deployment:flavor=URL,type=DeploymentScanner" operation="scan"/&gt;
  &lt;/jmx&gt;
</PRE>
<LI>Para instanciar o JBoss (na versão 4.0.5) com o suporte ao <I>scan</I> de URLs com o suporte a WebDAV é preciso executar o run.{sh,bat} passando os parâmetros do exemplo abaixo (ATENÇÃO: se você esquecê-los tomará um TOCO ;-) do JBoss). E mais um pouco de atenção ainda: <U>a informação abaixo é MUIIITOO difícil de ser encontrada em algum manual do JBoss</U>. Fábio Sbano, um amigo Linuxer e Geek de trabalho na Andima, também colaborador do <A HREF="http://ladoservidor.com">Lado Servidor</A>, encontrou <A HREF="http://jira.jboss.com/jira/browse/JBAS-909#action_12313407">este detalhe no JIRA do JBoss</A> para que pudesse fechar a solução abaixo. Desta forma, acho que seria legal a Red Hat rever a documentação e acertar com um pouco mais de ênfase pequenos detalhes como este <A HREF="http://www.redhat.com/docs/manuals/jboss/jboss-eap-4.2/doc/Server_Configuration_Guide/JBoss_MBean_Services-Hot_Deployment_of_Components_the_URLDeploymentScanner.html">nesta página</A> ou <A HREF="http://wiki.jboss.org/wiki/DeploymentScanner">nesta</A>.

<PRE>
  $ run.sh -L commons-logging.jar -L commons-httpclient.jar -L webdavlib.jar
</PRE>
<LI>Caso você esteja utilizando a versão 4.2.2 do JBoss, para que o suporte ao WebDAV funcione, também é necessário que a biblioteca webdavlib.jar esteja disponível no diretório $JBOSS_HOME/lib (por algum motivo ela desapareceu nesta versão) e a linha de execução do run também deverá conter o parâmetro <CODE>-L commmons-codec.jar</CODE>, caso contrário, você também irá ter problemas.
</UL>

<P>
É isto... em próximos posts, mais dicas!
</P>]]></content:encoded>
			<wfw:commentRss>http://ladoservidor.com/node/10/feed/</wfw:commentRss>
		<feedburner:origLink>http://ladoservidor.com/node/10</feedburner:origLink></item>
		<item>
		<title>Vídeo sobre as novas características do Glassfish v3</title>
		<link>http://feeds.feedburner.com/~r/paulojeronimo/~3/298850826/9</link>
		<comments>http://ladoservidor.com/node/9#comments</comments>
		<pubDate>Tue, 27 May 2008 04:07:32 +0000</pubDate>
		<dc:creator>Paulo Jerônimo</dc:creator>
		
		<category><![CDATA[ladoservidor]]></category>

		<guid isPermaLink="false">9 at http://ladoservidor.com</guid>
		<description><![CDATA[<p><object type="application/x-shockwave-flash" data="http://blip.tv/scripts/flash/showplayer.swf?enablejs=true&#38;feedurl=http%3A%2F%2Fsdnpipeline%2Eblip%2Etv%2Frss&#38;file=http%3A%2F%2Fblip%2Etv%2Frss%2Fflash%2F937475%3Freferrer%3Dblip%2Etv%26source%3D1&#38;showplayerpath=http%3A%2F%2Fblip%2Etv%2Fscripts%2Fflash%2Fshowplayer%2Eswf" width="400" height="255" allowfullscreen="true" id="showplayer"><br />
<param name="movie" value="http://blip.tv/scripts/flash/showplayer.swf?enablejs=true&#38;feedurl=http%3A%2F%2Fsdnpipeline%2Eblip%2Etv%2Frss&#38;file=http%3A%2F%2Fblip%2Etv%2Frss%2Fflash%2F937475%3Freferrer%3Dblip%2Etv%26source%3D1&#38;showplayerpath=http%3A%2F%2Fblip%2Etv%2Fscripts%2Fflash%2Fshowplayer%2Eswf" />
<param name="quality" value="best" /><embed src="http://blip.tv/scripts/flash/showplayer.swf?enablejs=true&#38;feedurl=http%3A%2F%2Fsdnpipeline%2Eblip%2Etv%2Frss&#38;file=http%3A%2F%2Fblip%2Etv%2Frss%2Fflash%2F937475%3Freferrer%3Dblip%2Etv%26source%3D1&#38;showplayerpath=http%3A%2F%2Fblip%2Etv%2Fscripts%2Fflash%2Fshowplayer%2Eswf" quality="best" width="400" height="255" name="showplayer" type="application/x-shockwave-flash"></embed></object></p>
]]></description>
			<content:encoded><![CDATA[<p><object type="application/x-shockwave-flash" data="http://blip.tv/scripts/flash/showplayer.swf?enablejs=true&amp;feedurl=http%3A%2F%2Fsdnpipeline%2Eblip%2Etv%2Frss&amp;file=http%3A%2F%2Fblip%2Etv%2Frss%2Fflash%2F937475%3Freferrer%3Dblip%2Etv%26source%3D1&amp;showplayerpath=http%3A%2F%2Fblip%2Etv%2Fscripts%2Fflash%2Fshowplayer%2Eswf" width="400" height="255" allowfullscreen="true" id="showplayer"><br />
<param name="movie" value="http://blip.tv/scripts/flash/showplayer.swf?enablejs=true&amp;feedurl=http%3A%2F%2Fsdnpipeline%2Eblip%2Etv%2Frss&amp;file=http%3A%2F%2Fblip%2Etv%2Frss%2Fflash%2F937475%3Freferrer%3Dblip%2Etv%26source%3D1&amp;showplayerpath=http%3A%2F%2Fblip%2Etv%2Fscripts%2Fflash%2Fshowplayer%2Eswf" />
<param name="quality" value="best" /><embed src="http://blip.tv/scripts/flash/showplayer.swf?enablejs=true&amp;feedurl=http%3A%2F%2Fsdnpipeline%2Eblip%2Etv%2Frss&amp;file=http%3A%2F%2Fblip%2Etv%2Frss%2Fflash%2F937475%3Freferrer%3Dblip%2Etv%26source%3D1&amp;showplayerpath=http%3A%2F%2Fblip%2Etv%2Fscripts%2Fflash%2Fshowplayer%2Eswf" quality="best" width="400" height="255" name="showplayer" type="application/x-shockwave-flash"></embed></object></p>
]]></content:encoded>
			<wfw:commentRss>http://ladoservidor.com/node/9/feed/</wfw:commentRss>
		<feedburner:origLink>http://ladoservidor.com/node/9</feedburner:origLink></item>
	</channel>
</rss>
